Skip to content

Commit 577f696

Browse files
authored
[muxorch] Skip programming ACL for standby active-active ports (sonic-net#2569)
What I did Skip adding ACL for active-active ports. Why I did it Please refer to the HLD for more details: sonic-net/SONiC#1180 Signed-off-by: Longxiang Lyu <[email protected]>
1 parent 242ee11 commit 577f696

File tree

3 files changed

+58
-23
lines changed

3 files changed

+58
-23
lines changed

orchagent/muxorch.cpp

+18-4
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)
363-
:mux_name_(name), srv_ip4_(srv_ip4), srv_ip6_(srv_ip6), peer_ip4_(peer_ip)
362+
MuxCable::MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip, MuxCableType cable_type)
363+
:mux_name_(name), srv_ip4_(srv_ip4), srv_ip6_(srv_ip6), peer_ip4_(peer_ip), cable_type_(cable_type)
364364
{
365365
mux_orch_ = gDirectory.get<MuxOrch*>();
366366
mux_cb_orch_ = gDirectory.get<MuxCableOrch*>();
@@ -503,6 +503,11 @@ string MuxCable::getState()
503503

504504
bool MuxCable::aclHandler(sai_object_id_t port, string alias, bool add)
505505
{
506+
if (cable_type_ == MuxCableType::ACTIVE_ACTIVE)
507+
{
508+
SWSS_LOG_INFO("Skip programming ACL for mux port %s, cable type %d, add %d", alias.c_str(), cable_type_, add);
509+
return true;
510+
}
506511
if (add)
507512
{
508513
acl_handler_ = make_shared<MuxAclHandler>(port, alias);
@@ -1272,6 +1277,7 @@ bool MuxOrch::handleMuxCfg(const Request& request)
12721277
auto srv_ip = request.getAttrIpPrefix("server_ipv4");
12731278
auto srv_ip6 = request.getAttrIpPrefix("server_ipv6");
12741279

1280+
MuxCableType cable_type = MuxCableType::ACTIVE_STANDBY;
12751281
std::set<IpAddress> skip_neighbors;
12761282

12771283
const auto& port_name = request.getKeyString(0);
@@ -1291,6 +1297,14 @@ bool MuxOrch::handleMuxCfg(const Request& request)
12911297
SWSS_LOG_NOTICE("%s: %s was added to ignored neighbor list", port_name.c_str(), soc_ip6.getIp().to_string().c_str());
12921298
skip_neighbors.insert(soc_ip6.getIp());
12931299
}
1300+
else if (name == "cable_type")
1301+
{
1302+
auto cable_type_str = request.getAttrString("cable_type");
1303+
if (cable_type_str == "active-active")
1304+
{
1305+
cable_type = MuxCableType::ACTIVE_ACTIVE;
1306+
}
1307+
}
12941308
}
12951309

12961310
if (op == SET_COMMAND)
@@ -1308,10 +1322,10 @@ bool MuxOrch::handleMuxCfg(const Request& request)
13081322
}
13091323

13101324
mux_cable_tb_[port_name] = std::make_unique<MuxCable>
1311-
(MuxCable(port_name, srv_ip, srv_ip6, mux_peer_switch_));
1325+
(MuxCable(port_name, srv_ip, srv_ip6, mux_peer_switch_, cable_type));
13121326
addSkipNeighbors(skip_neighbors);
13131327

1314-
SWSS_LOG_NOTICE("Mux entry for port '%s' was added", port_name.c_str());
1328+
SWSS_LOG_NOTICE("Mux entry for port '%s' was added, cable type %d", port_name.c_str(), cable_type);
13151329
}
13161330
else
13171331
{

orchagent/muxorch.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ enum MuxStateChange
2929
MUX_STATE_UNKNOWN_STATE
3030
};
3131

32+
enum MuxCableType
33+
{
34+
ACTIVE_STANDBY,
35+
ACTIVE_ACTIVE
36+
};
37+
3238
// Forward Declarations
3339
class MuxOrch;
3440
class MuxCableOrch;
@@ -79,7 +85,7 @@ class MuxNbrHandler
7985
class MuxCable
8086
{
8187
public:
82-
MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip);
88+
MuxCable(string name, IpPrefix& srv_ip4, IpPrefix& srv_ip6, IpAddress peer_ip, MuxCableType cable_type);
8389

