From 7d9ebceaefc2fd05f8b60a63b2a038cc856bfb88 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 14 Jan 2025 15:12:32 -0500 Subject: [PATCH] zebra: Nexthops need to be ACTIVE in some cases Currently if you have an interface down event, Zebra sets the nexthop(s) as !ACTIVE that use it. On interface up events the singleton nexthops are not being set as ACTIVE. Due to timing events it is sometimes possible to end up with a route that is using a singleton Change singleton nexthops to set the nexthop to ACTIVE. This will allow the nexthop to be reinstalled appropriately as well. I was able to easily reproduce this using sharpd since it does not attempt to reinstall the routes when a interface goes up/down. Before: D>* 10.0.0.0/32 [150/0] via 192.168.102.34, dummy2, weight 1, 00:00:01 sharpd@eva ~/frr5 (master)> sudo ip link set dummy2 down ; sudo ip link set dummy2 up D> 10.0.0.0/32 [150/0] (350) via 192.168.102.34, dummy2 inactive, weight 1, 00:00:10 After code change: D>* 10.0.0.0/32 [150/0] (73) via 192.168.102.34, dummy2, weight 1, 00:00:14 sharpd@eva ~/frr5 (master)> sudo ip link set dummy2 down ; sudo ip link set dummy2 up D>* 10.0.0.0/32 [150/0] (73) via 192.168.102.34, dummy2, weight 1, 00:00:21 Ticket :#4198198 #4217209 #4224065 Signed-off-by: Donald Sharp --- zebra/zebra_nhg.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index df411d5f5a4e..adb54b2085ed 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -4007,7 +4007,14 @@ void zebra_interface_nhg_reinstall(struct interface *ifp) frrtrace(1, frr_zebra, zebra_interface_nhg_reinstall, ifp); frr_each (nhg_connected_tree, &zif->nhg_dependents, rb_node_dep) { + /* + * The nexthop associated with this was set as !ACTIVE + * so we need to turn it back to active when we get to + * this point again + */ + SET_FLAG(rb_node_dep->nhe->nhg.nexthop->flags, NEXTHOP_FLAG_ACTIVE); nh = rb_node_dep->nhe->nhg.nexthop; + if (zebra_nhg_set_valid_if_active(rb_node_dep->nhe)) { if (IS_ZEBRA_DEBUG_NHG_DETAIL) zlog_debug(