From 12b4d77babf1cc5a67fe44fa83af28d1d9fc8a51 Mon Sep 17 00:00:00 2001 From: vivek Date: Fri, 15 May 2020 16:22:01 -0700 Subject: [PATCH] zebra: Trust onlink flag for nexthop active resolution When checking if a nexthop is active, if it has been marked as onlink, just check on the presence and status of the nexthop's interface. When handling client request to create a route, if the client says that the nexthop is onlink, trust it; when internally (in zebra) determining that the nexthop is onlink, ensure it is only done in the case of an interface with a /32 IP address which is the case for OSPF unnumbered. Signed-off-by: Vivek Venkatraman Reviewed-by: Donald Sharp Reviewed-by: Stephen Worley --- zebra/zapi_msg.c | 12 ++++++++---- zebra/zebra_nhg.c | 29 ++++++++++------------------- 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 -- 2.39.5