diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 32d5286d5e..9ae60e011c 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -249,7 +249,11 @@ static int zebra_static_route_holdem(struct zebra_vrf *zvrf, return CMD_SUCCESS; } - assert(!"We should not have found a duplicate and not remove it"); + /* + * If a person enters the same line again + * we need to silently accept it + */ + return CMD_SUCCESS; } listnode_add_sort(static_list, shr); @@ -489,6 +493,34 @@ static int zebra_static_route_leak( return CMD_SUCCESS; } +static struct zebra_vrf *zebra_vty_get_unknown_vrf(struct vty *vty, + const char *vrf_name) +{ + struct zebra_vrf *zvrf; + struct vrf *vrf; + + zvrf = zebra_vrf_lookup_by_name(vrf_name); + + if (zvrf) + return zvrf; + + vrf = vrf_get(VRF_UNKNOWN, vrf_name); + if (!vrf) { + vty_out(vty, "%% Could not create vrf %s\n", vrf_name); + return NULL; + } + zvrf = vrf->info; + if (!zvrf) { + vty_out(vty, "%% Could not create vrf-info %s\n", + vrf_name); + return NULL; + } + /* Mark as having FRR configuration */ + vrf_set_user_cfged(vrf); + + return zvrf; +} + static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi, const char *negate, const char *dest_str, const char *mask_str, const char *src_str, @@ -498,7 +530,6 @@ static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi, const char *label_str) { struct zebra_vrf *zvrf; - struct vrf *vrf; /* VRF id */ zvrf = zebra_vrf_lookup_by_name(vrf_name); @@ -513,19 +544,9 @@ static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi, * Note: The VRF isn't active until we hear about it from the kernel. */ if (!zvrf) { - vrf = vrf_get(VRF_UNKNOWN, vrf_name); - if (!vrf) { - vty_out(vty, "%% Could not create vrf %s\n", vrf_name); + zvrf = zebra_vty_get_unknown_vrf(vty, vrf_name); + if (!zvrf) return CMD_WARNING_CONFIG_FAILED; - } - zvrf = vrf->info; - if (!zvrf) { - vty_out(vty, "%% Could not create vrf-info %s\n", - vrf_name); - return CMD_WARNING_CONFIG_FAILED; - } - /* Mark as having FRR configuration */ - vrf_set_user_cfged(vrf); } return zebra_static_route_leak( vty, zvrf, zvrf, afi, safi, negate, dest_str, mask_str, src_str, @@ -777,14 +798,14 @@ DEFPY(ip_route_address_interface, ifname = NULL; } - zvrf = zebra_vrf_lookup_by_name(vrf); + zvrf = zebra_vty_get_unknown_vrf(vty, vrf); if (!zvrf) { vty_out(vty, "%% vrf %s is not defined\n", vrf); return CMD_WARNING_CONFIG_FAILED; } if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -835,7 +856,7 @@ DEFPY(ip_route_address_interface_vrf, } if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -884,14 +905,14 @@ DEFPY(ip_route, ifname = NULL; } - zvrf = zebra_vrf_lookup_by_name(vrf); + zvrf = zebra_vty_get_unknown_vrf(vty, vrf); if (!zvrf) { vty_out(vty, "%% vrf %s is not defined\n", vrf); return CMD_WARNING_CONFIG_FAILED; } if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -941,7 +962,7 @@ DEFPY(ip_route_vrf, } if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -2388,14 +2409,14 @@ DEFPY(ipv6_route_address_interface, struct zebra_vrf *zvrf; struct zebra_vrf *nh_zvrf; - zvrf = zebra_vrf_lookup_by_name(vrf); + zvrf = zebra_vty_get_unknown_vrf(vty, vrf); if (!zvrf) { vty_out(vty, "%% vrf %s is not defined\n", vrf); return CMD_WARNING_CONFIG_FAILED; } if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -2439,7 +2460,7 @@ DEFPY(ipv6_route_address_interface_vrf, struct zebra_vrf *nh_zvrf; if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -2482,14 +2503,14 @@ DEFPY(ipv6_route, struct zebra_vrf *zvrf; struct zebra_vrf *nh_zvrf; - zvrf = zebra_vrf_lookup_by_name(vrf); + zvrf = zebra_vty_get_unknown_vrf(vty, vrf); if (!zvrf) { vty_out(vty, "%% vrf %s is not defined\n", vrf); return CMD_WARNING_CONFIG_FAILED; } if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf; @@ -2532,7 +2553,7 @@ DEFPY(ipv6_route_vrf, struct zebra_vrf *nh_zvrf; if (nexthop_vrf) - nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf); + nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf); else nh_zvrf = zvrf;