Skip to content

Commit adb5268

Browse files
committed
[routeorch] moving mux updateroute to occur after m_syncdRoutes is set
and various testing fixes Signed-off-by: Nikola Dancejic <ndancejic@microsoft.com>
1 parent cd85753 commit adb5268

File tree

3 files changed

+52
-53
lines changed

3 files changed

+52
-53
lines changed

orchagent/muxorch.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,25 +1002,26 @@ void MuxOrch::updateRoute(const IpPrefix &pfx)
10021002
// If we find an active nexthop neighbor, program it to hardware.
10031003
SWSS_LOG_INFO("enabling nexthop: %s", nh->to_string().c_str());
10041004
gRouteOrch->validnexthopinNextHopGroup(*nh, nh_count);
1005-
gNeighOrch->increaseNextHopRefCount(*nh, nh_count);
10061005
active_neighbor_found = true;
10071006
}
10081007
else
10091008
{
10101009
SWSS_LOG_INFO("disabling nexthop: %s", nh->to_string().c_str());
10111010
gRouteOrch->invalidnexthopinNextHopGroup(*nh, nh_count);
1012-
gNeighOrch->decreaseNextHopRefCount(*nh, nh_count);
10131011
}
10141012
}
10151013

1016-
// No active neighbor was found. program tunnel route instead
1017-
auto tun = getNextHopTunnelId(MUX_TUNNEL, mux_peer_switch_);
1014+
if (!active_neighbor_found)
1015+
{
1016+
// No active neighbor was found. program tunnel route instead
1017+
auto tun = getNextHopTunnelId(MUX_TUNNEL, mux_peer_switch_);
10181018

1019-
SWSS_LOG_NOTICE("No Active neighbors found, setting route %s to point to tunnel: %" PRIx64 "",
1020-
pfx.getIp().to_string().c_str(), tun);
1019+
SWSS_LOG_NOTICE("No Active neighbors found, setting route %s to point to tunnel: %" PRIx64 "",
1020+
pfx.getIp().to_string().c_str(), tun);
10211021

1022-
IpPrefix route_prefix = pfx.getIp().to_string();
1023-
create_route(route_prefix, tun);
1022+
IpPrefix route_prefix = pfx.getIp().to_string();
1023+
create_route(route_prefix, tun);
1024+
}
10241025
}
10251026
}
10261027

orchagent/routeorch.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2232,6 +2232,18 @@ bool RouteOrch::addRoutePost(const RouteBulkContext& ctx, const NextHopGroupKey
22322232
}
22332233
}
22342234

