Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions bgpd/bgp_nht.c
Original file line number Diff line number Diff line change
Expand Up @@ -552,11 +552,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,
Expand Down Expand Up @@ -1293,6 +1294,9 @@ 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->su, &p)) {
zlog_warn("%s: Unable to convert sockunion to prefix for %s",
__func__, peer->host);
Expand Down
35 changes: 35 additions & 0 deletions bgpd/bgp_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -4528,6 +4528,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,
Expand Down Expand Up @@ -17508,6 +17529,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 configuration. */
for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {

Expand Down Expand Up @@ -17846,6 +17870,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");

Expand Down Expand Up @@ -18276,6 +18305,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);
Expand Down
3 changes: 3 additions & 0 deletions bgpd/bgp_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -2145,6 +2145,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;
Expand Down
3 changes: 3 additions & 0 deletions bgpd/bgpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1240,6 +1240,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;
}

Expand Down
5 changes: 4 additions & 1 deletion bgpd/bgpd.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,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 */

Expand Down Expand Up @@ -495,7 +496,9 @@ struct bgp {
/* Indicate Graceful Restart support for BGP NOTIFICATION messages */
#define BGP_FLAG_GRACEFUL_NOTIFICATION (1 << 30)
/* Send Hard Reset CEASE Notification for 'Administrative Reset' */
#define BGP_FLAG_HARD_ADMIN_RESET (1 << 31)
#define BGP_FLAG_HARD_ADMIN_RESET (1ULL << 31)
/* 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.
Expand Down
7 changes: 7 additions & 0 deletions doc/user/bgp.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,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
Expand Down
3 changes: 2 additions & 1 deletion doc/user/ipv6.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down