diff options
author | Mark Stapp <mjs@voltanet.io> | 2021-09-03 17:52:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-03 17:52:57 +0200 |
commit | 4250098311f4e6ca9da45ceed9e270c1cba6fba7 (patch) | |
tree | 5ad5b37bcc0def56678a6e19b2b9d21e973b20b6 /bgpd | |
parent | Merge pull request #9542 from pguibert6WIND/ssh_rpki_source (diff) | |
parent | doc: Add `neighbor PEER disable-addpath-rx` command (diff) | |
download | frr-4250098311f4e6ca9da45ceed9e270c1cba6fba7.tar.xz frr-4250098311f4e6ca9da45ceed9e270c1cba6fba7.zip |
Merge pull request #9545 from ton31337/feature/disable-addpath-rx
bgpd: Add disable-addpath-rx knob
Diffstat (limited to 'bgpd')
-rw-r--r-- | bgpd/bgp_open.c | 21 | ||||
-rw-r--r-- | bgpd/bgp_vty.c | 63 | ||||
-rw-r--r-- | bgpd/bgpd.c | 1 | ||||
-rw-r--r-- | bgpd/bgpd.h | 1 |
4 files changed, 81 insertions, 5 deletions
diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c index 113017559..f1dfebdc1 100644 --- a/bgpd/bgp_open.c +++ b/bgpd/bgp_open.c @@ -1534,6 +1534,11 @@ void bgp_open_capability(struct stream *s, struct peer *peer) FOREACH_AFI_SAFI (afi, safi) { if (peer->afc[afi][safi]) { + bool adv_addpath_rx = + !CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_DISABLE_ADDPATH_RX); + uint8_t flags = 0; + /* Convert AFI, SAFI to values for packet. */ bgp_map_afi_safi_int2iana(afi, safi, &pkt_afi, &pkt_safi); @@ -1541,19 +1546,25 @@ void bgp_open_capability(struct stream *s, struct peer *peer) stream_putw(s, pkt_afi); stream_putc(s, pkt_safi); - if (adv_addpath_tx) { - stream_putc(s, BGP_ADDPATH_RX | BGP_ADDPATH_TX); + if (adv_addpath_rx) { + SET_FLAG(flags, BGP_ADDPATH_RX); SET_FLAG(peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_RX_ADV); + } else { + UNSET_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ADDPATH_AF_RX_ADV); + } + + if (adv_addpath_tx) { + SET_FLAG(flags, BGP_ADDPATH_TX); SET_FLAG(peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV); } else { - stream_putc(s, BGP_ADDPATH_RX); - SET_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ADDPATH_AF_RX_ADV); UNSET_FLAG(peer->af_cap[afi][safi], PEER_CAP_ADDPATH_AF_TX_ADV); } + + stream_putc(s, flags); } } diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 92b74dd7c..1d67f5560 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -7968,6 +7968,48 @@ DEFUN (no_neighbor_ttl_security, return bgp_vty_return(vty, peer_ttl_security_hops_unset(peer)); } +/* disable-addpath-rx */ +DEFUN(neighbor_disable_addpath_rx, + neighbor_disable_addpath_rx_cmd, + "neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx", + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Do not accept additional paths\n") +{ + char *peer_str = argv[1]->arg; + struct peer *peer; + afi_t afi = bgp_node_afi(vty); + safi_t safi = bgp_node_safi(vty); + + peer = peer_and_group_lookup_vty(vty, peer_str); + if (!peer) + return CMD_WARNING_CONFIG_FAILED; + + return peer_af_flag_set_vty(vty, peer_str, afi, safi, + PEER_FLAG_DISABLE_ADDPATH_RX); +} + +DEFUN(no_neighbor_disable_addpath_rx, + no_neighbor_disable_addpath_rx_cmd, + "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx", + NO_STR + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Do not accept additional paths\n") +{ + char *peer_str = argv[2]->arg; + struct peer *peer; + afi_t afi = bgp_node_afi(vty); + safi_t safi = bgp_node_safi(vty); + + peer = peer_and_group_lookup_vty(vty, peer_str); + if (!peer) + return CMD_WARNING_CONFIG_FAILED; + + return peer_af_flag_unset_vty(vty, peer_str, afi, safi, + PEER_FLAG_DISABLE_ADDPATH_RX); +} + DEFUN (neighbor_addpath_tx_all_paths, neighbor_addpath_tx_all_paths_cmd, "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths", @@ -16606,6 +16648,9 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp, } } + if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_DISABLE_ADDPATH_RX)) + vty_out(vty, " neighbor %s disable-addpath-rx\n", addr); + /* ORF capability. */ if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_ORF_PREFIX_SM) || peergroup_af_flag_check(peer, afi, safi, @@ -18228,6 +18273,24 @@ void bgp_vty_init(void) install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_route_server_client_cmd); + /* "neighbor disable-addpath-rx" commands. */ + install_element(BGP_IPV4_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV4_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV4M_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV4M_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV4L_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV4L_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV6_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV6_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV6M_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV6M_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV6L_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_IPV6L_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_VPNV4_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_VPNV4_NODE, &no_neighbor_disable_addpath_rx_cmd); + install_element(BGP_VPNV6_NODE, &neighbor_disable_addpath_rx_cmd); + install_element(BGP_VPNV6_NODE, &no_neighbor_disable_addpath_rx_cmd); + /* "neighbor addpath-tx-all-paths" commands.*/ install_element(BGP_NODE, &neighbor_addpath_tx_all_paths_hidden_cmd); install_element(BGP_NODE, &no_neighbor_addpath_tx_all_paths_hidden_cmd); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 7236b9fe4..ec91e7e22 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -4208,6 +4208,7 @@ static const struct peer_flag_action peer_af_flag_action_list[] = { {PEER_FLAG_AS_OVERRIDE, 1, peer_change_reset_out}, {PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE, 1, peer_change_reset_out}, {PEER_FLAG_WEIGHT, 0, peer_change_reset_in}, + {PEER_FLAG_DISABLE_ADDPATH_RX, 0, peer_change_reset}, {0, 0, 0}}; /* Proper action set. */ diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index eb1a18edc..ee8e51101 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1356,6 +1356,7 @@ struct peer { #define PEER_FLAG_SEND_LARGE_COMMUNITY (1U << 26) /* Send large Communities */ #define PEER_FLAG_MAX_PREFIX_OUT (1U << 27) /* outgoing maximum prefix */ #define PEER_FLAG_MAX_PREFIX_FORCE (1U << 28) /* maximum-prefix <num> force */ +#define PEER_FLAG_DISABLE_ADDPATH_RX (1U << 29) /* disable-addpath-rx */ enum bgp_addpath_strat addpath_type[AFI_MAX][SAFI_MAX]; |