diff options
| -rw-r--r-- | tests/topotests/all_protocol_startup/test_all_protocol_startup.py | 28 | ||||
| -rw-r--r-- | zebra/zebra_nhg.c | 18 |
2 files changed, 46 insertions, 0 deletions
diff --git a/tests/topotests/all_protocol_startup/test_all_protocol_startup.py b/tests/topotests/all_protocol_startup/test_all_protocol_startup.py index 06a350c8e9..80903b134e 100644 --- a/tests/topotests/all_protocol_startup/test_all_protocol_startup.py +++ b/tests/topotests/all_protocol_startup/test_all_protocol_startup.py @@ -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"') diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index 5b7452a79e..589196ecb9 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -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", |
