From 918a1f85c2edac05aaa9ec4e10b1013f435c6311 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 12 Mar 2025 08:30:43 -0400 Subject: [PATCH] staticd: Install known nexthops upon connection with zebra CI tests are showing cases where staticd is connecting to zebra after config is read in and the nexthops are never being registered w/ zebra: 2025/03/11 15:39:44 STATIC: [T83RR-8SM5G] staticd 10.4-dev starting: vty@2616 2025/03/11 15:39:45 STATIC: [GH3PB-C7X4Y] Static Route to 13.13.13.13/32 not installed currently because dependent config not fully available 2025/03/11 15:39:45 STATIC: [RHJK1-M5FAR] static_zebra_nht_register: Failure to send nexthop 1.1.1.2/32 for 11.11.11.11/32 to zebra 2025/03/11 15:39:45 STATIC: [M7Q4P-46WDR] vty[14]@> enable Zebra shows connection time as: 2025/03/11 15:39:45.933343 ZEBRA: [V98V0-MTWPF] client 5 says hello and bids fair to announce only static routes vrf=0 As a result staticd never installs the route because it has no nexthop tracking to say that the route could be installed. Modify staticd on startup to go through it's nexthops and dump them to zebra to allow the staticd state machine to get to work. Signed-off-by: Donald Sharp --- staticd/static_routes.c | 30 ++++++++++++++++++++++++++++++ staticd/static_routes.h | 1 + staticd/static_zebra.c | 6 ++++++ 3 files changed, 37 insertions(+) diff --git a/staticd/static_routes.c b/staticd/static_routes.c index 82eabd8d56..d549df70fe 100644 --- a/staticd/static_routes.c +++ b/staticd/static_routes.c @@ -368,6 +368,36 @@ static void static_ifindex_update_nh(struct interface *ifp, bool up, static_install_path(pn); } +void static_install_nexthops_on_startup(void) +{ + struct route_table *stable; + struct route_node *rn; + struct static_nexthop *nh; + struct static_path *pn; + struct static_vrf *svrf; + struct static_route_info *si; + afi_t afi; + safi_t safi; + + RB_FOREACH (svrf, svrf_name_head, &svrfs) { + FOREACH_AFI_SAFI (afi, safi) { + stable = static_vrf_static_table(afi, safi, svrf); + if (!stable) + continue; + for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) { + si = static_route_info_from_rnode(rn); + if (!si) + continue; + frr_each (static_path_list, &si->path_list, pn) { + frr_each (static_nexthop_list, &pn->nexthop_list, nh) { + static_zebra_nht_register(nh, true); + } + } + } + } + } +} + static void static_ifindex_update_af(struct interface *ifp, bool up, afi_t afi, safi_t safi) { diff --git a/staticd/static_routes.h b/staticd/static_routes.h index 2e2e4986c3..7f4936e0b9 100644 --- a/staticd/static_routes.h +++ b/staticd/static_routes.h @@ -264,6 +264,7 @@ extern void static_bfd_initialize(struct zclient *zc, struct event_loop *tm); extern void static_bfd_show(struct vty *vty, bool isjson); +extern void static_install_nexthops_on_startup(void); #ifdef __cplusplus } #endif diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c index a6521cccc6..3ed525f386 100644 --- a/staticd/static_zebra.c +++ b/staticd/static_zebra.c @@ -181,6 +181,12 @@ static void zebra_connected(struct zclient *zclient) vrf = vrf_lookup_by_id(VRF_DEFAULT); assert(vrf); static_fixup_vrf_ids(vrf); + + /* + * It's possible that staticd connected after config was read + * in. + */ + static_install_nexthops_on_startup(); } /* API to check whether the configured nexthop address is