Merge pull request #18374 from raja-rajasekar/rajasekarr/nhg_intf_flap_issue

zebra: Fix reinstalling nexthops in NHGs upon interface flaps
This commit is contained in:
Russ White 2025-03-19 08:10:15 -04:00 committed by GitHub
commit d5b864ebee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 46 additions and 0 deletions

View file

@ -652,6 +652,34 @@ def test_nexthop_groups():
nhg_id
)
## Validate NHG's installed in kernel has same nexthops with Interface flaps
pre_out = net["r1"].cmd('ip route show | grep "5.5.5.1"')
pre_nhg = re.search(r"nhid\s+(\d+)", pre_out)
pre_nh_show = net["r1"].cmd("ip next show id {}".format(pre_nhg.group(1)))
pre_total_nhs = len((re.search(r"group ([\d/]+)", pre_nh_show)).group(1).split("/"))
net["r1"].cmd(
"ip link set r1-eth1 down;ip link set r1-eth2 down;ip link set r1-eth3 down;ip link set r1-eth4 down"
)
sleep(1)
net["r1"].cmd(
"ip link set r1-eth1 up;ip link set r1-eth2 up;ip link set r1-eth3 up;ip link set r1-eth4 up"
)
sleep(5)
post_out = net["r1"].cmd('ip route show | grep "5.5.5.1"')
post_nhg = re.search(r"nhid\s+(\d+)", post_out)
post_nh_show = net["r1"].cmd("ip next show id {}".format(post_nhg.group(1)))
post_total_nhs = len(
(re.search(r"group ([\d/]+)", post_nh_show)).group(1).split("/")
)
assert (
post_total_nhs == pre_total_nhs
), "Expected same nexthops(pre-{}: post-{}) in NHG (pre-{}:post-{}) after few Interface flaps".format(
pre_total_nhs, post_total_nhs, pre_nhg.group(1), post_nhg.group(1)
)
## Remove all NHG routes
net["r1"].cmd('vtysh -c "sharp remove routes 2.2.2.1 1"')

View file

@ -1165,11 +1165,29 @@ static void zebra_nhg_handle_install(struct nhg_hash_entry *nhe, bool install)
{
/* Update validity of groups depending on it */
struct nhg_connected *rb_node_dep;
struct nhg_connected *rb_node_indirect_dep = NULL;
frr_each_safe (nhg_connected_tree, &nhe->nhg_dependents, rb_node_dep) {
zebra_nhg_set_valid(rb_node_dep->nhe, true);
/* install dependent NHG into kernel */
if (install) {
if (CHECK_FLAG(nhe->flags, NEXTHOP_GROUP_INSTALLED) &&
CHECK_FLAG(rb_node_dep->nhe->flags, NEXTHOP_GROUP_RECURSIVE)) {
frr_each_safe (nhg_connected_tree, &rb_node_dep->nhe->nhg_dependents,
rb_node_indirect_dep) {
SET_FLAG(rb_node_indirect_dep->nhe->flags,
NEXTHOP_GROUP_REINSTALL);
if (IS_ZEBRA_DEBUG_NHG_DETAIL)
zlog_debug("%s nh id %u (flags 0x%x) associated dependents NHG %pNG (flags 0x%x) Re-install",
__func__, rb_node_dep->nhe->id,
rb_node_dep->nhe->flags,
rb_node_indirect_dep->nhe,
rb_node_indirect_dep->nhe->flags);
zebra_nhg_install_kernel(rb_node_indirect_dep->nhe,
ZEBRA_ROUTE_MAX);
}
}
if (IS_ZEBRA_DEBUG_NHG_DETAIL)
zlog_debug(
"%s nh id %u (flags 0x%x) associated dependent NHG %pNG install",