Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/97591/?format=api
http://patches.dpdk.org/api/patches/97591/?format=api", "web_url": "http://patches.dpdk.org/project/dts/patch/20210831082220.47375-2-yufengx.mo@intel.com/", "project": { "id": 3, "url": "http://patches.dpdk.org/api/projects/3/?format=api", "name": "DTS", "link_name": "dts", "list_id": "dts.dpdk.org", "list_email": "dts@dpdk.org", "web_url": "", "scm_url": "git://dpdk.org/tools/dts", "webscm_url": "http://git.dpdk.org/tools/dts/", "list_archive_url": "https://inbox.dpdk.org/dts", "list_archive_url_format": "https://inbox.dpdk.org/dts/{}", "commit_url_format": "" }, "msgid": "<20210831082220.47375-2-yufengx.mo@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dts/20210831082220.47375-2-yufengx.mo@intel.com", "date": "2021-08-31T08:22:15", "name": "[V2,1/6] framework/etgen: remove etgen", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "5803b9c505520416293e9c6eb4972296c1131312", "submitter": { "id": 1342, "url": "http://patches.dpdk.org/api/people/1342/?format=api", "name": "Yufen.Mo", "email": "yufengx.mo@intel.com" }, "delegate": { "id": 23642, "url": "http://patches.dpdk.org/api/users/23642/?format=api", "username": "lijuantu", "first_name": "LIjuan", "last_name": "Tu", "email": "lijuan.tu@intel.com" }, "mbox": "http://patches.dpdk.org/project/dts/patch/20210831082220.47375-2-yufengx.mo@intel.com/mbox/", "series": [ { "id": 18556, "url": "http://patches.dpdk.org/api/series/18556/?format=api", "web_url": "http://patches.dpdk.org/project/dts/list/?series=18556", "date": "2021-08-31T08:22:14", "name": "etgen: remove etgen", "version": 2, "mbox": "http://patches.dpdk.org/series/18556/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/97591/comments/", "check": "pending", "checks": "http://patches.dpdk.org/api/patches/97591/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 2CFC8A0C46;\n\tTue, 31 Aug 2021 10:21:36 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 21FE3406A3;\n\tTue, 31 Aug 2021 10:21:36 +0200 (CEST)", "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by mails.dpdk.org (Postfix) with ESMTP id 8878040041\n for <dts@dpdk.org>; Tue, 31 Aug 2021 10:21:33 +0200 (CEST)", "from fmsmga002.fm.intel.com ([10.253.24.26])\n by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 31 Aug 2021 01:21:33 -0700", "from dpdk-moyufen06.sh.intel.com ([10.67.116.208])\n by fmsmga002.fm.intel.com with ESMTP; 31 Aug 2021 01:21:30 -0700" ], "X-IronPort-AV": [ "E=McAfee;i=\"6200,9189,10092\"; a=\"216576687\"", "E=Sophos;i=\"5.84,365,1620716400\"; d=\"scan'208\";a=\"216576687\"", "E=Sophos;i=\"5.84,365,1620716400\"; d=\"scan'208\";a=\"540921790\"" ], "X-ExtLoop1": "1", "From": "Yufen Mo <yufengx.mo@intel.com>", "To": "dts@dpdk.org, lijuan.tu@intel.com, yingyax.han@intel.com,\n junx.w.zhou@intel.com", "Cc": "Yufen Mo <yufengx.mo@intel.com>", "Date": "Tue, 31 Aug 2021 16:22:15 +0800", "Message-Id": "<20210831082220.47375-2-yufengx.mo@intel.com>", "X-Mailer": "git-send-email 2.21.0", "In-Reply-To": "<20210831082220.47375-1-yufengx.mo@intel.com>", "References": "<20210831082220.47375-1-yufengx.mo@intel.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[dts] [PATCH V2 1/6] framework/etgen: remove etgen", "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", "Sender": "\"dts\" <dts-bounces@dpdk.org>" }, "content": "remove etgen relevant source code.\n\nSigned-off-by: Yufen Mo <yufengx.mo@intel.com>\n---\n conf/crbs.cfg | 2 -\n conf/ixia.cfg | 15 -\n framework/config.py | 67 +--\n framework/crb.py | 2 +-\n framework/crbs.py | 1 -\n framework/dts.py | 6 -\n framework/etgen.py | 972 --------------------------------------\n framework/logger.py | 20 -\n framework/project_dpdk.py | 12 +-\n framework/settings.py | 1 -\n framework/tester.py | 90 +---\n 11 files changed, 5 insertions(+), 1183 deletions(-)\n delete mode 100644 conf/ixia.cfg\n delete mode 100644 framework/etgen.py", "diff": "diff --git a/conf/crbs.cfg b/conf/crbs.cfg\nindex 0ba9d1fc..b6c0a9af 100644\n--- a/conf/crbs.cfg\n+++ b/conf/crbs.cfg\n@@ -6,7 +6,6 @@\n # os: operation system type linux or freebsd\n # tester_ip: Tester ip address\n # tester_passwd: Tester password\n-# ixia_group: IXIA group name\n # pktgen_group: packet generator group name: ixia/trex/ixia_network\n # channels: Board channel number\n # bypass_core0: Whether by pass core0\n@@ -36,7 +35,6 @@ os=linux\n dut_arch=\n tester_ip=yyy.yyy.yyy.yyy\n tester_passwd=\n-ixia_group=\n pktgen_group=\n channels=4\n bypass_core0=True\ndiff --git a/conf/ixia.cfg b/conf/ixia.cfg\ndeleted file mode 100644\nindex 9deba603..00000000\n--- a/conf/ixia.cfg\n+++ /dev/null\n@@ -1,15 +0,0 @@\n-# IXIA port Configuration\n-# IxiaGroup: Group name for IXIA ports\n-# Version : IXIA TCL server version\n-# IP : IXIA server IP address\n-# Ports : [IXIA port list]\n-# ixia_force100g: We need to set this to enable if we need IXIA port work in 100G mode.\n-[IXIA Group]\n-ixia_version=6.62\n-ixia_ip=xxx.xxx.xxx.xxx\n-ixia_ports=\n- card=1,port=1;\n- card=1,port=2;\n- card=1,port=3;\n- card=1,port=4;\n-ixia_force100g=disable\ndiff --git a/framework/config.py b/framework/config.py\nindex 88ae8ea5..ac075233 100644\n--- a/framework/config.py\n+++ b/framework/config.py\n@@ -36,7 +36,7 @@ import os\n import re\n import configparser # config parse module\n import argparse # parse arguments module\n-from settings import (IXIA, PKTGEN, PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK,\n+from settings import (PKTGEN, PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK,\n CONFIG_ROOT_PATH, SUITE_SECTION_NAME)\n from settings import load_global_setting, DTS_CFG_FOLDER\n from exception import ConfigParseException, VirtConfigParseException, PortConfigParseException\n@@ -268,7 +268,7 @@ class PortConf(UserConf):\n class CrbsConf(UserConf):\n DEF_CRB = {'IP': '', 'board': 'default', 'user': '',\n 'pass': '', 'tester IP': '', 'tester pass': '',\n- IXIA: None, 'memory channels': 4,\n+ 'memory channels': 4,\n PKTGEN: None,\n 'bypass core0': True, 'dut_cores': '',\n 'snapshot_load_side': 'tester'}\n@@ -309,11 +309,6 @@ class CrbsConf(UserConf):\n crb['tester IP'] = value\n elif key == 'tester_passwd':\n crb['tester pass'] = value\n- elif key == 'ixia_group':\n- # None type will be check later\n- if value.lower() == 'none':\n- value = None\n- crb[IXIA] = value\n elif key == 'pktgen_group':\n crb[PKTGEN] = value.lower()\n elif key == 'channels':\n@@ -336,64 +331,6 @@ class CrbsConf(UserConf):\n return self.crbs_cfg\n \n \n-class IxiaConf(UserConf):\n-\n- def __init__(self, ixia_conf=IXIACONF):\n- self.config_file = ixia_conf\n- self.ixia_cfg = {}\n- try:\n- self.ixia_conf = UserConf(self.config_file)\n- except ConfigParseException:\n- self.ixia_conf = None\n- raise ConfigParseException\n-\n- def load_ixia_config(self):\n- port_reg = r'card=(\\d+),port=(\\d+)'\n- groups = self.ixia_conf.get_sections()\n- if not groups:\n- return self.ixia_cfg\n-\n- for group in groups:\n- ixia_group = {}\n- ixia_confs = self.ixia_conf.load_section(group)\n- if not ixia_confs:\n- continue\n-\n- # convert file configuration to dts ixiacfg\n- for conf in ixia_confs:\n- key, value = conf\n- if key == 'ixia_version':\n- ixia_group['Version'] = value\n- elif key == 'ixia_ip':\n- ixia_group['IP'] = value\n- elif key == 'ixia_ports':\n- ports = self.ixia_conf.load_config(value)\n- ixia_ports = []\n- for port in ports:\n- m = re.match(port_reg, port)\n- if m:\n- ixia_port = {}\n- ixia_port[\"card\"] = int(m.group(1))\n- ixia_port[\"port\"] = int(m.group(2))\n- ixia_ports.append(ixia_port)\n- ixia_group['Ports'] = ixia_ports\n- elif key == 'ixia_enable_rsfec':\n- ixia_group['enable_rsfec'] = value\n-\n- if 'Version' not in ixia_group:\n- print('ixia configuration file request ixia_version option!!!')\n- continue\n- if 'IP' not in ixia_group:\n- print('ixia configuration file request ixia_ip option!!!')\n- continue\n- if 'Ports' not in ixia_group:\n- print('ixia configuration file request ixia_ports option!!!')\n- continue\n-\n- self.ixia_cfg[group] = ixia_group\n-\n- return self.ixia_cfg\n-\n class PktgenConf(UserConf):\n \n def __init__(self, pktgen_type='ixia', pktgen_conf=PKTGENCONF):\ndiff --git a/framework/crb.py b/framework/crb.py\nindex 3964e213..40fe4fd1 100644\n--- a/framework/crb.py\n+++ b/framework/crb.py\n@@ -32,7 +32,7 @@\n import time\n import re\n import os\n-from settings import TIMEOUT, IXIA\n+from settings import TIMEOUT\n from ssh_connection import SSHConnection\n from logger import getLogger\n from config import PortConf, PORTCONF, PktgenConf\ndiff --git a/framework/crbs.py b/framework/crbs.py\nindex 2ff937ac..c586caa1 100644\n--- a/framework/crbs.py\n+++ b/framework/crbs.py\n@@ -1,7 +1,6 @@\n \"\"\"\n Static configuration data for any CRBs that can be used.\n \"\"\"\n-from settings import IXIA\n \n crbs_desc = {\n 'CrownPassCRB1':\ndiff --git a/framework/dts.py b/framework/dts.py\nindex 6f621a51..e83a6ce5 100644\n--- a/framework/dts.py\n+++ b/framework/dts.py\n@@ -281,9 +281,6 @@ def dts_log_testsuite(duts, tester, suite_obj, log_handler, test_classname):\n hasattr(tester, 'pktgen') and \\\n getattr(tester, 'pktgen'):\n tester.pktgen.logger.config_suite(test_classname, 'pktgen')\n- elif hasattr(tester, 'ixia_packet_gen') and \\\n- getattr(tester, 'ixia_packet_gen'):\n- tester.ixia_packet_gen.logger.config_suite(test_classname, 'ixia')\n except Exception as ex:\n pass\n \n@@ -304,9 +301,6 @@ def dts_log_execution(duts, tester, log_handler):\n hasattr(tester, 'pktgen') and \\\n getattr(tester, 'pktgen'):\n tester.pktgen.logger.config_execution('pktgen')\n- elif hasattr(tester, 'ixia_packet_gen') and \\\n- getattr(tester, 'ixia_packet_gen'):\n- tester.ixia_packet_gen.logger.config_execution('ixia')\n except Exception as ex:\n pass\n \ndiff --git a/framework/etgen.py b/framework/etgen.py\ndeleted file mode 100644\nindex acfa2960..00000000\n--- a/framework/etgen.py\n+++ /dev/null\n@@ -1,972 +0,0 @@\n-# BSD LICENSE\n-#\n-# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.\n-# All rights reserved.\n-#\n-# Redistribution and use in source and binary forms, with or without\n-# modification, are permitted provided that the following conditions\n-# are met:\n-#\n-# * Redistributions of source code must retain the above copyright\n-# notice, this list of conditions and the following disclaimer.\n-# * Redistributions in binary form must reproduce the above copyright\n-# notice, this list of conditions and the following disclaimer in\n-# the documentation and/or other materials provided with the\n-# distribution.\n-# * Neither the name of Intel Corporation nor the names of its\n-# contributors may be used to endorse or promote products derived\n-# from this software without specific prior written permission.\n-#\n-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n-# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n-\n-import re\n-import string\n-import time\n-from config import IxiaConf\n-from ssh_connection import SSHConnection\n-from settings import SCAPY2IXIA\n-from logger import getLogger\n-from exception import VerifyFailure\n-from utils import create_mask\n-\n-\n-class SoftwarePacketGenerator():\n-\n- \"\"\"\n- Software WindRiver packet generator for performance measurement.\n- \"\"\"\n-\n- def __init__(self, tester):\n- self.tester = tester\n-\n- def packet_generator(self, portList, rate_percent):\n- # bind ports\n- self.tester.send_expect(\"insmod igb_uio.ko\", \"#\")\n-\n- bind_cmd = \"\"\n- allow_list = \"\"\n- ports = []\n- tx_ports = []\n- for (tx_port, rx_port, pcap_file) in portList:\n- if tx_port not in ports:\n- ports.append(tx_port)\n- tx_ports.append(tx_port)\n- if rx_port not in ports:\n- ports.append(rx_port)\n-\n- for port in ports:\n- bind_cmd += \" %s\" % self.tester.ports_info[port]['pci']\n- allow_list += \" -w %s\" % self.tester.ports_info[port]['pci']\n-\n- self.tester.send_expect(\"./dpdk-devbind.py --bind=igb_uio %s\" % bind_cmd, \"#\")\n-\n- # assign core for ports\n- map_cmd = \"\"\n- port_index = list(range(len(ports)))\n- port_map = dict(list(zip(ports, port_index)))\n- self.tester.init_reserved_core()\n-\n- # reserve one core for master process\n- used_cores = list()\n- master_core = self.tester.get_reserved_core(\"1C\", socket=0)\n-\n- if len(master_core) < 1:\n- raise VerifyFailure(\"Not enough core for performance!!!\")\n-\n- used_cores.append(int(master_core[0]))\n-\n- # allocate cores for each port\n- for port in ports:\n- numa = self.tester.get_port_numa(port)\n- cores = self.tester.get_reserved_core(\"2C\", socket=numa)\n-\n- if len(cores) < 2:\n- raise VerifyFailure(\"Not enough cores for performance!!!\")\n-\n- map_cmd += \"[%s:%s].%d, \" % (cores[0], cores[1], port_map[port])\n- used_cores.append(int(cores[0]))\n- used_cores.append(int(cores[1]))\n-\n- # prepare pcap for every port\n- pcap_cmd = \"\"\n- for (tx_port, rx_port, pcap_file) in portList:\n- pcap_cmd += \" -s %d:%s\" % (port_map[tx_port], pcap_file)\n-\n- # Selected 2 for -n to optimize results on Burage\n- cores_mask = create_mask(used_cores)\n-\n- # allocate enough memory for 4 ports\n- socket_mem = \"--socket-mem 1024,1024\"\n-\n- # current support version is dpdk v18.02 + pktgen v3.5.0\n- pkt_cmd = \"./pktgen -n 2 -c {CORE} --file-prefix=pktgen {ALLOW} \" \\\n- \"{MEM} -- -P -m \\\"{CORE_MAP}\\\" {PCAP}\".format(CORE=cores_mask,\n- ALLOW=allow_list, MEM=socket_mem, CORE_MAP=map_cmd, PCAP=pcap_cmd)\n-\n- self.tester.send_expect(pkt_cmd, \"Pktgen:/>\", 100)\n- self.tester.send_expect(\"disable screen\", \"Pktgen:/>\")\n-\n- if rate_percent != 100:\n- self.tester.send_expect(\"set all rate %s\" % rate_percent, \"Pktgen:/>\")\n- else:\n- self.tester.send_expect(\"set all rate 100\", \"Pktgen:/>\")\n-\n- self.tester.send_expect(\"start all\", \"Pktgen:/>\")\n- time.sleep(10)\n- out = self.tester.send_expect(\"lua \\\"prints('portRates', pktgen.portStats('all', 'rate'))\\\"\", \"Pktgen:/>\")\n- rx_bps = 0\n- rx_pps = 0\n- tx_bps = 0\n- rx_match = r\"\\[\\\"mbits_rx\\\"\\] = (\\d+),\"\n- port_stats = re.findall(rx_match, out)\n- for port_stat in port_stats:\n- rx_bps += int(port_stat)\n-\n- tx_match = r\"\\[\\\"mbits_tx\\\"\\] = (\\d+),\"\n- port_stats = re.findall(tx_match, out)\n- for port_stat in port_stats:\n- tx_bps += int(port_stat)\n-\n- pps_match = r\"\\[\\\"pkts_rx\\\"\\] = (\\d+),\"\n- port_stats = re.findall(pps_match, out)\n- for port_stat in port_stats:\n- rx_pps += int(port_stat)\n-\n- self.tester.send_expect(\"stop all\", \"Pktgen:/>\")\n- self.tester.send_expect(\"quit\", \"#\")\n- # restore stty setting\n- self.tester.send_expect('stty -echo', '#')\n- self.tester.kill_all(killall=True)\n- self.tester.restore_interfaces()\n-\n- return rx_bps, tx_bps, rx_pps\n-\n- def throughput(self, portList, rate_percent=100):\n- (bps_rx, _, pps_rx) = self.packet_generator(portList, rate_percent)\n- return bps_rx, pps_rx\n-\n- def loss(self, portList, ratePercent):\n- (bps_rx, bps_tx, _) = self.packet_generator(portList, ratePercent)\n- assert bps_tx != 0\n- return (float(bps_tx) - float(bps_rx)) / float(bps_tx), float(bps_tx), float(bps_rx)\n-\n-\n-class IxiaPacketGenerator(SSHConnection):\n-\n- \"\"\"\n- IXIA packet generator for performance measurement.\n- \"\"\"\n-\n- def __init__(self, tester):\n- self.tester = tester\n- self.NAME = 'ixia'\n- self.logger = getLogger(self.NAME)\n- super(IxiaPacketGenerator, self).__init__(self.get_ip_address(),\n- self.NAME, self.tester.get_username(),\n- self.get_password())\n- super(IxiaPacketGenerator, self).init_log(self.logger)\n-\n- self.tcl_cmds = []\n- self.chasId = None\n- self.conRelation = {}\n-\n- ixiaRef = self.tester.get_external_traffic_generator()\n-\n- ixiacfg = IxiaConf()\n- ixiaPorts = ixiacfg.load_ixia_config()\n- if ixiaRef is None or ixiaRef not in ixiaPorts:\n- return\n-\n- self.ixiaVersion = ixiaPorts[ixiaRef][\"Version\"]\n- self.ports = ixiaPorts[ixiaRef][\"Ports\"]\n-\n- if 'force100g' in ixiaPorts[ixiaRef]:\n- self.enable100g = ixiaPorts[ixiaRef]['force100g']\n- else:\n- self.enable100g = 'disable'\n-\n- self.logger.info(self.ixiaVersion)\n- self.logger.info(self.ports)\n-\n- self.tclServerIP = ixiaPorts[ixiaRef][\"IP\"]\n-\n- # prepare tcl shell and ixia library\n- self.send_expect(\"tclsh\", \"% \")\n- self.send_expect(\"source ./IxiaWish.tcl\", \"% \")\n- self.send_expect(\"set ::env(IXIA_VERSION) %s\" % self.ixiaVersion, \"% \")\n- out = self.send_expect(\"package req IxTclHal\", \"% \")\n- self.logger.debug(\"package req IxTclHal return:\" + out)\n- if self.ixiaVersion in out:\n- if not self.tcl_server_login():\n- self.close()\n- self.session = None\n- for port in self.ports:\n- port['speed'] = self.get_line_rate(self.chasId, port)\n-\n- def get_line_rate(self, chasid, port):\n- return self.send_expect(\"stat getLineSpeed %s %s %s\" % (chasid, port['card'], port['port']), '%')\n-\n- def get_ip_address(self):\n- return self.tester.get_ip_address()\n-\n- def get_password(self):\n- return self.tester.get_password()\n-\n- def add_tcl_cmd(self, cmd):\n- \"\"\"\n- Add one tcl command into command list.\n- \"\"\"\n- self.tcl_cmds.append(cmd)\n-\n- def clean(self):\n- \"\"\"\n- Clean ownership of IXIA devices and logout tcl session.\n- \"\"\"\n- self.close()\n- self.send_expect(\"clearOwnershipAndLogout\", \"% \")\n-\n- def parse_pcap(self, fpcap):\n- dump_str1 = \"cmds = []\\n\"\n- dump_str2 = \"for i in rdpcap('%s', -1):\\n\" % fpcap\n- dump_str3 = \" if 'VXLAN' in i.command():\\n\" + \\\n- \" vxlan_str = ''\\n\" + \\\n- \" l = len(i[VXLAN])\\n\" + \\\n- \" vxlan = str(i[VXLAN])\\n\" + \\\n- \" first = True\\n\" + \\\n- \" for j in range(l):\\n\" + \\\n- \" if first:\\n\" + \\\n- \" vxlan_str += \\\"VXLAN(hexval='%02X\\\" %ord(vxlan[j])\\n\" + \\\n- \" first = False\\n\" + \\\n- \" else:\\n\" + \\\n- \" vxlan_str += \\\" %02X\\\" %ord(vxlan[j])\\n\" + \\\n- \" vxlan_str += \\\"\\')\\\"\\n\" + \\\n- \" command = re.sub(r\\\"VXLAN(.*)\\\", vxlan_str, i.command())\\n\" + \\\n- \" else:\\n\" + \\\n- \" command = i.command()\\n\" + \\\n- \" cmds.append(command)\\n\" + \\\n- \"print cmds\\n\" + \\\n- \"exit()\"\n-\n- f = open(\"dumppcap.py\", \"w\")\n- f.write(dump_str1)\n- f.write(dump_str2)\n- f.write(dump_str3)\n- f.close()\n-\n- self.session.copy_file_to(\"dumppcap.py\")\n- out = self.send_expect(\"scapy -c dumppcap.py 2>/dev/null\", \"% \", 120)\n- flows = eval(out)\n- return flows\n-\n- def ether(self, port, src, dst, type):\n- \"\"\"\n- Configure Ether protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"protocol config -ethernetType ethernetII\")\n- self.add_tcl_cmd('stream config -sa \"%s\"' % self.macToTclFormat(src))\n- self.add_tcl_cmd('stream config -da \"%s\"' % self.macToTclFormat(dst))\n-\n- def ip(self, port, frag, src, proto, tos, dst, chksum, len, version, flags, ihl, ttl, id, options=None):\n- \"\"\"\n- Configure IP protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"protocol config -name ip\")\n- self.add_tcl_cmd('ip config -sourceIpAddr \"%s\"' % src)\n- self.add_tcl_cmd('ip config -destIpAddr \"%s\"' % dst)\n- self.add_tcl_cmd(\"ip config -ttl %d\" % ttl)\n- self.add_tcl_cmd(\"ip config -totalLength %d\" % len)\n- self.add_tcl_cmd(\"ip config -fragment %d\" % frag)\n- self.add_tcl_cmd(\"ip config -ipProtocol %d\" % proto)\n- self.add_tcl_cmd(\"ip config -identifier %d\" % id)\n- self.add_tcl_cmd(\"stream config -framesize %d\" % (len + 18))\n- self.add_tcl_cmd(\"ip set %d %d %d\" % (self.chasId, port['card'], port['port']))\n-\n- def macToTclFormat(self, macAddr):\n- \"\"\"\n- Convert normal mac address format into IXIA's format.\n- \"\"\"\n- macAddr = macAddr.upper()\n- return \"%s %s %s %s %s %s\" % (macAddr[:2], macAddr[3:5], macAddr[6:8], macAddr[9:11], macAddr[12:14], macAddr[15:17])\n-\n- def ipv6(self, port, version, tc, fl, plen, nh, hlim, src, dst):\n- \"\"\"\n- Configure IPv6 protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"protocol config -name ipV6\")\n- self.add_tcl_cmd('ipV6 setDefault')\n- self.add_tcl_cmd('ipV6 config -destAddr \"%s\"' % self.ipv6_to_tcl_format(dst))\n- self.add_tcl_cmd('ipV6 config -sourceAddr \"%s\"' % self.ipv6_to_tcl_format(src))\n- self.add_tcl_cmd('ipV6 config -flowLabel %d' % fl)\n- self.add_tcl_cmd('ipV6 config -nextHeader %d' % nh)\n- self.add_tcl_cmd('ipV6 config -hopLimit %d' % hlim)\n- self.add_tcl_cmd('ipV6 config -trafficClass %d' % tc)\n- self.add_tcl_cmd(\"ipV6 clearAllExtensionHeaders\")\n- self.add_tcl_cmd(\"ipV6 addExtensionHeader %d\" % nh)\n-\n- self.add_tcl_cmd(\"stream config -framesize %d\" % (plen + 40 + 18))\n- self.add_tcl_cmd(\"ipV6 set %d %d %d\" % (self.chasId, port['card'], port['port']))\n-\n- def udp(self, port, dport, sport, len, chksum):\n- \"\"\"\n- Configure UDP protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"udp setDefault\")\n- self.add_tcl_cmd(\"udp config -sourcePort %d\" % sport)\n- self.add_tcl_cmd(\"udp config -destPort %d\" % dport)\n- self.add_tcl_cmd(\"udp config -length %d\" % len)\n- self.add_tcl_cmd(\"udp set %d %d %d\" %\n- (self.chasId, port['card'], port['port']))\n-\n- def vxlan(self, port, hexval):\n- self.add_tcl_cmd(\"protocolPad setDefault\")\n- self.add_tcl_cmd(\"protocol config -enableProtocolPad true\")\n- self.add_tcl_cmd(\"protocolPad config -dataBytes \\\"%s\\\"\" % hexval)\n- self.add_tcl_cmd(\"protocolPad set %d %d %d\" %\n- (self.chasId, port['card'], port['port']))\n-\n- def tcp(self, port, sport, dport, seq, ack, dataofs, reserved, flags, window, chksum, urgptr, options=None):\n- \"\"\"\n- Configure TCP protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"tcp setDefault\")\n- self.add_tcl_cmd(\"tcp config -sourcePort %d\" % sport)\n- self.add_tcl_cmd(\"tcp config -destPort %d\" % dport)\n- self.add_tcl_cmd(\"tcp set %d %d %d\" % (self.chasId, port['card'], port['port']))\n-\n- def sctp(self, port, sport, dport, tag, chksum):\n- \"\"\"\n- Configure SCTP protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"tcp config -sourcePort %d\" % sport)\n- self.add_tcl_cmd(\"tcp config -destPort %d\" % dport)\n- self.add_tcl_cmd(\"tcp set %d %d %d\" % (self.chasId, port['card'], port['port']))\n-\n- def dot1q(self, port, prio, id, vlan, type):\n- \"\"\"\n- Configure 8021Q protocol.\n- \"\"\"\n- self.add_tcl_cmd(\"protocol config -enable802dot1qTag true\")\n- self.add_tcl_cmd(\"vlan config -vlanID %d\" % vlan)\n- self.add_tcl_cmd(\"vlan config -userPriority %d\" % prio)\n- self.add_tcl_cmd(\"vlan set %d %d %d\" % (self.chasId, port['card'], port['port']))\n-\n- def config_stream(self, fpcap, txport, rate_percent, stream_id=1, latency=False):\n- \"\"\"\n- Configure IXIA stream and enable multiple flows.\n- \"\"\"\n- flows = self.parse_pcap(fpcap)\n-\n- self.add_tcl_cmd(\"ixGlobalSetDefault\")\n- self.config_ixia_stream(rate_percent, flows, latency)\n-\n- pat = re.compile(r\"(\\w+)\\((.*)\\)\")\n- for flow in flows:\n- for header in flow.split('/'):\n- match = pat.match(header)\n- params = eval('dict(%s)' % match.group(2))\n- method_name = match.group(1)\n- if method_name == 'VXLAN':\n- method = getattr(self, method_name.lower())\n- method(txport, **params)\n- break\n- if method_name in SCAPY2IXIA:\n- method = getattr(self, method_name.lower())\n- method(txport, **params)\n-\n- self.add_tcl_cmd(\"stream set %d %d %d %d\" % (self.chasId, txport[\n- 'card'], txport['port'], stream_id))\n- stream_id += 1\n-\n- if len(flows) > 1:\n- stream_id -= 1\n- self.add_tcl_cmd(\"stream config -dma gotoFirst\")\n- self.add_tcl_cmd(\"stream set %d %d %d %d\" %\n- (self.chasId, txport['card'], txport['port'], stream_id))\n-\n- def config_ixia_stream(self, rate_percent, flows, latency):\n- \"\"\"\n- Configure IXIA stream with rate and latency.\n- Override this method if you want to add custom stream configuration.\n- \"\"\"\n- self.add_tcl_cmd(\"stream config -rateMode usePercentRate\")\n- self.add_tcl_cmd(\"stream config -percentPacketRate %s\" % rate_percent)\n- self.add_tcl_cmd(\"stream config -numFrames 1\")\n- if len(flows) == 1:\n- self.add_tcl_cmd(\"stream config -dma contPacket\")\n- else:\n- self.add_tcl_cmd(\"stream config -dma advance\")\n- # request by packet Group\n- if latency is not False:\n- self.add_tcl_cmd(\"stream config -fir true\")\n-\n- def tcl_server_login(self):\n- \"\"\"\n- Connect to tcl server and take ownership of all the ports needed.\n- \"\"\"\n- out = self.send_expect(\"ixConnectToTclServer %s\" % self.tclServerIP, \"% \", 30)\n- self.logger.debug(\"ixConnectToTclServer return:\" + out)\n- if out.strip()[-1] != '0':\n- return False\n-\n- self.send_expect(\"ixLogin IxiaTclUser\", \"% \")\n-\n- out = self.send_expect(\"ixConnectToChassis %s\" % self.tclServerIP, \"% \", 30)\n- if out.strip()[-1] != '0':\n- return False\n-\n- out = self.send_expect(\"set chasId [ixGetChassisID %s]\" % self.tclServerIP, \"% \")\n- self.chasId = int(out.strip())\n-\n- out = self.send_expect(\"ixClearOwnership [list %s]\" % ' '.join(\n- ['[list %d %d %d]' % (self.chasId, item['card'], item['port']) for item in self.ports]), \"% \", 10)\n- if out.strip()[-1] != '0':\n- return False\n- out = self.send_expect(\"ixTakeOwnership [list %s] force\" % ' '.join(\n- ['[list %d %d %d]' % (self.chasId, item['card'], item['port']) for item in self.ports]), \"% \", 10)\n- if out.strip()[-1] != '0':\n- return False\n-\n- return True\n-\n- def tcl_server_logout(self):\n- \"\"\"\n- Disconnect to tcl server and make sure has been logged out.\n- \"\"\"\n- self.send_expect(\"ixDisconnectFromChassis %s\" % self.tclServerIP, \"%\")\n- self.send_expect(\"ixLogout\", \"%\")\n- self.send_expect(\"ixDisconnectTclServer %s\" % self.tclServerIP, \"%\")\n-\n- def config_port(self, pList):\n- \"\"\"\n- Configure ports and make them ready for performance validation.\n- \"\"\"\n- pl = list()\n- for item in pList:\n- self.add_tcl_cmd(\"port setFactoryDefaults chasId %d %d\" % (\n- item['card'], item['port']))\n- # if the line rate is 100G and we need this port work in 100G mode,\n- # we need to add some configure to make it so.\n- if int(self.get_line_rate(self.chasId, item).strip()) == 100000 and self.enable100g == 'enable':\n- self.add_tcl_cmd(\"port config -ieeeL1Defaults 0\")\n- self.add_tcl_cmd(\"port config -autonegotiate false\")\n- self.add_tcl_cmd(\"port config -enableRsFec true\")\n- self.add_tcl_cmd(\"port set %d %d %d\" % (self.chasId, item['card'], item['port']))\n-\n- pl.append('[list %d %d %d]' % (self.chasId, item['card'], item['port']))\n-\n- self.add_tcl_cmd(\"set portList [list %s]\" % ' '.join(pl))\n-\n- self.add_tcl_cmd(\"ixClearTimeStamp portList\")\n- self.add_tcl_cmd(\"ixWritePortsToHardware portList\")\n- self.add_tcl_cmd(\"ixCheckLinkState portList\")\n-\n- def set_ixia_port_list(self, pList):\n- \"\"\"\n- Implement ports/streams configuration on specified ports.\n- \"\"\"\n- self.add_tcl_cmd(\"set portList [list %s]\" %\n- ' '.join(['[list %d %d %d]' %\n- (self.chasId, item['card'], item['port']) for item in pList]))\n-\n- def send_ping6(self, pci, mac, ipv6):\n- \"\"\"\n- Send ping6 packet from IXIA ports.\n- \"\"\"\n- self.send_expect(\"source ./ixTcl1.0/ixiaPing6.tcl\", \"% \")\n- out = self.send_expect('ping6 \"%s\" \"%s\" %d %d %d' %\n- (self.ipv6_to_tcl_format(ipv6), self.macToTclFormat(mac), self.chasId, self.pci_to_port(pci)['card'], self.pci_to_port(pci)['port']), \"% \", 90)\n- return out\n-\n- def ipv6_to_tcl_format(self, ipv6):\n- \"\"\"\n- Convert normal IPv6 address to IXIA format.\n- \"\"\"\n- ipv6 = ipv6.upper()\n- singleAddr = ipv6.split(\":\")\n- if '' == singleAddr[0]:\n- singleAddr = singleAddr[1:]\n- if '' in singleAddr:\n- tclFormatAddr = ''\n- addStr = '0:' * (8 - len(singleAddr)) + '0'\n- for i in range(len(singleAddr)):\n- if singleAddr[i] == '':\n- tclFormatAddr += addStr + \":\"\n- else:\n- tclFormatAddr += singleAddr[i] + \":\"\n- tclFormatAddr = tclFormatAddr[0:len(tclFormatAddr) - 1]\n- return tclFormatAddr\n- else:\n- return ipv6\n-\n- def get_ports(self):\n- \"\"\"\n- API to get ixia ports\n- \"\"\"\n- plist = list()\n- if self.session is None:\n- return plist\n-\n- for p in self.ports:\n- plist.append({'type': 'ixia', 'pci': 'IXIA:%d.%d' % (p['card'], p['port'])})\n- return plist\n-\n- def pci_to_port(self, pci):\n- \"\"\"\n- Convert IXIA fake pci to IXIA port.\n- \"\"\"\n- ixia_pci_regex = \"IXIA:(\\d*).(\\d*)\"\n- m = re.match(ixia_pci_regex, pci)\n- if m is None:\n- return {'card': -1, 'port': -1}\n-\n- return {'card': int(m.group(1)), 'port': int(m.group(2))}\n-\n- def loss(self, portList, ratePercent, delay=5):\n- \"\"\"\n- Run loss performance test and return loss rate.\n- \"\"\"\n- rxPortlist, txPortlist = self._configure_everything(portList, ratePercent)\n- return self.get_loss_packet_rate(rxPortlist, txPortlist, delay)\n-\n- def get_loss_packet_rate(self, rxPortlist, txPortlist, delay=5):\n- \"\"\"\n- Get RX/TX packet statistics and calculate loss rate.\n- \"\"\"\n- time.sleep(delay)\n-\n- self.send_expect(\"ixStopTransmit portList\", \"%\", 10)\n- time.sleep(2)\n- sendNumber = 0\n- for port in txPortlist:\n- self.stat_get_stat_all_stats(port)\n- sendNumber += self.get_frames_sent()\n- time.sleep(0.5)\n-\n- self.logger.info(\"send :%f\" % sendNumber)\n-\n- assert sendNumber != 0\n-\n- revNumber = 0\n- for port in rxPortlist:\n- self.stat_get_stat_all_stats(port)\n- revNumber += self.get_frames_received()\n- self.logger.info(\"rev :%f\" % revNumber)\n-\n- return float(sendNumber - revNumber) / sendNumber, sendNumber, revNumber\n-\n- def latency(self, portList, ratePercent, delay=5):\n- \"\"\"\n- Run latency performance test and return latency statistics.\n- \"\"\"\n- rxPortlist, txPortlist = self._configure_everything(portList, ratePercent, True)\n- return self.get_packet_latency(rxPortlist)\n-\n- def get_packet_latency(self, rxPortlist):\n- \"\"\"\n- Stop IXIA transmit and return latency statistics.\n- \"\"\"\n- latencyList = []\n- time.sleep(10)\n- self.send_expect(\"ixStopTransmit portList\", \"%\", 10)\n- for rx_port in rxPortlist:\n- self.pktGroup_get_stat_all_stats(rx_port)\n- latency = {\"port\": rx_port,\n- \"min\": self.get_min_latency(),\n- \"max\": self.get_max_latency(),\n- \"average\": self.get_average_latency()}\n- latencyList.append(latency)\n- return latencyList\n-\n- def throughput(self, port_list, rate_percent=100, delay=5):\n- \"\"\"\n- Run throughput performance test and return throughput statistics.\n- \"\"\"\n- rxPortlist, txPortlist = self._configure_everything(port_list, rate_percent)\n- return self.get_transmission_results(rxPortlist, txPortlist, delay)\n-\n- \"\"\"\n- This function could be used to check the packets' order whether same as the receive sequence.\n- Please notice that this function only support single-stream mode.\n- \"\"\"\n- def is_packet_ordered(self, port_list, delay):\n- rxPortlist, txPortlist = self.prepare_port_list(port_list)\n- self.prepare_ixia_for_transmission(txPortlist, rxPortlist)\n- self.send_expect('port config -receiveMode [expr $::portCapture|$::portRxSequenceChecking|$::portRxModeWidePacketGroup]', '%')\n- self.send_expect('port config -autonegotiate true', '%')\n- self.send_expect('ixWritePortsToHardware portList', '%')\n- self.send_expect('set streamId 1', '%')\n- self.send_expect('stream setDefault', '%')\n- self.send_expect('ixStartPortPacketGroups %d %d %d' % (self.chasId, self.ports[0]['card'], self.ports[0]['port']), '%')\n- self.send_expect('ixStartTransmit portList', '%')\n- self.send_expect('after 1000 * %d' % delay, '%')\n- self.send_expect('ixStopTransmit portList', '%')\n- self.send_expect('ixStopPortPacketGroups %d %d %d' % (self.chasId, self.ports[0]['card'], self.ports[0]['port']), '%')\n- self.send_expect('packetGroupStats get %d %d %d 1 1' % (self.chasId, self.ports[0]['card'], self.ports[0]['port']), '%')\n- self.send_expect('packetroupStats getGroup 1', '%')\n- self.send_expect('set reverseSequenceError [packetGroupStats cget -reverseSequenceError]]', '%')\n- output = self.send_expect('puts $reverseSequenceError', '%')\n- return int(output[:-2])\n-\n- def _configure_everything(self, port_list, rate_percent, latency=False):\n- \"\"\"\n- Prepare and configure IXIA ports for performance test.\n- \"\"\"\n- rxPortlist, txPortlist = self.prepare_port_list(port_list, rate_percent, latency)\n- self.prepare_ixia_for_transmission(txPortlist, rxPortlist)\n- self.configure_transmission()\n- self.start_transmission()\n- self.clear_tcl_commands()\n- return rxPortlist, txPortlist\n-\n- def clear_tcl_commands(self):\n- \"\"\"\n- Clear all commands in command list.\n- \"\"\"\n- del self.tcl_cmds[:]\n-\n- def start_transmission(self):\n- \"\"\"\n- Run commands in command list.\n- \"\"\"\n- fileContent = \"\\n\".join(self.tcl_cmds) + \"\\n\"\n- self.tester.create_file(fileContent, 'ixiaConfig.tcl')\n- self.send_expect(\"source ixiaConfig.tcl\", \"% \", 75)\n-\n- def configure_transmission(self, latency=False):\n- \"\"\"\n- Start IXIA ports transmission.\n- \"\"\"\n- self.add_tcl_cmd(\"ixStartTransmit portList\")\n-\n- def prepare_port_list(self, portList, rate_percent=100, latency=False):\n- \"\"\"\n- Configure stream and flow on every IXIA ports.\n- \"\"\"\n- txPortlist = set()\n- rxPortlist = set()\n-\n- for (txPort, rxPort, pcapFile) in portList:\n- txPortlist.add(txPort)\n- rxPortlist.add(rxPort)\n-\n- # port init\n- self.config_port([self.pci_to_port(\n- self.tester.get_pci(port)) for port in txPortlist.union(rxPortlist)])\n-\n- # stream/flow setting\n- for (txPort, rxPort, pcapFile) in portList:\n- self.config_stream(pcapFile, self.pci_to_port(self.tester.get_pci(txPort)), rate_percent, 1, latency)\n-\n- # config stream before packetGroup\n- if latency is not False:\n- for (txPort, rxPort, pcapFile) in portList:\n- flow_num = len(self.parse_pcap(pcapFile))\n- self.config_pktGroup_rx(self.pci_to_port(self.tester.get_pci(rxPort)))\n- self.config_pktGroup_tx(self.pci_to_port(self.tester.get_pci(txPort)))\n- return rxPortlist, txPortlist\n-\n- def prepare_ixia_for_transmission(self, txPortlist, rxPortlist):\n- \"\"\"\n- Clear all statistics and implement configuration to IXIA hardware.\n- \"\"\"\n- self.add_tcl_cmd(\"ixClearStats portList\")\n- self.set_ixia_port_list([self.pci_to_port(self.tester.get_pci(port)) for port in txPortlist])\n- self.add_tcl_cmd(\"ixWriteConfigToHardware portList\")\n- for port in txPortlist:\n- self.start_pktGroup(self.pci_to_port(self.tester.get_pci(port)))\n- for port in rxPortlist:\n- self.start_pktGroup(self.pci_to_port(self.tester.get_pci(port)))\n-\n- def hook_transmission_func(self):\n- pass\n-\n- def get_transmission_results(self, rx_port_list, tx_port_list, delay=5):\n- \"\"\"\n- Override this method if you want to change the way of getting results\n- back from IXIA.\n- \"\"\"\n- time.sleep(delay)\n- bpsRate = 0\n- rate = 0\n- oversize = 0\n- for port in rx_port_list:\n- self.stat_get_rate_stat_all_stats(port)\n- out = self.send_expect(\"stat cget -framesReceived\", '%', 10)\n- rate += int(out.strip())\n- out = self.send_expect(\"stat cget -bitsReceived\", '% ', 10)\n- self.logger.debug(\"port %d bits rate:\" % (port) + out)\n- bpsRate += int(out.strip())\n- out = self.send_expect(\"stat cget -oversize\", '%', 10)\n- oversize += int(out.strip())\n-\n- self.logger.info(\"Rate: %f Mpps\" % (rate * 1.0 / 1000000))\n- self.logger.info(\"Mbps rate: %f Mbps\" % (bpsRate * 1.0 / 1000000))\n-\n- self.hook_transmission_func()\n-\n- self.send_expect(\"ixStopTransmit portList\", \"%\", 30)\n-\n- if rate == 0 and oversize > 0:\n- return (bpsRate, oversize)\n- else:\n- return (bpsRate, rate)\n-\n- def config_ixia_dcb_init(self, rxPort, txPort):\n- \"\"\"\n- Configure Ixia for DCB.\n- \"\"\"\n- self.send_expect(\"source ./ixTcl1.0/ixiaDCB.tcl\", \"% \")\n- self.send_expect(\"configIxia %d %s\" % (self.chasId, ' '.join([\"%s\" % (\n- repr(self.conRelation[port][n])) for port in [rxPort, txPort] for n in range(3)])), \"% \", 100)\n-\n- def config_port_dcb(self, direction, tc):\n- \"\"\"\n- Configure Port for DCB.\n- \"\"\"\n- self.send_expect(\"configPort %s %s\" % (direction, tc), \"% \", 100)\n-\n- def cfgStreamDcb(self, stream, rate, prio, types):\n- \"\"\"\n- Configure Stream for DCB.\n- \"\"\"\n- self.send_expect(\"configStream %s %s %s %s\" % (stream, rate, prio, types), \"% \", 100)\n-\n- def get_connection_relation(self, dutPorts):\n- \"\"\"\n- Get the connect relations between DUT and Ixia.\n- \"\"\"\n- for port in dutPorts:\n- info = self.tester.get_pci(self.tester.get_local_port(port)).split('.')\n- self.conRelation[port] = [int(info[0]), int(info[1]), repr(self.tester.dut.get_mac_address(port).replace(':', ' ').upper())]\n- return self.conRelation\n-\n- def config_pktGroup_rx(self, rxport):\n- \"\"\"\n- Sets the transmit Packet Group configuration of the stream\n- Default streamID is 1\n- \"\"\"\n- self.add_tcl_cmd(\"port config -receiveMode $::portRxModeWidePacketGroup\")\n- self.add_tcl_cmd(\"port set %d %d %d\" % (self.chasId, rxport['card'], rxport['port']))\n- self.add_tcl_cmd(\"packetGroup setDefault\")\n- self.add_tcl_cmd(\"packetGroup config -latencyControl cutThrough\")\n- self.add_tcl_cmd(\"packetGroup setRx %d %d %d\" % (self.chasId, rxport['card'], rxport['port']))\n- self.add_tcl_cmd(\"packetGroup setTx %d %d %d 1\" % (self.chasId, rxport['card'], rxport['port']))\n-\n- def config_pktGroup_tx(self, txport):\n- \"\"\"\n- Configure tx port pktGroup for latency.\n- \"\"\"\n- self.add_tcl_cmd(\"packetGroup setDefault\")\n- self.add_tcl_cmd(\"packetGroup config -insertSignature true\")\n- self.add_tcl_cmd(\"packetGroup setTx %d %d %d 1\" % (self.chasId,\n- txport['card'], txport['port']))\n-\n- def start_pktGroup(self, port):\n- \"\"\"\n- Start tx port pktGroup for latency.\n- \"\"\"\n- self.add_tcl_cmd(\"ixStartPortPacketGroups %d %d %d\" % (self.chasId,\n- port['card'], port['port']))\n-\n- def pktGroup_get_stat_all_stats(self, port_number):\n- \"\"\"\n- Stop Packet Group operation on port and get current Packet Group\n- statistics on port.\n- \"\"\"\n- port = self.pci_to_port(self.tester.get_pci(port_number))\n- self.send_expect(\"ixStopPortPacketGroups %d %d %d\" % (self.chasId, port['card'], port['port']), \"%\", 100)\n- self.send_expect(\"packetGroupStats get %d %d %d 0 16384\" % (self.chasId, port['card'], port['port']), \"%\", 100)\n- self.send_expect(\"packetGroupStats getGroup 0\", \"%\", 100)\n-\n- def close(self):\n- \"\"\"\n- We first close the tclsh session opened at the beginning,\n- then the SSH session.\n- \"\"\"\n- if self.isalive():\n- self.send_expect('exit', '# ')\n- super(IxiaPacketGenerator, self).close()\n-\n- def stat_get_stat_all_stats(self, port_number):\n- \"\"\"\n- Sends a IXIA TCL command to obtain all the stat values on a given port.\n- \"\"\"\n- port = self.pci_to_port(self.tester.get_pci(port_number))\n- command = 'stat get statAllStats {0} {1} {2}'\n- command = command.format(self.chasId, port['card'], port['port'])\n- self.send_expect(command, '% ', 10)\n-\n- def prepare_ixia_internal_buffers(self, port_number):\n- \"\"\"\n- Tells IXIA to prepare the internal buffers were the frames were captured.\n- \"\"\"\n- port = self.pci_to_port(self.tester.get_pci(port_number))\n- command = 'capture get {0} {1} {2}'\n- command = command.format(self.chasId, port['card'], port['port'])\n- self.send_expect(command, '% ', 30)\n-\n- def stat_get_rate_stat_all_stats(self, port_number):\n- \"\"\"\n- All statistics of specified IXIA port.\n- \"\"\"\n- port = self.pci_to_port(self.tester.get_pci(port_number))\n- command = 'stat getRate statAllStats {0} {1} {2}'\n- command = command.format(self.chasId, port['card'], port['port'])\n- self.send_expect(command, '% ', 30)\n- out = self.send_expect(command, '% ', 30)\n-\n- def ixia_capture_buffer(self, port_number, first_frame, last_frame):\n- \"\"\"\n- Tells IXIA to load the captured frames into the internal buffers.\n- \"\"\"\n- port = self.pci_to_port(self.tester.get_pci(port_number))\n- command = 'captureBuffer get {0} {1} {2} {3} {4}'\n- command = command.format(self.chasId, port['card'], port['port'],\n- first_frame, last_frame)\n- self.send_expect(command, '%', 60)\n-\n- def ixia_export_buffer_to_file(self, frames_filename):\n- \"\"\"\n- Tells IXIA to dump the frames it has loaded in its internal buffer to a\n- text file.\n- \"\"\"\n- command = 'captureBuffer export %s' % frames_filename\n- self.send_expect(command, '%', 30)\n-\n- def _stat_cget_value(self, requested_value):\n- \"\"\"\n- Sends a IXIA TCL command to obtain a given stat value.\n- \"\"\"\n- command = \"stat cget -\" + requested_value\n- result = self.send_expect(command, '%', 10)\n- return int(result.strip())\n-\n- def _capture_cget_value(self, requested_value):\n- \"\"\"\n- Sends a IXIA TCL command to capture certain number of packets.\n- \"\"\"\n- command = \"capture cget -\" + requested_value\n- result = self.send_expect(command, '%', 10)\n- return int(result.strip())\n-\n- def _packetgroup_cget_value(self, requested_value):\n- \"\"\"\n- Sends a IXIA TCL command to get pktGroup stat value.\n- \"\"\"\n- command = \"packetGroupStats cget -\" + requested_value\n- result = self.send_expect(command, '%', 10)\n- return int(result.strip())\n-\n- def number_of_captured_packets(self):\n- \"\"\"\n- Returns the number of packets captured by IXIA on a previously set\n- port. Call self.stat_get_stat_all_stats(port) before.\n- \"\"\"\n- return self._capture_cget_value('nPackets')\n-\n- def get_frames_received(self):\n- \"\"\"\n- Returns the number of packets captured by IXIA on a previously set\n- port. Call self.stat_get_stat_all_stats(port) before.\n- \"\"\"\n- if self._stat_cget_value('framesReceived') != 0:\n- return self._stat_cget_value('framesReceived')\n- else:\n- # if the packet size is large than 1518, this line will avoid return\n- # a wrong number\n- return self._stat_cget_value('oversize')\n-\n- def get_flow_control_frames(self):\n- \"\"\"\n- Returns the number of control frames captured by IXIA on a\n- previously set port. Call self.stat_get_stat_all_stats(port) before.\n- \"\"\"\n- return self._stat_cget_value('flowControlFrames')\n-\n- def get_frames_sent(self):\n- \"\"\"\n- Returns the number of packets sent by IXIA on a previously set\n- port. Call self.stat_get_stat_all_stats(port) before.\n- \"\"\"\n- return self._stat_cget_value('framesSent')\n-\n- def get_transmit_duration(self):\n- \"\"\"\n- Returns the duration in nanosecs of the last transmission on a\n- previously set port. Call self.stat_get_stat_all_stats(port) before.\n- \"\"\"\n- return self._stat_cget_value('transmitDuration')\n-\n- def get_min_latency(self):\n- \"\"\"\n- Returns the minimum latency in nanoseconds of the frames in the\n- retrieved capture buffer. Call packetGroupStats get before.\n- \"\"\"\n- return self._packetgroup_cget_value('minLatency')\n-\n- def get_max_latency(self):\n- \"\"\"\n- Returns the maximum latency in nanoseconds of the frames in the\n- retrieved capture buffer. Call packetGroupStats get before.\n- \"\"\"\n- return self._packetgroup_cget_value('maxLatency')\n-\n- def get_average_latency(self):\n- \"\"\"\n- Returns the average latency in nanoseconds of the frames in the\n- retrieved capture buffer. Call packetGroupStats get before.\n- \"\"\"\n- return self._packetgroup_cget_value('averageLatency')\n-\n- def _transmission_pre_config(self, port_list, rate_percent, latency=False):\n- \"\"\"\n- Prepare and configure IXIA ports for performance test. And remove the transmission step in this config sequence.\n- This function is set only for function send_number_packets for nic_single_core_perf test case use\n- \"\"\"\n- rxPortlist, txPortlist = self.prepare_port_list(port_list, rate_percent, latency)\n- self.prepare_ixia_for_transmission(txPortlist, rxPortlist)\n- self.start_transmission()\n- self.clear_tcl_commands()\n- return rxPortlist, txPortlist\n-\n- def send_number_packets(self, portList, ratePercent, packetNum):\n- \"\"\"\n- Configure ixia to send fixed number of packets\n- Note that this function is only set for test_suite nic_single_core_perf,\n- Not for common use\n- \"\"\"\n- rxPortlist, txPortlist = self._transmission_pre_config(portList, ratePercent)\n-\n- self.send_expect(\"stream config -numFrames %s\" % packetNum, \"%\", 5)\n- self.send_expect(\"stream config -dma stopStream\", \"%\", 5)\n- for txPort in txPortlist:\n- port = self.pci_to_port(self.tester.get_pci(txPort))\n- self.send_expect(\"stream set %d %d %d 1\" % (self.chasId, port['card'], port['port']), \"%\", 5)\n-\n- self.send_expect(\"ixWritePortsToHardware portList\", \"%\", 5)\n- self.send_expect(\"ixClearStats portList\", \"%\", 5)\n- self.send_expect(\"ixStartTransmit portList\", \"%\", 5)\n- time.sleep(10)\n-\n- rxPackets = 0\n- for port in txPortlist:\n- self.stat_get_stat_all_stats(port)\n- txPackets = self.get_frames_sent()\n- while txPackets != packetNum:\n- time.sleep(10)\n- self.stat_get_stat_all_stats(port)\n- txPackets = self.get_frames_sent()\n- rxPackets += self.get_frames_received()\n- self.logger.info(\"Received packets :%s\" % rxPackets)\n-\n- return rxPackets\ndiff --git a/framework/logger.py b/framework/logger.py\nindex 63e1d831..5a04bdd2 100644\n--- a/framework/logger.py\n+++ b/framework/logger.py\n@@ -58,9 +58,6 @@ logging.SUITE_DUT_OUTPUT = logging.DEBUG + 3\n logging.SUITE_TESTER_CMD = logging.INFO + 4\n logging.SUITE_TESTER_OUTPUT = logging.DEBUG + 4\n \n-logging.DTS_IXIA_CMD = logging.INFO + 5\n-logging.DTS_IXIA_OUTPUT = logging.DEBUG + 5\n-\n logging.DTS_VIRTDUT_CMD = logging.INFO + 6\n logging.DTS_VIRTDUT_OUTPUT = logging.DEBUG + 6\n \n@@ -75,9 +72,6 @@ logging.addLevelName(logging.DTS_TESTER_CMD, 'DTS_TESTER_CMD')\n logging.addLevelName(logging.DTS_TESTER_OUTPUT, 'DTS_TESTER_OUTPUT')\n logging.addLevelName(logging.DTS_TESTER_RESULT, 'DTS_TESTER_RESULT')\n \n-logging.addLevelName(logging.DTS_IXIA_CMD, 'DTS_IXIA_CMD')\n-logging.addLevelName(logging.DTS_IXIA_OUTPUT, 'DTS_IXIA_OUTPUT')\n-\n logging.addLevelName(logging.DTS_VIRTDUT_CMD, 'VIRTDUT_CMD')\n logging.addLevelName(logging.DTS_VIRTDUT_OUTPUT, 'VIRTDUT_OUTPUT')\n \n@@ -140,12 +134,6 @@ class BaseLoggerAdapter(logging.LoggerAdapter):\n def suite_tester_output(self, msg, *args, **kwargs):\n self.log(logging.SUITE_TESTER_OUTPUT, msg, *args, **kwargs)\n \n- def dts_ixia_cmd(self, msg, *args, **kwargs):\n- self.log(logging.DTS_IXIA_CMD, msg, *args, **kwargs)\n-\n- def dts_ixia_output(self, msg, *args, **kwargs):\n- self.log(logging.DTS_IXIA_OUTPUT, msg, *args, **kwargs)\n-\n def dts_virtdut_cmd(self, msg, *args, **kwargs):\n self.log(logging.DTS_VIRTDUT_CMD, msg, *args, **kwargs)\n \n@@ -174,8 +162,6 @@ class ColorHandler(logging.StreamHandler):\n logging.DTS_TESTER_CMD: '', # SYSTEM\n logging.SUITE_DUT_CMD: '', # SYSTEM\n logging.SUITE_TESTER_CMD: '', # SYSTEM\n- logging.DTS_IXIA_CMD: '', # SYSTEM\n- logging.DTS_IXIA_OUTPUT: '', # SYSTEM\n logging.DTS_PKTGEN_CMD: '', # SYSTEM\n logging.DTS_PKTGEN_OUTPUT: '', # SYSTEM\n logging.DTS_VIRTDUT_CMD: '', # SYSTEM\n@@ -317,9 +303,6 @@ class DTSLOG(BaseLoggerAdapter):\n self.info_lvl = logging.DTS_TESTER_CMD\n self.debug_lvl = logging.DTS_TESTER_OUTPUT\n self.warn_lvl = logging.DTS_TESTER_RESULT\n- elif crb.startswith('ixia'):\n- self.info_lvl = logging.DTS_IXIA_CMD\n- self.debug_lvl = logging.DTS_IXIA_OUTPUT\n elif crb.startswith('pktgen'):\n self.info_lvl = logging.DTS_PKTGEN_CMD\n self.debug_lvl = logging.DTS_PKTGEN_OUTPUT\n@@ -352,9 +335,6 @@ class DTSLOG(BaseLoggerAdapter):\n elif crb == 'tester':\n self.info_lvl = logging.SUITE_TESTER_CMD\n self.debug_lvl = logging.SUITE_TESTER_OUTPUT\n- elif crb == 'ixia':\n- self.info_lvl = logging.DTS_IXIA_CMD\n- self.debug_lvl = logging.DTS_IXIA_OUTPUT\n elif crb == 'pktgen':\n self.info_lvl = logging.DTS_PKTGEN_CMD\n self.debug_lvl = logging.DTS_PKTGEN_OUTPUT\ndiff --git a/framework/project_dpdk.py b/framework/project_dpdk.py\nindex d96f8d63..51d32229 100644\n--- a/framework/project_dpdk.py\n+++ b/framework/project_dpdk.py\n@@ -40,7 +40,7 @@ from crb import Crb\n from dut import Dut\n from tester import Tester\n from logger import getLogger\n-from settings import IXIA, DRIVERS\n+from settings import DRIVERS\n from utils import RED\n \n \n@@ -707,16 +707,6 @@ class DPDKtester(Tester):\n self.tester_prerequisites()\n \n self.set_promisc()\n- # use software pktgen for performance test\n- if perf_test is True:\n- try:\n- if self.crb[IXIA] is not None:\n- self.logger.info(\"Use hardware packet generator\")\n- except Exception as e:\n- self.logger.warning(\"Use default software pktgen\")\n- out = self.send_expect(\"ls /root/igb_uio.ko\", \"# \")\n- assert (\"No such file or directory\" not in out), \"Can not find /root/igb_uio.ko for performance\"\n- self.setup_memory()\n \n self.stage = \"post-init\"\n \ndiff --git a/framework/settings.py b/framework/settings.py\nindex fe7c01b5..c08b8709 100644\n--- a/framework/settings.py\n+++ b/framework/settings.py\n@@ -226,7 +226,6 @@ TIMEOUT = 15\n \"\"\"\n Global macro for dts.\n \"\"\"\n-IXIA = \"ixia\"\n PKTGEN = \"pktgen\"\n PKTGEN_DPDK = \"dpdk\"\n PKTGEN_TREX = \"trex\"\ndiff --git a/framework/tester.py b/framework/tester.py\nindex ec233b8a..8f6e97ae 100644\n--- a/framework/tester.py\n+++ b/framework/tester.py\n@@ -38,10 +38,9 @@ import subprocess\n import os\n from time import sleep\n from settings import NICS, load_global_setting, PERF_SETTING\n-from settings import IXIA, USERNAME, PKTGEN, PKTGEN_GRP\n+from settings import USERNAME, PKTGEN, PKTGEN_GRP\n from crb import Crb\n from net_device import GetNicObj\n-from etgen import IxiaPacketGenerator, SoftwarePacketGenerator\n import random\n from utils import (GREEN, convert_int2ip, convert_ip2int,\n check_crb_python_version)\n@@ -78,7 +77,6 @@ class Tester(Crb):\n self.bgItf = ''\n self.re_run_time = 0\n self.pktgen = None\n- self.ixia_packet_gen = None\n self.tmp_scapy_module_dir = '/tmp/dep'\n # prepare for scapy env\n self.scapy_sessions_li = list()\n@@ -130,10 +128,7 @@ class Tester(Crb):\n if self.it_uses_external_generator():\n if self.is_pktgen:\n self.pktgen_init()\n- else:\n- self.ixia_packet_gen = IxiaPacketGenerator(self)\n return\n- self.packet_gen = SoftwarePacketGenerator(self)\n \n def set_re_run(self, re_run_time):\n \"\"\"\n@@ -183,20 +178,12 @@ class Tester(Crb):\n try:\n # if pktgen_group is set, take pktgen config file as first selection\n if self.is_pktgen:\n- return True \n- elif self.crb[IXIA] is not None:\n return True\n except Exception as e:\n return False\n \n return False\n \n- def get_external_traffic_generator(self):\n- \"\"\"\n- Return IXIA object.\n- \"\"\"\n- return self.crb[IXIA]\n-\n def it_uses_external_generator(self):\n \"\"\"\n Check whether IXIA generator is ready for performance test.\n@@ -456,8 +443,6 @@ class Tester(Crb):\n if self.it_uses_external_generator():\n if self.is_pktgen:\n self._scan_pktgen_ports()\n- else:\n- self.ports_info.extend(self.ixia_packet_gen.get_ports())\n self.save_serializer_ports()\n \n for port_info in self.ports_info:\n@@ -572,8 +557,6 @@ class Tester(Crb):\n self.ports_info[localPort]['pci'], mac, ipv6)\n elif self.ports_info[localPort]['type'].lower() == 'trex':\n return \"Not implemented yet\"\n- elif self.ports_info[localPort]['type'].lower() in 'ixia':\n- return self.ixia_packet_gen.send_ping6(self.ports_info[localPort]['pci'], mac, ipv6)\n else:\n return self.send_expect(\"ping6 -w 5 -c 5 -A %s%%%s\" % (ipv6, self.ports_info[localPort]['intf']), \"# \", 10)\n \n@@ -671,60 +654,6 @@ class Tester(Crb):\n \n return out\n \n- def traffic_generator_throughput(self, portList, rate_percent=100, delay=5):\n- \"\"\"\n- Run throughput performance test on specified ports.\n- \"\"\"\n- if self.check_port_list(portList, 'ixia'):\n- return self.ixia_packet_gen.throughput(portList, rate_percent, delay)\n- if not self.check_port_list(portList):\n- self.logger.warning(\"exception by mixed port types\")\n- return None\n- return self.packet_gen.throughput(portList, rate_percent)\n-\n- def verify_packet_order(self, portList, delay):\n- if self.check_port_list(portList, 'ixia'):\n- return self.ixia_packet_gen.is_packet_ordered(portList, delay)\n- else:\n- self.logger.warning(\"Only ixia port support check verify packet order function\")\n- return False\n-\n- def run_rfc2544(self, portlist, delay=120, permit_loss_rate=0):\n- \"\"\"\n- test_rate: the line rate we are going to test.\n- \"\"\"\n- test_rate = float(100)\n-\n- self.logger.info(\"test rate: %f \" % test_rate)\n- loss_rate, tx_num, rx_num = self.traffic_generator_loss(portlist, test_rate, delay)\n- while loss_rate > permit_loss_rate:\n- test_rate = float(1 - loss_rate) * test_rate\n- loss_rate, tx_num, rx_num = self.traffic_generator_loss(portlist, test_rate, delay)\n-\n- self.logger.info(\"zero loss rate is %s\" % test_rate)\n- return test_rate, tx_num, rx_num\n-\n-\n- def traffic_generator_loss(self, portList, ratePercent, delay=60):\n- \"\"\"\n- Run loss performance test on specified ports.\n- \"\"\"\n- if self.check_port_list(portList, 'ixia'):\n- return self.ixia_packet_gen.loss(portList, ratePercent, delay)\n- elif not self.check_port_list(portList):\n- self.logger.warning(\"exception by mixed port types\")\n- return None\n- return self.packet_gen.loss(portList, ratePercent)\n-\n- def traffic_generator_latency(self, portList, ratePercent=100, delay=5):\n- \"\"\"\n- Run latency performance test on specified ports.\n- \"\"\"\n- if self.check_port_list(portList, 'ixia'):\n- return self.ixia_packet_gen.latency(portList, ratePercent, delay)\n- else:\n- return None\n-\n def parallel_transmit_ptks(self, pkt=None, intf='', send_times=1, interval=0.01):\n \"\"\"\n Callable function for parallel processes\n@@ -824,20 +753,6 @@ class Tester(Crb):\n \n return True\n \n- def extend_external_packet_generator(self, clazz, instance):\n- \"\"\"\n- Update packet generator function, will implement later.\n- \"\"\"\n- # packet generator has forbidden suite class to override parent class methods \n- if self.is_pktgen:\n- return\n- # discard this in future\n- if self.it_uses_external_generator():\n- self.ixia_packet_gen.__class__ = clazz\n- current_attrs = instance.__dict__\n- instance.__dict__ = self.ixia_packet_gen.__dict__\n- instance.__dict__.update(current_attrs)\n-\n def tcpdump_sniff_packets(self, intf, count=0, filters=None, lldp_forbid=True):\n \"\"\"\n Wrapper for packet module sniff_packets\n@@ -879,9 +794,6 @@ class Tester(Crb):\n if 'start_trex' in list(self.pktgen.conf.keys()):\n self.restore_trex_interfaces()\n self.pktgen = None\n- elif self.ixia_packet_gen:\n- self.ixia_packet_gen.close()\n- self.ixia_packet_gen = None\n \n if self.scapy_sessions_li:\n for i in self.scapy_sessions_li:\n", "prefixes": [ "V2", "1/6" ] }{ "id": 97591, "url": "