Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/121589/?format=api
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" ] }{ "id": 121589, "url": "