]> 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:19:48 +0000 (12:19 +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 7274bcdb21db07c183730e0df397188d7c3f9c7d..2afb43d64ed2b7b83fd7fbfa8ee356f99d8bfe23 100644 (file)
@@ -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,
@@ -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);
index 4bcb17714a9779ad8be0805d1ec8973b08166b4d..19828018bee9c9f18f43770d3e453866b2c37e84 100644 (file)
@@ -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,
@@ -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)) {
 
@@ -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");
 
@@ -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);
index 57a859c61da9a803026448e894a772655d6adc1c..829dc981a71dcdfb65bb7d9e6dcee359022baf73 100644 (file)
@@ -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;
index 3dbd373f1225a2337e4bbfbc7ac6917b3e7ce821..7835f5d45f637600a26ff950ef871d405f933bee 100644 (file)
@@ -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;
 }
 
index f6162f33e460e7e58a24a3bc1db4e7ba6f477329..b413304571cb6edd807b917b4fc9f5f3a803c663 100644 (file)
@@ -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 */
 
@@ -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.
index bd5767beba6c2b5f21f219d2bad3977a10a49890..86c6a75fc1c815a66d6fcead46aa22fc50b4a80f 100644 (file)
@@ -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
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]