Blame SOURCES/0006-graceful-restart.patch

9ad5e0
From 12f9f8472d0f8cfc026352906b8e5342df2846cc Mon Sep 17 00:00:00 2001
9ad5e0
From: Donatas Abraitis <donatas@opensourcerouting.org>
9ad5e0
Date: Tue, 27 Sep 2022 17:30:16 +0300
9ad5e0
Subject: [PATCH] bgpd: Do not send Deconfig/Shutdown message when restarting
9ad5e0
9ad5e0
We might disable sending unconfig/shutdown notifications when
9ad5e0
Graceful-Restart is enabled and negotiated.
9ad5e0
9ad5e0
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
9ad5e0
---
9ad5e0
 bgpd/bgpd.c | 35 ++++++++++++++++++++++++++---------
9ad5e0
 1 file changed, 26 insertions(+), 9 deletions(-)
9ad5e0
9ad5e0
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
9ad5e0
index 749e46ebe9d..ae1308db423 100644
9ad5e0
--- a/bgpd/bgpd.c
9ad5e0
+++ b/bgpd/bgpd.c
9ad5e0
@@ -2755,11 +2755,34 @@ int peer_group_remote_as(struct bgp *bgp, const char *group_name, as_t *as,
9ad5e0
 
9ad5e0
 void peer_notify_unconfig(struct peer *peer)
9ad5e0
 {
9ad5e0
+	if (BGP_PEER_GRACEFUL_RESTART_CAPABLE(peer)) {
9ad5e0
+		if (bgp_debug_neighbor_events(peer))
9ad5e0
+			zlog_debug(
9ad5e0
+				"%pBP configured Graceful-Restart, skipping unconfig notification",
9ad5e0
+				peer);
9ad5e0
+		return;
9ad5e0
+	}
9ad5e0
+
9ad5e0
 	if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
9ad5e0
 		bgp_notify_send(peer, BGP_NOTIFY_CEASE,
9ad5e0
 				BGP_NOTIFY_CEASE_PEER_UNCONFIG);
9ad5e0
 }
9ad5e0
 
9ad5e0
+static void peer_notify_shutdown(struct peer *peer)
9ad5e0
+{
9ad5e0
+	if (BGP_PEER_GRACEFUL_RESTART_CAPABLE(peer)) {
9ad5e0
+		if (bgp_debug_neighbor_events(peer))
9ad5e0
+			zlog_debug(
9ad5e0
+				"%pBP configured Graceful-Restart, skipping shutdown notification",
9ad5e0
+				peer);
9ad5e0
+		return;
9ad5e0
+	}
9ad5e0
+
9ad5e0
+	if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
9ad5e0
+		bgp_notify_send(peer, BGP_NOTIFY_CEASE,
9ad5e0
+				BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
9ad5e0
+}
9ad5e0
+
9ad5e0
 void peer_group_notify_unconfig(struct peer_group *group)
9ad5e0
 {
9ad5e0
 	struct peer *peer, *other;
9ad5e0
@@ -3676,11 +3699,8 @@ int bgp_delete(struct bgp *bgp)
9ad5e0
 	}
9ad5e0
 
9ad5e0
 	/* Inform peers we're going down. */
9ad5e0
-	for (ALL_LIST_ELEMENTS(bgp->peer, node, next, peer)) {
9ad5e0
-		if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
9ad5e0
-			bgp_notify_send(peer, BGP_NOTIFY_CEASE,
9ad5e0
-					BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
9ad5e0
-	}
9ad5e0
+	for (ALL_LIST_ELEMENTS(bgp->peer, node, next, peer))
9ad5e0
+		peer_notify_shutdown(peer);
9ad5e0
 
9ad5e0
 	/* Delete static routes (networks). */
9ad5e0
 	bgp_static_delete(bgp);
9ad5e0
@@ -8252,10 +8272,7 @@ void bgp_terminate(void)
9ad5e0
 
9ad5e0
 	for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp))
9ad5e0
 		for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
9ad5e0
-			if (peer_established(peer) || peer->status == OpenSent
9ad5e0
-			    || peer->status == OpenConfirm)
9ad5e0
-				bgp_notify_send(peer, BGP_NOTIFY_CEASE,
9ad5e0
-						BGP_NOTIFY_CEASE_PEER_UNCONFIG);
9ad5e0
+			peer_notify_unconfig(peer);
9ad5e0
 
9ad5e0
 	BGP_TIMER_OFF(bm->t_rmap_update);
9ad5e0