get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41019,
    "url": "http://patchwork.dpdk.org/api/patches/41019/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/1528839163-15048-1-git-send-email-nikhil.rao@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": "<1528839163-15048-1-git-send-email-nikhil.rao@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1528839163-15048-1-git-send-email-nikhil.rao@intel.com",
    "date": "2018-06-12T21:32:43",
    "name": "[RFC,v2] eventdev: event tx adapter APIs",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "e3c5e97b9fa2cc4109dbfdd98b0d2d9ce60ddd35",
    "submitter": {
        "id": 528,
        "url": "http://patchwork.dpdk.org/api/people/528/?format=api",
        "name": "Rao, Nikhil",
        "email": "nikhil.rao@intel.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patchwork.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/1528839163-15048-1-git-send-email-nikhil.rao@intel.com/mbox/",
    "series": [
        {
            "id": 99,
            "url": "http://patchwork.dpdk.org/api/series/99/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=99",
            "date": "2018-06-12T21:32:43",
            "name": "[RFC,v2] eventdev: event tx adapter APIs",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/99/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/41019/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/41019/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 0ED321EDDD;\n\tWed, 13 Jun 2018 06:46:47 +0200 (CEST)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n\tby dpdk.org (Postfix) with ESMTP id 85D881EDA8\n\tfor <dev@dpdk.org>; Wed, 13 Jun 2018 06:46:44 +0200 (CEST)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t12 Jun 2018 21:46:42 -0700",
            "from unknown (HELO localhost.localdomain.localdomain)\n\t([10.224.122.193])\n\tby fmsmga001.fm.intel.com with ESMTP; 12 Jun 2018 21:46:39 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.51,217,1526367600\"; d=\"scan'208\";a=\"63626829\"",
        "From": "Nikhil Rao <nikhil.rao@intel.com>",
        "To": "jerin.jacob@caviumnetworks.com,\n\tolivier.matz@6wind.com",
        "Cc": "hemant.agrawal@nxp.com, dev@dpdk.org, narender.vangati@intel.com,\n\tabhinandan.gujjar@intel.com, gage.eads@intel.com, jia.guo@intel.com, \n\tcristian.dumitrescu@intel.com, Nikhil Rao <nikhil.rao@intel.com>",
        "Date": "Wed, 13 Jun 2018 03:02:43 +0530",
        "Message-Id": "<1528839163-15048-1-git-send-email-nikhil.rao@intel.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1527260924-86922-1-git-send-email-nikhil.rao@intel.com>",
        "References": "<1527260924-86922-1-git-send-email-nikhil.rao@intel.com>",
        "Subject": "[dpdk-dev] [RFC v2] eventdev: event tx adapter APIs",
        "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://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add common APIs for the transmit stage of an event driven\nDPDK application. Also add a transmit queue field to the mbuf\nthat is used by the adapter to transmit mbufs.\n\nSigned-off-by: Nikhil Rao <nikhil.rao@intel.com>\n---\n\nChangelog",
    "diff": "=========\n\nv1->v2:\n * Add the tx_adapter_enqueue function to struct rte_eventdev.\n   It is set to the common Tx adapter function when creating the adapter\n   if the eventdev PMD does not support it or if the\n   DEV_TX_OFFLOAD_MT_LOCKFREE flag is NOT set on all ethernet devices.\n * Add the rte_event_eth_tx_adapter_enqueue() API.\n * Add the txq_id field to struct rte_mbuf.\n\n lib/librte_eventdev/rte_event_eth_tx_adapter.h | 380 +++++++++++++++++++++++++\n lib/librte_eventdev/rte_eventdev.h             |   7 +-\n lib/librte_mbuf/rte_mbuf.h                     |  20 +-\n 3 files changed, 405 insertions(+), 2 deletions(-)\n create mode 100644 lib/librte_eventdev/rte_event_eth_tx_adapter.h\n\ndiff --git a/lib/librte_eventdev/rte_event_eth_tx_adapter.h b/lib/librte_eventdev/rte_event_eth_tx_adapter.h\nnew file mode 100644\nindex 0000000..a0e8505\n--- /dev/null\n+++ b/lib/librte_eventdev/rte_event_eth_tx_adapter.h\n@@ -0,0 +1,380 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2017 Intel Corporation.\n+ */\n+\n+#ifndef _RTE_EVENT_ETH_TX_ADAPTER_\n+#define _RTE_EVENT_ETH_TX_ADAPTER_\n+\n+/**\n+ * @file\n+ *\n+ * RTE Event Ethernet Tx Adapter\n+ *\n+ * The event ethernet Tx adapter provides configuration and data path APIs\n+ * for the transmit stage of an event driven packet processing application.\n+ * These APIs abstract the implementation of the transmit stage and allow the\n+ * the application to use eventdev PMD support or a common implementation.\n+ *\n+ * In the common implementation, the application uses the adapter API to\n+ * enqueue mbufs to the adapter which runs as a rte_service function. The\n+ * service function deqeueues events from its event port and transmits the\n+ * mbufs referenced by these events.\n+ *\n+ * The ethernet Tx event adapter APIs are:\n+ *\n+ *  - rte_event_eth_tx_adapter_create()\n+ *  - rte_event_eth_tx_adapter_create_ext()\n+ *  - rte_event_eth_tx_adapter_free()\n+ *  - rte_event_eth_tx_adapter_start()\n+ *  - rte_event_eth_tx_adapter_stop()\n+ *  - rte_event_eth_tx_adapter_queue_start()\n+ *  - rte_event_eth_tx_adapter_queue_stop()\n+ *  - rte_event_eth_tx_adapter_enqueue()\n+ *  - rte_event_eth_tx_adapter_stats_get()\n+ *  - rte_event_eth_tx_adapter_stats_reset()\n+ *\n+ * The application creates the adapter using\n+ * rte_event_eth_tx_adapter_create(). The adapter may internally create an event\n+ * port using the port configuration parameter.\n+ * The adapter is responsible for linking the queue as per its implementation,\n+ * for example in the case of the service function, the adapter links this queue\n+ * to the event port it will dequeue events from.\n+ *\n+ * The application uses rte_event_eth_tx_adapter_enqueue() to send mbufs to the\n+ * adaptervia this event queue. The ethernet port and transmit queue index to\n+ * transmit the mbuf on are specified in the mbuf.\n+ *\n+ * The application can start and stop the adapter using the\n+ * rte_event_eth_tx_adapter_start/stop() calls.\n+ *\n+ * To support dynamic reconfiguration of Tx queues, the application can\n+ * call rte_event_eth_tx_adapter_queue_start()/stop() to synchronize\n+ * access to the Tx queue with the adapter. For example, if the application\n+ * wants to reconfigure a Tx queue that could be concurrently\n+ * being accessed by the adapter, it calls rte_event_eth_tx_adapter_queue_stop()\n+ * first, reconfigures the queue and then calls\n+ * rte_event_eth_tx_adapter_queue_start() which signals to the adapter\n+ * that it is safe to resume access to the Tx queue.\n+ *\n+ * The common adapter implementation uses an EAL service function as described\n+ * before and its execution is controlled using the rte_service APIs. The\n+ * rte_event_eth_tx_adapter_service_id_get()\n+ * function can be used to retrieve the adapter's service function ID.\n+ */\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+#include <stdint.h>\n+\n+#include \"rte_eventdev.h\"\n+\n+#define RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE 32\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Adapter configuration structure\n+ */\n+struct rte_event_eth_tx_adapter_conf {\n+\tuint8_t event_port_id;\n+\t/**< Event port identifier, the adapter service function dequeues mbuf\n+\t * events from this port.\n+\t */\n+\tuint32_t max_nb_tx;\n+\t/**< The adapter can return early if it has processed at least\n+\t * max_nb_tx mbufs. This isn't treated as a requirement; batching may\n+\t * cause the adapter to process more than max_nb_tx mbufs.\n+\t */\n+};\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Function type used for adapter configuration callback. The callback is\n+ * used to fill in members of the struct rte_event_eth_tx_adapter_conf, this\n+ * callback is invoked when creating a SW service to transmit packets.\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @param dev_id\n+ *  Event device identifier.\n+ * @param [out] conf\n+ *  Structure that needs to be populated by this callback.\n+ * @param arg\n+ *  Argument to the callback. This is the same as the conf_arg passed to the\n+ *  rte_event_eth_tx_adapter_create_ext().\n+ *\n+ * @return\n+ *   - 0: Success\n+ *   - <0: Error code on failure\n+ */\n+typedef int (*rte_event_eth_tx_adapter_conf_cb) (uint8_t id, uint8_t dev_id,\n+\t\t\tstruct rte_event_eth_tx_adapter_conf *conf,\n+\t\t\tvoid *arg);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * A structure used to retrieve statistics for an eth tx adapter instance.\n+ */\n+struct rte_event_eth_tx_adapter_stats {\n+\tuint64_t event_poll_count;\n+\t/*< Event port poll count */\n+\tuint64_t tx_packets;\n+\t/*< Number of packets transmitted */\n+\tuint64_t tx_dropped;\n+\t/*< Number of packets dropped */\n+};\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Create a new event ethernet Tx adapter with the specified identifier.\n+ *\n+ * @param id\n+ *  The identifier of the event ethernet Tx adapter.\n+ * @param dev_id\n+ *  The event device identifier.\n+ * @param queue_id\n+ *  The event queue identifier.\n+ * @param port_config\n+ *  Event port configuration, the adapter uses this configuration to\n+ *  create an event port if needed. It uses this port to dequeue\n+ *  events that are sent to it by rte_event_eth_tx_adapter_enqueue()\n+ *\n+ * @return\n+ *   - 0: Success\n+ *   - <0: Error code on failure\n+ */\n+int rte_event_eth_tx_adapter_create(uint8_t id, uint8_t dev_id,\n+\t\t\t\tuint8_t queue_id,\n+\t\t\t\tstruct rte_event_port_conf *port_config);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Free an event adapter\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @return\n+ *   - 0: Success\n+ *   - <0: Error code on failure, If the adapter still has Tx queues\n+ *      added to it, the function returns -EBUSY.\n+ */\n+int rte_event_eth_tx_adapter_free(uint8_t id);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Start ethernet Tx event adapter\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @return\n+ *  - 0: Success, Adapter started correctly.\n+ *  - <0: Error code on failure.\n+ */\n+int rte_event_eth_tx_adapter_start(uint8_t id);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Stop ethernet Tx event adapter\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @return\n+ *  - 0: Success, Adapter started correctly.\n+ *  - <0: Error code on failure.\n+ */\n+int rte_event_eth_tx_adapter_stop(uint8_t id);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Signal the Tx adapter to start processing mbufs for a\n+ * Tx queue. A queue value of -1 is used to indicate all\n+ * queues within the device.\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @param eth_dev_id\n+ *  Ethernet Port Identifier.\n+ * @param queue\n+ *  Tx queue index.\n+ *\n+ * @return\n+ *  - 0: Success, Adapter started correctly.\n+ *  - <0: Error code on failure.\n+ */\n+int rte_event_eth_tx_adapter_queue_start(uint8_t id,\n+\t\t\t\t\tuint16_t eth_dev_id,\n+\t\t\t\t\tint32_t queue);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Signal the Tx adapter to stop processing mbufs for a\n+ * Tx queue. A queue value of -1 is used to indicate all\n+ * queues within the device.\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @param eth_dev_id\n+ *  Ethernet Port Identifier.\n+ * @param queue\n+ *  Tx queue index.\n+ *\n+ * @return\n+ *  - 0: Success, Adapter started correctly.\n+ *  - <0: Error code on failure.\n+ */\n+int rte_event_eth_tx_adapter_queue_stop(uint8_t id,\n+\t\t\t\t\tuint16_t eth_dev_id,\n+\t\t\t\t\tint32_t queue);\n+\n+static __rte_always_inline uint16_t\n+__rte_event_eth_tx_adapter_enqueue(uint8_t id, uint8_t dev_id, uint8_t port_id,\n+\t\t\t\tconst struct rte_event ev[],\n+\t\t\t\tuint16_t nb_events,\n+\t\t\t\tconst event_tx_adapter_enqueue fn)\n+{\n+\tconst struct rte_eventdev *dev = &rte_eventdevs[dev_id];\n+\n+#ifdef RTE_LIBRTE_EVENTDEV_DEBUG\n+\tif (id >= RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE || \n+\t\tdev_id >= RTE_EVENT_MAX_DEVS ||\n+\t\t!rte_eventdevs[dev_id].attached) {\n+\t\trte_errno = -EINVAL;\n+\t\treturn 0;\n+\t}\n+\n+\tif (port_id >= dev->data->nb_ports) {\n+\t\trte_errno = -EINVAL;\n+\t\treturn 0;\n+\t}\n+#endif\n+\t/*\n+\t * TODO: Do we need a special case for nb_events == 1\n+\t */\n+\treturn fn(id, dev, dev->data->ports[port_id], ev, nb_events);\n+}\n+\n+/**\n+ * Enqueue a burst of events objects or an event object supplied in *rte_event*\n+ * structure on an  event device designated by its *dev_id* through the event\n+ * port specified by *port_id*. The the event queue on which it will be enqueued\n+ * id derived from the adapter id parameter.\n+ *\n+ * The *nb_events* parameter is the number of event objects to enqueue which are\n+ * supplied in the *ev* array of *rte_event* structure.\n+ *\n+ * The rte_event_eth_tx_adapter_enqueue() function returns the number of\n+ * events objects it actually enqueued. A return value equal to *nb_events*\n+ * means that all event objects have been enqueued.\n+ *\n+ * @param id\n+ *  The identifier of the tx adapter.\n+ * @param dev_id\n+ *  The identifier of the device.\n+ * @param port_id\n+ *  The identifier of the event port.\n+ * @param ev\n+ *  Points to an array of *nb_events* objects of type *rte_event* structure\n+ *  which contain the event object enqueue operations to be processed.\n+ * @param nb_events\n+ *  The number of event objects to enqueue, typically number of\n+ *  rte_event_port_enqueue_depth() available for this port.\n+ *\n+ * @return\n+ *   The number of event objects actually enqueued on the event device. The\n+ *   return value can be less than the value of the *nb_events* parameter when\n+ *   the event devices queue is full or if invalid parameters are specified in a\n+ *   *rte_event*. If the return value is less than *nb_events*, the remaining\n+ *   events at the end of ev[] are not consumed and the caller has to take care\n+ *   of them, and rte_errno is set accordingly. Possible errno values include:\n+ *   - -EINVAL  The port ID is invalid, device ID is invalid, an event's queue\n+ *              ID is invalid, or an event's sched type doesn't match the\n+ *              capabilities of the destination queue.\n+ *   - -ENOSPC  The event port was backpressured and unable to enqueue\n+ *              one or more events. This error code is only applicable to\n+ *              closed systems.\n+ */\n+static inline uint16_t\n+rte_event_eth_tx_adapter_enqueue(uint8_t id, uint8_t dev_id,\n+\t\t\t\tuint8_t port_id,\n+\t\t\t\tconst struct rte_event ev[],\n+\t\t\t\tuint16_t nb_events)\n+{\n+\tconst struct rte_eventdev *dev = &rte_eventdevs[dev_id];\n+\n+\treturn __rte_event_eth_tx_adapter_enqueue(id, dev_id, port_id, ev,\n+\t\t\t\t\t\tnb_events,\n+\t\t\t\t\t\tdev->tx_adapter_enqueue);\n+}\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Retrieve statistics for an adapter\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @param [out] stats\n+ *  A pointer to structure used to retrieve statistics for an adapter.\n+ * @return\n+ *  - 0: Success, retrieved successfully.\n+ *  - <0: Error code on failure.\n+ */\n+int rte_event_eth_tx_adapter_stats_get(uint8_t id,\n+\t\t\t\tstruct rte_event_eth_tx_adapter_stats *stats);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Reset statistics for an adapter.\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @return\n+ *  - 0: Success, statistics reset successfully.\n+ *  - <0: Error code on failure.\n+ */\n+int rte_event_eth_tx_adapter_stats_reset(uint8_t id);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Retrieve the service ID of an adapter. If the adapter doesn't use\n+ * a rte_service function, this function returns -ESRCH.\n+ *\n+ * @param id\n+ *  Adapter identifier.\n+ * @param [out] service_id\n+ *  A pointer to a uint32_t, to be filled in with the service id.\n+ * @return\n+ *  - 0: Success\n+ *  - <0: Error code on failure, if the adapter doesn't use a rte_service\n+ * function, this function returns -ESRCH.\n+ */\n+int rte_event_eth_tx_adapter_service_id_get(uint8_t id, uint32_t *service_id);\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+#endif\t/* _RTE_EVENT_ETH_TX_ADAPTER_ */\ndiff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h\nindex b6fd6ee..1bf28a0 100644\n--- a/lib/librte_eventdev/rte_eventdev.h\n+++ b/lib/librte_eventdev/rte_eventdev.h\n@@ -1203,6 +1203,10 @@ typedef uint16_t (*event_dequeue_t)(void *port, struct rte_event *ev,\n typedef uint16_t (*event_dequeue_burst_t)(void *port, struct rte_event ev[],\n \t\tuint16_t nb_events, uint64_t timeout_ticks);\n /**< @internal Dequeue burst of events from port of a device */\n+typedef uint16_t (*event_tx_adapter_enqueue)(uint8_t id,\n+\t\t\tconst struct rte_eventdev *dev, void *port,\n+\t\t\tconst struct rte_event ev[], uint16_t nb_events);\n+/**< @internal Enqueue burst of events on port of a device */\n \n #define RTE_EVENTDEV_NAME_MAX_LEN\t(64)\n /**< @internal Max length of name of event PMD */\n@@ -1266,7 +1270,8 @@ struct rte_eventdev {\n \t/**< Pointer to PMD dequeue function. */\n \tevent_dequeue_burst_t dequeue_burst;\n \t/**< Pointer to PMD dequeue burst function. */\n-\n+\tevent_tx_adapter_enqueue tx_adapter_enqueue;\n+\t/**< Pointer to PMD tx adapter enqueue function. */\n \tstruct rte_eventdev_data *data;\n \t/**< Pointer to device data */\n \tstruct rte_eventdev_ops *dev_ops;\ndiff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h\nindex 4fd9a0d..c59389c 100644\n--- a/lib/librte_mbuf/rte_mbuf.h\n+++ b/lib/librte_mbuf/rte_mbuf.h\n@@ -464,7 +464,9 @@ struct rte_mbuf {\n \t};\n \tuint16_t nb_segs;         /**< Number of segments. */\n \n-\t/** Input port (16 bits to support more than 256 virtual ports). */\n+\t/** Input port (16 bits to support more than 256 virtual ports).\n+\t * The event eth Tx adapter uses this field to specify the output port.\n+\t */\n \tuint16_t port;\n \n \tuint64_t ol_flags;        /**< Offload features. */\n@@ -511,6 +513,7 @@ struct rte_mbuf {\n \t/** VLAN TCI (CPU order), valid if PKT_RX_VLAN is set. */\n \tuint16_t vlan_tci;\n \n+\tRTE_STD_C11\n \tunion {\n \t\tuint32_t rss;     /**< RSS hash result if RSS enabled */\n \t\tstruct {\n@@ -531,6 +534,11 @@ struct rte_mbuf {\n \t\t\tuint32_t lo;\n \t\t\tuint32_t hi;\n \t\t} sched;          /**< Hierarchical scheduler */\n+\t\tstruct {\n+\t\t\tuint32_t resvd1; /* overlaps with rte_sched_port_hierarchy::color */\n+\t\t\tuint16_t resvd2;\n+\t\t\tuint16_t txq_id;\n+\t\t};\n \t\tuint32_t usr;\t  /**< User defined tags. See rte_distributor_process() */\n \t} hash;                   /**< hash information */\n \n@@ -1880,6 +1888,16 @@ static inline struct rte_mbuf *rte_pktmbuf_lastseg(struct rte_mbuf *m)\n #define rte_pktmbuf_data_len(m) ((m)->data_len)\n \n /**\n+ * A macro that returns the txq field of the mbuf\n+ *\n+ * The value can be read or assigned.\n+ *\n+ * @param m\n+ *   The packet mbuf.\n+ */\n+#define rte_pktmbuf_tx_queue(m) ((m)->txq_id)\n+\n+/**\n  * Prepend len bytes to an mbuf data area.\n  *\n  * Returns a pointer to the new\n",
    "prefixes": [
        "RFC",
        "v2"
    ]
}