diff options
| author | Russ White <russ@riw.us> | 2024-10-29 10:28:11 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-29 10:28:11 -0400 | 
| commit | 7dddef2a49749d38dd712564ab15cfa05d6fcc6a (patch) | |
| tree | 51f8d54f5714e646c1cd55fece437113a74c3a7a | |
| parent | 5a19a51f098a0ff563b3d5edd3dc9aef47eb01ba (diff) | |
| parent | 44bf223d8bc5445a40e66962e6048fef2a609987 (diff) | |
Merge pull request #17288 from opensourcerouting/16354-bp-10.0
(10.0 backport) bgpd: add `bgp ipv6-auto-ra` command
| -rw-r--r-- | bgpd/bgp_nht.c | 15 | ||||
| -rw-r--r-- | bgpd/bgp_vty.c | 35 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.c | 3 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 3 | ||||
| -rw-r--r-- | bgpd/bgpd.h | 3 | ||||
| -rw-r--r-- | doc/user/bgp.rst | 7 | ||||
| -rw-r--r-- | doc/user/ipv6.rst | 3 | 
7 files changed, 63 insertions, 6 deletions
diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index e2c103bb52..572c8ed329 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -635,11 +635,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, @@ -1502,6 +1503,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 604df480a5..eb4a8100a6 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -4859,6 +4859,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, @@ -18768,6 +18789,9 @@ int bgp_config_write(struct vty *vty)  	if (bm->tcp_dscp != IPTOS_PREC_INTERNETCONTROL)  		vty_out(vty, "bgp session-dscp %u\n", bm->tcp_dscp >> 2); +	if (CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA)) +		vty_out(vty, "no bgp ipv6-auto-ra\n"); +  	/* BGP InQ limit */  	if (bm->inq_limit != BM_DEFAULT_Q_LIMIT)  		vty_out(vty, "bgp input-queue-limit %u\n", bm->inq_limit); @@ -19159,6 +19183,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"); @@ -19699,6 +19728,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 6fa98c68ee..ebd20c5bfe 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -2135,6 +2135,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 470b33ca3b..557a64cf53 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1394,6 +1394,9 @@ int bgp_global_gr_init(struct bgp *bgp)  	bgp->global_gr_present_state = GLOBAL_HELPER;  	bgp->present_zebra_gr_state = ZEBRA_GR_DISABLE; +	if (CHECK_FLAG(bm->flags, BM_FLAG_IPV6_NO_AUTO_RA)) +		SET_FLAG(bgp->flags, BGP_FLAG_IPV6_NO_AUTO_RA); +  	return BGP_GR_SUCCESS;  } diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 0f69095323..f32684507b 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -160,6 +160,7 @@ struct bgp_master {  	uint32_t flags;  #define BM_FLAG_GRACEFUL_SHUTDOWN        (1 << 0)  #define BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA (1 << 1) +#define BM_FLAG_IPV6_NO_AUTO_RA		 (1 << 8)  	bool terminating;	/* global flag that sigint terminate seen */ @@ -522,6 +523,8 @@ struct bgp {  #define BGP_FLAG_LU_IPV6_EXPLICIT_NULL (1ULL << 34)  #define BGP_FLAG_SOFT_VERSION_CAPABILITY (1ULL << 35)  #define BGP_FLAG_ENFORCE_FIRST_AS (1ULL << 36) +/* 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 102ce845c8..3cf204e2b4 100644 --- a/doc/user/bgp.rst +++ b/doc/user/bgp.rst @@ -1204,6 +1204,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 4f01061e7b..18aae00bdb 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]  | 
