From b295810d00be6709f2ed66b835bbef7fbc7511c1 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 8 Jun 2023 23:17:53 -0400 Subject: [PATCH] Revert "bgpd: upon if up event, evaluate bnc with matching nexthop" --- bgpd/bgp_nexthop.c | 36 +++++++++----------- bgpd/bgp_nexthop.h | 2 +- bgpd/bgp_nht.c | 83 ++++++++++++++-------------------------------- 3 files changed, 41 insertions(+), 80 deletions(-) diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index e17a05ecdf..c878512389 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -43,9 +43,9 @@ int bgp_nexthop_cache_compare(const struct bgp_nexthop_cache *a, if (a->srte_color > b->srte_color) return 1; - if (a->ifindex_ipv6_ll < b->ifindex_ipv6_ll) + if (a->ifindex < b->ifindex) return -1; - if (a->ifindex_ipv6_ll > b->ifindex_ipv6_ll) + if (a->ifindex > b->ifindex) return 1; return prefix_cmp(&a->prefix, &b->prefix); @@ -65,7 +65,7 @@ struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree, bnc = XCALLOC(MTYPE_BGP_NEXTHOP_CACHE, sizeof(struct bgp_nexthop_cache)); bnc->prefix = *prefix; - bnc->ifindex_ipv6_ll = ifindex; + bnc->ifindex = ifindex; bnc->srte_color = srte_color; bnc->tree = tree; LIST_INIT(&(bnc->paths)); @@ -105,7 +105,7 @@ struct bgp_nexthop_cache *bnc_find(struct bgp_nexthop_cache_head *tree, bnc.prefix = *prefix; bnc.srte_color = srte_color; - bnc.ifindex_ipv6_ll = ifindex; + bnc.ifindex = ifindex; return bgp_nexthop_cache_find(tree, &bnc); } @@ -857,9 +857,8 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp, json_object_string_add( json_gate, "interfaceName", ifindex2ifname( - bnc->ifindex_ipv6_ll - ? bnc->ifindex_ipv6_ll - : nexthop->ifindex, + bnc->ifindex ? bnc->ifindex + : nexthop->ifindex, bgp->vrf_id)); break; case NEXTHOP_TYPE_IPV4: @@ -870,9 +869,8 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp, json_object_string_add( json_gate, "interfaceName", ifindex2ifname( - bnc->ifindex_ipv6_ll - ? bnc->ifindex_ipv6_ll - : nexthop->ifindex, + bnc->ifindex ? bnc->ifindex + : nexthop->ifindex, bgp->vrf_id)); break; case NEXTHOP_TYPE_IPV4_IFINDEX: @@ -881,9 +879,8 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp, json_object_string_add( json_gate, "interfaceName", ifindex2ifname( - bnc->ifindex_ipv6_ll - ? bnc->ifindex_ipv6_ll - : nexthop->ifindex, + bnc->ifindex ? bnc->ifindex + : nexthop->ifindex, bgp->vrf_id)); break; case NEXTHOP_TYPE_BLACKHOLE: @@ -917,9 +914,9 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp, case NEXTHOP_TYPE_IPV6_IFINDEX: vty_out(vty, " gate %pI6", &nexthop->gate.ipv6); if (nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX && - bnc->ifindex_ipv6_ll) + bnc->ifindex) vty_out(vty, ", if %s\n", - ifindex2ifname(bnc->ifindex_ipv6_ll, + ifindex2ifname(bnc->ifindex, bgp->vrf_id)); else if (nexthop->ifindex) vty_out(vty, ", if %s\n", @@ -932,9 +929,9 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp, case NEXTHOP_TYPE_IPV4_IFINDEX: vty_out(vty, " gate %pI4", &nexthop->gate.ipv4); if (nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX && - bnc->ifindex_ipv6_ll) + bnc->ifindex) vty_out(vty, ", if %s\n", - ifindex2ifname(bnc->ifindex_ipv6_ll, + ifindex2ifname(bnc->ifindex, bgp->vrf_id)); else if (nexthop->ifindex) vty_out(vty, ", if %s\n", @@ -945,9 +942,8 @@ static void bgp_show_nexthops_detail(struct vty *vty, struct bgp *bgp, break; case NEXTHOP_TYPE_IFINDEX: vty_out(vty, " if %s\n", - ifindex2ifname(bnc->ifindex_ipv6_ll - ? bnc->ifindex_ipv6_ll - : nexthop->ifindex, + ifindex2ifname(bnc->ifindex ? bnc->ifindex + : nexthop->ifindex, bgp->vrf_id)); break; case NEXTHOP_TYPE_BLACKHOLE: diff --git a/bgpd/bgp_nexthop.h b/bgpd/bgp_nexthop.h index 7219153a57..95e2f9165b 100644 --- a/bgpd/bgp_nexthop.h +++ b/bgpd/bgp_nexthop.h @@ -27,7 +27,7 @@ PREDECL_RBTREE_UNIQ(bgp_nexthop_cache); /* BGP nexthop cache value structure. */ struct bgp_nexthop_cache { /* The ifindex of the outgoing interface *if* it's a v6 LL */ - ifindex_t ifindex_ipv6_ll; + ifindex_t ifindex; /* RB-tree entry. */ struct bgp_nexthop_cache_item entry; diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 636ea06a20..d7b1429881 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -70,10 +70,9 @@ static int bgp_isvalid_nexthop_for_ebgp(struct bgp_nexthop_cache *bnc, if (nexthop->type == NEXTHOP_TYPE_IFINDEX || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) { - ifp = if_lookup_by_index(bnc->ifindex_ipv6_ll - ? bnc->ifindex_ipv6_ll - : nexthop->ifindex, - bnc->bgp->vrf_id); + ifp = if_lookup_by_index( + bnc->ifindex ? bnc->ifindex : nexthop->ifindex, + bnc->bgp->vrf_id); } if (!ifp) continue; @@ -92,10 +91,9 @@ static int bgp_isvalid_nexthop_for_mplsovergre(struct bgp_nexthop_cache *bnc, for (nexthop = bnc->nexthop; nexthop; nexthop = nexthop->next) { if (nexthop->type != NEXTHOP_TYPE_BLACKHOLE) { - ifp = if_lookup_by_index(bnc->ifindex_ipv6_ll - ? bnc->ifindex_ipv6_ll - : nexthop->ifindex, - bnc->bgp->vrf_id); + ifp = if_lookup_by_index( + bnc->ifindex ? bnc->ifindex : nexthop->ifindex, + bnc->bgp->vrf_id); if (ifp && (ifp->ll_type == ZEBRA_LLT_IPGRE || ifp->ll_type == ZEBRA_LLT_IP6GRE)) break; @@ -139,8 +137,8 @@ static void bgp_unlink_nexthop_check(struct bgp_nexthop_cache *bnc) if (LIST_EMPTY(&(bnc->paths)) && !bnc->nht_info) { if (BGP_DEBUG(nht, NHT)) zlog_debug("%s: freeing bnc %pFX(%d)(%u)(%s)", __func__, - &bnc->prefix, bnc->ifindex_ipv6_ll, - bnc->srte_color, bnc->bgp->name_pretty); + &bnc->prefix, bnc->ifindex, bnc->srte_color, + bnc->bgp->name_pretty); /* only unregister if this is the last nh for this prefix*/ if (!bnc_existing_for_prefix(bnc)) unregister_zebra_rnh(bnc); @@ -217,7 +215,7 @@ bgp_find_ipv6_nexthop_matching_peer(struct peer *peer) if (BGP_DEBUG(nht, NHT)) { zlog_debug( "Found bnc: %pFX(%u)(%u)(%p) for peer: %s(%s) %p", - &bnc->prefix, bnc->ifindex_ipv6_ll, + &bnc->prefix, bnc->ifindex, bnc->srte_color, bnc, peer->host, peer->bgp->name_pretty, peer); } @@ -364,17 +362,15 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop, bnc->bgp = bgp_nexthop; if (BGP_DEBUG(nht, NHT)) zlog_debug("Allocated bnc %pFX(%d)(%u)(%s) peer %p", - &bnc->prefix, bnc->ifindex_ipv6_ll, - bnc->srte_color, bnc->bgp->name_pretty, - peer); + &bnc->prefix, bnc->ifindex, bnc->srte_color, + bnc->bgp->name_pretty, peer); } else { if (BGP_DEBUG(nht, NHT)) zlog_debug( "Found existing bnc %pFX(%d)(%s) flags 0x%x ifindex %d #paths %d peer %p", - &bnc->prefix, bnc->ifindex_ipv6_ll, - bnc->bgp->name_pretty, bnc->flags, - bnc->ifindex_ipv6_ll, bnc->path_count, - bnc->nht_info); + &bnc->prefix, bnc->ifindex, + bnc->bgp->name_pretty, bnc->flags, bnc->ifindex, + bnc->path_count, bnc->nht_info); } if (pi && is_route_parent_evpn(pi)) @@ -421,10 +417,10 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop, UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); UNSET_FLAG(bnc->flags, BGP_NEXTHOP_VALID); } - if (peer && (bnc->ifindex_ipv6_ll != ifindex)) { + if (peer && (bnc->ifindex != ifindex)) { UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); UNSET_FLAG(bnc->flags, BGP_NEXTHOP_VALID); - bnc->ifindex_ipv6_ll = ifindex; + bnc->ifindex = ifindex; } if (bgp_route->inst_type == BGP_INSTANCE_TYPE_VIEW) { SET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); @@ -553,8 +549,8 @@ static void bgp_process_nexthop_update(struct bgp_nexthop_cache *bnc, zlog_debug( "%s(%u): Rcvd NH update %pFX(%u)(%u) - metric %d/%d #nhops %d/%d flags %s", bnc->bgp->name_pretty, bnc->bgp->vrf_id, &nhr->prefix, - bnc->ifindex_ipv6_ll, bnc->srte_color, nhr->metric, - bnc->metric, nhr->nexthop_num, bnc->nexthop_num, + bnc->ifindex, bnc->srte_color, nhr->metric, bnc->metric, + nhr->nexthop_num, bnc->nexthop_num, bgp_nexthop_dump_bnc_flags(bnc, bnc_buf, sizeof(bnc_buf))); } @@ -707,40 +703,9 @@ static void bgp_nht_ifp_table_handle(struct bgp *bgp, struct interface *ifp, bool up) { struct bgp_nexthop_cache *bnc; - struct nexthop *nhop; - uint8_t other_nh_count; - bool nhop_found; frr_each (bgp_nexthop_cache, table, bnc) { - other_nh_count = 0; - nhop_found = bnc->ifindex_ipv6_ll == ifp->ifindex; - for (nhop = bnc->nexthop; nhop; nhop = nhop->next) { - if (nhop->ifindex == bnc->ifindex_ipv6_ll) - continue; - - if (nhop->ifindex != ifp->ifindex) { - other_nh_count++; - continue; - } - if (nhop->vrf_id != ifp->vrf->vrf_id) { - other_nh_count++; - continue; - } - nhop_found = true; - } - - if (!nhop_found) - /* The event interface does not match the nexthop cache - * entry */ - continue; - - if (!up && other_nh_count > 0) - /* Down event ignored in case of multiple next-hop - * interfaces. The other might interfaces might be still - * up. The cases where all interfaces are down or a bnc - * is invalid are processed by a separate zebra rnh - * messages. - */ + if (bnc->ifindex != ifp->ifindex) continue; bnc->last_update = monotime(NULL); @@ -848,9 +813,9 @@ void bgp_nht_interface_events(struct peer *peer) if (!bnc) return; - if (bnc->ifindex_ipv6_ll) + if (bnc->ifindex) event_add_event(bm->master, bgp_nht_ifp_initial, bnc->bgp, - bnc->ifindex_ipv6_ll, NULL); + bnc->ifindex, NULL); } void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id) @@ -1109,7 +1074,7 @@ static void register_zebra_rnh(struct bgp_nexthop_cache *bnc) if (bnc->flags & BGP_NEXTHOP_REGISTERED) return; - if (bnc->ifindex_ipv6_ll) { + if (bnc->ifindex) { SET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); return; } @@ -1130,7 +1095,7 @@ static void unregister_zebra_rnh(struct bgp_nexthop_cache *bnc) if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED)) return; - if (bnc->ifindex_ipv6_ll) { + if (bnc->ifindex) { UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); return; } @@ -1163,7 +1128,7 @@ void evaluate_paths(struct bgp_nexthop_cache *bnc) zlog_debug( "NH update for %pFX(%d)(%u)(%s) - flags %s chgflags %s- evaluate paths", - &bnc->prefix, bnc->ifindex_ipv6_ll, bnc->srte_color, + &bnc->prefix, bnc->ifindex, bnc->srte_color, bnc->bgp->name_pretty, bgp_nexthop_dump_bnc_flags(bnc, bnc_buf, sizeof(bnc_buf)), -- 2.39.5