]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Retain the routes if we do a clear with N-bit set for Graceful-Restart
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 25 Mar 2025 15:20:56 +0000 (17:20 +0200)
committerton31337 <3352707+ton31337@users.noreply.github.com>
Fri, 28 Mar 2025 15:07:11 +0000 (15:07 +0000)
On receiving side we already did the job correctly, but the peer which initiates
the clear does not retain the other's routes. This commit fixes that.

Fixes: 20170775da3a3c5d41aba714d0c1d5a29b0da61c ("bgpd: Activate Graceful-Restart when receiving CEASE/HOLDTIME notifications")
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit b7c657d4e065f310fcf6454abae1a963c208c3b8)

bgpd/bgp_packet.c

index 9ebb2b21be703a1ef59846dd4b4ecb59c59fc50e..482e9056360a9a51aec4dd40c23a1b1d85a70829 100644 (file)
@@ -1042,6 +1042,13 @@ static void bgp_notify_send_internal(struct peer_connection *connection,
        /* Add packet to peer's output queue */
        stream_fifo_push(connection->obuf, s);
 
+       /* If Graceful-Restart N-bit (Notification) is exchanged,
+        * and it's not a Hard Reset, let's retain the routes.
+        */
+       if (bgp_has_graceful_restart_notification(peer) && !hard_reset &&
+           CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_MODE))
+               SET_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT);
+
        bgp_peer_gr_flags_update(peer);
        BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(peer->bgp,
                                                          peer->bgp->peer);