From f793136d18d8d33d785c99178c57f0998c93feac Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Fri, 22 Sep 2023 20:35:06 +0300 Subject: [PATCH] bgpd: Clear graceful-restart per AFI/SAFI capability flags when receiving unset We flushed the main capability received flag, but missed flushing per AFI/SAFI. Signed-off-by: Donatas Abraitis --- bgpd/bgp_packet.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 851432d562..1c2f8eb2da 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -2957,6 +2957,8 @@ static void bgp_dynamic_capability_graceful_restart(uint8_t *pnt, int action, uint8_t *data = pnt + 3; uint8_t *end = pnt + hdr->length; size_t len = end - data; + afi_t afi; + safi_t safi; if (action == CAPABILITY_ACTION_SET) { if (len < sizeof(gr_restart_flag_time)) { @@ -3031,6 +3033,15 @@ static void bgp_dynamic_capability_graceful_restart(uint8_t *pnt, int action, data += GRACEFUL_RESTART_CAPABILITY_PER_AFI_SAFI_SIZE; } } else { + FOREACH_AFI_SAFI (afi, safi) { + UNSET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_RESTART_AF_RCV); + UNSET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_RESTART_AF_PRESERVE_RCV); + } + + UNSET_FLAG(peer->cap, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV); + UNSET_FLAG(peer->cap, PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV); UNSET_FLAG(peer->cap, PEER_CAP_RESTART_RCV); } }