]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Clear graceful-restart per AFI/SAFI capability flags when receiving unset
authorDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 22 Sep 2023 17:35:06 +0000 (20:35 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 22 Sep 2023 17:50:06 +0000 (20:50 +0300)
We flushed the main capability received flag, but missed flushing per AFI/SAFI.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_packet.c

index 851432d562196271446aa5afebba54da20871407..1c2f8eb2da2f427d13d1e9c9a75c8f23d4d05a09 100644 (file)
@@ -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);
        }
 }