get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 73039,
    "url": "http://patchwork.dpdk.org/api/patches/73039/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20200703145718.81017-3-haiyue.wang@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20200703145718.81017-3-haiyue.wang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200703145718.81017-3-haiyue.wang@intel.com",
    "date": "2020-07-03T14:57:18",
    "name": "[v17,2/2] eal: support for VFIO-PCI VF token",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "c496f8d92842095a42c07a7a8d05d49310dfa997",
    "submitter": {
        "id": 1044,
        "url": "http://patchwork.dpdk.org/api/people/1044/?format=api",
        "name": "Wang, Haiyue",
        "email": "haiyue.wang@intel.com"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patchwork.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20200703145718.81017-3-haiyue.wang@intel.com/mbox/",
    "series": [
        {
            "id": 10780,
            "url": "http://patchwork.dpdk.org/api/series/10780/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=10780",
            "date": "2020-07-03T14:57:16",
            "name": "support for VFIO-PCI VF token interface",
            "version": 17,
            "mbox": "http://patchwork.dpdk.org/series/10780/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/73039/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/73039/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 4DE8CA0519;\n\tFri,  3 Jul 2020 17:05:59 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id BFBA31DC3D;\n\tFri,  3 Jul 2020 17:05:51 +0200 (CEST)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by dpdk.org (Postfix) with ESMTP id 491371DC1E\n for <dev@dpdk.org>; Fri,  3 Jul 2020 17:05:49 +0200 (CEST)",
            "from fmsmga005.fm.intel.com ([10.253.24.32])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 03 Jul 2020 08:05:44 -0700",
            "from npg-dpdk-haiyue-3.sh.intel.com ([10.67.119.46])\n by fmsmga005.fm.intel.com with ESMTP; 03 Jul 2020 08:05:42 -0700"
        ],
        "IronPort-SDR": [
            "\n zGGV/SM3e/KElEy7qSbCCQEeX9ZdXXJ6j0dHr0CI02HkdGtuLvFSHNMb5SnnXwvpTRlsPS7Ufi\n aNLDSN6tH+Jw==",
            "\n X4EOBwa9+f0S4zyDzFrJ36E6UlKPQ+ukqAUmMPi1lAv0daz/H5yhfO8XaMuvrDc9Ueo/aEUvBf\n 62q2q7UgyFmA=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9671\"; a=\"212177538\"",
            "E=Sophos;i=\"5.75,308,1589266800\"; d=\"scan'208\";a=\"212177538\"",
            "E=Sophos;i=\"5.75,308,1589266800\"; d=\"scan'208\";a=\"482399804\""
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "From": "Haiyue Wang <haiyue.wang@intel.com>",
        "To": "dev@dpdk.org, anatoly.burakov@intel.com, thomas@monjalon.net,\n jerinj@marvell.com, david.marchand@redhat.com, arybchenko@solarflare.com",
        "Cc": "Haiyue Wang <haiyue.wang@intel.com>,\n\tHarman Kalra <hkalra@marvell.com>",
        "Date": "Fri,  3 Jul 2020 22:57:18 +0800",
        "Message-Id": "<20200703145718.81017-3-haiyue.wang@intel.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20200703145718.81017-1-haiyue.wang@intel.com>",
        "References": "<20200305043311.17065-1-vattunuru@marvell.com>\n <20200703145718.81017-1-haiyue.wang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v17 2/2] eal: support for VFIO-PCI VF token",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The kernel module vfio-pci introduces the VF token to enable SR-IOV\nsupport since 5.7.\n\nThe VF token can be set by a vfio-pci based PF driver and must be known\nby the vfio-pci based VF driver in order to gain access to the device.\n\nSince the vfio-pci module uses the VF token as internal data to provide\nthe collaboration between SR-IOV PF and VFs, so DPDK can use the same\nVF token for all PF devices by specifying the related EAL option.\n\nSigned-off-by: Haiyue Wang <haiyue.wang@intel.com>\nAcked-by: Anatoly Burakov <anatoly.burakov@intel.com>\nAcked-by: Andrew Rybchenko <arybchenko@solarflare.com>\nTested-by: Harman Kalra <hkalra@marvell.com>\n---\n doc/guides/linux_gsg/linux_drivers.rst        | 35 ++++++++++++++++++-\n doc/guides/linux_gsg/linux_eal_parameters.rst |  4 +++\n doc/guides/rel_notes/release_20_08.rst        |  6 ++++\n lib/librte_eal/common/eal_common_options.c    |  3 ++\n lib/librte_eal/common/eal_internal_cfg.h      |  2 ++\n lib/librte_eal/common/eal_options.h           |  2 ++\n lib/librte_eal/freebsd/eal.c                  |  5 +++\n lib/librte_eal/include/rte_eal.h              | 14 ++++++++\n lib/librte_eal/linux/eal.c                    | 33 +++++++++++++++++\n lib/librte_eal/linux/eal_vfio.c               | 19 ++++++++++\n lib/librte_eal/rte_eal_version.map            |  3 ++\n 11 files changed, 125 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/doc/guides/linux_gsg/linux_drivers.rst b/doc/guides/linux_gsg/linux_drivers.rst\nindex d40b495c1..4eda3d5bf 100644\n--- a/doc/guides/linux_gsg/linux_drivers.rst\n+++ b/doc/guides/linux_gsg/linux_drivers.rst\n@@ -78,11 +78,44 @@ Note that in order to use VFIO, your kernel must support it.\n VFIO kernel modules have been included in the Linux kernel since version 3.6.0 and are usually present by default,\n however please consult your distributions documentation to make sure that is the case.\n \n+The ``vfio-pci`` module since Linux version 5.7 supports the creation of virtual\n+functions. After the PF is bound to vfio-pci module, the user can create the VFs\n+by sysfs interface, and these VFs are bound to vfio-pci module automatically.\n+\n+When the PF is bound to vfio-pci, it has initial VF token generated by random. For\n+security reason, this token is write only, the user can't read it from the kernel\n+directly. To access the VF, the user needs to start the PF with token parameter to\n+setup a VF token in UUID format, then the VF can be accessed with this new token.\n+\n+Since the ``vfio-pci`` module uses the VF token as internal data to provide the\n+collaboration between SR-IOV PF and VFs, so DPDK can use the same VF token for all\n+PF devices which bound to one application. This VF token can be specified by the EAL\n+parameter ``--vfio-vf-token``.\n+\n+.. code-block:: console\n+\n+    1. Generate the VF token by uuid command\n+        14d63f20-8445-11ea-8900-1f9ce7d5650d\n+\n+    2. sudo modprobe vfio-pci enable_sriov=1\n+\n+    2. ./usertools/dpdk-devbind.py -b vfio-pci 0000:86:00.0\n+\n+    3. echo 2 > /sys/bus/pci/devices/0000:86:00.0/sriov_numvfs\n+\n+    4. Start the PF:\n+        ./x86_64-native-linux-gcc/app/testpmd -l 22-25 -n 4 -w 86:00.0 \\\n+         --vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=pf -- -i\n+\n+    5. Start the VF:\n+        ./x86_64-native-linux-gcc/app/testpmd -l 26-29 -n 4 -w 86:02.0 \\\n+         --vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=vf0 -- -i\n+\n Also, to use VFIO, both kernel and BIOS must support and be configured to use IO virtualization (such as Intel® VT-d).\n \n .. note::\n \n-    ``vfio-pci`` module doesn't support the creation of virtual functions.\n+    ``vfio-pci`` module doesn't support the creation of virtual functions before Linux version 5.7.\n \n For proper operation of VFIO when running DPDK applications as a non-privileged user, correct permissions should also be set up.\n This can be done by using the DPDK setup script (called dpdk-setup.sh and located in the usertools directory).\ndiff --git a/doc/guides/linux_gsg/linux_eal_parameters.rst b/doc/guides/linux_gsg/linux_eal_parameters.rst\nindex b2cc60e44..bd3977cb3 100644\n--- a/doc/guides/linux_gsg/linux_eal_parameters.rst\n+++ b/doc/guides/linux_gsg/linux_eal_parameters.rst\n@@ -40,6 +40,10 @@ Device-related options\n \n     Use specified interrupt mode for devices bound to VFIO kernel driver.\n \n+*   ``--vfio-vf-token <uuid>``\n+\n+    Use specified VF token for devices bound to VFIO kernel driver.\n+\n Multiprocessing-related options\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n \ndiff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst\nindex 5cbc4ce14..333f315ca 100644\n--- a/doc/guides/rel_notes/release_20_08.rst\n+++ b/doc/guides/rel_notes/release_20_08.rst\n@@ -107,6 +107,12 @@ New Features\n   * Dump ``rte_flow`` memory consumption.\n   * Measure packet per second forwarding.\n \n+* **Added the support for vfio-pci new VF token interface.**\n+\n+  From Linux 5.7, vfio-pci supports to bind both SR-IOV PF and the created VFs,\n+  it uses a shared VF token (UUID) to represent the collaboration between PF\n+  and VFs. Update DPDK PCI driver to gain the access to the PF and VFs devices\n+  by appending the VF token parameter.\n \n Removed Items\n -------------\ndiff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c\nindex 24b223ebf..15b47349d 100644\n--- a/lib/librte_eal/common/eal_common_options.c\n+++ b/lib/librte_eal/common/eal_common_options.c\n@@ -94,6 +94,7 @@ eal_long_options[] = {\n \t{OPT_SYSLOG,            1, NULL, OPT_SYSLOG_NUM           },\n \t{OPT_VDEV,              1, NULL, OPT_VDEV_NUM             },\n \t{OPT_VFIO_INTR,         1, NULL, OPT_VFIO_INTR_NUM        },\n+\t{OPT_VFIO_VF_TOKEN,     1, NULL, OPT_VFIO_VF_TOKEN_NUM    },\n \t{OPT_VMWARE_TSC_MAP,    0, NULL, OPT_VMWARE_TSC_MAP_NUM   },\n \t{OPT_LEGACY_MEM,        0, NULL, OPT_LEGACY_MEM_NUM       },\n \t{OPT_SINGLE_FILE_SEGMENTS, 0, NULL, OPT_SINGLE_FILE_SEGMENTS_NUM},\n@@ -327,6 +328,8 @@ eal_reset_internal_config(struct internal_config *internal_cfg)\n \n \t/* if set to NONE, interrupt mode is determined automatically */\n \tinternal_cfg->vfio_intr_mode = RTE_INTR_MODE_NONE;\n+\tmemset(internal_cfg->vfio_vf_token, 0,\n+\t\t\tsizeof(internal_cfg->vfio_vf_token));\n \n #ifdef RTE_LIBEAL_USE_HPET\n \tinternal_cfg->no_hpet = 0;\ndiff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h\nindex 2aaa167d4..13f93388a 100644\n--- a/lib/librte_eal/common/eal_internal_cfg.h\n+++ b/lib/librte_eal/common/eal_internal_cfg.h\n@@ -72,6 +72,8 @@ struct internal_config {\n \tvolatile int syslog_facility;\t  /**< facility passed to openlog() */\n \t/** default interrupt mode for VFIO */\n \tvolatile enum rte_intr_mode vfio_intr_mode;\n+\t/** the shared VF token for VFIO-PCI bound PF and VFs devices */\n+\trte_uuid_t vfio_vf_token;\n \tchar *hugefile_prefix;      /**< the base filename of hugetlbfs files */\n \tchar *hugepage_dir;         /**< specific hugetlbfs directory to use */\n \tchar *user_mbuf_pool_ops_name;\ndiff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h\nindex 18e6da9ab..89769d48b 100644\n--- a/lib/librte_eal/common/eal_options.h\n+++ b/lib/librte_eal/common/eal_options.h\n@@ -69,6 +69,8 @@ enum {\n \tOPT_VDEV_NUM,\n #define OPT_VFIO_INTR         \"vfio-intr\"\n \tOPT_VFIO_INTR_NUM,\n+#define OPT_VFIO_VF_TOKEN     \"vfio-vf-token\"\n+\tOPT_VFIO_VF_TOKEN_NUM,\n #define OPT_VMWARE_TSC_MAP    \"vmware-tsc-map\"\n \tOPT_VMWARE_TSC_MAP_NUM,\n #define OPT_LEGACY_MEM    \"legacy-mem\"\ndiff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c\nindex 8c75cba79..040b1b7ee 100644\n--- a/lib/librte_eal/freebsd/eal.c\n+++ b/lib/librte_eal/freebsd/eal.c\n@@ -966,6 +966,11 @@ rte_eal_vfio_intr_mode(void)\n \treturn RTE_INTR_MODE_NONE;\n }\n \n+void\n+rte_eal_vfio_get_vf_token(__rte_unused rte_uuid_t vf_token)\n+{\n+}\n+\n int rte_vfio_setup_device(__rte_unused const char *sysfs_base,\n \t\t      __rte_unused const char *dev_addr,\n \t\t      __rte_unused int *vfio_dev_fd,\ndiff --git a/lib/librte_eal/include/rte_eal.h b/lib/librte_eal/include/rte_eal.h\nindex 2f9ed298d..6c70632cc 100644\n--- a/lib/librte_eal/include/rte_eal.h\n+++ b/lib/librte_eal/include/rte_eal.h\n@@ -19,6 +19,7 @@\n #include <rte_compat.h>\n #include <rte_per_lcore.h>\n #include <rte_bus.h>\n+#include <rte_uuid.h>\n \n #include <rte_pci_dev_feature_defs.h>\n \n@@ -438,6 +439,19 @@ int rte_eal_create_uio_dev(void);\n  */\n enum rte_intr_mode rte_eal_vfio_intr_mode(void);\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Copy the user-configured vfio VF token.\n+ *\n+ * @param vf_token\n+ *   vfio VF token configured with the command line is copied\n+ *   into this parameter, zero uuid by default.\n+ */\n+__rte_experimental\n+void rte_eal_vfio_get_vf_token(rte_uuid_t vf_token);\n+\n /**\n  * A wrap API for syscall gettid.\n  *\ndiff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c\nindex 3b56d14da..d6b8d8be7 100644\n--- a/lib/librte_eal/linux/eal.c\n+++ b/lib/librte_eal/linux/eal.c\n@@ -540,6 +540,7 @@ eal_usage(const char *prgname)\n \t       \"  --\"OPT_FILE_PREFIX\"       Prefix for hugepage filenames\\n\"\n \t       \"  --\"OPT_CREATE_UIO_DEV\"    Create /dev/uioX (usually done by hotplug)\\n\"\n \t       \"  --\"OPT_VFIO_INTR\"         Interrupt mode for VFIO (legacy|msi|msix)\\n\"\n+\t       \"  --\"OPT_VFIO_VF_TOKEN\"     VF token (UUID) shared between SR-IOV PF and VFs\\n\"\n \t       \"  --\"OPT_LEGACY_MEM\"        Legacy memory mode (no dynamic allocation, contiguous segments)\\n\"\n \t       \"  --\"OPT_SINGLE_FILE_SEGMENTS\" Put all hugepage memory in single files\\n\"\n \t       \"  --\"OPT_MATCH_ALLOCATIONS\" Free hugepages exactly as allocated\\n\"\n@@ -620,6 +621,20 @@ eal_parse_vfio_intr(const char *mode)\n \treturn -1;\n }\n \n+static int\n+eal_parse_vfio_vf_token(const char *vf_token)\n+{\n+\tstruct internal_config *cfg = eal_get_internal_configuration();\n+\trte_uuid_t uuid;\n+\n+\tif (!rte_uuid_parse(vf_token, uuid)) {\n+\t\trte_uuid_copy(cfg->vfio_vf_token, uuid);\n+\t\treturn 0;\n+\t}\n+\n+\treturn -1;\n+}\n+\n /* Parse the arguments for --log-level only */\n static void\n eal_log_level_parse(int argc, char **argv)\n@@ -762,6 +777,16 @@ eal_parse_args(int argc, char **argv)\n \t\t\t}\n \t\t\tbreak;\n \n+\t\tcase OPT_VFIO_VF_TOKEN_NUM:\n+\t\t\tif (eal_parse_vfio_vf_token(optarg) < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"invalid parameters for --\"\n+\t\t\t\t\t\tOPT_VFIO_VF_TOKEN \"\\n\");\n+\t\t\t\teal_usage(prgname);\n+\t\t\t\tret = -1;\n+\t\t\t\tgoto out;\n+\t\t\t}\n+\t\t\tbreak;\n+\n \t\tcase OPT_CREATE_UIO_DEV_NUM:\n \t\t\tinternal_conf->create_uio_dev = 1;\n \t\t\tbreak;\n@@ -1342,6 +1367,14 @@ rte_eal_vfio_intr_mode(void)\n \treturn internal_conf->vfio_intr_mode;\n }\n \n+void\n+rte_eal_vfio_get_vf_token(rte_uuid_t vf_token)\n+{\n+\tstruct internal_config *cfg = eal_get_internal_configuration();\n+\n+\trte_uuid_copy(vf_token, cfg->vfio_vf_token);\n+}\n+\n int\n rte_eal_check_module(const char *module_name)\n {\ndiff --git a/lib/librte_eal/linux/eal_vfio.c b/lib/librte_eal/linux/eal_vfio.c\nindex abb12a354..d4470a34d 100644\n--- a/lib/librte_eal/linux/eal_vfio.c\n+++ b/lib/librte_eal/linux/eal_vfio.c\n@@ -714,6 +714,7 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,\n \tint vfio_container_fd;\n \tint vfio_group_fd;\n \tint iommu_group_num;\n+\trte_uuid_t vf_token;\n \tint i, ret;\n \tconst struct internal_config *internal_conf =\n \t\teal_get_internal_configuration();\n@@ -899,6 +900,23 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,\n \t\t\t\tt->type_id, t->name);\n \t}\n \n+\trte_eal_vfio_get_vf_token(vf_token);\n+\n+\t/* get a file descriptor for the device with VF token firstly */\n+\tif (!rte_uuid_is_null(vf_token)) {\n+\t\tchar vf_token_str[RTE_UUID_STRLEN];\n+\t\tchar dev[PATH_MAX];\n+\n+\t\trte_uuid_unparse(vf_token, vf_token_str, sizeof(vf_token_str));\n+\t\tsnprintf(dev, sizeof(dev),\n+\t\t\t \"%s vf_token=%s\", dev_addr, vf_token_str);\n+\n+\t\t*vfio_dev_fd = ioctl(vfio_group_fd, VFIO_GROUP_GET_DEVICE_FD,\n+\t\t\t\t     dev);\n+\t\tif (*vfio_dev_fd >= 0)\n+\t\t\tgoto dev_get_info;\n+\t}\n+\n \t/* get a file descriptor for the device */\n \t*vfio_dev_fd = ioctl(vfio_group_fd, VFIO_GROUP_GET_DEVICE_FD, dev_addr);\n \tif (*vfio_dev_fd < 0) {\n@@ -914,6 +932,7 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,\n \t}\n \n \t/* test and setup the device */\n+dev_get_info:\n \tret = ioctl(*vfio_dev_fd, VFIO_DEVICE_GET_INFO, device_info);\n \tif (ret) {\n \t\tRTE_LOG(ERR, EAL, \"  %s cannot get device info, \"\ndiff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map\nindex 196eef5af..7923c62f2 100644\n--- a/lib/librte_eal/rte_eal_version.map\n+++ b/lib/librte_eal/rte_eal_version.map\n@@ -386,6 +386,9 @@ EXPERIMENTAL {\n \trte_trace_point_lookup;\n \trte_trace_regexp;\n \trte_trace_save;\n+\n+\t# added in 20.08\n+\trte_eal_vfio_get_vf_token;\n };\n \n INTERNAL {\n",
    "prefixes": [
        "v17",
        "2/2"
    ]
}