From 637ab53f75a9288888dfb48b8b939833fa3501ed Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Fri, 31 May 2024 15:03:55 +0300 Subject: [PATCH] bgpd: Send End-of-RIB not only if Graceful Restart capability is received Before we checked for received Graceful Restart capability, but that was also incorrect, because we SHOULD HAVE checked it per AFI/SAFI instead. https://datatracker.ietf.org/doc/html/rfc4724 says: Although the End-of-RIB marker is specified for the purpose of BGP graceful restart, it is noted that the generation of such a marker upon completion of the initial update would be useful for routing convergence in general, and thus the practice is recommended. Thus, it might be reasonable to send EoR regardless of whether the Graceful Restart capability is received or not from the peer. Signed-off-by: Donatas Abraitis --- bgpd/bgp_packet.c | 61 ++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 86f85dd866..3f38790cbd 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -560,40 +560,37 @@ void bgp_generate_updgrp_packets(struct event *thread) } } - if (CHECK_FLAG(peer->cap, - PEER_CAP_RESTART_RCV)) { - if (!(PAF_SUBGRP(paf))->t_coalesce - && peer->afc_nego[afi][safi] - && peer->synctime - && !CHECK_FLAG( - peer->af_sflags[afi][safi], - PEER_STATUS_EOR_SEND)) { - /* If EOR is disabled, - * the message is not sent - */ - if (BGP_SEND_EOR(peer->bgp, afi, - safi)) { - SET_FLAG( - peer->af_sflags - [afi] - [safi], - PEER_STATUS_EOR_SEND); + /* rfc4724 says: + * Although the End-of-RIB marker is + * specified for the purpose of BGP + * graceful restart, it is noted that + * the generation of such a marker upon + * completion of the initial update would + * be useful for routing convergence in + * general, and thus the practice is + * recommended. + */ + if (!(PAF_SUBGRP(paf))->t_coalesce && + peer->afc_nego[afi][safi] && + peer->synctime && + !CHECK_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND)) { + /* If EOR is disabled, the message is + * not sent. + */ + if (!BGP_SEND_EOR(peer->bgp, afi, safi)) + continue; - /* Update EOR - * send time - */ - peer->eor_stime[afi] - [safi] = - monotime(NULL); + SET_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND); - BGP_UPDATE_EOR_PKT( - peer, afi, safi, - s); - bgp_process_pending_refresh( - peer, afi, - safi); - } - } + /* Update EOR send time */ + peer->eor_stime[afi][safi] = + monotime(NULL); + + BGP_UPDATE_EOR_PKT(peer, afi, safi, s); + bgp_process_pending_refresh(peer, afi, + safi); } continue; }