Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/119556/?format=api
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" ] }{ "id": 119556, "url": "