From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8721CA04FD; Fri, 29 Jul 2022 09:11:20 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5A82642C06; Fri, 29 Jul 2022 09:11:20 +0200 (CEST) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 1E58C40151 for ; Fri, 29 Jul 2022 09:11:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659078679; x=1690614679; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=5gvCHUWouQe8BUz0IGmIo/epXUiu4BEDD6HHyAob5tw=; b=USxH0y4wNR1NF/rBJgnJAdJW313P0ftgJua7MEeT5K+Fri0a6RMDHIyz biU7XgJPizcO3AN6Pi24FxTAduCspO/8sbSb/zfbMA0Q/NyHvNG3T+Q8S igF9RVne1hVlcceLiA958Dek4uoZ57MQ3SFjNBJIX1h0BrWHEjvwVi1Km LjDHnFmbVdmTTfhyH96oq+x+x5g/cvpk1nrsavimxUdjn0d+Uxh4WS9f9 ljzdy8MzMoVPpng/y0Tj8S19eBsIlCMU7REIImF+FJQzBEMP4TwsL1KlB e6kvCjupEa8CeXodTOTT6XFHKUQA1ZRmCaFhX6fZmMPrmqLgzsFVl9kNg g==; X-IronPort-AV: E=McAfee;i="6400,9594,10422"; a="350415812" X-IronPort-AV: E=Sophos;i="5.93,200,1654585200"; d="scan'208";a="350415812" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2022 00:11:14 -0700 X-IronPort-AV: E=Sophos;i="5.93,200,1654585200"; d="scan'208";a="660124687" Received: from unknown (HELO localhost.localdomain) ([10.239.252.248]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2022 00:11:12 -0700 From: Weiyuan Li To: dts@dpdk.org Cc: Weiyuan Li Subject: [dts][PATCH V2 1/4] tests/ice_iavf_fdir: add new test suite Date: Fri, 29 Jul 2022 15:11:11 +0800 Message-Id: <20220729071114.10788-1-weiyuanx.li@intel.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org Add DPDK22.07 new feature test suite. Signed-off-by: Weiyuan Li --- v2: -modify the ice_iavf_fdir scipt tear_down method and destroy environment first. tests/TestSuite_ice_iavf_fdir.py | 365 ++++++++++++++++++++++++++++++- 1 file changed, 362 insertions(+), 3 deletions(-) diff --git a/tests/TestSuite_ice_iavf_fdir.py b/tests/TestSuite_ice_iavf_fdir.py index a4df6151..6b6ea2df 100644 --- a/tests/TestSuite_ice_iavf_fdir.py +++ b/tests/TestSuite_ice_iavf_fdir.py @@ -29,6 +29,20 @@ MAC_IPV4_PAY = { ], } +MAC_IPV4_PAY_MULTICAST = { + "match": [ + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=255, ttl=2, tos=4) / Raw("X" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=255, ttl=2, tos=4)/UDP(sport=22,dport=23)/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.22",dst="224.0.0.1", proto=255, ttl=2, tos=4) / Raw("X" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.2", proto=255, ttl=2, tos=4) / Raw("X" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=1, ttl=2, tos=4) / Raw("X" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=255, ttl=3, tos=4) / Raw("X" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=255, ttl=2, tos=9) / Raw("X" * 80)', + ], +} + MAC_IPV4_PAY_protocol = { "match": [ 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=1)/Raw("x" * 80)', @@ -46,6 +60,24 @@ MAC_IPV4_PAY_protocol = { ], } +MAC_IPV4_PAY_multicast_protocol = { + "match": [ + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=1)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.19",dst="224.0.0.1", proto=1)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", ttl=2, tos=4)/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=17)/TCP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=17, ttl=2, tos=4)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=17)/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.2", proto=1)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", proto=6)/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1")/TCP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="11:22:33:44:55:66")/IP(src="192.168.0.20",dst="224.0.0.1", ttl=2, tos=4)/SCTP()/Raw("x" * 80)', + ], +} + + MAC_IPV4_UDP = { "match": [ 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /UDP(sport=22,dport=23)/Raw("x" * 80)' @@ -105,6 +137,20 @@ MAC_IPV6_PAY = { ], } +MAC_IPV6_PAY_MULTICAST = { + "match": [ + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::2", nh=0, tc=1, hlim=2)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::2", nh=0, tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::1", src="2001::2", nh=0, tc=1, hlim=2)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::1", nh=0, tc=1, hlim=2)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::2", nh=2, tc=1, hlim=2)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::2", nh=0, tc=2, hlim=2)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::2", nh=0, tc=1, hlim=5)/("X"*480)', + ], +} + MAC_IPV6_PAY_protocol = { "match": [ 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=17, tc=1, hlim=2)/("X"*480)', @@ -121,6 +167,22 @@ MAC_IPV6_PAY_protocol = { ], } +MAC_IPV6_PAY_multicast_protocol = { + "match": [ + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", src="2001::2", nh=17, tc=1, hlim=2)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2")/UDP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", nh=17)/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2")/UDP(sport=22,dport=23)/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", nh=6)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2")/TCP(sport=22,dport=23)/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::3", nh=1)/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2")/SCTP()/("X"*480)', + 'Ether(dst="11:22:33:44:55:66")/IPv6(dst="ff01::2", nh=1)/TCP(sport=22,dport=23)/("X"*480)', + ], +} + MAC_IPV6_UDP = { "match": [ 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)' @@ -7214,6 +7276,94 @@ tv_mac_ipv4_gre_ipv6_tcp_mark = { "check_param": {"port_id": 0, "passthru": 1, "mark_id": 3}, } +tv_mac_ipv4_pay_queue_index_multicast = { + "name": "test_mac_ipv4_pay_queue_index_multicast", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 224.0.0.1 proto is 255 ttl is 2 tos is 4 / end actions queue index 1 / mark / end", + "scapy_str": MAC_IPV4_PAY_MULTICAST, + "check_param": {"port_id": 0, "queue": 1, "mark_id": 0}, +} + +tv_mac_ipv4_pay_rss_multicast = { + "name": "test_mac_ipv4_pay_rss_multicast", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 224.0.0.1 proto is 255 ttl is 2 tos is 4 / end actions rss queues 2 3 end / mark / end", + "scapy_str": MAC_IPV4_PAY_MULTICAST, + "check_param": {"port_id": 0, "queue": [2, 3], "mark_id": 0}, +} + +tv_mac_ipv4_pay_passthru_multicast = { + "name": "test_mac_ipv4_pay_passthru_multicast", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 224.0.0.1 proto is 255 ttl is 2 tos is 4 / end actions passthru / mark / end", + "scapy_str": MAC_IPV4_PAY_MULTICAST, + "check_param": {"port_id": 0, "passthru": 1, "mark_id": 0}, +} + +tv_mac_ipv4_pay_drop_multicast = { + "name": "test_mac_ipv4_pay_drop_multicast", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 224.0.0.1 proto is 255 ttl is 2 tos is 4 / end actions drop / mark / end", + "scapy_str": MAC_IPV4_PAY_MULTICAST, + "check_param": {"port_id": 0, "drop": 1, "mark_id": 0}, +} + +tv_mac_ipv4_pay_mark_rss_multicast = { + "name": "test_mac_ipv4_pay_mark_rss_multicast", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 224.0.0.1 proto is 255 ttl is 2 tos is 4 / end actions mark / rss / end", + "scapy_str": MAC_IPV4_PAY_MULTICAST, + "check_param": {"port_id": 0, "passthru": 1, "mark_id": 0}, +} + +tv_mac_ipv4_pay_mark_multicast = { + "name": "test_mac_ipv4_pay_mark_multicast", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 224.0.0.1 proto is 255 ttl is 2 tos is 4 / end actions mark / end", + "scapy_str": MAC_IPV4_PAY_MULTICAST, + "check_param": {"port_id": 0, "mark_id": 0}, +} + +tv_mac_ipv6_pay_queue_index_multicast = { + "name": "test_mac_ipv4_pay_queue_index_multicast", + "rule": "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions queue index 15 / mark / end", + "scapy_str": MAC_IPV6_PAY_MULTICAST, + "check_param": {"port_id": 0, "queue": 15, "mark_id": 0}, +} + +tv_mac_ipv6_pay_rss_multicast = { + "name": "test_mac_ipv6_pay_rss_multicast", + "rule": "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions rss queues 8 9 10 11 12 13 14 15 end / mark / end", + "scapy_str": MAC_IPV6_PAY_MULTICAST, + "check_param": { + "port_id": 0, + "queue": [8, 9, 10, 11, 12, 13, 14, 15], + "mark_id": 0, + }, +} + +tv_mac_ipv6_pay_passthru_multicast = { + "name": "test_mac_ipv6_pay_passthru_multicast", + "rule": "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions passthru / mark / end", + "scapy_str": MAC_IPV6_PAY_MULTICAST, + "check_param": {"port_id": 0, "passthru": 1, "mark_id": 0}, +} + +tv_mac_ipv6_pay_drop_multicast = { + "name": "test_mac_ipv6_pay_drop_multicast", + "rule": "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions drop / mark / end", + "scapy_str": MAC_IPV6_PAY_MULTICAST, + "check_param": {"port_id": 0, "drop": 1, "mark_id": 0}, +} + +tv_mac_ipv6_pay_mark_rss_multicast = { + "name": "test_mac_ipv6_pay_mark_rss_multicast", + "rule": "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions mark / rss / end", + "scapy_str": MAC_IPV6_PAY_MULTICAST, + "check_param": {"port_id": 0, "passthru": 1, "mark_id": 0}, +} + +tv_mac_ipv6_pay_mark_multicast = { + "name": "test_mac_ipv6_pay_mark_multicast", + "rule": "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions mark / end", + "scapy_str": MAC_IPV6_PAY_MULTICAST, + "check_param": {"port_id": 0, "mark_id": 0}, +} + vectors_ipv4_pay = [ tv_mac_ipv4_pay_queue_index, tv_mac_ipv4_pay_mark_rss, @@ -7223,6 +7373,15 @@ vectors_ipv4_pay = [ tv_mac_ipv4_pay_mark, ] +vectors_ipv4_pay_multicast = [ + tv_mac_ipv4_pay_queue_index_multicast, + tv_mac_ipv4_pay_rss_multicast, + tv_mac_ipv4_pay_passthru_multicast, + tv_mac_ipv4_pay_drop_multicast, + tv_mac_ipv4_pay_mark_rss_multicast, + tv_mac_ipv4_pay_mark_multicast, +] + vectors_ipv4_udp = [ tv_mac_ipv4_udp_drop, tv_mac_ipv4_udp_queue_group, @@ -7259,6 +7418,15 @@ vectors_ipv6_pay = [ tv_mac_ipv6_pay_mark, ] +vectors_ipv6_pay_multicast = [ + tv_mac_ipv6_pay_queue_index_multicast, + tv_mac_ipv6_pay_rss_multicast, + tv_mac_ipv6_pay_passthru_multicast, + tv_mac_ipv6_pay_drop_multicast, + tv_mac_ipv6_pay_mark_rss_multicast, + tv_mac_ipv6_pay_mark_multicast, +] + vectors_ipv6_udp = [ tv_mac_ipv6_udp_drop, tv_mac_ipv6_udp_queue_group, @@ -8415,13 +8583,56 @@ class TestICEIAVFFdir(TestCase): # get PF interface name self.used_dut_port_0 = self.dut_ports[0] self.used_dut_port_1 = self.dut_ports[1] - + self.flag = "vf-true-promisc-support" + self.default_stats = self.dut.get_priv_flags_state( + self.dut.ports_info[self.dut_ports[0]]["intf"], self.flag + ) + if ( + self.running_case + in [ + "test_mac_ipv4_pay_multicast", + "test_mac_ipv4_multicast_protocol", + "test_mac_ipv6_pay_multicast", + "test_mac_ipv6_multicast_protocol", + ] + and self.default_stats + ): + self.dut.send_expect( + "ethtool --set-priv-flags %s %s on" + % (self.dut.ports_info[self.dut_ports[0]]["intf"], self.flag), + "# ", + ) + self.dut.send_expect( + "ethtool --show-priv-flags %s" + % (self.dut.ports_info[self.dut_ports[0]]["intf"]), + "# ", + ) # generate 2 VFs on PF self.dut.generate_sriov_vfs_by_port(self.used_dut_port_0, 2, driver=driver) self.dut.generate_sriov_vfs_by_port(self.used_dut_port_1, 2, driver=driver) self.sriov_vfs_pf0 = self.dut.ports_info[self.used_dut_port_0]["vfs_port"] self.sriov_vfs_pf1 = self.dut.ports_info[self.used_dut_port_1]["vfs_port"] - + if ( + self.running_case + in [ + "test_mac_ipv4_pay_multicast", + "test_mac_ipv4_multicast_protocol", + "test_mac_ipv6_pay_multicast", + "test_mac_ipv6_multicast_protocol", + ] + and self.default_stats + ): + out = self.dut.send_expect( + "ip link set %s vf 0 trust on" + % (self.dut.ports_info[self.dut_ports[0]]["intf"]), + "# ", + ) + if "RTNETLINK answers: Invalid argument" in out: + self.dut.send_expect( + "ip link set %s vf 0 trust on" + % (self.dut.ports_info[self.dut_ports[0]]["intf"]), + "# ", + ) self.dut.send_expect( "ip link set %s vf 0 mac 00:11:22:33:44:55" % self.pf0_intf, "#" ) @@ -8510,6 +8721,13 @@ class TestICEIAVFFdir(TestCase): self.pmd_output.execute_cmd( "port config 1 rss-hash-key ipv4 1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd" ) + if self.running_case in [ + "test_mac_ipv4_pay_multicast", + "test_mac_ipv4_multicast_protocol", + "test_mac_ipv6_pay_multicast", + "test_mac_ipv6_multicast_protocol", + ]: + self.pmd_output.execute_cmd("set allmulti all on") res = self.pmd_output.wait_link_status_up("all", timeout=15) self.verify(res is True, "there have port link is down") self.pmd_output.execute_cmd("start") @@ -8656,6 +8874,9 @@ class TestICEIAVFFdir(TestCase): def test_mac_ipv4_pay(self): self.rte_flow_process(vectors_ipv4_pay) + def test_mac_ipv4_pay_multicast(self): + self.rte_flow_process(vectors_ipv4_pay_multicast) + def test_mac_ipv4_udp(self): self.rte_flow_process(vectors_ipv4_udp) @@ -8668,6 +8889,9 @@ class TestICEIAVFFdir(TestCase): def test_mac_ipv6_pay(self): self.rte_flow_process(vectors_ipv6_pay) + def test_mac_ipv6_pay_multicast(self): + self.rte_flow_process(vectors_ipv6_pay_multicast) + def test_mac_ipv6_udp(self): self.rte_flow_process(vectors_ipv6_udp) @@ -8784,6 +9008,53 @@ class TestICEIAVFFdir(TestCase): out4, pkt_num=6, check_param={"port_id": 0, "passthru": 1}, stats=False ) + def test_mac_ipv4_multicast_protocol(self): + rules = [ + "flow create 0 ingress pattern eth / ipv4 dst is 224.0.0.1 proto is 1 / end actions queue index 1 / mark id 1 / end", + "flow create 0 ingress pattern eth / ipv4 dst is 224.0.0.1 proto is 17 / end actions passthru / mark id 3 / end", + ] + + # validate rules + self.validate_fdir_rule(rules, check_stats=True) + self.check_fdir_rule(port_id=0, stats=False) + + # create rules + rule_li = self.create_fdir_rule(rules, check_stats=True) + self.check_fdir_rule(port_id=0, rule_list=rule_li) + + # pkt1 and pkt2 in "match" match rule 0, pkt3-6 match rule 1. + out1 = self.send_pkts_getouput(MAC_IPV4_PAY_multicast_protocol["match"][0:2]) + rfc.check_iavf_fdir_mark( + out1, + pkt_num=2, + check_param={"port_id": 0, "mark_id": 1, "queue": 1}, + stats=True, + ) + + out2 = self.send_pkts_getouput(MAC_IPV4_PAY_multicast_protocol["match"][2:6]) + rfc.check_iavf_fdir_mark( + out2, + pkt_num=4, + check_param={"port_id": 0, "mark_id": 3, "passthru": 1}, + stats=True, + ) + + # send mismatched packets: + out3 = self.send_pkts_getouput(MAC_IPV4_PAY_multicast_protocol["mismatch"]) + rfc.check_iavf_fdir_mark( + out3, pkt_num=4, check_param={"port_id": 0, "passthru": 1}, stats=False + ) + + # destroy the rules and check there is no rule listed. + self.destroy_fdir_rule(rule_id=rule_li, port_id=0) + self.check_fdir_rule(port_id=0, stats=False) + + # send matched packet + out4 = self.send_pkts_getouput(MAC_IPV4_PAY_multicast_protocol["match"]) + rfc.check_iavf_fdir_mark( + out4, pkt_num=6, check_param={"port_id": 0, "passthru": 1}, stats=False + ) + def test_mac_ipv6_protocol(self): rules = [ "flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 proto is 17 / end actions rss queues 5 6 end / mark id 0 / end", @@ -8831,6 +9102,53 @@ class TestICEIAVFFdir(TestCase): out4, pkt_num=6, check_param={"port_id": 0, "passthru": 1}, stats=False ) + def test_mac_ipv6_multicast_protocol(self): + rules = [ + "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 proto is 17 / end actions rss queues 5 6 end / mark id 0 / end", + "flow create 0 ingress pattern eth / ipv6 dst is ff01::2 proto is 6 / end actions mark id 2 / rss / end", + ] + + # validate rules + self.validate_fdir_rule(rules, check_stats=True) + self.check_fdir_rule(port_id=0, stats=False) + + # create rules + rule_li = self.create_fdir_rule(rules, check_stats=True) + self.check_fdir_rule(port_id=0, rule_list=rule_li) + + # pkt1-4 in "match" match rule 0, pkt5-6 match rule 1. + out1 = self.send_pkts_getouput(MAC_IPV6_PAY_multicast_protocol["match"][0:4]) + rfc.check_iavf_fdir_mark( + out1, + pkt_num=4, + check_param={"port_id": 0, "mark_id": 0, "queue": [5, 6]}, + stats=True, + ) + + out2 = self.send_pkts_getouput(MAC_IPV6_PAY_multicast_protocol["match"][4:6]) + rfc.check_iavf_fdir_mark( + out2, + pkt_num=2, + check_param={"port_id": 0, "mark_id": 2, "passthru": 1}, + stats=True, + ) + + # send mismatched packets: + out3 = self.send_pkts_getouput(MAC_IPV6_PAY_multicast_protocol["mismatch"]) + rfc.check_iavf_fdir_mark( + out3, pkt_num=3, check_param={"port_id": 0, "passthru": 1}, stats=False + ) + + # destroy the rules and check there is no rule listed. + self.destroy_fdir_rule(rule_id=rule_li, port_id=0) + self.check_fdir_rule(port_id=0, stats=False) + + # send matched packet + out4 = self.send_pkts_getouput(MAC_IPV6_PAY_multicast_protocol["match"]) + rfc.check_iavf_fdir_mark( + out4, pkt_num=6, check_param={"port_id": 0, "passthru": 1}, stats=False + ) + @skip_unsupported_pkg("os default") def test_mac_ipv4_gtpu_eh_without_teid(self): rules = [ @@ -11603,8 +11921,49 @@ class TestICEIAVFFdir(TestCase): def tear_down(self): # destroy all flow rule on port 0 - self.dut.kill_all() self.destroy_env() + self.dut.kill_all() + self.flag = "vf-true-promisc-support" + self.default_stats = self.dut.get_priv_flags_state( + self.dut.ports_info[self.dut_ports[0]]["intf"], self.flag + ) + if ( + self.running_case + in [ + "test_mac_ipv4_pay_multicast", + "test_mac_ipv4_multicast_protocol", + "test_mac_ipv6_pay_multicast", + "test_mac_ipv6_multicast_protocol", + ] + and self.default_stats + ): + self.dut.send_expect( + "ethtool --set-priv-flags %s %s off" + % (self.dut.ports_info[self.dut_ports[0]]["intf"], self.flag), + "# ", + ) + if ( + self.running_case + in [ + "test_mac_ipv4_pay_multicast", + "test_mac_ipv4_multicast_protocol", + "test_mac_ipv6_pay_multicast", + "test_mac_ipv6_multicast_protocol", + ] + and self.default_stats + ): + out = self.dut.send_expect( + "ip link set %s vf 0 trust off" + % (self.dut.ports_info[self.dut_ports[0]]["intf"]), + "# ", + ) + if "RTNETLINK answers: Invalid argument" in out: + self.dut.send_expect( + "ip link set %s vf 0 trust off" + % (self.dut.ports_info[self.dut_ports[0]]["intf"]), + "# ", + ) + if getattr(self, "session_secondary", None): self.dut.close_session(self.session_secondary) if getattr(self, "session_third", None): -- 2.27.0