From e7f96f7411f8e622f0dae58744ab9dcd7feceaa4 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 14 Mar 2018 10:34:15 -0400 Subject: [PATCH 1/3] 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); + 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, @@ -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; From ad97d1c10af12cbfb45d0f5f3a6002738115fe12 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 16 Mar 2018 18:38:25 -0400 Subject: [PATCH 2/3] zebra: Allow duplicate entry of a route If a user enters a route inside a non kernel existant vrf: vrf BLOOP ip route 4.3.2.0/24 192.168.201.1 ! They should be able to enter it over and over and over and over and over no matter how futile it is. Signed-off-by: Donald Sharp --- zebra/zebra_vty.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index ea4d1a9feb..d0e2529924 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); From 6a17b1a0f25419bca715b16355afbc700b6fedc5 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 16 Mar 2018 18:45:29 -0400 Subject: [PATCH 3/3] zebra: Extend unknown vrf to vrf part of ip route When specifying a ip route: ip route 4.3.2.0/24 192.168.201.1 vrf DONNA Accept DONNA even if it has not been created yet. Signed-off-by: Donald Sharp --- zebra/zebra_vty.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index d0e2529924..9ae60e011c 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -798,7 +798,7 @@ 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; @@ -905,7 +905,7 @@ 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; @@ -2409,7 +2409,7 @@ 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; @@ -2503,7 +2503,7 @@ 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;