get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 83877,
    "url": "http://patches.dpdk.org/api/patches/83877/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20201110061858.5525-2-yufengx.mo@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20201110061858.5525-2-yufengx.mo@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20201110061858.5525-2-yufengx.mo@intel.com",
    "date": "2020-11-10T06:18:56",
    "name": "[V6,1/3] flexible_rxd: unify common test content",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "a7b277e0e9381a8362321fd35673acaf3175fe51",
    "submitter": {
        "id": 1342,
        "url": "http://patches.dpdk.org/api/people/1342/?format=api",
        "name": "Yufen.Mo",
        "email": "yufengx.mo@intel.com"
    },
    "delegate": {
        "id": 1248,
        "url": "http://patches.dpdk.org/api/users/1248/?format=api",
        "username": "zhaoyanc",
        "first_name": "Zhaoyan",
        "last_name": "Chen",
        "email": "zhaoyan.chen@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dts/patch/20201110061858.5525-2-yufengx.mo@intel.com/mbox/",
    "series": [
        {
            "id": 13765,
            "url": "http://patches.dpdk.org/api/series/13765/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=13765",
            "date": "2020-11-10T06:18:55",
            "name": "flexible_rxd: add test cases for iavf/mpls",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/13765/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/83877/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/83877/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 3239FA09D2;\n\tTue, 10 Nov 2020 07:24:06 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 98919BC60;\n\tTue, 10 Nov 2020 07:24:04 +0100 (CET)",
            "from mga12.intel.com (mga12.intel.com [192.55.52.136])\n by dpdk.org (Postfix) with ESMTP id B505769A4\n for <dts@dpdk.org>; Tue, 10 Nov 2020 07:24:01 +0100 (CET)",
            "from fmsmga006.fm.intel.com ([10.253.24.20])\n by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 09 Nov 2020 22:24:00 -0800",
            "from dpdk-moyufen06.sh.intel.com ([10.67.116.208])\n by fmsmga006.fm.intel.com with ESMTP; 09 Nov 2020 22:23:59 -0800"
        ],
        "IronPort-SDR": [
            "\n ouHg6fzHCkJwFtZuXsssdTkDIj89K91yUUdtVQoPg8ebmrCVAC8gK57G+zcEumeq0IxynerJBT\n DyLOGgQX6/wQ==",
            "\n tO2bD+/+brsJmNVD7+L+0UTq32IwOy3INQRBPtLu9F3DpvZzd/4K9jVLtlg4ZTPwTMc2YXl8B5\n Ic/T461xQXZw=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9800\"; a=\"149203856\"",
            "E=Sophos;i=\"5.77,465,1596524400\"; d=\"scan'208\";a=\"149203856\"",
            "E=Sophos;i=\"5.77,465,1596524400\"; d=\"scan'208\";a=\"529660539\""
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "From": "yufengmx <yufengx.mo@intel.com>",
        "To": "dts@dpdk.org,\n\thailinx.xu@intel.com",
        "Cc": "yufengmx <yufengx.mo@intel.com>",
        "Date": "Tue, 10 Nov 2020 14:18:56 +0800",
        "Message-Id": "<20201110061858.5525-2-yufengx.mo@intel.com>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20201110061858.5525-1-yufengx.mo@intel.com>",
        "References": "<20201110061858.5525-1-yufengx.mo@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dts] [PATCH V6 1/3] flexible_rxd: unify common test content",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org",
        "Sender": "\"dts\" <dts-bounces@dpdk.org>"
    },
    "content": "unify common test content.\n\nSigned-off-by: yufengmx <yufengx.mo@intel.com>\n---\n tests/flexible_common.py | 483 +++++++++++++++++++++++++++++++++++++++\n 1 file changed, 483 insertions(+)\n create mode 100644 tests/flexible_common.py",
    "diff": "diff --git a/tests/flexible_common.py b/tests/flexible_common.py\nnew file mode 100644\nindex 0000000..fa3c64d\n--- /dev/null\n+++ b/tests/flexible_common.py\n@@ -0,0 +1,483 @@\n+# BSD LICENSE\n+#\n+# Copyright(c) 2020 Intel Corporation. All rights reserved.\n+# All rights reserved.\n+#\n+# Redistribution and use in source and binary forms, with or without\n+# modification, are permitted provided that the following conditions\n+# are met:\n+#\n+#   * Redistributions of source code must retain the above copyright\n+#     notice, this list of conditions and the following disclaimer.\n+#   * Redistributions in binary form must reproduce the above copyright\n+#     notice, this list of conditions and the following disclaimer in\n+#     the documentation and/or other materials provided with the\n+#     distribution.\n+#   * Neither the name of Intel Corporation nor the names of its\n+#     contributors may be used to endorse or promote products derived\n+#     from this software without specific prior written permission.\n+#\n+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+import time\n+from packet import Packet\n+from pmd_output import PmdOutput\n+\n+\n+class FlexibleRxdBase(object):\n+\n+    def init_base(self, pci, dst_mac, test_type, dut_index=0):\n+        tester_port_id = self.tester.get_local_port(self.dut_ports[dut_index])\n+        self.__tester_intf = self.tester.get_interface(tester_port_id)\n+        self.__src_mac = self.tester.get_mac(tester_port_id)\n+        self.__dst_mac = dst_mac\n+\n+        self.__app_path = self.dut.apps_name[\"test-pmd\"]\n+        self.__pmdout = PmdOutput(self.dut)\n+        self.__test_type = test_type\n+        self.__pci = pci\n+        self.__pkg_count = 1\n+        self.__is_pmd_on = False\n+\n+    @property\n+    def __is_iavf(self):\n+        return self.__test_type == 'iavf'\n+\n+    @property\n+    def __is_pf(self):\n+        return self.__test_type == 'pf'\n+\n+    def __get_port_option(self, flex_opt='', queue_num=None):\n+        nb_core = 2\n+        num = 4 if self.nic == 'foxville' or self.__is_iavf else 32\n+        queue_num = queue_num if queue_num else num\n+        # port option\n+        port_option = (\n+            '{queue} '\n+            '--portmask=0x1 '\n+            '--nb-cores={nb_core}').format(**{\n+                'queue': '--rxq={0} --txq={0} '.format(queue_num)\n+                if flex_opt != 'ip_offset' else '',\n+                'nb_core': nb_core,\n+            })\n+        return port_option\n+\n+    def __check_rxdid(self, rxdid, out):\n+        rxdid = rxdid if isinstance(rxdid, list) else [rxdid]\n+        pat = \"RXDID\\[(\\d+)\\]\"\n+        for rx in rxdid:\n+            if self.__is_pf:\n+                value = re.findall(pat, rx)\n+                if not value:\n+                    continue\n+                check_str = \"RXDID : {}\".format(value[0])\n+                self.verify(\n+                    check_str in out,\n+                    \"rxdid value error, expected rxdid is %s\" % check_str)\n+            else:\n+                self.verify(\n+                    rx in out,\n+                    \"rxdid value error, expected rxdid is %s\" % rx)\n+\n+    def start_testpmd(self, flex_opt, rxdid, queue_num=None):\n+        \"\"\"\n+        start testpmd\n+        \"\"\"\n+        param_type = 'proto_xtr'\n+        # port option\n+        port_option = self.__get_port_option(flex_opt, queue_num=queue_num)\n+        # start test pmd\n+        out = self.__pmdout.start_testpmd(\n+            \"1S/3C/1T\",\n+            param=port_option,\n+            eal_param='' if self.__is_iavf else '--log-level=\"ice,8\"',\n+            ports=[self.__pci],\n+            port_options={self.__pci: '%s=%s' % (param_type, flex_opt)})\n+        self.__is_pmd_on = True\n+        # check rxdid value correct\n+        self.__check_rxdid(rxdid, out)\n+        # set test pmd command\n+        if flex_opt == 'ip_offset':\n+            cmds = [\n+                'set verbose 1',\n+                'start',\n+            ]\n+        else:\n+            cmds = [\n+                \"set verbose 1\",\n+                \"set fwd io\",\n+                \"set promisc all off\",\n+                \"clear port stats all\",\n+                \"start\", ]\n+        [self.dut.send_expect(cmd, \"testpmd> \", 15) for cmd in cmds]\n+\n+    def close_testpmd(self):\n+        if not self.__is_pmd_on:\n+            return\n+        try:\n+            self.__pmdout.quit()\n+            self.__is_pmd_on = False\n+        except Exception as e:\n+            pass\n+\n+    def __send_pkts_and_get_output(self, pkt_str):\n+        pkt = Packet(pkt_str)\n+        pkt.send_pkt(\n+            self.tester,\n+            tx_port=self.__tester_intf,\n+            count=self.__pkg_count,\n+            timeout=30)\n+        time.sleep(0.5)\n+        output = self.dut.get_session_output(timeout=3)\n+        return output\n+\n+    def __verify_common(self, pkts_list, msg=None):\n+        \"\"\"\n+        send MPLS type packet, verify packet ip_offset value correct\n+        param pkts_list:\n+            [send packets list, ip_offset expected value]\n+        \"\"\"\n+        msg = msg if msg else \"ip_offset value error, case test failed\"\n+        for pkt_str, expected_strs in pkts_list:\n+            out = self.__send_pkts_and_get_output(\n+                pkt_str.format(**{\n+                    'src_mac': self.__src_mac,\n+                    'dst_mac': self.__dst_mac}))\n+            # validation results\n+            _expected_strs = [expected_strs] \\\n+                if isinstance(expected_strs, str) else \\\n+                expected_strs\n+            self.verify(all([e in out for e in _expected_strs]), msg)\n+\n+    def check_single_VLAN_fields_in_RXD_8021Q(self):\n+        \"\"\"\n+        Check single VLAN fields in RXD (802.1Q)\n+        \"\"\"\n+        self.start_testpmd(\"vlan\", \"RXDID[17]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\", type=0x8100)/Dot1Q(prio=1,vlan=23)/IP()/UDP()/DNS()'\n+        msg = \"The packet does not carry a VLAN tag.\"\n+        fields_list = [\"vlan\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_single_VLAN_fields_in_RXD_8021ad(self):\n+        \"\"\"\n+        Check single VLAN fields in RXD (802.1ad)\n+        \"\"\"\n+        self.start_testpmd(\"vlan\", \"RXDID[17]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\", type=0x88A8)/Dot1Q(prio=1,vlan=23)/IP()/UDP()/DNS()'\n+        msg = \"stag result is not expected (stag=1:0:23)\"\n+        fields_list = [\"stag=1:0:23\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_double_VLAN_fields_in_RXD_8021Q_1_VLAN_tag(self):\n+        \"\"\"\n+        Check double VLAN fields in RXD (802.1Q) only 1 VLAN tag\n+        \"\"\"\n+        self.start_testpmd(\"vlan\", \"RXDID[17]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\", type=0x9100)/Dot1Q(prio=1,vlan=23)/IP()/UDP()/DNS()'\n+        msg = \"stag result is not expected (stag=1:0:23)\"\n+        fields_list = [\"stag=1:0:23\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_double_VLAN_fields_in_RXD_8021Q_2_VLAN_tag(self):\n+        \"\"\"\n+        Check double VLAN fields in RXD (802.1Q) 2 VLAN tags\n+        \"\"\"\n+        self.start_testpmd(\"vlan\", \"RXDID[17]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\", type=0x9100)/Dot1Q(prio=1,vlan=23)/Dot1Q(prio=4,vlan=56)/IP()/UDP()/DNS()'\n+        msg = \"There are no related fields in the received VLAN packet\"\n+        fields_list = [\"stag=1:0:23\", \"ctag=4:0:56\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_double_VLAN_fields_in_RXD_8021ad(self):\n+        \"\"\"\n+        Check double VLAN fields in RXD (802.1ad)\n+        \"\"\"\n+        self.start_testpmd(\"vlan\", \"RXDID[17]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\", type=0x88A8)/Dot1Q(prio=1,vlan=23)/Dot1Q(prio=4,vlan=56)/IP()/UDP()/DNS()'\n+        msg = \"There are no related fields in the received VLAN packet\"\n+        fields_list = [\"stag=1:0:23\", \"ctag=4:0:56\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_IPv4_fields_in_RXD(self):\n+        \"\"\"\n+        Check IPv4 fields in RXD\n+        \"\"\"\n+        self.start_testpmd(\"ipv4\", \"RXDID[18]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\")/IP(tos=23, ttl=98)/UDP()/Raw(load=\"XXXXXXXXXX\")'\n+        msg = \"There are no related fields in the received IPV4 packet\"\n+        fields_list = [\"ver=4\", \"hdrlen=5\", \"tos=23\", \"ttl=98\", \"proto=17\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_IPv6_fields_in_RXD(self):\n+        \"\"\"\n+        Check IPv6 fields in RXD\n+        \"\"\"\n+        self.start_testpmd(\"ipv6\", \"RXDID[19]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\")/IPv6(tc=12,hlim=34,fl=0x98765)/UDP()/Raw(load=\"XXXXXXXXXX\")'\n+        msg = \"There are no related fields in the received IPV6 packet\"\n+        fields_list = [\n+            \"ver=6\", \"tc=12\", \"flow_hi4=0x9\", \"nexthdr=17\", \"hoplimit=34\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_IPv6_flow_field_in_RXD(self):\n+        \"\"\"\n+        Check IPv6 flow field in RXD\n+        \"\"\"\n+        self.start_testpmd(\"ipv6_flow\", \"RXDID[20]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\")/IPv6(tc=12,hlim=34,fl=0x98765)/UDP()/Raw(load=\"XXXXXXXXXX\")'\n+        msg = \"There are no related fields in the received IPV6_flow packet\"\n+        fields_list = [\"ver=6\", \"tc=12\", \"flow=0x98765\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_TCP_fields_in_IPv4_in_RXD(self):\n+        \"\"\"\n+        Check TCP fields in IPv4 in RXD\n+        \"\"\"\n+        self.start_testpmd(\"tcp\", \"RXDID[21]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\")/IP()/TCP(flags=\"AS\")/Raw(load=\"XXXXXXXXXX\")'\n+        msg = \"There are no related fields in the received TCP packet\"\n+        fields_list = [\"doff=5\", \"flags=AS\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_TCP_fields_in_IPv6_in_RXD(self):\n+        \"\"\"\n+        Check TCP fields in IPv6 in RXD\n+        \"\"\"\n+        self.start_testpmd(\"tcp\", \"RXDID[21]\")\n+        pkts_str = 'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\")/IPv6()/TCP(flags=\"S\")/Raw(load=\"XXXXXXXXXX\")'\n+        msg = \"There are no related fields in the received TCP packet\"\n+        fields_list = [\"doff=5\", \"flags=S\"]\n+        self.__verify_common([[pkts_str, fields_list]], msg)\n+\n+    def check_IPv4_IPv6_TCP_fields_in_RXD_on_specific_queues(self):\n+        \"\"\"\n+        Check IPv4, IPv6, TCP fields in RXD on specific queues\n+        \"\"\"\n+        self.start_testpmd(\n+            \"'[(2):ipv4,(3):ipv6,(4):tcp]'\",\n+            [\"RXDID[18]\", \"RXDID[19]\", \"RXDID[22]\"] if self.__is_iavf else\n+            [\"RXDID[18]\", \"RXDID[19]\", \"RXDID[21]\", \"RXDID[22]\"],\n+            16)\n+        self.dut.send_expect(\n+            \"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\".format(\n+                '' if self.__is_iavf else \"dst is {} \".format(self.__dst_mac)),\n+            \"created\")\n+        self.dut.send_expect(\n+            \"flow create 0 ingress pattern eth / ipv6 src is 2001::3 dst is 2001::4 tc is 12 / end actions queue index 3 / end\",\n+            \"created\")\n+        # send IPv4\n+        pkts_str = \\\n+            'Ether(dst=\"{dst_mac}\")/IP(src=\"192.168.0.1\",dst=\"192.168.0.2\",tos=23,ttl=98)/UDP()/Raw(load=\"XXXXXXXXXX\")'\n+        msg1 = \"There are no relevant fields in the received IPv4 packet.\"\n+        fields_list1 = [\"Receive queue=0x2\", \"ver=4\",\n+                        \"hdrlen=5\", \"tos=23\", \"ttl=98\", \"proto=17\"]\n+        self.__verify_common([[pkts_str, fields_list1]], msg1)\n+\n+        # send IPv6\n+        pkts_str = \\\n+            'Ether(src=\"{src_mac}\", dst=\"{dst_mac}\")/IPv6(src=\"2001::3\", dst=\"2001::4\", tc=12, hlim=34,fl=0x98765)/UDP()/Raw(load=\"XXXXXXXXXX\")'\n+        msg2 = \"There are no relevant fields in the received IPv6 packet.\"\n+        fields_list2 = [\n+            \"Receive queue=0x3\",\n+            \"ver=6\",\n+            \"tc=12\",\n+            \"flow_hi4=0x9\",\n+            \"nexthdr=17\",\n+            \"hoplimit=34\"]\n+        self.__verify_common([[pkts_str, fields_list2]], msg2)\n+\n+        # send TCP\n+        self.dut.send_expect(\"flow flush 0\", \"testpmd>\")\n+        self.dut.send_expect(\n+            \"flow create 0 ingress pattern eth {0}/ ipv4 src is 192.168.0.1 dst is 192.168.0.2 / tcp src is 25 dst is 23 / end actions queue index {1} / end\".format(\n+                '' if self.__is_iavf else \"dst is {} \".format(self.__dst_mac),\n+                4, ),\n+            \"created\")\n+        pkts_str = \\\n+            'Ether(dst=\"{dst_mac}\")/IP(src=\"192.168.0.1\", dst=\"192.168.0.2\")/TCP(flags=\"AS\", dport=23, sport=25)/Raw(load=\"XXXXXXXXXX\")'\n+        msg3 = \"There are no relevant fields in the received TCP packet.\"\n+        fields_list3 = [\n+            \"Receive queue=0x4\",\n+            \"doff=5\",\n+            \"flags=AS\"]\n+        self.__verify_common([[pkts_str, fields_list3]], msg3)\n+\n+    def check_testpmd_use_different_parameters(self):\n+        \"\"\"\n+        Check testpmd use different parameters start\n+        \"\"\"\n+        param_type = 'proto_xtr'\n+        # port option\n+        port_opt = self.__get_port_option()\n+        # use error parameter Launch testpmd, testpmd can not be started\n+        cmd = (\n+            \"-l 1,2,3 \"\n+            \"-n {mem_channel} \"\n+            \"-w {pci},{param_type}=vxlan \"\n+            \"-- -i \"\n+            \"{port_opt}\").format(**{\n+                'mem_channel': self.dut.get_memory_channels(),\n+                \"pci\": self.__pci,\n+                \"param_type\": param_type,\n+                \"port_opt\": port_opt,\n+            })\n+        try:\n+            out = self.__pmdout.execute_cmd(self.__app_path + cmd, \"#\")\n+            self.__is_pmd_on = False\n+        except Exception as e:\n+            self.__is_pmd_on = True\n+        expected = \\\n+            \"iavf_lookup_proto_xtr_type(): wrong proto_xtr type, it should be: vlan|ipv4|ipv6|ipv6_flow|tcp|ip_offset\" \\\n+            if self.__is_iavf else \\\n+            \"handle_proto_xtr_arg(): The protocol extraction parameter is wrong : 'vxlan'\"\n+        self.close_testpmd()\n+        self.verify(expected in out, \"case test failed, testpmd started\")\n+        # don't use parameter launch testpmd, testpmd started and rxdid value\n+        # is the default\n+        cmd = (\n+            \"-l 1,2,3 \"\n+            \"-n {mem_channel} \"\n+            \"-w {pci} \"\n+            \"--log-level='ice,8' \"\n+            \"-- -i \"\n+            \"{port_opt}\").format(**{\n+                'mem_channel': self.dut.get_memory_channels(),\n+                \"pci\": self.__pci,\n+                \"param_type\": param_type,\n+                \"port_opt\": port_opt,\n+            })\n+        out = self.__pmdout.execute_cmd(self.__app_path + cmd, \"testpmd>\")\n+        self.__is_pmd_on = True\n+        self.close_testpmd()\n+        self.__check_rxdid(\"RXDID[22]\", out)\n+\n+    def check_ip_offset_of_ip(self):\n+        \"\"\"\n+        Check ip offset of ip\n+        \"\"\"\n+        self.start_testpmd(\"ip_offset\", \"RXDID[25]\")\n+        pkts_list = [\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=1)/IP()',\n+             'ip_offset=18'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=1)/IPv6()',\n+                'ip_offset=18']]\n+        self.__verify_common(pkts_list)\n+\n+    def check_ip_offset_with_vlan(self):\n+        \"\"\"\n+        check ip offset with vlan\n+        \"\"\"\n+        self.start_testpmd(\"ip_offset\", \"RXDID[25]\")\n+        pkts_list = [\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP()',\n+             'ip_offset=22'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6()',\n+                'ip_offset=22']]\n+        self.__verify_common(pkts_list)\n+\n+    def check_ip_offset_with_2_vlan_tag(self):\n+        \"\"\"\n+        check offset with 2 vlan tag\n+        \"\"\"\n+        self.start_testpmd(\"ip_offset\", \"RXDID[25]\")\n+        pkts_list = [\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP()',\n+             'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6()',\n+                'ip_offset=26']]\n+        self.__verify_common(pkts_list)\n+\n+    def check_ip_offset_with_multi_MPLS(self):\n+        \"\"\"\n+        check ip offset with multi MPLS\n+        \"\"\"\n+        self.start_testpmd(\"ip_offset\", \"RXDID[25]\")\n+        pkts_list = [\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=1)/IP()',\n+             'ip_offset=18'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=22'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=30'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=34'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=1)/IPv6()',\n+                'ip_offset=18'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=22'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=30'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=34']]\n+        self.__verify_common(pkts_list)\n+\n+    def check_ip_offset_with_multi_MPLS_with_vlan_tag(self):\n+        \"\"\"\n+        check ip offset with multi MPLS with vlan tag\n+        \"\"\"\n+        self.start_testpmd(\"ip_offset\", \"RXDID[25]\")\n+        pkts_list = [\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP()',\n+             'ip_offset=22'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=30'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=34'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=38'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6()',\n+                'ip_offset=22'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=30'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=34'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=38']]\n+        self.__verify_common(pkts_list)\n+\n+    def check_ip_offset_with_multi_MPLS_with_2_vlan_tag(self):\n+        \"\"\"\n+        check ip offset with multi MPLS with 2 vlan tag\n+        \"\"\"\n+        self.start_testpmd(\"ip_offset\", \"RXDID[25]\")\n+        pkts_list = [\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IP()',\n+             'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=30'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=34'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=38'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IP()',\n+                'ip_offset=42'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=1)/IPv6()',\n+                'ip_offset=26'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=30'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=34'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=38'],\n+            ['Ether(src=\"{src_mac}\", dst=\"{dst_mac}\",type=0x88A8)/Dot1Q(type=0x8100)/Dot1Q(type=0x8847)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=0)/MPLS(s=1)/IPv6()',\n+                'ip_offset=42']]\n+        self.__verify_common(pkts_list)\n",
    "prefixes": [
        "V6",
        "1/3"
    ]
}