From patchwork Sat Feb 20 07:29:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: hailinx X-Patchwork-Id: 88027 Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id A2C71A0524; Sat, 20 Feb 2021 08:40:39 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 78E484003E; Sat, 20 Feb 2021 08:40:39 +0100 (CET) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id DF87B4003C for ; Sat, 20 Feb 2021 08:40:37 +0100 (CET) IronPort-SDR: 3BKiodZxt87CU3rECr/q71xsaoXq+46SJd9ijWV+4hUSDeMcwPzE02M4/iO12k6PqjIMRyX6WB ZRjSU54f+shw== X-IronPort-AV: E=McAfee;i="6000,8403,9900"; a="183274215" X-IronPort-AV: E=Sophos;i="5.81,192,1610438400"; d="scan'208";a="183274215" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Feb 2021 23:40:36 -0800 IronPort-SDR: UGb45hcrU1/pdKQjhzfmfiEnDt5guqyZ72UCBRD/uPZ66NmRx/+go198YTuEacudVp9/uuijYm 5I9gIMMXjV2w== X-IronPort-AV: E=Sophos;i="5.81,192,1610438400"; d="scan'208";a="387592402" Received: from unknown (HELO dpdk-huangzm-d.sh.intel.com) ([10.240.183.72]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Feb 2021 23:40:35 -0800 From: Hailin Xu To: dts@dpdk.org Cc: Hailin Xu Date: Sat, 20 Feb 2021 15:29:19 +0800 Message-Id: <1613806159-5175-1-git-send-email-hailinx.xu@intel.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dts] [PATCH v1] test_plans:add iavf_flexible_descriptor X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org Sender: "dts" add test plan: iavf_flexible_descriptor. Signed-off-by: Hailin Xu --- .../iavf_flexible_descriptor_test_plan.rst | 601 ++++++++++++++++++ 1 file changed, 601 insertions(+) create mode 100644 test_plans/iavf_flexible_descriptor_test_plan.rst diff --git a/test_plans/iavf_flexible_descriptor_test_plan.rst b/test_plans/iavf_flexible_descriptor_test_plan.rst new file mode 100644 index 00000000..216ee826 --- /dev/null +++ b/test_plans/iavf_flexible_descriptor_test_plan.rst @@ -0,0 +1,601 @@ +.. Copyright (c) <2021> 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. + +======================== +Flexible RXd Test Suites +======================== + + +Description +=========== + +The test suite will cover the flexible RX descriptor on Intel E810 +network interface card. + +Prerequisites +============= + +Copy correct ``ice.pkg`` into ``/usr/lib/firmware/intel/ice/ddp/``, \ +For the test cases, comms package is expected. + +Prepare test toplogoy, in the test case, it requires + +- 1 Intel E810 interface +- 1 network interface for sending test packet, + which could be connect to the E810 interface +- Directly connect the 2 interfaces + +Patch testpmd for dumping flexible fields from RXD:: + + diff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build + index 7e9c7bdd6..b75b90a9c 100644 + --- a/app/test-pmd/meson.build + +++ b/app/test-pmd/meson.build + @@ -49,6 +49,9 @@ endif + if dpdk_conf.has('RTE_NET_I40E') + deps += 'net_i40e' + endif + +if dpdk_conf.has('RTE_NET_ICE') + + deps += ['net_ice', 'net_iavf'] + +endif + if dpdk_conf.has('RTE_NET_IXGBE') + deps += 'net_ixgbe' + endif + + + diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c + index a9e431a8b..3447a9b43 100644 + --- a/app/test-pmd/util.c + +++ b/app/test-pmd/util.c + @@ -12,6 +12,7 @@ + #include + #include + #include + +#include + + #include "testpmd.h" + + @@ -151,6 +152,7 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], + eth_type, (unsigned int) mb->pkt_len, + (int)mb->nb_segs); + ol_flags = mb->ol_flags; + + rte_pmd_ifd_dump_proto_xtr_metadata(mb); + if (ol_flags & PKT_RX_RSS_HASH) { + MKDUMPSTR(print_buf, buf_size, cur_len, + " - RSS hash=0x%x", + + +Compile DPDK and testpmd:: + + CC=gcc meson --werror -Denable_kmods=True -Dlibdir=lib x86_64-native-linuxapp-gcc + ninja -C x86_64-native-linuxapp-gcc -j 70 + +Generate 1 VF on each PF and set mac address for each VF:: + + echo 1 > /sys/bus/pci/devices/0000:af:00.0/sriov_numvfs + ip link set ens802f0 vf 0 mac 00:11:22:33:44:55 + +Bind the vf interface to vfio-pci driver:: + + ./usertools/dpdk-devbind.py -b vfio-pci af:01.0 + + +Test Case 01: Check single VLAN fields in RXD (802.1Q) +====================================================== + +Launch testpmd by:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=vlan -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + + testpmd>set verbose 1 + testpmd>set fwd io + testpmd>start + +check RXDID value correct:: + + expected: RXDID[17] + +Please change the core setting (-l option) and port's PCI (-w option) \ +by your DUT environment + +Send a packet with VLAN tag from test network interface:: + + scapy #launch scapy in shell + + #In scapy interactive UI + p = Ether(src="68:05:ca:a3:1b:28", dst="00:11:22:33:44:55", type=0x9100)/Dot1Q(prio=1,vlan=23)/IP()/UDP()/DNS() + sendp(p, iface='ens192f0', count=1) + +Please notice + +- Change ethernet source address with your test network interface's address +- Make sure the ethernet destination addres is NOT your real E810 interface's address + +Check the output in testpmd, **ctag=1:0:23** is expected, which is consistent with VLAN tag set in test packet:: + + testpmd> port 0/queue 28: received 1 packets + src=68:05:CA:A3:1B:28 - dst=00:11:22:33:44:55 - type=0x8100 - length=60 - nb_segs=1 - RSS hash=0xf31f649c - RSS queue=0x1c - Protocol Extraction:[0x0000:0x2017],vlan,stag=0:0:0,ctag=1:0:23 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_UDP - sw ptype: L2_ETHER_VLAN L3_IPV4 L4_UDP - l2_len=18 - l3_len=20 - l4_len=8 - Receive queue=0x1c + ol_flags: PKT_RX_RSS_HASH PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN + + + +Test Case 02: Check single VLAN fields in RXD (802.1ad) +======================================================= + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=vlan -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[17] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55', type=0x88A8)/Dot1Q(prio=1,vlan=23)/IP()/UDP()/DNS() + +Expected output in testpmd:: + + stag=1:0:23 + + +Test Case 03: Check double VLAN fields in RXD (802.1Q) only 1 VLAN tag +====================================================================== + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=vlan -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[17] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55', type=0x9100)/Dot1Q(prio=1,vlan=23)/IP()/UDP()/DNS() + +Expected output in testpmd:: + + stag=1:0:23 + +Test Case 04: Check double VLAN fields in RXD (802.1Q) 2 VLAN tags +================================================================== + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=vlan -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[17] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55', type=0x9100)/Dot1Q(prio=1,vlan=23)/Dot1Q(prio=4,vlan=56)/IP()/UDP()/DNS() + +Expected output in testpmd:: + + stag=1:0:23 + ctag=4:0:56 + + +Test Case 05: Check double VLAN fields in RXD (802.1ad) +======================================================= + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=vlan -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[17] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55', type=0x88A8)/Dot1Q(prio=1,vlan=23)/Dot1Q(prio=4,vlan=56)/IP()/UDP()/DNS() + +Expected output in testpmd:: + + stag=1:0:23 + ctag=4:0:56 + + +Test Case 06: Check IPv4 fields in RXD +====================================== + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=ipv4 -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[18] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55')/IP(tos=23,ttl=98)/UDP()/Raw(load='XXXXXXXXXX') + +Expected output in testpmd:: + + ver=4 + hdrlen=5 + tos=23 + ttl=98 + proto=17 + + +Test Case 07: Check IPv6 fields in RXD +======================================================= + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=ipv6 -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[19] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55')/IPv6(tc=12,hlim=34,fl=0x98765)/UDP()/Raw(load='XXXXXXXXXX') + +Expected output in testpmd:: + + ver=6 + tc=12 + flow_hi4=0x9 + nexthdr=17 + hoplimit=34 + + +Test Case 08: Check IPv6 flow field in RXD +======================================================= + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=ipv6_flow -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[20] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55')/IPv6(tc=12,hlim=34,fl=0x98765)/UDP()/Raw(load='XXXXXXXXXX') + +Expected output in testpmd:: + + ver=6 + tc=12 + flow=0x98765 + + +Test Case 09: Check TCP fields in IPv4 in RXD +======================================================= + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=tcp -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[21] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55')/IP()/TCP(flags='AS')/Raw(load='XXXXXXXXXX') + +Expected output in testpmd:: + + doff=5 + flags=AS + + +Test Case 10: Check TCP fields in IPv6 in RXD +======================================================= + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=tcp -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +check RXDID value correct:: + + expected: RXDID[21] + +Test packet:: + + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55')/IPv6()/TCP(flags='S')/Raw(load='XXXXXXXXXX') + +Expected output in testpmd:: + + doff=5 + flags=S + + +Test Case 11: Check IPv4, IPv6, TCP fields in RXD on specific queues +==================================================================== + +Test steps are same to ``Test Case 01``, just change the launch command of testpmd, test packet and expected output + +Launch testpmd command:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr='[(2):ipv4,(3):ipv6,(4):tcp]' -- -i --rxq=16 --txq=16 --portmask=0x1 + +check RXDID value correct:: + + expected: RXDID[16], RXDID[18], RXDID[19], RXDID[21] + +Create generic flow on NIC:: + + flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 23 ttl is 98 / end actions queue index 2 / end + flow create 0 ingress pattern eth / ipv6 src is 2001::3 dst is 2001::4 tc is 12 / end actions queue index 3 / end + flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 dst is 192.168.0.2 / tcp src is 25 dst is 23 / end actions queue index 4 / end + +Test packet:: + + p = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.1",dst="192.168.0.2",tos=23,ttl=98)/UDP()/Raw(load='XXXXXXXXXX') + p = Ether(src='68:05:ca:a3:1b:28', dst='00:11:22:33:44:55')/IPv6(src='2001::3', dst='2001::4', tc=12,hlim=34,fl=0x98765)/UDP()/Raw(load='XXXXXXXXXX') + p = Ether(dst='00:11:22:33:44:55')/IP(src='192.168.0.1',dst='192.168.0.2')/TCP(flags='AS', dport=23, sport=25)/Raw(load='XXXXXXXXXX') + +Expected output in testpmd:: + + Receive queue=0x2 + ver=4 + hdrlen=5 + tos=23 + ttl=98 + proto=17 + + Receive queue=0x3 + ver=6 + tc=12 + flow_hi4=0x9 + nexthdr=17 + hoplimit=34 + + Receive queue=0x4 + doff=5 + flags=AS + + +Test Case 12: Check testpmd use different parameters start +========================================================== +Test steps are same to ``Test Case 01``, use different "flex_desc" parameters the launch command of testpmd, check RXDID value. + +use error parameter Launch testpmd:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=vxlan -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +testpmd can't started, check "iavf_lookup_flex_desc_type(): wrong flex_desc type, it should be: vlan|ipv4|ipv6|ipv6_flow|tcp|ovs|ip_offset" in testpmd output. + +don't use parameter launch testpmd:: + + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0 -- -i --rxq=4 --txq=4 --portmask=0x1 --nb-cores=2 + +testpmd started, check "iavf_configure_queues(): request RXDID[16] in Queue[0]" in testpmd output + + +MPLS TEST +=================== + +testpmd:: + ./usertools/dpdk-devbind.py -b vfio-pci 0000:af:01.0 + ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -l 6-9 -n 4 -w af:01.0,proto_xtr=ip_offset -- -i --portmask=0x1 --nb-cores=2 + testpmd> set verbose 1 + testpmd> start +check RXDID value correct:: + expected: RXDID[25] + +scapy prepare: +=================== +about scapy: +from scapy.contrib.mpls import MPLS + +Test Case 13: Check ip offset of ip +=================================== + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=18 # now value is 14, have a bug of it + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=18 # now value is 14, have a bug of it + +Test Case 14: check ip offset with vlan +======================================= + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=22 + + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=22 + +Test Case 15: check offset with 2 vlan tag +========================================== + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + +Test Case 16: check ip offset with multi MPLS +============================================= + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Offset:ip_offset=18 # now value is 14, have a bug of it + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=22 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=30 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=34 + + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Offset:ip_offset=18 # now value is 14, have a bug of it + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=22 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=30 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=34 + +Test Case 17: check ip offset with multi MPLS with vlan tag +=========================================================== + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=22 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=30 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=34 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=38 + + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Offset:ip_offset=22 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=30 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=34 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=38 + +Test Case 18: check ip offset with multi MPLS with 2 vlan tag +============================================================= + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=30 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=34 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=38 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=42 + + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=26 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=30 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=34 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=38 + + sendp(Ether(dst="00:11:22:33:44:55",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6(), iface="ens192f0", count=1) + Expected output in testpmd: + Protocol Offset:ip_offset=42