mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 05:27:16 +02:00
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:
parent
3f785c913d
commit
918a1f85c2
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue