summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2024-10-28 13:28:29 +0100
committerGitHub <noreply@github.com>2024-10-28 13:28:29 +0100
commite4df48083185f959e5acf1cc7f69c6289d769c35 (patch)
tree8064b83f990568252e81466e513042bc97f57f3d
parentMerge pull request #17250 from pguibert6WIND/flexalgo_uint8 (diff)
parentbgpd: add `bgp ipv6-auto-ra` command (diff)
downloadfrr-e4df48083185f959e5acf1cc7f69c6289d769c35.tar.xz
frr-e4df48083185f959e5acf1cc7f69c6289d769c35.zip
Merge pull request #16354 from Sokolmish/zebra-no-ra
-rw-r--r--bgpd/bgp_nht.c15
-rw-r--r--bgpd/bgp_vty.c35
-rw-r--r--bgpd/bgp_zebra.c3
-rw-r--r--bgpd/bgpd.c2
-rw-r--r--bgpd/bgpd.h3
-rw-r--r--doc/user/bgp.rst7
-rw-r--r--doc/user/ipv6.rst3
7 files changed, 62 insertions, 6 deletions
diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c
index 59566ee6d..9b633b713 100644
--- a/bgpd/bgp_nht.c
+++ b/bgpd/bgp_nht.c
@@ -652,11 +652,12 @@ static void bgp_process_nexthop_update(struct bgp_nexthop_cache *bnc,
* we receive from bgp. This is to allow us
* to work with v4 routing over v6 nexthops
*/
- if (peer && !peer->ifp
- && CHECK_FLAG(peer->flags,
- PEER_FLAG_CAPABILITY_ENHE)
- && nhr->prefix.family == AF_INET6
- && nexthop->type != NEXTHOP_TYPE_BLACKHOLE) {
+ if (peer && !peer->ifp &&
+ CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE) &&
+ !CHECK_FLAG(bnc->bgp->flags,
+ BGP_FLAG_IPV6_NO_AUTO_RA) &&
+ nhr->prefix.family == AF_INET6 &&
+ nexthop->type != NEXTHOP_TYPE_BLACKHOLE) {
struct interface *ifp;
ifp = if_lookup_by_index(nexthop->ifindex,
@@ -1529,6 +1530,10 @@ void bgp_nht_reg_enhe_cap_intfs(struct peer *peer)
return;
bgp = peer->bgp;
+
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA))
+ return;
+
if (!sockunion2hostprefix(&peer->connection->su, &p)) {
zlog_warn("%s: Unable to convert sockunion to prefix for %s",
__func__, peer->host);
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 62b79541b..ecb45ff69 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -5034,6 +5034,27 @@ DEFUN(no_bgp_fast_convergence, no_bgp_fast_convergence_cmd,
return CMD_SUCCESS;
}
+DEFPY (bgp_ipv6_auto_ra,
+ bgp_ipv6_auto_ra_cmd,
+ "[no] bgp ipv6-auto-ra",
+ NO_STR
+ BGP_STR
+ "Allow enabling IPv6 ND RA sending\n")
+{
+ if (vty->node == CONFIG_NODE) {
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ COND_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA, no);
+ for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp))
+ COND_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA, no);
+ } else {
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
+ COND_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA, no);
+ }
+ return CMD_SUCCESS;
+}
+
static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
int v6only,
const char *peer_group_name,
@@ -19418,6 +19439,9 @@ int bgp_config_write(struct vty *vty)
if (CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA))
vty_out(vty, "bgp send-extra-data zebra\n");
+ if (CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA))
+ vty_out(vty, "no bgp ipv6-auto-ra\n");
+
/* DSCP value for outgoing packets in BGP connections */
if (bm->ip_tos != IPTOS_PREC_INTERNETCONTROL)
vty_out(vty, "bgp session-dscp %u\n", bm->ip_tos >> 2);
@@ -19839,6 +19863,11 @@ int bgp_config_write(struct vty *vty)
if (CHECK_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN))
vty_out(vty, " bgp shutdown\n");
+ /* Automatic RA enabling by BGP */
+ if (!CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA))
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA))
+ vty_out(vty, " no bgp ipv6-auto-ra\n");
+
if (bgp->allow_martian)
vty_out(vty, " bgp allow-martian-nexthop\n");
@@ -20379,6 +20408,12 @@ void bgp_vty_init(void)
install_element(BGP_NODE, &bgp_fast_convergence_cmd);
install_element(BGP_NODE, &no_bgp_fast_convergence_cmd);
+ /* global bgp ipv6-auto-ra command */
+ install_element(CONFIG_NODE, &bgp_ipv6_auto_ra_cmd);
+
+ /* bgp ipv6-auto-ra command */
+ install_element(BGP_NODE, &bgp_ipv6_auto_ra_cmd);
+
/* global bgp update-delay command */
install_element(CONFIG_NODE, &bgp_global_update_delay_cmd);
install_element(CONFIG_NODE, &no_bgp_global_update_delay_cmd);
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index bffa5a0e6..9053df319 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -2327,6 +2327,9 @@ void bgp_zebra_initiate_radv(struct bgp *bgp, struct peer *peer)
{
uint32_t ra_interval = BGP_UNNUM_DEFAULT_RA_INTERVAL;
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA))
+ return;
+
/* Don't try to initiate if we're not connected to Zebra */
if (zclient->sock < 0)
return;
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index a186243ff..d87c6d775 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1412,6 +1412,8 @@ int bgp_global_gr_init(struct bgp *bgp)
bgp->rib_stale_time = bm->rib_stale_time;
if (CHECK_FLAG(bm->flags, BM_FLAG_GR_PRESERVE_FWD))
SET_FLAG(bgp->flags, BGP_FLAG_GR_PRESERVE_FWD);
+ if (CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA))
+ SET_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA);
bgp->present_zebra_gr_state = ZEBRA_GR_DISABLE;
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 5ffed544a..eef5bab33 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -172,6 +172,7 @@ struct bgp_master {
#define BM_FLAG_GR_PRESERVE_FWD (1 << 5)
#define BM_FLAG_GRACEFUL_RESTART (1 << 6)
#define BM_FLAG_GR_COMPLETE (1 << 7)
+#define BM_FLAG_IPV6_NO_AUTO_RA (1 << 8)
#define BM_FLAG_GR_CONFIGURED (BM_FLAG_GR_RESTARTER | BM_FLAG_GR_DISABLED)
@@ -551,6 +552,8 @@ struct bgp {
#define BGP_FLAG_DYNAMIC_CAPABILITY (1ULL << 37)
#define BGP_FLAG_VNI_DOWN (1ULL << 38)
#define BGP_FLAG_INSTANCE_HIDDEN (1ULL << 39)
+/* Prohibit BGP from enabling IPv6 RA on interfaces */
+#define BGP_FLAG_IPV6_NO_AUTO_RA (1ULL << 40)
/* BGP default address-families.
* New peers inherit enabled afi/safis from bgp instance.
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
index f2005c18d..20a9ef84f 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -1290,6 +1290,13 @@ IPv6 Support
address family is enabled by default for all new neighbors.
+.. clicmd:: bgp ipv6-auto-ra
+
+ By default, bgpd can ask Zebra to enable sending IPv6 router advertisement
+ messages on interfaces. For example, this happens for unnumbered peers
+ support or when extended-nexthop capability is used. The ``no`` form of this
+ command disables such behaviour.
+
.. _bgp-route-aggregation:
Route Aggregation
diff --git a/doc/user/ipv6.rst b/doc/user/ipv6.rst
index 4f01061e7..18aae00bd 100644
--- a/doc/user/ipv6.rst
+++ b/doc/user/ipv6.rst
@@ -25,7 +25,8 @@ Router Advertisement
.. clicmd:: ipv6 nd suppress-ra
Don't send router advertisement messages. The ``no`` form of this command
- enables sending RA messages.
+ enables sending RA messages. Note that while being suppressed, RA messages
+ might still be enabled by other daemons, such as bgpd or vrrpd.
.. clicmd:: ipv6 nd prefix ipv6prefix [valid-lifetime] [preferred-lifetime] [off-link] [no-autoconfig] [router-address]