2235+
if (ipPrefix.isDefaultRoute())
2236+
{
2237+
updateDefRouteState(ipPrefix.to_string(), true);
2238+
}
2239+
2240+
if (it_route == m_syncdRoutes.at(vrf_id).end())
2241+
{
2242+
gFlowCounterRouteOrch->handleRouteAdd(vrf_id, ipPrefix);
2243+
}
2244+
2245+
m_syncdRoutes[vrf_id][ipPrefix] = RouteNhg(nextHops, ctx.nhg_index);
2246+
22352247
MuxOrch* mux_orch = gDirectory.get<MuxOrch*>();
22362248
if (mux_orch->isMuxNexthops(nextHops))
22372249
{
@@ -2249,18 +2261,6 @@ bool RouteOrch::addRoutePost(const RouteBulkContext& ctx, const NextHopGroupKey
22492261
mux_orch->updateRoute(ipPrefix);
22502262
}
22512263

2252-
if (ipPrefix.isDefaultRoute())
2253-
{
2254-
updateDefRouteState(ipPrefix.to_string(), true);
2255-
}
2256-
2257-
if (it_route == m_syncdRoutes.at(vrf_id).end())
2258-
{
2259-
gFlowCounterRouteOrch->handleRouteAdd(vrf_id, ipPrefix);
2260-
}
2261-
2262-
m_syncdRoutes[vrf_id][ipPrefix] = RouteNhg(nextHops, ctx.nhg_index);
2263-
22642264
notifyNextHopChangeObservers(vrf_id, ipPrefix, nextHops, true);
22652265

22662266
/*

tests/test_mux.py

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class TestMuxTunnelBase():
2323
ASIC_VRF_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_VIRTUAL_ROUTER"
2424
ASIC_NEIGH_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_NEIGHBOR_ENTRY"
2525
ASIC_NEXTHOP_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP"
26+
ASIC_NHG_MEMBER_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER"
2627
ASIC_ROUTE_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_ROUTE_ENTRY"
2728
ASIC_FDB_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY"
2829
ASIC_SWITCH_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH"
@@ -242,6 +243,26 @@ def check_nexthop_in_asic_db(self, asicdb, key, standby=False):
242243
else:
243244
assert (nhid != tunnel_nh_id)
244245

246+
def check_exact_nexthops_in_asic_group(self, asicdb, rtkey, nexthops):
247+
route_fvs = asicdb.get_entry(self.ASIC_ROUTE_TABLE, rtkey)
248+
nhg_id = route_fvs["SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID"]
249+
250+
asicdb.wait_for_entry("ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP_GROUP", nhg_id)
251+
252+
nexthop_oids = []
253+
for nexthop in nexthops:
254+
nexthop_oid = self.get_nexthop_oid(nexthop, asicdb)
255+
if nexthop_oid == '':
256+
assert False
257+
nexthop_oids.append(nexthop_oid)
258+
259+
nhg_keys = asicdb.get_keys(self.ASIC_NHG_MEMBER_TABLE)
260+
for key in nhg_keys:
261+
entry = asicdb.get_entry(self.ASIC_NHG_MEMBER_TABLE, key)
262+
if nhg_id != entry["SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID"]:
263+
continue
264+
assert nexthop_oids.__contains__(entry["SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID"])
265+
245266
def check_nexthop_group_in_asic_db(self, asicdb, key, num_tnl_nh=0):
246267

247268
fvs = asicdb.get_entry("ASIC_STATE:SAI_OBJECT_TYPE_ROUTE_ENTRY", key)
@@ -561,11 +582,6 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
561582
self.add_neighbor(dvs, NH1_ipv6, mac0)
562583
self.add_neighbor(dvs, NH2_ipv6, mac4)
563584

564-
NH1_oid = self.get_nexthop_oid(NH1, asicdb)
565-
NH2_oid = self.get_nexthop_oid(NH2, asicdb)
566-
NH1_ipv6_oid = self.get_nexthop_oid(NH1_ipv6, asicdb)
567-
NH2_ipv6_oid = self.get_nexthop_oid(NH2_ipv6, asicdb)
568-
569585
# program route with 1 neighbor
570586
ps = swsscommon.ProducerStateTable(apdb.db_connection, "ROUTE_TABLE")
571587
fvs = swsscommon.FieldValuePairs(
@@ -588,20 +604,14 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
588604
rtkeys = dvs_route.check_asicdb_route_entries([route])
589605
rtkeys_ipv6 = dvs_route.check_asicdb_route_entries([route_ipv6])
590606

591-
route_oid = self.get_route_nexthop_oid(rtkeys[0], asicdb)
592-
route_ipv6_oid = self.get_route_nexthop_oid(rtkeys_ipv6[0], asicdb)
593-
594-
assert NH1_oid == route_oid
595-
assert NH1_ipv6_oid == route_ipv6_oid
607+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys[0], [NH1])
608+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys_ipv6[0], [NH1_ipv6])
596609

597610
# set first neighbor to standby
598611
self.set_mux_state(appdb, "Ethernet0", "standby")
599612

600-
route_oid = self.get_route_nexthop_oid(rtkeys[0], asicdb)
601-
route_ipv6_oid = self.get_route_nexthop_oid(rtkeys_ipv6[0], asicdb)
602-
603-
assert NH2_oid == route_oid
604-
assert NH2_ipv6_oid == route_ipv6_oid
613+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys[0], [NH2])
614+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys_ipv6[0], [NH2_ipv6])
605615

606616
# set second neighbor to standby
607617
self.set_mux_state(appdb, "Ethernet4", "standby")
@@ -615,26 +625,14 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
615625
# set second neighbor to active
616626
self.set_mux_state(appdb, "Ethernet4", "active")
617627

618-
NH2_oid = self.get_nexthop_oid(NH2, asicdb)
619-
NH2_ipv6_oid = self.get_nexthop_oid(NH2_ipv6, asicdb)
620-
621-
route_oid = self.get_route_nexthop_oid(rtkeys[0], asicdb)
622-
route_ipv6_oid = self.get_route_nexthop_oid(rtkeys_ipv6[0], asicdb)
623-
624-
assert NH2_oid == route_oid
625-
assert NH2_ipv6_oid == route_ipv6_oid
628+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys[0], [NH2])
629+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys_ipv6[0], [NH2_ipv6])
626630

627631
# set first neighbor to active
628632
self.set_mux_state(appdb, "Ethernet0", "active")
629633

630-
NH1_oid = self.get_nexthop_oid(NH1, asicdb)
631-
NH1_ipv6_oid = self.get_nexthop_oid(NH1_ipv6, asicdb)
632-
633-
route_oid = self.get_route_nexthop_oid(rtkeys[0], asicdb)
634-
route_ipv6_oid = self.get_route_nexthop_oid(rtkeys_ipv6[0], asicdb)
635-
636-
assert NH1_oid == route_oid
637-
assert NH1_ipv6_oid == route_ipv6_oid
634+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys[0], [NH1])
635+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys_ipv6[0], [NH1_ipv6])
638636

639637
# Cleanup
640638
ps._del(route)
@@ -681,8 +679,8 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
681679
rtkeys_ipv6 = dvs_route.check_asicdb_route_entries([route_ipv6])
682680

683681
# Check for nexthop group - should not be deleted by update_Route()
684-
self.check_nexthop_group_in_asic_db(asicdb, rtkeys[0])
685-
self.check_nexthop_group_in_asic_db(asicdb, rtkeys_ipv6[0])
682+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys[0], [non_mux, non_mux2])
683+
self.check_exact_nexthops_in_asic_group(asicdb, rtkeys_ipv6[0], [non_mux_ipv6, non_mux2_ipv6])
686684

687685
# Cleanup
688686
ps._del(route)

0 commit comments

Comments
 (0)