mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-10 01:37:31 +00:00
Merge pull request #1889 from donaldsharp/static_stuff1
zebra: Auto create the nexthop-vrf if needed.
This commit is contained in:
commit
bff428d057
@ -249,7 +249,11 @@ static int zebra_static_route_holdem(struct zebra_vrf *zvrf,
|
|||||||
return CMD_SUCCESS;
|
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);
|
listnode_add_sort(static_list, shr);
|
||||||
@ -489,6 +493,34 @@ static int zebra_static_route_leak(
|
|||||||
return CMD_SUCCESS;
|
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,
|
static int zebra_static_route(struct vty *vty, afi_t afi, safi_t safi,
|
||||||
const char *negate, const char *dest_str,
|
const char *negate, const char *dest_str,
|
||||||
const char *mask_str, const char *src_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)
|
const char *label_str)
|
||||||
{
|
{
|
||||||
struct zebra_vrf *zvrf;
|
struct zebra_vrf *zvrf;
|
||||||
struct vrf *vrf;
|
|
||||||
|
|
||||||
/* VRF id */
|
/* VRF id */
|
||||||
zvrf = zebra_vrf_lookup_by_name(vrf_name);
|
zvrf = zebra_vrf_lookup_by_name(vrf_name);
|
||||||
@ -513,20 +544,10 @@ 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.
|
* Note: The VRF isn't active until we hear about it from the kernel.
|
||||||
*/
|
*/
|
||||||
if (!zvrf) {
|
if (!zvrf) {
|
||||||
vrf = vrf_get(VRF_UNKNOWN, vrf_name);
|
zvrf = zebra_vty_get_unknown_vrf(vty, vrf_name);
|
||||||
if (!vrf) {
|
if (!zvrf)
|
||||||
vty_out(vty, "%% Could not create vrf %s\n", vrf_name);
|
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
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(
|
return zebra_static_route_leak(
|
||||||
vty, zvrf, zvrf, afi, safi, negate, dest_str, mask_str, src_str,
|
vty, zvrf, zvrf, afi, safi, negate, dest_str, mask_str, src_str,
|
||||||
gate_str, ifname, flag_str, tag_str, distance_str, label_str);
|
gate_str, ifname, flag_str, tag_str, distance_str, label_str);
|
||||||
@ -777,14 +798,14 @@ DEFPY(ip_route_address_interface,
|
|||||||
ifname = NULL;
|
ifname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
zvrf = zebra_vrf_lookup_by_name(vrf);
|
zvrf = zebra_vty_get_unknown_vrf(vty, vrf);
|
||||||
if (!zvrf) {
|
if (!zvrf) {
|
||||||
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -835,7 +856,7 @@ DEFPY(ip_route_address_interface_vrf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -884,14 +905,14 @@ DEFPY(ip_route,
|
|||||||
ifname = NULL;
|
ifname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
zvrf = zebra_vrf_lookup_by_name(vrf);
|
zvrf = zebra_vty_get_unknown_vrf(vty, vrf);
|
||||||
if (!zvrf) {
|
if (!zvrf) {
|
||||||
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -941,7 +962,7 @@ DEFPY(ip_route_vrf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -2388,14 +2409,14 @@ DEFPY(ipv6_route_address_interface,
|
|||||||
struct zebra_vrf *zvrf;
|
struct zebra_vrf *zvrf;
|
||||||
struct zebra_vrf *nh_zvrf;
|
struct zebra_vrf *nh_zvrf;
|
||||||
|
|
||||||
zvrf = zebra_vrf_lookup_by_name(vrf);
|
zvrf = zebra_vty_get_unknown_vrf(vty, vrf);
|
||||||
if (!zvrf) {
|
if (!zvrf) {
|
||||||
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -2439,7 +2460,7 @@ DEFPY(ipv6_route_address_interface_vrf,
|
|||||||
struct zebra_vrf *nh_zvrf;
|
struct zebra_vrf *nh_zvrf;
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -2482,14 +2503,14 @@ DEFPY(ipv6_route,
|
|||||||
struct zebra_vrf *zvrf;
|
struct zebra_vrf *zvrf;
|
||||||
struct zebra_vrf *nh_zvrf;
|
struct zebra_vrf *nh_zvrf;
|
||||||
|
|
||||||
zvrf = zebra_vrf_lookup_by_name(vrf);
|
zvrf = zebra_vty_get_unknown_vrf(vty, vrf);
|
||||||
if (!zvrf) {
|
if (!zvrf) {
|
||||||
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
vty_out(vty, "%% vrf %s is not defined\n", vrf);
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
@ -2532,7 +2553,7 @@ DEFPY(ipv6_route_vrf,
|
|||||||
struct zebra_vrf *nh_zvrf;
|
struct zebra_vrf *nh_zvrf;
|
||||||
|
|
||||||
if (nexthop_vrf)
|
if (nexthop_vrf)
|
||||||
nh_zvrf = zebra_vrf_lookup_by_name(nexthop_vrf);
|
nh_zvrf = zebra_vty_get_unknown_vrf(vty, nexthop_vrf);
|
||||||
else
|
else
|
||||||
nh_zvrf = zvrf;
|
nh_zvrf = zvrf;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user