From: Donald Sharp Date: Wed, 16 Aug 2017 02:14:18 +0000 (-0400) Subject: eigrpd: Make eigrp_get_fsm_event use metric changed X-Git-Tag: frr-4.0-dev~406^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=748a2ba40856f85360811de173bc284621012c9f;p=matthieu%2Ffrr.git eigrpd: Make eigrp_get_fsm_event use metric changed Refactor eigrp_get_fsm_event a tiny bit to let all the states get the new metric. Signed-off-by: Donald Sharp --- diff --git a/eigrpd/eigrp_fsm.c b/eigrpd/eigrp_fsm.c index 852362e192..f697577c62 100644 --- a/eigrpd/eigrp_fsm.c +++ b/eigrpd/eigrp_fsm.c @@ -185,6 +185,7 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg) struct eigrp_prefix_entry *prefix = msg->prefix; struct eigrp_neighbor_entry *entry = msg->entry; u_char actual_state = prefix->state; + enum metric_change change; if (entry == NULL) { entry = eigrp_neighbor_entry_new(); @@ -194,19 +195,18 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg) msg->entry = entry; } - // Dividing by actual state of prefix's FSM + /* + * Calculate resultant metrics and insert to correct position + * in entries list + */ + change = eigrp_topology_update_distance(msg); + switch (actual_state) { case EIGRP_FSM_STATE_PASSIVE: { - // Calculate resultant metrics and insert to correct position in - // entries list - eigrp_topology_update_distance(msg); - struct eigrp_neighbor_entry *head = (struct eigrp_neighbor_entry *) entry->prefix->entries->head->data; - // zlog_info ("flag: %d rdist: %u dist: %u pfdist: %u pdist: - // %u", head->flags, head->reported_distance, head->distance, - // prefix->fdistance, prefix->distance); + if (head->reported_distance < prefix->fdistance) { return EIGRP_FSM_KEEP_STATE; } @@ -226,8 +226,6 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg) break; } case EIGRP_FSM_STATE_ACTIVE_0: { - eigrp_topology_update_distance(msg); - if (msg->packet_type == EIGRP_OPC_REPLY) { listnode_delete(prefix->rij, entry->adv_router); if (prefix->rij->count) { @@ -254,15 +252,13 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg) break; } case EIGRP_FSM_STATE_ACTIVE_1: { - int change = eigrp_topology_update_distance(msg); - if (msg->packet_type == EIGRP_OPC_QUERY && (entry->flags & EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG)) { return EIGRP_FSM_EVENT_QACT; } else if (msg->packet_type == EIGRP_OPC_REPLY) { listnode_delete(prefix->rij, entry->adv_router); - if (change == 1 + if (change == METRIC_INCREASE && (entry->flags & EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG)) { return EIGRP_FSM_EVENT_DINC; @@ -282,8 +278,6 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg) break; } case EIGRP_FSM_STATE_ACTIVE_2: { - eigrp_topology_update_distance(msg); - if (msg->packet_type == EIGRP_OPC_REPLY) { listnode_delete(prefix->rij, entry->adv_router); if (prefix->rij->count) { @@ -305,12 +299,10 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg) break; } case EIGRP_FSM_STATE_ACTIVE_3: { - int change = eigrp_topology_update_distance(msg); - if (msg->packet_type == EIGRP_OPC_REPLY) { listnode_delete(prefix->rij, entry->adv_router); - if (change == 1 + if (change == METRIC_INCREASE && (entry->flags & EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG)) { return EIGRP_FSM_EVENT_DINC;