]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: add `bgp ipv6-auto-ra` command 17265/head
authorMikhail Sokolovskiy <sokolmish@gmail.com>
Tue, 24 Sep 2024 16:00:11 +0000 (19:00 +0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Mon, 28 Oct 2024 12:30:10 +0000 (12:30 +0000)
Introduce a command to stop bgpd from enabling IPv6 router advertisement
messages sending on interfaces.

Signed-off-by: Mikhail Sokolovskiy <sokolmish@gmail.com>
(cherry picked from commit 7b1c0c23fcdebda088d4dae334bbbadaf16cea55)

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 59566ee6d67ebbda5ac66e76bad3d1673a09808a..9b633b7139b2f5b5ce3a868ca05e5f6a3fb2bf10 100644 (file)
@@ -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);
index e7be2a33d2b60baaa7c20eb167650b9e87294756..f47189d5a4e83fcab55004a6863a89b98fa3145d 100644 (file)
@@ -5045,6 +5045,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,
@@ -19448,6 +19469,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);
@@ -19869,6 +19893,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");
 
@@ -20409,6 +20438,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 bffa5a0e6bf41d4c368c7f3074b3aa24e4732afb..9053df3192e1d9d77f37abff3e79bf5c7749a821 100644 (file)
@@ -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;
index 80b1ae39d4d1a3fdf96877477bbea735a3e4a1cf..d3be38db697a38792866df8900a8e01e704415eb 100644 (file)
@@ -1411,6 +1411,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;
 
index 3c3655f0a5adca250d6390999e7ce3a7d30ee1e4..8aeb0eb43a5f4e81cf338c00030e756506cd03f3 100644 (file)
@@ -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.
index 0f64f4bc1c9626f204c64e7afc1d3e4daf69fa1f..adf5261fe0a2f59f5a031d43c14886647de6d904 100644 (file)
@@ -1282,6 +1282,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]