Merge pull request #1889 from donaldsharp/static_stuff1

zebra: Auto create the nexthop-vrf if needed.
This commit is contained in:
Lou Berger 2018-03-17 21:47:20 -04:00 committed by GitHub
commit bff428d057
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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;