]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: clean up import vrf route-map command 6081/head
authorDon Slice <dslice@cumulusnetworks.com>
Mon, 9 Mar 2020 18:34:53 +0000 (18:34 +0000)
committerDon Slice <dslice@cumulusnetworks.com>
Tue, 24 Mar 2020 12:54:10 +0000 (12:54 +0000)
Problem seen that if "import vrf route-map RMAP" was entered
without any vrfs being imported, the configuration was displayed
as "route-map vpn import RMAP". Additionally, if "import vrf
route-map" was entered without specifying a route-map name,
the command was accepted and the word "route-map" would be
treated as a vrf name.  This fix resolves both of those issues
and also allows deleting the "import vrf route-map" line without
providing the route-map name.

Ticket: CM-28821
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
bgpd/bgp_mplsvpn.c
bgpd/bgp_vty.c

index 3e2ba9802af14a2747e8c2836c104fd456da9781..8eecf984bfe4dc10b511d0404a95e023013f106a 100644 (file)
@@ -1805,8 +1805,9 @@ void vrf_unimport_from_vrf(struct bgp *to_bgp, struct bgp *from_bgp,
        vpn_leak_prechange(idir, afi, bgp_get_default(), to_bgp);
 
        if (to_bgp->vpn_policy[afi].import_vrf->count == 0) {
-               UNSET_FLAG(to_bgp->af_flags[afi][safi],
-                          BGP_CONFIG_VRF_TO_VRF_IMPORT);
+               if (!to_bgp->vpn_policy[afi].rmap[idir])
+                       UNSET_FLAG(to_bgp->af_flags[afi][safi],
+                                  BGP_CONFIG_VRF_TO_VRF_IMPORT);
                if (to_bgp->vpn_policy[afi].rtlist[idir])
                        ecommunity_free(&to_bgp->vpn_policy[afi].rtlist[idir]);
        } else {
index 3db9866a9989d64066242343647a7dab9e3d217a..544ca38a1881a9fb5027a93e7e8559ce4f1d9a28 100644 (file)
@@ -7520,8 +7520,7 @@ ALIAS (af_route_map_vpn_imexport,
        "For routes leaked from current address-family to vpn\n")
 
 DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
-      "[no] import vrf route-map RMAP$rmap_str",
-      NO_STR
+      "import vrf route-map RMAP$rmap_str",
       "Import routes from another VRF\n"
       "Vrf routes being filtered\n"
       "Specify route map\n"
@@ -7530,13 +7529,8 @@ DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        vpn_policy_direction_t dir = BGP_VPN_POLICY_DIR_FROMVPN;
        afi_t afi;
-       int idx = 0;
-       int yes = 1;
        struct bgp *bgp_default;
 
-       if (argv_find(argv, argc, "no", &idx))
-               yes = 0;
-
        afi = vpn_policy_getafi(vty, bgp, true);
        if (afi == AFI_MAX)
                return CMD_WARNING_CONFIG_FAILED;
@@ -7559,35 +7553,56 @@ DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
 
        vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
 
-       if (yes) {
-               if (bgp->vpn_policy[afi].rmap_name[dir])
-                       XFREE(MTYPE_ROUTE_MAP_NAME,
-                             bgp->vpn_policy[afi].rmap_name[dir]);
-               bgp->vpn_policy[afi].rmap_name[dir] =
-                       XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str);
-               bgp->vpn_policy[afi].rmap[dir] =
-                       route_map_lookup_warn_noexist(vty, rmap_str);
-               if (!bgp->vpn_policy[afi].rmap[dir])
-                       return CMD_SUCCESS;
-       } else {
-               if (bgp->vpn_policy[afi].rmap_name[dir])
-                       XFREE(MTYPE_ROUTE_MAP_NAME,
-                             bgp->vpn_policy[afi].rmap_name[dir]);
-               bgp->vpn_policy[afi].rmap_name[dir] = NULL;
-               bgp->vpn_policy[afi].rmap[dir] = NULL;
-       }
+       if (bgp->vpn_policy[afi].rmap_name[dir])
+               XFREE(MTYPE_ROUTE_MAP_NAME,
+                     bgp->vpn_policy[afi].rmap_name[dir]);
+       bgp->vpn_policy[afi].rmap_name[dir] =
+               XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str);
+       bgp->vpn_policy[afi].rmap[dir] =
+               route_map_lookup_warn_noexist(vty, rmap_str);
+       if (!bgp->vpn_policy[afi].rmap[dir])
+               return CMD_SUCCESS;
+
+       SET_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
+                BGP_CONFIG_VRF_TO_VRF_IMPORT);
 
        vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
 
        return CMD_SUCCESS;
 }
 
-ALIAS(af_import_vrf_route_map, af_no_import_vrf_route_map_cmd,
-      "no import vrf route-map",
+DEFPY(af_no_import_vrf_route_map, af_no_import_vrf_route_map_cmd,
+      "no import vrf route-map [RMAP$rmap_str]",
       NO_STR
       "Import routes from another VRF\n"
       "Vrf routes being filtered\n"
-      "Specify route map\n")
+      "Specify route map\n"
+      "name of route-map\n")
+{
+       VTY_DECLVAR_CONTEXT(bgp, bgp);
+       vpn_policy_direction_t dir = BGP_VPN_POLICY_DIR_FROMVPN;
+       afi_t afi;
+
+       afi = vpn_policy_getafi(vty, bgp, true);
+       if (afi == AFI_MAX)
+               return CMD_WARNING_CONFIG_FAILED;
+
+       vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
+
+       if (bgp->vpn_policy[afi].rmap_name[dir])
+               XFREE(MTYPE_ROUTE_MAP_NAME,
+                     bgp->vpn_policy[afi].rmap_name[dir]);
+       bgp->vpn_policy[afi].rmap_name[dir] = NULL;
+       bgp->vpn_policy[afi].rmap[dir] = NULL;
+
+       if (bgp->vpn_policy[afi].import_vrf->count == 0)
+               UNSET_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
+                          BGP_CONFIG_VRF_TO_VRF_IMPORT);
+
+       vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
+
+       return CMD_SUCCESS;
+}
 
 DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
       "[no] import vrf VIEWVRFNAME$import_name",
@@ -7613,6 +7628,11 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
                return CMD_WARNING;
        }
 
+       if (strcmp(import_name, "route-map") == 0) {
+               vty_out(vty, "%% Must include route-map name\n");
+               return CMD_WARNING;
+       }
+
        if (argv_find(argv, argc, "no", &idx))
                remove = true;
 
@@ -14116,7 +14136,8 @@ static void bgp_vpn_policy_config_write_afi(struct vty *vty, struct bgp *bgp,
        int indent = 2;
 
        if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]) {
-               if (listcount(bgp->vpn_policy[afi].import_vrf))
+               if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
+                              BGP_CONFIG_VRF_TO_VRF_IMPORT))
                        vty_out(vty, "%*simport vrf route-map %s\n", indent, "",
                                bgp->vpn_policy[afi]
                                .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);