Skip to content

Commit 6902a98

Browse files
lolyuyxieca
authored andcommitted
[muxorch] Skip programming SoC IP kernel tunnel route (#2557)
What I did Let mux orch skip adding kernel tunnel routes for SoC IPs. Signed-off-by: Longxiang Lyu [email protected] Why I did it Please refer to sonic-net/SONiC#1132 for more details. How I verified it Add unittest. Signed-off-by: Longxiang Lyu <[email protected]>
1 parent 8a86404 commit 6902a98

File tree

3 files changed

+91
-31
lines changed

3 files changed

+91
-31
lines changed

orchagent/muxorch.cpp

+33-18
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,8 @@ static bool remove_nh_tunnel(sai_object_id_t nh_id, IpAddress& ipAddr)
359359
return true;
360360
}
361361

362-
MuxCable::MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip, std::set<IpAddress> skip_neighbors)
363-
:mux_name_(name), srv_ip4_(srv_ip4), srv_ip6_(srv_ip6), peer_ip4_(peer_ip), skip_neighbors_(skip_neighbors)
362+
MuxCable::MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip)
363+
:mux_name_(name), srv_ip4_(srv_ip4), srv_ip6_(srv_ip6), peer_ip4_(peer_ip)
364364
{
365365
mux_orch_ = gDirectory.get<MuxOrch*>();
366366
mux_cb_orch_ = gDirectory.get<MuxCableOrch*>();
@@ -549,11 +549,6 @@ bool MuxCable::nbrHandler(bool enable, bool update_rt)
549549
void MuxCable::updateNeighbor(NextHopKey nh, bool add)
550550
{
551551
sai_object_id_t tnh = mux_orch_->getNextHopTunnelId(MUX_TUNNEL, peer_ip4_);
552-
if (add && skip_neighbors_.find(nh.ip_address) != skip_neighbors_.end())
553-
{
554-
SWSS_LOG_INFO("Skip update neighbor %s on %s", nh.ip_address.to_string().c_str(), nh.alias.c_str());
555-
return;
556-
}
557552
nbr_handler_->update(nh, tnh, add, state_);
558553
if (add)
559554
{
@@ -570,7 +565,6 @@ void MuxNbrHandler::update(NextHopKey nh, sai_object_id_t tunnelId, bool add, Mu
570565
SWSS_LOG_INFO("Neigh %s on %s, add %d, state %d",
571566
nh.ip_address.to_string().c_str(), nh.alias.c_str(), add, state);
572567

573-
MuxCableOrch* mux_cb_orch = gDirectory.get<MuxCableOrch*>();
574568
IpPrefix pfx = nh.ip_address.to_string();
575569

576570
if (add)
@@ -597,7 +591,7 @@ void MuxNbrHandler::update(NextHopKey nh, sai_object_id_t tunnelId, bool add, Mu
597591
case MuxState::MUX_STATE_STANDBY:
598592
neighbors_[nh.ip_address] = tunnelId;
599593
gNeighOrch->disableNeighbor(nh);
600-
mux_cb_orch->addTunnelRoute(nh);
594+
updateTunnelRoute(nh, true);
601595
create_route(pfx, tunnelId);
602596
break;
603597
default:
@@ -612,7 +606,7 @@ void MuxNbrHandler::update(NextHopKey nh, sai_object_id_t tunnelId, bool add, Mu
612606
if (state == MuxState::MUX_STATE_STANDBY)
613607
{
614608
remove_route(pfx);
615-
mux_cb_orch->removeTunnelRoute(nh);
609+
updateTunnelRoute(nh, false);
616610
}
617611
neighbors_.erase(nh.ip_address);
618612
}
@@ -621,7 +615,6 @@ void MuxNbrHandler::update(NextHopKey nh, sai_object_id_t tunnelId, bool add, Mu
621615
bool MuxNbrHandler::enable(bool update_rt)
622616
{
623617
NeighborEntry neigh;
624-
MuxCableOrch* mux_cb_orch = gDirectory.get<MuxCableOrch*>();
625618

626619
auto it = neighbors_.begin();
627620
while (it != neighbors_.end())
@@ -677,7 +670,7 @@ bool MuxNbrHandler::enable(bool update_rt)
677670
{
678671
return false;
679672
}
680-
mux_cb_orch->removeTunnelRoute(nh_key);
673+
updateTunnelRoute(nh_key, false);
681674
}
682675

683676
it++;
@@ -689,7 +682,6 @@ bool MuxNbrHandler::enable(bool update_rt)
689682
bool MuxNbrHandler::disable(sai_object_id_t tnh)
690683
{
691684
NeighborEntry neigh;
692-
MuxCableOrch* mux_cb_orch = gDirectory.get<MuxCableOrch*>();
693685

694686
auto it = neighbors_.begin();
695687
while (it != neighbors_.end())
@@ -735,7 +727,7 @@ bool MuxNbrHandler::disable(sai_object_id_t tnh)
735727
return false;
736728
}
737729

738-
mux_cb_orch->addTunnelRoute(nh_key);
730+
updateTunnelRoute(nh_key, true);
739731

740732
IpPrefix pfx = it->first.to_string();
741733
if (create_route(pfx, it->second) != SAI_STATUS_SUCCESS)
@@ -760,6 +752,27 @@ sai_object_id_t MuxNbrHandler::getNextHopId(const NextHopKey nhKey)
760752
return SAI_NULL_OBJECT_ID;
761753
}
762754

755+
void MuxNbrHandler::updateTunnelRoute(NextHopKey nh, bool add)
756+
{
757+
MuxOrch* mux_orch = gDirectory.get<MuxOrch*>();
758+
MuxCableOrch* mux_cb_orch = gDirectory.get<MuxCableOrch*>();
759+
760+
if (mux_orch->isSkipNeighbor(nh.ip_address))
761+
{
762+
SWSS_LOG_INFO("Skip updating neighbor %s, add %d", nh.ip_address.to_string().c_str(), add);
763+
return;
764+
}
765+
766+
if (add)
767+
{
768+
mux_cb_orch->addTunnelRoute(nh);
769+
}
770+
else
771+
{
772+
mux_cb_orch->removeTunnelRoute(nh);
773+
}
774+
}
775+
763776
std::map<std::string, AclTable> MuxAclHandler::acl_table_;
764777

765778
MuxAclHandler::MuxAclHandler(sai_object_id_t port, string alias)
@@ -977,7 +990,7 @@ bool MuxOrch::isNeighborActive(const IpAddress& nbr, const MacAddress& mac, stri
977990

978991
if (ptr)
979992
{
980-
return (ptr->isActive() || ptr->isSkipNeighbor(nbr));
993+
return ptr->isActive();
981994
}
982995

983996
string port;
@@ -991,15 +1004,15 @@ bool MuxOrch::isNeighborActive(const IpAddress& nbr, const MacAddress& mac, stri
9911004
if (!port.empty() && isMuxExists(port))
9921005
{
9931006
MuxCable* ptr = getMuxCable(port);
994-
return (ptr->isActive() || ptr->isSkipNeighbor(nbr));
1007+
return ptr->isActive();
9951008
}
9961009

9971010
NextHopKey nh_key = NextHopKey(nbr, alias);
9981011
string curr_port = getNexthopMuxName(nh_key);
9991012
if (port.empty() && !curr_port.empty() && isMuxExists(curr_port))
10001013
{
10011014
MuxCable* ptr = getMuxCable(curr_port);
1002-
return (ptr->isActive() || ptr->isSkipNeighbor(nbr));
1015+
return ptr->isActive();
10031016
}
10041017

10051018
return true;
@@ -1295,7 +1308,8 @@ bool MuxOrch::handleMuxCfg(const Request& request)
12951308
}
12961309

12971310
mux_cable_tb_[port_name] = std::make_unique<MuxCable>
1298-
(MuxCable(port_name, srv_ip, srv_ip6, mux_peer_switch_, skip_neighbors));
1311+
(MuxCable(port_name, srv_ip, srv_ip6, mux_peer_switch_));
1312+
addSkipNeighbors(skip_neighbors);
12991313

13001314
SWSS_LOG_NOTICE("Mux entry for port '%s' was added", port_name.c_str());
13011315
}
@@ -1307,6 +1321,7 @@ bool MuxOrch::handleMuxCfg(const Request& request)
13071321
return true;
13081322
}
13091323

1324+
removeSkipNeighbors(skip_neighbors);
13101325
mux_cable_tb_.erase(port_name);
13111326

13121327
SWSS_LOG_NOTICE("Mux cable for port '%s' was removed", port_name.c_str());

orchagent/muxorch.h

+23-7
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class MuxNbrHandler
6767

6868
sai_object_id_t getNextHopId(const NextHopKey);
6969

70+
private:
71+
inline void updateTunnelRoute(NextHopKey, bool = true);
72+
7073
private:
7174
MuxNeighbor neighbors_;
7275
string alias_;
@@ -76,7 +79,7 @@ class MuxNbrHandler
7679
class MuxCable
7780
{
7881
public:
79-
MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip, std::set<IpAddress> skip_neighbors);
82+
MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip);
8083

8184
bool isActive() const
8285
{
@@ -97,10 +100,6 @@ class MuxCable
97100
{
98101
return nbr_handler_->getNextHopId(nh);
99102
}
100-
bool isSkipNeighbor(const IpAddress& nbr)
101-
{
102-
return (skip_neighbors_.find(nbr) != skip_neighbors_.end());
103-
}
104103

105104
private:
106105
bool stateActive();
@@ -119,8 +118,6 @@ class MuxCable
119118
IpPrefix srv_ip4_, srv_ip6_;
120119
IpAddress peer_ip4_;
121120

122-
std::set<IpAddress> skip_neighbors_;
123-
124121
MuxOrch *mux_orch_;
125122
MuxCableOrch *mux_cb_orch_;
126123
MuxStateOrch *mux_state_orch_;
@@ -180,6 +177,11 @@ class MuxOrch : public Orch2, public Observer, public Subject
180177
return mux_cable_tb_.at(portName).get();
181178
}
182179

180+
bool isSkipNeighbor(const IpAddress& nbr)
181+
{
182+
return (skip_neighbors_.find(nbr) != skip_neighbors_.end());
183+
}
184+
183185
MuxCable* findMuxCableInSubnet(IpAddress);
184186
bool isNeighborActive(const IpAddress&, const MacAddress&, string&);
185187
void update(SubjectType, void *);
@@ -212,6 +214,19 @@ class MuxOrch : public Orch2, public Observer, public Subject
212214
void createStandaloneTunnelRoute(IpAddress neighborIp);
213215
void removeStandaloneTunnelRoute(IpAddress neighborIp);
214216

217+
void addSkipNeighbors(const std::set<IpAddress> &neighbors)
218+
{
219+
skip_neighbors_.insert(neighbors.begin(), neighbors.end());
220+
}
221+
222+
void removeSkipNeighbors(const std::set<IpAddress> &neighbors)
223+
{
224+
for (const IpAddress &neighbor : neighbors)
225+
{
226+
skip_neighbors_.erase(neighbor);
227+
}
228+
}
229+
215230
IpAddress mux_peer_switch_ = 0x0;
216231
sai_object_id_t mux_tunnel_id_ = SAI_NULL_OBJECT_ID;
217232

@@ -227,6 +242,7 @@ class MuxOrch : public Orch2, public Observer, public Subject
227242

228243
MuxCfgRequest request_;
229244
std::set<IpAddress> standalone_tunnel_neighbors_;
245+
std::set<IpAddress> skip_neighbors_;
230246
};
231247

232248
const request_description_t mux_cable_request_description = {

tests/test_mux.py

+35-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class TestMuxTunnelBase():
1616
APP_MUX_CABLE = "MUX_CABLE_TABLE"
1717
APP_NEIGH_TABLE = "NEIGH_TABLE"
1818
APP_TUNNEL_DECAP_TABLE_NAME = "TUNNEL_DECAP_TABLE"
19+
APP_TUNNEL_ROUTE_TABLE_NAME = "TUNNEL_ROUTE_TABLE"
1920
ASIC_TUNNEL_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL"
2021
ASIC_TUNNEL_TERM_ENTRIES = "ASIC_STATE:SAI_OBJECT_TYPE_TUNNEL_TERM_TABLE_ENTRY"
2122
ASIC_RIF_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE"
@@ -166,6 +167,14 @@ def get_vlan_rif_oid(self, asicdb):
166167

167168
return vlan_oid
168169

170+
def check_tunnel_route_in_app_db(self, dvs, destinations, expected=True):
171+
appdb = dvs.get_app_db()
172+
173+
if expected:
174+
appdb.wait_for_matching_keys(self.APP_TUNNEL_ROUTE_TABLE_NAME, destinations)
175+
else:
176+
appdb.wait_for_deleted_keys(self.APP_TUNNEL_ROUTE_TABLE_NAME, destinations)
177+
169178
def check_neigh_in_asic_db(self, asicdb, ip, expected=True):
170179
rif_oid = self.get_vlan_rif_oid(asicdb)
171180
switch_oid = self.get_switch_oid(asicdb)
@@ -275,9 +284,6 @@ def create_and_test_neighbor(self, confdb, appdb, asicdb, dvs, dvs_route):
275284
self.add_neighbor(dvs, self.SERV1_IPV6, "00:00:00:00:00:01")
276285
srv1_v6 = self.check_neigh_in_asic_db(asicdb, self.SERV1_IPV6)
277286

278-
self.add_neighbor(dvs, self.SERV1_SOC_IPV4, "00:00:00:00:00:01")
279-
self.check_neigh_in_asic_db(asicdb, self.SERV1_SOC_IPV4)
280-
281287
existing_keys = asicdb.get_keys(self.ASIC_NEIGH_TABLE)
282288

283289
self.add_neighbor(dvs, self.SERV2_IPV4, "00:00:00:00:00:02")
@@ -291,7 +297,7 @@ def create_and_test_neighbor(self, confdb, appdb, asicdb, dvs, dvs_route):
291297
)
292298

293299
# The first standby route also creates as tunnel Nexthop
294-
self.check_tnl_nexthop_in_asic_db(asicdb, 4)
300+
self.check_tnl_nexthop_in_asic_db(asicdb, 3)
295301

296302
# Change state to Standby. This will delete Neigh and add Route
297303
self.set_mux_state(appdb, "Ethernet0", "standby")
@@ -301,8 +307,6 @@ def create_and_test_neighbor(self, confdb, appdb, asicdb, dvs, dvs_route):
301307
dvs_route.check_asicdb_route_entries(
302308
[self.SERV1_IPV4+self.IPV4_MASK, self.SERV1_IPV6+self.IPV6_MASK]
303309
)
304-
self.check_neigh_in_asic_db(asicdb, self.SERV1_SOC_IPV4)
305-
dvs_route.check_asicdb_deleted_route_entries([self.SERV1_SOC_IPV4+self.IPV4_MASK])
306310

307311
# Change state to Active. This will add Neigh and delete Route
308312
self.set_mux_state(appdb, "Ethernet4", "active")
@@ -313,6 +317,26 @@ def create_and_test_neighbor(self, confdb, appdb, asicdb, dvs, dvs_route):
313317
self.check_neigh_in_asic_db(asicdb, self.SERV2_IPV4)
314318
self.check_neigh_in_asic_db(asicdb, self.SERV2_IPV6)
315319

320+
def create_and_test_soc(self, appdb, asicdb, dvs, dvs_route):
321+
322+
self.set_mux_state(appdb, "Ethernet0", "active")
323+
324+
self.add_fdb(dvs, "Ethernet0", "00-00-00-00-00-01")
325+
self.add_neighbor(dvs, self.SERV1_SOC_IPV4, "00:00:00:00:00:01")
326+
327+
time.sleep(1)
328+
329+
srv1_soc_v4 = self.check_neigh_in_asic_db(asicdb, self.SERV1_SOC_IPV4)
330+
self.check_tunnel_route_in_app_db(dvs, [self.SERV1_SOC_IPV4+self.IPV4_MASK], expected=False)
331+
332+
self.set_mux_state(appdb, "Ethernet0", "standby")
333+
334+
asicdb.wait_for_deleted_entry(self.ASIC_NEIGH_TABLE, srv1_soc_v4)
335+
dvs_route.check_asicdb_route_entries(
336+
[self.SERV1_SOC_IPV4+self.IPV4_MASK]
337+
)
338+
self.check_tunnel_route_in_app_db(dvs, [self.SERV1_SOC_IPV4+self.IPV4_MASK], expected=False)
339+
316340
marker = dvs.add_log_marker()
317341

318342
self.set_mux_state(appdb, "Ethernet0", "active")
@@ -1122,6 +1146,11 @@ def test_neighbor_miss_no_peer(
11221146
for ip in test_ips:
11231147
self.check_neighbor_state(dvs, dvs_route, ip, expect_route=False)
11241148

1149+
def test_soc_ip(self, dvs, dvs_route, setup_vlan, setup_mux_cable, testlog):
1150+
appdb = swsscommon.DBConnector(swsscommon.APPL_DB, dvs.redis_sock, 0)
1151+
asicdb = dvs.get_asic_db()
1152+
1153+
self.create_and_test_soc(appdb, asicdb, dvs, dvs_route)
11251154

11261155
# Add Dummy always-pass test at end as workaroud
11271156
# for issue when Flaky fail on final test it invokes module tear-down before retrying

0 commit comments

Comments
 (0)