From 12419827df9f011e39bd49b12904d5d191ba0879 Mon Sep 17 00:00:00 2001 From: Vijayalaxmi Basavaraj Date: Wed, 12 Jun 2024 23:10:38 -0700 Subject: [PATCH] bgpd: Set GSHUT community attr when neighbor GSHUT When bgp neighbor GSHUT is done, advertise routes recivied from this neighbor with GSHUT attribute. Ticket: #3948080 Testing: mlx-4600ca1-01(config-router)# neighbor 210.2.0.2 graceful-shutdown logs: 2024/06/18 00:11:34 BGP: [MS8ZT-QEXJ8] u2:s4 210.2.0.2 announcing routes 2024/06/18 00:11:35 BGP: [TN0HX-6G1RR] u1:s3 send UPDATE w/ attr: nexthop 0.0.0.0, origin ?, localpref 0, community graceful-shutdown, path 201 200 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 20.10.10.2/32 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.0.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.1.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.2.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.3.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.4.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.5.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.2.6.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 210.3.1.0/24 IPv4 unicast 2024/06/18 00:11:35 BGP: [WEV7K-2GAQ5] u1:s3 send UPDATE len 96 (max message len: 65535) numpfx 9 2024/06/18 00:11:35 BGP: [MBFVT-8GSC6] u1:s3 210.2.0.2 send UPDATE w/ nexthop 210.2.0.1 2024/06/18 00:11:35 BGP: [TN0HX-6G1RR] u1:s3 send UPDATE w/ attr: nexthop 0.0.0.0, localpref 0, metric 0, community graceful-shutdown, path 2024/06/18 00:11:35 BGP: [HVRWP-5R9NQ] u1:s3 send UPDATE 133.133.133.133/32 IPv4 unicast mlx-4600ca1-01(config-router)#no neighbor 210.2.0.2 graceful-shutdown logs: 024/06/18 00:12:59 BGP: [MS8ZT-QEXJ8] u2:s6 210.2.0.2 announcing routes 2024/06/18 00:13:00 BGP: [TN0HX-6G1RR] u1:s5 send UPDATE w/ attr: nexthop 0.0.0.0, origin ?, path 201 200 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 20.10.10.2/32 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.0.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.1.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.2.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.3.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.4.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.5.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.2.6.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 210.3.1.0/24 IPv4 unicast 2024/06/18 00:13:00 BGP: [WEV7K-2GAQ5] u1:s5 send UPDATE len 89 (max message len: 65535) numpfx 9 2024/06/18 00:13:00 BGP: [MBFVT-8GSC6] u1:s5 210.2.0.2 send UPDATE w/ nexthop 210.2.0.1 2024/06/18 00:13:00 BGP: [TN0HX-6G1RR] u1:s5 send UPDATE w/ attr: nexthop 0.0.0.0, metric 0, path 2024/06/18 00:13:00 BGP: [HVRWP-5R9NQ] u1:s5 send UPDATE 133.133.133.133/32 IPv4 unicast 2024/06/18 00:13:00 BGP: [WEV7K-2GAQ5] u1:s5 send UPDATE len 56 (max message len: 65535) numpfx 1 default route: n2# show ip bgp 0.0.0.0/0 BGP routing table entry for 0.0.0.0/0, version 70 Paths: (1 available, best #1, table default) Advertised to non peer-group peers: mlx-4600ca1-01(210.2.0.1) n3(210.3.1.3) n3(2210:210:3:1::3) 201 100 210.2.0.1 (mlx-4600ca1-01) from mlx-4600ca1-01(210.2.0.1) (20.0.0.1) Origin IGP, metric 0, localpref 0, valid, external, bestpath-from-AS 201, best (First path received) Community: graceful-shutdown Last update: Wed Jun 26 20:20:29 2024 Signed-off-by: Vijayalaxmi Basavaraj --- bgpd/bgp_route.c | 3 ++- bgpd/bgp_updgrp.c | 5 +++++ bgpd/bgp_updgrp_adv.c | 3 ++- bgpd/bgp_vty.c | 6 ++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 599723ee2a1c..d91ff1db5df0 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2617,7 +2617,8 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, if (aspath_check_as_zero(attr->aspath)) return false; - if (bgp_in_graceful_shutdown(bgp)) { + if ((bgp_in_graceful_shutdown(bgp)) || + (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_SHUTDOWN))) { if (peer->sort == BGP_PEER_IBGP || peer->sort == BGP_PEER_CONFED || peer->sub_sort == BGP_PEER_EBGP_OAD) { diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index 063c99ccebde..ea32fa66e47c 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -334,6 +334,7 @@ static unsigned int updgrp_hash_key_make(const void *p) */ #define SEED1 999331 #define SEED2 2147483647 +#define SEED3 4258594758 updgrp = p; peer = updgrp->conf; @@ -429,6 +430,10 @@ static unsigned int updgrp_hash_key_make(const void *p) || CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT)) key = jhash_1word(jhash(peer->host, strlen(peer->host), SEED2), key); + + if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_SHUTDOWN)) + key = jhash_1word(jhash(peer->host, strlen(peer->host), SEED3), key); + /* * Multiple sessions with the same neighbor should get their own * update-group if they have different roles. diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c index 573ba52cd50c..7b12923b7b12 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c @@ -1023,7 +1023,8 @@ void subgroup_default_originate(struct update_subgroup *subgrp, bool withdraw) } /* Advertise the default route */ - if (bgp_in_graceful_shutdown(bgp)) + if (bgp_in_graceful_shutdown(bgp) || + (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_SHUTDOWN))) bgp_attr_add_gshut_community(new_attr); SET_FLAG(subgrp->sflags, diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 5983e9a4b057..646e3202244e 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -3732,6 +3732,7 @@ DEFPY (neighbor_graceful_shutdown, safi_t safi; struct peer *peer; int ret; + struct peer_af *paf; VTY_DECLVAR_CONTEXT(bgp, bgp); @@ -3752,6 +3753,11 @@ DEFPY (neighbor_graceful_shutdown, bgp_clear(vty, bgp, afi, safi, clear_peer, BGP_CLEAR_SOFT_IN, neighbor); + paf = peer_af_find(peer, afi, safi); + if (paf) { + update_group_adjust_peer(paf); + bgp_announce_route(peer, afi, safi, false); + } } return ret;