[V1,2/2] tests/cvl_fdir: add-new-case-for-test-l2-ethertype

Message ID 20200804052442.4375-1-box.c.chen@intel.com (mailing list archive)
State Accepted
Headers
Series None |

Commit Message

Chen, BoX C Aug. 4, 2020, 5:24 a.m. UTC
  add test case L2 Ethertype.

Signed-off-by: ChenBo <box.c.chen@intel.com>
---
 tests/TestSuite_cvl_fdir.py | 208 ++++++++++++++++++++++++++++++++++--
 1 file changed, 202 insertions(+), 6 deletions(-)
  

Comments

Chen, BoX C Aug. 4, 2020, 5:33 a.m. UTC | #1
Tested-by: Chen, BoX C <BoX.C.Chen@intel.com>

Regards,
Chen Bo

> -----Original Message-----
> From: Chen, BoX C <box.c.chen@intel.com>
> Sent: August 4, 2020 13:25
> To: dts@dpdk.org
> Cc: Chen, BoX C <box.c.chen@intel.com>
> Subject: [dts][PATCH V1 2/2] tests/cvl_fdir: add-new-case-for-test-l2-
> ethertype
> 
> add test case L2 Ethertype.
> 
> Signed-off-by: ChenBo <box.c.chen@intel.com>
> ---
>  tests/TestSuite_cvl_fdir.py | 208
> ++++++++++++++++++++++++++++++++++--
>  1 file changed, 202 insertions(+), 6 deletions(-)
> 
> diff --git a/tests/TestSuite_cvl_fdir.py b/tests/TestSuite_cvl_fdir.py index
> b821961..c50799b 100644
> --- a/tests/TestSuite_cvl_fdir.py
> +++ b/tests/TestSuite_cvl_fdir.py
> @@ -284,6 +284,18 @@ MAC_IPV4_GTPU = {
>          'Ether(src="a4:bf:01:51:27:ca",
> dst="00:11:22:33:44:55")/IP(src="192.168.0.20",
> dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255,
> teid=0x1234567)/IP()/Raw("x"*20)']
>  }
> 
> +L2_Ethertype = [
> +    'Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x" *80)',
> +    'Ether(dst="00:11:22:33:44:55", type=0x8863)/IP()/Raw("x" * 80)',
> +    'Ether(dst="00:11:22:33:44:55")/PPPoE(sessionid=3)/Raw("x" * 80)',
> +    'Ether(dst="00:11:22:33:44:55", type=0x8864)/IP()/Raw("x" * 80)',
> +    'Ether(dst="00:11:22:33:44:55")/ARP(pdst="192.168.1.1")',
> +    'Ether(dst="00:11:22:33:44:55", type=0x0806)/Raw("x" *80)',
> +    'Ether(dst="00:11:22:33:44:55",type=0x8100)',
> +    'Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)',
> +    'Ether(dst="00:11:22:33:44:55",type=0x88f7)/"\\x00\\x02"',
> +    'Ether(dst="00:11:22:33:44:55",type=0x8847)']
> +
>  tv_mac_ipv4_pay_queue_index = {
>      "name": "test_mac_ipv4_pay_queue_index",
>      "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src
> is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions
> queue index 1 / end", @@ -1241,6 +1253,144 @@ vectors_mac_ipv4_gtpu =
> [tv_mac_ipv4_gtpu_queue_index, tv_mac_ipv4_gtpu_queue_gr
>                           tv_mac_ipv4_gtpu_passthru, tv_mac_ipv4_gtpu_drop,
>                           tv_mac_ipv4_gtpu_mark_rss, tv_mac_ipv4_gtpu_mark]
> 
> +tv_l2_ethertype_queue_index = {
> +    "name": "test_l2_ethertype_queue_index",
> +    "rule": [
> +        "flow create 0 ingress pattern eth type is 0x8863 / end actions queue
> index 1 / mark id 1 / end",
> +        "flow create 0 ingress pattern eth type is 0x8864 / end actions queue
> index 2 / mark id 2 / end",
> +        "flow create 0 ingress pattern eth type is 0x0806 / end actions queue
> index 3 / mark id 3 / end",
> +        "flow create 0 ingress pattern eth type is 0x8100 / end actions queue
> index 4 / mark id 4 / end",
> +        "flow create 0 ingress pattern eth type is 0x88f7 / end actions queue
> index 5 / mark id 5 / end"],
> +    "scapy_str": L2_Ethertype,
> +    "check_param": [
> +        {"port_id": 0, "queue": 1, "mark_id": 1},
> +        {"port_id": 0, "queue": 1, "mark_id": 1},
> +        {"port_id": 0, "queue": 2, "mark_id": 2},
> +        {"port_id": 0, "queue": 2, "mark_id": 2},
> +        {"port_id": 0, "queue": 3, "mark_id": 3},
> +        {"port_id": 0, "queue": 3, "mark_id": 3},
> +        {"port_id": 0, "queue": 4, "mark_id": 4},
> +        {"port_id": 0, "queue": 4, "mark_id": 4},
> +        {"port_id": 0, "queue": 5, "mark_id": 5},
> +        {"port_id": 0, "queue": 0}]
> +}
> +
> +tv_l2_ethertype_queue_group = {
> +    "name": "test_l2_ethertype_queue_group",
> +    "rule": [
> +        "flow create 0 ingress pattern eth type is 0x8863 / end actions rss
> queues 0 1 end / mark id 0 / end",
> +        "flow create 0 ingress pattern eth type is 0x8864 / end actions rss
> queues 2 3 end / mark id 1 / end",
> +        "flow create 0 ingress pattern eth type is 0x0806 / end actions rss
> queues 4 5 end / mark id 2 / end",
> +        "flow create 0 ingress pattern eth type is 0x8100 / end actions rss
> queues 6 7 end / mark id 2 / end",
> +        "flow create 0 ingress pattern eth type is 0x88f7 / end actions rss
> queues 9 10 end / mark id 3 / end"],
> +    "scapy_str": L2_Ethertype,
> +    "check_param": [
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 3},
> +        {"port_id": 0, "queue": 0}]
> +}
> +
> +tv_l2_ethertype_passthru = {
> +    "name": "test_l2_ethertype_passthru",
> +    "rule": [
> +        "flow create 0 ingress pattern eth type is 0x8863 / end actions passthru
> / mark / end",
> +        "flow create 0 ingress pattern eth type is 0x8864 / end actions passthru
> / mark id 1 / end",
> +        "flow create 0 ingress pattern eth type is 0x0806 / end actions passthru
> / mark id 2 / end",
> +        "flow create 0 ingress pattern eth type is 0x8100 / end actions passthru
> / mark id 3 / end",
> +        "flow create 0 ingress pattern eth type is 0x88f7 / end actions passthru /
> mark id 4 / end"],
> +    "scapy_str": L2_Ethertype,
> +    "check_param": [
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 3},
> +        {"port_id": 0, "queue": 0, "mark_id": 3},
> +        {"port_id": 0, "queue": 0, "mark_id": 4},
> +        {"port_id": 0, "queue": 0}]
> +}
> +
> +tv_l2_ethertype_mark_rss = {
> +    "name": "test_l2_ethertype_mark_rss",
> +    "rule": [
> +        "flow create 0 ingress pattern eth type is 0x8863 / end actions rss / mark
> id 0 / end",
> +        "flow create 0 ingress pattern eth type is 0x8864 / end actions mark id 1
> / rss / end",
> +        "flow create 0 ingress pattern eth type is 0x0806 / end actions mark / rss
> / end",
> +        "flow create 0 ingress pattern eth type is 0x8100 / end actions rss / mark
> / end",
> +        "flow create 0 ingress pattern eth type is 0x88f7 / end actions mark id 3
> / rss / end"],
> +    "scapy_str": L2_Ethertype,
> +    "check_param": [
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 3},
> +        {"port_id": 0, "queue": 0}]
> +}
> +
> +tv_l2_ethertype_mark = {
> +    "name": "test_l2_ethertype_mark",
> +    "rule": [
> +        "flow create 0 ingress pattern eth type is 0x8863 / end actions mark id 0
> / end",
> +        "flow create 0 ingress pattern eth type is 0x8864 / end actions mark id 1
> / end",
> +        "flow create 0 ingress pattern eth type is 0x0806 / end actions mark id 2
> / end",
> +        "flow create 0 ingress pattern eth type is 0x8100 / end actions mark id 2
> / end",
> +        "flow create 0 ingress pattern eth type is 0x88f7 / end actions mark /
> end"],
> +    "scapy_str": L2_Ethertype,
> +    "check_param": [
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 1},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 2},
> +        {"port_id": 0, "queue": 0, "mark_id": 0},
> +        {"port_id": 0, "queue": 0}]
> +}
> +
> +tv_l2_ethertype_drop = {
> +    "name": "test_l2_ethertype_drop",
> +    "rule": [
> +        "flow create 0 ingress pattern eth type is 0x8863 / end actions drop /
> end",
> +        "flow create 0 ingress pattern eth type is 0x8864 / end actions drop /
> end",
> +        "flow create 0 ingress pattern eth type is 0x0806 / end actions drop /
> end",
> +        "flow create 0 ingress pattern eth type is 0x8100 / end actions drop /
> end",
> +        "flow create 0 ingress pattern eth type is 0x88f7 / end actions drop /
> end"],
> +    "scapy_str": L2_Ethertype,
> +    "check_param": [
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "drop": 1},
> +        {"port_id": 0, "queue": 0}]
> +}
> +
> +vectors_l2_ethertype = [tv_l2_ethertype_queue_index,
> +                        tv_l2_ethertype_queue_group,
> +                        tv_l2_ethertype_passthru,
> +                        tv_l2_ethertype_drop,
> +                        tv_l2_ethertype_mark_rss,
> +                        tv_l2_ethertype_mark]
> 
>  class TestCVLFdir(TestCase):
> 
> @@ -1306,6 +1456,36 @@ class TestCVLFdir(TestCase):
>                  failed_cases.append(k)
>          self.verify(all(test_results.values()), "{} failed.".format(failed_cases))
> 
> +    def _multirules_process(self, vectors, port_id=0):
> +        # create rules on only one port
> +        test_results = {}
> +        rule_li = []
> +        for tv in vectors:
> +            try:
> +                port_id = port_id
> +                pkts=tv["scapy_str"]
> +                check_param=tv["check_param"]
> +                self.destroy_fdir_rule(rule_id=rule_li,
> + port_id=port_id)
> +
> +                # validate rules and create rules
> +                rule_li = self.create_fdir_rule(tv["rule"],
> + check_stats=True)
> +
> +                for i in range(len(pkts)):
> +                    port_id = check_param[i]["port_id"]
> +                    out = self.send_pkts_getouput(pkts=pkts[i],
> drop=check_param[i].get("drop"))
> +                    rfc.check_mark(out, pkt_num=1, check_param=check_param[i])
> +                test_results[tv["name"]] = True
> +                print((GREEN("case passed: %s" % tv["name"])))
> +            except Exception as e:
> +                print((RED(e)))
> +                test_results[tv["name"]] = False
> +                continue
> +        failed_cases = []
> +        for k, v in list(test_results.items()):
> +            if not v:
> +                failed_cases.append(k)
> +        self.verify(all(test_results.values()), "{}
> + failed.".format(failed_cases))
> +
>      def set_up_all(self):
>          """
>          Run at the start of each test suite.
> @@ -1705,15 +1885,22 @@ class TestCVLFdir(TestCase):
>          self.check_fdir_rule(stats=True, rule_list=rule_li)
> 
>      def test_conflicted_rules(self):
> -        rule1 = "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4
> src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index
> 1 / end"
> +        rule1 = [
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is
> 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 /
> end',
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55
> + / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 /
> + end actions queue index 1 / mark / end']
>          rule_li = self.create_fdir_rule(rule1, check_stats=True)
>          rule2 = [
>              "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is
> 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 2 /
> end",
>              "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is
> 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions drop / end",
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is
> CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / end actions queue
> index 2 / mark / end',
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55
> + / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 /
> + end actions rss queues 2 3 end / mark / end',
>              'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is
> 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 3 / mark / end',
> -            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is
> 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end
> actions queue index 3 / mark / end']
> -        self.create_fdir_rule(rule2[0:2], check_stats=False, msg="Rule already
> exists!: File exists", validate=False)
> -        self.create_fdir_rule(rule2[2:], check_stats=False, msg="Invalid input
> action number: Invalid argument", validate=False)
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is
> 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end
> actions queue index 3 / mark / end',
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is
> CDCD:910A:2222:5498:8475:1111:3900:2021 / end actions mark / end',
> +            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is
> CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / udp src is 22 dst is
> 23 / end actions queue index 1 / mark / end']
> +        self.create_fdir_rule(rule2[0:4], check_stats=False, msg="Rule already
> exists!: File exists", validate=False)
> +        self.create_fdir_rule(rule2[4:7], check_stats=False, msg="Invalid input
> action number: Invalid argument", validate=False)
> +        self.create_fdir_rule(rule2[7:], check_stats=False,
> + msg="Invalid input set: Invalid argument", validate=False)
>          self.check_fdir_rule(stats=True, rule_list=rule_li)
> 
>      def test_conflicted_actions(self):
> @@ -2091,7 +2278,7 @@ class TestCVLFdir(TestCase):
>              eal_param = self.dut.create_eal_parameters(cores="1S/4C/1T",
> ports=[self.pci0 + ",flow-mark-support=1",
>                                                                                  self.pci1 + ",flow-mark-support=1"],
>                                                         socket=self.ports_socket)
> -            param = " -- -i --portmask=%s --rxq=%d --txq=%d --port-
> topology=loop --cmdline-file=%s" % (
> +            param = " --log-level='ice,7' -- -i --portmask=%s --rxq=%d
> + --txq=%d --port-topology=loop --cmdline-file=%s" % (
>                  self.portMask, 64, 64, cmd_path)
>              command_line = self.dut.target + "/app/testpmd " + eal_param +
> param
>              out = self.dut.send_expect(command_line, 'testpmd>', timeout=600)
> @@ -2197,7 +2384,7 @@ class TestCVLFdir(TestCase):
>              out = self.pmd_output.start_testpmd(cores="1S/4C/1T",
>                                                  param="--portmask=%s --rxq=%d --txq=%d --port-
> topology=loop --cmdline-file=%s" % (
>                                                      self.portMask, 64, 64, cmd_path),
> -                                                eal_param="-w %s,flow-mark-support=1 -
> w %s,flow-mark-support=1" % (
> +                                                eal_param="-w
> + %s,flow-mark-support=1 -w %s,flow-mark-support=1 --log-level='ice,7'"
> + % (
>                                                      self.pci0, self.pci1), socket=self.ports_socket)
>              self.verify('Failed to create flow' not in out, "create some rule failed")
>              self.config_testpmd()
> @@ -2271,6 +2458,15 @@ class TestCVLFdir(TestCase):
>      def test_mac_ipv4_gtpu(self):
>          self._rte_flow_validate(vectors_mac_ipv4_gtpu)
> 
> +    def test_l2_ethertype(self):
> +        self._multirules_process(vectors_l2_ethertype)
> +
> +    def test_unsupported_ethertype(self):
> +        rule = ['flow create 0 ingress pattern eth type is 0x0800 / end actions
> queue index 1 / end',
> +                'flow create 0 ingress pattern eth type is 0x86dd / end actions
> queue index 1 / end']
> +        self.create_fdir_rule(rule, check_stats=True, msg="Succeeded to
> create (2) flow")
> +        self.check_fdir_rule(stats=True)
> +
>      def tear_down(self):
>          # destroy all flow rule on port 0
>          self.dut.send_command("flow flush 0", timeout=1)
> --
> 2.17.1
  
Peng, Yuan Aug. 7, 2020, 3:02 a.m. UTC | #2
Acked by Peng, Yuan <yuan.peng@intel.com>


-----Original Message-----
From: dts <dts-bounces@dpdk.org> On Behalf Of ChenBo
Sent: Tuesday, August 4, 2020 1:25 PM
To: dts@dpdk.org
Cc: Chen, BoX C <box.c.chen@intel.com>
Subject: [dts] [PATCH V1 2/2] tests/cvl_fdir: add-new-case-for-test-l2-ethertype

add test case L2 Ethertype.

Signed-off-by: ChenBo <box.c.chen@intel.com>
---
 tests/TestSuite_cvl_fdir.py | 208 ++++++++++++++++++++++++++++++++++--
 1 file changed, 202 insertions(+), 6 deletions(-)

diff --git a/tests/TestSuite_cvl_fdir.py b/tests/TestSuite_cvl_fdir.py index b821961..c50799b 100644
--- a/tests/TestSuite_cvl_fdir.py
+++ b/tests/TestSuite_cvl_fdir.py
@@ -284,6 +284,18 @@ MAC_IPV4_GTPU = {
         'Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x1234567)/IP()/Raw("x"*20)']
 }
 
+L2_Ethertype = [
+    'Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x" *80)',
+    'Ether(dst="00:11:22:33:44:55", type=0x8863)/IP()/Raw("x" * 80)',
+    'Ether(dst="00:11:22:33:44:55")/PPPoE(sessionid=3)/Raw("x" * 80)',
+    'Ether(dst="00:11:22:33:44:55", type=0x8864)/IP()/Raw("x" * 80)',
+    'Ether(dst="00:11:22:33:44:55")/ARP(pdst="192.168.1.1")',
+    'Ether(dst="00:11:22:33:44:55", type=0x0806)/Raw("x" *80)',
+    'Ether(dst="00:11:22:33:44:55",type=0x8100)',
+    'Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)',
+    'Ether(dst="00:11:22:33:44:55",type=0x88f7)/"\\x00\\x02"',
+    'Ether(dst="00:11:22:33:44:55",type=0x8847)']
+
 tv_mac_ipv4_pay_queue_index = {
     "name": "test_mac_ipv4_pay_queue_index",
     "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 1 / end", @@ -1241,6 +1253,144 @@ vectors_mac_ipv4_gtpu = [tv_mac_ipv4_gtpu_queue_index, tv_mac_ipv4_gtpu_queue_gr
                          tv_mac_ipv4_gtpu_passthru, tv_mac_ipv4_gtpu_drop,
                          tv_mac_ipv4_gtpu_mark_rss, tv_mac_ipv4_gtpu_mark]
 
+tv_l2_ethertype_queue_index = {
+    "name": "test_l2_ethertype_queue_index",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions queue index 1 / mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions queue index 2 / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions queue index 3 / mark id 3 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions queue index 4 / mark id 4 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions queue index 5 / mark id 5 / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 1, "mark_id": 1},
+        {"port_id": 0, "queue": 1, "mark_id": 1},
+        {"port_id": 0, "queue": 2, "mark_id": 2},
+        {"port_id": 0, "queue": 2, "mark_id": 2},
+        {"port_id": 0, "queue": 3, "mark_id": 3},
+        {"port_id": 0, "queue": 3, "mark_id": 3},
+        {"port_id": 0, "queue": 4, "mark_id": 4},
+        {"port_id": 0, "queue": 4, "mark_id": 4},
+        {"port_id": 0, "queue": 5, "mark_id": 5},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_queue_group = {
+    "name": "test_l2_ethertype_queue_group",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions rss queues 0 1 end / mark id 0 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions rss queues 2 3 end / mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions rss queues 4 5 end / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions rss queues 6 7 end / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions rss queues 9 10 end / mark id 3 / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_passthru = {
+    "name": "test_l2_ethertype_passthru",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions passthru / mark / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions passthru / mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions passthru / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions passthru / mark id 3 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions passthru / mark id 4 / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0, "mark_id": 4},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_mark_rss = {
+    "name": "test_l2_ethertype_mark_rss",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions rss / mark id 0 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions mark id 1 / rss / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions mark / rss / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions rss / mark / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions mark id 3 / rss / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_mark = {
+    "name": "test_l2_ethertype_mark",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions mark id 0 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions mark / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_drop = {
+    "name": "test_l2_ethertype_drop",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions drop / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "queue": 0}]
+}
+
+vectors_l2_ethertype = [tv_l2_ethertype_queue_index,
+                        tv_l2_ethertype_queue_group,
+                        tv_l2_ethertype_passthru,
+                        tv_l2_ethertype_drop,
+                        tv_l2_ethertype_mark_rss,
+                        tv_l2_ethertype_mark]
 
 class TestCVLFdir(TestCase):
 
@@ -1306,6 +1456,36 @@ class TestCVLFdir(TestCase):
                 failed_cases.append(k)
         self.verify(all(test_results.values()), "{} failed.".format(failed_cases))
 
+    def _multirules_process(self, vectors, port_id=0):
+        # create rules on only one port
+        test_results = {}
+        rule_li = []
+        for tv in vectors:
+            try:
+                port_id = port_id
+                pkts=tv["scapy_str"]
+                check_param=tv["check_param"]
+                self.destroy_fdir_rule(rule_id=rule_li, 
+ port_id=port_id)
+
+                # validate rules and create rules
+                rule_li = self.create_fdir_rule(tv["rule"], 
+ check_stats=True)
+
+                for i in range(len(pkts)):
+                    port_id = check_param[i]["port_id"]
+                    out = self.send_pkts_getouput(pkts=pkts[i], drop=check_param[i].get("drop"))
+                    rfc.check_mark(out, pkt_num=1, check_param=check_param[i])
+                test_results[tv["name"]] = True
+                print((GREEN("case passed: %s" % tv["name"])))
+            except Exception as e:
+                print((RED(e)))
+                test_results[tv["name"]] = False
+                continue
+        failed_cases = []
+        for k, v in list(test_results.items()):
+            if not v:
+                failed_cases.append(k)
+        self.verify(all(test_results.values()), "{} 
+ failed.".format(failed_cases))
+
     def set_up_all(self):
         """
         Run at the start of each test suite.
@@ -1705,15 +1885,22 @@ class TestCVLFdir(TestCase):
         self.check_fdir_rule(stats=True, rule_list=rule_li)
 
     def test_conflicted_rules(self):
-        rule1 = "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end"
+        rule1 = [
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 
+ / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / 
+ end actions queue index 1 / mark / end']
         rule_li = self.create_fdir_rule(rule1, check_stats=True)
         rule2 = [
             "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 2 / end",
             "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions drop / end",
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / end actions queue index 2 / mark / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 
+ / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / 
+ end actions rss queues 2 3 end / mark / end',
             'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 3 / mark / end',
-            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions queue index 3 / mark / end']
-        self.create_fdir_rule(rule2[0:2], check_stats=False, msg="Rule already exists!: File exists", validate=False)
-        self.create_fdir_rule(rule2[2:], check_stats=False, msg="Invalid input action number: Invalid argument", validate=False)
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions queue index 3 / mark / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2021 / end actions mark / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / udp src is 22 dst is 23 / end actions queue index 1 / mark / end']
+        self.create_fdir_rule(rule2[0:4], check_stats=False, msg="Rule already exists!: File exists", validate=False)
+        self.create_fdir_rule(rule2[4:7], check_stats=False, msg="Invalid input action number: Invalid argument", validate=False)
+        self.create_fdir_rule(rule2[7:], check_stats=False, 
+ msg="Invalid input set: Invalid argument", validate=False)
         self.check_fdir_rule(stats=True, rule_list=rule_li)
 
     def test_conflicted_actions(self):
@@ -2091,7 +2278,7 @@ class TestCVLFdir(TestCase):
             eal_param = self.dut.create_eal_parameters(cores="1S/4C/1T", ports=[self.pci0 + ",flow-mark-support=1",
                                                                                 self.pci1 + ",flow-mark-support=1"],
                                                        socket=self.ports_socket)
-            param = " -- -i --portmask=%s --rxq=%d --txq=%d --port-topology=loop --cmdline-file=%s" % (
+            param = " --log-level='ice,7' -- -i --portmask=%s --rxq=%d 
+ --txq=%d --port-topology=loop --cmdline-file=%s" % (
                 self.portMask, 64, 64, cmd_path)
             command_line = self.dut.target + "/app/testpmd " + eal_param + param
             out = self.dut.send_expect(command_line, 'testpmd>', timeout=600) @@ -2197,7 +2384,7 @@ class TestCVLFdir(TestCase):
             out = self.pmd_output.start_testpmd(cores="1S/4C/1T",
                                                 param="--portmask=%s --rxq=%d --txq=%d --port-topology=loop --cmdline-file=%s" % (
                                                     self.portMask, 64, 64, cmd_path),
-                                                eal_param="-w %s,flow-mark-support=1 -w %s,flow-mark-support=1" % (
+                                                eal_param="-w 
+ %s,flow-mark-support=1 -w %s,flow-mark-support=1 --log-level='ice,7'" 
+ % (
                                                     self.pci0, self.pci1), socket=self.ports_socket)
             self.verify('Failed to create flow' not in out, "create some rule failed")
             self.config_testpmd()
@@ -2271,6 +2458,15 @@ class TestCVLFdir(TestCase):
     def test_mac_ipv4_gtpu(self):
         self._rte_flow_validate(vectors_mac_ipv4_gtpu)
 
+    def test_l2_ethertype(self):
+        self._multirules_process(vectors_l2_ethertype)
+
+    def test_unsupported_ethertype(self):
+        rule = ['flow create 0 ingress pattern eth type is 0x0800 / end actions queue index 1 / end',
+                'flow create 0 ingress pattern eth type is 0x86dd / end actions queue index 1 / end']
+        self.create_fdir_rule(rule, check_stats=True, msg="Succeeded to create (2) flow")
+        self.check_fdir_rule(stats=True)
+
     def tear_down(self):
         # destroy all flow rule on port 0
         self.dut.send_command("flow flush 0", timeout=1)
--
2.17.1
  
Tu, Lijuan Aug. 12, 2020, 7:40 a.m. UTC | #3
> Subject: [dts] [PATCH V1 2/2] tests/cvl_fdir: add-new-case-for-test-l2-ethertype
> 
> add test case L2 Ethertype.
> 
> Signed-off-by: ChenBo <box.c.chen@intel.com>
> ---
>  tests/TestSuite_cvl_fdir.py | 208 ++++++++++++++++++++++++++++++++++--

Applied
  

Patch

diff --git a/tests/TestSuite_cvl_fdir.py b/tests/TestSuite_cvl_fdir.py
index b821961..c50799b 100644
--- a/tests/TestSuite_cvl_fdir.py
+++ b/tests/TestSuite_cvl_fdir.py
@@ -284,6 +284,18 @@  MAC_IPV4_GTPU = {
         'Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x1234567)/IP()/Raw("x"*20)']
 }
 
+L2_Ethertype = [
+    'Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x" *80)',
+    'Ether(dst="00:11:22:33:44:55", type=0x8863)/IP()/Raw("x" * 80)',
+    'Ether(dst="00:11:22:33:44:55")/PPPoE(sessionid=3)/Raw("x" * 80)',
+    'Ether(dst="00:11:22:33:44:55", type=0x8864)/IP()/Raw("x" * 80)',
+    'Ether(dst="00:11:22:33:44:55")/ARP(pdst="192.168.1.1")',
+    'Ether(dst="00:11:22:33:44:55", type=0x0806)/Raw("x" *80)',
+    'Ether(dst="00:11:22:33:44:55",type=0x8100)',
+    'Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)',
+    'Ether(dst="00:11:22:33:44:55",type=0x88f7)/"\\x00\\x02"',
+    'Ether(dst="00:11:22:33:44:55",type=0x8847)']
+
 tv_mac_ipv4_pay_queue_index = {
     "name": "test_mac_ipv4_pay_queue_index",
     "rule": "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 1 / end",
@@ -1241,6 +1253,144 @@  vectors_mac_ipv4_gtpu = [tv_mac_ipv4_gtpu_queue_index, tv_mac_ipv4_gtpu_queue_gr
                          tv_mac_ipv4_gtpu_passthru, tv_mac_ipv4_gtpu_drop,
                          tv_mac_ipv4_gtpu_mark_rss, tv_mac_ipv4_gtpu_mark]
 
+tv_l2_ethertype_queue_index = {
+    "name": "test_l2_ethertype_queue_index",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions queue index 1 / mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions queue index 2 / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions queue index 3 / mark id 3 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions queue index 4 / mark id 4 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions queue index 5 / mark id 5 / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 1, "mark_id": 1},
+        {"port_id": 0, "queue": 1, "mark_id": 1},
+        {"port_id": 0, "queue": 2, "mark_id": 2},
+        {"port_id": 0, "queue": 2, "mark_id": 2},
+        {"port_id": 0, "queue": 3, "mark_id": 3},
+        {"port_id": 0, "queue": 3, "mark_id": 3},
+        {"port_id": 0, "queue": 4, "mark_id": 4},
+        {"port_id": 0, "queue": 4, "mark_id": 4},
+        {"port_id": 0, "queue": 5, "mark_id": 5},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_queue_group = {
+    "name": "test_l2_ethertype_queue_group",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions rss queues 0 1 end / mark id 0 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions rss queues 2 3 end / mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions rss queues 4 5 end / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions rss queues 6 7 end / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions rss queues 9 10 end / mark id 3 / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_passthru = {
+    "name": "test_l2_ethertype_passthru",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions passthru / mark / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions passthru / mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions passthru / mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions passthru / mark id 3 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions passthru / mark id 4 / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0, "mark_id": 4},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_mark_rss = {
+    "name": "test_l2_ethertype_mark_rss",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions rss / mark id 0 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions mark id 1 / rss / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions mark / rss / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions rss / mark / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions mark id 3 / rss / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 3},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_mark = {
+    "name": "test_l2_ethertype_mark",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions mark id 0 / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions mark id 1 / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions mark id 2 / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions mark / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 1},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 2},
+        {"port_id": 0, "queue": 0, "mark_id": 0},
+        {"port_id": 0, "queue": 0}]
+}
+
+tv_l2_ethertype_drop = {
+    "name": "test_l2_ethertype_drop",
+    "rule": [
+        "flow create 0 ingress pattern eth type is 0x8863 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x8864 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x0806 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x8100 / end actions drop / end",
+        "flow create 0 ingress pattern eth type is 0x88f7 / end actions drop / end"],
+    "scapy_str": L2_Ethertype,
+    "check_param": [
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "drop": 1},
+        {"port_id": 0, "queue": 0}]
+}
+
+vectors_l2_ethertype = [tv_l2_ethertype_queue_index,
+                        tv_l2_ethertype_queue_group,
+                        tv_l2_ethertype_passthru,
+                        tv_l2_ethertype_drop,
+                        tv_l2_ethertype_mark_rss,
+                        tv_l2_ethertype_mark]
 
 class TestCVLFdir(TestCase):
 
@@ -1306,6 +1456,36 @@  class TestCVLFdir(TestCase):
                 failed_cases.append(k)
         self.verify(all(test_results.values()), "{} failed.".format(failed_cases))
 
+    def _multirules_process(self, vectors, port_id=0):
+        # create rules on only one port
+        test_results = {}
+        rule_li = []
+        for tv in vectors:
+            try:
+                port_id = port_id
+                pkts=tv["scapy_str"]
+                check_param=tv["check_param"]
+                self.destroy_fdir_rule(rule_id=rule_li, port_id=port_id)
+
+                # validate rules and create rules
+                rule_li = self.create_fdir_rule(tv["rule"], check_stats=True)
+
+                for i in range(len(pkts)):
+                    port_id = check_param[i]["port_id"]
+                    out = self.send_pkts_getouput(pkts=pkts[i], drop=check_param[i].get("drop"))
+                    rfc.check_mark(out, pkt_num=1, check_param=check_param[i])
+                test_results[tv["name"]] = True
+                print((GREEN("case passed: %s" % tv["name"])))
+            except Exception as e:
+                print((RED(e)))
+                test_results[tv["name"]] = False
+                continue
+        failed_cases = []
+        for k, v in list(test_results.items()):
+            if not v:
+                failed_cases.append(k)
+        self.verify(all(test_results.values()), "{} failed.".format(failed_cases))
+
     def set_up_all(self):
         """
         Run at the start of each test suite.
@@ -1705,15 +1885,22 @@  class TestCVLFdir(TestCase):
         self.check_fdir_rule(stats=True, rule_list=rule_li)
 
     def test_conflicted_rules(self):
-        rule1 = "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end"
+        rule1 = [
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / end actions queue index 1 / mark / end']
         rule_li = self.create_fdir_rule(rule1, check_stats=True)
         rule2 = [
             "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 2 / end",
             "flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions drop / end",
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / end actions queue index 2 / mark / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / end actions rss queues 2 3 end / mark / end',
             'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 3 / mark / end',
-            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions queue index 3 / mark / end']
-        self.create_fdir_rule(rule2[0:2], check_stats=False, msg="Rule already exists!: File exists", validate=False)
-        self.create_fdir_rule(rule2[2:], check_stats=False, msg="Invalid input action number: Invalid argument", validate=False)
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions queue index 3 / mark / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2021 / end actions mark / end',
+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / udp src is 22 dst is 23 / end actions queue index 1 / mark / end']
+        self.create_fdir_rule(rule2[0:4], check_stats=False, msg="Rule already exists!: File exists", validate=False)
+        self.create_fdir_rule(rule2[4:7], check_stats=False, msg="Invalid input action number: Invalid argument", validate=False)
+        self.create_fdir_rule(rule2[7:], check_stats=False, msg="Invalid input set: Invalid argument", validate=False)
         self.check_fdir_rule(stats=True, rule_list=rule_li)
 
     def test_conflicted_actions(self):
@@ -2091,7 +2278,7 @@  class TestCVLFdir(TestCase):
             eal_param = self.dut.create_eal_parameters(cores="1S/4C/1T", ports=[self.pci0 + ",flow-mark-support=1",
                                                                                 self.pci1 + ",flow-mark-support=1"],
                                                        socket=self.ports_socket)
-            param = " -- -i --portmask=%s --rxq=%d --txq=%d --port-topology=loop --cmdline-file=%s" % (
+            param = " --log-level='ice,7' -- -i --portmask=%s --rxq=%d --txq=%d --port-topology=loop --cmdline-file=%s" % (
                 self.portMask, 64, 64, cmd_path)
             command_line = self.dut.target + "/app/testpmd " + eal_param + param
             out = self.dut.send_expect(command_line, 'testpmd>', timeout=600)
@@ -2197,7 +2384,7 @@  class TestCVLFdir(TestCase):
             out = self.pmd_output.start_testpmd(cores="1S/4C/1T",
                                                 param="--portmask=%s --rxq=%d --txq=%d --port-topology=loop --cmdline-file=%s" % (
                                                     self.portMask, 64, 64, cmd_path),
-                                                eal_param="-w %s,flow-mark-support=1 -w %s,flow-mark-support=1" % (
+                                                eal_param="-w %s,flow-mark-support=1 -w %s,flow-mark-support=1 --log-level='ice,7'" % (
                                                     self.pci0, self.pci1), socket=self.ports_socket)
             self.verify('Failed to create flow' not in out, "create some rule failed")
             self.config_testpmd()
@@ -2271,6 +2458,15 @@  class TestCVLFdir(TestCase):
     def test_mac_ipv4_gtpu(self):
         self._rte_flow_validate(vectors_mac_ipv4_gtpu)
 
+    def test_l2_ethertype(self):
+        self._multirules_process(vectors_l2_ethertype)
+
+    def test_unsupported_ethertype(self):
+        rule = ['flow create 0 ingress pattern eth type is 0x0800 / end actions queue index 1 / end',
+                'flow create 0 ingress pattern eth type is 0x86dd / end actions queue index 1 / end']
+        self.create_fdir_rule(rule, check_stats=True, msg="Succeeded to create (2) flow")
+        self.check_fdir_rule(stats=True)
+
     def tear_down(self):
         # destroy all flow rule on port 0
         self.dut.send_command("flow flush 0", timeout=1)