]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Clear addpath RX flag if it's absent
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 26 Sep 2023 13:35:15 +0000 (16:35 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 3 Oct 2023 14:44:19 +0000 (17:44 +0300)
When we have RX/TX flags, but received only TX, we should clear RX flag, to avoid
receiving additional paths.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_open.c

index 8a202b480ae3c74f1e46453b9ef846c1a60f9e67..19cdcbc1d4e34e2c1287ff298a3007cd6ea0d21d 100644 (file)
@@ -709,15 +709,17 @@ static int bgp_capability_addpath(struct peer *peer,
                uint8_t send_receive = stream_getc(s);
 
                if (bgp_debug_neighbor_events(peer))
-                       zlog_debug(
-                               "%s OPEN has %s capability for afi/safi: %s/%s%s%s",
-                               peer->host,
-                               lookup_msg(capcode_str, hdr->code, NULL),
-                               iana_afi2str(pkt_afi), iana_safi2str(pkt_safi),
-                               (send_receive & BGP_ADDPATH_RX) ? ", receive"
-                                                               : "",
-                               (send_receive & BGP_ADDPATH_TX) ? ", transmit"
-                                                               : "");
+                       zlog_debug("%s OPEN has %s capability for afi/safi: %s/%s%s%s",
+                                  peer->host,
+                                  lookup_msg(capcode_str, hdr->code, NULL),
+                                  iana_afi2str(pkt_afi),
+                                  iana_safi2str(pkt_safi),
+                                  CHECK_FLAG(send_receive, BGP_ADDPATH_RX)
+                                          ? ", receive"
+                                          : "",
+                                  CHECK_FLAG(send_receive, BGP_ADDPATH_TX)
+                                          ? ", transmit"
+                                          : "");
 
                /* Convert AFI, SAFI to internal values, check. */
                if (bgp_map_afi_safi_iana2int(pkt_afi, pkt_safi, &afi, &safi)) {
@@ -736,13 +738,19 @@ static int bgp_capability_addpath(struct peer *peer,
                        continue;
                }
 
-               if (send_receive & BGP_ADDPATH_RX)
+               if (CHECK_FLAG(send_receive, BGP_ADDPATH_RX))
                        SET_FLAG(peer->af_cap[afi][safi],
                                 PEER_CAP_ADDPATH_AF_RX_RCV);
+               else
+                       UNSET_FLAG(peer->af_cap[afi][safi],
+                                  PEER_CAP_ADDPATH_AF_RX_RCV);
 
-               if (send_receive & BGP_ADDPATH_TX)
+               if (CHECK_FLAG(send_receive, BGP_ADDPATH_TX))
                        SET_FLAG(peer->af_cap[afi][safi],
                                 PEER_CAP_ADDPATH_AF_TX_RCV);
+               else
+                       UNSET_FLAG(peer->af_cap[afi][safi],
+                                  PEER_CAP_ADDPATH_AF_TX_RCV);
        }
 
        return 0;