From f47b2fb94aad59e9475626336ad4c91d2e74d718 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Fri, 14 Mar 2025 11:46:51 +0200 Subject: [PATCH] bgpd: Move stale Adj-RIB-Out paths removal to subgroup_process_announce_selected() Signed-off-by: Donatas Abraitis --- bgpd/bgp_route.c | 23 ++++++++++++++++++++++- bgpd/bgp_updgrp_adv.c | 29 ----------------------------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index aa9fe9136e..082c2a737a 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3406,13 +3406,14 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, safi_t safi, uint32_t addpath_tx_id) { const struct prefix *p; - struct peer *onlypeer; + struct peer *onlypeer, *peer; struct attr attr = { 0 }, *pattr = &attr; struct bgp *bgp; bool advertise; p = bgp_dest_get_prefix(dest); bgp = SUBGRP_INST(subgrp); + peer = SUBGRP_PEER(subgrp); onlypeer = ((SUBGRP_PCOUNT(subgrp) == 1) ? (SUBGRP_PFIRST(subgrp))->peer : NULL); @@ -3447,6 +3448,26 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, pattr, selected)) bgp_attr_flush(pattr); + + /* Remove paths from Adj-RIB-Out if it's not a best (selected) path. + * Why should we keep Adj-RIB-Out with stale paths? + */ + if (!bgp_addpath_encode_tx(peer, afi, safi)) { + struct bgp_adj_out *adj, *adj_next; + + RB_FOREACH_SAFE (adj, bgp_adj_out_rb, + &dest->adj_out, adj_next) { + if (adj->subgroup != subgrp) + continue; + + if (!adj->adv && + adj->addpath_tx_id != addpath_tx_id) { + bgp_adj_out_unset_subgroup(dest, + subgrp, 1, + adj->addpath_tx_id); + } + } + } } else { bgp_adj_out_unset_subgroup( dest, subgrp, 1, addpath_tx_id); diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c index 29e52bde24..8f816eb30d 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c @@ -216,7 +216,6 @@ static int group_announce_route_walkcb(struct update_group *updgrp, void *arg) safi_t safi; struct peer *peer; struct bgp_adj_out *adj, *adj_next; - struct bgp_path_info *bpi; bool addpath_capable; afi = UPDGRP_AFI(updgrp); @@ -276,34 +275,6 @@ static int group_announce_route_walkcb(struct update_group *updgrp, void *arg) subgrp, ctx->pi, ctx->dest, afi, safi, bgp_addpath_id_for_peer(peer, afi, safi, &ctx->pi->tx_addpath)); - - /* Remove paths from Adj-RIB-Out if it's not a best path. - * Why should we keep Adj-RIB-Out with stale paths? - */ - RB_FOREACH_SAFE (adj, bgp_adj_out_rb, &ctx->dest->adj_out, - adj_next) { - uint32_t best_tx_id = 0; - - if (adj->subgroup != subgrp) - continue; - - for (bpi = bgp_dest_get_bgp_path_info(ctx->dest); bpi; - bpi = bpi->next) { - if (bgp_addpath_id_for_peer(peer, afi, safi, - &bpi->tx_addpath) == - adj->addpath_tx_id && - CHECK_FLAG(bpi->flags, BGP_PATH_SELECTED)) { - best_tx_id = adj->addpath_tx_id; - break; - } - } - - if (adj->addpath_tx_id != best_tx_id) - subgroup_process_announce_selected(subgrp, NULL, - ctx->dest, afi, - safi, - adj->addpath_tx_id); - } } else { RB_FOREACH_SAFE (adj, bgp_adj_out_rb, &ctx->dest->adj_out, adj_next) { -- 2.39.5