From b1e62edd5ed63256db05af56dfc1394eea4e7b3a Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 30 Jul 2018 08:50:47 -0400 Subject: [PATCH 1/5] bgpd: Abstract aggregate retrieving/setting from info pointer The aggregate data is stored as a void pointer in `struct bgp_node`. Abstract retrieval of this data and setting of this data into functions so that in the future we can move around what is stored in bgp_node. Signed-off-by: Donald Sharp --- bgpd/bgp_route.c | 23 +++++++++++++---------- bgpd/bgp_table.h | 13 +++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 5c65d5e61..29c68dc6f 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -5769,13 +5769,14 @@ void bgp_aggregate_increment(struct bgp *bgp, struct prefix *p, child = bgp_node_get(table, p); /* Aggregate address configuration check. */ - for (rn = child; rn; rn = bgp_node_parent_nolock(rn)) - if ((aggregate = rn->info) != NULL - && rn->p.prefixlen < p->prefixlen) { + for (rn = child; rn; rn = bgp_node_parent_nolock(rn)) { + aggregate = bgp_aggregate_get_node_info(rn); + if (aggregate != NULL && rn->p.prefixlen < p->prefixlen) { bgp_aggregate_delete(bgp, &rn->p, afi, safi, aggregate); bgp_aggregate_route(bgp, &rn->p, ri, afi, safi, NULL, aggregate); } + } bgp_unlock_node(child); } @@ -5799,13 +5800,14 @@ void bgp_aggregate_decrement(struct bgp *bgp, struct prefix *p, child = bgp_node_get(table, p); /* Aggregate address configuration check. */ - for (rn = child; rn; rn = bgp_node_parent_nolock(rn)) - if ((aggregate = rn->info) != NULL - && rn->p.prefixlen < p->prefixlen) { + for (rn = child; rn; rn = bgp_node_parent_nolock(rn)) { + aggregate = bgp_aggregate_get_node_info(rn); + if (aggregate != NULL && rn->p.prefixlen < p->prefixlen) { bgp_aggregate_delete(bgp, &rn->p, afi, safi, aggregate); bgp_aggregate_route(bgp, &rn->p, NULL, afi, safi, del, aggregate); } + } bgp_unlock_node(child); } @@ -5838,12 +5840,12 @@ static int bgp_aggregate_unset(struct vty *vty, const char *prefix_str, return CMD_WARNING_CONFIG_FAILED; } - aggregate = rn->info; + aggregate = bgp_aggregate_get_node_info(rn); bgp_aggregate_delete(bgp, &p, afi, safi, aggregate); bgp_aggregate_install(bgp, afi, safi, &p, 0, NULL, NULL, 0, aggregate); /* Unlock aggregate address configuration. */ - rn->info = NULL; + bgp_aggregate_set_node_info(rn, NULL); bgp_aggregate_free(aggregate); bgp_unlock_node(rn); bgp_unlock_node(rn); @@ -5894,7 +5896,7 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, aggregate->summary_only = summary_only; aggregate->as_set = as_set; aggregate->safi = safi; - rn->info = aggregate; + bgp_aggregate_set_node_info(rn, aggregate); /* Aggregate address insert into BGP routing table. */ bgp_aggregate_route(bgp, &p, NULL, afi, safi, NULL, aggregate); @@ -11458,7 +11460,8 @@ void bgp_config_write_network(struct vty *vty, struct bgp *bgp, afi_t afi, /* Aggregate-address configuration. */ for (rn = bgp_table_top(bgp->aggregate[afi][safi]); rn; rn = bgp_route_next(rn)) { - if ((bgp_aggregate = rn->info) == NULL) + bgp_aggregate = bgp_aggregate_get_node_info(rn); + if (bgp_aggregate == NULL) continue; p = &rn->p; diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index 60c2cbd4a..fc1942db5 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -313,4 +313,17 @@ static inline uint64_t bgp_table_version(struct bgp_table *table) void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p, uint8_t maxlen, struct list *matches); + +static inline struct bgp_aggregate * +bgp_aggregate_get_node_info(struct bgp_node *node) +{ + return node->info; +} + +static inline void bgp_aggregate_set_node_info(struct bgp_node *node, + struct bgp_aggregate *aggregate) +{ + node->info = aggregate; +} + #endif /* _QUAGGA_BGP_TABLE_H */ From ca2e160d7dca2621260ddf03e2e07e4c8c4495af Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 30 Jul 2018 10:29:28 -0400 Subject: [PATCH 2/5] bgpd: Abstract distance retrieving/setting from info pointer The bgp_distance data is stored as a void pointer in `struct bgp_node`. Abstract retrieval of this data and setting of this data into functions so that in the future we can move around what is stored in bgp_node. Signed-off-by: Donald Sharp --- bgpd/bgp_route.c | 18 ++++++++++-------- bgpd/bgp_table.h | 11 +++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 29c68dc6f..42028fda4 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -10771,12 +10771,12 @@ static int bgp_distance_set(struct vty *vty, const char *distance_str, /* Get BGP distance node. */ rn = bgp_node_get(bgp_distance_table[afi][safi], (struct prefix *)&p); - if (rn->info) { - bdistance = rn->info; + bdistance = bgp_distance_get_node(rn); + if (bdistance) bgp_unlock_node(rn); - } else { + else { bdistance = bgp_distance_new(); - rn->info = bdistance; + bgp_distance_set_node(rn, bdistance); } /* Set distance value. */ @@ -10821,7 +10821,7 @@ static int bgp_distance_unset(struct vty *vty, const char *distance_str, return CMD_WARNING_CONFIG_FAILED; } - bdistance = rn->info; + bdistance = bgp_distance_get_node(rn); distance = atoi(distance_str); if (bdistance->distance != distance) { @@ -10860,7 +10860,7 @@ uint8_t bgp_distance_apply(struct prefix *p, struct bgp_info *rinfo, afi_t afi, sockunion2hostprefix(&peer->su, &q); rn = bgp_node_match(bgp_distance_table[afi][safi], &q); if (rn) { - bdistance = rn->info; + bdistance = bgp_distance_get_node(rn); bgp_unlock_node(rn); if (bdistance->access_list) { @@ -11511,8 +11511,9 @@ void bgp_config_write_distance(struct vty *vty, struct bgp *bgp, afi_t afi, } for (rn = bgp_table_top(bgp_distance_table[afi][safi]); rn; - rn = bgp_route_next(rn)) - if ((bdistance = rn->info) != NULL) { + rn = bgp_route_next(rn)) { + bdistance = bgp_distance_get_node(rn); + if (bdistance != NULL) { char buf[PREFIX_STRLEN]; vty_out(vty, " distance %d %s %s\n", @@ -11521,6 +11522,7 @@ void bgp_config_write_distance(struct vty *vty, struct bgp *bgp, afi_t afi, bdistance->access_list ? bdistance->access_list : ""); } + } } /* Allocate routing table structure and install commands. */ diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index fc1942db5..6c52d27a8 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -326,4 +326,15 @@ static inline void bgp_aggregate_set_node_info(struct bgp_node *node, node->info = aggregate; } +static inline struct bgp_distance *bgp_distance_get_node(struct bgp_node *node) +{ + return node->info; +} + +static inline void bgp_distance_set_node(struct bgp_node *node, + struct bgp_distance *distance) +{ + node->info = distance; +} + #endif /* _QUAGGA_BGP_TABLE_H */ From a78beeb544e9b6407cf71e45bdb4cd70788e2c2d Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 30 Jul 2018 10:30:41 -0400 Subject: [PATCH 3/5] bgpd: Abstract bgp_static retrieving/setting from info pointer The bgp_static data is stored as a void pointer in `struct bgp_node`. Abstract retrieval of this data and setting of this data into functions so that in the future we can move around what is stored in bgp_node. Signed-off-by: Donald Sharp --- bgpd/bgp_route.c | 52 +++++++++++++++++++++++++++--------------------- bgpd/bgp_table.h | 14 +++++++++++-- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 42028fda4..a04ed8eef 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -4845,7 +4845,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, return CMD_WARNING_CONFIG_FAILED; } - bgp_static = rn->info; + bgp_static = bgp_static_get_node_info(rn); if ((label_index != BGP_INVALID_LABEL_INDEX) && (label_index != bgp_static->label_index)) { @@ -4867,7 +4867,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, /* Clear configuration. */ bgp_static_free(bgp_static); - rn->info = NULL; + bgp_static_set_node_info(rn, NULL); bgp_unlock_node(rn); bgp_unlock_node(rn); } else { @@ -4875,10 +4875,9 @@ static int bgp_static_set(struct vty *vty, const char *negate, /* Set BGP static route configuration. */ rn = bgp_node_get(bgp->route[afi][safi], &p); - if (rn->info) { + bgp_static = bgp_static_get_node_info(rn); + if (bgp_static) { /* Configuration change. */ - bgp_static = rn->info; - /* Label index cannot be changed. */ if (bgp_static->label_index != label_index) { vty_out(vty, "%% cannot change label-index\n"); @@ -4927,7 +4926,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, bgp_static->rmap.map = route_map_lookup_by_name(rmap); } - rn->info = bgp_static; + bgp_static_set_node_info(rn, bgp_static); } bgp_static->valid = 1; @@ -4962,14 +4961,16 @@ void bgp_static_add(struct bgp *bgp) for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) { - bgp_static = rm->info; + bgp_static = + bgp_static_get_node_info(rm); bgp_static_update_safi(bgp, &rm->p, bgp_static, afi, safi); } } else { - bgp_static_update(bgp, &rn->p, rn->info, afi, - safi); + bgp_static_update(bgp, &rn->p, + bgp_static_get_node_info(rn), + afi, safi); } } } @@ -4997,19 +4998,20 @@ void bgp_static_delete(struct bgp *bgp) for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) { - bgp_static = rm->info; + bgp_static = + bgp_static_get_node_info(rm); bgp_static_withdraw_safi( bgp, &rm->p, AFI_IP, safi, (struct prefix_rd *)&rn->p); bgp_static_free(bgp_static); - rn->info = NULL; + bgp_static_set_node_info(rn, NULL); bgp_unlock_node(rn); } } else { - bgp_static = rn->info; + bgp_static = bgp_static_get_node_info(rn); bgp_static_withdraw(bgp, &rn->p, afi, safi); bgp_static_free(bgp_static); - rn->info = NULL; + bgp_static_set_node_info(rn, NULL); bgp_unlock_node(rn); } } @@ -5038,13 +5040,14 @@ void bgp_static_redo_import_check(struct bgp *bgp) for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) { - bgp_static = rm->info; + bgp_static = + bgp_static_get_node_info(rm); bgp_static_update_safi(bgp, &rm->p, bgp_static, afi, safi); } } else { - bgp_static = rn->info; + bgp_static = bgp_static_get_node_info(rn); bgp_static_update(bgp, &rn->p, bgp_static, afi, safi); } @@ -5216,7 +5219,7 @@ int bgp_static_set_safi(afi_t afi, safi_t safi, struct vty *vty, if (gwip) prefix_copy(&bgp_static->gatewayIp, &gw_ip); } - rn->info = bgp_static; + bgp_static_set_node_info(rn, bgp_static); bgp_static->valid = 1; bgp_static_update_safi(bgp, &p, bgp_static, afi, safi); @@ -5278,9 +5281,9 @@ int bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, if (rn) { bgp_static_withdraw_safi(bgp, &p, afi, safi, &prd); - bgp_static = rn->info; + bgp_static = bgp_static_get_node_info(rn); bgp_static_free(bgp_static); - rn->info = NULL; + bgp_static_set_node_info(rn, NULL); bgp_unlock_node(rn); bgp_unlock_node(rn); } else @@ -10776,7 +10779,7 @@ static int bgp_distance_set(struct vty *vty, const char *distance_str, bgp_unlock_node(rn); else { bdistance = bgp_distance_new(); - bgp_distance_set_node(rn, bdistance); + bgp_distance_set_node_info(rn, bdistance); } /* Set distance value. */ @@ -10875,7 +10878,7 @@ uint8_t bgp_distance_apply(struct prefix *p, struct bgp_info *rinfo, afi_t afi, /* Backdoor check. */ rn = bgp_node_lookup(bgp->route[afi][safi], p); if (rn) { - bgp_static = rn->info; + bgp_static = bgp_static_get_node_info(rn); bgp_unlock_node(rn); if (bgp_static->backdoor) { @@ -11290,7 +11293,8 @@ static void bgp_config_write_network_vpn(struct vty *vty, struct bgp *bgp, continue; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - if ((bgp_static = rn->info) == NULL) + bgp_static = bgp_static_get_node_info(rn); + if (bgp_static == NULL) continue; p = &rn->p; @@ -11339,7 +11343,8 @@ static void bgp_config_write_network_evpn(struct vty *vty, struct bgp *bgp, continue; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - if ((bgp_static = rn->info) == NULL) + bgp_static = bgp_static_get_node_info(rn); + if (bgp_static == NULL) continue; char *macrouter = NULL; @@ -11414,7 +11419,8 @@ void bgp_config_write_network(struct vty *vty, struct bgp *bgp, afi_t afi, /* Network configuration. */ for (rn = bgp_table_top(bgp->route[afi][safi]); rn; rn = bgp_route_next(rn)) { - if ((bgp_static = rn->info) == NULL) + bgp_static = bgp_static_get_node_info(rn); + if (bgp_static == NULL) continue; p = &rn->p; diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index 6c52d27a8..e7206cf4e 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -331,10 +331,20 @@ static inline struct bgp_distance *bgp_distance_get_node(struct bgp_node *node) return node->info; } -static inline void bgp_distance_set_node(struct bgp_node *node, - struct bgp_distance *distance) +static inline void bgp_distance_set_node_info(struct bgp_node *node, + struct bgp_distance *distance) { node->info = distance; } +static inline struct bgp_static *bgp_static_get_node_info(struct bgp_node *node) +{ + return node->info; +} + +static inline void bgp_static_set_node_info(struct bgp_node *node, + struct bgp_static *bgp_static) +{ + node->info = bgp_static; +} #endif /* _QUAGGA_BGP_TABLE_H */ From 3d9dbdbe8b0a2c44049975da3cdbdaead67c8567 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 30 Jul 2018 10:46:00 -0400 Subject: [PATCH 4/5] bgpd: Abstract bgp_connected_ref retrieving/setting from info pointer The bgp_connected_ref data is stored as a void pointer in `struct bgp_node`. Abstract retrieval of this data and setting of this data into functions so that in the future we can move around what is stored in bgp_node. Signed-off-by: Donald Sharp --- bgpd/bgp_nexthop.c | 26 ++++++++++++++------------ bgpd/bgp_table.h | 13 +++++++++++++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index 76bfa73fe..e092313d7 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -278,14 +278,14 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc) rn = bgp_node_get(bgp->connected_table[AFI_IP], (struct prefix *)&p); - if (rn->info) { - bc = rn->info; + bc = bgp_connected_get_node_info(rn); + if (bc) bc->refcnt++; - } else { + else { bc = XCALLOC(MTYPE_BGP_CONN, sizeof(struct bgp_connected_ref)); bc->refcnt = 1; - rn->info = bc; + bgp_connected_set_node_info(rn, bc); } for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { @@ -310,14 +310,15 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc) rn = bgp_node_get(bgp->connected_table[AFI_IP6], (struct prefix *)&p); - if (rn->info) { - bc = rn->info; + + bc = bgp_connected_get_node_info(rn); + if (bc) bc->refcnt++; - } else { + else { bc = XCALLOC(MTYPE_BGP_CONN, sizeof(struct bgp_connected_ref)); bc->refcnt = 1; - rn->info = bc; + bgp_connected_set_node_info(rn, bc); } } } @@ -354,11 +355,11 @@ void bgp_connected_delete(struct bgp *bgp, struct connected *ifc) if (!rn) return; - bc = rn->info; + bc = bgp_connected_get_node_info(rn); bc->refcnt--; if (bc->refcnt == 0) { XFREE(MTYPE_BGP_CONN, bc); - rn->info = NULL; + bgp_connected_set_node_info(rn, NULL); } bgp_unlock_node(rn); bgp_unlock_node(rn); @@ -368,15 +369,16 @@ static void bgp_connected_cleanup(struct route_table *table, struct route_node *rn) { struct bgp_connected_ref *bc; + struct bgp_node *bn = bgp_node_from_rnode(rn); - bc = rn->info; + bc = bgp_connected_get_node_info(bn); if (!bc) return; bc->refcnt--; if (bc->refcnt == 0) { XFREE(MTYPE_BGP_CONN, bc); - rn->info = NULL; + bgp_connected_set_node_info(bn, NULL); } } diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index e7206cf4e..f60265b51 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -347,4 +347,17 @@ static inline void bgp_static_set_node_info(struct bgp_node *node, { node->info = bgp_static; } + +static inline struct bgp_connected_ref * +bgp_connected_get_node_info(struct bgp_node *node) +{ + return node->info; +} + +static inline void bgp_connected_set_node_info(struct bgp_node *node, + struct bgp_connected_ref *bc) +{ + node->info = bc; +} + #endif /* _QUAGGA_BGP_TABLE_H */ From 14315f2d69a1b1d41b4eaf557b352d26be9e7fc7 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 19 Sep 2018 08:20:37 -0400 Subject: [PATCH 5/5] bgpd: Abstract bgp_nexthop_cache retrieving/setting from info pointer The bgp_nexthop_cache data is stored as a void pointer in `struct bgp_node`. Abstract retrieval of this data and setting of this data into functions so that in the future we can move around what is stored in bgp_node. Signed-off-by: Donald Sharp --- bgpd/bgp_nexthop.c | 58 ++++++++++++++++++++++++---------------------- bgpd/bgp_nht.c | 48 ++++++++++++++++++++++++-------------- bgpd/bgp_table.h | 12 ++++++++++ 3 files changed, 73 insertions(+), 45 deletions(-) diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index e092313d7..15f42e26d 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -80,12 +80,14 @@ static void bgp_nexthop_cache_reset(struct bgp_table *table) struct bgp_node *rn; struct bgp_nexthop_cache *bnc; - for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) - if ((bnc = rn->info) != NULL) { + for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { + bnc = bgp_nexthop_get_node_info(rn); + if (bnc != NULL) { bnc_free(bnc); - rn->info = NULL; + bgp_nexthop_set_node_info(rn, NULL); bgp_unlock_node(rn); } + } } static void *bgp_tip_hash_alloc(void *p) @@ -530,35 +532,35 @@ static void bgp_show_nexthops(struct vty *vty, struct bgp *bgp, int detail) for (rn = bgp_table_top(bgp->nexthop_cache_table[afi]); rn; rn = bgp_route_next(rn)) { - if ((bnc = rn->info) != NULL) { - if (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_VALID)) { - vty_out(vty, - " %s valid [IGP metric %d], #paths %d\n", - inet_ntop(rn->p.family, - &rn->p.u.prefix, buf, - sizeof(buf)), - bnc->metric, bnc->path_count); + bnc = bgp_nexthop_get_node_info(rn); + if (!bnc) + continue; - if (!detail) - continue; + if (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_VALID)) { + vty_out(vty, + " %s valid [IGP metric %d], #paths %d\n", + inet_ntop(rn->p.family, + &rn->p.u.prefix, buf, + sizeof(buf)), + bnc->metric, bnc->path_count); - bgp_show_nexthops_detail(vty, bgp, bnc); + if (!detail) + continue; - } else { - vty_out(vty, " %s invalid\n", - inet_ntop(rn->p.family, - &rn->p.u.prefix, buf, - sizeof(buf))); - if (CHECK_FLAG(bnc->flags, - BGP_NEXTHOP_CONNECTED)) - vty_out(vty, - " Must be Connected\n"); + bgp_show_nexthops_detail(vty, bgp, bnc); + + } else { + vty_out(vty, " %s invalid\n", + inet_ntop(rn->p.family, + &rn->p.u.prefix, buf, + sizeof(buf))); + if (CHECK_FLAG(bnc->flags, + BGP_NEXTHOP_CONNECTED)) + vty_out(vty, " Must be Connected\n"); } - tbuf = time(NULL) - - (bgp_clock() - bnc->last_update); - vty_out(vty, " Last update: %s", ctime(&tbuf)); - vty_out(vty, "\n"); - } + tbuf = time(NULL) - (bgp_clock() - bnc->last_update); + vty_out(vty, " Last update: %s", ctime(&tbuf)); + vty_out(vty, "\n"); } } } diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 3d2a4ee0d..7eba0eda4 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -97,7 +97,7 @@ static void bgp_unlink_nexthop_check(struct bgp_nexthop_cache *bnc) } unregister_zebra_rnh(bnc, CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE)); - bnc->node->info = NULL; + bgp_nexthop_set_node_info(bnc->node, NULL); bgp_unlock_node(bnc->node); bnc->node = NULL; bnc_free(bnc); @@ -128,11 +128,10 @@ void bgp_unlink_nexthop_by_peer(struct peer *peer) rn = bgp_node_get(peer->bgp->nexthop_cache_table[afi], &p); - if (!rn->info) + bnc = bgp_nexthop_get_node_info(rn); + if (!bnc) return; - bnc = rn->info; - /* cleanup the peer reference */ bnc->nht_info = NULL; @@ -191,9 +190,10 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop, else rn = bgp_node_get(bgp_nexthop->nexthop_cache_table[afi], &p); - if (!rn->info) { + bnc = bgp_nexthop_get_node_info(rn); + if (!bnc) { bnc = bnc_new(); - rn->info = bnc; + bgp_nexthop_set_node_info(rn, bnc); bnc->node = rn; bnc->bgp = bgp_nexthop; bgp_lock_node(rn); @@ -205,7 +205,6 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop, } } - bnc = rn->info; bgp_unlock_node(rn); if (is_bgp_static_route) { SET_FLAG(bnc->flags, BGP_STATIC_ROUTE); @@ -297,16 +296,21 @@ void bgp_delete_connected_nexthop(afi_t afi, struct peer *peer) rn = bgp_node_lookup( peer->bgp->nexthop_cache_table[family2afi(p.family)], &p); - if (!rn || !rn->info) { + if (!rn) { if (BGP_DEBUG(nht, NHT)) zlog_debug("Cannot find connected NHT node for peer %s", peer->host); - if (rn) - bgp_unlock_node(rn); return; } - bnc = rn->info; + bnc = bgp_nexthop_get_node_info(rn); + if (!bnc) { + if (BGP_DEBUG(nht, NHT)) + zlog_debug("Cannot find connected NHT node for peer %s on route_node as expected", + peer->host); + bgp_unlock_node(rn); + return; + } bgp_unlock_node(rn); if (bnc->nht_info != peer) { @@ -324,7 +328,7 @@ void bgp_delete_connected_nexthop(afi_t afi, struct peer *peer) zlog_debug("Freeing connected NHT node %p for peer %s", bnc, peer->host); unregister_zebra_rnh(bnc, 0); - bnc->node->info = NULL; + bgp_nexthop_set_node_info(bnc->node, NULL); bgp_unlock_node(bnc->node); bnc_free(bnc); } @@ -367,19 +371,29 @@ void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id) bgp->import_check_table[family2afi(nhr.prefix.family)], &nhr.prefix); - if (!rn || !rn->info) { + if (!rn) { if (BGP_DEBUG(nht, NHT)) { char buf[PREFIX2STR_BUFFER]; prefix2str(&nhr.prefix, buf, sizeof(buf)); zlog_debug("parse nexthop update(%s): rn not found", buf); } - if (rn) - bgp_unlock_node(rn); return; } - bnc = rn->info; + bnc = bgp_nexthop_get_node_info(rn); + if (!bnc) { + if (BGP_DEBUG(nht, NHT)) { + char buf[PREFIX2STR_BUFFER]; + + prefix2str(&nhr.prefix, buf, sizeof(buf)); + zlog_debug("parse nexthop update(%s): bnc node info not found", + buf); + } + bgp_unlock_node(rn); + return; + } + bgp_unlock_node(rn); bnc->last_update = bgp_clock(); bnc->change_flags = 0; @@ -487,7 +501,7 @@ void bgp_cleanup_nexthops(struct bgp *bgp) for (rn = bgp_table_top(bgp->nexthop_cache_table[afi]); rn; rn = bgp_route_next(rn)) { - bnc = rn->info; + bnc = bgp_nexthop_get_node_info(rn); if (!bnc) continue; diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index f60265b51..bec95c71a 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -360,4 +360,16 @@ static inline void bgp_connected_set_node_info(struct bgp_node *node, node->info = bc; } +static inline struct bgp_nexthop_cache * +bgp_nexthop_get_node_info(struct bgp_node *node) +{ + return node->info; +} + +static inline void bgp_nexthop_set_node_info(struct bgp_node *node, + struct bgp_nexthop_cache *bnc) +{ + node->info = bnc; +} + #endif /* _QUAGGA_BGP_TABLE_H */