From 748a2ba40856f85360811de173bc284621012c9f Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 15 Aug 2017 22:14:18 -0400 Subject: [PATCH] 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 --- eigrpd/eigrp_fsm.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) 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; -- 2.39.5