]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: CLI to advertise gateway IP overlay index
authorAmeya Dharkar <adharkar@vmware.com>
Tue, 5 Jan 2021 02:31:11 +0000 (18:31 -0800)
committerAmeya Dharkar <adharkar@vmware.com>
Tue, 8 Jun 2021 00:58:22 +0000 (17:58 -0700)
Adds gateway-ip option to advertise ipv4/ipv6 unicast CLI.

dev(config-router-af)# advertise <ipv4|ipv6> unicast
  <cr>
  gateway-ip      Specify EVPN Overlay Index
  route-map       route-map for filtering specific routes

When gateway-ip is specified, gateway IP field of EVPN RT-5 NLRI is filled with
the BGP nexthop of the vrf prefix being advertised.

No support for ESI overlay index yet.

Test cases:
1) advertise ipv4 unicast
2) advertise ipv4 unicast gateway-ip
3) advertise ipv6 unicast
4) advertise ipv6 unicast gateway-ip
5) Modify from no-overlay-index to gateway-ip
6) Modify from gateway-ip to no-overlay-index
7) CLI with route-map and modify route-map

Author: Sri Mohana Singamsetty <srimohans@gmail.com>
Signed-off-by: Sri Mohana Singamsetty <srimohans@gmail.com>
bgpd/bgp_evpn.h
bgpd/bgp_evpn_vty.c
bgpd/bgp_evpn_vty.h
bgpd/bgp_nb_config.c
bgpd/bgpd.h

index 83a6dd84c82676a224d218f1269763acc3f3375c..90e088c3ebc651fd37441b3a68e06982f61b2286 100644 (file)
@@ -63,14 +63,18 @@ static inline int advertise_type5_routes(struct bgp *bgp_vrf,
        if (!bgp_vrf->l3vni)
                return 0;
 
-       if (afi == AFI_IP &&
-           CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                      BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST))
+       if ((afi == AFI_IP)
+           && ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                           BGP_L2VPN_EVPN_ADV_IPV4_UNICAST))
+               || (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                              BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP))))
                return 1;
 
-       if (afi == AFI_IP6 &&
-           CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                      BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST))
+       if ((afi == AFI_IP6)
+           && ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                           BGP_L2VPN_EVPN_ADV_IPV6_UNICAST))
+               || (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                              BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))))
                return 1;
 
        return 0;
index fb3ba2c0ec85c1089f66dc58c867dc56907b647f..fccaf9166c41aca79cb60ad39fdb6215ec20cdfb 100644 (file)
@@ -59,6 +59,17 @@ struct vni_walk_ctx {
        int detail;
 };
 
