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 <sharpd@nvidia.com>
This commit is contained in:
Donald Sharp 2025-03-12 08:30:43 -04:00
parent 3f785c913d
commit 918a1f85c2
3 changed files with 37 additions and 0 deletions

View file

@ -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)
{

View file

@ -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

View file

@ -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