8490
bool isActive() const
8591
{
@@ -110,6 +116,7 @@ class MuxCable
110116
bool nbrHandler(bool enable, bool update_routes = true);
111117

112118
string mux_name_;
119+
MuxCableType cable_type_;
113120

114121
MuxState state_ = MuxState::MUX_STATE_INIT;
115122
bool st_chg_in_progress_ = false;

tests/test_mux.py

+32-18
Original file line numberDiff line numberDiff line change
@@ -554,46 +554,54 @@ def create_and_test_acl(self, appdb, dvs_acl):
554554

555555
dvs_acl.verify_no_acl_rules()
556556

557-
# Set one mux port to standby, verify ACL rule with inport bitmap (1 port)
557+
# Set mux port in active-active cable type, no ACL rules programmed
558558
self.set_mux_state(appdb, "Ethernet0", "standby")
559-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet0"], dvs_acl)
559+
dvs_acl.verify_no_acl_rules()
560+
561+
# Set one mux port to standby, verify ACL rule with inport bitmap (1 port)
562+
self.set_mux_state(appdb, "Ethernet4", "standby")
563+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4"], dvs_acl)
560564
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
561565

562566
# Set two mux ports to standby, verify ACL rule with inport bitmap (2 ports)
563-
self.set_mux_state(appdb, "Ethernet4", "standby")
564-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet0", "Ethernet4"], dvs_acl)
567+
self.set_mux_state(appdb, "Ethernet8", "standby")
568+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4", "Ethernet8"], dvs_acl)
565569
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
566570

567-
# Set one mux port to active, verify ACL rule with inport bitmap (1 port)
568571
self.set_mux_state(appdb, "Ethernet0", "active")
569-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4"], dvs_acl)
572+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4", "Ethernet8"], dvs_acl)
570573
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
571574

572-
# Set last mux port to active, verify ACL rule is deleted
575+
# Set one mux port to active, verify ACL rule with inport bitmap (1 port)
573576
self.set_mux_state(appdb, "Ethernet4", "active")
577+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet8"], dvs_acl)
578+
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
579+
580+
# Set last mux port to active, verify ACL rule is deleted
581+
self.set_mux_state(appdb, "Ethernet8", "active")
574582
dvs_acl.verify_no_acl_rules()
575583

576584
# Set unknown state and verify the behavior as standby
577-
self.set_mux_state(appdb, "Ethernet0", "unknown")
578-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet0"], dvs_acl)
585+
self.set_mux_state(appdb, "Ethernet4", "unknown")
586+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4"], dvs_acl)
579587
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
580588

581589
# Verify change while setting unknown from active
582-
self.set_mux_state(appdb, "Ethernet4", "unknown")
583-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet0", "Ethernet4"], dvs_acl)
590+
self.set_mux_state(appdb, "Ethernet8", "unknown")
591+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4", "Ethernet8"], dvs_acl)
584592
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
585593

586-
self.set_mux_state(appdb, "Ethernet0", "active")
587-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4"], dvs_acl)
594+
self.set_mux_state(appdb, "Ethernet4", "active")
595+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet8"], dvs_acl)
588596
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
589597

590-
self.set_mux_state(appdb, "Ethernet0", "standby")
591-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet0", "Ethernet4"], dvs_acl)
598+
self.set_mux_state(appdb, "Ethernet4", "standby")
599+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4", "Ethernet8"], dvs_acl)
592600
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
593601

594602
# Verify no change while setting unknown from standby
595-
self.set_mux_state(appdb, "Ethernet0", "unknown")
596-
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet0", "Ethernet4"], dvs_acl)
603+
self.set_mux_state(appdb, "Ethernet4", "unknown")
604+
sai_qualifier = self.get_expected_sai_qualifiers(["Ethernet4", "Ethernet8"], dvs_acl)
597605
dvs_acl.verify_acl_rule(sai_qualifier, action="DROP", priority=self.ACL_PRIORITY)
598606

599607
def create_and_test_metrics(self, appdb, statedb):
@@ -1096,7 +1104,13 @@ def test_acl(self, dvs, dvs_acl, testlog):
10961104

10971105
appdb = swsscommon.DBConnector(swsscommon.APPL_DB, dvs.redis_sock, 0)
10981106

1099-
self.create_and_test_acl(appdb, dvs_acl)
1107+
try:
1108+
self.create_and_test_acl(appdb, dvs_acl)
1109+
finally:
1110+
self.set_mux_state(appdb, "Ethernet0", "active")
1111+
self.set_mux_state(appdb, "Ethernet4", "active")
1112+
self.set_mux_state(appdb, "Ethernet8", "active")
1113+
dvs_acl.verify_no_acl_rules()
11001114

11011115
def test_mux_metrics(self, dvs, testlog):
11021116
""" test metrics for mux state change """

0 commit comments

Comments
 (0)