Skip to content

Commit 456bbfe

Browse files
committed
Address review comments
Add validations to allow mixing on IPv4 and IPv fields in the same ACL rule. Fix cases in the logs.
1 parent f4062e8 commit 456bbfe

2 files changed

Lines changed: 59 additions & 2 deletions

File tree

orchagent/aclorch.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3109,7 +3109,7 @@ void AclOrch::init(vector<TableConnector>& connectors, PortsOrch *portOrch, Mirr
31093109
m_mirrorTableCapabilities[TABLE_TYPE_MIRROR] ? "yes" : "no");
31103110
SWSS_LOG_NOTICE(" TABLE_TYPE_MIRRORV6: %s",
31113111
m_mirrorTableCapabilities[TABLE_TYPE_MIRRORV6] ? "yes" : "no");
3112-
SWSS_LOG_NOTICE(" TABLE_TYPE_L3v4V6: Ingress [%s], Egress [%s]",
3112+
SWSS_LOG_NOTICE(" TABLE_TYPE_L3V4V6: Ingress [%s], Egress [%s]",
31133113
m_L3V4V6Capability[ACL_STAGE_INGRESS] ? "yes" : "no",
31143114
m_L3V4V6Capability[ACL_STAGE_EGRESS] ? "yes" : "no");
31153115

@@ -3248,6 +3248,7 @@ void AclOrch::initDefaultTableTypes()
32483248
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT))
32493249
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_L4_DST_PORT))
32503250
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_TCP_FLAGS))
3251+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_IN_PORTS))
32513252
.build()
32523253
);
32533254

@@ -4576,6 +4577,8 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
45764577
}
45774578
bool bHasTCPFlag = false;
45784579
bool bHasIPProtocol = false;
4580+
bool bHasIPV4 = false;
4581+
bool bHasIPV6 = false;
45794582
for (const auto& itr : kfvFieldsValues(t))
45804583
{
45814584
string attr_name = to_upper(fvField(itr));
@@ -4586,6 +4589,14 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
45864589
{
45874590
bHasTCPFlag = true;
45884591
}
4592+
if (attr_name == MATCH_SRC_IP || attr_name == MATCH_DST_IP)
4593+
{
4594+
bHasIPV4 = true;
4595+
}
4596+
if (attr_name == MATCH_SRC_IPV6 || attr_name == MATCH_DST_IPV6)
4597+
{
4598+
bHasIPV6 = true;
4599+
}
45894600
if (attr_name == MATCH_IP_PROTOCOL || attr_name == MATCH_NEXT_HEADER)
45904601
{
45914602
bHasIPProtocol = true;
@@ -4634,6 +4645,15 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
46344645
}
46354646
}
46364647

4648+
if (bHasIPV4 && bHasIPV6)
4649+
{
4650+
if (type == TABLE_TYPE_L3V4V6)
4651+
{
4652+
SWSS_LOG_ERROR("Rule '%s' is invalid since it has both v4 and v6 matchfields.", rule_id.c_str());
4653+
bAllAttributesOk = false;
4654+
}
4655+
}
4656+
46374657
// validate and create ACL rule
46384658
if (bAllAttributesOk && newRule->validate())
46394659
{

tests/test_acl_l3v4v6.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ def setup_teardown_neighbor(self, dvs):
3939

4040
def test_L3V4V6AclTableCreationDeletion(self, dvs_acl):
4141
try:
42-
# Create an L3V4V6 ACL table with default ACL actions
4342
dvs_acl.create_acl_table(L3V4V6_TABLE_NAME, L3V4V6_TABLE_TYPE, L3V4V6_BIND_PORTS)
4443

4544
acl_table_id = dvs_acl.get_acl_table_ids(1)[0]
@@ -55,6 +54,44 @@ def test_L3V4V6AclTableCreationDeletion(self, dvs_acl):
5554
# Verify the STATE_DB entry is removed
5655
dvs_acl.verify_acl_table_status(L3V4V6_TABLE_NAME, None)
5756

57+
def test_ValidAclRuleCreation_sip_dip(self, dvs_acl, l3v4v6_acl_table):
58+
config_qualifiers = {"DST_IP": "20.0.0.1/32",
59+
"SRC_IP": "10.0.0.0/32"};
60+
61+
dvs_acl.create_acl_rule(L3V4V6_TABLE_NAME, "VALID_RULE", config_qualifiers)
62+
# Verify status is written into STATE_DB
63+
dvs_acl.verify_acl_rule_status(L3V4V6_TABLE_NAME, "VALID_RULE", "Active")
64+
65+
dvs_acl.remove_acl_rule(L3V4V6_TABLE_NAME, "VALID_RULE")
66+
# Verify the STATE_DB entry is removed
67+
dvs_acl.verify_acl_rule_status(L3V4V6_TABLE_NAME, "VALID_RULE", None)
68+
dvs_acl.verify_no_acl_rules()
69+
70+
def test_InvalidAclRuleCreation_sip_sipv6(self, dvs_acl, l3v4v6_acl_table):
71+
config_qualifiers = {"SRC_IPV6": "2777::0/64",
72+
"SRC_IP": "10.0.0.0/32"};
73+
74+
dvs_acl.create_acl_rule(L3V4V6_TABLE_NAME, "INVALID_RULE", config_qualifiers)
75+
# Verify status is written into STATE_DB
76+
dvs_acl.verify_acl_rule_status(L3V4V6_TABLE_NAME, "INVALID_RULE", "Inactive")
77+
78+
dvs_acl.remove_acl_rule(L3V4V6_TABLE_NAME, "INVALID_RULE")
79+
# Verify the STATE_DB entry is removed
80+
dvs_acl.verify_acl_rule_status(L3V4V6_TABLE_NAME, "INVALID_RULE", None)
81+
dvs_acl.verify_no_acl_rules()
82+
83+
def test_InvalidAclRuleCreation_dip_sipv6(self, dvs_acl, l3v4v6_acl_table):
84+
config_qualifiers = {"SRC_IPV6": "2777::0/64",
85+
"DST_IP": "10.0.0.0/32"};
86+
87+
dvs_acl.create_acl_rule(L3V4V6_TABLE_NAME, "INVALID_RULE", config_qualifiers)
88+
# Verify status is written into STATE_DB
89+
dvs_acl.verify_acl_rule_status(L3V4V6_TABLE_NAME, "INVALID_RULE", "Inactive")
90+
91+
dvs_acl.remove_acl_rule(L3V4V6_TABLE_NAME, "INVALID_RULE")
92+
# Verify the STATE_DB entry is removed
93+
dvs_acl.verify_acl_rule_status(L3V4V6_TABLE_NAME, "INVALID_RULE", None)
94+
dvs_acl.verify_no_acl_rules()
5895

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

0 commit comments

Comments
 (0)