get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 62288,
    "url": "http://patches.dpdk.org/api/patches/62288/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1572540506-531-2-git-send-email-viacheslavo@mellanox.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": "<1572540506-531-2-git-send-email-viacheslavo@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1572540506-531-2-git-send-email-viacheslavo@mellanox.com",
    "date": "2019-10-31T16:48:25",
    "name": "[v8,1/2] ethdev: extend flow metadata",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "31438f6a30c72a2f44c1674f1d47aafd760bab3d",
    "submitter": {
        "id": 1102,
        "url": "http://patches.dpdk.org/api/people/1102/?format=api",
        "name": "Slava Ovsiienko",
        "email": "viacheslavo@mellanox.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1572540506-531-2-git-send-email-viacheslavo@mellanox.com/mbox/",
    "series": [
        {
            "id": 7181,
            "url": "http://patches.dpdk.org/api/series/7181/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7181",
            "date": "2019-10-31T16:48:24",
            "name": "extend flow metadata feature",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/7181/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/62288/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/62288/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 4D54BA00C2;\n\tThu, 31 Oct 2019 17:48:49 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 2CFC31D154;\n\tThu, 31 Oct 2019 17:48:42 +0100 (CET)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id 5EFD61D14C\n for <dev@dpdk.org>; Thu, 31 Oct 2019 17:48:37 +0100 (CET)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n viacheslavo@mellanox.com)\n with ESMTPS (AES256-SHA encrypted); 31 Oct 2019 18:48:33 +0200",
            "from pegasus11.mtr.labs.mlnx (pegasus11.mtr.labs.mlnx\n [10.210.16.104])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x9VGmXAa018514;\n Thu, 31 Oct 2019 18:48:33 +0200",
            "from pegasus11.mtr.labs.mlnx (localhost [127.0.0.1])\n by pegasus11.mtr.labs.mlnx (8.14.7/8.14.7) with ESMTP id x9VGmXk7000721;\n Thu, 31 Oct 2019 16:48:33 GMT",
            "(from viacheslavo@localhost)\n by pegasus11.mtr.labs.mlnx (8.14.7/8.14.7/Submit) id x9VGmXdU000720;\n Thu, 31 Oct 2019 16:48:33 GMT"
        ],
        "X-Authentication-Warning": "pegasus11.mtr.labs.mlnx: viacheslavo set sender to\n viacheslavo@mellanox.com using -f",
        "From": "Viacheslav Ovsiienko <viacheslavo@mellanox.com>",
        "To": "dev@dpdk.org",
        "Cc": "matan@mellanox.com, rasland@mellanox.com, thomas@monjalon.net,\n olivier.matz@6wind.com, arybchenko@solarflare.com, orika@mellanox.com,\n Yongseok Koh <yskoh@mellanox.com>",
        "Date": "Thu, 31 Oct 2019 16:48:25 +0000",
        "Message-Id": "<1572540506-531-2-git-send-email-viacheslavo@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1572540506-531-1-git-send-email-viacheslavo@mellanox.com>",
        "References": "<1572527121-13133-2-git-send-email-viacheslavo@mellanox.com>\n <1572540506-531-1-git-send-email-viacheslavo@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v8 1/2] ethdev: extend flow metadata",
        "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": "Currently, metadata can be set on egress path via mbuf tx_metadata field\nwith PKT_TX_METADATA flag and RTE_FLOW_ITEM_TYPE_META matches metadata.\n\nThis patch extends the metadata feature usability.\n\n1) RTE_FLOW_ACTION_TYPE_SET_META\n\nWhen supporting multiple tables, Tx metadata can also be set by a rule and\nmatched by another rule. This new action allows metadata to be set as a\nresult of flow match.\n\n2) Metadata on ingress\n\nThere's also need to support metadata on ingress. Metadata can be set by\nSET_META action and matched by META item like Tx. The final value set by\nthe action will be delivered to application via metadata dynamic field of\nmbuf which can be accessed by RTE_FLOW_DYNF_METADATA() macro or with\nrte_flow_dynf_metadata_set() and rte_flow_dynf_metadata_get() helper\nroutines. PKT_RX_DYNF_METADATA flag will be set along with the data.\n\nThe mbuf dynamic field must be registered by calling\nrte_flow_dynf_metadata_register() prior to use SET_META action.\n\nThe availability of dynamic mbuf metadata field can be checked\nwith rte_flow_dynf_metadata_avail() routine.\n\nIf application is going to engage the metadata feature it registers\nthe metadata  dynamic fields, then PMD checks the metadata field\navailability and handles the appropriate fields in datapath.\n\nFor loopback/hairpin packet, metadata set on Rx/Tx may or may not be\npropagated to the other path depending on hardware capability.\n\nMARK and METADATA look similar and might operate in similar way,\nbut not interacting.\n\nInitially, there were proposed two metadata related actions:\n\n- RTE_FLOW_ACTION_TYPE_FLAG\n- RTE_FLOW_ACTION_TYPE_MARK\n\nThese actions set the special flag in the packet metadata, MARK action\nstores some specified value in the metadata storage, and, on the packet\nreceiving PMD puts the flag and value to the mbuf and applications can\nsee the packet was threated inside flow engine according to the appropriate\nRTE flow(s). MARK and FLAG are like some kind of gateway to transfer some\nper-packet information from the flow engine to the application via\nreceiving datapath. Also, there is the item of type RTE_FLOW_ITEM_TYPE_MARK\nprovided. It allows us to extend the flow match pattern with the capability\nto match the metadata values set by MARK/FLAG actions on other flows.\n\nFrom the datapath point of view, the MARK and FLAG are related to the\nreceiving side only. It would useful to have the same gateway on the\ntransmitting side and there was the feature of type RTE_FLOW_ITEM_TYPE_META\nwas proposed. The application can fill the field in mbuf and this value\nwill be transferred to some field in the packet metadata inside the flow\nengine. It did not matter whether these metadata fields are shared because\nof MARK and META items belonged to different domains (receiving and\ntransmitting) and could be vendor-specific.\n\nSo far, so good, DPDK proposes some entities to control metadata inside\nthe flow engine and gateways to exchange these values on a per-packet basis\nvia datapaths.\n\nAs we can see, the MARK and META means are not symmetric, there is absent\naction which would allow us to set META value on the transmitting path.\nSo, the action of type:\n\n- RTE_FLOW_ACTION_TYPE_SET_META was proposed.\n\nThe next, applications raise the new requirements for packet metadata.\nThe flow ngines are getting more complex, internal switches are introduced,\nmultiple ports might be supported within the same flow engine namespace.\nFrom the DPDK points of view, it means the packets might be sent on one\neth_dev port and received on the other one, and the packet path inside\nthe flow engine entirely belongs to the same hardware device. The simplest\nexample is SR-IOV with PF, VFs and the representors. And there is a\nbrilliant opportunity to provide some out-of-band channel to transfer\nsome extra data from one port to another one, besides the packet data\nitself. And applications would like to use this opportunity.\n\nIt is supposed for application to use trials (with rte_flow_validate)\nto detect which metadata features (FLAG, MARK, META) actually supported\nby PMD and underlying hardware. It might depend on PMD configuration,\nsystem software, hardware settings, etc., and should be detected\nin run time.\n\nSigned-off-by: Yongseok Koh <yskoh@mellanox.com>\nSigned-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>\nAcked-by: Andrew Rybchenko <arybchenko@solarflare.com>\nAcked-by: Olivier Matz <olivier.matz@6wind.com>\nAcked-by: Ori Kam <orika@mellanox.com>\n---\nv8  - add flow metadata comment to rte_mbuf_dyn.h\n\nv7: - http://patches.dpdk.org/patch/62278/\n    - updated release notes in collateral patch\n\nv6: - http://patches.dpdk.org/patch/62245/\n    - minor code style issues\n    - is combined in series with followed egress metadata patch\n\nv5: - http://patches.dpdk.org/patch/62179/\n    - addressed code style issues from comments\n    - Tx metadata deprecation notice removed\n      (dedicated tx_metadata patch is coming)\n    - MBUF_DYNF_METADATA_NAME is splitted into FIELD and FLAG\n      dedicated ones, RTE suffix is added\n    - metadata historic retrospective is added to log message\n    - rebased\n\nv4: - http://patches.dpdk.org/patch/62065/\n    - documentation comments addressed\n    - deprecation notice for Tx metadata offload flag\n    - rebased\n\nv3: - http://patches.dpdk.org/patch/61902/\n    - rebased, neat updates\n\nv2: - http://patches.dpdk.org/patch/60909/\n\nv1: - http://patches.dpdk.org/patch/56104/\n    - rfc: http://patches.dpdk.org/patch/54271/\n\n app/test-pmd/cmdline_flow.c              |  57 ++++++++++++++++-\n app/test-pmd/util.c                      |   5 ++\n doc/guides/prog_guide/rte_flow.rst       |  72 ++++++++++++++++-----\n doc/guides/rel_notes/release_19_11.rst   |  13 ++++\n lib/librte_ethdev/rte_ethdev_version.map |   3 +\n lib/librte_ethdev/rte_flow.c             |  40 ++++++++++++\n lib/librte_ethdev/rte_flow.h             | 103 +++++++++++++++++++++++++++++--\n lib/librte_mbuf/rte_mbuf_dyn.h           |  16 ++++-\n 8 files changed, 287 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex 0d0bc0a..e4ef066 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -316,6 +316,9 @@ enum index {\n \tACTION_RAW_ENCAP_INDEX_VALUE,\n \tACTION_RAW_DECAP_INDEX,\n \tACTION_RAW_DECAP_INDEX_VALUE,\n+\tACTION_SET_META,\n+\tACTION_SET_META_DATA,\n+\tACTION_SET_META_MASK,\n };\n \n /** Maximum size for pattern in struct rte_flow_item_raw. */\n@@ -1067,6 +1070,7 @@ struct parse_action_priv {\n \tACTION_DEC_TCP_ACK,\n \tACTION_RAW_ENCAP,\n \tACTION_RAW_DECAP,\n+\tACTION_SET_META,\n \tZERO,\n };\n \n@@ -1265,6 +1269,13 @@ struct parse_action_priv {\n \tZERO,\n };\n \n+static const enum index action_set_meta[] = {\n+\tACTION_SET_META_DATA,\n+\tACTION_SET_META_MASK,\n+\tACTION_NEXT,\n+\tZERO,\n+};\n+\n static int parse_set_raw_encap_decap(struct context *, const struct token *,\n \t\t\t\t     const char *, unsigned int,\n \t\t\t\t     void *, unsigned int);\n@@ -1329,6 +1340,10 @@ static int parse_vc_action_raw_encap_index(struct context *,\n static int parse_vc_action_raw_decap_index(struct context *,\n \t\t\t\t\t   const struct token *, const char *,\n \t\t\t\t\t   unsigned int, void *, unsigned int);\n+static int parse_vc_action_set_meta(struct context *ctx,\n+\t\t\t\t    const struct token *token, const char *str,\n+\t\t\t\t    unsigned int len, void *buf,\n+\t\t\t\t    unsigned int size);\n static int parse_destroy(struct context *, const struct token *,\n \t\t\t const char *, unsigned int,\n \t\t\t void *, unsigned int);\n@@ -3378,7 +3393,31 @@ static int comp_set_raw_index(struct context *, const struct token *,\n \t\t.help = \"index of raw_encap/raw_decap data\",\n \t\t.next = NEXT(next_item),\n \t\t.call = parse_port,\n-\t}\n+\t},\n+\t[ACTION_SET_META] = {\n+\t\t.name = \"set_meta\",\n+\t\t.help = \"set metadata\",\n+\t\t.priv = PRIV_ACTION(SET_META,\n+\t\t\tsizeof(struct rte_flow_action_set_meta)),\n+\t\t.next = NEXT(action_set_meta),\n+\t\t.call = parse_vc_action_set_meta,\n+\t},\n+\t[ACTION_SET_META_DATA] = {\n+\t\t.name = \"data\",\n+\t\t.help = \"metadata value\",\n+\t\t.next = NEXT(action_set_meta, NEXT_ENTRY(UNSIGNED)),\n+\t\t.args = ARGS(ARGS_ENTRY_HTON\n+\t\t\t     (struct rte_flow_action_set_meta, data)),\n+\t\t.call = parse_vc_conf,\n+\t},\n+\t[ACTION_SET_META_MASK] = {\n+\t\t.name = \"mask\",\n+\t\t.help = \"mask for metadata value\",\n+\t\t.next = NEXT(action_set_meta, NEXT_ENTRY(UNSIGNED)),\n+\t\t.args = ARGS(ARGS_ENTRY_HTON\n+\t\t\t     (struct rte_flow_action_set_meta, mask)),\n+\t\t.call = parse_vc_conf,\n+\t},\n };\n \n /** Remove and return last entry from argument stack. */\n@@ -4818,6 +4857,22 @@ static int comp_set_raw_index(struct context *, const struct token *,\n \treturn ret;\n }\n \n+static int\n+parse_vc_action_set_meta(struct context *ctx, const struct token *token,\n+\t\t\t const char *str, unsigned int len, void *buf,\n+\t\t\t unsigned int size)\n+{\n+\tint ret;\n+\n+\tret = parse_vc(ctx, token, str, len, buf, size);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\tret = rte_flow_dynf_metadata_register();\n+\tif (ret < 0)\n+\t\treturn -1;\n+\treturn len;\n+}\n+\n /** Parse tokens for destroy command. */\n static int\n parse_destroy(struct context *ctx, const struct token *token,\ndiff --git a/app/test-pmd/util.c b/app/test-pmd/util.c\nindex f20531d..56075b3 100644\n--- a/app/test-pmd/util.c\n+++ b/app/test-pmd/util.c\n@@ -82,6 +82,11 @@\n \t\t\t       mb->vlan_tci, mb->vlan_tci_outer);\n \t\telse if (ol_flags & PKT_RX_VLAN)\n \t\t\tprintf(\" - VLAN tci=0x%x\", mb->vlan_tci);\n+\t\tif (ol_flags & PKT_TX_METADATA)\n+\t\t\tprintf(\" - Tx metadata: 0x%x\", mb->tx_metadata);\n+\t\tif (ol_flags & PKT_RX_DYNF_METADATA)\n+\t\t\tprintf(\" - Rx metadata: 0x%x\",\n+\t\t\t       *RTE_FLOW_DYNF_METADATA(mb));\n \t\tif (mb->packet_type) {\n \t\t\trte_get_ptype_name(mb->packet_type, buf, sizeof(buf));\n \t\t\tprintf(\" - hw ptype: %s\", buf);\ndiff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst\nindex 159ce19..c943aca 100644\n--- a/doc/guides/prog_guide/rte_flow.rst\n+++ b/doc/guides/prog_guide/rte_flow.rst\n@@ -658,6 +658,32 @@ the physical device, with virtual groups in the PMD or not at all.\n    | ``mask`` | ``id``   | zeroed to match any value |\n    +----------+----------+---------------------------+\n \n+Item: ``META``\n+^^^^^^^^^^^^^^^^^\n+\n+Matches 32 bit metadata item set.\n+\n+On egress, metadata can be set either by mbuf metadata field with\n+PKT_TX_METADATA flag or ``SET_META`` action. On ingress, ``SET_META``\n+action sets metadata for a packet and the metadata will be reported via\n+``metadata`` dynamic field of ``rte_mbuf`` with PKT_RX_DYNF_METADATA flag.\n+\n+- Default ``mask`` matches the specified Rx metadata value.\n+\n+.. _table_rte_flow_item_meta:\n+\n+.. table:: META\n+\n+   +----------+----------+---------------------------------------+\n+   | Field    | Subfield | Value                                 |\n+   +==========+==========+=======================================+\n+   | ``spec`` | ``data`` | 32 bit metadata value                 |\n+   +----------+----------+---------------------------------------+\n+   | ``last`` | ``data`` | upper range value                     |\n+   +----------+----------+---------------------------------------+\n+   | ``mask`` | ``data`` | bit-mask applies to \"spec\" and \"last\" |\n+   +----------+----------+---------------------------------------+\n+\n Data matching item types\n ~~~~~~~~~~~~~~~~~~~~~~~~\n \n@@ -1232,21 +1258,6 @@ Matches a PPPoE session protocol identifier.\n - ``proto_id``: PPP protocol identifier.\n - Default ``mask`` matches proto_id only.\n \n-\n-.. _table_rte_flow_item_meta:\n-\n-.. table:: META\n-\n-   +----------+----------+---------------------------------------+\n-   | Field    | Subfield | Value                                 |\n-   +==========+==========+=======================================+\n-   | ``spec`` | ``data`` | 32 bit metadata value                 |\n-   +----------+--------------------------------------------------+\n-   | ``last`` | ``data`` | upper range value                     |\n-   +----------+----------+---------------------------------------+\n-   | ``mask`` | ``data`` | bit-mask applies to \"spec\" and \"last\" |\n-   +----------+----------+---------------------------------------+\n-\n Item: ``NSH``\n ^^^^^^^^^^^^^\n \n@@ -2466,6 +2477,37 @@ Value to decrease TCP acknowledgment number by is a big-endian 32 bit integer.\n \n Using this action on non-matching traffic will result in undefined behavior.\n \n+Action: ``SET_META``\n+^^^^^^^^^^^^^^^^^^^^^^^\n+\n+Set metadata. Item ``META`` matches metadata.\n+\n+Metadata set by mbuf metadata field with PKT_TX_METADATA flag on egress will be\n+overridden by this action. On ingress, the metadata will be carried by\n+``metadata`` dynamic field of ``rte_mbuf`` which can be accessed by\n+``RTE_FLOW_DYNF_METADATA()``. PKT_RX_DYNF_METADATA flag will be set along\n+with the data.\n+\n+The mbuf dynamic field must be registered by calling\n+``rte_flow_dynf_metadata_register()`` prior to use ``SET_META`` action.\n+\n+Altering partial bits is supported with ``mask``. For bits which have never been\n+set, unpredictable value will be seen depending on driver implementation. For\n+loopback/hairpin packet, metadata set on Rx/Tx may or may not be propagated to\n+the other path depending on HW capability.\n+\n+.. _table_rte_flow_action_set_meta:\n+\n+.. table:: SET_META\n+\n+   +----------+----------------------------+\n+   | Field    | Value                      |\n+   +==========+============================+\n+   | ``data`` | 32 bit metadata value      |\n+   +----------+----------------------------+\n+   | ``mask`` | bit-mask applies to \"data\" |\n+   +----------+----------------------------+\n+\n Negative types\n ~~~~~~~~~~~~~~\n \ndiff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst\nindex f6e90cb..963c4f8 100644\n--- a/doc/guides/rel_notes/release_19_11.rst\n+++ b/doc/guides/rel_notes/release_19_11.rst\n@@ -237,6 +237,14 @@ New Features\n   On supported NICs, we can now setup haipin queue which will offload packets\n   from the wire, backto the wire.\n \n+* **Extended metadata support in rte_flow.**\n+\n+  Flow metadata is extended to both Rx and Tx.\n+\n+  * Tx metadata can also be set by SET_META action of rte_flow.\n+  * Rx metadata is delivered to host via a dynamic field of ``rte_mbuf`` with\n+    PKT_RX_DYNF_METADATA.\n+\n \n Removed Items\n -------------\n@@ -344,6 +352,11 @@ API Changes\n   has been introduced in this release is used when used when all the packets\n   enqueued in the tx adapter are destined for the same Ethernet port & Tx queue.\n \n+* metadata: RTE_FLOW_ITEM_TYPE_META data endianness altered to host one.\n+  Due to the new dynamic metadata field in mbuf is host-endian either, there\n+  is the minor compatibility issue for applications in case of 32-bit values\n+  supported.\n+\n * sched: The pipe nodes configuration parameters such as number of pipes,\n   pipe queue sizes, pipe profiles, etc., are moved from port level structure\n   to subport level. This allows different subports of the same port to\ndiff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map\nindex 48b5389..e593f34 100644\n--- a/lib/librte_ethdev/rte_ethdev_version.map\n+++ b/lib/librte_ethdev/rte_ethdev_version.map\n@@ -291,4 +291,7 @@ EXPERIMENTAL {\n \trte_eth_rx_hairpin_queue_setup;\n \trte_eth_tx_hairpin_queue_setup;\n \trte_eth_dev_hairpin_capability_get;\n+\trte_flow_dynf_metadata_offs;\n+\trte_flow_dynf_metadata_mask;\n+\trte_flow_dynf_metadata_register;\n };\ndiff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c\nindex ca0f680..b0490cd 100644\n--- a/lib/librte_ethdev/rte_flow.c\n+++ b/lib/librte_ethdev/rte_flow.c\n@@ -12,10 +12,18 @@\n #include <rte_errno.h>\n #include <rte_branch_prediction.h>\n #include <rte_string_fns.h>\n+#include <rte_mbuf.h>\n+#include <rte_mbuf_dyn.h>\n #include \"rte_ethdev.h\"\n #include \"rte_flow_driver.h\"\n #include \"rte_flow.h\"\n \n+/* Mbuf dynamic field name for metadata. */\n+int rte_flow_dynf_metadata_offs = -1;\n+\n+/* Mbuf dynamic field flag bit number for metadata. */\n+uint64_t rte_flow_dynf_metadata_mask;\n+\n /**\n  * Flow elements description tables.\n  */\n@@ -157,8 +165,40 @@ struct rte_flow_desc_data {\n \tMK_FLOW_ACTION(DEC_TCP_SEQ, sizeof(rte_be32_t)),\n \tMK_FLOW_ACTION(INC_TCP_ACK, sizeof(rte_be32_t)),\n \tMK_FLOW_ACTION(DEC_TCP_ACK, sizeof(rte_be32_t)),\n+\tMK_FLOW_ACTION(SET_META, sizeof(struct rte_flow_action_set_meta)),\n };\n \n+int\n+rte_flow_dynf_metadata_register(void)\n+{\n+\tint offset;\n+\tint flag;\n+\n+\tstatic const struct rte_mbuf_dynfield desc_offs = {\n+\t\t.name = RTE_MBUF_DYNFIELD_METADATA_NAME,\n+\t\t.size = sizeof(uint32_t),\n+\t\t.align = __alignof__(uint32_t),\n+\t};\n+\tstatic const struct rte_mbuf_dynflag desc_flag = {\n+\t\t.name = RTE_MBUF_DYNFLAG_METADATA_NAME,\n+\t};\n+\n+\toffset = rte_mbuf_dynfield_register(&desc_offs);\n+\tif (offset < 0)\n+\t\tgoto error;\n+\tflag = rte_mbuf_dynflag_register(&desc_flag);\n+\tif (flag < 0)\n+\t\tgoto error;\n+\trte_flow_dynf_metadata_offs = offset;\n+\trte_flow_dynf_metadata_mask = (1ULL << flag);\n+\treturn 0;\n+\n+error:\n+\trte_flow_dynf_metadata_offs = -1;\n+\trte_flow_dynf_metadata_mask = 0ULL;\n+\treturn -rte_errno;\n+}\n+\n static int\n flow_err(uint16_t port_id, int ret, struct rte_flow_error *error)\n {\ndiff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h\nindex 4fee105..f6e050c 100644\n--- a/lib/librte_ethdev/rte_flow.h\n+++ b/lib/librte_ethdev/rte_flow.h\n@@ -28,6 +28,8 @@\n #include <rte_byteorder.h>\n #include <rte_esp.h>\n #include <rte_higig.h>\n+#include <rte_mbuf.h>\n+#include <rte_mbuf_dyn.h>\n \n #ifdef __cplusplus\n extern \"C\" {\n@@ -418,7 +420,8 @@ enum rte_flow_item_type {\n \t/**\n \t * [META]\n \t *\n-\t * Matches a metadata value specified in mbuf metadata field.\n+\t * Matches a metadata value.\n+\t *\n \t * See struct rte_flow_item_meta.\n \t */\n \tRTE_FLOW_ITEM_TYPE_META,\n@@ -1263,18 +1266,23 @@ struct rte_flow_item_icmp6_nd_opt_tla_eth {\n #endif\n \n /**\n- * RTE_FLOW_ITEM_TYPE_META.\n+ * RTE_FLOW_ITEM_TYPE_META\n  *\n- * Matches a specified metadata value.\n+ * Matches a specified metadata value. On egress, metadata can be set either by\n+ * mbuf tx_metadata field with PKT_TX_METADATA flag or\n+ * RTE_FLOW_ACTION_TYPE_SET_META. On ingress, RTE_FLOW_ACTION_TYPE_SET_META sets\n+ * metadata for a packet and the metadata will be reported via mbuf metadata\n+ * dynamic field with PKT_RX_DYNF_METADATA flag. The dynamic mbuf field must be\n+ * registered in advance by rte_flow_dynf_metadata_register().\n  */\n struct rte_flow_item_meta {\n-\trte_be32_t data;\n+\tuint32_t data;\n };\n \n /** Default mask for RTE_FLOW_ITEM_TYPE_META. */\n #ifndef __cplusplus\n static const struct rte_flow_item_meta rte_flow_item_meta_mask = {\n-\t.data = RTE_BE32(UINT32_MAX),\n+\t.data = UINT32_MAX,\n };\n #endif\n \n@@ -1942,6 +1950,13 @@ enum rte_flow_action_type {\n \t * undefined behavior.\n \t */\n \tRTE_FLOW_ACTION_TYPE_DEC_TCP_ACK,\n+\n+\t/**\n+\t * Set metadata on ingress or egress path.\n+\t *\n+\t * See struct rte_flow_action_set_meta.\n+\t */\n+\tRTE_FLOW_ACTION_TYPE_SET_META,\n };\n \n /**\n@@ -2429,6 +2444,57 @@ struct rte_flow_action_set_mac {\n \tuint8_t mac_addr[RTE_ETHER_ADDR_LEN];\n };\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this structure may change without prior notice\n+ *\n+ * RTE_FLOW_ACTION_TYPE_SET_META\n+ *\n+ * Set metadata. Metadata set by mbuf tx_metadata field with\n+ * PKT_TX_METADATA flag on egress will be overridden by this action. On\n+ * ingress, the metadata will be carried by mbuf metadata dynamic field\n+ * with PKT_RX_DYNF_METADATA flag if set.  The dynamic mbuf field must be\n+ * registered in advance by rte_flow_dynf_metadata_register().\n+ *\n+ * Altering partial bits is supported with mask. For bits which have never\n+ * been set, unpredictable value will be seen depending on driver\n+ * implementation. For loopback/hairpin packet, metadata set on Rx/Tx may\n+ * or may not be propagated to the other path depending on HW capability.\n+ *\n+ * RTE_FLOW_ITEM_TYPE_META matches metadata.\n+ */\n+struct rte_flow_action_set_meta {\n+\tuint32_t data;\n+\tuint32_t mask;\n+};\n+\n+/* Mbuf dynamic field offset for metadata. */\n+extern int rte_flow_dynf_metadata_offs;\n+\n+/* Mbuf dynamic field flag mask for metadata. */\n+extern uint64_t rte_flow_dynf_metadata_mask;\n+\n+/* Mbuf dynamic field pointer for metadata. */\n+#define RTE_FLOW_DYNF_METADATA(m) \\\n+\tRTE_MBUF_DYNFIELD((m), rte_flow_dynf_metadata_offs, uint32_t *)\n+\n+/* Mbuf dynamic flag for metadata. */\n+#define PKT_RX_DYNF_METADATA (rte_flow_dynf_metadata_mask)\n+\n+__rte_experimental\n+static inline uint32_t\n+rte_flow_dynf_metadata_get(struct rte_mbuf *m)\n+{\n+\treturn *RTE_FLOW_DYNF_METADATA(m);\n+}\n+\n+__rte_experimental\n+static inline void\n+rte_flow_dynf_metadata_set(struct rte_mbuf *m, uint32_t v)\n+{\n+\t*RTE_FLOW_DYNF_METADATA(m) = v;\n+}\n+\n /*\n  * Definition of a single action.\n  *\n@@ -2662,6 +2728,33 @@ enum rte_flow_conv_op {\n };\n \n /**\n+ * Check if mbuf dynamic field for metadata is registered.\n+ *\n+ * @return\n+ *   True if registered, false otherwise.\n+ */\n+__rte_experimental\n+static inline int\n+rte_flow_dynf_metadata_avail(void)\n+{\n+\treturn !!rte_flow_dynf_metadata_mask;\n+}\n+\n+/**\n+ * Register mbuf dynamic field and flag for metadata.\n+ *\n+ * This function must be called prior to use SET_META action in order to\n+ * register the dynamic mbuf field. Otherwise, the data cannot be delivered to\n+ * application.\n+ *\n+ * @return\n+ *   0 on success, a negative errno value otherwise and rte_errno is set.\n+ */\n+__rte_experimental\n+int\n+rte_flow_dynf_metadata_register(void);\n+\n+/**\n  * Check whether a flow rule can be created on a given port.\n  *\n  * The flow rule is validated for correctness and whether it could be accepted\ndiff --git a/lib/librte_mbuf/rte_mbuf_dyn.h b/lib/librte_mbuf/rte_mbuf_dyn.h\nindex 2e9d418..96c3631 100644\n--- a/lib/librte_mbuf/rte_mbuf_dyn.h\n+++ b/lib/librte_mbuf/rte_mbuf_dyn.h\n@@ -234,6 +234,20 @@ int rte_mbuf_dynflag_lookup(const char *name,\n __rte_experimental\n void rte_mbuf_dyn_dump(FILE *out);\n \n-/* Placeholder for dynamic fields and flags declarations. */\n+/*\n+ * Placeholder for dynamic fields and flags declarations.\n+ * This is centralizing point to gather all field names\n+ * and parameters together.\n+ */\n+\n+/*\n+ * The metadata dynamic field provides some extra packet information\n+ * to interact with RTE Flow engine. The metadata in sent mbufs can be\n+ * used to match on some Flows. The metadata in received mbufs can\n+ * provide some feedback from the Flows. The metadata flag tells\n+ * whether the field contains actual value to send, or received one.\n+ */\n+#define RTE_MBUF_DYNFIELD_METADATA_NAME \"rte_flow_dynfield_metadata\"\n+#define RTE_MBUF_DYNFLAG_METADATA_NAME \"rte_flow_dynflag_metadata\"\n \n #endif\n",
    "prefixes": [
        "v8",
        "1/2"
    ]
}