Commit 50ff26824f for frr
commit 50ff26824f29661f11e5ed232f0c425a27769d3b
Author: Enke Chen <enchen@paloaltonetworks.com>
Date: Thu Nov 5 09:55:38 2026 -0800
bgpd: clean up SUBGRP_STATUS_FORCE_UPDATES flag usage
In bgp_peer_clear(), the flag was set before calling peer_clear_soft(),
but peer_clear_soft() now passes force=true to bgp_announce_route()
which sets the flag appropriately.
In peer_change_action(), the flag was set before update_group_adjust_peer()
which could move the peer to a different subgroup, making the flag on
the old subgroup ineffective. Now we pass force=true to bgp_announce_route()
which sets the flag on the correct post-adjustment subgroup.
Signed-off-by: Enke Chen <enchen@paloaltonetworks.com>
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 61e5cb942f..66b7f79888 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -1220,7 +1220,6 @@ static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
{
int ret = 0;
struct peer_af *paf;
- bool force = stype == BGP_CLEAR_SOFT_OUT || stype == BGP_CLEAR_SOFT_BOTH;
/* if afi/.safi not specified, spin thru all of them */
if ((afi == AFI_UNSPEC) && (safi == SAFI_UNSPEC)) {
@@ -1233,10 +1232,6 @@ static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
if (!paf)
continue;
- if (force && paf && paf->subgroup)
- SET_FLAG(paf->subgroup->sflags,
- SUBGRP_STATUS_FORCE_UPDATES);
-
tmp_afi = paf->afi;
tmp_safi = paf->safi;
if (!peer->afc[tmp_afi][tmp_safi])
@@ -1257,11 +1252,6 @@ static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
if (!peer->afc[afi][tmp_safi])
continue;
- paf = peer_af_find(peer, afi, tmp_safi);
- if (force && paf && paf->subgroup)
- SET_FLAG(paf->subgroup->sflags,
- SUBGRP_STATUS_FORCE_UPDATES);
-
if (stype == BGP_CLEAR_HARD)
ret = peer_clear(peer, nnode);
else
@@ -1273,11 +1263,6 @@ static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
if (!peer->afc[afi][safi])
return 1;
- paf = peer_af_find(peer, afi, safi);
- if (force && paf && paf->subgroup)
- SET_FLAG(paf->subgroup->sflags,
- SUBGRP_STATUS_FORCE_UPDATES);
-
if (stype == BGP_CLEAR_HARD)
ret = peer_clear(peer, nnode);
else
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index c5f9d53238..752331aa84 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -5621,12 +5621,8 @@ void peer_change_action(struct peer *peer, afi_t afi, safi_t safi,
peer_vpn_change_bestpath(peer, afi);
if (type == peer_change_reset_out || type == peer_change_best_path) {
paf = peer_af_find(peer, afi, safi);
- if (paf && paf->subgroup)
- SET_FLAG(paf->subgroup->sflags,
- SUBGRP_STATUS_FORCE_UPDATES);
-
update_group_adjust_peer(paf);
- bgp_announce_route(peer, afi, safi, false);
+ bgp_announce_route(peer, afi, safi, true);
}
}