get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87193,
    "url": "https://patches.dpdk.org/api/patches/87193/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/20210125084414.8503-18-yufengx.mo@intel.com/",
    "project": {
        "id": 3,
        "url": "https://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210125084414.8503-18-yufengx.mo@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20210125084414.8503-18-yufengx.mo@intel.com",
    "date": "2021-01-25T08:44:04",
    "name": "[V1,17/27] framework/pktgen: enable ixNetwork",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "6f00d2cca536f4d3a04ccbb46e1bb3051251790c",
    "submitter": {
        "id": 1342,
        "url": "https://patches.dpdk.org/api/people/1342/?format=api",
        "name": "Yufen.Mo",
        "email": "yufengx.mo@intel.com"
    },
    "delegate": {
        "id": 23642,
        "url": "https://patches.dpdk.org/api/users/23642/?format=api",
        "username": "lijuantu",
        "first_name": "LIjuan",
        "last_name": "Tu",
        "email": "lijuan.tu@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dts/patch/20210125084414.8503-18-yufengx.mo@intel.com/mbox/",
    "series": [
        {
            "id": 14926,
            "url": "https://patches.dpdk.org/api/series/14926/?format=api",
            "web_url": "https://patches.dpdk.org/project/dts/list/?series=14926",
            "date": "2021-01-25T08:43:47",
            "name": "dts: enable IxNetwork and enhance perf testing",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/14926/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87193/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/87193/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 B6C0DA052A;\n\tMon, 25 Jan 2021 09:51:58 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id B1DD2140E19;\n\tMon, 25 Jan 2021 09:51:58 +0100 (CET)",
            "from mga18.intel.com (mga18.intel.com [134.134.136.126])\n by mails.dpdk.org (Postfix) with ESMTP id B4CE3140DFD\n for <dts@dpdk.org>; Mon, 25 Jan 2021 09:51:56 +0100 (CET)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Jan 2021 00:51:48 -0800",
            "from dpdk-moyufen06.sh.intel.com ([10.67.116.208])\n by fmsmga001.fm.intel.com with ESMTP; 25 Jan 2021 00:51:47 -0800"
        ],
        "IronPort-SDR": [
            "\n 40vJ2ymQBRYZ24qVvZVqksd8XyhW4zpoinOcQPWCmlliDtuuwXGBWvYnlDArkLG+lP2nwdnUac\n Qf2t3fu4jRqw==",
            "\n V/BY+G9ZCTe0zc5as5X2UBS+hlEcALN9RaIrYa2DgfzFb2yWtnmg56903a5kf2IAYg0mCr8JdV\n GcItePqSAbfA=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9874\"; a=\"167366434\"",
            "E=Sophos;i=\"5.79,373,1602572400\"; d=\"scan'208\";a=\"167366434\"",
            "E=Sophos;i=\"5.79,373,1602572400\"; d=\"scan'208\";a=\"471978515\""
        ],
        "X-ExtLoop1": "1",
        "From": "yufengmx <yufengx.mo@intel.com>",
        "To": "dts@dpdk.org,\n\tlijuan.tu@intel.com",
        "Cc": "yufengmx <yufengx.mo@intel.com>",
        "Date": "Mon, 25 Jan 2021 16:44:04 +0800",
        "Message-Id": "<20210125084414.8503-18-yufengx.mo@intel.com>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20210125084414.8503-1-yufengx.mo@intel.com>",
        "References": "<20210125084414.8503-1-yufengx.mo@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dts] [PATCH V1 17/27] framework/pktgen: enable ixNetwork",
        "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": "enable ixNetwork rfc2544 testing scenario.\n\nSigned-off-by: yufengmx <yufengx.mo@intel.com>\n---\n framework/pktgen_ixia_network.py | 224 +++++++++++++++++++++++++++++++\n 1 file changed, 224 insertions(+)\n create mode 100644 framework/pktgen_ixia_network.py",
    "diff": "diff --git a/framework/pktgen_ixia_network.py b/framework/pktgen_ixia_network.py\nnew file mode 100644\nindex 00000000..3cca2578\n--- /dev/null\n+++ b/framework/pktgen_ixia_network.py\n@@ -0,0 +1,224 @@\n+# BSD LICENSE\n+#\n+# Copyright(c) 2010-2021 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+import os\n+import time\n+import traceback\n+from pprint import pformat\n+\n+from pktgen_base import PacketGenerator, PKTGEN_IXIA_NETWORK\n+\n+\n+class IxNetworkPacketGenerator(PacketGenerator):\n+    \"\"\"\n+    ixNetwork packet generator\n+    \"\"\"\n+    def __init__(self, tester):\n+        self.pktgen_type = PKTGEN_IXIA_NETWORK\n+        self._conn = None\n+        # ixNetwork configuration information of dts\n+        conf_inst = self._get_generator_conf_instance()\n+        self.conf = conf_inst.load_pktgen_config()\n+        # ixNetwork port configuration\n+        self._traffic_ports = []\n+        self._ports = []\n+        self._rx_ports = []\n+\n+        super(IxNetworkPacketGenerator, self).__init__(tester)\n+\n+    def get_ports(self):\n+        ''' used for ixNetwork packet generator '''\n+        return self._conn.get_ports()\n+\n+    def _prepare_generator(self):\n+        ''' connect with ixNetwork api server '''\n+        try:\n+            self._connect(self.conf)\n+        except Exception as e:\n+            msg = \"failed to connect to ixNetwork api server\"\n+            raise Exception(msg)\n+\n+    def _connect(self, conf):\n+        # initialize ixNetwork class\n+        from ixia_network import IxNetwork\n+        self._conn = IxNetwork(self.pktgen_type, conf, self.logger)\n+        for p in self._conn.get_ports():\n+            self._ports.append(p)\n+\n+        self.logger.debug(self._ports)\n+\n+    def _disconnect(self):\n+        '''\n+        disconnect with ixNetwork api server\n+        '''\n+        try:\n+            self._remove_all_streams()\n+            self._conn.disconnect()\n+        except Exception as e:\n+            msg = 'Error disconnecting: %s' % e\n+            self.logger.error(msg)\n+        self._conn = None\n+\n+    def quit_generator(self):\n+        ''' close ixNetwork session '''\n+        if self._conn is not None:\n+            self._disconnect()\n+\n+    def _get_port_pci(self, port_id):\n+        '''\n+        get ixNetwork port pci address\n+        '''\n+        for pktgen_port_id, info in enumerate(self._ports):\n+            if pktgen_port_id == port_id:\n+                _pci = info.get('pci')\n+                return _pci\n+        else:\n+            return None\n+\n+    def _get_gen_port(self, pci):\n+        '''\n+        get port management id of the packet generator\n+        '''\n+        for pktgen_port_id, info in enumerate(self._ports):\n+            _pci = info.get('pci')\n+            if _pci == pci:\n+                return pktgen_port_id\n+        else:\n+            return -1\n+\n+    def _is_gen_port(self, pci):\n+        '''\n+        check if a pci address is managed by the packet generator\n+        '''\n+        for name, _port_obj in self._conn.ports.items():\n+            _pci = _port_obj.info['pci_addr']\n+            self.logger.debug((_pci, pci))\n+            if _pci == pci:\n+                return True\n+        else:\n+            return False\n+\n+    def _get_ports(self):\n+        \"\"\"\n+        Return self ports information\n+        \"\"\"\n+        ports = []\n+        for idx in range(len(self._ports)):\n+            ports.append('IXIA:%d' % idx)\n+        return ports\n+\n+    def send_ping6(self, pci, mac, ipv6):\n+        ''' Send ping6 packet from IXIA ports. '''\n+        return self._conn.send_ping6(pci, mac, ipv6)\n+\n+    def _clear_streams(self):\n+        ''' clear streams in `PacketGenerator` '''\n+        # if streams has been attached, remove them from ixNetwork api server.\n+        self._remove_all_streams()\n+\n+    def _remove_all_streams(self):\n+        '''\n+        remove all stream deployed on the packet generator\n+        '''\n+        if not self.get_streams():\n+            return\n+\n+    def _check_options(self, opts={}):\n+        return True\n+\n+    def _retrieve_port_statistic(self, stream_id, mode):\n+        ''' ixNetwork traffic statistics '''\n+        stats = self._conn.get_stats(self._traffic_ports, mode)\n+        stream = self._get_stream(stream_id)\n+        self.logger.debug(pformat(stream))\n+        self.logger.debug(pformat(stats))\n+        if mode == 'rfc2544':\n+            return stats\n+        else:\n+            msg = \"not support mode <{0}>\".format(mode)\n+            raise Exception(msg)\n+\n+    ##########################################################################\n+    #\n+    #  class ``PacketGenerator`` abstract methods should be implemented here\n+    #\n+    ##########################################################################\n+    def _prepare_transmission(self, stream_ids=[], latency=False):\n+        ''' add one/multiple streams in one/multiple ports '''\n+        port_config = {}\n+\n+        for stream_id in stream_ids:\n+            stream = self._get_stream(stream_id)\n+            tx_port = stream.get('tx_port')\n+            rx_port = stream.get('rx_port')\n+            pcap_file = stream.get('pcap_file')\n+            # save port id list\n+            if tx_port not in self._traffic_ports:\n+                self._traffic_ports.append(tx_port)\n+            if rx_port not in self._traffic_ports:\n+                self._traffic_ports.append(rx_port)\n+            if rx_port not in self._rx_ports:\n+                self._rx_ports.append(rx_port)\n+            # set all streams in one port to do batch configuration\n+            options = stream['options']\n+            if tx_port not in list(port_config.keys()):\n+                port_config[tx_port] = []\n+            config = {}\n+            config.update(options)\n+            # get stream rate percent\n+            stream_config = options.get('stream_config')\n+            rate_percent = stream_config.get('rate')\n+            # set port list input parameter of ixNetwork class\n+            ixia_option = [tx_port, rx_port, pcap_file, options]\n+            port_config[tx_port].append(ixia_option)\n+\n+        self.rate_percent = rate_percent\n+        if not port_config:\n+            msg = 'no stream options for ixNetwork packet generator'\n+            raise Exception(msg)\n+\n+        port_lists = []\n+        for port_id, option in port_config.items():\n+            port_lists += option\n+        self._conn.prepare_ixia_network_stream(port_lists)\n+\n+    def _start_transmission(self, stream_ids, options={}):\n+        # run ixNetwork api server\n+        try:\n+            # Start traffic on port(s)\n+            self.logger.info(\"begin traffic ......\")\n+            self._conn.start(options)\n+        except Exception as e:\n+            self.logger.error(traceback.format_exc())\n+            self.logger.error(e)\n+\n+    def _stop_transmission(self, stream_id):\n+        if self._traffic_ports:\n+            self.logger.info(\"traffic completed. \")\n",
    "prefixes": [
        "V1",
        "17/27"
    ]
}