From bb8d8d961f268d827d9acbef60c7a1cfd7319429 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Fri, 31 Jul 2026 18:17:53 +0000 Subject: [PATCH] [orchagent]: Recreate custom BFD monitor for reused nexthop Signed-off-by: Jing Zhang --- orchagent/vnetorch.cpp | 22 ++++++++++++++++------ tests/test_vnet.py | 13 +++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/orchagent/vnetorch.cpp b/orchagent/vnetorch.cpp index 42fedf5587..3a14caf29f 100644 --- a/orchagent/vnetorch.cpp +++ b/orchagent/vnetorch.cpp @@ -1170,14 +1170,24 @@ bool VNetRouteOrch::selectNextHopGroup(const string& vnet, nexthops_selected = nhg_custom; return true; } - else if (!hasNextHopGroup(vnet, nexthops_primary)) + else { - SWSS_LOG_INFO("Creating next hop group %s", nexthops_primary.to_string().c_str()); - setEndpointMonitor(vnet, monitors, nexthops_primary, monitoring, rx_monitor_timer, tx_monitor_timer, ipPrefix); - if (!createNextHopGroup(vnet, nexthops_primary, vrf_obj, monitoring)) + bool next_hop_group_exists = hasNextHopGroup(vnet, nexthops_primary); + bool route_exists = syncd_tunnel_routes_[vnet].find(ipPrefix) != syncd_tunnel_routes_[vnet].end(); + + if (!next_hop_group_exists || !route_exists) { - delEndpointMonitor(vnet, nexthops_primary, ipPrefix); - return false; + setEndpointMonitor(vnet, monitors, nexthops_primary, monitoring, rx_monitor_timer, tx_monitor_timer, ipPrefix); + } + + if (!next_hop_group_exists) + { + SWSS_LOG_INFO("Creating next hop group %s", nexthops_primary.to_string().c_str()); + if (!createNextHopGroup(vnet, nexthops_primary, vrf_obj, monitoring)) + { + delEndpointMonitor(vnet, nexthops_primary, ipPrefix); + return false; + } } } nexthops_selected = nexthops_primary; diff --git a/tests/test_vnet.py b/tests/test_vnet.py index 50a3f9c456..1788ffae76 100644 --- a/tests/test_vnet.py +++ b/tests/test_vnet.py @@ -3347,6 +3347,19 @@ def test_vnet_orch_34(self, dvs, testlog): self.add_neighbor("Ethernet4", "9.1.0.1", "00:01:02:03:04:05") vnet_obj.fetch_exist_entries(dvs) + + # Recreating a local-only route must also recreate its custom BFD session, + # even though the directly connected next hop is reused. + create_vnet_routes(dvs, "100.100.1.1/32", vnet_name, '9.1.0.1', ep_monitor='9.1.0.1', primary='9.1.0.1', monitoring='custom_bfd', adv_prefix='100.100.1.1/32', check_directly_connected=True, rx_monitor_timer=100, tx_monitor_timer=100) + check_bfd_session(dvs, ['9.1.0.1']) + delete_vnet_routes(dvs, "100.100.1.1/32", vnet_name) + check_del_bfd_session(dvs, ['9.1.0.1']) + + create_vnet_routes(dvs, "100.100.1.1/32", vnet_name, '9.1.0.1', ep_monitor='9.1.0.1', primary='9.1.0.1', monitoring='custom_bfd', adv_prefix='100.100.1.1/32', check_directly_connected=True, rx_monitor_timer=100, tx_monitor_timer=100) + check_bfd_session(dvs, ['9.1.0.1']) + delete_vnet_routes(dvs, "100.100.1.1/32", vnet_name) + check_del_bfd_session(dvs, ['9.1.0.1']) + create_vnet_routes(dvs, "100.100.1.1/32", vnet_name, '9.1.0.1,9.1.0.2', ep_monitor='9.1.0.1,9.1.0.2', primary ='9.1.0.1', monitoring='custom_bfd', adv_prefix='100.100.1.1/32', check_directly_connected=True, rx_monitor_timer=100, tx_monitor_timer=100) # default monitor status is down, route should not be programmed in this status