From: Don Slice Date: Mon, 9 Mar 2020 18:34:53 +0000 (+0000) Subject: bgpd: clean up import vrf route-map command X-Git-Tag: base_7.4~172^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=ae6a6fb4e5a0409f0358e1c098dd4d5656483bde;p=mirror%2Ffrr.git bgpd: clean up import vrf route-map command 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 --- diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 3e2ba9802a..8eecf984bf 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -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 { diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 3db9866a99..544ca38a18 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -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]);