]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Make sure Link-Local Next Hop capability has its own update-group
authorDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 10 Feb 2025 21:39:55 +0000 (23:39 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 10 Feb 2025 21:50:26 +0000 (23:50 +0200)
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 <donatas@opensourcerouting.org>
bgpd/bgp_updgrp.c

index c6b1ff1d2f47dad4113ac5a907d10e8385280b50..04e6a83552e25879a2d2fa0814dbb2373d4084be 100644 (file)
@@ -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],