get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 121589,
    "url": "https://patches.dpdk.org/api/patches/121589/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/20230105104056.234069-2-songx.jiale@intel.com/",
    "project": {
        "id": 3,
        "url": "https://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": "<20230105104056.234069-2-songx.jiale@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230105104056.234069-2-songx.jiale@intel.com",
    "date": "2023-01-05T10:40:50",
    "name": "[V1,1/7] tests/vf_pmd_bonded: add case to test vf bonding",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "a75a97e957b39e0de1fd0da7d0a960cd3a7760dd",
    "submitter": {
        "id": 2352,
        "url": "https://patches.dpdk.org/api/people/2352/?format=api",
        "name": "Jiale, SongX",
        "email": "songx.jiale@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dts/patch/20230105104056.234069-2-songx.jiale@intel.com/mbox/",
    "series": [
        {
            "id": 26391,
            "url": "https://patches.dpdk.org/api/series/26391/?format=api",
            "web_url": "https://patches.dpdk.org/project/dts/list/?series=26391",
            "date": "2023-01-05T10:40:49",
            "name": "add cases to test vf bonding",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/26391/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/121589/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/121589/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 4401BA00C2;\n\tThu,  5 Jan 2023 03:43:12 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 3D23440DFF;\n\tThu,  5 Jan 2023 03:43:12 +0100 (CET)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n by mails.dpdk.org (Postfix) with ESMTP id 41A5740DFF\n for <dts@dpdk.org>; Thu,  5 Jan 2023 03:43:10 +0100 (CET)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Jan 2023 18:43:09 -0800",
            "from unknown (HELO localhost.localdomain) ([10.239.252.20])\n by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Jan 2023 18:43:07 -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=1672886590; x=1704422590;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=IL0686htsYJrrxxKjRYRjwdbwnpwwOx5Bb//LwtXbgU=;\n b=KI7n0vlZsZvvsob+61+cuBInrNYRhPd9wkuIFkvI+q64NlO3TZ9Uc8Th\n ktJ4ozDZdNMAGMttktkHxC9dIgHiHKd1OEqeIghfx68U2BjXMuX1wvex6\n MsBpZ4C0+LCToZPfPGiOPA9GVwEB+0OBINbOQ/Gp8+blHX41gtwg1cDj3\n 7TjE9KGNYr5DMimL4A+XfMjmxbs/CHMgBkQDwhRlcGJyckd3TzZsXbJ4F\n A/hP+vYSwwbBtbvrCFHYupvfQTyJnMvDfjtyK/F07h0p2YXeWJTxN7c9j\n giVhIrJXKj0djj5ZefVjWzVRnR7vOQ0hyNbJlRRlaSt0ygCJY/kjV5E6Q A==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6500,9779,10580\"; a=\"408351301\"",
            "E=Sophos;i=\"5.96,301,1665471600\"; d=\"scan'208\";a=\"408351301\"",
            "E=McAfee;i=\"6500,9779,10580\"; a=\"718660502\"",
            "E=Sophos;i=\"5.96,301,1665471600\"; d=\"scan'208\";a=\"718660502\""
        ],
        "From": "Song Jiale <songx.jiale@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Song Jiale <songx.jiale@intel.com>",
        "Subject": "[dts] [PATCH V1 1/7] tests/vf_pmd_bonded: add case to test vf bonding",
        "Date": "Thu,  5 Jan 2023 10:40:50 +0000",
        "Message-Id": "<20230105104056.234069-2-songx.jiale@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230105104056.234069-1-songx.jiale@intel.com>",
        "References": "<20230105104056.234069-1-songx.jiale@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org"
    },
    "content": "add case to test vf bonding.\n\nSigned-off-by: Song Jiale <songx.jiale@intel.com>\n---\n tests/TestSuite_vf_pmd_bonded.py | 2152 ++++++++++++++++++++++++++++++\n 1 file changed, 2152 insertions(+)\n create mode 100644 tests/TestSuite_vf_pmd_bonded.py",
    "diff": "diff --git a/tests/TestSuite_vf_pmd_bonded.py b/tests/TestSuite_vf_pmd_bonded.py\nnew file mode 100644\nindex 00000000..e24138f4\n--- /dev/null\n+++ b/tests/TestSuite_vf_pmd_bonded.py\n@@ -0,0 +1,2152 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 23.03 Intel Corporation\n+#\n+\n+\"\"\"\n+DPDK Test suite.\n+\n+\n+Test userland 10Gb PMD.\n+\n+\"\"\"\n+\n+import random\n+import re\n+import time\n+from socket import htonl, htons\n+\n+import framework.utils as utils\n+import tests.bonding as bonding\n+from framework.pmd_output import PmdOutput\n+from framework.test_case import TestCase\n+\n+SOCKET_0 = 0\n+SOCKET_1 = 1\n+\n+MODE_ROUND_ROBIN = 0\n+MODE_ACTIVE_BACKUP = 1\n+MODE_XOR_BALANCE = 2\n+MODE_BROADCAST = 3\n+MODE_LACP = 4\n+MODE_TLB_BALANCE = 5\n+MODE_ALB_BALANCE = 6\n+\n+FRAME_SIZE_64 = 64\n+FRAME_SIZE_65 = 65\n+FRAME_SIZE_128 = 128\n+FRAME_SIZE_256 = 256\n+FRAME_SIZE_512 = 512\n+FRAME_SIZE_1024 = 1024\n+FRAME_SIZE_1280 = 1280\n+FRAME_SIZE_1518 = 1518\n+\n+S_MAC_IP_PORT = [\n+    (\"52:00:00:00:00:00\", \"10.239.129.65\", 61),\n+    (\"52:00:00:00:00:01\", \"10.239.129.66\", 62),\n+    (\"52:00:00:00:00:02\", \"10.239.129.67\", 63),\n+]\n+\n+D_MAC_IP_PORT = []\n+LACP_MESSAGE_SIZE = 128\n+\n+\n+class TestPmdBonded(TestCase):\n+    def get_stats(self, portid, rx_tx):\n+        \"\"\"\n+        Get packets number from port statistic\n+        \"\"\"\n+\n+        out = self.dut.send_expect(\"show port stats %d\" % portid, \"testpmd> \")\n+\n+        if rx_tx == \"rx\":\n+            result_scanner = (\n+                r\"RX-packets: ([0-9]+)\\s*RX-missed: ([0-9]+)\\s*RX-bytes:  ([0-9]+)\"\n+            )\n+        elif rx_tx == \"tx\":\n+            result_scanner = (\n+                r\"TX-packets: ([0-9]+)\\s*TX-errors: ([0-9]+)\\s*TX-bytes:  ([0-9]+)\"\n+            )\n+        else:\n+            return None\n+\n+        scanner = re.compile(result_scanner, re.DOTALL)\n+        m = scanner.search(out)\n+\n+        return m.groups()\n+\n+    def parse_ether_ip(self, dest_port, **ether_ip):\n+        \"\"\"\n+        ether_ip:\n+            'ether':\n+                {\n+                    'dest_mac':False\n+                    'src_mac':\"52:00:00:00:00:00\"\n+                }\n+            'dot1q':\n+                {\n+                    'vlan':1\n+                }\n+            'ip':\n+                {\n+                    'dest_ip':\"10.239.129.88\"\n+                    'src_ip':\"10.239.129.65\"\n+                }\n+            'udp':\n+                {\n+                    'dest_port':53\n+                    'src_port':53\n+                }\n+        \"\"\"\n+        ret_ether_ip = {}\n+        ether = {}\n+        dot1q = {}\n+        ip = {}\n+        udp = {}\n+        try:\n+            dut_dest_port = self.vf_ports[dest_port]\n+        except Exception as e:\n+            dut_dest_port = dest_port\n+\n+        query_type = \"mac\"\n+        if not ether_ip.get(\"ether\"):\n+            ether[\"dest_mac\"] = self.bond_inst.get_port_mac(dut_dest_port, query_type)\n+            ether[\"src_mac\"] = \"52:00:00:00:00:00\"\n+        else:\n+            if not ether_ip[\"ether\"].get(\"dest_mac\"):\n+                ether[\"dest_mac\"] = self.bond_inst.get_port_mac(\n+                    dut_dest_port, query_type\n+                )\n+            else:\n+                ether[\"dest_mac\"] = ether_ip[\"ether\"][\"dest_mac\"]\n+            if not ether_ip[\"ether\"].get(\"src_mac\"):\n+                ether[\"src_mac\"] = \"52:00:00:00:00:00\"\n+            else:\n+                ether[\"src_mac\"] = ether_ip[\"ether\"][\"src_mac\"]\n+\n+        if not ether_ip.get(\"dot1q\"):\n+            pass\n+        else:\n+            if not ether_ip[\"dot1q\"].get(\"vlan\"):\n+                dot1q[\"vlan\"] = \"1\"\n+            else:\n+                dot1q[\"vlan\"] = ether_ip[\"dot1q\"][\"vlan\"]\n+\n+        if not ether_ip.get(\"ip\"):\n+            ip[\"dest_ip\"] = \"10.239.129.88\"\n+            ip[\"src_ip\"] = \"10.239.129.65\"\n+        else:\n+            if not ether_ip[\"ip\"].get(\"dest_ip\"):\n+                ip[\"dest_ip\"] = \"10.239.129.88\"\n+            else:\n+                ip[\"dest_ip\"] = ether_ip[\"ip\"][\"dest_ip\"]\n+            if not ether_ip[\"ip\"].get(\"src_ip\"):\n+                ip[\"src_ip\"] = \"10.239.129.65\"\n+            else:\n+                ip[\"src_ip\"] = ether_ip[\"ip\"][\"src_ip\"]\n+\n+        if not ether_ip.get(\"udp\"):\n+            udp[\"dest_port\"] = 53\n+            udp[\"src_port\"] = 53\n+        else:\n+            if not ether_ip[\"udp\"].get(\"dest_port\"):\n+                udp[\"dest_port\"] = 53\n+            else:\n+                udp[\"dest_port\"] = ether_ip[\"udp\"][\"dest_port\"]\n+            if not ether_ip[\"udp\"].get(\"src_port\"):\n+                udp[\"src_port\"] = 53\n+            else:\n+                udp[\"src_port\"] = ether_ip[\"udp\"][\"src_port\"]\n+\n+        ret_ether_ip[\"ether\"] = ether\n+        ret_ether_ip[\"dot1q\"] = dot1q\n+        ret_ether_ip[\"ip\"] = ip\n+        ret_ether_ip[\"udp\"] = udp\n+\n+        return ret_ether_ip\n+\n+    def send_packet(\n+        self,\n+        dest_port,\n+        src_port=False,\n+        frame_size=FRAME_SIZE_64,\n+        count=1,\n+        invert_verify=False,\n+        **ether_ip,\n+    ):\n+        \"\"\"\n+        Send count packet to portid\n+        count: 1 or 2 or 3 or ... or 'MANY'\n+               if count is 'MANY', then set count=100000,\n+               send packets during 5 seconds.\n+        ether_ip:\n+            'ether':\n+                {\n+                    'dest_mac':False\n+                    'src_mac':\"52:00:00:00:00:00\"\n+                }\n+            'dot1q':\n+                {\n+                    'vlan':1\n+                }\n+            'ip':\n+                {\n+                    'dest_ip':\"10.239.129.88\"\n+                    'src_ip':\"10.239.129.65\"\n+                }\n+            'udp':\n+                {\n+                    'dest_port':53\n+                    'src_port':53\n+                }\n+        \"\"\"\n+        during = 0\n+        loop = 0\n+        try:\n+            count = int(count)\n+        except ValueError as e:\n+            if count == \"MANY\":\n+                during = 5\n+                count = 100000\n+            else:\n+                raise e\n+\n+        if not src_port:\n+            gp0rx_pkts, gp0rx_err, gp0rx_bytes = [\n+                int(_) for _ in self.get_stats(self.vf_ports[dest_port], \"rx\")\n+            ]\n+            itf = self.tester.get_interface(\n+                self.tester.get_local_port(self.dut_ports[dest_port])\n+            )\n+        else:\n+            gp0rx_pkts, gp0rx_err, gp0rx_bytes = [\n+                int(_) for _ in self.get_stats(dest_port, \"rx\")\n+            ]\n+            itf = src_port\n+\n+        ret_ether_ip = self.parse_ether_ip(dest_port, **ether_ip)\n+\n+        pktlen = frame_size - 18\n+        padding = pktlen - 20\n+\n+        start = time.time()\n+        while True:\n+            self.tester.scapy_foreground()\n+            self.tester.scapy_append('nutmac=\"%s\"' % ret_ether_ip[\"ether\"][\"dest_mac\"])\n+            self.tester.scapy_append('srcmac=\"%s\"' % ret_ether_ip[\"ether\"][\"src_mac\"])\n+\n+            if ether_ip.get(\"dot1q\"):\n+                self.tester.scapy_append(\"vlanvalue=%d\" % ret_ether_ip[\"dot1q\"][\"vlan\"])\n+            self.tester.scapy_append('destip=\"%s\"' % ret_ether_ip[\"ip\"][\"dest_ip\"])\n+            self.tester.scapy_append('srcip=\"%s\"' % ret_ether_ip[\"ip\"][\"src_ip\"])\n+            self.tester.scapy_append(\"destport=%d\" % ret_ether_ip[\"udp\"][\"dest_port\"])\n+            self.tester.scapy_append(\"srcport=%d\" % ret_ether_ip[\"udp\"][\"src_port\"])\n+            if not ret_ether_ip.get(\"dot1q\"):\n+                self.tester.scapy_append(\n+                    'sendp([Ether(dst=nutmac, src=srcmac)/IP(dst=destip, src=srcip, len=%s)/\\\n+UDP(sport=srcport, dport=destport)/Raw(load=\"\\x50\"*%s)], iface=\"%s\", count=%d)'\n+                    % (pktlen, padding, itf, count)\n+                )\n+            else:\n+                self.tester.scapy_append(\n+                    'sendp([Ether(dst=nutmac, src=srcmac)/Dot1Q(vlan=vlanvalue)/IP(dst=destip, src=srcip, len=%s)/\\\n+UDP(sport=srcport, dport=destport)/Raw(load=\"\\x50\"*%s)], iface=\"%s\", count=%d)'\n+                    % (pktlen, padding, itf, count)\n+                )\n+\n+            self.tester.scapy_execute(timeout=180)\n+            loop += 1\n+\n+            now = time.time()\n+            if (now - start) >= during:\n+                break\n+        time.sleep(0.5)\n+\n+        if not src_port:\n+            p0rx_pkts, p0rx_err, p0rx_bytes = [\n+                int(_) for _ in self.get_stats(self.vf_ports[dest_port], \"rx\")\n+            ]\n+        else:\n+            p0rx_pkts, p0rx_err, p0rx_bytes = [\n+                int(_) for _ in self.get_stats(dest_port, \"rx\")\n+            ]\n+\n+        p0rx_pkts -= gp0rx_pkts\n+        p0rx_bytes -= gp0rx_bytes\n+\n+        if not invert_verify:\n+            self.verify(p0rx_pkts >= count * loop, \"Data not received by port\")\n+        else:\n+            global LACP_MESSAGE_SIZE\n+            self.verify(\n+                p0rx_pkts == 0 or p0rx_bytes / p0rx_pkts == LACP_MESSAGE_SIZE,\n+                \"Data received by port, but should not.\",\n+            )\n+        return count * loop\n+\n+    def get_value_from_str(self, key_str, regx_str, string):\n+        \"\"\"\n+        Get some values from the given string by the regular expression.\n+        \"\"\"\n+        pattern = r\"(?<=%s)%s\" % (key_str, regx_str)\n+        s = re.compile(pattern)\n+        res = s.search(string)\n+        if type(res).__name__ == \"NoneType\":\n+            return \" \"\n+        else:\n+            return res.group(0)\n+\n+    def get_detail_from_port_info(self, key_str, regx_str, port):\n+        \"\"\"\n+        Get the detail info from the output of pmd cmd 'show port info <port num>'.\n+        \"\"\"\n+        out = self.dut.send_expect(\"show port info %d\" % port, \"testpmd> \")\n+        find_value = self.get_value_from_str(key_str, regx_str, out)\n+        return find_value\n+\n+    def get_port_mac(self, port_id):\n+        \"\"\"\n+        Get the specified port MAC.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\n+            \"MAC address: \", \"([0-9A-F]{2}:){5}[0-9A-F]{2}\", port_id\n+        )\n+\n+    def get_port_connect_socket(self, port_id):\n+        \"\"\"\n+        Get the socket id which the specified port is connecting with.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\"Connect to socket: \", \"\\d+\", port_id)\n+\n+    def get_port_memory_socket(self, port_id):\n+        \"\"\"\n+        Get the socket id which the specified port memory is allocated on.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\n+            \"memory allocation on the socket: \", \"\\d+\", port_id\n+        )\n+\n+    def get_port_link_status(self, port_id):\n+        \"\"\"\n+        Get the specified port link status now.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\"Link status: \", \"\\d+\", port_id)\n+\n+    def get_port_link_speed(self, port_id):\n+        \"\"\"\n+        Get the specified port link speed now.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\"Link speed: \", \"\\d+\", port_id)\n+\n+    def get_port_link_duplex(self, port_id):\n+        \"\"\"\n+        Get the specified port link mode, duplex or simplex.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\"Link duplex: \", \"\\S+\", port_id)\n+\n+    def get_port_promiscuous_mode(self, port_id):\n+        \"\"\"\n+        Get the promiscuous mode of port.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\"Promiscuous mode: \", \"\\S+\", port_id)\n+\n+    def get_port_allmulticast_mode(self, port_id):\n+        \"\"\"\n+        Get the allmulticast mode of port.\n+        \"\"\"\n+        return self.get_detail_from_port_info(\"Allmulticast mode: \", \"\\S+\", port_id)\n+\n+    def get_port_vlan_offload(self, port_id):\n+        \"\"\"\n+        Function: get the port vlan setting info.\n+        return value:\n+            'strip':'on'\n+            'filter':'on'\n+            'qinq':'off'\n+        \"\"\"\n+        vlan_info = {}\n+        vlan_info[\"strip\"] = self.get_detail_from_port_info(\"strip \", \"\\S+\", port_id)\n+        vlan_info[\"filter\"] = self.get_detail_from_port_info(\"filter\", \"\\S+\", port_id)\n+        vlan_info[\"qinq\"] = self.get_detail_from_port_info(\n+            \"qinq\\(extend\\) \", \"\\S+\", port_id\n+        )\n+        return vlan_info\n+\n+    def get_info_from_bond_config(self, key_str, regx_str, bond_port):\n+        \"\"\"\n+        Get info by executing the command \"show bonding config\".\n+        \"\"\"\n+        out = self.dut.send_expect(\"show bonding config %d\" % bond_port, \"testpmd> \")\n+        find_value = self.get_value_from_str(key_str, regx_str, out)\n+        return find_value\n+\n+    def get_bond_mode(self, bond_port):\n+        \"\"\"\n+        Get the  mode of the bonding device  which you choose.\n+        \"\"\"\n+        return self.get_info_from_bond_config(\"Bonding mode: \", \"\\d*\", bond_port)\n+\n+    def get_bond_balance_policy(self, bond_port):\n+        \"\"\"\n+        Get the balance transmit policy of bonding device.\n+        \"\"\"\n+        return self.get_info_from_bond_config(\"Balance Xmit Policy: \", \"\\S+\", bond_port)\n+\n+    def get_bond_slaves(self, bond_port):\n+        \"\"\"\n+        Get all the slaves of the bonding device which you choose.\n+        \"\"\"\n+        try:\n+            return self.get_info_from_bond_config(\n+                \"Slaves \\(\\d\\): \\[\", \"\\d*( \\d*)*\", bond_port\n+            )\n+        except Exception as e:\n+            return self.get_info_from_bond_config(\"Slaves: \\[\", \"\\d*( \\d*)*\", bond_port)\n+\n+    def get_bond_active_slaves(self, bond_port):\n+        \"\"\"\n+        Get the active slaves of the bonding device which you choose.\n+        \"\"\"\n+        try:\n+            return self.get_info_from_bond_config(\n+                \"Active Slaves \\(\\d\\): \\[\", \"\\d*( \\d*)*\", bond_port\n+            )\n+        except Exception as e:\n+            return self.get_info_from_bond_config(\n+                \"Acitve Slaves: \\[\", \"\\d*( \\d*)*\", bond_port\n+            )\n+\n+    def get_bond_primary(self, bond_port):\n+        \"\"\"\n+        Get the primary slave of the bonding device which you choose.\n+        \"\"\"\n+        return self.get_info_from_bond_config(\"Primary: \\[\", \"\\d*\", bond_port)\n+\n+    def create_bonded_device(self, mode=0, socket=0, verify_detail=False):\n+        \"\"\"\n+        Create a bonding device with the parameters you specified.\n+        \"\"\"\n+        out = self.dut.send_expect(\n+            \"create bonded device %d %d\" % (mode, socket), \"testpmd> \"\n+        )\n+        self.verify(\n+            \"Created new bonded device\" in out,\n+            \"Create bonded device on mode [%d] socket [%d] failed\" % (mode, socket),\n+        )\n+        bond_port = self.get_value_from_str(\n+            \"Created new bonded device net_bonding_testpmd_[\\d] on \\(port \", \"\\d+\", out\n+        )\n+        bond_port = int(bond_port)\n+\n+        if verify_detail:\n+            out = self.dut.send_expect(\n+                \"show bonding config %d\" % bond_port, \"testpmd> \"\n+            )\n+            self.verify(\n+                \"Bonding mode: %d\" % mode in out,\n+                \"Bonding mode display error when create bonded device\",\n+            )\n+            self.verify(\n+                \"Slaves: []\" in out, \"Slaves display error when create bonded device\"\n+            )\n+            self.verify(\n+                \"Active Slaves: []\" in out,\n+                \"Active Slaves display error when create bonded device\",\n+            )\n+            self.verify(\n+                \"Primary: []\" not in out,\n+                \"Primary display error when create bonded device\",\n+            )\n+\n+            out = self.dut.send_expect(\"show port info %d\" % bond_port, \"testpmd> \")\n+            self.verify(\n+                \"Connect to socket: %d\" % socket in out,\n+                \"Bonding port connect socket error\",\n+            )\n+            self.verify(\n+                \"Link status: down\" in out, \"Bonding port default link status error\"\n+            )\n+            self.verify(\n+                \"Link speed: None\" in out, \"Bonding port default link speed error\"\n+            )\n+\n+        return bond_port\n+\n+    def start_port(self, port):\n+        \"\"\"\n+        Start a port which the testpmd can see.\n+        \"\"\"\n+        self.pmdout.execute_cmd(\"port start %s\" % str(port))\n+\n+    def add_slave_to_bonding_device(self, bond_port, invert_verify=False, *slave_port):\n+        \"\"\"\n+        Add the ports into the bonding device as slaves.\n+        \"\"\"\n+        if len(slave_port) <= 0:\n+            utils.RED(\"No port exist when add slave to bonded device\")\n+        for slave_id in slave_port:\n+            self.pmdout.execute_cmd(\"add bonding slave %d %d\" % (slave_id, bond_port))\n+            slaves = self.get_info_from_bond_config(\n+                \"Slaves \\(\\d\\): \\[\", \"\\d*( \\d*)*\", bond_port\n+            )\n+            if not invert_verify:\n+                self.verify(str(slave_id) in slaves, \"Add port as bonding slave failed\")\n+            else:\n+                self.verify(\n+                    str(slave_id) not in slaves,\n+                    \"Add port as bonding slave successfully,should fail\",\n+                )\n+\n+    def remove_slave_from_bonding_device(\n+        self, bond_port, invert_verify=False, *slave_port\n+    ):\n+        \"\"\"\n+        Remove the specified slave port from the bonding device.\n+        \"\"\"\n+        if len(slave_port) <= 0:\n+            utils.RED(\"No port exist when remove slave from bonded device\")\n+        for slave_id in slave_port:\n+            self.dut.send_expect(\n+                \"remove bonding slave %d %d\" % (int(slave_id), bond_port), \"testpmd> \"\n+            )\n+            out = self.get_info_from_bond_config(\"Slaves: \\[\", \"\\d*( \\d*)*\", bond_port)\n+            if not invert_verify:\n+                self.verify(\n+                    str(slave_id) not in out, \"Remove slave to fail from bonding device\"\n+                )\n+            else:\n+                self.verify(\n+                    str(slave_id) in out,\n+                    \"Remove slave successfully from bonding device,should be failed\",\n+                )\n+\n+    def remove_all_slaves(self, bond_port):\n+        \"\"\"\n+        Remove all slaves of specified bound device.\n+        \"\"\"\n+        all_slaves = self.get_bond_slaves(bond_port)\n+        all_slaves = all_slaves.split()\n+        if len(all_slaves) == 0:\n+            pass\n+        else:\n+            self.remove_slave_from_bonding_device(bond_port, False, *all_slaves)\n+\n+    def set_primary_for_bonding_device(\n+        self, bond_port, slave_port, invert_verify=False\n+    ):\n+        \"\"\"\n+        Set the primary slave for the bonding device.\n+        \"\"\"\n+        self.dut.send_expect(\n+            \"set bonding primary %d %d\" % (slave_port, bond_port), \"testpmd> \"\n+        )\n+        out = self.get_info_from_bond_config(\"Primary: \\[\", \"\\d*\", bond_port)\n+        if not invert_verify:\n+            self.verify(str(slave_port) in out, \"Set bonding primary port failed\")\n+        else:\n+            self.verify(\n+                str(slave_port) not in out,\n+                \"Set bonding primary port successfully,should not success\",\n+            )\n+\n+    def set_mode_for_bonding_device(self, bond_port, mode):\n+        \"\"\"\n+        Set the mode for the bonding device.\n+        \"\"\"\n+        self.dut.send_expect(\"set bonding mode %d %d\" % (mode, bond_port), \"testpmd> \")\n+        mode_value = self.get_bond_mode(bond_port)\n+        self.verify(str(mode) in mode_value, \"Set bonding mode failed\")\n+\n+    def set_mac_for_bonding_device(self, bond_port, mac):\n+        \"\"\"\n+        Set the MAC for the bonding device.\n+        \"\"\"\n+        self.dut.send_expect(\n+            \"set bonding mac_addr %s %s\" % (bond_port, mac), \"testpmd> \"\n+        )\n+        new_mac = self.get_port_mac(bond_port)\n+        self.verify(new_mac == mac, \"Set bonding mac failed\")\n+\n+    def set_balance_policy_for_bonding_device(self, bond_port, policy):\n+        \"\"\"\n+        Set the balance transmit policy for the bonding device.\n+        \"\"\"\n+        self.dut.send_expect(\n+            \"set bonding balance_xmit_policy %d %s\" % (bond_port, policy), \"testpmd> \"\n+        )\n+        new_policy = self.get_bond_balance_policy(bond_port)\n+        policy = \"BALANCE_XMIT_POLICY_LAYER\" + policy.lstrip(\"l\")\n+        self.verify(new_policy == policy, \"Set bonding balance policy failed\")\n+\n+    def send_default_packet_to_slave(\n+        self, unbound_port, bond_port, pkt_count=100, **slaves\n+    ):\n+        \"\"\"\n+        Send packets to the slaves and calculate the slave`s RX packets\n+        and unbond port TX packets.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active'=[]\n+        ******* 'inactive'=[]\n+        \"\"\"\n+        summary = 0\n+\n+        # send to slave ports\n+        pkt_orig = self.get_all_stats(unbound_port, \"tx\", bond_port, **slaves)\n+        for slave in slaves[\"active\"]:\n+            temp_count = self.send_packet(\n+                self.vf_ports[slave], False, FRAME_SIZE_64, pkt_count\n+            )\n+            summary += temp_count\n+        for slave in slaves[\"inactive\"]:\n+            self.send_packet(\n+                self.vf_ports[slave], False, FRAME_SIZE_64, pkt_count, True\n+            )\n+        time.sleep(1)\n+        pkt_now = self.get_all_stats(unbound_port, \"tx\", bond_port, **slaves)\n+\n+        for key in pkt_now:\n+            for num in [0, 1, 2]:\n+                pkt_now[key][num] -= pkt_orig[key][num]\n+\n+        return pkt_now, summary\n+\n+    def send_customized_packet_to_slave(\n+        self, unbound_port, bond_port, *pkt_info, **slaves\n+    ):\n+        \"\"\"\n+        Send packets to the slaves and calculate the slave`s RX packets\n+        and unbond port TX packets.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** pkt_info: the first is necessary which will describe the packet,\n+                      the second is optional which will describe the params of\n+                      the function send_packet\n+        *** slaves:\n+        ******* 'active'=[]\n+        ******* 'inactive'=[]\n+        \"\"\"\n+        pkt_orig = {}\n+        pkt_now = {}\n+        temp_count = 0\n+        summary = 0\n+\n+        pkt_info_len = len(pkt_info)\n+        if pkt_info_len < 1:\n+            self.verify(False, \"At least one members for pkt_info!\")\n+\n+        ether_ip = pkt_info[0]\n+        if pkt_info_len > 1:\n+            pkt_size = pkt_info[1].get(\"frame_size\", FRAME_SIZE_64)\n+            pkt_count = pkt_info[1].get(\"pkt_count\", 1)\n+            invert_verify = pkt_info[1].get(\"verify\", False)\n+        else:\n+            pkt_size = FRAME_SIZE_64\n+            pkt_count = 1\n+            invert_verify = False\n+\n+        # send to slave ports\n+        pkt_orig = self.get_all_stats(unbound_port, \"tx\", bond_port, **slaves)\n+        for slave in slaves[\"active\"]:\n+            temp_count = self.send_packet(\n+                self.vf_ports[slave],\n+                False,\n+                pkt_size,\n+                pkt_count,\n+                invert_verify,\n+                **ether_ip,\n+            )\n+            summary += temp_count\n+        for slave in slaves[\"inactive\"]:\n+            self.send_packet(\n+                self.vf_ports[slave], False, FRAME_SIZE_64, pkt_count, True\n+            )\n+        pkt_now = self.get_all_stats(unbound_port, \"tx\", bond_port, **slaves)\n+\n+        for key in pkt_now:\n+            for num in [0, 1, 2]:\n+                pkt_now[key][num] -= pkt_orig[key][num]\n+\n+        return pkt_now, summary\n+\n+    def send_default_packet_to_unbound_port(\n+        self, unbound_port, bond_port, pkt_count, **slaves\n+    ):\n+        \"\"\"\n+        Send packets to the unbound port and calculate unbound port RX packets\n+        and the slave`s TX packets.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active':[]\n+        ******* 'inactive':[]\n+        \"\"\"\n+        pkt_orig = {}\n+        pkt_now = {}\n+        summary = 0\n+\n+        # send to unbonded device\n+        pkt_orig = self.get_all_stats(unbound_port, \"rx\", bond_port, **slaves)\n+        summary = self.send_packet(unbound_port, False, FRAME_SIZE_64, pkt_count)\n+        pkt_now = self.get_all_stats(unbound_port, \"rx\", bond_port, **slaves)\n+\n+        for key in pkt_now:\n+            for num in [0, 1, 2]:\n+                pkt_now[key][num] -= pkt_orig[key][num]\n+\n+        return pkt_now, summary\n+\n+    def send_customized_packet_to_unbound_port(\n+        self, unbound_port, bond_port, policy, vlan_tag=False, pkt_count=100, **slaves\n+    ):\n+        \"\"\"\n+        Verify that transmitting the packets correctly in the XOR mode.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** policy:'L2' , 'L23' or 'L34'\n+        *** vlan_tag:False or True\n+        *** slaves:\n+        ******* 'active'=[]\n+        ******* 'inactive'=[]\n+        \"\"\"\n+        pkt_orig = {}\n+        pkt_now = {}\n+        summary = 0\n+        temp_count = 0\n+\n+        # send to unbound_port\n+        pkt_orig = self.get_all_stats(unbound_port, \"rx\", bond_port, **slaves)\n+        query_type = \"mac\"\n+        dest_mac = self.bond_inst.get_port_mac(self.vf_ports[unbound_port], query_type)\n+        dest_ip = \"10.239.129.88\"\n+        dest_port = 53\n+\n+        global D_MAC_IP_PORT\n+        D_MAC_IP_PORT = [dest_mac, dest_ip, dest_port]\n+\n+        ether_ip = {}\n+        ether = {}\n+        ip = {}\n+        udp = {}\n+\n+        ether[\"dest_mac\"] = False\n+        ip[\"dest_ip\"] = dest_ip\n+        udp[\"dest_port\"] = 53\n+        if vlan_tag:\n+            dot1q = {}\n+            dot1q[\"vlan\"] = random.randint(1, 50)\n+            ether_ip[\"dot1q\"] = dot1q\n+\n+        ether_ip[\"ether\"] = ether\n+        ether_ip[\"ip\"] = ip\n+        ether_ip[\"udp\"] = udp\n+\n+        global S_MAC_IP_PORT\n+        source = S_MAC_IP_PORT\n+\n+        for src_mac, src_ip, src_port in source:\n+            ether_ip[\"ether\"][\"src_mac\"] = src_mac\n+            ether_ip[\"ip\"][\"src_ip\"] = src_ip\n+            ether_ip[\"udp\"][\"src_port\"] = src_port\n+            temp_count = self.send_packet(\n+                unbound_port, False, FRAME_SIZE_64, pkt_count, False, **ether_ip\n+            )\n+            summary += temp_count\n+        pkt_now = self.get_all_stats(unbound_port, \"rx\", bond_port, **slaves)\n+\n+        for key in pkt_now:\n+            for num in [0, 1, 2]:\n+                pkt_now[key][num] -= pkt_orig[key][num]\n+\n+        return pkt_now, summary\n+\n+    #\n+    # Test cases.\n+    #\n+    def set_up_all(self):\n+        \"\"\"\n+        Run before each test suite\n+        \"\"\"\n+        self.verify(\"bsdapp\" not in self.target, \"Bonding not support freebsd\")\n+        self.frame_sizes = [64, 65, 128, 256, 512, 1024, 1280, 1518]\n+\n+        self.eth_head_size = 18\n+        self.ip_head_size = 20\n+        self.udp_header_size = 8\n+\n+        self.dut_ports = self.dut.get_ports()\n+        self.dport_info0 = self.dut.ports_info[self.dut_ports[0]]\n+        self.dport_ifaces0 = self.dport_info0[\"intf\"]\n+        self.dport_info1 = self.dut.ports_info[self.dut_ports[1]]\n+        self.dport_ifaces1 = self.dport_info1[\"intf\"]\n+        tester_port0 = self.tester.get_local_port(self.dut_ports[0])\n+        self.tport_iface0 = self.tester.get_interface(tester_port0)\n+        tester_port1 = self.tester.get_local_port(self.dut_ports[1])\n+        self.tport_iface1 = self.tester.get_interface(tester_port1)\n+        self.flag = \"link-down-on-close\"\n+        self.default_stats = self.tester.get_priv_flags_state(\n+            self.tport_iface0, self.flag\n+        )\n+        for port in self.dut_ports:\n+            tester_port = self.tester.get_local_port(port)\n+            tport_iface = self.tester.get_interface(tester_port)\n+            self.tester.send_expect(\n+                \"ethtool --set-priv-flags %s %s on\" % (tport_iface, self.flag), \"# \"\n+            )\n+        self.create_vfs(pfs_id=self.dut_ports, vf_num=1)\n+        self.vf_ports = list(range(len(self.vfs_pci)))\n+        self.pmdout = PmdOutput(self.dut)\n+\n+        self.tester_bond = \"bond0\"\n+        # initialize bonding common methods name\n+        config = {\n+            \"parent\": self,\n+            \"pkt_name\": \"udp\",\n+            \"pkt_size\": FRAME_SIZE_64,\n+            \"src_mac\": \"52:00:00:00:00:03\",\n+            \"src_ip\": \"10.239.129.65\",\n+            \"src_port\": 61,\n+            \"dst_ip\": \"10.239.129.88\",\n+            \"dst_port\": 53,\n+        }\n+        self.bond_inst = bonding.PmdBonding(**config)\n+\n+    def set_up(self):\n+        \"\"\"\n+        Run before each test case.\n+        \"\"\"\n+        if self.running_case in [\"test_bound_promisc_opt\", \"test_tlb_basic\"]:\n+            self.dut.send_expect(\n+                \"ip link set %s vf 0 trust on\" % (self.dport_ifaces0), \"# \"\n+            )\n+        self.pmdout.start_testpmd(\n+            cores=\"1S/4C/1T\",\n+            ports=self.vfs_pci,\n+        )\n+\n+    def create_vfs(self, pfs_id, vf_num):\n+        self.sriov_vfs_port = []\n+        self.vfs_pci = []\n+        self.dut.bind_interfaces_linux(self.kdriver)\n+        pfs_id = pfs_id if isinstance(pfs_id, list) else [pfs_id]\n+        for pf_id in pfs_id:\n+            self.dut.generate_sriov_vfs_by_port(pf_id, vf_num)\n+            self.sriov_vfs_port += self.dut.ports_info[self.dut_ports[pf_id]][\n+                \"vfs_port\"\n+            ]\n+            dport_iface = self.dut.ports_info[self.dut_ports[pf_id]][\"intf\"]\n+            self.dut.send_expect(\n+                \"ip link set %s vf 0 spoofchk off\" % (dport_iface), \"# \"\n+            )\n+        for vf in self.sriov_vfs_port:\n+            self.vfs_pci.append(vf.pci)\n+        try:\n+            for port in self.sriov_vfs_port:\n+                port.bind_driver(self.drivername)\n+\n+        except Exception as e:\n+            self.destroy_iavf()\n+            raise Exception(e)\n+\n+    def destroy_iavf(self):\n+        self.dut.destroy_sriov_vfs_by_port(self.dut_ports[0])\n+\n+    def verify_bound_basic_opt(self, mode_set):\n+        \"\"\"\n+        Do some basic operations to bonded devices and slaves,\n+        such as adding, removing, setting primary or setting mode.\n+        \"\"\"\n+        bond_port_0 = self.create_bonded_device(mode_set, SOCKET_0, True)\n+        self.add_slave_to_bonding_device(bond_port_0, False, self.vf_ports[1])\n+\n+        mode_value = self.get_bond_mode(bond_port_0)\n+        self.verify(\"%d\" % mode_set in mode_value, \"Setting bonding mode error\")\n+\n+        bond_port_1 = self.create_bonded_device(mode_set, SOCKET_0)\n+        self.add_slave_to_bonding_device(bond_port_0, False, self.vf_ports[0])\n+        self.add_slave_to_bonding_device(bond_port_1, True, self.vf_ports[0])\n+\n+        OTHER_MODE = mode_set + 1 if not mode_set else mode_set - 1\n+        self.set_mode_for_bonding_device(bond_port_0, OTHER_MODE)\n+        self.set_mode_for_bonding_device(bond_port_0, mode_set)\n+\n+        self.add_slave_to_bonding_device(bond_port_0, False, self.vf_ports[2])\n+        time.sleep(3)\n+        self.set_primary_for_bonding_device(bond_port_0, self.vf_ports[2])\n+\n+        self.remove_slave_from_bonding_device(bond_port_0, False, self.vf_ports[2])\n+        primary_now = self.get_bond_primary(bond_port_0)\n+        self.verify(\n+            int(primary_now) == self.vf_ports[1],\n+            \"Reset primary slave failed after removing primary slave\",\n+        )\n+\n+        for bond_port in [bond_port_0, bond_port_1]:\n+            self.remove_all_slaves(bond_port)\n+\n+        self.dut.send_expect(\"quit\", \"# \")\n+        self.pmdout.start_testpmd(\n+            cores=\"1S/4C/1T\",\n+            ports=self.vfs_pci,\n+        )\n+\n+    def verify_bound_mac_opt(self, mode_set):\n+        \"\"\"\n+        Create bonded device, add one slave,\n+        verify bonded device MAC action varies with the mode.\n+        \"\"\"\n+        mac_address_0_orig = self.get_port_mac(self.vf_ports[0])\n+        mac_address_1_orig = self.get_port_mac(self.vf_ports[1])\n+        mac_address_2_orig = self.get_port_mac(self.vf_ports[2])\n+        mac_address_3_orig = self.get_port_mac(self.vf_ports[3])\n+\n+        bond_port = self.create_bonded_device(mode_set, SOCKET_1)\n+        self.add_slave_to_bonding_device(bond_port, False, self.vf_ports[1])\n+\n+        mac_address_bond_orig = self.get_port_mac(bond_port)\n+        self.verify(\n+            mac_address_1_orig == mac_address_bond_orig,\n+            \"Bonded device MAC address not same with first slave MAC\",\n+        )\n+\n+        self.add_slave_to_bonding_device(bond_port, False, self.vf_ports[2])\n+        mac_address_2_now = self.get_port_mac(self.vf_ports[2])\n+        mac_address_bond_now = self.get_port_mac(bond_port)\n+        if mode_set in [MODE_ROUND_ROBIN, MODE_XOR_BALANCE, MODE_BROADCAST]:\n+            self.verify(\n+                mac_address_1_orig == mac_address_bond_now\n+                and mac_address_bond_now == mac_address_2_now,\n+                \"NOT all slaves MAC address same with bonding device in mode %d\"\n+                % mode_set,\n+            )\n+        else:\n+            self.verify(\n+                mac_address_1_orig == mac_address_bond_now\n+                and mac_address_bond_now != mac_address_2_now,\n+                \"All slaves should not be the same in mode %d\" % mode_set,\n+            )\n+\n+        new_mac = \"00:11:22:00:33:44\"\n+        self.set_mac_for_bonding_device(bond_port, new_mac)\n+        self.start_port(bond_port)\n+        mac_address_1_now = self.get_port_mac(self.vf_ports[1])\n+        mac_address_2_now = self.get_port_mac(self.vf_ports[2])\n+        mac_address_bond_now = self.get_port_mac(bond_port)\n+        if mode_set in [MODE_ROUND_ROBIN, MODE_XOR_BALANCE, MODE_BROADCAST]:\n+            self.verify(\n+                mac_address_1_now\n+                == mac_address_2_now\n+                == mac_address_bond_now\n+                == new_mac,\n+                \"Set mac failed for bonding device in mode %d\" % mode_set,\n+            )\n+        elif mode_set == MODE_LACP:\n+            self.verify(\n+                mac_address_bond_now == new_mac\n+                and mac_address_1_now != new_mac\n+                and mac_address_2_now != new_mac\n+                and mac_address_1_now != mac_address_2_now,\n+                \"Set mac failed for bonding device in mode %d\" % mode_set,\n+            )\n+        elif mode_set in [MODE_ACTIVE_BACKUP, MODE_TLB_BALANCE]:\n+            self.verify(\n+                mac_address_bond_now == new_mac\n+                and mac_address_1_now == new_mac\n+                and mac_address_bond_now != mac_address_2_now,\n+                \"Set mac failed for bonding device in mode %d\" % mode_set,\n+            )\n+\n+        self.set_primary_for_bonding_device(bond_port, self.vf_ports[2], False)\n+        mac_address_1_now = self.get_port_mac(self.vf_ports[1])\n+        mac_address_2_now = self.get_port_mac(self.vf_ports[2])\n+        mac_address_bond_now = self.get_port_mac(bond_port)\n+        self.verify(\n+            mac_address_bond_now == new_mac, \"Slave MAC changed when set primary slave\"\n+        )\n+\n+        mac_address_1_orig = mac_address_1_now\n+        self.remove_slave_from_bonding_device(bond_port, False, self.vf_ports[2])\n+        mac_address_2_now = self.get_port_mac(self.vf_ports[2])\n+        self.verify(\n+            mac_address_2_now == mac_address_2_orig,\n+            \"MAC not back to original after removing the port\",\n+        )\n+\n+        mac_address_1_now = self.get_port_mac(self.vf_ports[1])\n+        mac_address_bond_now = self.get_port_mac(bond_port)\n+        self.verify(\n+            mac_address_bond_now == new_mac and mac_address_1_now == mac_address_1_orig,\n+            \"Bonding device or slave MAC changed after removing the primary slave\",\n+        )\n+\n+        self.remove_all_slaves(bond_port)\n+        self.dut.send_expect(\"quit\", \"# \")\n+        self.pmdout.start_testpmd(\n+            cores=\"1S/4C/1T\",\n+            ports=self.vfs_pci,\n+        )\n+\n+    def verify_bound_promisc_opt(self, mode_set):\n+        \"\"\"\n+        Set promiscuous mode on bonded device, verify bonded device and all slaves\n+        have different actions by the different modes.\n+        \"\"\"\n+        unbound_port = self.vf_ports[3]\n+        bond_port = self.create_bonded_device(mode_set, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (unbound_port, bond_port), \"testpmd> \"\n+        )\n+        self.start_port(bond_port)\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        port_disabled_num = 0\n+        testpmd_all_ports = self.vf_ports\n+        testpmd_all_ports.append(bond_port)\n+        for port_id in testpmd_all_ports:\n+            value = self.get_detail_from_port_info(\n+                \"Promiscuous mode: \", \"enabled\", port_id\n+            )\n+            if not value:\n+                port_disabled_num += 1\n+        self.verify(\n+            port_disabled_num == 0,\n+            \"Not all slaves of bonded device turn promiscuous mode on by default.\",\n+        )\n+\n+        ether_ip = {}\n+        ether = {}\n+        ether[\"dest_mac\"] = \"00:11:22:33:44:55\"\n+        ether_ip[\"ether\"] = ether\n+\n+        send_param = {}\n+        pkt_count = 1\n+        send_param[\"pkt_count\"] = pkt_count\n+        pkt_info = [ether_ip, send_param]\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0]]\n+        slaves[\"inactive\"] = []\n+        curr_primary = self.vf_ports[0]\n+\n+        pkt_now, summary = self.send_customized_packet_to_slave(\n+            unbound_port, bond_port, *pkt_info, **slaves\n+        )\n+        if mode_set == MODE_LACP:\n+            do_transmit = False\n+            pkt_size = 0\n+            if pkt_now[unbound_port][0]:\n+                do_transmit = True\n+                pkt_size = pkt_now[unbound_port][2] / pkt_now[unbound_port][0]\n+            self.verify(\n+                do_transmit and pkt_size != LACP_MESSAGE_SIZE,\n+                \"Data not received by slave or bonding device when promiscuous enabled\",\n+            )\n+        else:\n+            self.verify(\n+                pkt_now[self.vf_ports[0]][0] == pkt_now[bond_port][0]\n+                and pkt_now[bond_port][0] == pkt_count,\n+                \"Data not received by slave or bonding device when promiscuous enabled\",\n+            )\n+\n+        self.dut.send_expect(\"set promisc %s off\" % bond_port, \"testpmd> \")\n+        port_disabled_num = 0\n+        testpmd_all_ports = [\n+            self.vf_ports[0],\n+            self.vf_ports[1],\n+            self.vf_ports[2],\n+            bond_port,\n+        ]\n+        for port_id in testpmd_all_ports:\n+            value = self.get_detail_from_port_info(\n+                \"Promiscuous mode: \", \"disabled\", port_id\n+            )\n+            if value == \"disabled\":\n+                port_disabled_num += 1\n+        if mode_set in [MODE_ROUND_ROBIN, MODE_XOR_BALANCE, MODE_BROADCAST]:\n+            self.verify(\n+                port_disabled_num == 4,\n+                \"Not all slaves of bonded device turn promiscuous mode off in mode %d.\"\n+                % mode_set,\n+            )\n+        elif mode_set == MODE_LACP:\n+            self.verify(\n+                port_disabled_num == 1,\n+                \"Not only turn bound device promiscuous mode off in mode %d\" % mode_set,\n+            )\n+        else:\n+            self.verify(\n+                port_disabled_num == 2,\n+                \"Not only the primary slave turn promiscous mode off in mode %d, \"\n+                % mode_set\n+                + \" when bonded device  promiscous disabled.\",\n+            )\n+            curr_primary = int(self.get_bond_primary(bond_port))\n+            slaves[\"active\"] = [curr_primary]\n+\n+        if mode_set != MODE_LACP:\n+            send_param[\"verify\"] = True\n+        pkt_now, summary = self.send_customized_packet_to_slave(\n+            unbound_port, bond_port, *pkt_info, **slaves\n+        )\n+        if mode_set == MODE_LACP:\n+            do_transmit = False\n+            pkt_size = 0\n+            if pkt_now[unbound_port][0]:\n+                do_transmit = True\n+                pkt_size = pkt_now[unbound_port][2] / pkt_now[unbound_port][0]\n+            self.verify(\n+                not do_transmit or pkt_size == LACP_MESSAGE_SIZE,\n+                \"Data received by slave or bonding device when promiscuous disabled\",\n+            )\n+        else:\n+            self.verify(\n+                pkt_now[curr_primary][0] == 0 and pkt_now[bond_port][0] == 0,\n+                \"Data received by slave or bonding device when promiscuous disabled\",\n+            )\n+\n+        pkt_now, summary = self.send_default_packet_to_slave(\n+            self.vf_ports[3], bond_port, pkt_count, **slaves\n+        )\n+        if mode_set == MODE_LACP:\n+            do_transmit = False\n+            pkt_size = 0\n+            if pkt_now[unbound_port][0]:\n+                do_transmit = True\n+                pkt_size = pkt_now[unbound_port][2] / pkt_now[unbound_port][0]\n+            self.verify(\n+                not do_transmit or pkt_size != LACP_MESSAGE_SIZE,\n+                \"RX or TX packet number not correct when promiscuous disabled\",\n+            )\n+        else:\n+            self.verify(\n+                pkt_now[curr_primary][0] == pkt_now[bond_port][0]\n+                and pkt_now[self.vf_ports[3]][0] == pkt_now[bond_port][0]\n+                and pkt_now[bond_port][0] == pkt_count,\n+                \"RX or TX packet number not correct when promiscuous disabled\",\n+            )\n+\n+        # Stop fwd threads first before removing slaves from bond to avoid\n+        # races and crashes\n+        self.dut.send_expect(\"stop\", \"testpmd> \")\n+        self.remove_all_slaves(bond_port)\n+        self.dut.send_expect(\"quit\", \"# \")\n+\n+    def test_bound_basic_opt(self):\n+        \"\"\"\n+        Test Case1: Basic bonding--Create bonded devices and slaves\n+        \"\"\"\n+        self.verify_bound_basic_opt(MODE_ACTIVE_BACKUP)\n+\n+    def test_bound_mac_opt(self):\n+        \"\"\"\n+        Test Case2: Basic bonding--MAC Address Test\n+        \"\"\"\n+        self.verify_bound_mac_opt(MODE_BROADCAST)\n+\n+    def test_bound_promisc_opt(self):\n+        \"\"\"\n+        Test Case3: Basic bonding--Device Promiscuous Mode Test\n+        \"\"\"\n+        self.verify_bound_promisc_opt(MODE_BROADCAST)\n+\n+    def admin_tester_port(self, local_port, status):\n+        \"\"\"\n+        Do some operations to the network interface port, such as \"up\" or \"down\".\n+        \"\"\"\n+        if self.tester.get_os_type() == \"freebsd\":\n+            self.tester.admin_ports(local_port, status)\n+        else:\n+            eth = self.tester.get_interface(local_port)\n+            self.tester.admin_ports_linux(eth, status)\n+        time.sleep(10)\n+\n+    def verify_round_robin_rx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify the receiving packet are all correct in the round robin mode.\n+            slaves:\n+                'active' = []\n+                'inactive' = []\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+        pkt_now, summary = self.send_default_packet_to_slave(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        self.verify(\n+            pkt_now[unbound_port][0] == pkt_count * slaves[\"active\"].__len__(),\n+            \"Unbonded port has error TX pkt count in mode 0\",\n+        )\n+        self.verify(\n+            pkt_now[bond_port][0] == pkt_count * slaves[\"active\"].__len__(),\n+            \"Bonding port has error RX pkt count in mode 0\",\n+        )\n+\n+    def verify_round_robin_tx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify the transmitting packet are all correct in the round robin mode.\n+            slaves:\n+                'active' = []\n+                'inactive' = []\n+        \"\"\"\n+        pkt_count = 300\n+        pkt_now = {}\n+        pkt_now, summary = self.send_default_packet_to_unbound_port(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        if slaves[\"active\"].__len__() == 0:\n+            self.verify(\n+                pkt_now[bond_port][0] == 0,\n+                \"Bonding port should not have TX pkt in mode 0 when all slaves down\",\n+            )\n+        else:\n+            self.verify(\n+                pkt_now[bond_port][0] == pkt_count,\n+                \"Bonding port has error TX pkt count in mode 0\",\n+            )\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count / slaves[\"active\"].__len__(),\n+                \"Active slave has error TX pkt count in mode 0\",\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(\n+                pkt_now[slave][0] == 0,\n+                \"Inactive slave has error TX pkt count in mode 0\",\n+            )\n+\n+    def test_round_robin_rx_tx(self):\n+        \"\"\"\n+        Test Case4: Mode 0(Round Robin) TX/RX test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ROUND_ROBIN, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+        self.verify_round_robin_rx(self.vf_ports[3], bond_port, **slaves)\n+        self.verify_round_robin_tx(self.vf_ports[3], bond_port, **slaves)\n+\n+    def test_round_robin_one_slave_down(self):\n+        \"\"\"\n+        Test Case5: Mode 0(Round Robin) Bring one slave link down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ROUND_ROBIN, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+\n+        stat = self.tester.get_port_status(\n+            self.tester.get_local_port(self.dut_ports[0])\n+        )\n+        self.dut.send_expect(\"show bonding config %d\" % bond_port, \"testpmd> \")\n+        self.dut.send_expect(\"show port info all\", \"testpmd> \")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = [self.vf_ports[1], self.vf_ports[2]]\n+            slaves[\"inactive\"] = [self.vf_ports[0]]\n+            self.verify_round_robin_rx(self.vf_ports[3], bond_port, **slaves)\n+            self.verify_round_robin_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+\n+    def test_round_robin_all_slaves_down(self):\n+        \"\"\"\n+        Test Case6: Mode 0(Round Robin) Bring all slave links down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ROUND_ROBIN, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = []\n+            slaves[\"inactive\"] = [\n+                self.vf_ports[0],\n+                self.vf_ports[1],\n+                self.vf_ports[2],\n+            ]\n+            self.verify_round_robin_rx(self.vf_ports[3], bond_port, **slaves)\n+            self.verify_round_robin_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"up\")\n+\n+    def get_all_stats(self, unbound_port, rx_tx, bond_port, **slaves):\n+        \"\"\"\n+        Get all the port stats which the testpmd can discover.\n+        Parameters:\n+        *** unbound_port: pmd port id\n+        *** rx_tx: unbond port stat 'rx' or 'tx'\n+        *** bond_port: bonding port\n+        *** slaves:\n+        ******** 'active' = []\n+        ******** 'inactive' = []\n+        \"\"\"\n+        pkt_now = {}\n+\n+        if rx_tx == \"rx\":\n+            bond_stat = \"tx\"\n+        else:\n+            bond_stat = \"rx\"\n+\n+        pkt_now[unbound_port] = [int(_) for _ in self.get_stats(unbound_port, rx_tx)]\n+        pkt_now[bond_port] = [int(_) for _ in self.get_stats(bond_port, bond_stat)]\n+        for slave in slaves[\"active\"]:\n+            pkt_now[slave] = [int(_) for _ in self.get_stats(slave, bond_stat)]\n+        for slave in slaves[\"inactive\"]:\n+            pkt_now[slave] = [int(_) for _ in self.get_stats(slave, bond_stat)]\n+\n+        return pkt_now\n+\n+    def verify_active_backup_rx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify the RX packets are all correct in the active-backup mode.\n+        Parameters:\n+        *** slaves:\n+        ******* 'active' = []\n+        ******* 'inactive' = []\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+\n+        slave_num = slaves[\"active\"].__len__()\n+        if slave_num != 0:\n+            active_flag = 1\n+        else:\n+            active_flag = 0\n+\n+        pkt_now, summary = self.send_default_packet_to_slave(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        self.verify(\n+            pkt_now[bond_port][0] == pkt_count * slave_num,\n+            \"Not correct RX pkt on bond port in mode 1\",\n+        )\n+        self.verify(\n+            pkt_now[unbound_port][0] == pkt_count * active_flag,\n+            \"Not correct TX pkt on unbound port in mode 1\",\n+        )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(\n+                pkt_now[slave][0] == 0, \"Not correct RX pkt on inactive port in mode 1\"\n+            )\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count,\n+                \"Not correct RX pkt on active port in mode 1\",\n+            )\n+\n+    def verify_active_backup_tx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify the TX packets are all correct in the active-backup mode.\n+        Parameters:\n+        *** slaves:\n+        ******* 'active' = []\n+        ******* 'inactive' = []\n+        \"\"\"\n+        pkt_count = 0\n+        pkt_now = {}\n+\n+        if slaves[\"active\"].__len__() != 0:\n+            primary_port = slaves[\"active\"][0]\n+            active_flag = 1\n+        else:\n+            active_flag = 0\n+\n+        pkt_now, summary = self.send_default_packet_to_unbound_port(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        self.verify(\n+            pkt_now[bond_port][0] == pkt_count * active_flag,\n+            \"Not correct RX pkt on bond port in mode 1\",\n+        )\n+        if active_flag == 1:\n+            self.verify(\n+                pkt_now[primary_port][0] == pkt_count,\n+                \"Not correct TX pkt on primary port in mode 1\",\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(\n+                pkt_now[slave][0] == 0, \"Not correct TX pkt on inactive port in mode 1\"\n+            )\n+        for slave in [slave for slave in slaves[\"active\"] if slave != primary_port]:\n+            self.verify(\n+                pkt_now[slave][0] == 0, \"Not correct TX pkt on backup port in mode 1\"\n+            )\n+\n+    def test_active_backup_rx_tx(self):\n+        \"\"\"\n+        Test Case7: Mode 1(Active Backup) TX/RX Test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ACTIVE_BACKUP, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        time.sleep(5)\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+        self.verify_active_backup_rx(self.vf_ports[3], bond_port, **slaves)\n+        self.verify_active_backup_tx(self.vf_ports[3], bond_port, **slaves)\n+\n+    def test_active_backup_change_primary(self):\n+        \"\"\"\n+        Test Case8: Mode 1(Active Backup) Change active slave, RX/TX test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ACTIVE_BACKUP, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.set_primary_for_bonding_device(bond_port, self.vf_ports[1])\n+        time.sleep(5)\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[1], self.vf_ports[0], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+        self.verify_active_backup_rx(self.vf_ports[3], bond_port, **slaves)\n+        self.verify_active_backup_tx(self.vf_ports[3], bond_port, **slaves)\n+\n+    def test_active_backup_one_slave_down(self):\n+        \"\"\"\n+        Test Case9: Mode 1(Active Backup) Link up/down active eth dev\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ACTIVE_BACKUP, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+        primary_port = int(self.get_bond_primary(bond_port))\n+\n+        try:\n+            slaves = {}\n+            active_slaves = [self.vf_ports[1], self.vf_ports[2]]\n+            active_slaves.remove(primary_port)\n+            slaves[\"active\"] = [primary_port]\n+            slaves[\"active\"].extend(active_slaves)\n+            slaves[\"inactive\"] = [self.vf_ports[0]]\n+            self.verify_active_backup_rx(self.vf_ports[3], bond_port, **slaves)\n+            self.verify_active_backup_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+\n+    def test_active_backup_all_slaves_down(self):\n+        \"\"\"\n+        Test Case10: Mode 1(Active Backup) Bring all slave links down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_ACTIVE_BACKUP, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = []\n+            slaves[\"inactive\"] = [\n+                self.vf_ports[0],\n+                self.vf_ports[1],\n+                self.vf_ports[2],\n+            ]\n+            self.verify_active_backup_rx(self.vf_ports[3], bond_port, **slaves)\n+            self.verify_active_backup_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"up\")\n+\n+    def translate_mac_str_into_int(self, mac_str):\n+        \"\"\"\n+        Translate the MAC type from the string into the int.\n+        \"\"\"\n+        mac_hex = \"0x\"\n+        for mac_part in mac_str.split(\":\"):\n+            mac_hex += mac_part\n+        return int(mac_hex, 16)\n+\n+    def mac_hash(self, dest_mac, src_mac):\n+        \"\"\"\n+        Generate the hash value with the source and destination MAC.\n+        \"\"\"\n+        dest_port_mac = self.translate_mac_str_into_int(dest_mac)\n+        src_port_mac = self.translate_mac_str_into_int(src_mac)\n+        src_xor_dest = dest_port_mac ^ src_port_mac\n+        xor_value_1 = src_xor_dest >> 32\n+        xor_value_2 = (src_xor_dest >> 16) ^ (xor_value_1 << 16)\n+        xor_value_3 = src_xor_dest ^ (xor_value_1 << 32) ^ (xor_value_2 << 16)\n+        return htons(xor_value_1 ^ xor_value_2 ^ xor_value_3)\n+\n+    def translate_ip_str_into_int(self, ip_str):\n+        \"\"\"\n+        Translate the IP type from the string into the int.\n+        \"\"\"\n+        ip_part_list = ip_str.split(\".\")\n+        ip_part_list.reverse()\n+        num = 0\n+        ip_int = 0\n+        for ip_part in ip_part_list:\n+            ip_part_int = int(ip_part) << (num * 8)\n+            ip_int += ip_part_int\n+            num += 1\n+        return ip_int\n+\n+    def ipv4_hash(self, dest_ip, src_ip):\n+        \"\"\"\n+        Generate the hash value with the source and destination IP.\n+        \"\"\"\n+        dest_ip_int = self.translate_ip_str_into_int(dest_ip)\n+        src_ip_int = self.translate_ip_str_into_int(src_ip)\n+        return htonl(dest_ip_int ^ src_ip_int)\n+\n+    def udp_hash(self, dest_port, src_port):\n+        \"\"\"\n+        Generate the hash value with the source and destination port.\n+        \"\"\"\n+        return htons(dest_port ^ src_port)\n+\n+    def policy_and_slave_hash(self, policy, **slaves):\n+        \"\"\"\n+        Generate the hash value by the policy and active slave number.\n+        *** policy:'L2' , 'L23' or 'L34'\n+        *** slaves:\n+        ******* 'active'=[]\n+        ******* 'inactive'=[]\n+        \"\"\"\n+        global S_MAC_IP_PORT\n+        source = S_MAC_IP_PORT\n+\n+        global D_MAC_IP_PORT\n+        dest_mac = D_MAC_IP_PORT[0]\n+        dest_ip = D_MAC_IP_PORT[1]\n+        dest_port = D_MAC_IP_PORT[2]\n+\n+        hash_values = []\n+        if len(slaves[\"active\"]) != 0:\n+            for src_mac, src_ip, src_port in source:\n+                if policy == \"L2\":\n+                    hash_value = self.mac_hash(dest_mac, src_mac)\n+                elif policy == \"L23\":\n+                    hash_value = self.mac_hash(dest_mac, src_mac) ^ self.ipv4_hash(\n+                        dest_ip, src_ip\n+                    )\n+                else:\n+                    hash_value = self.ipv4_hash(dest_ip, src_ip) ^ self.udp_hash(\n+                        dest_port, src_port\n+                    )\n+\n+                if policy in (\"L23\", \"L34\"):\n+                    hash_value ^= hash_value >> 16\n+                hash_value ^= hash_value >> 8\n+                hash_value = hash_value % len(slaves[\"active\"])\n+                hash_values.append(hash_value)\n+\n+        return hash_values\n+\n+    def slave_map_hash(self, port, order_ports):\n+        \"\"\"\n+        Find the hash value by the given slave port id.\n+        \"\"\"\n+        if len(order_ports) == 0:\n+            return None\n+        else:\n+            order_ports = order_ports.split()\n+            return order_ports.index(str(port))\n+\n+    def verify_xor_rx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify receiving the packets correctly in the XOR mode.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active'=[]\n+        ******* 'inactive'=[]\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+\n+        pkt_now, summary = self.send_default_packet_to_slave(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count, \"Slave have error RX packet in XOR\"\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(pkt_now[slave][0] == 0, \"Slave have error RX packet in XOR\")\n+        self.verify(\n+            pkt_now[unbound_port][0] == pkt_count * len(slaves[\"active\"]),\n+            \"Unbonded device have error TX packet in XOR\",\n+        )\n+\n+    def verify_xor_tx(self, unbound_port, bond_port, policy, vlan_tag=False, **slaves):\n+        \"\"\"\n+        Verify that transmitting the packets correctly in the XOR mode.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** policy:'L2' , 'L23' or 'L34'\n+        *** vlan_tag:False or True\n+        *** slaves:\n+        ******* 'active'=[]\n+        ******* 'inactive'=[]\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+\n+        pkt_now, summary = self.send_customized_packet_to_unbound_port(\n+            unbound_port,\n+            bond_port,\n+            policy,\n+            vlan_tag=False,\n+            pkt_count=pkt_count,\n+            **slaves,\n+        )\n+\n+        hash_values = []\n+        hash_values = self.policy_and_slave_hash(policy, **slaves)\n+\n+        order_ports = self.get_bond_active_slaves(bond_port)\n+        for slave in slaves[\"active\"]:\n+            slave_map_hash = self.slave_map_hash(slave, order_ports)\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count * hash_values.count(slave_map_hash),\n+                \"XOR load balance transmit error on the link up port\",\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(\n+                pkt_now[slave][0] == 0,\n+                \"XOR load balance transmit error on the link down port\",\n+            )\n+\n+    def test_xor_tx(self):\n+        \"\"\"\n+        Test Case11: Mode 2(Balance XOR) TX Load Balance test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_XOR_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+\n+        self.verify_xor_tx(self.vf_ports[3], bond_port, \"L2\", False, **slaves)\n+\n+    def test_xor_tx_one_slave_down(self):\n+        \"\"\"\n+        Test Case12: Mode 2(Balance XOR) TX Load Balance Link down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_XOR_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[2], self.vf_ports[1]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = [self.vf_ports[1], self.vf_ports[2]]\n+            slaves[\"inactive\"] = [self.vf_ports[0]]\n+\n+            self.verify_xor_tx(self.vf_ports[3], bond_port, \"L2\", False, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+\n+    def test_xor_tx_all_slaves_down(self):\n+        \"\"\"\n+        Test Case13: Mode 2(Balance XOR) Bring all slave links down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_XOR_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = []\n+            slaves[\"inactive\"] = [\n+                self.vf_ports[0],\n+                self.vf_ports[1],\n+                self.vf_ports[2],\n+            ]\n+\n+            self.verify_xor_tx(self.vf_ports[3], bond_port, \"L2\", False, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"up\")\n+\n+    def vlan_strip_and_filter(self, action=\"off\", *ports):\n+        \"\"\"\n+        Open or shutdown the vlan strip and filter option of specified port.\n+        \"\"\"\n+        for port_id in ports:\n+            self.dut.send_expect(\n+                \"vlan set strip %s %d\" % (action, port_id), \"testpmd> \"\n+            )\n+            self.dut.send_expect(\n+                \"vlan set filter %s %d\" % (action, port_id), \"testpmd> \"\n+            )\n+\n+    def test_xor_l34_forward(self):\n+        \"\"\"\n+        Test Case14: Mode 2(Balance XOR) Layer 3+4 forwarding\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_XOR_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.set_balance_policy_for_bonding_device(bond_port, \"l34\")\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+\n+        self.verify_xor_tx(self.vf_ports[3], bond_port, \"L34\", False, **slaves)\n+        self.vlan_strip_and_filter(\n+            \"off\",\n+            self.vf_ports[0],\n+            self.vf_ports[1],\n+            self.vf_ports[2],\n+            self.vf_ports[3],\n+            bond_port,\n+        )\n+        self.verify_xor_tx(self.vf_ports[3], bond_port, \"L34\", True, **slaves)\n+\n+    def test_xor_rx(self):\n+        \"\"\"\n+        Test Case15: Mode 2(Balance XOR) RX test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_XOR_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+\n+        self.verify_xor_rx(self.vf_ports[3], bond_port, **slaves)\n+\n+    def verify_broadcast_rx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify that receiving packets correctly in the broadcast mode.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active':[]\n+        ******* 'inactive':[]\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+\n+        pkt_now, summary = self.send_default_packet_to_slave(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count, \"Slave RX packet not correct in mode 3\"\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(pkt_now[slave][0] == 0, \"Slave RX packet not correct in mode 3\")\n+        self.verify(\n+            pkt_now[unbound_port][0] == pkt_count * len(slaves[\"active\"]),\n+            \"Unbonded port TX packet not correct in mode 3\",\n+        )\n+        self.verify(\n+            pkt_now[bond_port][0] == pkt_count * len(slaves[\"active\"]),\n+            \"Bonded device RX packet not correct in mode 3\",\n+        )\n+\n+    def verify_broadcast_tx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify that transmitting packets correctly in the broadcast mode.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active':[]\n+        ******* 'inactive':[]\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+\n+        pkt_now, summary = self.send_default_packet_to_unbound_port(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count, \"Slave TX packet not correct in mode 3\"\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(pkt_now[slave][0] == 0, \"Slave TX packet not correct in mode 3\")\n+        self.verify(\n+            pkt_now[unbound_port][0] == pkt_count,\n+            \"Unbonded port RX packet not correct in mode 3\",\n+        )\n+        self.verify(\n+            pkt_now[bond_port][0] == pkt_count * len(slaves[\"active\"]),\n+            \"Bonded device TX packet not correct in mode 3\",\n+        )\n+\n+    def test_broadcast_rx_tx(self):\n+        \"\"\"\n+        Test Case16: Mode 3(Broadcast) TX/RX Test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_BROADCAST, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+\n+        self.verify_broadcast_rx(self.vf_ports[3], bond_port, **slaves)\n+        self.verify_broadcast_tx(self.vf_ports[3], bond_port, **slaves)\n+\n+    def test_broadcast_tx_one_slave_down(self):\n+        \"\"\"\n+        Test Case17: Mode 3(Broadcast) Bring one slave link down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_BROADCAST, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = [self.vf_ports[1], self.vf_ports[2]]\n+            slaves[\"inactive\"] = [self.vf_ports[0]]\n+\n+            self.verify_broadcast_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+\n+    def test_broadcast_tx_all_slaves_down(self):\n+        \"\"\"\n+        Test Case18: Mode 3(Broadcast) Bring all slave links down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_BROADCAST, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = []\n+            slaves[\"inactive\"] = [\n+                self.vf_ports[0],\n+                self.vf_ports[1],\n+                self.vf_ports[2],\n+            ]\n+\n+            self.verify_broadcast_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"up\")\n+\n+    def verify_tlb_rx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify that receiving packets correctly in the mode 4.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active':[]\n+        ******* 'inactive':[]\n+        \"\"\"\n+        pkt_count = 100\n+        pkt_now = {}\n+\n+        slave_num = slaves[\"active\"].__len__()\n+        if slave_num != 0:\n+            active_flag = 1\n+        else:\n+            active_flag = 0\n+\n+        pkt_now, summary = self.send_default_packet_to_slave(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        self.verify(\n+            pkt_now[unbound_port][0] == pkt_count * active_flag,\n+            \"Unbonded device has error TX packet in TLB\",\n+        )\n+        self.verify(\n+            pkt_now[bond_port][0] == pkt_count * slave_num,\n+            \"Bounded device has error RX packet in TLB\",\n+        )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(\n+                pkt_now[slave][0] == 0, \"Inactive slave has error RX packet in TLB\"\n+            )\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] == pkt_count,\n+                \"Active slave has error RX packet in TLB\",\n+            )\n+\n+    def verify_tlb_tx(self, unbound_port, bond_port, **slaves):\n+        \"\"\"\n+        Verify that transmitting packets correctly in the broadcast mode.\n+        Parameters:\n+        *** unbound_port: the unbonded port id\n+        *** bond_port: the bonded device port id\n+        *** slaves:\n+        ******* 'active':[]\n+        ******* 'inactive':[]\n+        \"\"\"\n+        pkt_count = \"MANY\"\n+\n+        # send to unbonded device\n+        pkt_now, summary = self.send_default_packet_to_unbound_port(\n+            unbound_port, bond_port, pkt_count=pkt_count, **slaves\n+        )\n+\n+        active_slaves = len(slaves[\"active\"])\n+        if active_slaves:\n+            mean = float(summary) / float(active_slaves)\n+            active_flag = 1\n+        else:\n+            active_flag = 0\n+\n+        for slave in slaves[\"active\"]:\n+            self.verify(\n+                pkt_now[slave][0] > mean * 0.9 and pkt_now[slave][0] < mean * 1.1,\n+                \"Slave TX packet not correct in mode 5\",\n+            )\n+        for slave in slaves[\"inactive\"]:\n+            self.verify(pkt_now[slave][0] == 0, \"Slave TX packet not correct in mode 5\")\n+        self.verify(\n+            pkt_now[unbound_port][0] == summary,\n+            \"Unbonded port RX packet not correct in TLB\",\n+        )\n+        self.verify(\n+            pkt_now[bond_port][0] == summary * active_flag,\n+            \"Bonded device TX packet not correct in TLB\",\n+        )\n+\n+    def test_tlb_basic(self):\n+        \"\"\"\n+        Test Case19: Mode 5(TLB) Base Test\n+        \"\"\"\n+        self.verify_bound_basic_opt(MODE_TLB_BALANCE)\n+        self.verify_bound_mac_opt(MODE_TLB_BALANCE)\n+        self.verify_bound_promisc_opt(MODE_TLB_BALANCE)\n+\n+    def test_tlb_rx_tx(self):\n+        \"\"\"\n+        Test Case20: Mode 5(TLB) TX/RX test\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_TLB_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+\n+        slaves = {}\n+        slaves[\"active\"] = [self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]]\n+        slaves[\"inactive\"] = []\n+\n+        self.verify_tlb_rx(self.vf_ports[3], bond_port, **slaves)\n+        self.verify_tlb_tx(self.vf_ports[3], bond_port, **slaves)\n+\n+    def test_tlb_one_slave_dwon(self):\n+        \"\"\"\n+        Test Case21: Mode 5(TLB) Bring one slave link down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_TLB_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = [self.vf_ports[1], self.vf_ports[2]]\n+            slaves[\"inactive\"] = [self.vf_ports[0]]\n+\n+            self.verify_tlb_rx(self.vf_ports[3], bond_port, **slaves)\n+            self.verify_tlb_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+\n+    def test_tlb_all_slaves_down(self):\n+        \"\"\"\n+        Test Case22: Mode 5(TLB) Bring all slave links down\n+        \"\"\"\n+        bond_port = self.create_bonded_device(MODE_TLB_BALANCE, SOCKET_0)\n+        self.add_slave_to_bonding_device(\n+            bond_port, False, self.vf_ports[0], self.vf_ports[1], self.vf_ports[2]\n+        )\n+        self.dut.send_expect(\n+            \"set portlist %d,%d\" % (self.vf_ports[3], bond_port), \"testpmd> \"\n+        )\n+        self.start_port(\"all\")\n+        self.dut.send_expect(\"start\", \"testpmd> \")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"down\")\n+        self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"down\")\n+\n+        try:\n+            slaves = {}\n+            slaves[\"active\"] = []\n+            slaves[\"inactive\"] = [\n+                self.vf_ports[0],\n+                self.vf_ports[1],\n+                self.vf_ports[2],\n+            ]\n+\n+            self.verify_tlb_rx(self.vf_ports[3], bond_port, **slaves)\n+            self.verify_tlb_tx(self.vf_ports[3], bond_port, **slaves)\n+        finally:\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[0]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[1]), \"up\")\n+            self.admin_tester_port(self.tester.get_local_port(self.dut_ports[2]), \"up\")\n+\n+    def tear_down(self):\n+        \"\"\"\n+        Run after each test case.\n+        \"\"\"\n+        self.pmdout.quit()\n+        if self.running_case in [\"test_bound_promisc_opt\", \"test_tlb_basic\"]:\n+            self.dut.send_expect(\n+                \"ip link set %s vf 0 trust off\" % (self.dport_ifaces0), \"# \"\n+            )\n+\n+    def tear_down_all(self):\n+        \"\"\"\n+        Run after each test suite.\n+        \"\"\"\n+        self.dut.kill_all()\n+        self.destroy_iavf()\n+        for port in self.dut_ports:\n+            tester_port = self.tester.get_local_port(port)\n+            tport_iface = self.tester.get_interface(tester_port)\n+            self.tester.send_expect(\n+                \"ethtool --set-priv-flags %s %s %s\"\n+                % (tport_iface, self.flag, self.default_stats),\n+                \"# \",\n+            )\n",
    "prefixes": [
        "V1",
        "1/7"
    ]
}