get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/119556/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 119556,
    "url": "http://patches.dpdk.org/api/patches/119556/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20221108150636.2459852-3-yogesh.jangra@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20221108150636.2459852-3-yogesh.jangra@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20221108150636.2459852-3-yogesh.jangra@intel.com",
    "date": "2022-11-08T15:06:35",
    "name": "[2/3] test/flow_classify_softnic: removed the test suite as per dpdk changes",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "71d6a1c9fb902769a77e0f1ce1e381951fdc93f0",
    "submitter": {
        "id": 2025,
        "url": "http://patches.dpdk.org/api/people/2025/?format=api",
        "name": "Yogesh Jangra",
        "email": "yogesh.jangra@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20221108150636.2459852-3-yogesh.jangra@intel.com/mbox/",
    "series": [
        {
            "id": 25623,
            "url": "http://patches.dpdk.org/api/series/25623/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=25623",
            "date": "2022-11-08T15:06:33",
            "name": "update testsuites that uses softnic driver",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/25623/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/119556/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/119556/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 20806A0093;\n\tTue,  8 Nov 2022 16:16:39 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 16E0342D3B;\n\tTue,  8 Nov 2022 16:16:39 +0100 (CET)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by mails.dpdk.org (Postfix) with ESMTP id F283A400D4\n for <dts@dpdk.org>; Tue,  8 Nov 2022 16:16:35 +0100 (CET)",
            "from fmsmga007.fm.intel.com ([10.253.24.52])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 Nov 2022 07:06:48 -0800",
            "from ena3-s2600wft.iind.intel.com ([10.235.221.73])\n by fmsmga007.fm.intel.com with ESMTP; 08 Nov 2022 07:06:46 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1667920596; x=1699456596;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=/QJLB01/X451eneHSj0qGhCamK8wJDjSzPX86F8KQ70=;\n b=ZT4THohP27ho2v/fobWgiDDtSRELv5gNINE6QxSnjYlaYQ8AvdrmSZxp\n bdbX8P1WPeT/yk5M+iueUltc7NbWoS/fGWTeamSemxkQ0Vx5O/y3hKcQG\n 9GSc0EA7bwe6PqeZ+gvWhb1Bml/tTD8onnR1mzO1HBQQp02LUZBJuqZ3R\n 7zOH3OlU/7kYMAS+Gusnsxe6VvxUMN9uPM8ifY8wJmY13QV5VCGtdbcDf\n E+fnWw0vbsuF49A4G4W6Y/xcFTGVJt3WqMT1Bd3d/oeGpkPn86LcHSx4g\n HqekAxt8AdbwckJyvzM8d9QKbHL43yGD0cRoJEc36FdAcm6xM4PExaHCA Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6500,9779,10525\"; a=\"310715299\"",
            "E=Sophos;i=\"5.96,148,1665471600\"; d=\"scan'208\";a=\"310715299\"",
            "E=McAfee;i=\"6500,9779,10525\"; a=\"638816586\"",
            "E=Sophos;i=\"5.96,148,1665471600\"; d=\"scan'208\";a=\"638816586\""
        ],
        "X-ExtLoop1": "1",
        "From": "Yogesh Jangra <yogesh.jangra@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "cristian.dumitrescu@intel.com, kamalakannan.r@intel.com,\n harshad.suresh.narayane@intel.com",
        "Subject": "[PATCH 2/3] test/flow_classify_softnic: removed the test suite as per\n dpdk changes",
        "Date": "Tue,  8 Nov 2022 20:36:35 +0530",
        "Message-Id": "<20221108150636.2459852-3-yogesh.jangra@intel.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20221108150636.2459852-1-yogesh.jangra@intel.com>",
        "References": "<20221108150636.2459852-1-yogesh.jangra@intel.com>",
        "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 <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org"
    },
    "content": "Flow classify softnic testsuite used the Soft NIC driver. In dpdk 22.11\nrelease Soft NIC driver is using rte_swx_pipeline_xxx library. Support for\nthe flow CLI has been removed. So removed the test suite and dependencies\nrelated to that.\n\nSigned-off-by: Yogesh Jangra <yogesh.jangra@intel.com>\n---\n dep/flow_classify_softnic.tar.gz              |  Bin 1610 -> 0 bytes\n .../flow_classify_softnic_test_plan.rst       | 1261 -------\n test_plans/index.rst                          |    1 -\n tests/TestSuite_flow_classify_softnic.py      | 3003 -----------------\n 4 files changed, 4265 deletions(-)\n delete mode 100644 dep/flow_classify_softnic.tar.gz\n delete mode 100644 test_plans/flow_classify_softnic_test_plan.rst\n delete mode 100644 tests/TestSuite_flow_classify_softnic.py",
    "diff": "diff --git a/dep/flow_classify_softnic.tar.gz b/dep/flow_classify_softnic.tar.gz\ndeleted file mode 100644\nindex bbcfe73918dd2eb4efc68ec6662ef610c52bdd7f..0000000000000000000000000000000000000000\nGIT binary patch\nliteral 0\nHcmV?d00001\n\nliteral 1610\nzcmaLV`CF3t0tIky=1Lna)MSXJWj0hUqY3D6uT}%2q2pwRsTlfbO^zmuqmK2)&5_ax\nz+?QNiOf;9w(8=Xu<)oNvYNkn=;-H}^4Hyu--|61@{hrT1aL)4_OuDH-*f=@Zz;G$#\nzIJ1bfNktXWd95Z<GQ@?&;TZoa22PkOQD+pHdv`}(H~PocE{%#Xk63%^@+O;zb{RwL\nzu-=fK`f)yHV#@$z$#W;9O^Tm8e6UlDp!IQ0fqq8M9sVdY*9>T;d`SJjSXW4+a>$W`\nz&h*8P4n2<Pbb_rEtJEhHg#>)cr28l7W#=W+TwL<~+uXNMV`Z3I+|$Y^0_)9n_hu?a\nzY~)&zyrgBOHz>6TVJY)UkF#ehZti%oS|!>|6D8~7;c+x>xEm+3Bn-bQ`Hhl5hP7Hn\nza51#9NR_Uu>oy@Km`Ofy)y+f8Dc`S_2K$D0eJ_97v2p2@s`3g)M!|?>a#8HQF9<{u\nzBk@pG9C?9oqp2a;!eZT;!xwTmUa<by8atNW@l1|7n=I}05`u(zo>|{`)o5o)R_pwB\nzWO0Oc19U0y89RFXMbp{Eftg&kQWsJSS4QxU+OQ8cT$JHDE%(sO%sio)>febXzpP%t\nz91a=tol~M^>>{J#Z8n;3NpezL{nL3bzaQaP5oF=fFKYBH%bL<(c0H1`k~P_Pj8EBx\nzjC_;Pt)CNIX`_}r#E&=sOs|+tJ2=pgJkr3HTRjp^aPCnERv&K?5hHisE5Byly1G^5\nz6ht3rdKDG*;>W&1*69MY*zZ4*9n19-QbO<XwBF)h56h&k;Z0w?x!=#bxvy06V=UG~\nznU&5u-A1aZp|O1n_hcuzhpsxs?_KRp4>a^TKKDECtoT{Y`)A_5S!>p!<6DdEV}*M^\nz*`I3-X<kYI^)tXBEyw|^*`_;WA62B~J6m^vpusILty$qyl>3?@ef{p8aZG{4o{Mj4\nz<J7(q?XEi0Dc^A|aw2tdywn4YqcWDvUJuNSI#%5rI#q?`i6n~mmlkj2d`tauYGQwU\nzAZ{YSTe!adj7`f4qVU(mE#X6<foM`@uCUHHT=PrN`eSh<m%zz_F-bvwH1=H#_9fmw\nzW+;=v$8UC{M2`W++0MoeCMu>Qq|C5dNzAVT`Ei+QfVD3N>}gvi#J%Jt0J++HLZWNo\nzqpZ=Q2X1_pY<nzeH8i)Tm#NdqdnVII)h8Q0^$sqGK*;e1){&k^;+!m5VcP}QdgqN)\nz2HZLsq}u(m-Bfsx>R<MQblbLodoj`$i>jA<ydNw^thoKV3+c|Aj+1Wns{l)xV?sbP\nzjl8R+?YstP=S=4z^ktX}kJW(D0~KM!d_`CF%uUqa_(-;r_IlT#xxUM2Kn?XB0cMYJ\nz%CZg0BLE%Twa^2wf;&x43vTT-q$|<o6&c3VYJ=56<HQGor{Dk$2&7Q|br-<I^MQG)\nz&i8-;z!U(&EeK6PWw?=c*<P9yNP)sFI$s}P1BVCM17_ZeC<mpcnIt^{S3xmF7xmOR\nzuHk}@bSmZ4vfSgM*Fvc2R%^eMe<If$_3+Gvi@Zg7l=2?+#^>`yYm@?`h8~vNX_u$*\nzbw9yn#)=}=BeKr8)Fy#9jl;7?W&lqPiGB2k4%QykA2QU{8%~2+85m(d*a$DTh3_-@\nzj9Xg%HCPTct4Rad^s@8tVU12R_2f?x>N42a3+i_?I?dAmRh!<DSYlyRpOnd*2*yjf\nzW_Juf^CFy3h*Gs>Pr64SS)NNhu>a!kC83oXi~uBNtjoA4&JEd2Hb-V6ct<wdW?5yf\nzy=F_Y6_;1Tt*Ki6x2g&ahJ2vl4t)FCM@abj9GDM~i$FB28E|dA=OSs@?1cOu1^dJT\nzQKAAV_faa40d5-&LW9r^)s$2B+4#b+b+Nl5Q2*t}!E5W~TIhw(tmw(9Hn7JJP!UPD\nzz=pb6)*Q6$g#YP6Wn_DFx5~3_JEOhj7#bd<0^eRaU_AZ~e1qr!CVv3lJdK-eWQ)i$\nz5?dbLuc3MAiR57&hMcbgD{wwanF5diSEBY^I86^IO?_x(^?|v`&2!q6W3!gG%Gs~4\nzybaS_VVm&}fcW@xQI8?WWGqgf4p^2Q=XSQ8+u6Z6Z(e8r+g*eIpD?}}W9J@^HRv`l\nF_zU2)ON0Ob\n\ndiff --git a/test_plans/flow_classify_softnic_test_plan.rst b/test_plans/flow_classify_softnic_test_plan.rst\ndeleted file mode 100644\nindex f34608e8..00000000\n--- a/test_plans/flow_classify_softnic_test_plan.rst\n+++ /dev/null\n@@ -1,1261 +0,0 @@\n-.. SPDX-License-Identifier: BSD-3-Clause\n-   Copyright(c) 2017 Intel Corporation\n-\n-===================================\n-Flow classification for softnic PMD\n-===================================\n-\n-Description\n-===========\n-The SoftNIC allows building custom NIC pipelines in SW. The Soft NIC pipeline is configurable through firmware (DPDK Packet Framework script).\n-\n-Prerequisites\n-=============\n-The DUT can have 4*10G Ethernet ports or 2*10G Ethernet ports.\n-We design case with 4*10G Ethernet ports.\n-The DUT have four 10G Ethernet ports connected to four ports on tester that are controlled by the Scapy packet generator::\n-\n-    dut_port_0 <---> tester_port_0\n-    dut_port_1 <---> tester_port_1\n-    dut_port_2 <---> tester_port_2\n-    dut_port_3 <---> tester_port_3\n-\n-Assume four DUT 10G Ethernet ports' pci device id is as the following::\n-\n-    dut_port_0 : \"0000:05:00.0\"\n-    dut_port_1 : \"0000:05:00.1\"\n-    dut_port_2 : \"0000:05:00.2\"\n-    dut_port_3 : \"0000:05:00.3\"\n-\n-Bind them to dpdk igb_uio driver::\n-\n-    ./usertools/dpdk-devbind.py -b igb_uio 05:00.0 05:00.1 05:00.2 05:00.3\n-\n-Change ./drivers/net/softnic/firmware.cli to meet the specific test environment.\n-Change ports info to your actual ports info::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-    link LINK2 dev 0000:05:00.2\n-    link LINK3 dev 0000:05:00.3\n-\n-Other changes are shown in each case.\n-\n-Start softnic with following command line::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 \\\n-    --vdev 'net_softnic0,firmware=./drivers/net/softnic/firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --portmask=0x10\n-    testpmd> start\n-\n-Test Case: ipv4 ACL table\n-=========================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-    pipeline RX table match acl ipv4 offset 270 size 4K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_acl_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Validate a rule::\n-\n-    flow validate 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.0.0.0 proto spec 17 / udp src mask \\\n-    65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-4. Add rules to table::\n-\n-    flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.0.0.0 proto spec 17 / udp src mask \\\n-    65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-    flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.64.0.0 proto spec 6 / tcp src mask\n-    65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 2 / end\n-\n-    flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.192.0.0 \\\n-    dst mask 0.0.0.0 src spec 2.128.0.0 dst spec 0.0.0.0 proto spec 132 / sctp src mask \\\n-    65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 4.0.0.0 proto spec 17 / udp src mask \\\n-    65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end\n-    testpmd> start\n-\n-5. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='0.0.0.0', dst='2.0.0.0',proto=17)/UDP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='0.0.0.0', dst='2.64.0.0',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='2.128.0.0', dst='0.0.0.0',proto=132)/SCTP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='0.0.0.0', dst='4.0.0.0',proto=17)/UDP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='0.0.0.0', dst='3.0.0.0',proto=17)/UDP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='0.0.0.0', dst='2.64.0.0',proto=17)/UDP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='2.128.0.0', dst='0.0.0.0',proto=132)/SCTP(sport=101, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last 3 packets weren't forwarded.\n-\n-6. Query the rule::\n-\n-    testpmd> flow query 4 3 queue\n-    Cannot query action type 6 (QUEUE)\n-\n-7. destroy and flush the rule::\n-\n-    testpmd> flow list 4\n-    ID      Group   Prio    Attr    Rule\n-    0       0       0       i--     ETH IPV4 UDP => QUEUE\n-    1       0       0       i--     ETH IPV4 TCP => QUEUE\n-    2       0       0       i--     ETH IPV4 SCTP => QUEUE\n-    3       0       0       i--     ETH IPV4 UDP => QUEUE\n-\n-    testpmd> flow destroy 4 rule 1\n-    Flow rule #1 destroyed\n-    testpmd> flow list 4\n-    ID      Group   Prio    Attr    Rule\n-    0       0       0       i--     ETH IPV4 UDP => QUEUE\n-    2       0       0       i--     ETH IPV4 SCTP => QUEUE\n-    3       0       0       i--     ETH IPV4 UDP => QUEUE\n-\n-8. Send packets, pkt1 to port3, pkt2 can't be forwarded, pkt3 to port1, pkt4 to port0::\n-\n-    testpmd> flow flush 4\n-    testpmd> flow list 4\n-\n-   No rule listed.\n-   Send the first 4 packets, none of them was forwarded.\n-\n-9. Shutdown the port, the rules will be flushed.\n-   Re-add the four rules, then start forward.\n-   The first 4 packets can be forwarded to port3/2/1/0.\n-   Then::\n-\n-    testpmd> stop\n-    testpmd> port stop 4\n-    testpmd> port start 4\n-    testpmd> start\n-\n-   Send the first 4 packets, none of them was forwarded.\n-\n-Notes: The IPv4 header source address mask must be set from high bits to low bits.\n-255.255.192.0 is legal.\n-255.192.255.0 is illegal.\n-\n-Test Case: ipv4-5tuple hash table\n-=================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF \\\n-    offset 278 buckets 16K size 64K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_5tuple_hash_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 6 / udp src mask \\\n-    65535 dst mask 65535 src spec 101 dst spec 201 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 100.0.0.2 dst spec 200.0.0.2 proto spec 17 / udp src mask \\\n-    65535 dst mask 65535 src spec 102 dst spec 202 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 100.0.0.3 dst spec 200.0.0.3 proto spec 132 / udp src mask \\\n-    65535 dst mask 65535 src spec 103 dst spec 203 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 100.0.0.4 dst spec 200.0.0.4 proto spec 17 / udp src mask \\\n-    65535 dst mask 65535 src spec 104 dst spec 204 / end actions queue index 0 / end\n-\n-    testpmd> start\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.1', dst='200.0.0.1',proto=6)/TCP(sport=101, dport=201)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.2', dst='200.0.0.2',proto=17)/UDP(sport=102, dport=202)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.3', dst='200.0.0.3',proto=132)/SCTP(sport=103, dport=203)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.0.4',proto=17)/UDP(sport=104, dport=204)/('X'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   Change any parameter of the 5 tuple, the packet can't forwarded to any port.\n-\n-Test Case: ipv4-addr hash table\n-===============================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-\n-a) Match ipv4 src_addr::\n-\n-    pipeline RX table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 16K size 64K action AP0\n-\n-b) Match ipv4 dst_addr::\n-\n-    pipeline RX table match hash ext key 8 mask FFFFFF0000000000 offset 286 buckets 16K size 64K action AP0\n-\n-c) Match UDP SPORT::\n-\n-    pipeline RX table match hash ext key 8 mask FFFF000000000000 offset 290 buckets 16K size 64K action AP0\n-\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_addr_hash_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table.\n-\n-a) Match the table a::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \\\n-    255.255.255.255 dst mask 0.0.0.0 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \\\n-    255.255.255.255 dst mask 0.0.0.0 src spec 100.0.0.2 dst spec 200.0.0.1 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \\\n-    255.255.255.255 dst mask 0.0.0.0 src spec 100.0.0.3 dst spec 200.0.0.1 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \\\n-    255.255.255.255 dst mask 0.0.0.0 src spec 100.0.0.4 dst spec 200.0.0.1 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-b) Match the table b::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 255.255.255.0 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 / udp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 255.255.255.0 src spec 100.0.0.1 dst spec 200.0.1.1 proto spec 6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 255.255.255.0 src spec 100.0.0.1 dst spec 200.0.2.1 proto spec 132 / sctp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 255.255.255.0 src spec 100.0.0.1 dst spec 200.0.3.1 / end actions queue index 0 / end\n-\n-c) Match the table c::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 0.0.0.0 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 / udp src mask 65535 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 0.0.0.0 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 0 src spec 101 dst spec 200 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 0.0.0.0 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 132 / sctp src mask 65535 \\\n-    dst mask 0 src spec 102 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 0.0.0.0 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 / udp src mask 65535 \\\n-    dst mask 0 src spec 103 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> start\n-\n-   Notes: The added rule must be consistent with the match table format defined in firmware.cli\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports.\n-\n-a) Match ipv4 src_addr::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.1', dst='200.0.0.1',proto=6)/TCP(sport=101, dport=201)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.2', dst='200.0.0.2',proto=17)/UDP(sport=102, dport=202)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.3', dst='200.0.0.3',proto=132)/SCTP(sport=103, dport=203)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.0.4')/('X'*48), iface=\"enp131s0f3\")\n-\n-   The 4 packets were forwarded to port3/2/1/0.\n-   Change the ipv4 src address, the packet can't forwarded to any port.\n-\n-b) Match ipv4 dst_addr::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.1', dst='200.0.0.1',proto=6)/TCP(sport=101, dport=201)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.2', dst='200.0.1.2',proto=17)/UDP(sport=102, dport=202)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.3', dst='200.0.2.3',proto=132)/SCTP(sport=103, dport=203)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.3.4')/('X'*48), iface=\"enp131s0f3\")\n-\n-   The 4 packets were forwarded to port3/2/1/0.\n-   Change the ipv4 first 6 bytes of dst address, the packet can't forwarded to any port.\n-\n-c) Match sport::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.1', dst='200.0.0.1',proto=6)/TCP(sport=100, dport=201)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.2', dst='200.0.1.2',proto=17)/UDP(sport=101, dport=202)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.3', dst='200.0.2.3',proto=132)/SCTP(sport=102, dport=203)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.2', dst='200.0.1.2',proto=17)/UDP(sport=103, dport=202)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.3.4')/('X'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last packet can't forwarded to any port.\n-   Change the udp/tcp/sctp sport, the packet can't forwarded to any port.\n-\n-Test Case: ipv6 ACL table\n-=========================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-    pipeline RX table match acl ipv6 offset 270 size 4K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_acl_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 src \\\n-    mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 src \\\n-    mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 dst spec 0:0:0:0:0:0:0:0 proto spec 6 \\\n-    / tcp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 src \\\n-    mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:7789 dst spec 0:0:0:0:0:0:0:0 proto spec 132 \\\n-    / sctp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 src \\\n-    mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:8789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 65535 dst mask 0 src spec 101 dst spec 0 / end actions queue index 0 / end\n-\n-    testpmd> start\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\", dst=\"2001::2\",nh=17)/UDP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", dst=\"2001::2\",nh=6)/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\", dst=\"2001::2\",nh=132)/SCTP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", dst=\"2001::2\",nh=17)/UDP(sport=101, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:9789\", dst=\"2001::2\",nh=17)/UDP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", dst=\"2001::2\",nh=17)/UDP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", dst=\"2001::2\",nh=17)/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last 3 packets weren't forwarded.\n-\n-Test Case: ipv6-addr hash table\n-===============================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-\n-a) Match ipv6 src_addr::\n-\n-    pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\n-\n-b) Match ipv6 dst_addr::\n-\n-    pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 294 buckets 16K size 64K action AP0\n-\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_addr_hash_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table.\n-\n-a) Match ipv6 src_addr::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:7789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:8789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 0 / end\n-\n-b) Match ipv6 dst_addr::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \\\n-    dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 src spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \\\n-    dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 src spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \\\n-    dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:7789 src spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \\\n-    dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:8789 src spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 0 / end\n-\n-    testpmd> start\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports.\n-\n-a) Match ipv6 src_addr::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\", dst=\"2001::2\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", dst=\"2001::2\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\", dst=\"2001::2\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", dst=\"2001::2\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:9789\", dst=\"2001::2\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-b) Match ipv6 dst_addr::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:9789\")/TCP(sport=32, dport=33)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last packet weren't be forwarded to any port.\n-\n-Test Case: ipv6-5tuple hash table\n-=================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_5tuple_hash_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::1 dst spec 0::1 proto spec 17 / udp src mask 65535 dst mask 65535 src spec 31 dst spec 41 \\\n-    / end actions queue index 3 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::2 dst spec 0::2 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 32 dst spec 42\n-    / end actions queue index 2 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::3 dst spec 0::3 proto spec 132 / sctp src mask 65535 dst mask 65535 src spec 33 dst spec 43 \\\n-    / end actions queue index 1 / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::4 dst spec 0::4 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 34 dst spec 44 \\\n-    / end actions queue index 0 / end\n-\n-    testpmd> start\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"0::1\")/UDP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::2\", dst=\"0::2\")/TCP(sport=32, dport=42)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::3\", dst=\"0::3\",nh=132)/SCTP(sport=33, dport=43)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::4\", dst=\"0::4\")/TCP(sport=34, dport=44)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"0::1\")/TCP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last packet weren't be forwarded to any port.\n-\n-Test Case: ipv4 rule item inconsistent with table match format\n-==============================================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-\n-a) Match ipv4 src_addr::\n-\n-    pipeline RX table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 16K size 64K action AP0\n-\n-b) Match ipv4 dst_addr::\n-\n-    pipeline RX table match hash ext key 8 mask FFFFFF0000000000 offset 286 buckets 16K size 64K action AP0\n-\n-   Map the flowapi to softnic table::\n-\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_addr_hash_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table.\n-\n-a) Map the table a::\n-\n-    flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 255.255.255.255 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-   Error reported, rule item is inconsistent with the table match.\n-   Table with hask key mask for src addr, but the rule added is for dst addr.\n-\n-b) Map the table b::\n-\n-    flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \\\n-    dst mask 255.255.255.255 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\n-\n-   Error reported, rule item is inconsistent with the table match.\n-   Table with hask key mask for dst addr 255.255.255.0, but the rule added is 255.255.255.255.\n-\n-Test Case: ipv6 rule item inconsistent with table match format\n-==============================================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-\n-a) Match ipv6 5tuple::\n-\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-b) Match ipv6 dst_addr::\n-\n-    pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 294 buckets 16K size 64K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_5tuple_hash_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table.\n-\n-a) Map the table a::\n-\n-    flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 src mask \\\n-    ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::1 dst spec 0::1 proto spec 17 / udp src mask 0 dst mask 65535 \\\n-    src spec 31 dst spec 41 / end actions queue index 3 / end\n-\n-   Error reported, rule item is inconsistent with the table match.\n-   Table with hask key mask for 5 tuple, but the rule added mask udp src with 0.\n-\n-b) Map the table b::\n-\n-    flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 src mask \\\n-    ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 src spec \\\n-    ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \\\n-    / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 3 / end\n-\n-   Error reported, rule item is inconsistent with the table match.\n-   Table with hask key mask for dst addr, but the rule added is for src addr.\n-\n-Test Case: ipv4 hash table rss action\n-=====================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv4 offset 270 fwd balance offset 278 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF outoffset 256\n-\n-a) Table a::\n-\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\n-\n-b) Table b::\n-\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFF00FFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\n-\n-c) Table c::\n-\n-    pipeline RX table match hash ext key 8 mask FFFF0000FFFFFFFF offset 282 buckets 16K size 64K action AP0\n-\n-   Map the flowapi to softnic table::\n-\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_rss_firmware.cli,cpu_id=1,conn_port=8086'\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table.\n-\n-a) Map the table a::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 3 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec 17 / udp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 2 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.2 dst spec 2.20.21.2 proto spec 132 / sctp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 1 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.3 dst spec 2.20.21.3 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 0 end / end\n-\n-b) Map the table b::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.0 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 0 1 2 3 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.0 \\\n-    dst mask 255.255.255.255 src spec 1.10.12.0 dst spec 2.20.21.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 0 1 2 3 end / end\n-\n-c) Map the table c::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 255.255.0.0 \\\n-    dst mask  255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions rss queues 0 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 255.255.0.0 \\\n-    dst mask  255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.1 proto spec 6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions rss queues 2 3 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 255.255.0.0 \\\n-    dst mask  255.255.255.255 src spec 2.10.11.0 dst spec 2.20.21.1 proto spec 6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions rss queues 1 2 end / end\n-\n-    testpmd> start\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports.\n-\n-a) Match the table a::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.0\", dst=\"2.20.21.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.1\", dst=\"2.20.21.1\")/UDP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.2\", dst=\"2.20.21.2\")/SCTP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.3\", dst=\"2.20.21.3\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.3\", dst=\"2.20.21.3\")/TCP(sport=101, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last packet weren't be forwarded to any port.\n-\n-b) Match the table b::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.0\", dst=\"2.20.21.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the src address from 1.10.11.0 to 1.10.11.255, and other parameters keep constant,\n-   The packets were distributed from port0 to port3 according to RSS table.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.12.0\", dst=\"2.20.21.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the src address from 1.10.12.0 to 1.10.12.255, and other parameters keep constant,\n-   The packets were distributed from port0 to port3 according to RSS table.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.13.0\", dst=\"2.20.21.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The packet was not be forwarded to any port.\n-\n-c) Match the table c::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.0\", dst=\"2.20.21.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the IP src address from 1.10.0.0 to 1.10.255.255, the packet was forwarded to port0.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.0\", dst=\"2.20.21.1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the IP src address from 1.10.0.0 to 1.10.255.255, or set sport or dport to 0-65535, the packet was forwarded to port2 or port3.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"2.10.11.0\", dst=\"2.20.21.1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the IP src address from 1.10.0.0 to 1.10.255.255, or set sport or dport to 0-65535, the packet was forwarded to port1 or port2.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"1.10.11.0\", dst=\"2.20.21.2\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The packet weren't be forwarded to any port.\n-\n-Test Case: ipv6 hash table rss action\n-=====================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below::\n-\n-    table action profile AP0 ipv6 offset 270 fwd balance offset 274 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 outoffset 256\n-\n-a) Table a::\n-\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-\n-b) Table b::\n-\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-\n-c) Table c::\n-\n-    pipeline RX table match hash ext key 64 mask 00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-\n-   Map the flowapi to softnic table::\n-\n-    flowapi map group 0 ingress pipeline RX table 0\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x1f -s 0x10 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_rss_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\n-\n-3. Add rules to table,\n-\n-a) Map the table a::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::1 dst spec 0::1 proto spec 17 / udp src mask 65535 dst mask 65535 \\\n-    src spec 31 dst spec 41 / end actions rss queues 3 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::2 dst spec 0::2 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 32 dst spec 42 / end actions rss queues 2 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::3 dst spec 0::3 proto spec 132 / sctp src mask 65535 dst mask 65535 \\\n-    src spec 33 dst spec 43 / end actions rss queues 1 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 2001::4 dst spec 0::4 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 34 dst spec 44 / end actions rss queues 0 end / end\n-\n-b) Map the table b::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:0 dst spec 0::1 proto spec 17 / udp src mask 65535 \\\n-    dst mask 65535 src spec 31 dst spec 41 / end actions rss queues 0 1 2 3 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec ABCD:EF01:2345:6789:ABCD:EF01:2346:0 dst spec 0::1 proto spec 17 / udp src mask 65535 \\\n-    dst mask 65535 src spec 31 dst spec 41 / end actions rss queues 0 1 2 3 end / end\n-\n-c) Map the table c::\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 \\\n-    src spec 2001::1 dst spec 1001::1 proto spec 17 / udp src mask 65535 dst mask 65535 \\\n-    src spec 31 dst spec 41 / end actions rss queues 0 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 \\\n-    src spec 2001::2 dst spec 1001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 32 dst spec 42 / end actions rss queues 2 3 end / end\n-\n-    testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 \\\n-    src spec 2001::1 dst spec 2001::3 proto spec 132 / sctp src mask 65535 dst mask 65535 \\\n-    src spec 33 dst spec 43 / end actions rss queues 1 2 end / end\n-\n-    testpmd> start\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports.\n-\n-a) Match the table a::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"0::1\")/UDP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::2\", dst=\"0::2\")/TCP(sport=32, dport=42)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::3\", dst=\"0::3\",nh=132)/SCTP(sport=33, dport=43)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::4\", dst=\"0::4\")/TCP(sport=34, dport=44)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"0::1\")/TCP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first 4 packets were forwarded to port3/2/1/0.\n-   The last packet weren't be forwarded to any port.\n-\n-b) Match the table b::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:0\", dst=\"0::1\")/UDP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the src address from ABCD:EF01:2345:6789:ABCD:EF01:2345:0 to ABCD:EF01:2345:6789:ABCD:EF01:2345:FFFF, and other parameters keep constant,\n-   The packets were distributed from port0 to port3 according to RSS table.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2346:0\", dst=\"0::1\")/UDP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the src address from ABCD:EF01:2345:6789:ABCD:EF01:2346:0 to ABCD:EF01:2345:6789:ABCD:EF01:2346:FFFF, and other parameters keep constant,\n-   The packets were distributed from port0 to port3 according to RSS table.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2347:0\", dst=\"0::1\")/UDP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The packet was not be forwarded to any port.\n-\n-c) Match the table c::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"1001::1\")/TCP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the IPv6 dst address from 1001::0 to 1001::FFFF, the packet was forwarded to port0.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::2\", dst=\"1001::2\")/TCP(sport=32, dport=42)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the IPv6 dst address from 1001::0 to 1001::FFFF, the packet was forwarded to port2 or port3.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"2001::3\")/TCP(sport=33, dport=43)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   Set the IPv6 dst address from 2001::0 to 2001::FFFF, the packet was forwarded to port1 or port2.::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"2001::1\", dst=\"0::1\")/TCP(sport=31, dport=41)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The packet weren't be forwarded to any port.\n-\n-Test Case: ipv4 ACL table jump action\n-=====================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-    pipeline RX table match acl ipv4 offset 270 size 4K action AP0\n-    pipeline RX table match acl ipv4 offset 270 size 4K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.0.0.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.64.0.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions queue index  1 / end\n-\n-    testpmd> create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.0.0.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \\\n-    dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.64.0.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"0.0.0.0\", dst=\"2.0.0.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IP(src=\"0.0.0.0\", dst=\"2.64.0.0\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   If change the TCP sport or dport, the packet can't be forwarded to any port.\n-\n-Notes: When only set the group 1 rules, the input packets match table 0, which map group 0, while there is no group 0 rule created.\n-So the packets can't be forwarded.\n-\n-Test Case: ipv4 HASH table jump action\n-======================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFF00000000 offset 278 buckets 16K size 64K action AP0\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFF00000000 offset 278 buckets 16K size 64K action AP0\n-    pipeline RX port in 0 table 0\n-    pipeline RX port in 1 table 0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 \\\n-    src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 \\\n-    / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 \\\n-    src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec 6 \\\n-    / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 \\\n-    src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 \\\n-    / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 \\\n-    src mask 255.255.255.255 dst mask 255.255.255.255 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec 6 \\\n-    / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.0', dst='2.20.21.0',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.1', dst='2.20.21.1',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   If change the IPv4 dst address or src address, the packet can't be forwarded to any port.\n-\n-Notes: when only set the group 1 rules, the input packets match table 0, which map group 0, while there is no group 0 rule created.\n-So the packets can't be forwarded.\n-\n-Test Case: ipv4 ACL jump to HASH table\n-======================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-   Group 0 with ACL table jump to group 1 with HASH table::\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-    pipeline RX table match acl ipv4 offset 270 size 4K action AP0\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\n-    pipeline RX port in 0 table 0\n-    pipeline RX port in 1 table 0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_acl_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec 6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec  6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec  6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.0', dst='2.20.21.0',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.1', dst='2.20.21.1',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   If change the IPv4 dst address or src address, the packet can't be forwarded to any port::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.0', dst='2.20.21.0',proto=6)/TCP(sport=101, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.1', dst='2.20.21.1',proto=6)/TCP(sport=100, dport=201)/('X'*48), iface=\"enp131s0f3\")\n-\n-   The two packets can't be forwarded to any port.\n-\n-Test Case: ipv4 HASH jump to ACL table\n-======================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-   Group 0 with ACL table jump to group 1 with HASH table::\n-\n-    table action profile AP0 ipv4 offset 270 fwd\n-    pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFF00FFFFFFFF offset 278 buckets 16K size 64K action AP0\n-    pipeline RX table match acl ipv4 offset 270 size 4K action AP0\n-    pipeline RX port in 0 table 0\n-    pipeline RX port in 1 table 0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv4_hash_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec 6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.255 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec 6 / tcp src mask 0 \\\n-    dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.0 src spec 1.10.11.0 dst spec 2.20.21.0 proto spec  6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \\\n-    dst mask 255.255.255.0 src spec 1.10.11.1 dst spec 2.20.21.1 proto spec  6 / tcp src mask 65535 \\\n-    dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.0', dst='2.20.21.0',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.1', dst='2.20.21.1',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.0', dst='2.20.21.2',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst='00:00:00:00:01:00')/IP(src='1.10.11.1', dst='2.20.21.3',proto=6)/TCP(sport=100, dport=200)/('X'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   The last two packets can't be forwarded to any ports.\n-\n-Test Case: ipv6 ACL table jump action\n-=====================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-    pipeline RX table match acl ipv6 offset 270 size 4K action AP0\n-    pipeline RX table match acl ipv6 offset 270 size 4K action AP0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::1 proto spec 6 \\\n-    / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 src mask \\\n-    ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::1 dst spec 2001::2 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::1 proto spec 6 \\\n-    / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::2 proto spec 6 \\\n-    / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"2001::1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"2001::2\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::2\", dst=\"2001::1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::2\", dst=\"2001::2\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   The third packet was forwarded to port 0, the fourth packet can't be forwarded to any port.\n-\n-Notes: When only set the group 1 rules, the input packets match table 0, which map group 0, while there is no group 0 rule created.\n-So the packets can't be forwarded.\n-\n-Test Case: ipv6 HASH table jump action\n-======================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-    pipeline RX port in 0 table 0\n-    pipeline RX port in 1 table 0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::1 dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::2 dst spec 2001::2 proto spec 17 / udp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::1 dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::2 dst spec 2001::2 proto spec 17 / udp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"2001::1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::2\", dst=\"2001::2\")/UDP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   If change the IPv6 dst address or src address, the packet can't be forwarded to any port.\n-\n-Notes: When only set the group 1 rules, the input packets match table 0, which map group 0, while there is no group 0 rule created.\n-So the packets can't be forwarded.\n-\n-Test Case: ipv6 ACL jump to HASH table\n-======================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-   Group 0 with ACL table jump to group 1 with HASH table::\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-    pipeline RX table match acl ipv6 offset 270 size 4K action AP0\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-    pipeline RX port in 0 table 0\n-    pipeline RX port in 1 table 0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_acl_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::1 dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::2 dst spec 2001::2 proto spec 6 / tcp src mask 65535 dst mask 65535 \\\n-    src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask 0:0:0:0:0:0:0:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 \\\n-    dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask 0:0:0:0:0:0:0:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::2 dst spec 2001::2 proto spec 6 \\\n-    / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"2001::1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::2\", dst=\"2001::2\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::3\", dst=\"2001::1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::4\", dst=\"2001::2\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   The last two packets can't be forwarded to any ports.\n-\n-Test Case: ipv6 HASH jump to ACL table\n-======================================\n-1. Edit flow_classification_firmware.cli to change \"table action\" and \"pipeline table\" as below,\n-   Just two links::\n-\n-    link LINK0 dev 0000:05:00.0\n-    link LINK1 dev 0000:05:00.1\n-\n-   Group 0 with ACL table jump to group 1 with HASH table::\n-\n-    table action profile AP0 ipv6 offset 270 fwd\n-    pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\n-    pipeline RX table match acl ipv6 offset 270 size 4K action AP0\n-    pipeline RX port in 0 table 0\n-    pipeline RX port in 1 table 0\n-    flowapi map group 0 ingress pipeline RX table 0\n-    flowapi map group 1 ingress pipeline RX table 1\n-\n-2. Start softnic::\n-\n-    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7 -s 0x4 -n 4 --vdev 'net_softnic0, \\\n-    firmware=./drivers/net/softnic/flow_ipv6_hash_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \\\n-    -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\n-\n-3. Add rules to table::\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \\\n-    dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::1 proto spec 6 \\\n-    / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end\n-\n-    testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::2 dst spec 2001::2 proto spec 6 / tcp src mask 0 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::1 dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-    testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \\\n-    src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \\\n-    src spec 0::2 dst spec 2001::2 proto spec 6 / tcp src mask 65535 dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end\n-\n-4. Sent packet, verify the packets were forwarded to the expected ports::\n-\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"2001::1\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::2\", dst=\"2001::2\")/TCP(sport=100, dport=200)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::1\", dst=\"2001::1\")/TCP(sport=100, dport=201)/Raw('x'*48), iface=\"enp131s0f3\")\n-    sendp(Ether(dst=\"00:00:00:00:01:00\")/IPv6(src=\"0::2\", dst=\"2001::2\")/TCP(sport=100, dport=202)/Raw('x'*48), iface=\"enp131s0f3\")\n-\n-   The first packet was forwarded to port 0, the second was forwarded to port 1.\n-   The last two packets can't be forwarded to any ports.\ndiff --git a/test_plans/index.rst b/test_plans/index.rst\nindex dc782fdf..a47e5eaf 100644\n--- a/test_plans/index.rst\n+++ b/test_plans/index.rst\n@@ -70,7 +70,6 @@ The following are the test plans for the DPDK DTS automated test system.\n     external_mempool_handler_test_plan\n     firmware_version_test_plan\n     floating_veb_test_plan\n-    flow_classify_softnic_test_plan\n     i40e_rss_input_test_plan\n     generic_flow_api_test_plan\n     hotplug_mp_test_plan\ndiff --git a/tests/TestSuite_flow_classify_softnic.py b/tests/TestSuite_flow_classify_softnic.py\ndeleted file mode 100644\nindex a3a0eed5..00000000\n--- a/tests/TestSuite_flow_classify_softnic.py\n+++ /dev/null\n@@ -1,3003 +0,0 @@\n-# SPDX-License-Identifier: BSD-3-Clause\n-# Copyright(c) 2010-2018 Intel Corporation\n-#\n-\n-import os\n-import random\n-import re\n-import time\n-from time import sleep\n-\n-import scapy.layers.inet\n-from scapy.arch import get_if_hwaddr\n-from scapy.layers.inet import ICMP, IP, TCP, UDP, Ether\n-from scapy.layers.inet6 import IPv6\n-from scapy.layers.l2 import ARP, GRE, Dot1Q\n-from scapy.layers.sctp import SCTP, SCTPChunkData\n-from scapy.packet import Raw, bind_layers\n-from scapy.route import *\n-from scapy.sendrecv import sendp, sniff\n-from scapy.utils import hexstr, rdpcap, wrpcap\n-\n-import framework.utils as utils\n-from framework.crb import Crb\n-from framework.dut import Dut\n-from framework.exception import VerifyFailure\n-from framework.packet import Packet\n-from framework.pmd_output import PmdOutput\n-from framework.project_dpdk import DPDKdut\n-from framework.settings import DRIVERS, HEADER_SIZE\n-from framework.test_case import TestCase\n-from framework.virt_dut import VirtDut\n-\n-\n-class TestFlowClassifySoftnic(TestCase):\n-    def copy_config_files_to_dut(self):\n-        \"\"\"\n-        Copy firmware.cli from tester to DUT.\n-        \"\"\"\n-        file = \"flow_classify_softnic.tar.gz\"\n-        src_file = r\"./dep/%s\" % file\n-        dst1 = \"/tmp\"\n-        dst2 = \"/root/dpdk/drivers/net/softnic\"\n-        self.dut.session.copy_file_to(src_file, dst1)\n-        self.dut.send_expect(\"tar xf %s/%s -C %s\" % (dst1, file, dst2), \"#\", 30)\n-\n-    def start_testpmd(self, filename, port_num):\n-        \"\"\"\n-        Start testpmd.\n-        \"\"\"\n-        self.cores = self.dut.get_core_list(\"all\")\n-        self.set_ports(filename, port_num)\n-        TESTPMD = self.dut.apps_name[\"test-pmd\"]\n-        cmd = \"cat /sys/bus/pci/devices/%s/numa_node\" % self.dut_p0_pci\n-        numa_node = int(self.dut.send_expect(cmd, \"# \", 60))\n-        cpu_id = numa_node if numa_node > 0 else 0\n-        ports_info = []\n-        for i in range(port_num):\n-            ports_info.append(i)\n-        eal_params = self.dut.create_eal_parameters(cores=self.cores, ports=ports_info)\n-        VDEV = (\n-            \"--vdev 'net_softnic0,firmware=./drivers/net/softnic/flow_classify_softnic/%s,cpu_id=%s,conn_port=8086'\"\n-            % (filename, cpu_id)\n-        )\n-        if port_num == 4:\n-            cmd = \"{0} {1} {2} -s 0x10 -- -i --rxq=4 --txq=4 --disable-rss --portmask=0x10\".format(\n-                TESTPMD, VDEV, eal_params\n-            )\n-        elif port_num == 2:\n-            cmd = \"{0} {1} {2} -s 0x4 -- -i --rxq=2 --txq=2 --disable-rss --portmask=0x4\".format(\n-                TESTPMD, VDEV, eal_params\n-            )\n-        else:\n-            raise Exception(\"The number of port is wrong!\")\n-        self.dut.send_expect(cmd, \"testpmd> \", 60)\n-\n-    def set_ports(self, filename, port_num):\n-        \"\"\"\n-        Set actual ports.\n-        \"\"\"\n-        self.dut.send_expect(\n-            \"sed -i '/^link LINK/d' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-            % filename,\n-            \"# \",\n-            20,\n-        )\n-        cmd = (\n-            \"sed -i '1i\\link LINK0 dev %s' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-            % (self.dut_p0_pci, filename)\n-        )\n-        self.dut.send_expect(cmd, \"# \", 20)\n-        cmd = (\n-            \"sed -i '2i\\link LINK1 dev %s' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-            % (self.dut_p1_pci, filename)\n-        )\n-        self.dut.send_expect(cmd, \"# \", 20)\n-        if port_num == 4:\n-            cmd = (\n-                \"sed -i '3i\\link LINK2 dev %s' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-                % (self.dut_p2_pci, filename)\n-            )\n-            self.dut.send_expect(cmd, \"# \", 20)\n-            cmd = (\n-                \"sed -i '4i\\link LINK3 dev %s' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-                % (self.dut_p3_pci, filename)\n-            )\n-            self.dut.send_expect(cmd, \"# \", 20)\n-        self.dut.send_expect(\n-            \"sed -i 's/^thread 4 pipeline/thread %d pipeline/g' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-            % (self.port_num, filename),\n-            \"# \",\n-            20,\n-        )\n-\n-    def set_table(self, cmd, filename):\n-        \"\"\"\n-        Set pipeline table.\n-        \"\"\"\n-        self.dut.send_expect(\n-            \"sed -i '/^pipeline RX table match/d' ./drivers/net/softnic/flow_classify_softnic/%s\"\n-            % filename,\n-            \"# \",\n-            20,\n-        )\n-        command = (\n-            \"sed -i '/^table action/a\"\n-            + cmd\n-            + \"' ./drivers/net/softnic/flow_classify_softnic/%s\" % filename\n-        )\n-        self.dut.send_expect(command, \"# \", 20)\n-\n-    def get_flow_direction_param_of_tcpdump(self):\n-        \"\"\"\n-        get flow dirction param depend on tcpdump version\n-        \"\"\"\n-        param = \"\"\n-        direct_param = r\"(\\s+)\\[ (\\S+) in\\|out\\|inout \\]\"\n-        out = self.tester.send_expect(\"tcpdump -h\", \"# \", trim_whitespace=False)\n-        for line in out.split(\"\\n\"):\n-            m = re.match(direct_param, line)\n-            if m:\n-                opt = re.search(\"-Q\", m.group(2))\n-                if opt:\n-                    param = \"-Q\" + \" in\"\n-                else:\n-                    opt = re.search(\"-P\", m.group(2))\n-                    if opt:\n-                        param = \"-P\" + \" in\"\n-        if len(param) == 0:\n-            self.logger.info(\"tcpdump not support direction choice!!!\")\n-        return param\n-\n-    def tcpdump_start_sniff(self, interface, filters=\"\"):\n-        \"\"\"\n-        Starts tcpdump in the background to sniff packets that received by interface.\n-        \"\"\"\n-        command = \"rm -f /tmp/tcpdump_{0}.pcap\".format(interface)\n-        self.tester.send_expect(command, \"#\")\n-        command = \"tcpdump -n -e {0} -w /tmp/tcpdump_{1}.pcap -i {1} {2} 2>/tmp/tcpdump_{1}.out &\".format(\n-            self.param_flow_dir, interface, filters\n-        )\n-        self.tester.send_expect(command, \"# \")\n-\n-    def tcpdump_stop_sniff(self):\n-        \"\"\"\n-        Stops the tcpdump process running in the background.\n-        \"\"\"\n-        self.tester.send_expect(\"killall tcpdump\", \"# \")\n-        # For the [pid]+ Done tcpdump... message after killing the process\n-        sleep(1)\n-        self.tester.send_expect('echo \"Cleaning buffer\"', \"# \")\n-        sleep(3)\n-\n-    def write_pcap_file(self, pcap_file, pkts):\n-        try:\n-            wrpcap(pcap_file, pkts)\n-        except:\n-            raise Exception(\"write pcap error\")\n-\n-    def read_pcap_file(self, pcap_file):\n-        pcap_pkts = []\n-        try:\n-            pcap_pkts = rdpcap(pcap_file)\n-        except:\n-            raise Exception(\"write pcap error\")\n-\n-        return pcap_pkts\n-\n-    def send_and_sniff_pkts(self, from_port, to_port, pcap_file, filters=\"\", count=1):\n-        \"\"\"\n-        Sent pkts that read from the pcap_file.\n-        Return the sniff pkts.\n-        \"\"\"\n-        self.pmdout.wait_link_status_up(\"all\")\n-        tx_port = self.tester.get_local_port(self.dut_ports[from_port % self.port_num])\n-        rx_port = self.tester.get_local_port(self.dut_ports[to_port % self.port_num])\n-\n-        tx_interface = self.tester.get_interface(tx_port)\n-        rx_interface = self.tester.get_interface(rx_port)\n-        # check tester's link status before send packet\n-        for iface in [tx_interface, rx_interface]:\n-            self.verify(\n-                self.tester.is_interface_up(intf=iface),\n-                \"Wrong link status, should be up\",\n-            )\n-\n-        self.tcpdump_start_sniff(rx_interface, filters)\n-\n-        # Prepare the pkts to be sent\n-        self.tester.scapy_foreground()\n-        self.tester.scapy_append('pkt = rdpcap(\"%s\")' % (pcap_file))\n-        self.tester.scapy_append(\n-            'sendp(pkt, iface=\"%s\", count=%d)' % (tx_interface, count)\n-        )\n-        self.tester.scapy_execute()\n-\n-        self.tcpdump_stop_sniff()\n-\n-        return self.read_pcap_file(\"/tmp/tcpdump_%s.pcap\" % rx_interface)\n-\n-    def send_pkts(self, from_port, pcap_file, count=1):\n-        \"\"\"\n-        Sent pkts that read from the pcap_file.\n-        \"\"\"\n-        tx_port = self.tester.get_local_port(self.dut_ports[from_port])\n-        tx_interface = self.tester.get_interface(tx_port)\n-\n-        # Prepare the pkts to be sent\n-        self.tester.scapy_foreground()\n-        self.tester.scapy_append('pkt = rdpcap(\"%s\")' % (pcap_file))\n-        self.tester.scapy_append(\n-            'sendp(pkt, iface=\"%s\", count=%d)' % (tx_interface, count)\n-        )\n-        self.tester.scapy_execute()\n-\n-    def send_and_check_packets(\n-        self, pcap_file, pkt, ltype, src_dst, addr_port, from_port, to_port\n-    ):\n-        \"\"\"\n-        Sent pkts that read from the pcap_file.\n-        Check if the rule works.\n-        \"\"\"\n-        self.write_pcap_file(pcap_file, pkt)\n-        checklist = []\n-        if ltype in [\"udp\", \"tcp\", \"sctp\"]:\n-            filters = \"%s %s port %d\" % (ltype, src_dst, addr_port)\n-            sniff_pkts = self.send_and_sniff_pkts(\n-                from_port, to_port, pcap_file, filters\n-            )\n-            for packet in sniff_pkts:\n-                if src_dst == \"src\":\n-                    checklist.append(packet.getlayer(2).sport)\n-                elif src_dst == \"dst\":\n-                    checklist.append(packet.getlayer(2).dport)\n-        elif ltype in [\"ipv4\", \"ipv6\"]:\n-            filters = \"%s host %s\" % (src_dst, addr_port)\n-            sniff_pkts = self.send_and_sniff_pkts(\n-                from_port, to_port, pcap_file, filters\n-            )\n-\n-            for packet in sniff_pkts:\n-                if src_dst == \"src\":\n-                    checklist.append(packet.getlayer(1).src)\n-                elif src_dst == \"dst\":\n-                    checklist.append(packet.getlayer(1).dst)\n-            addr_port = str.lower(addr_port)\n-        self.verify(addr_port in checklist, \"rule test fail\")\n-\n-    def check_status(self, rx_pkt_num, tx_pkt_num, port):\n-        \"\"\"\n-        Check port status\n-        \"\"\"\n-        rx_num = 0\n-        tx_num = 0\n-        for i in range(port):\n-            stats = self.pmdout.get_pmd_stats(self.dut_ports[i])\n-            rx_num = rx_num + stats[\"RX-packets\"]\n-            tx_num = tx_num + stats[\"TX-packets\"]\n-        self.verify(\n-            (rx_num == rx_pkt_num) and (tx_num == tx_pkt_num), \"The rule failed to work\"\n-        )\n-\n-    def generate_rules(\n-        self,\n-        operation=\"create\",\n-        port=4,\n-        group=0,\n-        iptype=\"ipv4\",\n-        src_mask=\"0.0.0.0\",\n-        dst_mask=\"0.0.0.0\",\n-        src_spec=\"0.0.0.0\",\n-        dst_spec=\"0.0.0.0\",\n-        protomask=0,\n-        protospec=17,\n-        l4type=\"udp\",\n-        sportmask=0,\n-        dportmask=0,\n-        sportspec=0,\n-        dportspec=0,\n-        action=\"queue\",\n-        index=[],\n-    ):\n-        \"\"\"\n-        Generate flow rules\n-        \"\"\"\n-        if port == 4:\n-            port = self.port_num\n-        if iptype == \"ipv6\":\n-            if src_mask == \"0.0.0.0\":\n-                src_mask = \"0:0:0:0:0:0:0:0\"\n-            if dst_mask == \"0.0.0.0\":\n-                dst_mask = \"0:0:0:0:0:0:0:0\"\n-            if src_spec == \"0.0.0.0\":\n-                src_spec = \"0:0:0:0:0:0:0:0\"\n-            if dst_spec == \"0.0.0.0\":\n-                dst_spec = \"0:0:0:0:0:0:0:0\"\n-        if action == \"queue\":\n-            actions = \"queue index %d\" % (index[0] % port)\n-        elif action == \"jump\":\n-            actions = \"jump group %d\" % (index[0] % port)\n-        elif action == \"rss\":\n-            queue_idx = \"\"\n-            for queue in index:\n-                queue_idx = queue_idx + str(queue % port) + \" \"\n-            actions = \"rss queues %s end\" % queue_idx\n-\n-        if l4type == \"\":\n-            self.dut.send_expect(\n-                \"flow %s %d group %d ingress pattern eth / %s proto mask %d src mask %s dst mask %s src spec %s dst spec %s / end actions %s / end\"\n-                % (\n-                    operation,\n-                    port,\n-                    group,\n-                    iptype,\n-                    protomask,\n-                    src_mask,\n-                    dst_mask,\n-                    src_spec,\n-                    dst_spec,\n-                    actions,\n-                ),\n-                operation,\n-                60,\n-            )\n-        else:\n-            self.dut.send_expect(\n-                \"flow %s %d group %d ingress pattern eth / %s proto mask %d src mask %s dst mask %s src spec %s dst spec %s proto spec %d / %s src mask %d dst mask %d src spec %d dst spec %d / end actions %s / end\"\n-                % (\n-                    operation,\n-                    port,\n-                    group,\n-                    iptype,\n-                    protomask,\n-                    src_mask,\n-                    dst_mask,\n-                    src_spec,\n-                    dst_spec,\n-                    protospec,\n-                    l4type,\n-                    sportmask,\n-                    dportmask,\n-                    sportspec,\n-                    dportspec,\n-                    actions,\n-                ),\n-                operation,\n-                60,\n-            )\n-\n-    def send_continuous_packet(self, ptype, src_dst, src_addr, dst_addr, itf):\n-        \"\"\"\n-        Sends continuous packets.\n-        \"\"\"\n-        self.pmdout.wait_link_status_up(\"all\")\n-        self.verify(\n-            self.tester.is_interface_up(intf=itf), \"Wrong link status, should be up\"\n-        )\n-        self.tester.scapy_foreground()\n-        if src_dst == \"src\":\n-            if ptype == \"ipv4\":\n-                var = src_addr.split(\".\")\n-                string = \".\"\n-                ipaddr = string.join(var[0:3])\n-                for i in range(32):\n-                    packet = (\n-                        r'sendp([Ether(dst=\"%s\", src=get_if_hwaddr(\"%s\"))/IP(src=\"%s.%d\", dst=\"%s\", proto=17)/UDP(sport=100, dport=200)], iface=\"%s\")'\n-                        % (self.dut_p0_mac, itf, ipaddr, i, dst_addr, itf)\n-                    )\n-                    self.tester.scapy_append(packet)\n-                self.tester.scapy_execute()\n-            elif ptype == \"ipv6\":\n-                var = src_addr.split(\":\")\n-                string = \":\"\n-                if len(var) == 8:\n-                    ipaddr = string.join(var[0:7])\n-                else:\n-                    ipaddr = string.join(var[0 : (len(var) - 1)])\n-                for i in range(16):\n-                    packet = (\n-                        r'sendp([Ether(dst=\"%s\", src=get_if_hwaddr(\"%s\"))/IPv6(src=\"%s:%d\", dst=\"%s\", nh=17)/UDP(sport=100, dport=200)], iface=\"%s\")'\n-                        % (self.dut_p0_mac, itf, ipaddr, i, dst_addr, itf)\n-                    )\n-                    self.tester.scapy_append(packet)\n-                self.tester.scapy_execute()\n-\n-        elif src_dst == \"dst\":\n-            if ptype == \"ipv4\":\n-                var = dst_addr.split(\".\")\n-                string = \".\"\n-                ipaddr = string.join(var[0:3])\n-                for i in range(32):\n-                    packet = (\n-                        r'sendp([Ether(dst=\"%s\", src=get_if_hwaddr(\"%s\"))/IP(src=\"%s\", dst=\"%s.%d\", proto=17)/UDP(sport=100, dport=100)], iface=\"%s\")'\n-                        % (self.dut_p0_mac, itf, src_addr, ipaddr, i, itf)\n-                    )\n-                    self.tester.scapy_append(packet)\n-                self.tester.scapy_execute()\n-            elif ptype == \"ipv6\":\n-                var = dst_addr.split(\":\")\n-                string = \":\"\n-                if len(var) == 8:\n-                    ipaddr = string.join(var[0:7])\n-                else:\n-                    ipaddr = string.join(var[0 : (len(var) - 1)])\n-                for i in range(16):\n-                    packet = (\n-                        r'sendp([Ether(dst=\"%s\", src=get_if_hwaddr(\"%s\"))/IPv6(src=\"%s\", dst=\"%s:%d\", nh=17)/UDP(sport=100, dport=200)], iface=\"%s\")'\n-                        % (self.dut_p0_mac, itf, src_addr, ipaddr, i, itf)\n-                    )\n-                    self.tester.scapy_append(packet)\n-                self.tester.scapy_execute()\n-\n-    def check_packet_queue(self, queues=[], out=\"\"):\n-        \"\"\"\n-        Get the queue which packet enter.\n-        \"\"\"\n-        time.sleep(2)\n-        for queue in queues:\n-            self.verify(\n-                \"Queue= %d\" % (queue % self.port_num) in out,\n-                \"There is some queues doesn't work.\",\n-            )\n-        lines = out.split(\"\\r\\n\")\n-        reta_line = {}\n-        queue_flag = 0\n-        # collect the hash result and the queue id\n-        for line in lines:\n-            line = line.strip()\n-            if queue_flag == 1:\n-                result_scanner = r\"RX-packets:\\s?([0-9]+)\"\n-                scanner = re.compile(result_scanner, re.DOTALL)\n-                m = scanner.search(line)\n-                rxpkt_num = m.group(1)\n-                result_scanner = r\"TX-packets:\\s?([0-9]+)\"\n-                scanner = re.compile(result_scanner, re.DOTALL)\n-                m = scanner.search(line)\n-                txpkt_num = m.group(1)\n-                self.verify(\n-                    rxpkt_num == txpkt_num, \"There are some packets failed to forward.\"\n-                )\n-                queue_flag = 0\n-            elif line.strip().startswith(\"------- Forward\"):\n-                queue_flag = 1\n-\n-    def set_up_all(self):\n-        \"\"\"\n-        Run at the start of each test suite.\n-        \"\"\"\n-        self.dut_ports = self.dut.get_ports()\n-        self.port_num = len(self.dut_ports)\n-        self.verify(\n-            self.port_num == 2 or self.port_num == 4,\n-            \"Insufficient ports for speed testing\",\n-        )\n-\n-        self.dut_p0_pci = self.dut.get_port_pci(self.dut_ports[0])\n-        self.dut_p1_pci = self.dut.get_port_pci(self.dut_ports[1])\n-        self.dut_p0_mac = self.dut.get_mac_address(self.dut_ports[0])\n-        self.dut_p1_mac = self.dut.get_mac_address(self.dut_ports[1])\n-        self.pf0_interface = self.dut.ports_info[self.dut_ports[0]][\"intf\"]\n-        self.pf1_interface = self.dut.ports_info[self.dut_ports[1]][\"intf\"]\n-\n-        if self.port_num == 4:\n-            self.dut_p2_pci = self.dut.get_port_pci(self.dut_ports[2])\n-            self.dut_p3_pci = self.dut.get_port_pci(self.dut_ports[3])\n-            self.dut_p2_mac = self.dut.get_mac_address(self.dut_ports[2])\n-            self.dut_p3_mac = self.dut.get_mac_address(self.dut_ports[3])\n-            self.pf2_interface = self.dut.ports_info[self.dut_ports[2]][\"intf\"]\n-            self.pf3_interface = self.dut.ports_info[self.dut_ports[3]][\"intf\"]\n-\n-        self.ipv4_mask = \"255.255.255.255\"\n-        self.ipv6_mask = \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\"\n-        self.portmask = 65535\n-        self.protomask = 255\n-\n-        self.pmdout = PmdOutput(self.dut)\n-        localPort = self.tester.get_local_port(self.dut_ports[0])\n-        self.tester_itf = self.tester.get_interface(localPort)\n-        self.copy_config_files_to_dut()\n-\n-        self.param_flow_dir = self.get_flow_direction_param_of_tcpdump()\n-\n-    def set_up(self):\n-        \"\"\"\n-        Run before each test case.\n-        \"\"\"\n-        pass\n-\n-    def test_ipv4_acl_table(self):\n-        \"\"\"\n-        Ipv4 ACL table\n-        \"\"\"\n-        filename = \"flow_ipv4_acl_firmware.cli\"\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # validate rule\n-        self.generate_rules(\n-            operation=\"validate\",\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"2.0.0.0\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[3],\n-        )\n-\n-        # create rule\n-        self.generate_rules(\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"2.0.0.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"2.64.0.0\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            src_mask=\"255.192.0.0\",\n-            src_spec=\"2.128.0.0\",\n-            protomask=self.protomask,\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"4.0.0.0\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"2.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.0.0.0\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"2.64.0.0\", proto=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.64.0.0\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"2.128.0.0\", dst=\"0.0.0.0\", proto=132)\n-            / SCTP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"src\", \"2.128.0.0\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"4.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"4.0.0.0\", 0, 0)\n-\n-        # send another 3 packets\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"3.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"2.64.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"2.128.0.0\", dst=\"0.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(7, 4, self.port_num)\n-\n-        # query rule\n-        out = self.dut.send_expect(\"flow query %d 3 queue\" % self.port_num, \"QUEUE\", 60)\n-\n-        # destroy rule 1\n-        self.dut.send_expect(\n-            \"flow destroy %d rule 1\" % self.port_num, \"Flow rule #1 destroyed\", 60\n-        )\n-        destroy_out = self.dut.send_expect(\n-            \"flow list %d\" % self.port_num, \"testpmd> \", 60\n-        )\n-        self.verify(\"1\" not in destroy_out, \"destroy rule fail\")\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"2.64.0.0\", proto=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        filters = \"dst host 2.64.0.0\"\n-        sniff_pkts = self.send_and_sniff_pkts(0, 2, pcap_file, filters)\n-        dst_ip_list = []\n-        for packet in sniff_pkts:\n-            dst_ip_list.append(packet.getlayer(1).dst)\n-        self.verify(\"2.64.0.0\" not in dst_ip_list, \"rule 1 test fail\")\n-\n-        # flush rules\n-        self.dut.send_expect(\"flow flush %d\" % self.port_num, \"testpmd> \", 60)\n-        flush_out = self.dut.send_expect(\n-            \"flow list %d\" % self.port_num, \"testpmd> \", 60\n-        )\n-        self.verify(\"Rule\" not in flush_out, \"flush rule fail\")\n-        self.dut.send_expect(\"clear port stats all\", \"testpmd> \", 60)\n-\n-        # test all the rules\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"2.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"2.64.0.0\", proto=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"2.128.0.0\", dst=\"0.0.0.0\", proto=132)\n-            / SCTP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"4.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(4, 0, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_5tuple_hash_table(self):\n-        \"\"\"\n-        Ipv4 5tuple hash table\n-        \"\"\"\n-        filename = \"flow_ipv4_5tuple_hash_firmware.cli\"\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=101,\n-            dportspec=201,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.2\",\n-            dst_spec=\"200.0.0.2\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=102,\n-            dportspec=202,\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.3\",\n-            dst_spec=\"200.0.0.3\",\n-            protomask=self.protomask,\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=103,\n-            dportspec=203,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.4\",\n-            dst_spec=\"200.0.0.4\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=104,\n-            dportspec=204,\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.1\", dst=\"200.0.0.1\", proto=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.1\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.2\", dst=\"200.0.0.2\", proto=17)\n-            / UDP(sport=102, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.2\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.3\", dst=\"200.0.0.3\", proto=132)\n-            / SCTP(sport=103, dport=203)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.3\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.4\", dst=\"200.0.0.4\", proto=17)\n-            / UDP(sport=104, dport=204)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.4\", 0, 0)\n-\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_addr_hash_table(self):\n-        \"\"\"\n-        Ipv4 addr hash table\n-        \"\"\"\n-        filename = \"flow_ipv4_addr_hash_firmware.cli\"\n-\n-        # match ipv4 src_addr\n-        cmd = \"pipeline RX table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.2\",\n-            dst_spec=\"200.0.0.1\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.3\",\n-            dst_spec=\"200.0.0.1\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.4\",\n-            dst_spec=\"200.0.0.1\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.1\", dst=\"200.0.0.1\", proto=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"src\", \"100.0.0.1\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.2\", dst=\"200.0.0.2\", proto=17)\n-            / UDP(sport=102, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"src\", \"100.0.0.2\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.3\", dst=\"200.0.0.3\", proto=132)\n-            / SCTP(sport=103, dport=203)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"src\", \"100.0.0.3\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.4\", dst=\"200.0.0.4\")\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"src\", \"100.0.0.4\", 0, 0)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        # match ipv4 dst_addr\n-        cmd = \"pipeline RX table match hash ext key 8 mask FFFFFF0000000000 offset 286 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            dst_mask=\"255.255.255.0\",\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            dst_mask=\"255.255.255.0\",\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.1.1\",\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            dst_mask=\"255.255.255.0\",\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.2.1\",\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            dst_mask=\"255.255.255.0\",\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.3.1\",\n-            l4type=\"\",\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.1\", dst=\"200.0.0.1\", proto=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.1\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.2\", dst=\"200.0.1.2\", proto=17)\n-            / UDP(sport=102, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.1.2\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.3\", dst=\"200.0.2.3\", proto=132)\n-            / SCTP(sport=103, dport=203)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.2.3\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.4\", dst=\"200.0.3.4\")\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.3.4\", 0, 0)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        # match sport\n-        cmd = \"pipeline RX table match hash ext key 8 mask FFFF000000000000 offset 290 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            sportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            sportspec=101,\n-            dportspec=200,\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportmask=self.portmask,\n-            sportspec=102,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            sportmask=self.portmask,\n-            sportspec=103,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.1\", dst=\"200.0.0.1\", proto=6)\n-            / TCP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"tcp\", \"src\", 100, 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.2\", dst=\"200.0.1.2\", proto=17)\n-            / UDP(sport=101, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"udp\", \"src\", 101, 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.3\", dst=\"200.0.2.3\", proto=132)\n-            / SCTP(sport=102, dport=203)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"sctp\", \"src\", 102, 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.2\", dst=\"200.0.1.2\", proto=17)\n-            / UDP(sport=103, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"udp\", \"src\", 103, 0, 0)\n-\n-        # send a packet without l4 info\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.4\", dst=\"200.0.3.4\")\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-        self.check_status(5, 4, self.port_num)\n-\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_acl_table(self):\n-        \"\"\"\n-        Ipv6 acl table\n-        \"\"\"\n-        filename = \"flow_ipv6_acl_firmware.cli\"\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\",\n-            protomask=self.protomask,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\",\n-            protomask=self.protomask,\n-            protospec=132,\n-            l4type=\"sctp\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            sportspec=100,\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\", dst=\"2001::2\", nh=17)\n-            / UDP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\",\n-            0,\n-            3,\n-        )\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", dst=\"2001::2\", nh=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\",\n-            0,\n-            2,\n-        )\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\", dst=\"2001::2\", nh=132)\n-            / SCTP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\",\n-            0,\n-            1,\n-        )\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", dst=\"2001::2\", nh=17)\n-            / UDP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"udp\", \"src\", 100, 0, 0)\n-\n-        # send another 3 packets\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:9789\", dst=\"2001::2\", nh=17)\n-            / UDP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", dst=\"2001::2\", nh=17)\n-            / UDP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", dst=\"2001::2\", nh=17)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(7, 4, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_addr_hash_table(self):\n-        \"\"\"\n-        Ipv6 addr hash table\n-        \"\"\"\n-        filename = \"flow_ipv6_addr_hash_firmware.cli\"\n-\n-        # match ipv6 src_addr\n-        cmd = \"pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\",\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\",\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\",\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\", dst=\"2001::2\", nh=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\",\n-            0,\n-            3,\n-        )\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", dst=\"2001::2\", nh=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\",\n-            0,\n-            2,\n-        )\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\", dst=\"2001::2\", nh=132)\n-            / SCTP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\",\n-            0,\n-            1,\n-        )\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", dst=\"2001::2\", nh=17)\n-            / UDP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\",\n-            0,\n-            0,\n-        )\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:9789\", dst=\"2001::2\", nh=17)\n-            / UDP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-        self.check_status(5, 4, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        # match ipv6 dst_addr\n-        cmd = \"pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 294 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            dst_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\",\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            dst_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\",\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            dst_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            dst_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\",\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\", src=\"2001::2\", nh=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"dst\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:5789\",\n-            0,\n-            3,\n-        )\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\", src=\"2001::2\", nh=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"dst\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:6789\",\n-            0,\n-            2,\n-        )\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\", src=\"2001::2\", nh=132)\n-            / SCTP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"dst\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:7789\",\n-            0,\n-            1,\n-        )\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\", src=\"2001::2\", nh=17)\n-            / UDP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(\n-            pcap_file,\n-            pkt,\n-            \"ipv6\",\n-            \"dst\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:8789\",\n-            0,\n-            0,\n-        )\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(dst=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:9789\", src=\"2001::2\", nh=17)\n-            / UDP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-        self.check_status(5, 4, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_5tuple_hash_table(self):\n-        \"\"\"\n-        Ipv6 5tuple hash table\n-        \"\"\"\n-        filename = \"flow_ipv6_5tuple_hash_firmware.cli\"\n-        cmd = \"pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::1\",\n-            dst_spec=\"0::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=101,\n-            dportspec=201,\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::2\",\n-            dst_spec=\"0::2\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=102,\n-            dportspec=202,\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::3\",\n-            dst_spec=\"0::3\",\n-            protomask=self.protomask,\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=103,\n-            dportspec=203,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::4\",\n-            dst_spec=\"0::4\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=104,\n-            dportspec=204,\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::1\", dst=\"0::1\", nh=17)\n-            / UDP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"src\", \"2001::1\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::2\", dst=\"0::2\", nh=6)\n-            / TCP(sport=102, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"src\", \"2001::2\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::3\", dst=\"0::3\", nh=132)\n-            / SCTP(sport=103, dport=203)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"src\", \"2001::3\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::4\", dst=\"0::4\", nh=17)\n-            / UDP(sport=104, dport=204)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"src\", \"2001::4\", 0, 0)\n-\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::1\", dst=\"0::1\", nh=6)\n-            / TCP(sport=101, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-        self.check_status(5, 4, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_inconsistent_rules(self):\n-        \"\"\"\n-        Flow rule item is inconsistent with table match format\n-        \"\"\"\n-        # ipv4\n-        filename = \"flow_ipv4_addr_hash_firmware.cli\"\n-        cmd = \"pipeline RX table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.dut.send_expect(\n-            \"flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 dst mask 255.255.255.255 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\",\n-            \"error\",\n-            60,\n-        )\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        cmd = \"pipeline RX table match hash ext key 8 mask FFFFFF0000000000 offset 286 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-        self.dut.send_expect(\n-            \"flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 dst mask 255.255.255.255 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 17 / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end\",\n-            \"error\",\n-            60,\n-        )\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        # ipv6\n-        filename = \"flow_ipv6_5tuple_hash_firmware.cli\"\n-        cmd = \"pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-        self.dut.send_expect(\n-            \"flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 2001::1 dst spec 0::1 proto spec 17 / udp src mask 0 dst mask 65535 src spec 31 dst spec 41 / end actions queue index 3 / end\",\n-            \"error\",\n-            60,\n-        )\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        cmd = \"pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 294 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-        self.dut.send_expect(\n-            \"flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0  src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask 0:0:0:0:0:0:0:0 src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 / udp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 3 / end\",\n-            \"error\",\n-            60,\n-        )\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_hash_rss_action(self):\n-        \"\"\"\n-        Set rss action using acl table.\n-        \"\"\"\n-        filename = \"flow_ipv4_rss_firmware.cli\"\n-\n-        # match ipv4 src_addr\n-        cmd = \"pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.2\",\n-            dst_spec=\"200.0.0.2\",\n-            protomask=self.protomask,\n-            protospec=17,\n-            l4type=\"udp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.3\",\n-            dst_spec=\"200.0.0.3\",\n-            protomask=self.protomask,\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.4\",\n-            dst_spec=\"200.0.0.4\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.1\", dst=\"200.0.0.1\", proto=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.1\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.2\", dst=\"200.0.0.2\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.2\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.3\", dst=\"200.0.0.3\", proto=132)\n-            / SCTP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"src\", \"100.0.0.3\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.4\", dst=\"200.0.0.4\", proto=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.4\", 0, 0)\n-\n-        # not match test\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"100.0.0.4\", dst=\"200.0.0.4\", proto=6)\n-            / TCP(sport=101, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-        self.check_status(5, 4, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        # match ipv4 src_addr\n-        cmd = \"pipeline RX table match hash ext key 16 mask 00FF0000FFFFFF00FFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        self.generate_rules(\n-            src_mask=\"255.255.255.0\",\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0, 1, 2, 3],\n-        )\n-        self.generate_rules(\n-            src_mask=\"255.255.255.0\",\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.1.2\",\n-            dst_spec=\"200.0.0.1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0, 1, 2, 3],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        self.send_continuous_packet(\n-            \"ipv4\", \"src\", \"100.0.0.1\", \"200.0.0.1\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([0, 1, 2, 3], out)\n-        self.dut.send_expect(\"start\", \"testpmd> \", 120)\n-        self.send_continuous_packet(\n-            \"ipv4\", \"src\", \"100.0.1.2\", \"200.0.0.1\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([0, 1, 2, 3], out)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        # match ipv4 src_addr\n-        cmd = \"pipeline RX table match hash ext key 8 mask FFFF0000FFFFFFFF offset 282 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        self.generate_rules(\n-            src_mask=\"255.255.0.0\",\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.1\",\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            src_mask=\"255.255.0.0\",\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"100.0.0.1\",\n-            dst_spec=\"200.0.0.2\",\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[2, 3],\n-        )\n-        self.generate_rules(\n-            src_mask=\"255.255.0.0\",\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"200.0.0.1\",\n-            dst_spec=\"200.0.0.2\",\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[1, 2],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        self.send_continuous_packet(\n-            \"ipv4\", \"src\", \"100.0.0.1\", \"200.0.0.1\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([0], out)\n-        self.dut.send_expect(\"start\", \"testpmd> \", 120)\n-        self.send_continuous_packet(\n-            \"ipv4\", \"src\", \"100.0.1.1\", \"200.0.0.2\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([2, 3], out)\n-        self.dut.send_expect(\"start\", \"testpmd> \", 120)\n-        self.send_continuous_packet(\n-            \"ipv4\", \"src\", \"200.0.0.1\", \"200.0.0.2\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([1, 2], out)\n-\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_hash_rss_action(self):\n-        \"\"\"\n-        Set rss action using hash table.\n-        \"\"\"\n-        filename = \"flow_ipv6_rss_firmware.cli\"\n-\n-        # match ipv6 src_addr\n-        cmd = \"pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::1\",\n-            dst_spec=\"1001::1\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::2\",\n-            dst_spec=\"1001::2\",\n-            protomask=self.protomask,\n-            protospec=17,\n-            l4type=\"udp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[2],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::3\",\n-            dst_spec=\"1001::3\",\n-            protomask=self.protomask,\n-            protospec=132,\n-            l4type=\"sctp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"2001::4\",\n-            dst_spec=\"1001::4\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::1\", dst=\"1001::1\", nh=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"1001::1\", 0, 3)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::2\", dst=\"1001::2\", nh=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"1001::2\", 0, 2)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::3\", dst=\"1001::3\", nh=132)\n-            / SCTP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"1001::3\", 0, 1)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::4\", dst=\"1001::4\", nh=6)\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"1001::4\", 0, 0)\n-\n-        # not match test\n-        pcap_file = \"/tmp/route_4.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"2001::1\", dst=\"1001::1\", nh=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-        self.check_status(5, 4, self.port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        cmd = \"pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=\"ffff:ffff:ffff:ffff:ffff:ffff:ffff:0\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2345:0\",\n-            dst_spec=\"0::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0, 1, 2, 3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=\"ffff:ffff:ffff:ffff:ffff:ffff:ffff:0\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"ABCD:EF01:2345:6789:ABCD:EF01:2346:0\",\n-            dst_spec=\"0::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0, 1, 2, 3],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        self.send_continuous_packet(\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2345:0\",\n-            \"0::1\",\n-            self.tester_itf,\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([0, 1, 2, 3], out)\n-        self.dut.send_expect(\"start\", \"testpmd> \", 120)\n-        self.send_continuous_packet(\n-            \"ipv6\",\n-            \"src\",\n-            \"ABCD:EF01:2345:6789:ABCD:EF01:2346:0\",\n-            \"0::1\",\n-            self.tester_itf,\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([0, 1, 2, 3], out)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-        cmd = \"pipeline RX table match hash ext key 64 mask 00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0\"\n-        self.set_table(cmd, filename)\n-        self.start_testpmd(filename, self.port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=\"ffff:ffff:ffff:ffff:ffff:ffff:ffff:0\",\n-            src_spec=\"2001::1\",\n-            dst_spec=\"1001::1\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=\"ffff:ffff:ffff:ffff:ffff:ffff:ffff:0\",\n-            src_spec=\"2001::2\",\n-            dst_spec=\"1001::1\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[2, 3],\n-        )\n-        self.generate_rules(\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=\"ffff:ffff:ffff:ffff:ffff:ffff:ffff:0\",\n-            src_spec=\"2001::1\",\n-            dst_spec=\"1002::1\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"rss\",\n-            index=[1, 2],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        self.send_continuous_packet(\n-            \"ipv6\", \"dst\", \"2001::1\", \"1001::1\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([0], out)\n-        self.dut.send_expect(\"start\", \"testpmd> \", 120)\n-        self.send_continuous_packet(\n-            \"ipv6\", \"dst\", \"2001::2\", \"1001::1\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([2, 3], out)\n-        self.dut.send_expect(\"start\", \"testpmd> \", 120)\n-        self.send_continuous_packet(\n-            \"ipv6\", \"dst\", \"2001::1\", \"1002::1\", self.tester_itf\n-        )\n-        out = self.dut.send_expect(\"stop\", \"testpmd> \", 120)\n-        self.check_packet_queue([1, 2], out)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_acl_jump(self):\n-        \"\"\"\n-        Set jump action using acl table.\n-        \"\"\"\n-        filename = \"flow_ipv4_acl_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"200.0.0.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"200.64.0.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"200.0.0.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            dst_mask=\"255.192.0.0\",\n-            dst_spec=\"200.64.0.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"200.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.0.0.0\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"200.64.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"200.64.0.0\", 0, 1)\n-\n-        # destroy rules of group 1\n-        self.dut.send_expect(\"flow destroy 2 rule 0\", \"testpmd> \", 60)\n-        self.dut.send_expect(\"flow destroy 2 rule 1\", \"testpmd> \", 60)\n-        destroy_out = self.dut.send_expect(\"flow list 2\", \"testpmd> \", 60)\n-        self.verify(\"QUEUE\" not in destroy_out, \"destroy rule fail\")\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"0.0.0.0\", dst=\"200.0.0.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        filters = \"dst host 200.0.0.0\"\n-        sniff_pkts = self.send_and_sniff_pkts(0, 0, pcap_file, filters)\n-        dst_ip_list = []\n-        for packet in sniff_pkts:\n-            dst_ip_list.append(packet.getlayer(1).dst)\n-        self.verify(\"200.0.0.0\" not in dst_ip_list, \"rule 2 test fail\")\n-\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_hash_jump(self):\n-        \"\"\"\n-        Set jump action using hash table.\n-        \"\"\"\n-        filename = \"flow_ipv4_hash_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.0\",\n-            dst_spec=\"2.20.21.0\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.1\",\n-            dst_spec=\"2.20.21.1\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.0\",\n-            dst_spec=\"2.20.21.0\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.1\",\n-            dst_spec=\"2.20.21.1\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.0\", dst=\"2.20.21.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.20.21.0\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.1\", dst=\"2.20.21.1\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.20.21.1\", 0, 1)\n-\n-        # destroy rules of group 1\n-        self.dut.send_expect(\"flow destroy 2 rule 0\", \"Flow rule #0 destroyed\", 60)\n-        self.dut.send_expect(\"flow destroy 2 rule 1\", \"Flow rule #1 destroyed\", 60)\n-        destroy_out = self.dut.send_expect(\"flow list 2\", \"testpmd> \", 60)\n-        self.verify(\"QUEUE\" not in destroy_out, \"destroy rule fail\")\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.1\", dst=\"2.20.21.1\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        filters = \"dst host 2.20.21.1\"\n-        sniff_pkts = self.send_and_sniff_pkts(0, 1, pcap_file, filters)\n-        dst_ip_list = []\n-        for packet in sniff_pkts:\n-            dst_ip_list.append(packet.getlayer(1).dst)\n-        self.verify(\"2.20.21.1\" not in dst_ip_list, \"rule 3 test fail\")\n-\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_acl_hash_jump(self):\n-        \"\"\"\n-        Set jump action from acl table to hash table.\n-        \"\"\"\n-        filename = \"flow_ipv4_acl_hash_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.0\",\n-            dst_spec=\"2.20.21.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.1\",\n-            dst_spec=\"2.20.21.1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.0\",\n-            dst_spec=\"2.20.21.0\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.1\",\n-            dst_spec=\"2.20.21.1\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.0\", dst=\"2.20.21.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.20.21.0\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.1\", dst=\"2.20.21.1\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.20.21.1\", 0, 1)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.0\", dst=\"2.20.21.0\", proto=17)\n-            / UDP(sport=101, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.1\", dst=\"2.20.21.1\", proto=17)\n-            / UDP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(4, 2, port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv4_hash_acl_jump(self):\n-        \"\"\"\n-        Set jump action from hash table to acl table.\n-        \"\"\"\n-        filename = \"flow_ipv4_hash_acl_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.0\",\n-            dst_spec=\"2.20.21.0\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=self.ipv4_mask,\n-            src_spec=\"1.10.11.1\",\n-            dst_spec=\"2.20.21.1\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=\"255.255.255.0\",\n-            src_spec=\"1.10.11.0\",\n-            dst_spec=\"2.20.21.0\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            src_mask=self.ipv4_mask,\n-            dst_mask=\"255.255.255.0\",\n-            src_spec=\"1.10.11.1\",\n-            dst_spec=\"2.20.21.1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.0\", dst=\"2.20.21.0\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.20.21.0\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.1\", dst=\"2.20.21.1\", proto=17)\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv4\", \"dst\", \"2.20.21.1\", 0, 1)\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.0\", dst=\"2.20.21.2\", proto=17)\n-            / UDP(sport=101, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        # rule 3 test\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IP(src=\"1.10.11.1\", dst=\"2.20.21.3\", proto=17)\n-            / UDP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(4, 2, port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_acl_jump(self):\n-        \"\"\"\n-        Set jump action with ipv6 acl table.\n-        \"\"\"\n-        filename = \"flow_ipv6_acl_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::1\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::2\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::2\", 0, 1)\n-\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::2\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::1\", 0, 0)\n-\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::2\", dst=\"2001::2\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(4, 3, port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_hash_jump(self):\n-        \"\"\"\n-        Set jump action with ipv6 hash table.\n-        \"\"\"\n-        filename = \"flow_ipv6_hash_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::2\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::2\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            protospec=6,\n-            l4type=\"tcp\",\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::1\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::2\", dst=\"2001::2\")\n-            / TCP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::2\", 0, 1)\n-\n-        # destroy rules of group 1\n-        self.dut.send_expect(\"flow destroy 2 rule 0\", \"Flow rule #0 destroyed\", 60)\n-        self.dut.send_expect(\"flow destroy 2 rule 1\", \"Flow rule #1 destroyed\", 60)\n-        destroy_out = self.dut.send_expect(\"flow list 2\", \"testpmd> \", 60)\n-        self.verify(\"QUEUE\" not in destroy_out, \"destroy rule fail\")\n-\n-        # rule 2 test\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        filters = \"dst host 2001::1\"\n-        sniff_pkts = self.send_and_sniff_pkts(0, 0, pcap_file, filters)\n-        dst_ip_list = []\n-        for packet in sniff_pkts:\n-            dst_ip_list.append(packet.getlayer(1).dst)\n-        self.verify(\"2001::1\" not in dst_ip_list, \"rule 2 test fail\")\n-\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_acl_hash_jump(self):\n-        \"\"\"\n-        Set jump action from ipv6 acl table to hash table.\n-        \"\"\"\n-        filename = \"flow_ipv6_acl_hash_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::2\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::2\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::1\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::2\", dst=\"2001::2\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::2\", 0, 1)\n-\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::3\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::4\", dst=\"2001::2\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(4, 2, port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def test_ipv6_hash_acl_jump(self):\n-        \"\"\"\n-        Set jump action from ipv6 hash table to acl table.\n-        \"\"\"\n-        filename = \"flow_ipv6_hash_acl_jump_firmware.cli\"\n-        port_num = 2\n-        self.start_testpmd(filename, port_num)\n-\n-        # create rule\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[0],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            group=1,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::2\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            dportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::1\",\n-            dst_spec=\"2001::1\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.generate_rules(\n-            port=port_num,\n-            iptype=\"ipv6\",\n-            src_mask=self.ipv6_mask,\n-            dst_mask=self.ipv6_mask,\n-            src_spec=\"1001::2\",\n-            dst_spec=\"2001::2\",\n-            protomask=self.protomask,\n-            sportmask=self.portmask,\n-            sportspec=100,\n-            dportspec=200,\n-            action=\"jump\",\n-            index=[1],\n-        )\n-        self.dut.send_expect(\"start\", \"testpmd> \", 60)\n-\n-        # rule 0 test\n-        pcap_file = \"/tmp/route_0.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::1\", 0, 0)\n-\n-        # rule 1 test\n-        pcap_file = \"/tmp/route_1.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::2\", dst=\"2001::2\")\n-            / UDP(sport=100, dport=200)\n-            / (\"X\" * 48)\n-        ]\n-        self.send_and_check_packets(pcap_file, pkt, \"ipv6\", \"dst\", \"2001::2\", 0, 1)\n-\n-        pcap_file = \"/tmp/route_2.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::1\", dst=\"2001::1\")\n-            / UDP(sport=100, dport=201)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        pcap_file = \"/tmp/route_3.pcap\"\n-        pkt = [\n-            Ether(dst=self.dut_p0_mac)\n-            / IPv6(src=\"1001::2\", dst=\"2001::2\")\n-            / UDP(sport=100, dport=202)\n-            / (\"X\" * 48)\n-        ]\n-        self.write_pcap_file(pcap_file, pkt)\n-        self.send_pkts(0, pcap_file)\n-\n-        self.check_status(4, 2, port_num)\n-        self.dut.send_expect(\"quit\", \"# \", 60)\n-\n-    def tear_down(self):\n-\n-        \"\"\"\n-        Run after each test case.\n-        \"\"\"\n-        self.dut.kill_all()\n-\n-    def tear_down_all(self):\n-        \"\"\"\n-        Run after each test suite.\n-        \"\"\"\n-        pass\n",
    "prefixes": [
        "2/3"
    ]
}