return new;
}
+static struct TLV_IPv4_Internal_type *eigrp_IPv4_InternalTLV_new()
+{
+ struct TLV_IPv4_Internal_type *new;
+
+ new = XCALLOC(MTYPE_EIGRP_IPV4_INT_TLV,
+ sizeof(struct TLV_IPv4_Internal_type));
+
+ return new;
+}
+
struct TLV_IPv4_Internal_type *eigrp_read_ipv4_tlv(struct stream *s)
{
struct TLV_IPv4_Internal_type *tlv;
XFREE(MTYPE_EIGRP_AUTH_SHA256_TLV, authTLV);
}
-struct TLV_IPv4_Internal_type *eigrp_IPv4_InternalTLV_new()
-{
- struct TLV_IPv4_Internal_type *new;
-
- new = XCALLOC(MTYPE_EIGRP_IPV4_INT_TLV,
- sizeof(struct TLV_IPv4_Internal_type));
-
- return new;
-}
-
void eigrp_IPv4_InternalTLV_free(
struct TLV_IPv4_Internal_type *IPv4_InternalTLV)
{
for (ALL_LIST_ELEMENTS(eigrp->topology_table, node1, node11, prefix)) {
for (ALL_LIST_ELEMENTS(prefix->entries, node2, node22, entry)) {
- if (entry->adv_router == nbr) {
- struct eigrp_fsm_action_message msg;
- struct TLV_IPv4_Internal_type *tlv =
- eigrp_IPv4_InternalTLV_new();
- tlv->metric.delay = EIGRP_MAX_METRIC;
- msg.packet_type = EIGRP_OPC_UPDATE;
- msg.eigrp = eigrp;
- msg.data_type = EIGRP_INT;
- msg.adv_router = nbr;
- msg.metrics = tlv->metric;
- msg.entry = entry;
- msg.prefix = prefix;
- eigrp_fsm_event(&msg);
- }
+ struct eigrp_fsm_action_message msg;
+
+ if (entry->adv_router != nbr)
+ continue;
+
+ msg.metrics.delay = EIGRP_MAX_METRIC;
+ msg.packet_type = EIGRP_OPC_UPDATE;
+ msg.eigrp = eigrp;
+ msg.data_type = EIGRP_INT;
+ msg.adv_router = nbr;
+ msg.entry = entry;
+ msg.prefix = prefix;
+ eigrp_fsm_event(&msg);
}
}
{
struct listnode *node1;
struct eigrp_prefix_entry *prefix;
- struct TLV_IPv4_Internal_type *tlv_max;
+ struct eigrp_fsm_action_message fsm_msg;
/* iterate over all prefixes which weren't advertised by neighbor */
for (ALL_LIST_ELEMENTS_RO(nbr_prefixes, node1, prefix)) {
inet_ntoa(prefix->destination_ipv4->prefix),
prefix->destination_ipv4->prefixlen);
- /* create internal IPv4 TLV with infinite delay */
- tlv_max = eigrp_IPv4_InternalTLV_new();
- tlv_max->type = EIGRP_TLV_IPv4_INT;
- tlv_max->length = 28U;
- tlv_max->metric = prefix->reported_metric;
+ fsm_msg.metrics = prefix->reported_metric;
/* set delay to MAX */
- tlv_max->metric.delay = EIGRP_MAX_METRIC;
- tlv_max->destination = prefix->destination_ipv4->prefix;
- tlv_max->prefix_length = prefix->destination_ipv4->prefixlen;
-
-
- /* prepare message for FSM */
- struct eigrp_fsm_action_message fsm_msg;
+ fsm_msg.metrics.delay = EIGRP_MAX_METRIC;
struct eigrp_neighbor_entry *entry =
eigrp_prefix_entry_lookup(prefix->entries, nbr);
fsm_msg.eigrp = eigrp;
fsm_msg.data_type = EIGRP_INT;
fsm_msg.adv_router = nbr;
- fsm_msg.metrics = tlv_max->metric;
fsm_msg.entry = entry;
fsm_msg.prefix = prefix;
/* send message to FSM */
eigrp_fsm_event(&fsm_msg);
-
- /* free memory used by TLV */
- eigrp_IPv4_InternalTLV_free(tlv_max);
}
}
struct list *prefixes;
u_int32_t flags;
unsigned int send_prefixes;
- struct TLV_IPv4_Internal_type *tlv_max;
/* get prefixes to send to neighbor */
prefixes = nbr->nbr_gr_prefixes_send;
zlog_info("Filtered prefix %s will be removed.",
inet_ntoa(dest_addr->prefix));
- tlv_max = eigrp_IPv4_InternalTLV_new();
- tlv_max->type = EIGRP_TLV_IPv4_INT;
- tlv_max->length = 28U;
- tlv_max->metric = pe->reported_metric;
- /* set delay to MAX */
- tlv_max->metric.delay = EIGRP_MAX_METRIC;
- tlv_max->destination = pe->destination_ipv4->prefix;
- tlv_max->prefix_length =
- pe->destination_ipv4->prefixlen;
-
/* prepare message for FSM */
struct eigrp_fsm_action_message fsm_msg;
fsm_msg.eigrp = e;
fsm_msg.data_type = EIGRP_INT;
fsm_msg.adv_router = nbr;
- fsm_msg.metrics = tlv_max->metric;
+ fsm_msg.metrics = pe->reported_metric;
+ /* Set delay to MAX */
+ fsm_msg.metrics.delay = EIGRP_MAX_METRIC;
fsm_msg.entry = entry;
fsm_msg.prefix = pe;
/* send message to FSM */
eigrp_fsm_event(&fsm_msg);
-
- /* free memory used by TLV */
- eigrp_IPv4_InternalTLV_free(tlv_max);
}
/*
* End of filtering