+int argv_find_and_parse_oly_idx(struct cmd_token **argv, int argc, int *oly_idx,
+                               enum overlay_index_type *oly)
+{
+       *oly = OVERLAY_INDEX_TYPE_NONE;
+       if (argv_find(argv, argc, "gateway-ip", oly_idx)) {
+               if (oly)
+                       *oly = OVERLAY_INDEX_GATEWAY_IP;
+       }
+       return 1;
+}
+
 static void display_vrf_import_rt(struct vty *vty, struct vrf_irt_node *irt,
                                  json_object *json)
 {
@@ -3784,10 +3795,11 @@ DEFUN_HIDDEN (no_bgp_evpn_advertise_vni_subnet,
 
 DEFUN (bgp_evpn_advertise_type5,
        bgp_evpn_advertise_type5_cmd,
-       "advertise " BGP_AFI_CMD_STR "" BGP_SAFI_CMD_STR " [route-map WORD]",
+       "advertise " BGP_AFI_CMD_STR "" BGP_SAFI_CMD_STR " [gateway-ip] [route-map WORD]",
        "Advertise prefix routes\n"
        BGP_AFI_HELP_STR
        BGP_SAFI_HELP_STR
+       "advertise gateway IP overlay index\n"
        "route-map for filtering specific routes\n"
        "Name of the route map\n")
 {
@@ -3799,9 +3811,14 @@ DEFUN (bgp_evpn_advertise_type5,
        safi_t safi = 0;
        int ret = 0;
        int rmap_changed = 0;
+       enum overlay_index_type oly = OVERLAY_INDEX_TYPE_NONE;
+       int idx_oly = 0;
+       bool adv_flag_changed = false;
 
        argv_find_and_parse_afi(argv, argc, &idx_afi, &afi);
        argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
+       argv_find_and_parse_oly_idx(argv, argc, &idx_oly, &oly);
+
        ret = argv_find(argv, argc, "route-map", &idx_rmap);
        if (ret) {
                if (!bgp_vrf->adv_cmd_rmap[afi][safi].name)
@@ -3826,39 +3843,149 @@ DEFUN (bgp_evpn_advertise_type5,
                return CMD_WARNING;
        }
 
+       if ((oly != OVERLAY_INDEX_TYPE_NONE)
+           && (oly != OVERLAY_INDEX_GATEWAY_IP)) {
+               vty_out(vty, "%%Unknown overlay-index type specified");
+               return CMD_WARNING;
+       }
+
        if (afi == AFI_IP) {
+               if ((!CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                BGP_L2VPN_EVPN_ADV_IPV4_UNICAST))
+                   && (!CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                   BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP))) {
+
+                       /*
+                        * this is the case for first time ever configuration
+                        * adv ipv4 unicast is enabled for the first time.
+                        * So no need to reset any flag
+                        */
+                       if (oly == OVERLAY_INDEX_TYPE_NONE)
+                               SET_FLAG(
+                                       bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                       BGP_L2VPN_EVPN_ADV_IPV4_UNICAST);
+                       else if (oly == OVERLAY_INDEX_GATEWAY_IP)
+                               SET_FLAG(
+                                       bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                       BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP);
+               } else if ((oly == OVERLAY_INDEX_TYPE_NONE)
+                          && (!CHECK_FLAG(
+                                     bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                     BGP_L2VPN_EVPN_ADV_IPV4_UNICAST))) {
+
+                       /*
+                        * This is modify case from gateway-ip
+                        * to no overlay index
+                        */
+                       adv_flag_changed = true;
+                       UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                  BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP);
+                       SET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                BGP_L2VPN_EVPN_ADV_IPV4_UNICAST);
+               } else if ((oly == OVERLAY_INDEX_GATEWAY_IP)
+                          && (!CHECK_FLAG(
+                                     bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                     BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP))) {
+
+                       /*
+                        * This is modify case from no overlay index
+                        * to gateway-ip
+                        */
+                       adv_flag_changed = true;
+                       UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                  BGP_L2VPN_EVPN_ADV_IPV4_UNICAST);
+                       SET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP);
+               } else {
 
-               /* if we are already advertising ipv4 prefix as type-5
-                * nothing to do
-                */
-               if (!rmap_changed &&
-                   CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                              BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST))
-                       return CMD_WARNING;
-               SET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                        BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST);
+                       /*
+                        * Command is issued with the same option
+                        * (no overlay index or gateway-ip) which was
+                        * already configured. So nothing to do.
+                        * However, route-map may have been modified.
+                        * check if route-map has been modified.
+                        * If not, return an error
+                        */
+                       if (!rmap_changed)
+                               return CMD_WARNING;
+               }
        } else {
+               if ((!CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                BGP_L2VPN_EVPN_ADV_IPV6_UNICAST))
+                   && (!CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                   BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) {
+
+                       /*
+                        * this is the case for first time ever configuration
+                        * adv ipv6 unicast is enabled for the first time.
+                        * So no need to reset any flag
+                        */
+                       if (oly == OVERLAY_INDEX_TYPE_NONE)
+                               SET_FLAG(
+                                       bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                       BGP_L2VPN_EVPN_ADV_IPV6_UNICAST);
+                       else if (oly == OVERLAY_INDEX_GATEWAY_IP)
+                               SET_FLAG(
+                                       bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                       BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP);
+               } else if ((oly == OVERLAY_INDEX_TYPE_NONE)
+                          && (!CHECK_FLAG(
+                                     bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                     BGP_L2VPN_EVPN_ADV_IPV6_UNICAST))) {
+
+                       /*
+                        * This is modify case from gateway-ip
+                        * to no overlay index
+                        */
+                       adv_flag_changed = true;
+                       UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                  BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP);
+                       SET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                BGP_L2VPN_EVPN_ADV_IPV6_UNICAST);
+               } else if ((oly == OVERLAY_INDEX_GATEWAY_IP)
+                          && (!CHECK_FLAG(
+                                     bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                     BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))) {
+
+                       /*
+                        * This is modify case from no overlay index
+                        * to gateway-ip
+                        */
+                       adv_flag_changed = true;
+                       UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                  BGP_L2VPN_EVPN_ADV_IPV6_UNICAST);
+                       SET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP);
+               } else {
 
-               /* if we are already advertising ipv6 prefix as type-5
-                * nothing to do
-                */
-               if (!rmap_changed &&
-                   CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                              BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST))
-                       return CMD_WARNING;
-               SET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                        BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST);
+                       /*
+                        * Command is issued with the same option
+                        * (no overlay index or gateway-ip) which was
+                        * already configured. So nothing to do.
+                        * However, route-map may have been modified.
+                        * check if route-map has been modified.
+                        * If not, return an error
+                        */
+                       if (!rmap_changed)
+                               return CMD_WARNING;
+               }
        }
 
