summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/etc/frr/support_bundle_commands.conf2
-rw-r--r--zebra/zebra_nhg.c16
-rw-r--r--zebra/zebra_rib.c7
3 files changed, 16 insertions, 9 deletions
diff --git a/tools/etc/frr/support_bundle_commands.conf b/tools/etc/frr/support_bundle_commands.conf
index 914363157a..a727f86a03 100644
--- a/tools/etc/frr/support_bundle_commands.conf
+++ b/tools/etc/frr/support_bundle_commands.conf
@@ -68,6 +68,8 @@ show ip nht vrf all
show ipv6 nht vrf all
show ip route vrf all
show ipv6 route vrf all
+show ip fib
+show ipv6 fib
show nexthop-group rib
show route-map
show memory
diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c
index bb507893b0..977ea425d5 100644
--- a/zebra/zebra_nhg.c
+++ b/zebra/zebra_nhg.c
@@ -2366,17 +2366,18 @@ static int nexthop_active(struct nexthop *nexthop, struct nhg_hash_entry *nhe,
if (is_default_prefix(&rn->p)
&& !rnh_resolve_via_default(zvrf, p.family)) {
if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug(
- " :%s: Resolved against default route",
- __func__);
+ zlog_debug(" :%s: %pFX Resolved against default route",
+ __func__, &p);
return 0;
}
dest = rib_dest_from_rnode(rn);
- if (dest && dest->selected_fib
- && !CHECK_FLAG(dest->selected_fib->status,
- ROUTE_ENTRY_REMOVED)
- && dest->selected_fib->type != ZEBRA_ROUTE_TABLE)
+ if (dest && dest->selected_fib &&
+ (!CHECK_FLAG(dest->selected_fib->status,
+ ROUTE_ENTRY_REMOVED) ||
+ CHECK_FLAG(dest->selected_fib->status,
+ ROUTE_ENTRY_ROUTE_REPLACING)) &&
+ dest->selected_fib->type != ZEBRA_ROUTE_TABLE)
match = dest->selected_fib;
/* If there is no selected route or matched route is EGP, go up
@@ -2388,7 +2389,6 @@ static int nexthop_active(struct nexthop *nexthop, struct nhg_hash_entry *nhe,
} while (rn && rn->info == NULL);
if (rn)
route_lock_node(rn);
-
continue;
}
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 93b33c9abd..a5e036fe48 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -2824,8 +2824,13 @@ static void process_subq_early_route_add(struct zebra_early_route *ere)
rib_addnode(rn, re, 1);
/* Free implicit route.*/
- if (same)
+ if (same) {
+ rib_dest_t *dest = rn->info;
+
+ if (same == dest->selected_fib)
+ SET_FLAG(same->status, ROUTE_ENTRY_ROUTE_REPLACING);
rib_delnode(rn, same);
+ }
/* See if we can remove some RE entries that are queued for
* removal, but won't be considered in rib processing.