From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 5A0115589 for ; Fri, 28 Dec 2018 12:23:15 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Dec 2018 03:23:14 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,409,1539673200"; d="scan'208";a="129704982" Received: from unknown (HELO localhost.localdomain.sh.intel.com) ([10.240.176.135]) by fmsmga002.fm.intel.com with ESMTP; 28 Dec 2018 03:23:12 -0800 From: Peng Yuan To: dts@dpdk.org Cc: Peng Yuan Date: Fri, 28 Dec 2018 19:26:42 +0800 Message-Id: <1545996402-12258-1-git-send-email-yuan.peng@intel.com> X-Mailer: git-send-email 1.9.3 Subject: [dts] [PATCH v3] test_plans: Add flow_classify_softnic_test_plan.rst X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Dec 2018 11:23:16 -0000 Add flow_classify_softnic_test_plan.rst to test_plans Signed-off-by: Peng Yuan diff --git a/test_plans/flow_classify_softnic_test_plan.rst b/test_plans/flow_classify_softnic_test_plan.rst new file mode 100644 index 0000000..b0f3bc1 --- /dev/null +++ b/test_plans/flow_classify_softnic_test_plan.rst @@ -0,0 +1,1278 @@ +.. Copyright (c) < 2017 >, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + +=================================== +Flow classification for softnic PMD +=================================== + +Description +=========== +The SoftNIC allows building custom NIC pipelines in SW. The Soft NIC pipeline is configurable through firmware (DPDK Packet Framework script). + +Prerequisites +============= +The DUT must have four 10G Ethernet ports connected to four ports on tester that are controlled by the Scapy packet generator:: + + dut_port_0 <---> tester_port_0 + dut_port_1 <---> tester_port_1 + dut_port_2 <---> tester_port_2 + dut_port_3 <---> tester_port_3 + +Assume four DUT 10G Ethernet ports' pci device id is as the following:: + + dut_port_0 : "0000:05:00.0" + dut_port_1 : "0000:05:00.1" + dut_port_2 : "0000:05:00.2" + dut_port_3 : "0000:05:00.3" + +Bind them to dpdk igb_uio driver:: + + ./usertools/dpdk-devbind.py -b igb_uio 05:00.0 05:00.1 05:00.2 05:00.3 + +1. change ./drivers/net/softnic/firmware.cli to meet the specific test environment. + +2. start softnic with following command line:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 \ + --vdev 'net_softnic0,firmware=./drivers/net/softnic/firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --portmask=0x10 + testpmd> start + +3. start softnic with default hierarchy Qos with following command line:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 \ + --vdev 'net_softnic0,firmware=./drivers/net/softnic/firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --portmask=0x10 + testpmd> set port tm hierarchy default 1 + testpmd> start + +Test Case: ipv4 ACL table +========================= +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv4 offset 270 fwd + pipeline RX table match acl ipv4 offset 270 size 4K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_acl_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Validate a rule:: + + flow validate 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.0.0.0 proto spec 17 / udp src mask \ + 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 3 / end + +Add rules to table:: + + flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 2.0.0.0 proto spec 17 / udp src mask \ + 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 3 / end + + flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + 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 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 2 / end + + flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.192.0.0 \ + dst mask 0.0.0.0 src spec 2.128.0.0 dst spec 0.0.0.0 proto spec 132 / sctp src mask \ + 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 1 / end + + flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + dst mask 255.192.0.0 src spec 0.0.0.0 dst spec 4.0.0.0 proto spec 17 / udp src mask \ + 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +The last 3 packets weren't forwarded. + +4. Query the rule:: + + testpmd> flow query 4 3 queue + Cannot query action type 6 (QUEUE) + +5. destroy and flush the rule:: + + testpmd> flow list 4 + ID Group Prio Attr Rule + 0 0 0 i-- ETH IPV4 UDP => QUEUE + 1 0 0 i-- ETH IPV4 TCP => QUEUE + 2 0 0 i-- ETH IPV4 SCTP => QUEUE + 3 0 0 i-- ETH IPV4 UDP => QUEUE + + testpmd> flow destroy 4 rule 1 + Flow rule #1 destroyed + testpmd> flow list 4 + ID Group Prio Attr Rule + 0 0 0 i-- ETH IPV4 UDP => QUEUE + 2 0 0 i-- ETH IPV4 SCTP => QUEUE + 3 0 0 i-- ETH IPV4 UDP => QUEUE + +Send packets, pkt1 to port3, pkt2 can't be forwarded, pkt3 to port1, pkt4 to port0:: + + testpmd> flow flush 4 + testpmd> flow list 4 + +No rule listed. +Send the first 4 packets, none of them was forwarded. + +6. shutdown the port, the rules will be flushed. +Re-add the four rules, then start forward. +The first 4 packets can be forwarded to port3/2/1/0. +Then:: + + testpmd> stop + testpmd> port stop 4 + testpmd> port start 4 + testpmd> start + +Send the first 4 packets, none of them was forwarded. + +Notes: The IPv4 header source address mask must be set from high bits to low bits. +255.255.192.0 is legal. +255.192.255.0 is illegal. + +Test Case: ipv4-5tuple hash table +================================= +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv4 offset 270 fwd + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF \ + offset 278 buckets 16K size 64K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_5tuple_hash_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + dst mask 255.255.255.255 src spec 100.0.0.1 dst spec 200.0.0.1 proto spec 6 / udp src mask \ + 65535 dst mask 65535 src spec 101 dst spec 201 / end actions queue index 3 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + dst mask 255.255.255.255 src spec 100.0.0.2 dst spec 200.0.0.2 proto spec 17 / udp src mask \ + 65535 dst mask 65535 src spec 102 dst spec 202 / end actions queue index 2 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + dst mask 255.255.255.255 src spec 100.0.0.3 dst spec 200.0.0.3 proto spec 132 / udp src mask \ + 65535 dst mask 65535 src spec 103 dst spec 203 / end actions queue index 1 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + dst mask 255.255.255.255 src spec 100.0.0.4 dst spec 200.0.0.4 proto spec 17 / udp src mask \ + 65535 dst mask 65535 src spec 104 dst spec 204 / end actions queue index 0 / end + + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +Change any parameter of the 5 tuple, the packet can't forwarded to any port. + +Test Case: ipv4-addr hash table +=============================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv4 offset 270 fwd + +a) match ipv4 src_addr:: + + pipeline RX table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 16K size 64K action AP0 + +b) match ipv4 dst_addr:: + + pipeline RX table match hash ext key 8 mask FFFFFF0000000000 offset 286 buckets 16K size 64K action AP0 + +c) match UDP SPORT:: + + pipeline RX table match hash ext key 8 mask FFFF000000000000 offset 290 buckets 16K size 64K action AP0 + +flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_addr_hash_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table, +a) match the table a:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \ + 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 \ + / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \ + 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 \ + / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 2 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \ + 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 \ + / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask \ + 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 \ + / udp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 0 / end + +b) match the table b:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions queue index 2 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + dst mask 255.255.255.0 src spec 100.0.0.1 dst spec 200.0.3.1 / end actions queue index 0 / end + +c) match the table c:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions queue index 3 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 101 dst spec 200 / end actions queue index 2 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 102 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 0.0.0.0 \ + 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 \ + dst mask 0 src spec 103 dst spec 200 / end actions queue index 0 / end + + testpmd> start + +Notes: The added rule must be consistent with the match table format defined in firmware.cli + +3. sent packet, verify the packets were forwarded to the expected ports. +a) match ipv4 src_addr:: + + 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") + 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") + 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") + sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.0.4')/('X'*48), iface="enp131s0f3") + +The 4 packets were forwarded to port3/2/1/0. +Change the ipv4 src address, the packet can't forwarded to any port. + +b) match ipv4 dst_addr:: + + 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") + 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") + 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") + sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.3.4')/('X'*48), iface="enp131s0f3") + +The 4 packets were forwarded to port3/2/1/0. +Change the ipv4 first 6 bytes of dst address, the packet can't forwarded to any port. + +c) match sport:: + + 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") + 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") + 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") + 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") + sendp(Ether(dst='00:00:00:00:01:00')/IP(src='100.0.0.4', dst='200.0.3.4')/('X'*48), iface="enp131s0f3") + +The first 4 packets were forwarded to port3/2/1/0. +The last packet can't forwarded to any port. +Change the udp/tcp/sctp sport, the packet can't forwarded to any port. + +Test Case: ipv6 ACL table +========================= +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv6 offset 270 fwd + pipeline RX table match acl ipv6 offset 270 size 4K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_acl_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 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 + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 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:6789 dst spec 0:0:0:0:0:0:0:0 proto spec 6 \ + / tcp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 2 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 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:7789 dst spec 0:0:0:0:0:0:0:0 proto spec 132 \ + / sctp src mask 0 dst mask 0 src spec 0 dst spec 0 / end actions queue index 1 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 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:8789 dst spec 0:0:0:0:0:0:0:0 proto spec 17 \ + / udp src mask 65535 dst mask 0 src spec 101 dst spec 0 / end actions queue index 0 / end + + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +The last 3 packets weren't forwarded. + +Test Case: ipv6-addr hash table +=============================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv6 offset 270 fwd + +a) match ipv6 src_addr:: + + pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0 + +b) match ipv6 dst_addr:: + + pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 294 buckets 16K size 64K action AP0 + +flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_addr_hash_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table, +a) match ipv6 src_addr:: + + testpmd> 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 + + testpmd> 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:6789 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 2 / end + + testpmd> 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:7789 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 1 / end + + testpmd> 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:8789 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 0 / end + +b) match ipv6 dst_addr:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \ + dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:5789 src 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 + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \ + dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 src 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 2 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \ + dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:7789 src 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 1 / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src mask 0:0:0:0:0:0:0:0 \ + dst spec ABCD:EF01:2345:6789:ABCD:EF01:2345:8789 src 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 0 / end + + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports. +a) match ipv6 src_addr:: + + 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") + 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") + 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") + 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") + 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") + +b) match ipv6 dst_addr:: + + 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") + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +The last packet weren't be forwarded to any port. + +Test Case: ipv6-5tuple hash table +================================= +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv6 offset 270 fwd + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_5tuple_hash_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table:: + + testpmd> 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 65535 dst mask 65535 src spec 31 dst spec 41 \ + / end actions queue index 3 / end + + testpmd> 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::2 dst spec 0::2 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 32 dst spec 42 + / end actions queue index 2 / end + + testpmd> 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::3 dst spec 0::3 proto spec 132 / sctp src mask 65535 dst mask 65535 src spec 33 dst spec 43 \ + / end actions queue index 1 / end + + testpmd> 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::4 dst spec 0::4 proto spec 6 / tcp src mask 65535 dst mask 65535 src spec 34 dst spec 44 \ + / end actions queue index 0 / end + + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +The last packet weren't be forwarded to any port. + +Test Case: ipv4 rule item inconsistent with table match format +============================================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv4 offset 270 fwd + +a) match ipv4 src_addr:: + + pipeline RX table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 16K size 64K action AP0 + +b) match ipv4 dst_addr:: + + pipeline RX table match hash ext key 8 mask FFFFFF0000000000 offset 286 buckets 16K size 64K action AP0 + +Map the flowapi to softnic table:: + + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_addr_hash_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table, +a) Map the table a:: + + 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 + +Error reported, rule item is inconsistent with the table match. +Table with hask key mask for src addr, but the rule added is for dst addr. + +b) Map the table b:: + + 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 + +Error reported, rule item is inconsistent with the table match. +Table with hask key mask for dst addr 255.255.255.0, but the rule added is 255.255.255.255. + +Test Case: ipv6 rule item inconsistent with table match format +============================================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv6 offset 270 fwd + +a) match ipv6 5tuple:: + + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + +b) match ipv6 dst_addr:: + + pipeline RX table match hash ext key 16 mask FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF offset 294 buckets 16K size 64K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_5tuple_hash_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table, +a) Map the table a:: + + 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 + +Error reported, rule item is inconsistent with the table match. +Table with hask key mask for 5 tuple, but the rule added mask udp src with 0. + +b) Map the table b:: + + 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 + +Error reported, rule item is inconsistent with the table match. +Table with hask key mask for dst addr, but the rule added is for src addr. + +Test Case: ipv4 hash table rss action +===================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv4 offset 270 fwd balance offset 278 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF outoffset 256 + +table a:: + + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0 + +table b:: + + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFF00FFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0 + +table c:: + + pipeline RX table match hash ext key 8 mask FFFF0000FFFFFFFF offset 282 buckets 16K size 64K action AP0 + +Map the flowapi to softnic table:: + + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_rss_firmware.cli,cpu_id=1,conn_port=8086' + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table, +a) Map the table a:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 65535 \ + dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 3 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 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 17 / udp src mask 65535 \ + dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 2 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 1 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 0 end / end + +b) Map the table b:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.0 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 0 1 2 3 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.0 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions rss queues 0 1 2 3 end / end + +c) Map the table c:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 255.255.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions rss queues 0 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 255.255.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions rss queues 2 3 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv4 proto mask 0 src mask 255.255.0.0 \ + 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 \ + dst mask 0 src spec 100 dst spec 200 / end actions rss queues 1 2 end / end + + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports. +a) Match the table a:: + + 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") + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +The last packet weren't be forwarded to any port. + +b) Match the table b:: + + 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") + +Set the src address from 1.10.11.0 to 1.10.11.255, and other parameters keep constant, +The packets were distributed from port0 to port3 according to RSS table.:: + + 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") + +Set the src address from 1.10.12.0 to 1.10.12.255, and other parameters keep constant, +The packets were distributed from port0 to port3 according to RSS table.:: + + 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") + +The packet was not be forwarded to any port. + +c) Match the table c:: + + 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") + +Set the IP src address from 1.10.0.0 to 1.10.255.255, the packet was forwarded to port0.:: + + 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") + +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.:: + + 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") + +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.:: + + 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") + +The packet weren't be forwarded to any port. + +Test Case: ipv6 hash table rss action +===================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below:: + + table action profile AP0 ipv6 offset 270 fwd balance offset 274 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 outoffset 256 + +table a:: + + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + +table b:: + + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + +table c:: + + pipeline RX table match hash ext key 64 mask 00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + +Map the flowapi to softnic table:: + + flowapi map group 0 ingress pipeline RX table 0 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 21-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_rss_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=4 --txq=4 --disable-rss --portmask=0x10 + +Add rules to table, +a) Map the table a:: + + testpmd> 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 65535 dst mask 65535 \ + src spec 31 dst spec 41 / end actions rss queues 3 end / end + + testpmd> 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::2 dst spec 0::2 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 32 dst spec 42 / end actions rss queues 2 end / end + + testpmd> 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::3 dst spec 0::3 proto spec 132 / sctp src mask 65535 dst mask 65535 \ + src spec 33 dst spec 43 / end actions rss queues 1 end / end + + testpmd> 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::4 dst spec 0::4 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 34 dst spec 44 / end actions rss queues 0 end / end + +b) Map the table b:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \ + src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \ + src spec ABCD:EF01:2345:6789:ABCD:EF01:2345:0 dst spec 0::1 proto spec 17 / udp src mask 65535 \ + dst mask 65535 src spec 31 dst spec 41 / end actions rss queues 0 1 2 3 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 255 \ + src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff \ + src spec ABCD:EF01:2345:6789:ABCD:EF01:2346:0 dst spec 0::1 proto spec 17 / udp src mask 65535 \ + dst mask 65535 src spec 31 dst spec 41 / end actions rss queues 0 1 2 3 end / end + +c) Map the table c:: + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 \ + src spec 2001::1 dst spec 1001::1 proto spec 17 / udp src mask 65535 dst mask 65535 \ + src spec 31 dst spec 41 / end actions rss queues 0 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 \ + src spec 2001::2 dst spec 1001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 32 dst spec 42 / end actions rss queues 2 3 end / end + + testpmd> flow create 4 group 0 ingress pattern eth / ipv6 proto mask 0 \ + src mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 \ + src spec 2001::1 dst spec 2001::3 proto spec 132 / sctp src mask 65535 dst mask 65535 \ + src spec 33 dst spec 43 / end actions rss queues 1 2 end / end + + testpmd> start + +3. sent packet, verify the packets were forwarded to the expected ports. +a) Match the table a:: + + 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") + 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") + 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") + 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") + 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") + +The first 4 packets were forwarded to port3/2/1/0. +The last packet weren't be forwarded to any port. + +b) Match the table b:: + + 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") + +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, +The packets were distributed from port0 to port3 according to RSS table.:: + + 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") + +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, +The packets were distributed from port0 to port3 according to RSS table.:: + + 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") + +The packet was not be forwarded to any port. + +c) Match the table c:: + + 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") + +Set the IPv6 dst address from 1001::0 to 1001::FFFF, the packet was forwarded to port0.:: + + 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") + +Set the IPv6 dst address from 1001::0 to 1001::FFFF, the packet was forwarded to port2 or port3.:: + + 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") + +Set the IPv6 dst address from 2001::0 to 2001::FFFF, the packet was forwarded to port1 or port2.:: + + 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") + +The packet weren't be forwarded to any port. + +Test Case: ipv4 ACL table jump action +===================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + + table action profile AP0 ipv4 offset 270 fwd + pipeline RX table match acl ipv4 offset 270 size 4K action AP0 + pipeline RX table match acl ipv4 offset 270 size 4K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> create 2 group 1 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end + + testpmd> create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 0.0.0.0 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +If change the TCP sport or dport, the packet can't be forwarded to any port. + +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. +So the packets can't be forwarded. + +Test Case: ipv4 HASH table jump action +====================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + + table action profile AP0 ipv4 offset 270 fwd + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFF00000000 offset 278 buckets 16K size 64K action AP0 + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFF00000000 offset 278 buckets 16K size 64K action AP0 + pipeline RX port in 0 table 0 + pipeline RX port in 1 table 0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 \ + 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 \ + / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 \ + 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 \ + / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 \ + 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 \ + / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 \ + 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 \ + / tcp src mask 0 dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +If change the IPv4 dst address or src address, the packet can't be forwarded to any port. + +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. +so the packets can't be forwarded. + +Test Case: ipv4 ACL jump to HASH table +====================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + +group 0 with ACL table jump to group 1 with HASH table:: + + table action profile AP0 ipv4 offset 270 fwd + pipeline RX table match acl ipv4 offset 270 size 4K action AP0 + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 64K action AP0 + pipeline RX port in 0 table 0 + pipeline RX port in 1 table 0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_acl_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 65535 \ + dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 65535 \ + dst mask 65535 src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 0 \ + dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 0 \ + dst mask 0 src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +If change the IPv4 dst address or src address, the packet can't be forwarded to any port:: + + 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") + 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") + +The two packets can't be forwarded to any port. + +Test Case: ipv4 HASH jump to ACL table +====================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + +group 0 with ACL table jump to group 1 with HASH table:: + + table action profile AP0 ipv4 offset 270 fwd + pipeline RX table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFF00FFFFFFFF offset 278 buckets 16K size 64K action AP0 + pipeline RX table match acl ipv4 offset 270 size 4K action AP0 + pipeline RX port in 0 table 0 + pipeline RX port in 1 table 0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv4_hash_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 0 \ + dst mask 0 src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 ingress pattern eth / ipv4 proto mask 255 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 / tcp src mask 0 \ + dst mask 0 src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv4 proto mask 255 src mask 255.255.255.255 \ + 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 \ + dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +The last two packets can't be forwarded to any ports. + +Test Case: ipv6 ACL table jump action +===================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + + table action profile AP0 ipv6 offset 270 fwd + pipeline RX table match acl ipv6 offset 270 size 4K action AP0 + pipeline RX table match acl ipv6 offset 270 size 4K action AP0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::1 proto spec 6 \ + / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 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 0::1 dst spec 2001::2 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 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 + + testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::2 proto spec 6 \ + / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +The third packet was forwarded to port 0, the fourth packet can't be forwarded to any port. + +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. +So the packets can't be forwarded. + +Test Case: ipv6 HASH table jump action +====================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + + table action profile AP0 ipv6 offset 270 fwd + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + pipeline RX port in 0 table 0 + pipeline RX port in 1 table 0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 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 0::1 dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 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 0::2 dst spec 2001::2 proto spec 17 / udp src mask 65535 dst mask 65535 \ + src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 2 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 0::1 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 + + testpmd> flow create 2 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 0::2 dst spec 2001::2 proto spec 17 / udp src mask 65535 dst mask 65535 \ + src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +If change the IPv6 dst address or src address, the packet can't be forwarded to any port. + +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. +So the packets can't be forwarded. + +Test Case: ipv6 ACL jump to HASH table +====================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + +group 0 with ACL table jump to group 1 with HASH table:: + + table action profile AP0 ipv6 offset 270 fwd + pipeline RX table match acl ipv6 offset 270 size 4K action AP0 + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + pipeline RX port in 0 table 0 + pipeline RX port in 1 table 0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_acl_hash_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 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 0::1 dst spec 2001::1 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 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 0::2 dst spec 2001::2 proto spec 6 / tcp src mask 65535 dst mask 65535 \ + src spec 100 dst spec 200 / end actions queue index 1 / end + + testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \ + src mask 0:0:0:0:0:0:0:0 dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 \ + 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 + + testpmd> flow create 2 group 0 ingress pattern eth / ipv6 proto mask 255 \ + 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 \ + / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions jump group 1 / end + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +The last two packets can't be forwarded to any ports. + +Test Case: ipv6 HASH jump to ACL table +====================================== +1. Edit flow_classification_firmware.cli to change "table action" and "pipeline table" as below, +Just two links:: + + link LINK0 dev 0000:05:00.0 + link LINK1 dev 0000:05:00.1 + +group 0 with ACL table jump to group 1 with HASH table:: + + table action profile AP0 ipv6 offset 270 fwd + pipeline RX table match hash ext key 64 mask 0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000 offset 274 buckets 16K size 64K action AP0 + pipeline RX table match acl ipv6 offset 270 size 4K action AP0 + pipeline RX port in 0 table 0 + pipeline RX port in 1 table 0 + flowapi map group 0 ingress pipeline RX table 0 + flowapi map group 1 ingress pipeline RX table 1 + +2. start softnic:: + + ./x86_64-native-linuxapp-gcc/app/testpmd -l 23-25 -n 4 --vdev 'net_softnic0, \ + firmware=./drivers/net/softnic/flow_ipv6_hash_acl_jump_firmware.cli,cpu_id=1,conn_port=8086' \ + -- -i --forward-mode=softnic --rxq=2 --txq=2 --disable-rss --portmask=0x4 + +Add rules to table:: + + testpmd> flow create 2 group 1 ingress pattern eth / ipv6 proto mask 255 src mask 0:0:0:0:0:0:0:0 \ + dst mask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff src spec 0::1 dst spec 2001::1 proto spec 6 \ + / tcp src mask 65535 dst mask 65535 src spec 100 dst spec 200 / end actions queue index 0 / end + + testpmd> flow create 2 group 1 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 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 + + testpmd> flow create 2 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 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 + + testpmd> flow create 2 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 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 + +3. sent packet, verify the packets were forwarded to the expected ports:: + + 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") + 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") + 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") + 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") + +The first packet was forwarded to port 0, the second was forwarded to port 1. +The last two packets can't be forwarded to any ports. -- 2.5.0