-       if (rmap_changed) {
+       if ((rmap_changed) || (adv_flag_changed)) {
+
+               /* If either of these are changed, then FRR needs to
+                * withdraw already advertised type5 routes.
+                */
                bgp_evpn_withdraw_type5_routes(bgp_vrf, afi, safi);
-               if (bgp_vrf->adv_cmd_rmap[afi][safi].name) {
-                       XFREE(MTYPE_ROUTE_MAP_NAME,
-                             bgp_vrf->adv_cmd_rmap[afi][safi].name);
-                       route_map_counter_decrement(
+               if (rmap_changed) {
+                       if (bgp_vrf->adv_cmd_rmap[afi][safi].name) {
+                               XFREE(MTYPE_ROUTE_MAP_NAME,
+                                     bgp_vrf->adv_cmd_rmap[afi][safi].name);
+                               route_map_counter_decrement(
                                        bgp_vrf->adv_cmd_rmap[afi][safi].map);
-                       bgp_vrf->adv_cmd_rmap[afi][safi].name = NULL;
-                       bgp_vrf->adv_cmd_rmap[afi][safi].map = NULL;
+                               bgp_vrf->adv_cmd_rmap[afi][safi].name = NULL;
+                               bgp_vrf->adv_cmd_rmap[afi][safi].map = NULL;
+                       }
                }
        }
 
@@ -3912,22 +4039,30 @@ DEFUN (no_bgp_evpn_advertise_type5,
                /* if we are not advertising ipv4 prefix as type-5
                 * nothing to do
                 */
-               if (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                              BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST)) {
+               if ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                               BGP_L2VPN_EVPN_ADV_IPV4_UNICAST)) ||
+                   (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                               BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP))) {
                        bgp_evpn_withdraw_type5_routes(bgp_vrf, afi, safi);
                        UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                  BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST);
+                                  BGP_L2VPN_EVPN_ADV_IPV4_UNICAST);
+                       UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                  BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP);
                }
        } else {
 
                /* if we are not advertising ipv6 prefix as type-5
                 * nothing to do
                 */
-               if (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                              BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST)) {
+               if ((CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                               BGP_L2VPN_EVPN_ADV_IPV6_UNICAST)) ||
+                   (CHECK_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                               BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP))){
                        bgp_evpn_withdraw_type5_routes(bgp_vrf, afi, safi);
                        UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                  BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST);
+                                  BGP_L2VPN_EVPN_ADV_IPV6_UNICAST);
+                       UNSET_FLAG(bgp_vrf->af_flags[AFI_L2VPN][SAFI_EVPN],
+                                  BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP);
                }
        }
 
