From 7cfa4322558c56b5a0801b17e60598c5a49779dd Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 22 Aug 2017 16:19:23 -0400 Subject: [PATCH] eigrpd: make fsm msg data_type an enum We need to eventually be able to handle multiple data types to figure out if the distance is better worse. Signed-off-by: Donald Sharp --- eigrpd/eigrp_query.c | 2 +- eigrpd/eigrp_reply.c | 2 +- eigrpd/eigrp_siaquery.c | 2 +- eigrpd/eigrp_siareply.c | 2 +- eigrpd/eigrp_structs.h | 7 ++++- eigrpd/eigrp_topology.c | 57 +++++++++++++++++++++++++---------------- eigrpd/eigrp_update.c | 6 ++--- 7 files changed, 48 insertions(+), 30 deletions(-) diff --git a/eigrpd/eigrp_query.c b/eigrpd/eigrp_query.c index b9351ed896..92aa7f9855 100644 --- a/eigrpd/eigrp_query.c +++ b/eigrpd/eigrp_query.c @@ -131,7 +131,7 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, nbr); msg.packet_type = EIGRP_OPC_QUERY; msg.eigrp = eigrp; - msg.data_type = EIGRP_TLV_IPv4_INT; + msg.data_type = EIGRP_INT; msg.adv_router = nbr; msg.data.ipv4_int_type = tlv; msg.entry = entry; diff --git a/eigrpd/eigrp_reply.c b/eigrpd/eigrp_reply.c index 7015413f56..92cea77305 100644 --- a/eigrpd/eigrp_reply.c +++ b/eigrpd/eigrp_reply.c @@ -237,7 +237,7 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph, msg.packet_type = EIGRP_OPC_REPLY; msg.eigrp = eigrp; - msg.data_type = EIGRP_TLV_IPv4_INT; + msg.data_type = EIGRP_INT; msg.adv_router = nbr; msg.data.ipv4_int_type = tlv; msg.entry = entry; diff --git a/eigrpd/eigrp_siaquery.c b/eigrpd/eigrp_siaquery.c index 9447efb2e2..60decc5bef 100644 --- a/eigrpd/eigrp_siaquery.c +++ b/eigrpd/eigrp_siaquery.c @@ -100,7 +100,7 @@ void eigrp_siaquery_receive(struct eigrp *eigrp, struct ip *iph, nbr); msg.packet_type = EIGRP_OPC_SIAQUERY; msg.eigrp = eigrp; - msg.data_type = EIGRP_TLV_IPv4_INT; + msg.data_type = EIGRP_INT; msg.adv_router = nbr; msg.data.ipv4_int_type = tlv; msg.entry = entry; diff --git a/eigrpd/eigrp_siareply.c b/eigrpd/eigrp_siareply.c index 2cf7520a96..e960940200 100644 --- a/eigrpd/eigrp_siareply.c +++ b/eigrpd/eigrp_siareply.c @@ -99,7 +99,7 @@ void eigrp_siareply_receive(struct eigrp *eigrp, struct ip *iph, nbr); msg.packet_type = EIGRP_OPC_SIAQUERY; msg.eigrp = eigrp; - msg.data_type = EIGRP_TLV_IPv4_INT; + msg.data_type = EIGRP_INT; msg.adv_router = nbr; msg.data.ipv4_int_type = tlv; msg.entry = entry; diff --git a/eigrpd/eigrp_structs.h b/eigrpd/eigrp_structs.h index 0c15436d4f..c81dfebb46 100644 --- a/eigrpd/eigrp_structs.h +++ b/eigrpd/eigrp_structs.h @@ -499,6 +499,11 @@ struct eigrp_neighbor_entry { }; //--------------------------------------------------------------------------------------------------------------------------------------------- +typedef enum { + EIGRP_CONNECTED, + EIGRP_INT, + EIGRP_EXT, +} msg_data_t; /* EIGRP Finite State Machine */ @@ -508,7 +513,7 @@ struct eigrp_fsm_action_message { struct eigrp_neighbor *adv_router; // advertising neighbor struct eigrp_neighbor_entry *entry; struct eigrp_prefix_entry *prefix; - int data_type; // internal or external tlv type + msg_data_t data_type; // internal or external tlv type union { struct TLV_IPv4_External_type *ipv4_ext_data; struct TLV_IPv4_Internal_type *ipv4_int_type; diff --git a/eigrpd/eigrp_topology.c b/eigrpd/eigrp_topology.c index d4d55393a8..d1c09d6612 100644 --- a/eigrpd/eigrp_topology.c +++ b/eigrpd/eigrp_topology.c @@ -384,32 +384,45 @@ enum metric_change eigrp_topology_update_distance(struct eigrp_fsm_action_messag struct TLV_IPv4_External_type *ext_data = NULL; struct TLV_IPv4_Internal_type *int_data = NULL; - if (msg->data_type == EIGRP_TLV_IPv4_INT) { - u_int32_t new_reported_distance; + switch(msg->data_type) { + case EIGRP_CONNECTED: + break; + case EIGRP_INT: + { + u_int32_t new_reported_distance; - int_data = msg->data.ipv4_int_type; - if (eigrp_metrics_is_same(int_data->metric, - entry->reported_metric)) { - return change; // No change - } + int_data = msg->data.ipv4_int_type; + if (eigrp_metrics_is_same(int_data->metric, + entry->reported_metric)) { + return change; // No change + } - new_reported_distance = eigrp_calculate_metrics(eigrp, - int_data->metric); + new_reported_distance = eigrp_calculate_metrics(eigrp, + int_data->metric); - if (entry->reported_distance < new_reported_distance) - change = METRIC_INCREASE; - else - change = METRIC_DECREASE; + if (entry->reported_distance < new_reported_distance) + change = METRIC_INCREASE; + else + change = METRIC_DECREASE; - entry->reported_metric = int_data->metric; - entry->reported_distance = new_reported_distance; + entry->reported_metric = int_data->metric; + entry->reported_distance = new_reported_distance; eigrp_calculate_metrics(eigrp, int_data->metric); - entry->distance = eigrp_calculate_total_metrics(eigrp, entry); - } else { - ext_data = msg->data.ipv4_ext_data; - if (eigrp_metrics_is_same(ext_data->metric, - entry->reported_metric)) - return change; + entry->distance = eigrp_calculate_total_metrics(eigrp, entry); + break; + } + case EIGRP_EXT: + { + ext_data = msg->data.ipv4_ext_data; + if (eigrp_metrics_is_same(ext_data->metric, + entry->reported_metric)) + return change; + + break; + } + default: + zlog_err("%s: Please implement handler", __PRETTY_FUNCTION__); + break; } /* * Move to correct position in list according to new distance @@ -492,7 +505,7 @@ void eigrp_topology_neighbor_down(struct eigrp *eigrp, tlv->metric.delay = EIGRP_MAX_METRIC; msg.packet_type = EIGRP_OPC_UPDATE; msg.eigrp = eigrp; - msg.data_type = EIGRP_TLV_IPv4_INT; + msg.data_type = EIGRP_INT; msg.adv_router = nbr; msg.data.ipv4_int_type = tlv; msg.entry = entry; diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c index 89b8ecd928..ba54fa5727 100644 --- a/eigrpd/eigrp_update.c +++ b/eigrpd/eigrp_update.c @@ -139,7 +139,7 @@ static void eigrp_update_receive_GR_ask(struct eigrp *eigrp, fsm_msg.packet_type = EIGRP_OPC_UPDATE; fsm_msg.eigrp = eigrp; - fsm_msg.data_type = EIGRP_TLV_IPv4_INT; + fsm_msg.data_type = EIGRP_INT; fsm_msg.adv_router = nbr; fsm_msg.data.ipv4_int_type = tlv_max; fsm_msg.entry = entry; @@ -315,7 +315,7 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, msg.packet_type = EIGRP_OPC_UPDATE; msg.eigrp = eigrp; - msg.data_type = EIGRP_TLV_IPv4_INT; + msg.data_type = EIGRP_INT; msg.adv_router = nbr; msg.data.ipv4_int_type = tlv; msg.entry = entry; @@ -978,7 +978,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) fsm_msg.packet_type = EIGRP_OPC_UPDATE; fsm_msg.eigrp = e; - fsm_msg.data_type = EIGRP_TLV_IPv4_INT; + fsm_msg.data_type = EIGRP_INT; fsm_msg.adv_router = nbr; fsm_msg.data.ipv4_int_type = tlv_max; fsm_msg.entry = entry; -- 2.39.5