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 <donatas@opensourcerouting.org>
This commit is contained in:
Donatas Abraitis 2024-05-31 15:03:55 +03:00
parent 8e7bc85b71
commit 637ab53f75

View File

@ -560,40 +560,37 @@ void bgp_generate_updgrp_packets(struct event *thread)
} }
} }
if (CHECK_FLAG(peer->cap, /* rfc4724 says:
PEER_CAP_RESTART_RCV)) { * Although the End-of-RIB marker is
if (!(PAF_SUBGRP(paf))->t_coalesce * specified for the purpose of BGP
&& peer->afc_nego[afi][safi] * graceful restart, it is noted that
&& peer->synctime * the generation of such a marker upon
&& !CHECK_FLAG( * completion of the initial update would
peer->af_sflags[afi][safi], * be useful for routing convergence in
PEER_STATUS_EOR_SEND)) { * general, and thus the practice is
/* If EOR is disabled, * recommended.
* the message is not sent */
*/ if (!(PAF_SUBGRP(paf))->t_coalesce &&
if (BGP_SEND_EOR(peer->bgp, afi, peer->afc_nego[afi][safi] &&
safi)) { peer->synctime &&
SET_FLAG( !CHECK_FLAG(peer->af_sflags[afi][safi],
peer->af_sflags PEER_STATUS_EOR_SEND)) {
[afi] /* If EOR is disabled, the message is
[safi], * not sent.
PEER_STATUS_EOR_SEND); */
if (!BGP_SEND_EOR(peer->bgp, afi, safi))
continue;
/* Update EOR SET_FLAG(peer->af_sflags[afi][safi],
* send time PEER_STATUS_EOR_SEND);
*/
peer->eor_stime[afi]
[safi] =
monotime(NULL);
BGP_UPDATE_EOR_PKT( /* Update EOR send time */
peer, afi, safi, peer->eor_stime[afi][safi] =
s); monotime(NULL);
bgp_process_pending_refresh(
peer, afi, BGP_UPDATE_EOR_PKT(peer, afi, safi, s);
safi); bgp_process_pending_refresh(peer, afi,
} safi);
}
} }
continue; continue;
} }