]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: add `bgp ipv6-auto-ra` command
authorMikhail Sokolovskiy <sokolmish@gmail.com>
Tue, 24 Sep 2024 16:00:11 +0000 (19:00 +0300)
committerDavid Lamparter <equinox@opensourcerouting.org>
Tue, 29 Oct 2024 11:15:04 +0000 (12:15 +0100)
Introduce a command to stop bgpd from enabling IPv6 router advertisement
messages sending on interfaces.

Signed-off-by: Mikhail Sokolovskiy <sokolmish@gmail.com>
bgpd/bgp_nht.c
bgpd/bgp_vty.c
bgpd/bgp_zebra.c
bgpd/bgpd.c
bgpd/bgpd.h
doc/user/bgp.rst
doc/user/ipv6.rst

index b0157e8feacc1281e9c25eb5f8f7f6f0ee158c9f..30cf02e099ebe28e9067798d38b040ef0fc6d6ca 100644 (file)
@@ -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,
@@ -1494,6 +1495,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);
index 31d1704113edd3b29e3e802648be8fa32f730b80..71ec289114140e38b470a50098ce8ed34ae2ce1e 100644 (file)
@@ -4819,6 +4819,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,
@@ -18461,6 +18482,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);
@@ -18843,6 +18867,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");
 
@@ -19383,6 +19412,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);
index bc51d14b392b560720fbe20690539e639ae4e8d5..478289ae88974ce4b61a7bf259d10a8afd9556a4 100644 (file)
@@ -2146,6 +2146,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;
index b8389457f87caa525b78d5a20d0177989f362058..4de5964c39884730274906f276ca2869da8b4739 100644 (file)
@@ -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;
 }
 
index dda108bcf60dd735a9b368d39eb77dfc703e8d5b..b139b2c1b42c7dbfaa1a6dfaaf9019418bdc2fe9 100644 (file)
@@ -155,6 +155,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 */
 
@@ -514,6 +515,8 @@ struct bgp {
 /* For BGP-LU, force IPv6 local prefixes to use ipv6-explicit-null label */
 #define BGP_FLAG_LU_IPV6_EXPLICIT_NULL (1ULL << 34)
 #define BGP_FLAG_SOFT_VERSION_CAPABILITY (1ULL << 35)
+/* 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.
index 46653595f42e9a6e5d7ae4725e71eb80676251d9..e7dad99a85b253a6979569564b2ea8d63c1a3673 100644 (file)
@@ -1186,6 +1186,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
index 4f01061e7b03c5315e0fed174680b4af48212217..18aae00bdb3f779ecb65b784f93357bc884ffe0d 100644 (file)
@@ -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]