Skip to content

Commit 8d7dc88

Browse files
authored
[202211][EVPN]Fixing nexthop group delete when multiple routes point to the nexthop group (#2753)
* [EVPN]Fixing nexthop group delete when multiple routes point to the nexthop
1 parent 4f514ad commit 8d7dc88

File tree

3 files changed

+63
-11
lines changed

3 files changed

+63
-11
lines changed

orchagent/routeorch.cpp

+24-10
Original file line numberDiff line numberDiff line change
@@ -2164,15 +2164,22 @@ bool RouteOrch::addRoutePost(const RouteBulkContext& ctx, const NextHopGroupKey
21642164
{
21652165
decreaseNextHopRefCount(it_route->second.nhg_key);
21662166
auto ol_nextHops = it_route->second.nhg_key;
2167-
if (ol_nextHops.getSize() > 1
2168-
&& m_syncdNextHopGroups[ol_nextHops].ref_count == 0)
2167+
if (ol_nextHops.getSize() > 1)
21692168
{
2170-
m_bulkNhgReducedRefCnt.emplace(ol_nextHops, 0);
2169+
if (m_syncdNextHopGroups[ol_nextHops].ref_count == 0)
2170+
{
2171+
SWSS_LOG_NOTICE("Update Nexthop Group %s", ol_nextHops.to_string().c_str());
2172+
m_bulkNhgReducedRefCnt.emplace(ol_nextHops, 0);
2173+
}
21712174
}
21722175
else if (ol_nextHops.is_overlay_nexthop())
21732176
{
2174-
SWSS_LOG_NOTICE("Update overlay Nexthop %s", ol_nextHops.to_string().c_str());
2175-
m_bulkNhgReducedRefCnt.emplace(ol_nextHops, vrf_id);
2177+
const NextHopKey& nexthop = *it_route->second.nhg_key.getNextHops().begin();
2178+
if (m_neighOrch->getNextHopRefCount(nexthop) == 0)
2179+
{
2180+
SWSS_LOG_NOTICE("Update overlay Nexthop %s", ol_nextHops.to_string().c_str());
2181+
m_bulkNhgReducedRefCnt.emplace(ol_nextHops, vrf_id);
2182+
}
21762183
}
21772184
else if (ol_nextHops.is_srv6_nexthop())
21782185
{
@@ -2403,15 +2410,22 @@ bool RouteOrch::removeRoutePost(const RouteBulkContext& ctx)
24032410

24042411
auto ol_nextHops = it_route->second.nhg_key;
24052412

2406-
if (it_route->second.nhg_key.getSize() > 1
2407-
&& m_syncdNextHopGroups[it_route->second.nhg_key].ref_count == 0)
2413+
if (it_route->second.nhg_key.getSize() > 1)
24082414
{
2409-
m_bulkNhgReducedRefCnt.emplace(it_route->second.nhg_key, 0);
2415+
if (m_syncdNextHopGroups[it_route->second.nhg_key].ref_count == 0)
2416+
{
2417+
SWSS_LOG_NOTICE("Remove Nexthop Group %s", ol_nextHops.to_string().c_str());
2418+
m_bulkNhgReducedRefCnt.emplace(it_route->second.nhg_key, 0);
2419+
}
24102420
}
24112421
else if (ol_nextHops.is_overlay_nexthop())
24122422
{
2413-
SWSS_LOG_NOTICE("Remove overlay Nexthop %s", ol_nextHops.to_string().c_str());
2414-
m_bulkNhgReducedRefCnt.emplace(ol_nextHops, vrf_id);
2423+
const NextHopKey& nexthop = *it_route->second.nhg_key.getNextHops().begin();
2424+
if (m_neighOrch->getNextHopRefCount(nexthop) == 0)
2425+
{
2426+
SWSS_LOG_NOTICE("Remove overlay Nexthop %s", ol_nextHops.to_string().c_str());
2427+
m_bulkNhgReducedRefCnt.emplace(ol_nextHops, vrf_id);
2428+
}
24152429
}
24162430
/*
24172431
* Additionally check if the NH has label and its ref count == 0, then

tests/evpn_tunnel.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,7 @@ def check_del_vrf_routes(self, dvs, prefix, vrf_name):
11561156
assert found_route
11571157

11581158
self.helper.check_deleted_object(asic_db, self.ASIC_ROUTE_ENTRY, self.route_id[vrf_name + ":" + prefix])
1159-
self.route_id.clear()
1159+
del self.route_id[vrf_name + ":" + prefix]
11601160

11611161
return True
11621162

tests/test_evpn_l3_vxlan.py

+38
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,44 @@ def test_tunnel_ipv4_routes(self, dvs, testlog):
309309
vxlan_obj.check_vrf_routes_ecmp_nexthop_grp_del(dvs, 2)
310310
vxlan_obj.check_del_vrf_routes(dvs, "80.80.1.0/24", 'Vrf-RED')
311311

312+
print ("\n\nTest VRF IPv4 Multiple Route with ECMP Tunnel Nexthop Add and Delete")
313+
vxlan_obj.fetch_exist_entries(dvs)
314+
315+
ecmp_nexthop_attr = [
316+
("nexthop", "7.7.7.7,8.8.8.8"),
317+
("ifname", "Vlan100,Vlan100"),
318+
("vni_label", "1000,1000"),
319+
("router_mac", "00:11:11:11:11:11,00:22:22:22:22:22"),
320+
]
321+
322+
print ("\tTest VRF IPv4 Multiple Route with ECMP Tunnel Nexthop [7.7.7.7 , 8.8.8.8] Add")
323+
vxlan_obj.create_vrf_route_ecmp(dvs, "80.80.1.0/24", 'Vrf-RED', ecmp_nexthop_attr)
324+
325+
nh_count = 2
326+
ecmp_nhid_list = vxlan_obj.check_vrf_routes_ecmp(dvs, "80.80.1.0/24", 'Vrf-RED', tunnel_name, nh_count)
327+
assert nh_count == len(ecmp_nhid_list)
328+
vxlan_obj.check_add_tunnel_nexthop(dvs, ecmp_nhid_list[0], '7.7.7.7', tunnel_name, '00:11:11:11:11:11', '1000')
329+
vxlan_obj.check_add_tunnel_nexthop(dvs, ecmp_nhid_list[1], '8.8.8.8', tunnel_name, '00:22:22:22:22:22', '1000')
330+
331+
nh_count = 2
332+
vxlan_obj.create_vrf_route_ecmp(dvs, "90.90.1.0/24", 'Vrf-RED', ecmp_nexthop_attr)
333+
ecmp_nhid_list = vxlan_obj.check_vrf_routes_ecmp(dvs, "90.90.1.0/24", 'Vrf-RED', tunnel_name, nh_count)
334+
assert nh_count == len(ecmp_nhid_list)
335+
vxlan_obj.check_add_tunnel_nexthop(dvs, ecmp_nhid_list[0], '7.7.7.7', tunnel_name, '00:11:11:11:11:11', '1000')
336+
vxlan_obj.check_add_tunnel_nexthop(dvs, ecmp_nhid_list[1], '8.8.8.8', tunnel_name, '00:22:22:22:22:22', '1000')
337+
338+
print ("\tTest VRF IPv4 Multiple Route with ECMP Tunnel Nexthop [7.7.7.7 , 8.8.8.8] Delete")
339+
vxlan_obj.fetch_exist_entries(dvs)
340+
vxlan_obj.delete_vrf_route(dvs, "80.80.1.0/24", 'Vrf-RED')
341+
vxlan_obj.check_del_vrf_routes(dvs, "80.80.1.0/24", 'Vrf-RED')
342+
vxlan_obj.fetch_exist_entries(dvs)
343+
vxlan_obj.delete_vrf_route(dvs, "90.90.1.0/24", 'Vrf-RED')
344+
vxlan_obj.check_del_vrf_routes(dvs, "90.90.1.0/24", 'Vrf-RED')
345+
helper.check_deleted_object(self.adb, vxlan_obj.ASIC_NEXT_HOP, ecmp_nhid_list[0])
346+
helper.check_deleted_object(self.adb, vxlan_obj.ASIC_NEXT_HOP, ecmp_nhid_list[1])
347+
348+
vxlan_obj.check_vrf_routes_ecmp_nexthop_grp_del(dvs, 2)
349+
312350
print ("\n\nTest VRF IPv4 Route with Tunnel Nexthop update from non-ECMP to ECMP")
313351
print ("\tTest VRF IPv4 Route with Tunnel Nexthop 7.7.7.7 Add")
314352
vxlan_obj.fetch_exist_entries(dvs)

0 commit comments

Comments
 (0)