mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
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:
commit
d5b864ebee
|
@ -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"')
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue