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);
 	}
 }