summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--zebra/rib.h4
-rw-r--r--zebra/zebra_nhg.c9
2 files changed, 12 insertions, 1 deletions
diff --git a/zebra/rib.h b/zebra/rib.h
index 65cc1ffab..64bbaf3e7 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 e44f6ee4e..bb507893b 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",