get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 121725,
    "url": "http://patches.dpdk.org/api/patches/121725/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20230109164944.11175-4-hongbox.li@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": "<20230109164944.11175-4-hongbox.li@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230109164944.11175-4-hongbox.li@intel.com",
    "date": "2023-01-09T16:49:42",
    "name": "[V1,4/6] tests/vxlan: Separated performance cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "02c41c80c12e7f9e56255c58168bbe6a4b7c22d0",
    "submitter": {
        "id": 2804,
        "url": "http://patches.dpdk.org/api/people/2804/?format=api",
        "name": "Li, HongboX",
        "email": "hongbox.li@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20230109164944.11175-4-hongbox.li@intel.com/mbox/",
    "series": [
        {
            "id": 26437,
            "url": "http://patches.dpdk.org/api/series/26437/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=26437",
            "date": "2023-01-09T16:49:39",
            "name": "[V1,1/6] tests/efd: Separated performance cases",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/26437/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/121725/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/121725/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id DD1074237B;\n\tMon,  9 Jan 2023 09:31:06 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D8DB140F16;\n\tMon,  9 Jan 2023 09:31:06 +0100 (CET)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by mails.dpdk.org (Postfix) with ESMTP id 15BA04067C\n for <dts@dpdk.org>; Mon,  9 Jan 2023 09:31:04 +0100 (CET)",
            "from orsmga008.jf.intel.com ([10.7.209.65])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 09 Jan 2023 00:31:04 -0800",
            "from unknown (HELO localhost.localdomain) ([10.239.252.93])\n by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 09 Jan 2023 00:31:02 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1673253065; x=1704789065;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=7U4GQ/MSAeR7+zlot36h2u6OInM97hPGidxQCW8kfEM=;\n b=Q5elYedaT+4GPTuVur/Bz7eLEm6M3uP0DELti7qPKOgUZsXiBzxIH2hC\n yOjcOnK19j0TfeJv50Gr0mpl/PGPagZKCJC086LgnrUPu92Ll9NJRBoNe\n Zdr7dVws0mgboE46G0qmdTiKIiO/QS0RFs6tz/LfUuyVcoGheNfkuDrjV\n hTHa5HOylKDJpQwIW5zbabn/HrsAjAUrVgr6hjQ/EEggkam9x3V6DLrF6\n 8bTcFQoSapyb7QR1Rh0C9WMy3FZ0byLT4FWrgAvLaSxR7vdSqTKNJsJu6\n e/ivhi798ihzqX/QlBXe2pl2s9UViTtomeqJuMoRa5TjD5rtbvL4FcqEV Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6500,9779,10584\"; a=\"310614461\"",
            "E=Sophos;i=\"5.96,311,1665471600\"; d=\"scan'208\";a=\"310614461\"",
            "E=McAfee;i=\"6500,9779,10584\"; a=\"687127018\"",
            "E=Sophos;i=\"5.96,311,1665471600\"; d=\"scan'208\";a=\"687127018\""
        ],
        "From": "Hongbo Li <hongbox.li@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Hongbo Li <hongbox.li@intel.com>",
        "Subject": "[dts][PATCH V1 4/6] tests/vxlan: Separated performance cases",
        "Date": "Tue, 10 Jan 2023 00:49:42 +0800",
        "Message-Id": "<20230109164944.11175-4-hongbox.li@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20230109164944.11175-1-hongbox.li@intel.com>",
        "References": "<20230109164944.11175-1-hongbox.li@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org"
    },
    "content": "Separated performance test cases\n\nSigned-off-by: Hongbo Li <hongbox.li@intel.com>\n---\n test_plans/perf_vxlan_test_plan.rst |   85 +++\n test_plans/vxlan_test_plan.rst      |   60 +-\n tests/TestSuite_perf_vxlan.py       | 1022 +++++++++++++++++++++++++++\n tests/TestSuite_vxlan.py            |  213 ------\n 4 files changed, 1108 insertions(+), 272 deletions(-)\n create mode 100644 test_plans/perf_vxlan_test_plan.rst\n create mode 100644 tests/TestSuite_perf_vxlan.py",
    "diff": "diff --git a/test_plans/perf_vxlan_test_plan.rst b/test_plans/perf_vxlan_test_plan.rst\nnew file mode 100644\nindex 00000000..a330657a\n--- /dev/null\n+++ b/test_plans/perf_vxlan_test_plan.rst\n@@ -0,0 +1,85 @@\n+.. SPDX-License-Identifier: BSD-3-Clause\n+   Copyright(c) 2014-2017 Intel Corporation\n+\n+==========================================\n+Intel® Ethernet 700/800 Series Vxlan Tests\n+==========================================\n+Cloud providers build virtual network overlays over existing network\n+infrastructure that provide tenant isolation and scaling. Tunneling\n+layers added to the packets carry the virtual networking frames over\n+existing Layer 2 and IP networks. Conceptually, this is similar to\n+creating virtual private networks over the Internet. Intel® Ethernet\n+700 Series will process these tunneling layers by the hardware.\n+\n+The suit support NIC: Intel® Ethernet 700 Series, Intel® Ethernet 800 Series.\n+\n+This document provides test plan for Intel® Ethernet 700 Series vxlan\n+packet detecting, checksum computing and filtering.\n+\n+Prerequisites\n+=============\n+1x Intel® X710 (Intel® Ethernet 700 Series) NICs (2x 40GbE full duplex\n+optical ports per NIC) plugged into the available PCIe Gen3 8-lane slot.\n+\n+1x Intel® XL710-DA4 (Eagle Fountain) (1x 10GbE full duplex optical ports per NIC)\n+plugged into the available PCIe Gen3 8-lane slot.\n+\n+DUT board must be two sockets system and each cpu have more than 8 lcores.\n+\n+Test Case: Vxlan Checksum Offload Performance Benchmarking\n+==========================================================\n+The throughput is measured for each of these cases for vxlan tx checksum\n+offload of \"all by software\", \"L3 offload by hardware\", \"L4 offload by\n+hardware\", \"l3&l4 offload by hardware\".\n+\n+The results are printed in the following table:\n+\n++----------------+--------+--------+------------+\n+| Calculate Type | Queues | Mpps   | % linerate |\n++================+========+========+============+\n+| SOFTWARE ALL   | Single |        |            |\n++----------------+--------+--------+------------+\n+| HW L4          | Single |        |            |\n++----------------+--------+--------+------------+\n+| HW L3&L4       | Single |        |            |\n++----------------+--------+--------+------------+\n+| SOFTWARE ALL   | Multi  |        |            |\n++----------------+--------+--------+------------+\n+| HW L4          | Multi  |        |            |\n++----------------+--------+--------+------------+\n+| HW L3&L4       | Multi  |        |            |\n++----------------+--------+--------+------------+\n+\n+Test Case: Vxlan Tunnel filter Performance Benchmarking\n+=======================================================\n+The throughput is measured for different Vxlan tunnel filter types.\n+Queue single mean there's only one flow and forwarded to the first queue.\n+Queue multi mean there are two flows and configure to different queues.\n+\n++--------+------------------+--------+--------+------------+\n+| Packet | Filter           | Queue  | Mpps   | % linerate |\n++========+==================+========+========+============+\n+| Normal | None             | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | None             | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac-ivlan       | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac-ivlan-tenid | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac-tenid       | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac             | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | omac-imac-tenid  | Single |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac-ivlan       | Multi  |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac-ivlan-tenid | Multi  |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac-tenid       | Multi  |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | imac             | Multi  |        |            |\n++--------+------------------+--------+--------+------------+\n+| Vxlan  | omac-imac-tenid  | Multi  |        |            |\n++--------+------------------+--------+--------+------------+\ndiff --git a/test_plans/vxlan_test_plan.rst b/test_plans/vxlan_test_plan.rst\nindex e65b18d6..d46c550f 100644\n--- a/test_plans/vxlan_test_plan.rst\n+++ b/test_plans/vxlan_test_plan.rst\n@@ -307,62 +307,4 @@ Add Cloud filter with invalid vlan \"4097\" will be failed.\n \n Add Cloud filter with invalid vni \"16777216\" will be failed.\n \n-Add Cloud filter with invalid queue id \"64\" will be failed.\n-\n-Test Case: Vxlan Checksum Offload Performance Benchmarking\n-==========================================================\n-The throughput is measured for each of these cases for vxlan tx checksum\n-offload of \"all by software\", \"L3 offload by hardware\", \"L4 offload by\n-hardware\", \"l3&l4 offload by hardware\".\n-\n-The results are printed in the following table:\n-\n-+----------------+--------+--------+------------+\n-| Calculate Type | Queues | Mpps   | % linerate |\n-+================+========+========+============+\n-| SOFTWARE ALL   | Single |        |            |\n-+----------------+--------+--------+------------+\n-| HW L4          | Single |        |            |\n-+----------------+--------+--------+------------+\n-| HW L3&L4       | Single |        |            |\n-+----------------+--------+--------+------------+\n-| SOFTWARE ALL   | Multi  |        |            |\n-+----------------+--------+--------+------------+\n-| HW L4          | Multi  |        |            |\n-+----------------+--------+--------+------------+\n-| HW L3&L4       | Multi  |        |            |\n-+----------------+--------+--------+------------+\n-\n-Test Case: Vxlan Tunnel filter Performance Benchmarking\n-=======================================================\n-The throughput is measured for different Vxlan tunnel filter types.\n-Queue single mean there's only one flow and forwarded to the first queue.\n-Queue multi mean there are two flows and configure to different queues.\n-\n-+--------+------------------+--------+--------+------------+\n-| Packet | Filter           | Queue  | Mpps   | % linerate |\n-+========+==================+========+========+============+\n-| Normal | None             | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | None             | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac-ivlan       | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac-ivlan-tenid | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac-tenid       | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac             | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | omac-imac-tenid  | Single |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac-ivlan       | Multi  |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac-ivlan-tenid | Multi  |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac-tenid       | Multi  |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | imac             | Multi  |        |            |\n-+--------+------------------+--------+--------+------------+\n-| Vxlan  | omac-imac-tenid  | Multi  |        |            |\n-+--------+------------------+--------+--------+------------+\n+Add Cloud filter with invalid queue id \"64\" will be failed.\n\\ No newline at end of file\ndiff --git a/tests/TestSuite_perf_vxlan.py b/tests/TestSuite_perf_vxlan.py\nnew file mode 100644\nindex 00000000..69e5603e\n--- /dev/null\n+++ b/tests/TestSuite_perf_vxlan.py\n@@ -0,0 +1,1022 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2020 Intel Corporation\n+#\n+\n+\"\"\"\n+DPDK Test suite.\n+\n+Test VXLAN behaviour in DPDK.\n+\n+\"\"\"\n+\n+import os\n+import re\n+import string\n+import time\n+from random import randint\n+\n+from scapy.config import conf\n+from scapy.layers.inet import IP, TCP, UDP, Ether\n+from scapy.layers.inet6 import IPv6\n+from scapy.layers.l2 import Dot1Q\n+from scapy.layers.sctp import SCTP, SCTPChunkData\n+from scapy.layers.vxlan import VXLAN\n+from scapy.route import *\n+from scapy.sendrecv import sniff\n+from scapy.utils import rdpcap, wrpcap\n+\n+import framework.packet as packet\n+import framework.utils as utils\n+from framework.packet import IncreaseIP, IncreaseIPv6\n+from framework.pktgen import PacketGeneratorHelper\n+from framework.pmd_output import PmdOutput\n+from framework.settings import FOLDERS, HEADER_SIZE\n+from framework.test_case import TestCase\n+\n+#\n+#\n+# Test class.\n+#\n+\n+VXLAN_PORT = 4789\n+PACKET_LEN = 128\n+MAX_TXQ_RXQ = 4\n+BIDIRECT = True\n+\n+\n+class VxlanTestConfig(object):\n+\n+    \"\"\"\n+    Module for config/create/transmit vxlan packet\n+    \"\"\"\n+\n+    def __init__(self, test_case, **kwargs):\n+        self.test_case = test_case\n+        self.init()\n+        for name in kwargs:\n+            setattr(self, name, kwargs[name])\n+        self.pkt_obj = packet.Packet()\n+\n+    def init(self):\n+        self.packets_config()\n+\n+    def packets_config(self):\n+        \"\"\"\n+        Default vxlan packet format\n+        \"\"\"\n+        self.pcap_file = packet.TMP_PATH + \"vxlan.pcap\"\n+        self.capture_file = packet.TMP_PATH + \"vxlan_capture.pcap\"\n+        self.outer_mac_src = \"00:00:10:00:00:00\"\n+        self.outer_mac_dst = \"11:22:33:44:55:66\"\n+        self.outer_vlan = \"N/A\"\n+        self.outer_ip_src = \"192.168.1.1\"\n+        self.outer_ip_dst = \"192.168.1.2\"\n+        self.outer_ip_invalid = 0\n+        self.outer_ip6_src = \"N/A\"\n+        self.outer_ip6_dst = \"N/A\"\n+        self.outer_ip6_invalid = 0\n+        self.outer_udp_src = 63\n+        self.outer_udp_dst = VXLAN_PORT\n+        self.outer_udp_invalid = 0\n+        self.vni = 1\n+        self.inner_mac_src = \"00:00:20:00:00:00\"\n+        self.inner_mac_dst = \"00:00:20:00:00:01\"\n+        self.inner_vlan = \"N/A\"\n+        self.inner_ip_src = \"192.168.2.1\"\n+        self.inner_ip_dst = \"192.168.2.2\"\n+        self.inner_ip_invalid = 0\n+        self.inner_ip6_src = \"N/A\"\n+        self.inner_ip6_dst = \"N/A\"\n+        self.inner_ip6_invalid = 0\n+        self.payload_size = 18\n+        self.inner_l4_type = \"UDP\"\n+        self.inner_l4_invalid = 0\n+\n+    def packet_type(self):\n+        \"\"\"\n+        Return vxlan packet type\n+        \"\"\"\n+        if self.outer_udp_dst != VXLAN_PORT:\n+            if self.outer_ip6_src != \"N/A\":\n+                return \"L3_IPV6_EXT_UNKNOWN\"\n+            else:\n+                return \"L3_IPV4_EXT_UNKNOWN\"\n+        else:\n+            if self.inner_ip6_src != \"N/A\":\n+                return \"L3_IPV6_EXT_UNKNOWN\"\n+            else:\n+                return \"L3_IPV4_EXT_UNKNOWN\"\n+\n+    def create_pcap(self):\n+        \"\"\"\n+        Create pcap file and copy it to tester if configured\n+        Return scapy packet object for later usage\n+        \"\"\"\n+        if self.inner_l4_type == \"SCTP\":\n+            self.inner_payload = SCTPChunkData(data=\"X\" * 16)\n+        else:\n+            self.inner_payload = \"X\" * self.payload_size\n+\n+        if self.inner_l4_type == \"TCP\":\n+            l4_pro = TCP()\n+        elif self.inner_l4_type == \"SCTP\":\n+            l4_pro = SCTP()\n+        else:\n+            l4_pro = UDP()\n+\n+        if self.inner_ip6_src != \"N/A\":\n+            inner_l3 = IPv6()\n+        else:\n+            inner_l3 = IP()\n+\n+        if self.inner_vlan != \"N/A\":\n+            inner = Ether() / Dot1Q() / inner_l3 / l4_pro / self.inner_payload\n+            inner[Dot1Q].vlan = self.inner_vlan\n+        else:\n+            inner = Ether() / inner_l3 / l4_pro / self.inner_payload\n+\n+        if self.inner_ip6_src != \"N/A\":\n+            inner[inner_l3.name].src = self.inner_ip6_src\n+            inner[inner_l3.name].dst = self.inner_ip6_dst\n+        else:\n+            inner[inner_l3.name].src = self.inner_ip_src\n+            inner[inner_l3.name].dst = self.inner_ip_dst\n+\n+        if self.inner_ip_invalid == 1:\n+            inner[inner_l3.name].chksum = 0\n+\n+        # when udp checksum is 0, will skip checksum\n+        if self.inner_l4_invalid == 1:\n+            if self.inner_l4_type == \"SCTP\":\n+                inner[SCTP].chksum = 0\n+            else:\n+                inner[self.inner_l4_type].chksum = 1\n+\n+        inner[Ether].src = self.inner_mac_src\n+        inner[Ether].dst = self.inner_mac_dst\n+\n+        if self.outer_ip6_src != \"N/A\":\n+            outer_l3 = IPv6()\n+        else:\n+            outer_l3 = IP()\n+\n+        if self.outer_vlan != \"N/A\":\n+            outer = Ether() / Dot1Q() / outer_l3 / UDP()\n+            outer[Dot1Q].vlan = self.outer_vlan\n+        else:\n+            outer = Ether() / outer_l3 / UDP()\n+\n+        outer[Ether].src = self.outer_mac_src\n+        outer[Ether].dst = self.outer_mac_dst\n+\n+        if self.outer_ip6_src != \"N/A\":\n+            outer[outer_l3.name].src = self.outer_ip6_src\n+            outer[outer_l3.name].dst = self.outer_ip6_dst\n+        else:\n+            outer[outer_l3.name].src = self.outer_ip_src\n+            outer[outer_l3.name].dst = self.outer_ip_dst\n+\n+        outer[UDP].sport = self.outer_udp_src\n+        outer[UDP].dport = self.outer_udp_dst\n+\n+        if self.outer_ip_invalid == 1:\n+            outer[outer_l3.name].chksum = 0\n+        # when udp checksum is 0, will skip checksum\n+        if self.outer_udp_invalid == 1:\n+            outer[UDP].chksum = 1\n+\n+        if self.outer_udp_dst == VXLAN_PORT:\n+            self.pkt = outer / VXLAN(vni=self.vni) / inner\n+        else:\n+            self.pkt = outer / (\"X\" * self.payload_size)\n+\n+        wrpcap(self.pcap_file, self.pkt)\n+\n+        return self.pkt\n+\n+    def get_chksums(self, pkt=None):\n+        \"\"\"\n+        get chksum values of Outer and Inner packet L3&L4\n+        Skip outer udp for it will be calculated by software\n+        \"\"\"\n+        chk_sums = {}\n+        if pkt is None:\n+            pkt = rdpcap(self.pcap_file)\n+        else:\n+            pkt = pkt.pktgen.pkt\n+\n+        time.sleep(1)\n+        if pkt[0].guess_payload_class(pkt[0]).name == \"802.1Q\":\n+            payload = pkt[0][Dot1Q]\n+        else:\n+            payload = pkt[0]\n+\n+        if payload.guess_payload_class(payload).name == \"IP\":\n+            chk_sums[\"outer_ip\"] = hex(payload[IP].chksum)\n+\n+        if pkt[0].haslayer(\"VXLAN\") == 1:\n+            inner = pkt[0][\"VXLAN\"]\n+            if inner.haslayer(IP) == 1:\n+                chk_sums[\"inner_ip\"] = hex(inner[IP].chksum)\n+                if inner[IP].proto == 6:\n+                    chk_sums[\"inner_tcp\"] = hex(inner[TCP].chksum)\n+                if inner[IP].proto == 17:\n+                    chk_sums[\"inner_udp\"] = hex(inner[UDP].chksum)\n+                if inner[IP].proto == 132:\n+                    chk_sums[\"inner_sctp\"] = hex(inner[SCTP].chksum)\n+            elif inner.haslayer(IPv6) == 1:\n+                if inner[IPv6].nh == 6:\n+                    chk_sums[\"inner_tcp\"] = hex(inner[TCP].chksum)\n+                if inner[IPv6].nh == 17:\n+                    chk_sums[\"inner_udp\"] = hex(inner[UDP].chksum)\n+                # scapy can not get sctp checksum, so extracted manually\n+                if inner[IPv6].nh == 59:\n+                    load = str(inner[IPv6].payload)\n+                    chk_sums[\"inner_sctp\"] = hex(\n+                        (ord(load[8]) << 24)\n+                        | (ord(load[9]) << 16)\n+                        | (ord(load[10]) << 8)\n+                        | (ord(load[11]))\n+                    )\n+\n+        return chk_sums\n+\n+    def send_pcap(self, iface=\"\"):\n+        \"\"\"\n+        Send vxlan pcap file by iface\n+        \"\"\"\n+        del self.pkt_obj.pktgen.pkts[:]\n+        self.pkt_obj.pktgen.assign_pkt(self.pkt)\n+        self.pkt_obj.pktgen.update_pkts()\n+        self.pkt_obj.send_pkt(crb=self.test_case.tester, tx_port=iface)\n+\n+    def pcap_len(self):\n+        \"\"\"\n+        Return length of pcap packet, will plus 4 bytes crc\n+        \"\"\"\n+        # add four bytes crc\n+        return len(self.pkt) + 4\n+\n+\n+class TestVxlan(TestCase):\n+    def set_up_all(self):\n+        \"\"\"\n+        vxlan Prerequisites\n+        \"\"\"\n+        # this feature only enable in Intel® Ethernet 700 Series now\n+        if self.nic in [\n+            \"I40E_10G-SFP_XL710\",\n+            \"I40E_40G-QSFP_A\",\n+            \"I40E_40G-QSFP_B\",\n+            \"I40E_25G-25G_SFP28\",\n+            \"I40E_10G-SFP_X722\",\n+            \"I40E_10G-10G_BASE_T_X722\",\n+            \"I40E_10G-10G_BASE_T_BC\",\n+        ]:\n+            self.compile_switch = \"CONFIG_RTE_LIBRTE_I40E_INC_VECTOR\"\n+        elif self.nic in [\"IXGBE_10G-X550T\", \"IXGBE_10G-X550EM_X_10G_T\"]:\n+            self.compile_switch = \"CONFIG_RTE_IXGBE_INC_VECTOR\"\n+        elif self.nic in [\n+            \"ICE_25G-E810C_SFP\",\n+            \"ICE_100G-E810C_QSFP\",\n+            \"ICE_25G-E823C_QSFP\",\n+        ]:\n+            print(\"Intel® Ethernet 700 Series support default none VECTOR\")\n+        else:\n+            self.verify(False, \"%s not support this vxlan\" % self.nic)\n+        # Based on h/w type, choose how many ports to use\n+        ports = self.dut.get_ports()\n+\n+        # Verify that enough ports are available\n+        self.verify(len(ports) >= 2, \"Insufficient ports for testing\")\n+        global valports\n+        valports = [_ for _ in ports if self.tester.get_local_port(_) != -1]\n+\n+        self.portMask = utils.create_mask(valports[:2])\n+\n+        # Verify that enough threads are available\n+        netdev = self.dut.ports_info[ports[0]][\"port\"]\n+        self.ports_socket = netdev.socket\n+\n+        # start testpmd\n+        self.pmdout = PmdOutput(self.dut)\n+\n+        # init port config\n+        self.dut_port = valports[0]\n+        self.dut_port_mac = self.dut.get_mac_address(self.dut_port)\n+        tester_port = self.tester.get_local_port(self.dut_port)\n+        self.tester_iface = self.tester.get_interface(tester_port)\n+        self.recv_port = valports[1]\n+        tester_recv_port = self.tester.get_local_port(self.recv_port)\n+        self.recv_iface = self.tester.get_interface(tester_recv_port)\n+\n+        # invalid parameter\n+        self.invalid_mac = \"00:00:00:00:01\"\n+        self.invalid_ip = \"192.168.1.256\"\n+        self.invalid_vlan = 4097\n+        self.invalid_queue = 64\n+        self.path = self.dut.apps_name[\"test-pmd\"]\n+\n+        # vxlan payload length for performance test\n+        # inner packet not contain crc, should need add four\n+        self.vxlan_payload = (\n+            PACKET_LEN\n+            - HEADER_SIZE[\"eth\"]\n+            - HEADER_SIZE[\"ip\"]\n+            - HEADER_SIZE[\"udp\"]\n+            - HEADER_SIZE[\"vxlan\"]\n+            - HEADER_SIZE[\"eth\"]\n+            - HEADER_SIZE[\"ip\"]\n+            - HEADER_SIZE[\"udp\"]\n+            + 4\n+        )\n+\n+        self.cal_type = [\n+            {\n+                \"Type\": \"SOFTWARE ALL\",\n+                \"csum\": [],\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Type\": \"HW L4\",\n+                \"csum\": [\"udp\"],\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Type\": \"HW L3&L4\",\n+                \"csum\": [\"ip\", \"udp\", \"outer-ip\"],\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Type\": \"SOFTWARE ALL\",\n+                \"csum\": [],\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Type\": \"HW L4\",\n+                \"csum\": [\"udp\"],\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Type\": \"HW L3&L4\",\n+                \"csum\": [\"ip\", \"udp\", \"outer-ip\"],\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+        ]\n+\n+        self.chksum_header = [\"Calculate Type\"]\n+        self.chksum_header.append(\"Queues\")\n+        self.chksum_header.append(\"Mpps\")\n+        self.chksum_header.append(\"% linerate\")\n+\n+        # tunnel filter performance test\n+        self.default_vlan = 1\n+        self.tunnel_multiqueue = 2\n+        self.tunnel_header = [\"Packet\", \"Filter\", \"Queue\", \"Mpps\", \"% linerate\"]\n+        self.tunnel_perf = [\n+            {\n+                \"Packet\": \"Normal\",\n+                \"tunnel_filter\": \"None\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"None\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac-ivlan\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac-ivlan-tenid\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac-tenid\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"omac-imac-tenid\",\n+                \"recvqueue\": \"Single\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"None\",\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac-ivlan\",\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac-ivlan-tenid\",\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac-tenid\",\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"imac\",\n+                \"recvqueue\": \"Multi\",\n+                \"Mpps\": {},\n+                \"pct\": {},\n+            },\n+            {\n+                \"Packet\": \"VXLAN\",\n+                \"tunnel_filter\": \"omac-imac-tenid\",\n+                \"recvqueue\": \"Multi\",\n+            },\n+        ]\n+\n+        self.pktgen_helper = PacketGeneratorHelper()\n+\n+    def set_fields(self):\n+        fields_config = {\n+            \"ip\": {\n+                \"src\": {\"action\": \"random\"},\n+                \"dst\": {\"action\": \"random\"},\n+            },\n+        }\n+        return fields_config\n+\n+    def suite_measure_throughput(self, tgen_input, use_vm=False):\n+        vm_config = self.set_fields()\n+        self.tester.pktgen.clear_streams()\n+        streams = self.pktgen_helper.prepare_stream_from_tginput(\n+            tgen_input, 100, vm_config if use_vm else None, self.tester.pktgen\n+        )\n+        result = self.tester.pktgen.measure_throughput(stream_ids=streams)\n+\n+        return result\n+\n+    def perf_tunnel_filter_set_rule(self, rule_config):\n+        rule_list = {\n+            # check inner mac + inner vlan filter can work\n+            \"imac-ivlan\": f'flow create {rule_config.get(\"dut_port\")} ingress pattern eth / '\n+            f'ipv4 / udp / vxlan / eth dst is {rule_config.get(\"inner_mac_dst\")} / '\n+            f'vlan tci is {rule_config.get(\"inner_vlan\")} / end actions pf / '\n+            f'queue index {rule_config.get(\"queue\")} / end',\n+            # check inner mac + inner vlan + tunnel id filter can work\n+            \"imac-ivlan-tenid\": f'flow create {rule_config.get(\"dut_port\")} ingress pattern eth / '\n+            f'ipv4 / udp / vxlan vni is {rule_config.get(\"vni\")} / '\n+            f'eth dst is {rule_config.get(\"inner_mac_dst\")} / '\n+            f'vlan tci is {rule_config.get(\"inner_vlan\")} / '\n+            f'end actions pf / queue index {rule_config.get(\"queue\")} / end',\n+            # check inner mac + tunnel id filter can work\n+            \"imac-tenid\": f'flow create {rule_config.get(\"dut_port\")} ingress pattern eth / '\n+            f'ipv4 / udp / vxlan vni is {rule_config.get(\"vni\")} / '\n+            f'eth dst is {rule_config.get(\"inner_mac_dst\")} / end actions pf / '\n+            f'queue index {rule_config.get(\"queue\")} / end',\n+            # check inner mac filter can work\n+            \"imac\": f'flow create {rule_config.get(\"dut_port\")} ingress pattern eth / '\n+            f'ipv4 / udp / vxlan / eth dst is {rule_config.get(\"inner_mac_dst\")} / end actions pf / '\n+            f'queue index {rule_config.get(\"queue\")} / end',\n+            # check outer mac + inner mac + tunnel id filter can work\n+            \"omac-imac-tenid\": f'flow create {rule_config.get(\"dut_port\")} ingress pattern '\n+            f'eth dst is {rule_config.get(\"outer_mac_dst\")} / '\n+            f'ipv4 / udp / vxlan vni is {rule_config.get(\"vni\")} / '\n+            f'eth dst is {rule_config.get(\"inner_mac_dst\")} / '\n+            f'end actions pf / queue index {rule_config.get(\"queue\")} / end',\n+        }\n+        rule = rule_list.get(rule_config.get(\"tun_filter\"))\n+        if not rule:\n+            msg = \"not support format\"\n+            self.logger.error(msg)\n+            return\n+        out = self.dut.send_expect(rule, \"testpmd>\", 3)\n+        pat = \"Flow rule #\\d+ created\"\n+        self.verify(re.findall(pat, out, re.M), \"Flow rule create failed\")\n+\n+    def send_and_detect(self, **kwargs):\n+        \"\"\"\n+        send vxlan packet and check whether testpmd detect the correct\n+        packet type\n+        \"\"\"\n+        arg_str = \"\"\n+        for arg in kwargs:\n+            arg_str += \"[%s = %s]\" % (arg, kwargs[arg])\n+\n+        # create pcap file with supplied arguments\n+        self.logger.info(\"send vxlan pkts %s\" % arg_str)\n+        config = VxlanTestConfig(self, **kwargs)\n+        # now cloud filter will default enable L2 mac filter, so dst mac must\n+        # be same\n+        config.outer_mac_dst = self.dut_port_mac\n+        config.create_pcap()\n+        self.dut.send_expect(\"start\", \"testpmd>\", 10)\n+        self.pmdout.wait_link_status_up(self.dut_port)\n+        config.send_pcap(self.tester_iface)\n+        # check whether detect vxlan type\n+        out = self.dut.get_session_output(timeout=2)\n+        print(out)\n+        self.verify(config.packet_type() in out, \"Vxlan Packet not detected\")\n+\n+    def send_and_check(self, **kwargs):\n+        \"\"\"\n+        send vxlan packet and check whether receive packet with correct\n+        checksum\n+        \"\"\"\n+        # create pcap file with supplied arguments\n+        outer_ipv6 = False\n+        args = {}\n+        for arg in kwargs:\n+            if \"invalid\" not in arg:\n+                args[arg] = kwargs[arg]\n+                if \"outer_ip6\" in arg:\n+                    outer_ipv6 = True\n+\n+        # if packet outer L3 is ipv6, should not enable hardware checksum\n+        if outer_ipv6:\n+            self.csum_set_sw(\"outer-ip\", self.dut_port)\n+            self.csum_set_sw(\"outer-ip\", self.recv_port)\n+\n+        config = VxlanTestConfig(self, **args)\n+        # now cloud filter will default enable L2 mac filter, so dst mac must\n+        # be same\n+        config.outer_mac_dst = self.dut_port_mac\n+        # csum function will not auto add outer ip src address already, so update send packet src ip address\n+        if config.outer_ip6_src != \"N/A\":\n+            config.outer_ip6_src = config.outer_ip6_src\n+        else:\n+            config.outer_ip_src = config.outer_ip_src\n+\n+        # csum function will not auto add outer ip src address already, so update send packet src ip address\n+        if config.outer_udp_dst == VXLAN_PORT:\n+            if config.inner_ip6_src != \"N/A\":\n+                config.inner_ip6_src = config.inner_ip6_src\n+            else:\n+                config.inner_ip_src = config.inner_ip_src\n+\n+        # extract the checksum value of vxlan packet\n+        config.create_pcap()\n+        chksums_ref = config.get_chksums()\n+        self.logger.info(\"chksums_ref\" + str(chksums_ref))\n+\n+        # log the vxlan format\n+        arg_str = \"\"\n+        for arg in kwargs:\n+            arg_str += \"[%s = %s]\" % (arg, kwargs[arg])\n+\n+        self.logger.info(\"vxlan packet %s\" % arg_str)\n+\n+        out = self.dut.send_expect(\"start\", \"testpmd>\", 10)\n+\n+        # create pcap file with supplied arguments\n+        config = VxlanTestConfig(self, **kwargs)\n+        config.outer_mac_dst = self.dut_port_mac\n+        config.create_pcap()\n+\n+        self.pmdout.wait_link_status_up(self.dut_port)\n+        # save the capture packet into pcap format\n+        inst = self.tester.tcpdump_sniff_packets(self.recv_iface)\n+        config.send_pcap(self.tester_iface)\n+        pkt = self.tester.load_tcpdump_sniff_packets(inst, timeout=3)\n+\n+        # extract the checksum offload from saved pcap file\n+        chksums = config.get_chksums(pkt=pkt)\n+        self.logger.info(\"chksums\" + str(chksums))\n+\n+        out = self.dut.send_expect(\"stop\", \"testpmd>\", 10)\n+        print(out)\n+\n+        # verify detected l4 invalid checksum\n+        if \"inner_l4_invalid\" in kwargs:\n+            self.verify(\n+                self.pmdout.get_pmd_value(\"Bad-l4csum:\", out) == 1,\n+                \"Failed to count inner l4 chksum error\",\n+            )\n+\n+        # verify detected l3 invalid checksum\n+        if \"ip_invalid\" in kwargs:\n+            self.verify(\n+                self.pmdout.get_pmd_value(\"Bad-ipcsum:\", out) == self.iperr_num + 1,\n+                \"Failed to count inner ip chksum error\",\n+            )\n+            self.iperr_num += 1\n+\n+        # verify saved pcap checksum same to expected checksum\n+        for key in chksums_ref:\n+            self.verify(\n+                chksums[key] == chksums_ref[key],\n+                \"%s not matched to %s\" % (key, chksums_ref[key]),\n+            )\n+\n+    def filter_and_check(self, rule, config, queue_id):\n+        \"\"\"\n+        send vxlan packet and check whether receive packet in assigned queue\n+        \"\"\"\n+        # create rule\n+        self.tunnel_filter_add(rule)\n+\n+        # send vxlan packet\n+        config.create_pcap()\n+        self.dut.send_expect(\"start\", \"testpmd>\", 10)\n+        self.pmdout.wait_link_status_up(self.dut_port)\n+        config.send_pcap(self.tester_iface)\n+        out = self.dut.get_session_output(timeout=2)\n+        print(out)\n+\n+        queue = -1\n+        pattern = re.compile(\"- Receive queue=0x(\\d)\")\n+        m = pattern.search(out)\n+        if m is not None:\n+            queue = m.group(1)\n+\n+        # verify received in expected queue\n+        self.verify(queue_id == int(queue), \"invalid receive queue\")\n+\n+        # del rule\n+        args = [self.dut_port]\n+        self.tunnel_filter_del(*args)\n+        self.dut.send_expect(\"stop\", \"testpmd>\", 10)\n+\n+    def config_tunnelfilter(self, dut_port, recv_port, perf_config, pcapfile):\n+        pkts = []\n+        config = VxlanTestConfig(self, payload_size=self.vxlan_payload - 4)\n+        config.inner_vlan = self.default_vlan\n+        config.outer_mac_dst = self.dut.get_mac_address(dut_port)\n+        config.pcap_file = pcapfile\n+\n+        tun_filter = perf_config[\"tunnel_filter\"]\n+        recv_queue = perf_config[\"recvqueue\"]\n+        # there's known bug that if enable vxlan, rss will be disabled\n+        if tun_filter == \"None\" and recv_queue == \"Multi\":\n+            print((utils.RED(\"RSS and Tunel filter can't enable in the same time\")))\n+        else:\n+            self.enable_vxlan(dut_port)\n+\n+        if tun_filter != \"None\":\n+            rule_config = {\n+                \"dut_port\": dut_port,\n+                \"outer_mac_dst\": config.outer_mac_dst,\n+                \"inner_mac_dst\": config.inner_mac_dst,\n+                \"inner_ip_dst\": config.inner_ip_dst,\n+                \"inner_vlan\": config.inner_vlan,\n+                \"tun_filter\": tun_filter,\n+                \"vni\": config.vni,\n+                \"queue\": 0,\n+            }\n+            self.perf_tunnel_filter_set_rule(rule_config)\n+\n+        if perf_config[\"Packet\"] == \"Normal\":\n+            config.outer_udp_dst = 63\n+            config.outer_mac_dst = self.dut.get_mac_address(dut_port)\n+            config.payload_size = (\n+                PACKET_LEN - HEADER_SIZE[\"eth\"] - HEADER_SIZE[\"ip\"] - HEADER_SIZE[\"udp\"]\n+            )\n+\n+        # add default pkt into pkt list\n+        pkt = config.create_pcap()\n+        pkts.append(pkt)\n+\n+        # add other pkts into pkt list when enable multi receive queues\n+        if recv_queue == \"Multi\" and tun_filter != \"None\":\n+            for queue in range(self.tunnel_multiqueue - 1):\n+                if \"imac\" in tun_filter:\n+                    config.inner_mac_dst = \"00:00:20:00:00:0%d\" % (queue + 2)\n+                if \"ivlan\" in tun_filter:\n+                    config.inner_vlan = queue + 2\n+                if \"tenid\" in tun_filter:\n+                    config.vni = queue + 2\n+\n+                # add tunnel filter the same as pkt\n+                pkt = config.create_pcap()\n+                pkts.append(pkt)\n+\n+                rule_config = {\n+                    \"dut_port\": dut_port,\n+                    \"outer_mac_dst\": config.outer_mac_dst,\n+                    \"inner_mac_dst\": config.inner_mac_dst,\n+                    \"inner_ip_dst\": config.inner_ip_dst,\n+                    \"inner_vlan\": config.inner_vlan,\n+                    \"tun_filter\": tun_filter,\n+                    \"vni\": config.vni,\n+                    \"queue\": (queue + 1),\n+                }\n+                self.perf_tunnel_filter_set_rule(rule_config)\n+\n+        # save pkt list into pcap file\n+        wrpcap(config.pcap_file, pkts)\n+        self.tester.session.copy_file_to(config.pcap_file)\n+\n+    def combine_pcap(self, dest_pcap, src_pcap):\n+        pkts = rdpcap(dest_pcap)\n+        if len(pkts) != 1:\n+            return\n+\n+        pkts_src = rdpcap(src_pcap)\n+        pkts += pkts_src\n+\n+        wrpcap(dest_pcap, pkts)\n+\n+    def test_perf_vxlan_tunnelfilter_performance_2ports(self):\n+        self.result_table_create(self.tunnel_header)\n+        core_list = self.dut.get_core_list(\n+            \"1S/%dC/1T\" % (self.tunnel_multiqueue * 2 + 1), socket=self.ports_socket\n+        )\n+\n+        pmd_temp = (\n+            \"./%s %s -- -i --disable-rss --rxq=2 --txq=2 --nb-cores=4 --portmask=%s\"\n+        )\n+\n+        for perf_config in self.tunnel_perf:\n+            tun_filter = perf_config[\"tunnel_filter\"]\n+            recv_queue = perf_config[\"recvqueue\"]\n+            print(\n+                (\n+                    utils.GREEN(\n+                        \"Measure tunnel performance of [%s %s %s]\"\n+                        % (perf_config[\"Packet\"], tun_filter, recv_queue)\n+                    )\n+                )\n+            )\n+\n+            if tun_filter == \"None\" and recv_queue == \"Multi\":\n+                pmd_temp = (\n+                    \"./%s %s -- -i --rss-udp --rxq=2 --txq=2 --nb-cores=4 --portmask=%s\"\n+                )\n+\n+            self.eal_para = self.dut.create_eal_parameters(cores=core_list)\n+            pmd_cmd = pmd_temp % (self.path, self.eal_para, self.portMask)\n+            self.dut.send_expect(pmd_cmd, \"testpmd> \", 100)\n+\n+            # config flow\n+            self.config_tunnelfilter(\n+                self.dut_port, self.recv_port, perf_config, \"flow1.pcap\"\n+            )\n+            # config the flows\n+            tgen_input = []\n+            tgen_input.append(\n+                (\n+                    self.tester.get_local_port(self.dut_port),\n+                    self.tester.get_local_port(self.recv_port),\n+                    \"flow1.pcap\",\n+                )\n+            )\n+\n+            if BIDIRECT:\n+                self.config_tunnelfilter(\n+                    self.recv_port, self.dut_port, perf_config, \"flow2.pcap\"\n+                )\n+                tgen_input.append(\n+                    (\n+                        self.tester.get_local_port(self.recv_port),\n+                        self.tester.get_local_port(self.dut_port),\n+                        \"flow2.pcap\",\n+                    )\n+                )\n+\n+            self.dut.send_expect(\"set fwd io\", \"testpmd>\", 10)\n+            self.dut.send_expect(\"start\", \"testpmd>\", 10)\n+            self.pmdout.wait_link_status_up(self.dut_port)\n+            if BIDIRECT:\n+                wirespeed = self.wirespeed(self.nic, PACKET_LEN, 2)\n+            else:\n+                wirespeed = self.wirespeed(self.nic, PACKET_LEN, 1)\n+\n+            # run traffic generator\n+            use_vm = True if recv_queue == \"Multi\" and tun_filter == \"None\" else False\n+            _, pps = self.suite_measure_throughput(tgen_input, use_vm=use_vm)\n+\n+            pps /= 1000000.0\n+            perf_config[\"Mpps\"] = pps\n+            perf_config[\"pct\"] = pps * 100 / wirespeed\n+\n+            out = self.dut.send_expect(\"stop\", \"testpmd>\", 10)\n+            self.dut.send_expect(\"quit\", \"# \", 10)\n+\n+            # verify every queue work fine\n+            check_queue = 0\n+            if recv_queue == \"Multi\":\n+                for queue in range(check_queue):\n+                    self.verify(\n+                        \"Queue= %d -> TX Port\" % (queue) in out,\n+                        \"Queue %d no traffic\" % queue,\n+                    )\n+\n+            table_row = [\n+                perf_config[\"Packet\"],\n+                tun_filter,\n+                recv_queue,\n+                perf_config[\"Mpps\"],\n+                perf_config[\"pct\"],\n+            ]\n+\n+            self.result_table_add(table_row)\n+\n+        self.result_table_print()\n+\n+    def test_perf_vxlan_checksum_performance_2ports(self):\n+        self.result_table_create(self.chksum_header)\n+        vxlan = VxlanTestConfig(self, payload_size=self.vxlan_payload)\n+        vxlan.outer_mac_dst = self.dut.get_mac_address(self.dut_port)\n+        vxlan.pcap_file = \"vxlan1.pcap\"\n+        vxlan.inner_mac_dst = \"00:00:20:00:00:01\"\n+        vxlan.create_pcap()\n+\n+        vxlan_queue = VxlanTestConfig(self, payload_size=self.vxlan_payload)\n+        vxlan_queue.outer_mac_dst = self.dut.get_mac_address(self.dut_port)\n+        vxlan_queue.pcap_file = \"vxlan1_1.pcap\"\n+        vxlan_queue.inner_mac_dst = \"00:00:20:00:00:02\"\n+        vxlan_queue.create_pcap()\n+\n+        # socket/core/thread\n+        core_list = self.dut.get_core_list(\n+            \"1S/%dC/1T\" % (self.tunnel_multiqueue * 2 + 1), socket=self.ports_socket\n+        )\n+        core_mask = utils.create_mask(core_list)\n+\n+        self.dut_ports = self.dut.get_ports_performance(force_different_nic=False)\n+        tx_port = self.tester.get_local_port(self.dut_ports[0])\n+        rx_port = self.tester.get_local_port(self.dut_ports[1])\n+\n+        for cal in self.cal_type:\n+            recv_queue = cal[\"recvqueue\"]\n+            print(\n+                (\n+                    utils.GREEN(\n+                        \"Measure checksum performance of [%s %s %s]\"\n+                        % (cal[\"Type\"], recv_queue, cal[\"csum\"])\n+                    )\n+                )\n+            )\n+\n+            # configure flows\n+            tgen_input = []\n+            if recv_queue == \"Multi\":\n+                tgen_input.append((tx_port, rx_port, \"vxlan1.pcap\"))\n+                tgen_input.append((tx_port, rx_port, \"vxlan1_1.pcap\"))\n+            else:\n+                tgen_input.append((tx_port, rx_port, \"vxlan1.pcap\"))\n+\n+            # multi queue and signle queue commands\n+            if recv_queue == \"Multi\":\n+                pmd_temp = \"./%s %s -- -i --disable-rss --rxq=2 --txq=2 --nb-cores=4 --portmask=%s\"\n+            else:\n+                pmd_temp = \"./%s %s -- -i --nb-cores=2 --portmask=%s\"\n+\n+            self.eal_para = self.dut.create_eal_parameters(cores=core_list)\n+            pmd_cmd = pmd_temp % (self.path, self.eal_para, self.portMask)\n+\n+            self.dut.send_expect(pmd_cmd, \"testpmd> \", 100)\n+            self.dut.send_expect(\"set fwd csum\", \"testpmd>\", 10)\n+            self.enable_vxlan(self.dut_port)\n+            self.enable_vxlan(self.recv_port)\n+            self.pmdout.wait_link_status_up(self.dut_port)\n+\n+            # redirect flow to another queue by tunnel filter\n+            rule_config = {\n+                \"dut_port\": self.dut_port,\n+                \"outer_mac_dst\": vxlan.outer_mac_dst,\n+                \"inner_mac_dst\": vxlan.inner_mac_dst,\n+                \"inner_ip_dst\": vxlan.inner_ip_dst,\n+                \"inner_vlan\": 0,\n+                \"tun_filter\": \"imac\",\n+                \"vni\": vxlan.vni,\n+                \"queue\": 0,\n+            }\n+            self.perf_tunnel_filter_set_rule(rule_config)\n+\n+            if recv_queue == \"Multi\":\n+                rule_config = {\n+                    \"dut_port\": self.dut_port,\n+                    \"outer_mac_dst\": vxlan_queue.outer_mac_dst,\n+                    \"inner_mac_dst\": vxlan_queue.inner_mac_dst,\n+                    \"inner_ip_dst\": vxlan_queue.inner_ip_dst,\n+                    \"inner_vlan\": 0,\n+                    \"tun_filter\": \"imac\",\n+                    \"vni\": vxlan.vni,\n+                    \"queue\": 1,\n+                }\n+                self.perf_tunnel_filter_set_rule(rule_config)\n+\n+            for pro in cal[\"csum\"]:\n+                self.csum_set_type(pro, self.dut_port)\n+                self.csum_set_type(pro, self.recv_port)\n+\n+            self.dut.send_expect(\"start\", \"testpmd>\", 10)\n+\n+            wirespeed = self.wirespeed(self.nic, PACKET_LEN, 1)\n+\n+            # run traffic generator\n+            _, pps = self.suite_measure_throughput(tgen_input)\n+\n+            pps /= 1000000.0\n+            cal[\"Mpps\"] = pps\n+            cal[\"pct\"] = pps * 100 / wirespeed\n+\n+            out = self.dut.send_expect(\"stop\", \"testpmd>\", 10)\n+            self.dut.send_expect(\"quit\", \"# \", 10)\n+\n+            # verify every queue work fine\n+            check_queue = 1\n+            if recv_queue == \"Multi\":\n+                for queue in range(check_queue):\n+                    self.verify(\n+                        \"Queue= %d -> TX Port\" % (queue) in out,\n+                        \"Queue %d no traffic\" % queue,\n+                    )\n+\n+            table_row = [cal[\"Type\"], recv_queue, cal[\"Mpps\"], cal[\"pct\"]]\n+            self.result_table_add(table_row)\n+\n+        self.result_table_print()\n+\n+    def enable_vxlan(self, port):\n+        self.dut.send_expect(\n+            \"rx_vxlan_port add %d %d\" % (VXLAN_PORT, port), \"testpmd>\", 10\n+        )\n+\n+    def csum_set_type(self, proto, port):\n+        self.dut.send_expect(\"port stop all\", \"testpmd>\")\n+        out = self.dut.send_expect(\"csum set %s hw %d\" % (proto, port), \"testpmd>\", 10)\n+        self.dut.send_expect(\"port start all\", \"testpmd>\")\n+        self.verify(\"Bad arguments\" not in out, \"Failed to set vxlan csum\")\n+        self.verify(\"error\" not in out, \"Failed to set vxlan csum\")\n+\n+    def csum_set_sw(self, proto, port):\n+        self.dut.send_expect(\"port stop all\", \"testpmd>\")\n+        out = self.dut.send_expect(\"csum set %s sw %d\" % (proto, port), \"testpmd>\", 10)\n+        self.dut.send_expect(\"port start all\", \"testpmd>\")\n+        self.verify(\"Bad arguments\" not in out, \"Failed to set vxlan csum\")\n+        self.verify(\"error\" not in out, \"Failed to set vxlan csum\")\n+\n+    def tunnel_filter_add(self, rule):\n+        out = self.dut.send_expect(rule, \"testpmd>\", 3)\n+        self.verify(\"Flow rule #0 created\" in out, \"Flow rule create failed\")\n+        return out\n+\n+    def tunnel_filter_add_nocheck(self, rule):\n+        out = self.dut.send_expect(rule, \"testpmd>\", 3)\n+        return out\n+\n+    def tunnel_filter_del(self, *args):\n+        out = self.dut.send_expect(\"flow flush 0\", \"testpmd>\", 10)\n+        return out\n+\n+    def set_up(self):\n+        \"\"\"\n+        Run before each test case.\n+        \"\"\"\n+        pass\n+\n+    def tear_down(self):\n+        \"\"\"\n+        Run after each test case.\n+        \"\"\"\n+        self.dut.kill_all()\n+\n+    def tear_down_all(self):\n+        \"\"\"\n+        Run after each test suite.\n+        \"\"\"\n+        pass\ndiff --git a/tests/TestSuite_vxlan.py b/tests/TestSuite_vxlan.py\nindex 1bf12743..7c309a01 100644\n--- a/tests/TestSuite_vxlan.py\n+++ b/tests/TestSuite_vxlan.py\n@@ -1175,219 +1175,6 @@ class TestVxlan(TestCase):\n \n         wrpcap(dest_pcap, pkts)\n \n-    def test_perf_vxlan_tunnelfilter_performance_2ports(self):\n-        self.result_table_create(self.tunnel_header)\n-        core_list = self.dut.get_core_list(\n-            \"1S/%dC/1T\" % (self.tunnel_multiqueue * 2 + 1), socket=self.ports_socket\n-        )\n-\n-        pmd_temp = (\n-            \"./%s %s -- -i --disable-rss --rxq=2 --txq=2 --nb-cores=4 --portmask=%s\"\n-        )\n-\n-        for perf_config in self.tunnel_perf:\n-            tun_filter = perf_config[\"tunnel_filter\"]\n-            recv_queue = perf_config[\"recvqueue\"]\n-            print(\n-                (\n-                    utils.GREEN(\n-                        \"Measure tunnel performance of [%s %s %s]\"\n-                        % (perf_config[\"Packet\"], tun_filter, recv_queue)\n-                    )\n-                )\n-            )\n-\n-            if tun_filter == \"None\" and recv_queue == \"Multi\":\n-                pmd_temp = (\n-                    \"./%s %s -- -i --rss-udp --rxq=2 --txq=2 --nb-cores=4 --portmask=%s\"\n-                )\n-\n-            self.eal_para = self.dut.create_eal_parameters(cores=core_list)\n-            pmd_cmd = pmd_temp % (self.path, self.eal_para, self.portMask)\n-            self.dut.send_expect(pmd_cmd, \"testpmd> \", 100)\n-\n-            # config flow\n-            self.config_tunnelfilter(\n-                self.dut_port, self.recv_port, perf_config, \"flow1.pcap\"\n-            )\n-            # config the flows\n-            tgen_input = []\n-            tgen_input.append(\n-                (\n-                    self.tester.get_local_port(self.dut_port),\n-                    self.tester.get_local_port(self.recv_port),\n-                    \"flow1.pcap\",\n-                )\n-            )\n-\n-            if BIDIRECT:\n-                self.config_tunnelfilter(\n-                    self.recv_port, self.dut_port, perf_config, \"flow2.pcap\"\n-                )\n-                tgen_input.append(\n-                    (\n-                        self.tester.get_local_port(self.recv_port),\n-                        self.tester.get_local_port(self.dut_port),\n-                        \"flow2.pcap\",\n-                    )\n-                )\n-\n-            self.dut.send_expect(\"set fwd io\", \"testpmd>\", 10)\n-            self.dut.send_expect(\"start\", \"testpmd>\", 10)\n-            self.pmdout.wait_link_status_up(self.dut_port)\n-            if BIDIRECT:\n-                wirespeed = self.wirespeed(self.nic, PACKET_LEN, 2)\n-            else:\n-                wirespeed = self.wirespeed(self.nic, PACKET_LEN, 1)\n-\n-            # run traffic generator\n-            use_vm = True if recv_queue == \"Multi\" and tun_filter == \"None\" else False\n-            _, pps = self.suite_measure_throughput(tgen_input, use_vm=use_vm)\n-\n-            pps /= 1000000.0\n-            perf_config[\"Mpps\"] = pps\n-            perf_config[\"pct\"] = pps * 100 / wirespeed\n-\n-            out = self.dut.send_expect(\"stop\", \"testpmd>\", 10)\n-            self.dut.send_expect(\"quit\", \"# \", 10)\n-\n-            # verify every queue work fine\n-            check_queue = 0\n-            if recv_queue == \"Multi\":\n-                for queue in range(check_queue):\n-                    self.verify(\n-                        \"Queue= %d -> TX Port\" % (queue) in out,\n-                        \"Queue %d no traffic\" % queue,\n-                    )\n-\n-            table_row = [\n-                perf_config[\"Packet\"],\n-                tun_filter,\n-                recv_queue,\n-                perf_config[\"Mpps\"],\n-                perf_config[\"pct\"],\n-            ]\n-\n-            self.result_table_add(table_row)\n-\n-        self.result_table_print()\n-\n-    def test_perf_vxlan_checksum_performance_2ports(self):\n-        self.result_table_create(self.chksum_header)\n-        vxlan = VxlanTestConfig(self, payload_size=self.vxlan_payload)\n-        vxlan.outer_mac_dst = self.dut.get_mac_address(self.dut_port)\n-        vxlan.pcap_file = \"vxlan1.pcap\"\n-        vxlan.inner_mac_dst = \"00:00:20:00:00:01\"\n-        vxlan.create_pcap()\n-\n-        vxlan_queue = VxlanTestConfig(self, payload_size=self.vxlan_payload)\n-        vxlan_queue.outer_mac_dst = self.dut.get_mac_address(self.dut_port)\n-        vxlan_queue.pcap_file = \"vxlan1_1.pcap\"\n-        vxlan_queue.inner_mac_dst = \"00:00:20:00:00:02\"\n-        vxlan_queue.create_pcap()\n-\n-        # socket/core/thread\n-        core_list = self.dut.get_core_list(\n-            \"1S/%dC/1T\" % (self.tunnel_multiqueue * 2 + 1), socket=self.ports_socket\n-        )\n-        core_mask = utils.create_mask(core_list)\n-\n-        self.dut_ports = self.dut.get_ports_performance(force_different_nic=False)\n-        tx_port = self.tester.get_local_port(self.dut_ports[0])\n-        rx_port = self.tester.get_local_port(self.dut_ports[1])\n-\n-        for cal in self.cal_type:\n-            recv_queue = cal[\"recvqueue\"]\n-            print(\n-                (\n-                    utils.GREEN(\n-                        \"Measure checksum performance of [%s %s %s]\"\n-                        % (cal[\"Type\"], recv_queue, cal[\"csum\"])\n-                    )\n-                )\n-            )\n-\n-            # configure flows\n-            tgen_input = []\n-            if recv_queue == \"Multi\":\n-                tgen_input.append((tx_port, rx_port, \"vxlan1.pcap\"))\n-                tgen_input.append((tx_port, rx_port, \"vxlan1_1.pcap\"))\n-            else:\n-                tgen_input.append((tx_port, rx_port, \"vxlan1.pcap\"))\n-\n-            # multi queue and signle queue commands\n-            if recv_queue == \"Multi\":\n-                pmd_temp = \"./%s %s -- -i --disable-rss --rxq=2 --txq=2 --nb-cores=4 --portmask=%s\"\n-            else:\n-                pmd_temp = \"./%s %s -- -i --nb-cores=2 --portmask=%s\"\n-\n-            self.eal_para = self.dut.create_eal_parameters(cores=core_list)\n-            pmd_cmd = pmd_temp % (self.path, self.eal_para, self.portMask)\n-\n-            self.dut.send_expect(pmd_cmd, \"testpmd> \", 100)\n-            self.dut.send_expect(\"set fwd csum\", \"testpmd>\", 10)\n-            self.enable_vxlan(self.dut_port)\n-            self.enable_vxlan(self.recv_port)\n-            self.pmdout.wait_link_status_up(self.dut_port)\n-\n-            # redirect flow to another queue by tunnel filter\n-            rule_config = {\n-                \"dut_port\": self.dut_port,\n-                \"outer_mac_dst\": vxlan.outer_mac_dst,\n-                \"inner_mac_dst\": vxlan.inner_mac_dst,\n-                \"inner_ip_dst\": vxlan.inner_ip_dst,\n-                \"inner_vlan\": 0,\n-                \"tun_filter\": \"imac\",\n-                \"vni\": vxlan.vni,\n-                \"queue\": 0,\n-            }\n-            self.perf_tunnel_filter_set_rule(rule_config)\n-\n-            if recv_queue == \"Multi\":\n-                rule_config = {\n-                    \"dut_port\": self.dut_port,\n-                    \"outer_mac_dst\": vxlan_queue.outer_mac_dst,\n-                    \"inner_mac_dst\": vxlan_queue.inner_mac_dst,\n-                    \"inner_ip_dst\": vxlan_queue.inner_ip_dst,\n-                    \"inner_vlan\": 0,\n-                    \"tun_filter\": \"imac\",\n-                    \"vni\": vxlan.vni,\n-                    \"queue\": 1,\n-                }\n-                self.perf_tunnel_filter_set_rule(rule_config)\n-\n-            for pro in cal[\"csum\"]:\n-                self.csum_set_type(pro, self.dut_port)\n-                self.csum_set_type(pro, self.recv_port)\n-\n-            self.dut.send_expect(\"start\", \"testpmd>\", 10)\n-\n-            wirespeed = self.wirespeed(self.nic, PACKET_LEN, 1)\n-\n-            # run traffic generator\n-            _, pps = self.suite_measure_throughput(tgen_input)\n-\n-            pps /= 1000000.0\n-            cal[\"Mpps\"] = pps\n-            cal[\"pct\"] = pps * 100 / wirespeed\n-\n-            out = self.dut.send_expect(\"stop\", \"testpmd>\", 10)\n-            self.dut.send_expect(\"quit\", \"# \", 10)\n-\n-            # verify every queue work fine\n-            check_queue = 1\n-            if recv_queue == \"Multi\":\n-                for queue in range(check_queue):\n-                    self.verify(\n-                        \"Queue= %d -> TX Port\" % (queue) in out,\n-                        \"Queue %d no traffic\" % queue,\n-                    )\n-\n-            table_row = [cal[\"Type\"], recv_queue, cal[\"Mpps\"], cal[\"pct\"]]\n-            self.result_table_add(table_row)\n-\n-        self.result_table_print()\n-\n     def enable_vxlan(self, port):\n         self.dut.send_expect(\n             \"rx_vxlan_port add %d %d\" % (VXLAN_PORT, port), \"testpmd>\", 10\n",
    "prefixes": [
        "V1",
        "4/6"
    ]
}