From e7f96f7411f8e622f0dae58744ab9dcd7feceaa4 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 14 Mar 2018 10:34:15 -0400 Subject: [PATCH] zebra: Auto create the nexthop-vrf if needed. Currently if I try to use a nexthop-vrf that has not been specified yet we get a failure from the cli. Add code to zebra so that if we fail to find the nexthop-vrf we auto create it, instead of failing the install. Signed-off-by: Donald Sharp --- zebra/zebra_vty.c | 59 ++++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 32d5286d5e..ea4d1a9feb 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -489,6 +489,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 +526,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 +540,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); - return CMD_WARNING_CONFIG_FAILED; - } - zvrf = vrf->info; - if (!zvrf) { - vty_out(vty, "%% Could not create vrf-info %s\n", - vrf_name); + zvrf = zebra_vty_get_unknown_vrf(vty, vrf_name); + if (!zvrf) 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, @@ -784,7 +801,7 @@ DEFPY(ip_route_address_interface, } 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 +852,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; @@ -891,7 +908,7 @@ DEFPY(ip_route, } 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 +958,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; @@ -2395,7 +2412,7 @@ DEFPY(ipv6_route_address_interface, } 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 +2456,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; @@ -2489,7 +2506,7 @@ DEFPY(ipv6_route, } 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 +2549,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; -- 2.39.5