From bb58cad150cd626a780b091b61a2d2ca6235e1e3 Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Wed, 28 Jun 2023 08:11:41 -0400 Subject: [PATCH] zebra: use NHRP routes as valid in nexthop check Treat NHRP-installed routes as valid, as if they were CONNECTED routes, when checking candidate routes' nexthops for validity. This allows use of NHRP by an IGP, for example, that doesn't normally want recursive nexthop resolution. Signed-off-by: Mark Stapp --- zebra/rib.h | 4 ++++ zebra/zebra_nhg.c | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/zebra/rib.h b/zebra/rib.h index 65cc1ffab9..64bbaf3e76 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -167,6 +167,10 @@ struct route_entry { #define RIB_KERNEL_ROUTE(R) RKERNEL_ROUTE((R)->type) +/* Define route types that are equivalent to "connected". */ +#define RIB_CONNECTED_ROUTE(R) \ + ((R)->type == ZEBRA_ROUTE_CONNECT || (R)->type == ZEBRA_ROUTE_NHRP) + /* meta-queue structure: * sub-queue 0: nexthop group objects * sub-queue 1: EVPN/VxLAN objects diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index e44f6ee4e0..bb507893b0 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -2392,7 +2392,10 @@ static int nexthop_active(struct nexthop *nexthop, struct nhg_hash_entry *nhe, continue; } - if ((match->type == ZEBRA_ROUTE_CONNECT) || + /* If the candidate match's type is considered "connected", + * we consider it first. + */ + if (RIB_CONNECTED_ROUTE(match) || (RIB_SYSTEM_ROUTE(match) && RSYSTEM_ROUTE(type))) { match = zebra_nhg_connected_ifindex(rn, match, nexthop->ifindex); @@ -2413,6 +2416,10 @@ static int nexthop_active(struct nexthop *nexthop, struct nhg_hash_entry *nhe, return 0; } + /* NHRP special case: need to indicate onlink */ + if (match->type == ZEBRA_ROUTE_NHRP) + SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK); + if (IS_ZEBRA_DEBUG_NHG_DETAIL) zlog_debug( "%s: CONNECT match %p (%pNG), newhop %pNHv", -- 2.39.5