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();
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;
}
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) {
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;
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) {
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;