From 89c73443e8cfd3d6809e8a036151849c3bcf518c Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 8 Nov 2022 07:11:18 -0500 Subject: [PATCH] bgpd: Make calling bgp_soft_reconfig_in consistent Not all places were checking to see if soft reconfiguration was turned on before calling into it to do all that work. Signed-off-by: Donald Sharp --- bgpd/bgp_mac.c | 21 ++++++++++----------- bgpd/bgp_route.c | 13 +++++++++---- bgpd/bgp_route.h | 7 ++++++- bgpd/bgp_rpki.c | 2 ++ bgpd/bgpd.c | 15 ++++++--------- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/bgpd/bgp_mac.c b/bgpd/bgp_mac.c index 02b7e64869..b9649ac4da 100644 --- a/bgpd/bgp_mac.c +++ b/bgpd/bgp_mac.c @@ -242,19 +242,18 @@ static void bgp_mac_rescan_evpn_table(struct bgp *bgp, struct ethaddr *macaddr) if (!peer_established(peer)) continue; - if (CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_SOFT_RECONFIG)) { - if (bgp_debug_update(peer, NULL, NULL, 1)) - zlog_debug("Processing EVPN MAC interface change on peer %s (inbound, soft-reconfig)", - peer->host); - - bgp_soft_reconfig_in(peer, afi, safi); - } else { + if (bgp_debug_update(peer, NULL, NULL, 1)) + zlog_debug( + "Processing EVPN MAC interface change on peer %s %s", + peer->host, + CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_SOFT_RECONFIG) + ? "(inbound, soft-reconfig)" + : ""); + + if (!bgp_soft_reconfig_in(peer, afi, safi)) { struct bgp_table *table = bgp->rib[afi][safi]; - if (bgp_debug_update(peer, NULL, NULL, 1)) - zlog_debug("Processing EVPN MAC interface change on peer %s", - peer->host); bgp_process_mac_rescan_table(bgp, peer, table, macaddr); } } diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 1a2408adea..130a0b4abd 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -5342,7 +5342,10 @@ void bgp_soft_reconfig_table_task_cancel(const struct bgp *bgp, } } -void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi) +/* + * Returns false if the peer is not configured for soft reconfig in + */ +bool bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi) { struct bgp_dest *dest; struct bgp_table *table; @@ -5350,14 +5353,14 @@ void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi) struct peer *npeer; struct peer_af *paf; - if (!peer_established(peer)) - return; + if (!CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)) + return false; if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP) && (safi != SAFI_EVPN)) { table = peer->bgp->rib[afi][safi]; if (!table) - return; + return true; table->soft_reconfig_init = true; @@ -5417,6 +5420,8 @@ void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi) bgp_soft_reconfig_table(peer, afi, safi, table, &prd); } + + return true; } diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index dfe741914d..c85551634a 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -676,7 +676,12 @@ extern void bgp_default_originate(struct peer *, afi_t, safi_t, int); extern void bgp_soft_reconfig_table_task_cancel(const struct bgp *bgp, const struct bgp_table *table, const struct peer *peer); -extern void bgp_soft_reconfig_in(struct peer *, afi_t, safi_t); + +/* + * If this peer is configured for soft reconfig in then do the work + * and return true. If it is not return false; and do nothing + */ +extern bool bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi); extern void bgp_clear_route(struct peer *, afi_t, safi_t); extern void bgp_clear_route_all(struct peer *); extern void bgp_clear_adj_in(struct peer *, afi_t, safi_t); diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c index b2abd51508..d458b72a1b 100644 --- a/bgpd/bgp_rpki.c +++ b/bgpd/bgp_rpki.c @@ -490,6 +490,8 @@ static void revalidate_all_routes(void) if (!peer->bgp->rib[afi][safi]) continue; + if (!peer_established(peer)) + continue; bgp_soft_reconfig_in(peer, afi, safi); } } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 8273c78f1e..a10fa7e706 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -5517,11 +5517,11 @@ void peer_on_policy_change(struct peer *peer, afi_t afi, safi_t safi, if (!peer_established(peer)) return; - if (CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_SOFT_RECONFIG)) { - bgp_soft_reconfig_in(peer, afi, safi); - } else if (CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_OLD_RCV) || - CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_NEW_RCV)) { + if (bgp_soft_reconfig_in(peer, afi, safi)) + return; + + if (CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_OLD_RCV) || + CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_NEW_RCV)) { if (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) && (CHECK_FLAG(peer->af_cap[afi][safi], @@ -7777,10 +7777,7 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi, || stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX) { /* If neighbor has soft reconfiguration inbound flag. Use Adj-RIB-In database. */ - if (CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_SOFT_RECONFIG)) - bgp_soft_reconfig_in(peer, afi, safi); - else { + if (!bgp_soft_reconfig_in(peer, afi, safi)) { /* If neighbor has route refresh capability, send route refresh message to the peer. */ -- 2.39.5