get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 135706,
    "url": "http://patches.dpdk.org/api/patches/135706/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240103125438.182098-1-Luca.Vizzarro@arm.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240103125438.182098-1-Luca.Vizzarro@arm.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240103125438.182098-1-Luca.Vizzarro@arm.com",
    "date": "2024-01-03T12:54:37",
    "name": "dts: improve documentation",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e61e770d54042f21c5f8aef0cfe370a8c1cce76c",
    "submitter": {
        "id": 3197,
        "url": "http://patches.dpdk.org/api/people/3197/?format=api",
        "name": "Luca Vizzarro",
        "email": "luca.vizzarro@arm.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240103125438.182098-1-Luca.Vizzarro@arm.com/mbox/",
    "series": [
        {
            "id": 30712,
            "url": "http://patches.dpdk.org/api/series/30712/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30712",
            "date": "2024-01-03T12:54:37",
            "name": "dts: improve documentation",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/30712/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/135706/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/135706/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-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 DFEFD437DF;\n\tWed,  3 Jan 2024 13:54:56 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 783CA402DD;\n\tWed,  3 Jan 2024 13:54:56 +0100 (CET)",
            "from foss.arm.com (foss.arm.com [217.140.110.172])\n by mails.dpdk.org (Postfix) with ESMTP id 682BB402DC\n for <dev@dpdk.org>; Wed,  3 Jan 2024 13:54:54 +0100 (CET)",
            "from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14])\n by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7E6B1C15;\n Wed,  3 Jan 2024 04:55:39 -0800 (PST)",
            "from localhost.localdomain (unknown [172.31.20.19])\n by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 9B1D13F64C;\n Wed,  3 Jan 2024 04:54:52 -0800 (PST)"
        ],
        "From": "Luca Vizzarro <Luca.Vizzarro@arm.com>",
        "To": "dev@dpdk.org",
        "Cc": "Luca Vizzarro <Luca.Vizzarro@arm.com>,\n Paul Szczepanek <Paul.Szczepanek@arm.com>,\n Thomas Monjalon <thomas@monjalon.net>, Lijuan Tu <lijuan.tu@intel.com>,\n\t=?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "Subject": "[PATCH] dts: improve documentation",
        "Date": "Wed,  3 Jan 2024 12:54:37 +0000",
        "Message-Id": "<20240103125438.182098-1-Luca.Vizzarro@arm.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Improve instructions for installing dependencies, configuring and\nlaunching the project. Finally, document the configuration schema\nby adding more comments to the example and documenting every\nproperty and definition.\n\nReviewed-by: Paul Szczepanek <Paul.Szczepanek@arm.com>\nSigned-off-by: Luca Vizzarro <Luca.Vizzarro@arm.com>\n---\n .mailmap                 |   1 +\n doc/guides/tools/dts.rst | 255 +++++++++++++++++++++++++++++++++------\n dts/conf.yaml            |  31 +++--\n 3 files changed, 240 insertions(+), 47 deletions(-)",
    "diff": "diff --git a/.mailmap b/.mailmap\nindex ab0742a382..6326e28d08 100644\n--- a/.mailmap\n+++ b/.mailmap\n@@ -815,6 +815,7 @@ Louise Kilheeney <louise.kilheeney@intel.com>\n Louis Luo <llouis@vmware.com>\n Louis Peens <louis.peens@corigine.com> <louis.peens@netronome.com>\n Luca Boccassi <luca.boccassi@microsoft.com> <bluca@debian.org> <luca.boccassi@gmail.com> <lboccass@brocade.com> <luca.boccassi@intl.att.com>\n+Luca Vizzarro <Luca.Vizzarro@arm.com>\n Luc Pelletier <lucp.at.work@gmail.com>\n Lukasz Bartosik <lbartosik@marvell.com>\n Lukasz Czapnik <lukasz.czapnik@intel.com>\ndiff --git a/doc/guides/tools/dts.rst b/doc/guides/tools/dts.rst\nindex 32c18ee472..31495cad51 100644\n--- a/doc/guides/tools/dts.rst\n+++ b/doc/guides/tools/dts.rst\n@@ -91,7 +91,7 @@ Setting up DTS environment\n \n    .. code-block:: console\n \n-      poetry install\n+      poetry install --no-root\n       poetry shell\n \n #. **SSH Connection**\n@@ -189,72 +189,73 @@ Running DTS\n -----------\n \n DTS needs to know which nodes to connect to and what hardware to use on those nodes.\n-Once that's configured, DTS needs a DPDK tarball and it's ready to run.\n+Once that's configured, DTS needs a DPDK tarball or a git ref ID and it's ready to run.\n \n Configuring DTS\n ~~~~~~~~~~~~~~~\n \n-DTS configuration is split into nodes and executions and build targets within executions.\n-By default, DTS will try to use the ``dts/conf.yaml`` config file,\n-which is a template that illustrates what can be configured in DTS:\n-\n-  .. literalinclude:: ../../../dts/conf.yaml\n-     :language: yaml\n-     :start-at: executions:\n-\n+DTS configuration is split into nodes and executions and build targets within executions,\n+and follows a defined schema as described in `Configuration Schema`_.\n+By default, DTS will try to use the ``dts/conf.yaml`` :ref:`config file <configuration_schema_example>`,\n+which is a template that illustrates what can be configured in DTS.\n \n The user must have :ref:`administrator privileges <sut_admin_user>`\n which don't require password authentication.\n-The other fields are mostly self-explanatory\n-and documented in more detail in ``dts/framework/config/conf_yaml_schema.json``.\n \n DTS Execution\n ~~~~~~~~~~~~~\n \n-DTS is run with ``main.py`` located in the ``dts`` directory after entering Poetry shell::\n+DTS is run with ``main.py`` located in the ``dts`` directory after entering Poetry shell:\n+\n+.. code-block:: console\n \n-   usage: main.py [-h] [--config-file CONFIG_FILE] [--output-dir OUTPUT_DIR] [-t TIMEOUT]\n-                  [-v VERBOSE] [-s SKIP_SETUP] [--tarball TARBALL]\n-                  [--compile-timeout COMPILE_TIMEOUT] [--test-cases TEST_CASES]\n-                  [--re-run RE_RUN]\n+   (dts-py3.10) $ ./main.py --help\n+   usage: main.py [-h] [--config-file CONFIG_FILE] [--output-dir OUTPUT_DIR] [-t TIMEOUT] [-v VERBOSE]\n+                  [-s SKIP_SETUP] [--tarball TARBALL] [--compile-timeout COMPILE_TIMEOUT]\n+                  [--test-cases TEST_CASES] [--re-run RE_RUN]\n \n-   Run DPDK test suites. All options may be specified with the environment variables provided in\n-   brackets. Command line arguments have higher priority.\n+   Run DPDK test suites. All options may be specified with the environment variables provided in brackets.\n+   Command line arguments have higher priority.\n \n    options:\n      -h, --help            show this help message and exit\n      --config-file CONFIG_FILE\n-                           [DTS_CFG_FILE] configuration file that describes the test cases, SUTs\n-                           and targets. (default: conf.yaml)\n+                           [DTS_CFG_FILE] configuration file that describes the test cases, SUTs and targets.\n+                           (default: conf.yaml)\n      --output-dir OUTPUT_DIR, --output OUTPUT_DIR\n-                           [DTS_OUTPUT_DIR] Output directory where dts logs and results are\n-                           saved. (default: output)\n+                           [DTS_OUTPUT_DIR] Output directory where dts logs and results are saved. (default:\n+                           output)\n      -t TIMEOUT, --timeout TIMEOUT\n-                           [DTS_TIMEOUT] The default timeout for all DTS operations except for\n-                           compiling DPDK. (default: 15)\n+                           [DTS_TIMEOUT] The default timeout for all DTS operations except for compiling DPDK.\n+                           (default: 15)\n      -v VERBOSE, --verbose VERBOSE\n-                           [DTS_VERBOSE] Set to 'Y' to enable verbose output, logging all\n-                           messages to the console. (default: N)\n+                           [DTS_VERBOSE] Set to 'Y' to enable verbose output, logging all messages to the\n+                           console. (default: N)\n      -s SKIP_SETUP, --skip-setup SKIP_SETUP\n-                           [DTS_SKIP_SETUP] Set to 'Y' to skip all setup steps on SUT and TG\n-                           nodes. (default: N)\n-     --tarball TARBALL, --snapshot TARBALL\n-                           [DTS_DPDK_TARBALL] Path to DPDK source code tarball which will be\n-                           used in testing. (default: dpdk.tar.xz)\n+                           [DTS_SKIP_SETUP] Set to 'Y' to skip all setup steps on SUT and TG nodes. (default: N)\n+     --tarball TARBALL, --snapshot TARBALL, --git-ref TARBALL\n+                           [DTS_DPDK_TARBALL] Path to DPDK source code tarball or a git commit ID, tag ID or\n+                           tree ID to test. To test local changes, first commit them, then use the commit ID\n+                           with this option. (default: dpdk.tar.xz)\n      --compile-timeout COMPILE_TIMEOUT\n                            [DTS_COMPILE_TIMEOUT] The timeout for compiling DPDK. (default: 1200)\n      --test-cases TEST_CASES\n-                           [DTS_TESTCASES] Comma-separated list of test cases to execute.\n-                           Unknown test cases will be silently ignored. (default: )\n+                           [DTS_TESTCASES] Comma-separated list of test cases to execute. Unknown test cases\n+                           will be silently ignored. (default: )\n      --re-run RE_RUN, --re_run RE_RUN\n-                           [DTS_RERUN] Re-run each test case the specified amount of times if a\n-                           test failure occurs (default: 0)\n+                           [DTS_RERUN] Re-run each test case the specified amount of times if a test failure\n+                           occurs (default: 0)\n \n \n The brackets contain the names of environment variables that set the same thing.\n-The minimum DTS needs is a config file and a DPDK tarball.\n+The minimum DTS needs is a config file and a DPDK tarball or git ref ID.\n You may pass those to DTS using the command line arguments or use the default paths.\n \n+Example command for running DTS with the template configuration and DPDK tag v23.07:\n+\n+.. code-block:: console\n+\n+   (dts-py3.10) $ ./main.py --git-ref v23.07\n \n DTS Results\n ~~~~~~~~~~~\n@@ -335,3 +336,183 @@ There are three tools used in DTS to help with code checking, style and formatti\n These three tools are all used in ``devtools/dts-check-format.sh``,\n the DTS code check and format script.\n Refer to the script for usage: ``devtools/dts-check-format.sh -h``.\n+\n+Configuration Schema\n+--------------------\n+\n+Definitions\n+~~~~~~~~~~~\n+\n+_`Node name`\n+   *string* – A unique identifier for a node. **Examples**: ``SUT1``, ``TG1``.\n+\n+_`ARCH`\n+   *string* – The CPU architecture. **Supported values**: ``x86_64``, ``arm64``, ``ppc64le``.\n+\n+_`CPU`\n+   *string* – The CPU microarchitecture. Use ``native`` for x86. **Supported values**: ``native``, ``armv8a``, ``dpaa2``, ``thunderx``, ``xgene1``.\n+\n+_`OS`\n+   *string* – The operating system. **Supported values**: ``linux``.\n+\n+_`Compiler`\n+   *string* – The compiler used for building DPDK. **Supported values**: ``gcc``, ``clang``, ``icc``, ``mscv``.\n+\n+_`Build target`\n+   *object* – Build targets supported by DTS for building DPDK, described as:\n+\n+   ==================== =========================================================================================\n+   ``arch``             See `ARCH`_\n+   ``os``               See `OS`_\n+   ``cpu``              See `CPU`_\n+   ``compiler``         See `Compiler`_\n+   ``compiler_wrapper`` *string* – Value prepended to the CC variable for the DPDK build.\n+\n+                        **Example**: ``ccache``\n+   ==================== =========================================================================================\n+\n+_`hugepages`\n+   *object* – hugepages described as:\n+\n+   ==================== ================================================================\n+   ``amount``           *integer* – The amount of hugepages to configure.\n+\n+                        Hugepage size will be the system default.\n+   ``force_first_numa`` (*optional*, defaults to ``false``) – If ``true``, it forces the\n+\n+                        configuration of hugepages on the first NUMA node.\n+   ==================== ================================================================\n+\n+_`Network port`\n+   *object* – the NIC port described as:\n+\n+   ====================== =================================================================================\n+   ``pci``                *string* – the local PCI address of the port. **Example**: ``0000:00:08.0``\n+   ``os_driver_for_dpdk`` | *string* – this port's device driver when using with DPDK\n+                          | When setting up the SUT, DTS will bind the network device to this driver\n+                          | for compatibility with DPDK.\n+\n+                          **Examples**: ``vfio-pci``, ``mlx5_core``\n+   ``os_driver``          | *string* – this port's device driver when **not** using with DPDK\n+                          | When tearing down the tests on the SUT, DTS will bind the network device\n+                          | *back* to this driver. This driver is meant to be the one that the SUT would\n+                          | normally use for this device, or whichever driver it is preferred to leave the\n+                          | device bound to after testing.\n+\n+                          **Examples**: ``i40e``, ``mlx5_core``\n+   ``peer_node``          *string* – the name of the peer node connected to this port.\n+   ``peer_pci``           *string* – the PCI address of the peer node port. **Example**: ``000a:01:00.1``\n+   ====================== =================================================================================\n+\n+_`Test suite`\n+   *string* – name of the test suite to run. **Examples**: ``hello_world``, ``os_udp``\n+\n+_`Test target`\n+   *object* – selects specific test cases to run from a test suite. Object is described as follows:\n+\n+   ========= =============================================================================================\n+   ``suite`` See `Test suite`_\n+   ``cases`` (*optional*) *array* of *string* – list of the selected test cases in the test suite to run.\n+\n+             Unknown test cases will be silently ignored.\n+   ========= =============================================================================================\n+\n+Properties\n+~~~~~~~~~~\n+\n+The configuration requires listing all the execution environments and nodes\n+involved in the testing. These can be defined with the following properties:\n+\n+``executions``\n+   *array* listing the execution environments. Each entry is described as per the following object:\n+\n+   +----------------------------+-------------------------------------------------------------------+\n+   | ``build_targets``          | *array* of `Build target`_                                        |\n+   +----------------------------+-------------------------------------------------------------------+\n+   | ``perf``                   | *boolean* – Enable performance testing.                           |\n+   +----------------------------+-------------------------------------------------------------------+\n+   | ``func``                   | *boolean* – Enable functional testing.                            |\n+   +----------------------------+-------------------------------------------------------------------+\n+   | ``test_suites``            | *array* of **one of** `Test suite`_ **or** `Test target`_         |\n+   +----------------------------+-------------------------------------------------------------------+\n+   | ``skip_smoke_tests``       | (*optional*) *boolean* – Allows you to skip smoke testing         |\n+   |                            | if ``true``.                                                      |\n+   +----------------------------+-------------------------------------------------------------------+\n+   | ``system_under_test_node`` | System under test node specified with:                            |\n+   |                            +---------------+---------------------------------------------------+\n+   |                            | ``node_name`` | See `Node name`_                                  |\n+   |                            +---------------+---------------------------------------------------+\n+   |                            | ``vdevs``     | (*optional*) *array* of *string*                  |\n+   |                            |               |                                                   |\n+   |                            |               | List of virtual devices passed with the ``--vdev``|\n+   |                            |               | argument to DPDK. **Example**: ``crypto_openssl`` |\n+   +----------------------------+---------------+---------------------------------------------------+\n+   | ``traffic_generator_node`` | Node name for the traffic generator node.                         |\n+   +----------------------------+-------------------------------------------------------------------+\n+\n+``nodes``\n+   *array* listing the nodes. Each entry is described as per the following object:\n+\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``name``              | See `Node name`_                                                                      |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``hostname``          | *string* – The network hostname or IP address of this node.                           |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``user``              | *string* – The SSH user credential to use to login to this node.                      |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``password``          | (*optional*) *string* – The SSH password credential for this node.                    |\n+   |                       |                                                                                       |\n+   |                       | **NB**: Use only as last resort. SSH keys are **strongly** preferred.                 |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``arch``              | The architecture of this node. See `ARCH`_ for supported values.                      |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``os``                | The operating system of this node. See `OS`_ for supported values.                    |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``lcores``            | | (*optional*, defaults to 1) *string* – Comma-separated list of logical              |\n+   |                       | | cores to use. An empty string means use all lcores.                                 |\n+   |                       |                                                                                       |\n+   |                       | **Example**: ``1,2,3,4,5,18-22``                                                      |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``use_first_core``    | (*optional*, defaults to ``false``) *boolean*                                         |\n+   |                       |                                                                                       |\n+   |                       | Indicates whether DPDK should use only the first physical core or not.                |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``memory_channels``   | (*optional*, defaults to 1) *integer*                                                 |\n+   |                       |                                                                                       |\n+   |                       | The number of the memory channels to use.                                             |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``hugepages``         | (*optional*) See `hugepages`_. If unset, hugepages won't be configured                |\n+   |                       |                                                                                       |\n+   |                       | in favour of the system configuration.                                                |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``ports``             | | *array* of `Network port`_ – Describe ports that are **directly** paired with other |\n+   |                       | | nodes used in conjunction with this one. Both ends of the links must be             |\n+   |                       | | described. If there any inconsistencies DTS won't run.                              |\n+   |                       |                                                                                       |\n+   |                       | **Example**: port 1 of node ``SUT1`` is connected to port 1 of node ``TG1`` etc.      |\n+   +-----------------------+---------------------------------------------------------------------------------------+\n+   | ``traffic_generator`` | (*optional*) Traffic generator, if any, setup on this node described as:              |\n+   |                       +----------+----------------------------------------------------------------------------+\n+   |                       | ``type`` | *string* – **Supported values**: *SCAPY*                                   |\n+   +-----------------------+----------+----------------------------------------------------------------------------+\n+\n+.. _configuration_schema_example:\n+\n+Example\n+~~~~~~~\n+\n+The following example (which can be found in ``dts/conf.yaml``) sets up two nodes:\n+\n+* ``SUT1`` which is already setup with the DPDK build requirements and any other\n+  required for execution;\n+* ``TG1`` which already has Scapy installed in the system.\n+\n+And they both have two network ports which are physically connected to each other.\n+\n+.. note::\n+   This example assumes that you have setup SSH keys in both the system under test\n+   and traffic generator nodes.\n+\n+.. literalinclude:: ../../../dts/conf.yaml\n+   :language: yaml\n+   :start-at: executions:\n\\ No newline at end of file\ndiff --git a/dts/conf.yaml b/dts/conf.yaml\nindex 37967daea0..2d6fa38a2c 100644\n--- a/dts/conf.yaml\n+++ b/dts/conf.yaml\n@@ -1,65 +1,76 @@\n # SPDX-License-Identifier: BSD-3-Clause\n # Copyright 2022-2023 The DPDK contributors\n+# Copyright 2023 Arm Limited\n \n executions:\n+  # define one execution environment\n   - build_targets:\n       - arch: x86_64\n         os: linux\n         cpu: native\n+        # the combination of the following two makes CC=\"ccache gcc\"\n         compiler: gcc\n         compiler_wrapper: ccache\n-    perf: false\n-    func: true\n-    skip_smoke_tests: false # optional flag that allows you to skip smoke tests\n-    test_suites:\n+    perf: false # disable performance testing\n+    func: true # enable functional testing\n+    skip_smoke_tests: false\n+    test_suites: # the following test suites will be run in their entirety\n       - hello_world\n       - os_udp\n+    # The machine running the DPDK test executable\n     system_under_test_node:\n       node_name: \"SUT 1\"\n       vdevs: # optional; if removed, vdevs won't be used in the execution\n         - \"crypto_openssl\"\n+    # Traffic generator node to use for this execution environment\n     traffic_generator_node: \"TG 1\"\n nodes:\n+  # Define a system under test node, having two network ports physically\n+  # connected to the corresponding ports in TG 1 (the peer node)\n   - name: \"SUT 1\"\n     hostname: sut1.change.me.localhost\n     user: dtsuser\n     arch: x86_64\n     os: linux\n-    lcores: \"\"\n-    use_first_core: false\n-    memory_channels: 4\n+    lcores: \"\" # use all the available logical cores\n+    use_first_core: false # tells DPDK to use any physical core\n+    memory_channels: 4 # tells DPDK to use 4 memory channels\n     hugepages:  # optional; if removed, will use system hugepage configuration\n         amount: 256\n         force_first_numa: false\n     ports:\n+      # sets up the physical link between \"SUT 1\"@000:00:08.0 and \"TG 1\"@0000:00:08.0\n       - pci: \"0000:00:08.0\"\n         os_driver_for_dpdk: vfio-pci # OS driver that DPDK will use\n-        os_driver: i40e\n+        os_driver: i40e              # OS driver to bind when the tests are not running\n         peer_node: \"TG 1\"\n         peer_pci: \"0000:00:08.0\"\n+      # sets up the physical link between \"SUT 1\"@000:00:08.1 and \"TG 1\"@0000:00:08.1\n       - pci: \"0000:00:08.1\"\n         os_driver_for_dpdk: vfio-pci\n         os_driver: i40e\n         peer_node: \"TG 1\"\n         peer_pci: \"0000:00:08.1\"\n+  # Define a Scapy traffic generator node, having two network ports\n+  # physically connected to the corresponding ports in SUT 1 (the peer node).\n   - name: \"TG 1\"\n     hostname: tg1.change.me.localhost\n     user: dtsuser\n     arch: x86_64\n     os: linux\n-    lcores: \"\"\n     ports:\n+      # sets up the physical link between \"TG 1\"@000:00:08.0 and \"SUT 1\"@0000:00:08.0\n       - pci: \"0000:00:08.0\"\n         os_driver_for_dpdk: rdma\n         os_driver: rdma\n         peer_node: \"SUT 1\"\n         peer_pci: \"0000:00:08.0\"\n+      # sets up the physical link between \"SUT 1\"@000:00:08.0 and \"TG 1\"@0000:00:08.0\n       - pci: \"0000:00:08.1\"\n         os_driver_for_dpdk: rdma\n         os_driver: rdma\n         peer_node: \"SUT 1\"\n         peer_pci: \"0000:00:08.1\"\n-    use_first_core: false\n     hugepages:  # optional; if removed, will use system hugepage configuration\n         amount: 256\n         force_first_numa: false\n",
    "prefixes": []
}