summaryrefslogtreecommitdiff
path: root/staticd/static_routes.c
diff options
context:
space:
mode:
Diffstat (limited to 'staticd/static_routes.c')
-rw-r--r--staticd/static_routes.c54
1 files changed, 21 insertions, 33 deletions
diff --git a/staticd/static_routes.c b/staticd/static_routes.c
index 1c436a66b0..9f7e19660d 100644
--- a/staticd/static_routes.c
+++ b/staticd/static_routes.c
@@ -138,20 +138,26 @@ void static_del_route(struct route_node *rn, safi_t safi,
vrf_reset_user_cfged(svrf->vrf);
}
-bool static_add_nexthop_validate(struct static_vrf *svrf, static_types type,
+bool static_add_nexthop_validate(const char *nh_vrf_name, static_types type,
struct ipaddr *ipaddr)
{
+ struct vrf *vrf;
+
+ vrf = vrf_lookup_by_name(nh_vrf_name);
+ if (!vrf)
+ return true;
+
switch (type) {
case STATIC_IPV4_GATEWAY:
case STATIC_IPV4_GATEWAY_IFNAME:
if (if_lookup_exact_address(&ipaddr->ipaddr_v4, AF_INET,
- svrf->vrf->vrf_id))
+ vrf->vrf_id))
return false;
break;
case STATIC_IPV6_GATEWAY:
case STATIC_IPV6_GATEWAY_IFNAME:
if (if_lookup_exact_address(&ipaddr->ipaddr_v6, AF_INET6,
- svrf->vrf->vrf_id))
+ vrf->vrf_id))
return false;
break;
default:
@@ -214,10 +220,7 @@ static_add_nexthop(struct route_node *rn, struct static_path *pn, safi_t safi,
route_lock_node(rn);
- nh_svrf = static_vty_get_unknown_vrf(nh_vrf);
-
- if (!nh_svrf)
- return NULL;
+ nh_svrf = static_vrf_lookup_by_name(nh_vrf);
/* Make new static route structure. */
nh = XCALLOC(MTYPE_STATIC_NEXTHOP, sizeof(struct static_nexthop));
@@ -225,8 +228,8 @@ static_add_nexthop(struct route_node *rn, struct static_path *pn, safi_t safi,
nh->type = type;
nh->color = color;
- nh->nh_vrf_id = nh_svrf->vrf->vrf_id;
- strlcpy(nh->nh_vrfname, nh_svrf->vrf->name, sizeof(nh->nh_vrfname));
+ nh->nh_vrf_id = nh_svrf ? nh_svrf->vrf->vrf_id : VRF_UNKNOWN;
+ strlcpy(nh->nh_vrfname, nh_vrf, sizeof(nh->nh_vrfname));
if (ifname)
strlcpy(nh->ifname, ifname, sizeof(nh->ifname));
@@ -261,7 +264,7 @@ static_add_nexthop(struct route_node *rn, struct static_path *pn, safi_t safi,
}
static_nexthop_list_add_after(&(pn->nexthop_list), cp, nh);
- if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN) {
+ if (nh->nh_vrf_id == VRF_UNKNOWN) {
zlog_warn(
"Static Route to %pFX not installed currently because dependent config not fully available",
&rn->p);
@@ -275,7 +278,7 @@ static_add_nexthop(struct route_node *rn, struct static_path *pn, safi_t safi,
break;
case STATIC_IPV4_GATEWAY_IFNAME:
case STATIC_IPV6_GATEWAY_IFNAME:
- ifp = if_lookup_by_name(ifname, nh_svrf->vrf->vrf_id);
+ ifp = if_lookup_by_name(ifname, nh->nh_vrf_id);
if (ifp && ifp->ifindex != IFINDEX_INTERNAL)
nh->ifindex = ifp->ifindex;
else
@@ -288,7 +291,7 @@ static_add_nexthop(struct route_node *rn, struct static_path *pn, safi_t safi,
nh->bh_type = STATIC_BLACKHOLE_NULL;
break;
case STATIC_IFNAME:
- ifp = if_lookup_by_name(ifname, nh_svrf->vrf->vrf_id);
+ ifp = if_lookup_by_name(ifname, nh->nh_vrf_id);
if (ifp && ifp->ifindex != IFINDEX_INTERNAL) {
nh->ifindex = ifp->ifindex;
} else
@@ -306,28 +309,15 @@ void static_install_nexthop(struct route_node *rn, struct static_path *pn,
struct static_vrf *svrf, const char *ifname,
static_types type, const char *nh_vrf)
{
- struct static_vrf *nh_svrf;
struct interface *ifp;
- nh_svrf = static_vty_get_unknown_vrf(nh_vrf);
-
- if (!nh_svrf) {
- char nexthop_str[NEXTHOP_STR];
-
- static_get_nh_str(nh, nexthop_str, sizeof(nexthop_str));
- DEBUGD(&static_dbg_route,
- "Static Route %pFX not installed for %s vrf %s not ready",
- &rn->p, nexthop_str, nh_vrf);
- return;
- }
-
- if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN) {
+ if (nh->nh_vrf_id == VRF_UNKNOWN) {
char nexthop_str[NEXTHOP_STR];
static_get_nh_str(nh, nexthop_str, sizeof(nexthop_str));
DEBUGD(&static_dbg_route,
"Static Route %pFX not installed for %s vrf %s is unknown",
- &rn->p, nexthop_str, nh_vrf);
+ &rn->p, nexthop_str, nh->nh_vrfname);
return;
}
@@ -347,7 +337,7 @@ void static_install_nexthop(struct route_node *rn, struct static_path *pn,
static_install_path(rn, pn, safi, svrf);
break;
case STATIC_IFNAME:
- ifp = if_lookup_by_name(ifname, nh_svrf->vrf->vrf_id);
+ ifp = if_lookup_by_name(ifname, nh->nh_vrf_id);
if (ifp && ifp->ifindex != IFINDEX_INTERNAL)
static_install_path(rn, pn, safi, svrf);
@@ -359,13 +349,9 @@ int static_delete_nexthop(struct route_node *rn, struct static_path *pn,
safi_t safi, struct static_vrf *svrf,
struct static_nexthop *nh)
{
- struct static_vrf *nh_svrf;
-
- nh_svrf = static_vrf_lookup_by_name(nh->nh_vrfname);
-
static_nexthop_list_del(&(pn->nexthop_list), nh);
- if (nh_svrf->vrf->vrf_id == VRF_UNKNOWN)
+ if (nh->nh_vrf_id == VRF_UNKNOWN)
goto EXIT;
static_zebra_nht_register(rn, nh, false);
@@ -523,6 +509,8 @@ static void static_enable_vrf(struct static_vrf *svrf,
else
continue;
}
+ if (nh->nh_vrf_id == VRF_UNKNOWN)
+ continue;
static_install_path(rn, pn, safi, svrf);
}
}