]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Do not allow a `no router bgp XXX` when autoimport is happening 13247/head
authorDonald Sharp <sharpd@nvidia.com>
Mon, 10 Apr 2023 18:04:27 +0000 (14:04 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Mon, 10 Apr 2023 18:14:01 +0000 (14:14 -0400)
When we have these sequence of events causing a crash in
evpn_type5_test_topo1:

(A) no router bgp vrf RED 100
   this schedules for deletion the vrf RED instance
(B) a l3vni change event from zebra
   this creates a bgp instance for VRF RED in some cases
   additionally it auto imports evpn routes into VRF RED
   Please note this is desired behavior to allow for the
   auto importation of evpn vrf routes
(C) no router bgp 100
   The code was allowing the deletion of the default
   instance and causing tests to crash.

Effectively the test in bgp_vty to allow/dissallow
the removal of the default instance was not correct
for the case when (B) happens.

Let's just not allow the command to succeed in this case as that
the test was wrong.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
bgpd/bgp_vty.c

index a436490ba1deddcf596a2484e337394fbd282fcd..f7b0caf493b148048f91d5ab4d6e243f83aaade5 100644 (file)
@@ -1675,28 +1675,46 @@ DEFUN (no_router_bgp,
                        for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) {
                                if (tmp_bgp->inst_type != BGP_INSTANCE_TYPE_VRF)
                                        continue;
-                               if (CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST],
-                                              BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) ||
-                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST],
-                                              BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) ||
-                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST],
-                                              BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) ||
-                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST],
-                                              BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) ||
-                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP][SAFI_UNICAST],
+                               if (CHECK_FLAG(
+                                           tmp_bgp->af_flags[AFI_IP]
+                                                            [SAFI_UNICAST],
+                                           BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) ||
+                                   CHECK_FLAG(
+                                           tmp_bgp->af_flags[AFI_IP6]
+                                                            [SAFI_UNICAST],
+                                           BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT) ||
+                                   CHECK_FLAG(
+                                           tmp_bgp->af_flags[AFI_IP]
+                                                            [SAFI_UNICAST],
+                                           BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) ||
+                                   CHECK_FLAG(
+                                           tmp_bgp->af_flags[AFI_IP6]
+                                                            [SAFI_UNICAST],
+                                           BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT) ||
+                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP]
+                                                               [SAFI_UNICAST],
                                               BGP_CONFIG_VRF_TO_VRF_EXPORT) ||
-                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6][SAFI_UNICAST],
+                                   CHECK_FLAG(tmp_bgp->af_flags[AFI_IP6]
+                                                               [SAFI_UNICAST],
                                               BGP_CONFIG_VRF_TO_VRF_EXPORT) ||
                                    (bgp == bgp_get_evpn() &&
-                                   (CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                               BGP_L2VPN_EVPN_ADV_IPV4_UNICAST) ||
-                                    CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                               BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP) ||
-                                    CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                               BGP_L2VPN_EVPN_ADV_IPV6_UNICAST) ||
-                                    CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                               BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) ||
-                                   (hashcount(tmp_bgp->vnihash))) {
+                                    (CHECK_FLAG(
+                                             tmp_bgp->af_flags[AFI_L2VPN]
+                                                              [SAFI_EVPN],
+                                             BGP_L2VPN_EVPN_ADV_IPV4_UNICAST) ||
+                                     CHECK_FLAG(
+                                             tmp_bgp->af_flags[AFI_L2VPN]
+                                                              [SAFI_EVPN],
+                                             BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP) ||
+                                     CHECK_FLAG(
+                                             tmp_bgp->af_flags[AFI_L2VPN]
+                                                              [SAFI_EVPN],
+                                             BGP_L2VPN_EVPN_ADV_IPV6_UNICAST) ||
+                                     CHECK_FLAG(
+                                             tmp_bgp->af_flags[AFI_L2VPN]
+                                                              [SAFI_EVPN],
+                                             BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) ||
+                                   (tmp_bgp->l3vni)) {
                                        vty_out(vty,
                                                "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
                                        return CMD_WARNING_CONFIG_FAILED;