@@ -6103,21 +6238,40 @@ void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi,
                vty_out(vty, "  flooding disable\n");
 
        if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                      BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST)) {
+                      BGP_L2VPN_EVPN_ADV_IPV4_UNICAST)) {
                if (bgp->adv_cmd_rmap[AFI_IP][SAFI_UNICAST].name)
                        vty_out(vty, "  advertise ipv4 unicast route-map %s\n",
                                bgp->adv_cmd_rmap[AFI_IP][SAFI_UNICAST].name);
                else
-                       vty_out(vty, "  advertise ipv4 unicast\n");
+                       vty_out(vty,
+                               "  advertise ipv4 unicast\n");
+       } else if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
+                  BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP)) {
+               if (bgp->adv_cmd_rmap[AFI_IP][SAFI_UNICAST].name)
+                       vty_out(vty,
+                               "  advertise ipv4 unicast gateway-ip route-map %s\n",
+                               bgp->adv_cmd_rmap[AFI_IP][SAFI_UNICAST].name);
+               else
+                       vty_out(vty, "  advertise ipv4 unicast gateway-ip\n");
        }
 
        if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                      BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST)) {
+                      BGP_L2VPN_EVPN_ADV_IPV6_UNICAST)) {
                if (bgp->adv_cmd_rmap[AFI_IP6][SAFI_UNICAST].name)
-                       vty_out(vty, "  advertise ipv6 unicast route-map %s\n",
+                       vty_out(vty,
+                               "  advertise ipv6 unicast route-map %s\n",
+                               bgp->adv_cmd_rmap[AFI_IP6][SAFI_UNICAST].name);
+               else
+                       vty_out(vty,
+                               "  advertise ipv6 unicast\n");
+       } else if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
+                             BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP)) {
+               if (bgp->adv_cmd_rmap[AFI_IP6][SAFI_UNICAST].name)
+                       vty_out(vty,
+                               "  advertise ipv6 unicast gateway-ip route-map %s\n",
                                bgp->adv_cmd_rmap[AFI_IP6][SAFI_UNICAST].name);
                else
-                       vty_out(vty, "  advertise ipv6 unicast\n");
+                       vty_out(vty, "  advertise ipv6 unicast gateway-ip\n");
        }
 
        if (CHECK_FLAG(bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
index 33f6e4f1b607060a35abb3f05a1c3bb689246af8..137365ddbf27b7fce97d94af851942597d350bf0 100644 (file)
@@ -28,6 +28,10 @@ extern void bgp_ethernetvpn_init(void);
 #define L2VPN_HELP_STR        "Layer 2 Virtual Private Network\n"
 #define EVPN_HELP_STR        "Ethernet Virtual Private Network\n"
 
+extern int argv_find_and_parse_oly_idx(struct cmd_token **argv, int argc,
+                                      int *oly_idx,
+                                      enum overlay_index_type *oly);
+
 /* Parse type from "type <ead|1|...>", return -1 on failure */
 extern int bgp_evpn_cli_parse_type(int *type, struct cmd_token **argv,
                                   int argc);
index 5189d7ba8ff9243b5f8be0d7b9a3cba98e45b38e..ab22aee1ca5de26d4a758c21bd95ad8b99a4f497 100644 (file)
@@ -182,24 +182,52 @@ int bgp_router_destroy(struct nb_cb_destroy_args *args)
                        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],
-                                              BGP_CONFIG_VRF_TO_VRF_EXPORT) ||
-                                   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_ADVERTISE_IPV4_UNICAST) ||
-                                    CHECK_FLAG(tmp_bgp->af_flags[AFI_L2VPN][SAFI_EVPN],
-                                               BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST))) ||
-                                   (tmp_bgp->vnihash && hashcount(tmp_bgp->vnihash))) {
+                               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],
+                                              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)))
+                                   || (tmp_bgp->vnihash
+                                       && hashcount(tmp_bgp->vnihash))) {
                                        snprintf(
                                                args->errmsg, args->errmsg_len,
                                                "Cannot delete default BGP instance. Dependent VRF instances exist\n");
index b18cd4ca774ed7f4588769cfa96631c3d65b9e8c..f2c8ece024f478a7dc82a80b8eba50d9912d9bcc 100644 (file)
@@ -510,16 +510,18 @@ struct bgp {
        uint16_t af_flags[AFI_MAX][SAFI_MAX];
 #define BGP_CONFIG_DAMPENING                           (1 << 0)
 /* l2vpn evpn flags - 1 << 0 is used for DAMPENNG */
-#define BGP_L2VPN_EVPN_ADVERTISE_IPV4_UNICAST          (1 << 1)
-#define BGP_L2VPN_EVPN_ADVERTISE_IPV6_UNICAST          (1 << 2)
-#define BGP_L2VPN_EVPN_DEFAULT_ORIGINATE_IPV4          (1 << 3)
-#define BGP_L2VPN_EVPN_DEFAULT_ORIGINATE_IPV6          (1 << 4)
+#define BGP_L2VPN_EVPN_ADV_IPV4_UNICAST (1 << 1)
+#define BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP (1 << 2)
+#define BGP_L2VPN_EVPN_ADV_IPV6_UNICAST (1 << 3)
+#define BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP (1 << 4)
+#define BGP_L2VPN_EVPN_DEFAULT_ORIGINATE_IPV4 (1 << 5)
+#define BGP_L2VPN_EVPN_DEFAULT_ORIGINATE_IPV6 (1 << 6)
 /* import/export between address families */
-#define BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT               (1 << 5)
-#define BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT               (1 << 6)
+#define BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT (1 << 7)
+#define BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT (1 << 8)
 /* vrf-route leaking flags */
-#define BGP_CONFIG_VRF_TO_VRF_IMPORT                   (1 << 7)
-#define BGP_CONFIG_VRF_TO_VRF_EXPORT                   (1 << 8)
+#define BGP_CONFIG_VRF_TO_VRF_IMPORT (1 << 9)
+#define BGP_CONFIG_VRF_TO_VRF_EXPORT (1 << 10)
 
        /* BGP per AF peer count */
        uint32_t af_peer_count[AFI_MAX][SAFI_MAX];