Skip to content

Commit b2bc671

Browse files
committed
Updates caclmgrd to add MATCH service
1 parent 47fd128 commit b2bc671

File tree

3 files changed

+401
-2
lines changed

3 files changed

+401
-2
lines changed

scripts/caclmgrd

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
108108
"ip_protocols": ["tcp"],
109109
"multi_asic_ns_to_host_fwd":True
110110
},
111+
"MATCH": {
112+
"ip_protocols": ["tcp"],
113+
"dst_ports": ["0"],
114+
"multi_asic_ns_to_host_fwd":True
115+
},
111116
"ANY": {
112117
"ip_protocols": ["any"],
113118
"dst_ports": ["0"],
@@ -756,7 +761,9 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
756761
rule_cmd = ["ip6tables"] if table_ip_version == 6 else ["iptables"]
757762

758763
rule_cmd += ["-A", "INPUT"]
759-
if ip_protocol != "any":
764+
if acl_service == "MATCH" and "IP_PROTOCOL" in rule_props:
765+
rule_cmd += ["-p", str(rule_props["IP_PROTOCOL"])]
766+
elif ip_protocol != "any":
760767
rule_cmd += ["-p", str(ip_protocol)]
761768

762769
if "SRC_IPV6" in rule_props and rule_props["SRC_IPV6"]:
@@ -769,7 +776,13 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
769776
ipv4_src_ip_set.add(rule_props["SRC_IP"])
770777

771778
# Destination port 0 is reserved/unused port, so, using it to apply the rule to all ports.
772-
if dst_port != "0":
779+
if acl_service == "MATCH":
780+
if "L4_DST_PORT" in rule_props:
781+
rule_cmd += ["--dport", str(rule_props["L4_DST_PORT"])]
782+
elif "L4_DST_PORT_RANGE" in rule_props:
783+
dst_port = ":".join(rule_props["L4_DST_PORT_RANGE"].split("-"))
784+
rule_cmd += ["--dport", str(dst_port)]
785+
elif dst_port != "0":
773786
rule_cmd += ["--dport", str(dst_port)]
774787

775788
# If there are TCP flags present and ip protocol is TCP, append them
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import os
2+
import sys
3+
4+
from swsscommon import swsscommon
5+
from parameterized import parameterized
6+
from sonic_py_common.general import load_module_from_source
7+
from unittest import TestCase, mock
8+
from pyfakefs.fake_filesystem_unittest import patchfs
9+
10+
from .test_match_acl_vectors import MATCH_ACL_TEST_VECTOR
11+
from tests.common.mock_configdb import MockConfigDb
12+
13+
14+
DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json'
15+
16+
17+
class TestCaclmgrdMatchAcl(TestCase):
18+
"""
19+
Test caclmgrd MATCH
20+
"""
21+
def setUp(self):
22+
swsscommon.ConfigDBConnector = MockConfigDb
23+
test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
24+
modules_path = os.path.dirname(test_path)
25+
scripts_path = os.path.join(modules_path, "scripts")
26+
sys.path.insert(0, modules_path)
27+
caclmgrd_path = os.path.join(scripts_path, 'caclmgrd')
28+
self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path)
29+
30+
@parameterized.expand(MATCH_ACL_TEST_VECTOR)
31+
@patchfs
32+
def test_caclmgrd_match_acl(self, test_name, test_data, fs):
33+
if not os.path.exists(DBCONFIG_PATH):
34+
fs.create_file(DBCONFIG_PATH) # fake database_config.json
35+
36+
MockConfigDb.set_config_db(test_data["config_db"])
37+
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ip = mock.MagicMock()
38+
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ipv6 = mock.MagicMock()
39+
self.caclmgrd.ControlPlaneAclManager.generate_block_ip2me_traffic_iptables_commands = mock.MagicMock(return_value=[])
40+
self.caclmgrd.ControlPlaneAclManager.get_chain_list = mock.MagicMock(return_value=["INPUT", "FORWARD", "OUTPUT"])
41+
self.caclmgrd.ControlPlaneAclManager.get_chassis_midplane_interface_ip = mock.MagicMock(return_value='')
42+
caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd")
43+
44+
iptables_rules_ret, _ = caclmgrd_daemon.get_acl_rules_and_translate_to_iptables_commands('', MockConfigDb())
45+
test_data['return'] = [tuple(i) for i in test_data['return']]
46+
iptables_rules_ret = [tuple(i) for i in iptables_rules_ret]
47+
self.assertEqual(set(test_data["return"]).issubset(set(iptables_rules_ret)), True)
48+

0 commit comments

Comments
 (0)