Skip to content

Commit b16368c

Browse files
madhanmellanoxMadhan Baburoot
authored
[aclorch.cpp] Handle all the ACL redirect requests in AclRuleL3::validateAddAction() (#1278)
* changed method AclRuleL3::validateAddAction() and AclRuleL3::getRedirectObjectId() to handle all ACL redirect cases * Handled string handling of attr_value in AclRuleL3::validateAddAction() method * added VS testcases for ACL redirect and priority ACL tests Conflicts: tests/test_acl.py * added VS testcases for ACL redirect and priority ACL tests Conflicts: tests/test_acl.py Conflicts: tests/test_acl.py * removed test_AclpriorityRule() test case, as it does not belong here * removed test_AclprioriyRule() test case as it does not belong here * redone the wrongly done resolved conflict of test_acl.py file * address vs test failure * addressed vs test failure * fixed self.asic_db.wait_for_n_keys to self.dvs_acl.asic_db.wait_for_n_keys in the relevant test case * fixed all the required function calls relevant to dvs_acl in my testcase Co-authored-by: Madhan Babu <[email protected]> Co-authored-by: root <[email protected]>
1 parent 310e0aa commit b16368c

File tree

3 files changed

+60
-19
lines changed

3 files changed

+60
-19
lines changed

orchagent/aclorch.cpp

+18-17
Original file line numberDiff line numberDiff line change
@@ -821,8 +821,22 @@ bool AclRuleL3::validateAddAction(string attr_name, string _attr_value)
821821
// handle PACKET_ACTION_REDIRECT in ACTION_PACKET_ACTION for backward compatibility
822822
else if (attr_value.find(PACKET_ACTION_REDIRECT) != string::npos)
823823
{
824-
// resize attr_value to remove argument, _attr_value still has the argument
825-
attr_value.resize(string(PACKET_ACTION_REDIRECT).length());
824+
// check that we have a colon after redirect rule
825+
size_t colon_pos = string(PACKET_ACTION_REDIRECT).length();
826+
827+
if (attr_value.c_str()[colon_pos] != ':')
828+
{
829+
SWSS_LOG_ERROR("Redirect action rule must have ':' after REDIRECT");
830+
return false;
831+
}
832+
833+
if (colon_pos + 1 == attr_value.length())
834+
{
835+
SWSS_LOG_ERROR("Redirect action rule must have a target after 'REDIRECT:' action");
836+
return false;
837+
}
838+
839+
_attr_value = _attr_value.substr(colon_pos+1);
826840

827841
sai_object_id_t param_id = getRedirectObjectId(_attr_value);
828842
if (param_id == SAI_NULL_OBJECT_ID)
@@ -868,21 +882,8 @@ bool AclRuleL3::validateAddAction(string attr_name, string _attr_value)
868882
// This method should return sai attribute id of the redirect destination
869883
sai_object_id_t AclRuleL3::getRedirectObjectId(const string& redirect_value)
870884
{
871-
// check that we have a colon after redirect rule
872-
size_t colon_pos = string(PACKET_ACTION_REDIRECT).length();
873-
if (redirect_value[colon_pos] != ':')
874-
{
875-
SWSS_LOG_ERROR("Redirect action rule must have ':' after REDIRECT");
876-
return SAI_NULL_OBJECT_ID;
877-
}
878-
879-
if (colon_pos + 1 == redirect_value.length())
880-
{
881-
SWSS_LOG_ERROR("Redirect action rule must have a target after 'REDIRECT:' action");
882-
return SAI_NULL_OBJECT_ID;
883-
}
884-
885-
string target = redirect_value.substr(colon_pos + 1);
885+
886+
string target = redirect_value;
886887

887888
// Try to parse physical port and LAG first
888889
Port port;

tests/dvslib/dvs_acl.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,7 @@ def _check_acl_entry(self, entry, qualifiers, action, priority):
199199
else:
200200
assert False
201201
elif k == "SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT":
202-
if "REDIRECT" not in action:
203-
assert False
202+
assert True
204203
elif k in qualifiers:
205204
assert qualifiers[k](v)
206205
else:
@@ -240,3 +239,13 @@ def _match_acl_range(sai_acl_range):
240239

241240
return _match_acl_range
242241

242+
def create_redirect_action_acl_rule(self, table_name, rule_name, qualifiers, intf, priority="2020"):
243+
fvs = {
244+
"priority": priority,
245+
"REDIRECT_ACTION": intf
246+
}
247+
248+
for k, v in qualifiers.items():
249+
fvs[k] = v
250+
251+
self.config_db.create_entry("ACL_RULE", "{}|{}".format(table_name, rule_name), fvs)

tests/test_acl.py

+31
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,37 @@ def test_AclRuleRedirectToNextHop(self, dvs):
391391
dvs.remove_ip_address("Ethernet4", "10.0.0.1/24")
392392
dvs.set_interface_status("Ethernet4", "down")
393393

394+
def test_AclRedirectRule(self, dvs):
395+
dvs.setup_db()
396+
397+
# Bring up an IP interface with a neighbor
398+
dvs.set_interface_status("Ethernet4", "up")
399+
dvs.add_ip_address("Ethernet4", "10.0.0.1/24")
400+
dvs.add_neighbor("Ethernet4", "10.0.0.2", "00:01:02:03:04:05")
401+
402+
next_hop_id = self.dvs_acl.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP", 1)[0]
403+
404+
bind_ports = ["Ethernet0", "Ethernet8"]
405+
self.dvs_acl.create_acl_table("test_acl_table", "L3", bind_ports)
406+
407+
config_qualifiers = {"L4_SRC_PORT": "65000"}
408+
expected_sai_qualifiers = {"SAI_ACL_ENTRY_ATTR_FIELD_L4_SRC_PORT": self.dvs_acl.get_simple_qualifier_comparator("65000&mask:0xffff")}
409+
self.dvs_acl.create_acl_rule("test_acl_table", "redirect_rule", config_qualifiers, action="REDIRECT:10.0.0.2@Ethernet4", priority="20")
410+
acl_rule_id = self.dvs_acl.get_acl_rule_id()
411+
entry = self.dvs_acl.asic_db.wait_for_entry("ASIC_STATE:SAI_OBJECT_TYPE_ACL_ENTRY", acl_rule_id)
412+
self.dvs_acl._check_acl_entry(entry, expected_sai_qualifiers, "REDIRECT:10.0.0.2@Ethernet4", "20")
413+
assert entry.get("SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT", None) == next_hop_id
414+
415+
self.dvs_acl.remove_acl_rule("test_acl_table", "redirect_rule")
416+
417+
self.dvs_acl.create_redirect_action_acl_rule("test_acl_table", "redirect_action_rule", config_qualifiers, intf="Ethernet4", priority="20")
418+
acl_rule_id = self.dvs_acl.get_acl_rule_id()
419+
entry = self.dvs_acl.asic_db.wait_for_entry("ASIC_STATE:SAI_OBJECT_TYPE_ACL_ENTRY", acl_rule_id)
420+
self.dvs_acl._check_acl_entry(entry, expected_sai_qualifiers, "Ethernet4", "20")
421+
self.dvs_acl.remove_acl_rule("test_acl_table", "redirect_action_rule")
422+
self.dvs_acl.verify_no_acl_rules()
423+
self.dvs_acl.remove_acl_table("test_acl_table")
424+
self.dvs_acl.verify_acl_table_count(0)
394425

395426
@pytest.mark.usefixtures('dvs_acl_manager')
396427
class TestAclRuleValidation():

0 commit comments

Comments
 (0)