diff --git a/orchagent/vnetorch.cpp b/orchagent/vnetorch.cpp index 6731fbb1a6..79b7a6563b 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 21cf97fa53..de77288fbd 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