get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 85364,
    "url": "http://patches.dpdk.org/api/patches/85364/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20201217173037.11396-25-talshn@nvidia.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": "<20201217173037.11396-25-talshn@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201217173037.11396-25-talshn@nvidia.com",
    "date": "2020-12-17T17:30:26",
    "name": "[24/35] net/mlx5/windows: introduce flow support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "7808ef35d68d8c45c44826cbd41c93e85f8b37fa",
    "submitter": {
        "id": 1893,
        "url": "http://patches.dpdk.org/api/people/1893/?format=api",
        "name": "Tal Shnaiderman",
        "email": "talshn@nvidia.com"
    },
    "delegate": {
        "id": 3268,
        "url": "http://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20201217173037.11396-25-talshn@nvidia.com/mbox/",
    "series": [
        {
            "id": 14351,
            "url": "http://patches.dpdk.org/api/series/14351/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=14351",
            "date": "2020-12-17T17:30:04",
            "name": "mlx5 Windows support - part #6",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/14351/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/85364/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/85364/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 ABE42A09F6;\n\tThu, 17 Dec 2020 18:42:21 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id A8C28CBF4;\n\tThu, 17 Dec 2020 18:33:51 +0100 (CET)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id D83F9CA52\n for <dev@dpdk.org>; Thu, 17 Dec 2020 18:33:10 +0100 (CET)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n talshn@nvidia.com) with SMTP; 17 Dec 2020 19:33:06 +0200",
            "from nvidia.com (l-wincomp04-vm.mtl.labs.mlnx [10.237.1.5])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0BHHX45j021771;\n Thu, 17 Dec 2020 19:33:06 +0200"
        ],
        "From": "Tal Shnaiderman <talshn@nvidia.com>",
        "To": "dev@dpdk.org",
        "Cc": "thomas@monjalon.net, matan@nvidia.com, rasland@nvidia.com,\n ophirmu@nvidia.com, Dekel Peled <dekelp@nvidia.com>",
        "Date": "Thu, 17 Dec 2020 19:30:26 +0200",
        "Message-Id": "<20201217173037.11396-25-talshn@nvidia.com>",
        "X-Mailer": "git-send-email 2.16.1.windows.4",
        "In-Reply-To": "<20201217173037.11396-1-talshn@nvidia.com>",
        "References": "<20201217173037.11396-1-talshn@nvidia.com>",
        "Subject": "[dpdk-dev] [PATCH 24/35] net/mlx5/windows: introduce flow support",
        "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": "From: Ophir Munk <ophirmu@nvidia.com>\n\nThis patch adds the initial flow framework under Windows OS. It supports\na subset of filters (ETH, IPV4, UDP) and a QUEUE action.  It is based on\nDevX mechanism to send commands to the NIC through the kernel. It does\nnot support steering rules (i.e. writing directly to the NIC memory).\nThe Windows framework uses the existing DV framework where file\nmlx5_flow_dv.c remains intact.\n\nSteps involved in flow creation:\n1. Create a domain (RX, TX, FDB). Since domains are created by steering\nrules and not with DevX, Windows does not require a domain object (this\nmeans switch dev mode which requires an FDB domain is not supported).\n2. Create a table object. Windows only supports table 0. The call to\nmlx5_flow_os_create_flow_tbl() silently returns successfully.\n3. Create a matcher object. A matcher struct is created by calling\nmlx5_flow_os_create_flow_matcher().  The matcher validation and\ntranslation are part of the DV implementation. The matcher bits that\nwere created by DV in standard PRM format are copied into the matcher\nstruct.\n4. Create an action object. The call to\nmlx5_flow_os_create_flow_action_dest_devx_tir() creates an action struct\nwith the TIR type and id.  This struct will be a parameter later in a\ncall to flow creation.  All other action calls (e.g. packet reformat,\nheader modification, jump to flow table, etc) return with a non\nsupported error.\n5. Create the flow. The call to mlx5_flow_os_create_flow() receives the\nmatcher struct, action struct, and copy them into Windows specific\nfs_rule struct, then it calls glue API devx_fs_rule_add().\n\nDetails on additional APIs:\n* mlx5_flow_os_get_type() is called during flow type selection. In\nWindows it constantly returns MLX5_FLOW_TYPE_DV.\n* mlx5_flow_os_item_supported() is called before starting DV items\nvalidation or translation. It filters out the OS non supported items in\nadvance.\n* mlx5_flow_os_action_supported() is called before starting DV actions\nvalidation or translation. It filters out the OS non supported actions\nin advance.\n* mlx5_flow_adjust_priority() is an OS stub for flow priority\nadjustment. Windows only supports flow priority 0.\n* Alarm API: mlx5_os_alarm_cancel() and mlx5_os_alarm_set() are\nimplemented in Windows to match their Linux counterpart, see [1].\nCurrently they return -ENOTSUP.\n\n[1]\n(\"net/mlx5/linux: wrap rte alarm API with mlx5\")\n\nSigned-off-by: Ophir Munk <ophirmu@nvidia.com>\nSigned-off-by: Dekel Peled <dekelp@nvidia.com>\nAcked-by: Matan Azrad <matan@nvidia.com>\n---\n drivers/common/mlx5/windows/mlx5_win_defs.h |   7 +\n drivers/net/mlx5/windows/meson.build        |   1 +\n drivers/net/mlx5/windows/mlx5_flow_os.c     | 188 ++++++++++++++\n drivers/net/mlx5/windows/mlx5_flow_os.h     | 363 ++++++++++++++++++++++++++++\n 4 files changed, 559 insertions(+)\n create mode 100644 drivers/net/mlx5/windows/mlx5_flow_os.c\n create mode 100644 drivers/net/mlx5/windows/mlx5_flow_os.h",
    "diff": "diff --git a/drivers/common/mlx5/windows/mlx5_win_defs.h b/drivers/common/mlx5/windows/mlx5_win_defs.h\nindex d8f20993e0..27dcf40819 100644\n--- a/drivers/common/mlx5/windows/mlx5_win_defs.h\n+++ b/drivers/common/mlx5/windows/mlx5_win_defs.h\n@@ -169,4 +169,11 @@ struct mlx5_wqe_data_seg {\n #define IBV_RAW_PACKET_CAP_CVLAN_STRIPPING\t(1 << 0)\n #define IBV_RAW_PACKET_CAP_SCATTER_FCS\t\t(1 << 1)\n #define IBV_QPT_RAW_PACKET\t\t\t8\n+\n+enum {\n+\tMLX5_FLOW_CONTEXT_DEST_TYPE_VPORT                    = 0x0,\n+\tMLX5_FLOW_CONTEXT_DEST_TYPE_FLOW_TABLE               = 0x1,\n+\tMLX5_FLOW_CONTEXT_DEST_TYPE_TIR                      = 0x2,\n+\tMLX5_FLOW_CONTEXT_DEST_TYPE_QP                       = 0x3,\n+};\n #endif /* __MLX5_WIN_DEFS_H__ */\ndiff --git a/drivers/net/mlx5/windows/meson.build b/drivers/net/mlx5/windows/meson.build\nindex 87e34d3cda..8404dc1247 100644\n--- a/drivers/net/mlx5/windows/meson.build\n+++ b/drivers/net/mlx5/windows/meson.build\n@@ -7,5 +7,6 @@ sources += files(\n \t'mlx5_mp_os.c',\n \t'mlx5_ethdev_os.c',\n \t'mlx5_vlan_os.c',\n+\t'mlx5_flow_os.c',\n )\n \ndiff --git a/drivers/net/mlx5/windows/mlx5_flow_os.c b/drivers/net/mlx5/windows/mlx5_flow_os.c\nnew file mode 100644\nindex 0000000000..8c504fc69c\n--- /dev/null\n+++ b/drivers/net/mlx5/windows/mlx5_flow_os.c\n@@ -0,0 +1,188 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2020 Mellanox Technologies, Ltd\n+ */\n+\n+#include \"mlx5_flow_os.h\"\n+#include \"mlx5_win_ext.h\"\n+\n+/**\n+ * Verify the @p attributes will be correctly understood by the NIC and store\n+ * them in the @p flow if everything is correct.\n+ *\n+ * @param[in] dev\n+ *   Pointer to dev struct.\n+ * @param[in] attributes\n+ *   Pointer to flow attributes\n+ * @param[in] external\n+ *   This flow rule is created by request external to PMD.\n+ * @param[out] error\n+ *   Pointer to error structure.\n+ *\n+ * @return\n+ *   - 0 on success and non root table (not a valid option for Windows yet).\n+ *   - 1 on success and root table.\n+ *   - a negative errno value otherwise and rte_errno is set.\n+ */\n+int\n+mlx5_flow_os_validate_flow_attributes(struct rte_eth_dev *dev,\n+\t\t\t\t      const struct rte_flow_attr *attributes,\n+\t\t\t\t      bool external,\n+\t\t\t\t      struct rte_flow_error *error)\n+{\n+\tint ret = 1;\n+\n+\tRTE_SET_USED(dev);\n+\tRTE_SET_USED(external);\n+\tif (attributes->group)\n+\t\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ATTR_GROUP,\n+\t\t\t\t\t  NULL,\n+\t\t\t\t\t  \"groups are not supported\");\n+\tif (attributes->priority)\n+\t\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,\n+\t\t\t\t\t  NULL,\n+\t\t\t\t\t  \"priorities are not supported\");\n+\tif (attributes->transfer)\n+\t\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER,\n+\t\t\t\t\t  NULL,\n+\t\t\t\t\t  \"transfer not supported\");\n+\tif (!(attributes->ingress))\n+\t\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,\n+\t\t\t\t\t  NULL, \"must specify ingress only\");\n+\treturn ret;\n+}\n+\n+/**\n+ * Create flow matcher in a flow table.\n+ *\n+ * @param[in] ctx\n+ *   Pointer to relevant device context.\n+ * @param[in] attr\n+ *   Pointer to relevant attributes.\n+ * @param[in] table\n+ *   Pointer to table object.\n+ * @param[out] matcher\n+ *   Pointer to a valid flow matcher object on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or errno on failure.\n+ */\n+int\n+mlx5_flow_os_create_flow_matcher(void *ctx,\n+\t\t\t\t void *attr,\n+\t\t\t\t void *table,\n+\t\t\t\t void **matcher)\n+{\n+\tRTE_SET_USED(ctx);\n+\tRTE_SET_USED(attr);\n+\tRTE_SET_USED(table);\n+\t*matcher = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Destroy flow matcher.\n+ *\n+ * @param[in] matcher\n+ *   Pointer to matcher object to destroy.\n+ *\n+ * @return\n+ *   0 on success, or the value of errno on failure.\n+ */\n+int\n+mlx5_flow_os_destroy_flow_matcher(void *matcher)\n+{\n+\tRTE_SET_USED(matcher);\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: dest_devx_tir\n+ *\n+ * @param[in] tir\n+ *   Pointer to DevX tir object\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or errno on failure.\n+ */\n+int\n+mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj *tir,\n+\t\t\t\t\t      void **action)\n+{\n+\tRTE_SET_USED(tir);\n+\t*action = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Destroy flow action.\n+ *\n+ * @param[in] action\n+ *   Pointer to action object to destroy.\n+ *\n+ * @return\n+ *   0 on success, or the value of errno on failure.\n+ */\n+int\n+mlx5_flow_os_destroy_flow_action(void *action)\n+{\n+\tRTE_SET_USED(action);\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow rule.\n+ *\n+ * @param[in] matcher\n+ *   Pointer to match mask structure.\n+ * @param[in] match_value\n+ *   Pointer to match value structure.\n+ * @param[in] num_actions\n+ *   Number of actions in flow rule.\n+ * @param[in] actions\n+ *   Pointer to array of flow rule actions.\n+ * @param[out] flow\n+ *   Pointer to a valid flow rule object on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or errno on failure.\n+ */\n+int\n+mlx5_flow_os_create_flow(void *matcher, void *match_value,\n+\t\t\t size_t num_actions,\n+\t\t\t void *actions[], void **flow)\n+{\n+\tRTE_SET_USED(matcher);\n+\tRTE_SET_USED(match_value);\n+\tRTE_SET_USED(num_actions);\n+\tRTE_SET_USED(actions);\n+\t*flow = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Destroy flow rule.\n+ *\n+ * @param[in] drv_flow_ptr\n+ *   Pointer to flow rule object.\n+ *\n+ * @return\n+ *   0 on success, errno on failure.\n+ */\n+int\n+mlx5_flow_os_destroy_flow(void *drv_flow_ptr)\n+{\n+\tRTE_SET_USED(dev_flow_ptr);\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\ndiff --git a/drivers/net/mlx5/windows/mlx5_flow_os.h b/drivers/net/mlx5/windows/mlx5_flow_os.h\nnew file mode 100644\nindex 0000000000..1e762c17dc\n--- /dev/null\n+++ b/drivers/net/mlx5/windows/mlx5_flow_os.h\n@@ -0,0 +1,363 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2020 Mellanox Technologies, Ltd\n+ */\n+\n+#ifndef RTE_PMD_MLX5_FLOW_OS_H_\n+#define RTE_PMD_MLX5_FLOW_OS_H_\n+\n+#include \"mlx5_flow.h\"\n+\n+#if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)\n+extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops;\n+#endif\n+\n+/**\n+ * Get OS enforced flow type. MLX5_FLOW_TYPE_MAX means \"non enforced type\".\n+ *\n+ * @return\n+ *   Flow type (MLX5_FLOW_TYPE_MAX)\n+ */\n+static inline enum mlx5_flow_drv_type\n+mlx5_flow_os_get_type(void)\n+{\n+\treturn MLX5_FLOW_TYPE_DV;\n+}\n+\n+/**\n+ * Check if item type is supported.\n+ *\n+ * @param item\n+ *   Item type to check.\n+ *\n+ * @return\n+ *   True is this item type is supported, false if not supported.\n+ */\n+static inline bool\n+mlx5_flow_os_item_supported(int item)\n+{\n+\tswitch (item) {\n+\tcase RTE_FLOW_ITEM_TYPE_END:\n+\tcase RTE_FLOW_ITEM_TYPE_VOID:\n+\tcase RTE_FLOW_ITEM_TYPE_ETH:\n+\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n+\tcase RTE_FLOW_ITEM_TYPE_UDP:\n+\t\treturn true;\n+\tdefault:\n+\t\treturn false;\n+\t}\n+}\n+\n+/**\n+ * Check if action type is supported.\n+ *\n+ * @param action\n+ *   Action type to check.\n+ *\n+ * @return\n+ *   True is this action type is supported, false if not supported.\n+ */\n+static inline bool\n+mlx5_flow_os_action_supported(int action)\n+{\n+\tswitch (action) {\n+\tcase RTE_FLOW_ACTION_TYPE_END:\n+\tcase RTE_FLOW_ACTION_TYPE_VOID:\n+\tcase RTE_FLOW_ACTION_TYPE_QUEUE:\n+\tcase RTE_FLOW_ACTION_TYPE_RSS:\n+\t\treturn true;\n+\tdefault:\n+\t\treturn false;\n+\t}\n+}\n+\n+/**\n+ * Create flow table.\n+ *\n+ * @param[in] domain\n+ *   Pointer to relevant domain.\n+ * @param[in] table_id\n+ *   Table ID.\n+ * @param[out] table\n+ *   NULL (no table object required)\n+ *\n+ * @return\n+ *   0 if table_id is 0, negative value otherwise and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_tbl(void *domain, uint32_t table_id, void **table)\n+{\n+\tRTE_SET_USED(domain);\n+\t*table = NULL;\n+\tif (table_id) {\n+\t\trte_errno = ENOTSUP;\n+\t\treturn -rte_errno;\n+\t}\n+\treturn 0;\n+}\n+\n+/**\n+ * Destroy flow table.\n+ *\n+ * @param table\n+ *   Pointer to table to destroy.\n+ *\n+ * @return\n+ *   0 on success (silently ignored).\n+ */\n+static inline int\n+mlx5_flow_os_destroy_flow_tbl(void *table)\n+{\n+\tRTE_SET_USED(table);\n+\t/* Silently ignore */\n+\treturn 0;\n+}\n+\n+/**\n+ * Create flow action: packet reformat.\n+ *\n+ * @param[in] ctx\n+ *   Pointer to relevant device context.\n+ * @param[in] domain\n+ *   Pointer to domain handler.\n+ * @param[in] resource\n+ *   Pointer to action data resource.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_packet_reformat(void *ctx, void *domain,\n+\t\t\t\t\t\tvoid *resource, void **action)\n+{\n+\tRTE_SET_USED(ctx);\n+\tRTE_SET_USED(domain);\n+\tRTE_SET_USED(resource);\n+\tRTE_SET_USED(action);\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: modify header.\n+ *\n+ * @param[in] ctx\n+ *   Pointer to relevant device context.\n+ * @param[in] domain\n+ *   Pointer to domain handler.\n+ * @param[in] resource\n+ *   Pointer to action data resource.\n+ * @param[in] actions_len\n+ *   Total length of actions data in resource.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ *\n+ * @return\n+ *   0 on success, or -1 on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_modify_header(void *ctx,\n+\t\t\t\t\t      void *domain,\n+\t\t\t\t\t      void *resource,\n+\t\t\t\t\t      uint32_t actions_len,\n+\t\t\t\t\t      void **action)\n+{\n+\tRTE_SET_USED(ctx);\n+\tRTE_SET_USED(domain);\n+\tRTE_SET_USED(resource);\n+\tRTE_SET_USED(actions_len);\n+\tRTE_SET_USED(action);\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: destination flow table.\n+ *\n+ * @param[in] tbl_obj\n+ *   Pointer to destination table object.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_dest_flow_tbl(void *tbl_obj, void **action)\n+{\n+\tRTE_SET_USED(tbl_obj);\n+\tRTE_SET_USED(action);\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: destination port.\n+ *\n+ * @param[in] domain\n+ *   Pointer to domain handler.\n+ * @param[in] port_id\n+ *   Destination port ID.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_dest_port(void *domain, uint32_t port_id,\n+\t\t\t\t\t  void **action)\n+{\n+\tRTE_SET_USED(domain);\n+\tRTE_SET_USED(port_id);\n+\t*action = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: push vlan.\n+ *\n+ * @param[in] domain\n+ *   Pointer to domain handler.\n+ * @param[in] vlan_tag\n+ *   VLAN tag value.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_push_vlan(void *domain, rte_be32_t vlan_tag,\n+\t\t\t\t\t  void **action)\n+{\n+\tRTE_SET_USED(domain);\n+\tRTE_SET_USED(vlan_tag);\n+\t*action = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: count.\n+ *\n+ * @param[in] cnt_obj\n+ *   Pointer to DevX counter object.\n+ * @param[in] offset\n+ *   Offset of counter in array.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_count(void *cnt_obj, uint16_t offset,\n+\t\t\t\t      void **action)\n+{\n+\tRTE_SET_USED(cnt_obj);\n+\tRTE_SET_USED(offset);\n+\t*action = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: tag.\n+ *\n+ * @param[in] tag\n+ *   Tag value.\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_tag(uint32_t tag, void **action)\n+{\n+\tRTE_SET_USED(tag);\n+\t*action = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: drop.\n+ *\n+ * @param[out] action\n+ *   Pointer to a valid action on success, NULL otherwise.\n+ *\n+ * @return\n+ *   0 on success, or negative value on failure and errno is set.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_drop(void **action)\n+{\n+\t*action = NULL;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Create flow action: default miss.\n+ *\n+ * @param[out] action\n+ *   NULL action pointer.\n+ *\n+ * @return\n+ *   0 as success.\n+ */\n+static inline int\n+mlx5_flow_os_create_flow_action_default_miss(void **action)\n+{\n+\t*action = 0;\n+\t/* Silently ignore */\n+\treturn 0;\n+}\n+\n+/**\n+ * OS stub for mlx5_flow_adjust_priority() API.\n+ * Windows only supports flow priority 0 that cannot be adjusted.\n+ *\n+ * @param[in] dev\n+ *    Pointer to the Ethernet device structure.\n+ * @param[in] priority\n+ *    The rule base priority.\n+ * @param[in] subpriority\n+ *    The priority based on the items.\n+ *\n+ * @return\n+ *    0\n+ */\n+static inline uint32_t\n+mlx5_os_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n+\t\t\t  uint32_t subpriority)\n+{\n+\tRTE_SET_USED(dev);\n+\tRTE_SET_USED(priority);\n+\tRTE_SET_USED(subpriority);\n+\treturn 0;\n+}\n+\n+int mlx5_flow_os_validate_flow_attributes(struct rte_eth_dev *dev,\n+\t\t\t\t\tconst struct rte_flow_attr *attributes,\n+\t\t\t\t\tbool external,\n+\t\t\t\t\tstruct rte_flow_error *error);\n+int mlx5_flow_os_create_flow_matcher(void *ctx,\n+\t\t\t\t     void *attr,\n+\t\t\t\t     void *table,\n+\t\t\t\t     void **matcher);\n+int mlx5_flow_os_destroy_flow_matcher(void *matcher);\n+int mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj *tir,\n+\t\t\t\t\t\t  void **action);\n+int mlx5_flow_os_destroy_flow_action(void *action);\n+int mlx5_flow_os_create_flow(void *matcher, void *match_value,\n+\t\t\t     size_t num_actions,\n+\t\t\t     void *actions[], void **flow);\n+int mlx5_flow_os_destroy_flow(void *drv_flow_ptr);\n+#endif /* RTE_PMD_MLX5_FLOW_OS_H_ */\n",
    "prefixes": [
        "24/35"
    ]
}