summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2020-05-18 17:23:57 -0400
committerGitHub <noreply@github.com>2020-05-18 17:23:57 -0400
commit3bb8051aa22b7e325a01b8ddcdd8c48da6c4f2dd (patch)
tree03a6236a409eaa3a65b4bb3c475fa19f653993a9
parent0591d71e92e25cfaa2b557147b01e115029eb1cb (diff)
parent12b4d77babf1cc5a67fe44fa83af28d1d9fc8a51 (diff)
Merge pull request #6421 from vivek-cumulus/zebra_trust_onlink
zebra: Trust onlink flag for nexthop active resolution
-rw-r--r--zebra/zapi_msg.c12
-rw-r--r--zebra/zebra_nhg.c29
2 files changed, 18 insertions, 23 deletions
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 092b5dd3c2..5db4555284 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -1451,10 +1451,6 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
&api_nh->gate.ipv4, NULL, api_nh->ifindex,
api_nh->vrf_id);
- ifp = if_lookup_by_index(api_nh->ifindex, api_nh->vrf_id);
- if (ifp && connected_is_unnumbered(ifp))
- SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK);
-
/* Special handling for IPv4 routes sourced from EVPN:
* the nexthop and associated MAC need to be installed.
*/
@@ -1516,8 +1512,16 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
goto done;
}
+ /* Mark nexthop as onlink either if client has explicitly told us
+ * to or if the nexthop is on an 'unnumbered' interface.
+ */
if (CHECK_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_ONLINK))
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK);
+ else if (api_nh->type == NEXTHOP_TYPE_IPV4_IFINDEX) {
+ ifp = if_lookup_by_index(api_nh->ifindex, api_nh->vrf_id);
+ if (ifp && connected_is_unnumbered(ifp))
+ SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK);
+ }
if (CHECK_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_WEIGHT))
nexthop->weight = api_nh->weight;
diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c
index f24552c80b..fdbeac88e1 100644
--- a/zebra/zebra_nhg.c
+++ b/zebra/zebra_nhg.c
@@ -1776,33 +1776,24 @@ static int nexthop_active(afi_t afi, struct route_entry *re,
return 1;
/*
- * Check to see if we should trust the passed in information
- * for UNNUMBERED interfaces as that we won't find the GW
- * address in the routing table.
- * This check should suffice to handle IPv4 or IPv6 routes
- * sourced from EVPN routes which are installed with the
- * next hop as the remote VTEP IP.
+ * If the nexthop has been marked as 'onlink' we just need to make
+ * sure the nexthop's interface is known and is operational.
*/
if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK)) {
ifp = if_lookup_by_index(nexthop->ifindex, nexthop->vrf_id);
if (!ifp) {
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug(
- " %s: Onlink and interface: %u[%u] does not exist",
- __func__, nexthop->ifindex,
- nexthop->vrf_id);
+ if (IS_ZEBRA_DEBUG_NHG_DETAIL)
+ zlog_debug("nexthop %pNHv marked onlink but nhif %u doesn't exist",
+ nexthop, nexthop->ifindex);
return 0;
}
-
- if (if_is_operative(ifp))
- return 1;
- else {
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug(
- " %s: Onlink and interface %s is not operative",
- __func__, ifp->name);
+ if (!if_is_operative(ifp)) {
+ if (IS_ZEBRA_DEBUG_NHG_DETAIL)
+ zlog_debug("nexthop %pNHv marked onlink but nhif %s is not operational",
+ nexthop, ifp->name);
return 0;
}
+ return 1;
}
if ((top->p.family == AF_INET && top->p.prefixlen == 32