get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 97591,
    "url": "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"
    ]
}