From c91c5e8463a06c6557e340da1188fd8f320a30b1 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Mon, 10 Feb 2025 23:39:55 +0200 Subject: [PATCH] bgpd: Make sure Link-Local Next Hop capability has its own update-group We should involve checking received (not only advertised) capability, because otherwise we put both peers (one with LL capability, another without) into a single update-group and send 16-bytes NH instead of 16-bytes and 32-bytes separately. Fixes: db853cc97eafee8742cd391aaa2b5bc58a6751ae ("bgpd: Implement Link-Local Next Hop capability") Signed-off-by: Donatas Abraitis --- bgpd/bgp_updgrp.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index c6b1ff1d2f..04e6a83552 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -444,6 +444,14 @@ static unsigned int updgrp_hash_key_make(const void *p) */ key = jhash_1word(peer->local_role, key); + /* If the peer has disabled Link-Local Next Hop capability, but we + * send it, it's not taken into consideration and we always merge both + * peers into a single update-group. Make sure peer has its own update-group + * if it has disabled (received) Link-Local Next Hop capability. + */ + key = jhash_2words(!!CHECK_FLAG(peer->cap, PEER_CAP_LINK_LOCAL_RCV), + !!CHECK_FLAG(peer->cap, PEER_CAP_LINK_LOCAL_ADV), key); + /* Neighbors configured with the AIGP attribute are put in a separate * update group from other neighbors. */ @@ -480,6 +488,9 @@ static unsigned int updgrp_hash_key_make(const void *p) zlog_debug("%pBP Update Group Hash: addpath paths-limit: (send %u, receive %u)", peer, peer->addpath_paths_limit[afi][safi].send, peer->addpath_paths_limit[afi][safi].receive); + zlog_debug("%pBP Update Group Hash: Link-Local Next Hop capability:%s%s", peer, + CHECK_FLAG(peer->cap, PEER_CAP_LINK_LOCAL_RCV) ? " received" : "", + CHECK_FLAG(peer->cap, PEER_CAP_LINK_LOCAL_ADV) ? " advertised" : ""); zlog_debug( "%pBP Update Group Hash: max packet size: %u pmax_out: %u Peer Group: %s rmap out: %s", peer, peer->max_packet_size, peer->pmax_out[afi][safi],