get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 137792,
    "url": "http://patchwork.dpdk.org/api/patches/137792/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240301191451.57168-23-hkalra@marvell.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": "<20240301191451.57168-23-hkalra@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240301191451.57168-23-hkalra@marvell.com",
    "date": "2024-03-01T19:14:49",
    "name": "[v5,22/23] net/cnxk: flow create on representor ports",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "2eb4f483679d85fdeffe5e5ea425e73314db7a80",
    "submitter": {
        "id": 1182,
        "url": "http://patchwork.dpdk.org/api/people/1182/?format=api",
        "name": "Harman Kalra",
        "email": "hkalra@marvell.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/20240301191451.57168-23-hkalra@marvell.com/mbox/",
    "series": [
        {
            "id": 31343,
            "url": "http://patchwork.dpdk.org/api/series/31343/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31343",
            "date": "2024-03-01T19:14:27",
            "name": "net/cnxk: support for port representors",
            "version": 5,
            "mbox": "http://patchwork.dpdk.org/series/31343/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/137792/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/137792/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 7CE0143C0F;\n\tFri,  1 Mar 2024 20:18:07 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C950043433;\n\tFri,  1 Mar 2024 20:16:08 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id A4CA8434C5\n for <dev@dpdk.org>; Fri,  1 Mar 2024 20:16:06 +0100 (CET)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id\n 421H7Q0A016606 for <dev@dpdk.org>; Fri, 1 Mar 2024 11:16:06 -0800",
            "from dc5-exch05.marvell.com ([199.233.59.128])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3wjfay8sf9-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Fri, 01 Mar 2024 11:16:05 -0800 (PST)",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH05.marvell.com\n (10.69.176.209) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.1258.12; Fri, 1 Mar\n 2024 11:16:04 -0800",
            "from DC5-EXCH05.marvell.com (10.69.176.209) by\n DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id\n 15.0.1497.48; Fri, 1 Mar 2024 11:16:03 -0800",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH05.marvell.com\n (10.69.176.209) with Microsoft SMTP Server id 15.2.1258.12 via Frontend\n Transport; Fri, 1 Mar 2024 11:16:03 -0800",
            "from localhost.localdomain (unknown [10.29.52.211])\n by maili.marvell.com (Postfix) with ESMTP id CB1D43F71EB;\n Fri,  1 Mar 2024 11:16:00 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=\n from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-type; s=pfpt0220; bh=W7aRQeKzH9Z1AOVjYEj3s\n XTys/mpP3HzRtaN8D6AEfQ=; b=JtERWnzDi4YtwWh+RWLYlyOJOv5nR0xwi2kef\n Ks1aNB+bb44BmW0dCi4bMC3TZJkQrGGLj4iah79BaW3RmJHloDCmsJLvR+Dtt+0u\n KhXYh5QypUg7eU0kJJWi0oMaDAXx2khvmuHylkVMSBNdCn/Pr2QOV+zG1AzEnB3B\n Knrz4CpSWtHbnLDsa2Lgn3C0qpK01ycJhQLKNp1u1U+r9ceiwxXG4ZsaSEX13kvT\n uZTQ3griP01nr3J//wVy9RT0R4aHKuWSrX4+NklR8BwKafbWjk2Kuz3xupRiyGh0\n dh3eh3ksuNUtx1oTcwyno3T5d5YZYbE/KLNWbKVkD6YraXAVw==",
        "From": "Harman Kalra <hkalra@marvell.com>",
        "To": "Nithin Dabilpuram <ndabilpuram@marvell.com>, Kiran Kumar K\n <kirankumark@marvell.com>, Sunil Kumar Kori <skori@marvell.com>, Satha Rao\n <skoteshwar@marvell.com>, Harman Kalra <hkalra@marvell.com>",
        "CC": "<dev@dpdk.org>",
        "Subject": "[PATCH v5 22/23] net/cnxk: flow create on representor ports",
        "Date": "Sat, 2 Mar 2024 00:44:49 +0530",
        "Message-ID": "<20240301191451.57168-23-hkalra@marvell.com>",
        "X-Mailer": "git-send-email 2.18.0",
        "In-Reply-To": "<20240301191451.57168-1-hkalra@marvell.com>",
        "References": "<20230811163419.165790-1-hkalra@marvell.com>\n <20240301191451.57168-1-hkalra@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "gLSHlumckfECrEKl6_-qrGWA3WJ6fSL-",
        "X-Proofpoint-GUID": "gLSHlumckfECrEKl6_-qrGWA3WJ6fSL-",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26\n definitions=2024-03-01_20,2024-03-01_03,2023-05-22_02",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Implementing base infra for handling flow operations performed on\nrepresentor ports, where these representor ports may be representing\nnative representees or part of companian apps. Also added support for\nhandling flow create operation\n\nSigned-off-by: Harman Kalra <hkalra@marvell.com>\n---\n drivers/net/cnxk/cnxk_flow.h     |   9 +-\n drivers/net/cnxk/cnxk_rep.h      |   3 +\n drivers/net/cnxk/cnxk_rep_flow.c | 401 +++++++++++++++++++++++++++++++\n drivers/net/cnxk/cnxk_rep_msg.h  |  27 +++\n drivers/net/cnxk/cnxk_rep_ops.c  |   3 +-\n drivers/net/cnxk/meson.build     |   1 +\n 6 files changed, 441 insertions(+), 3 deletions(-)\n create mode 100644 drivers/net/cnxk/cnxk_rep_flow.c",
    "diff": "diff --git a/drivers/net/cnxk/cnxk_flow.h b/drivers/net/cnxk/cnxk_flow.h\nindex 226694fbed..e51d04b2c9 100644\n--- a/drivers/net/cnxk/cnxk_flow.h\n+++ b/drivers/net/cnxk/cnxk_flow.h\n@@ -16,8 +16,13 @@ struct cnxk_rte_flow_term_info {\n \tuint16_t item_size;\n };\n \n-struct roc_npc_flow *cnxk_flow_create(struct rte_eth_dev *dev,\n-\t\t\t\t      const struct rte_flow_attr *attr,\n+struct cnxk_rte_flow_action_info {\n+\tuint16_t conf_size;\n+};\n+\n+extern const struct cnxk_rte_flow_term_info term[];\n+\n+struct roc_npc_flow *cnxk_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,\n \t\t\t\t      const struct rte_flow_item pattern[],\n \t\t\t\t      const struct rte_flow_action actions[],\n \t\t\t\t      struct rte_flow_error *error);\ndiff --git a/drivers/net/cnxk/cnxk_rep.h b/drivers/net/cnxk/cnxk_rep.h\nindex ab8b3fb152..9bdea47bd4 100644\n--- a/drivers/net/cnxk/cnxk_rep.h\n+++ b/drivers/net/cnxk/cnxk_rep.h\n@@ -20,6 +20,9 @@\n /* Common ethdev ops */\n extern struct eth_dev_ops cnxk_rep_dev_ops;\n \n+/* Flow ops for representor ports */\n+extern struct rte_flow_ops cnxk_rep_flow_ops;\n+\n struct cnxk_rep_queue_stats {\n \tuint64_t pkts;\n \tuint64_t bytes;\ndiff --git a/drivers/net/cnxk/cnxk_rep_flow.c b/drivers/net/cnxk/cnxk_rep_flow.c\nnew file mode 100644\nindex 0000000000..2613be5b9e\n--- /dev/null\n+++ b/drivers/net/cnxk/cnxk_rep_flow.c\n@@ -0,0 +1,401 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2024 Marvell.\n+ */\n+\n+#include <fcntl.h>\n+#include <unistd.h>\n+\n+#include <cnxk_flow.h>\n+#include <cnxk_rep.h>\n+#include <cnxk_rep_msg.h>\n+\n+#define DEFAULT_DUMP_FILE_NAME \"/tmp/fdump\"\n+#define MAX_BUFFER_SIZE\t       1500\n+\n+const struct cnxk_rte_flow_action_info action_info[] = {\n+\t[RTE_FLOW_ACTION_TYPE_MARK] = {sizeof(struct rte_flow_action_mark)},\n+\t[RTE_FLOW_ACTION_TYPE_VF] = {sizeof(struct rte_flow_action_vf)},\n+\t[RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = {sizeof(struct rte_flow_action_port_id)},\n+\t[RTE_FLOW_ACTION_TYPE_PORT_ID] = {sizeof(struct rte_flow_action_port_id)},\n+\t[RTE_FLOW_ACTION_TYPE_QUEUE] = {sizeof(struct rte_flow_action_queue)},\n+\t[RTE_FLOW_ACTION_TYPE_RSS] = {sizeof(struct rte_flow_action_rss)},\n+\t[RTE_FLOW_ACTION_TYPE_SECURITY] = {sizeof(struct rte_flow_action_security)},\n+\t[RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID] = {sizeof(struct rte_flow_action_of_set_vlan_vid)},\n+\t[RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN] = {sizeof(struct rte_flow_action_of_push_vlan)},\n+\t[RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP] = {sizeof(struct rte_flow_action_of_set_vlan_pcp)},\n+\t[RTE_FLOW_ACTION_TYPE_METER] = {sizeof(struct rte_flow_action_meter)},\n+\t[RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP] = {sizeof(struct rte_flow_action_vxlan_encap)},\n+\t[RTE_FLOW_ACTION_TYPE_COUNT] = {sizeof(struct rte_flow_action_count)},\n+};\n+\n+static void\n+cnxk_flow_params_count(const struct rte_flow_item pattern[], const struct rte_flow_action actions[],\n+\t\t       uint16_t *n_pattern, uint16_t *n_action)\n+{\n+\tint i = 0;\n+\n+\tfor (; pattern->type != RTE_FLOW_ITEM_TYPE_END; pattern++)\n+\t\ti++;\n+\n+\t*n_pattern = ++i;\n+\tplt_rep_dbg(\"Total patterns is %d\", *n_pattern);\n+\n+\ti = 0;\n+\tfor (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++)\n+\t\ti++;\n+\t*n_action = ++i;\n+\tplt_rep_dbg(\"Total actions is %d\", *n_action);\n+}\n+\n+static void\n+populate_attr_data(void *buffer, uint32_t *length, const struct rte_flow_attr *attr)\n+{\n+\tuint32_t sz = sizeof(struct rte_flow_attr);\n+\tuint32_t len;\n+\n+\tcnxk_rep_msg_populate_type(buffer, length, CNXK_TYPE_ATTR, sz);\n+\n+\tlen = *length;\n+\t/* Populate the attribute data */\n+\trte_memcpy(RTE_PTR_ADD(buffer, len), attr, sz);\n+\tlen += sz;\n+\n+\t*length = len;\n+}\n+\n+static uint16_t\n+prepare_pattern_data(const struct rte_flow_item *pattern, uint16_t nb_pattern,\n+\t\t     uint64_t *pattern_data)\n+{\n+\tcnxk_pattern_hdr_t hdr;\n+\tuint16_t len = 0;\n+\tint i = 0;\n+\n+\tfor (i = 0; i < nb_pattern; i++) {\n+\t\t/* Populate the pattern type hdr */\n+\t\tmemset(&hdr, 0, sizeof(cnxk_pattern_hdr_t));\n+\t\thdr.type = pattern->type;\n+\t\tif (pattern->spec) {\n+\t\t\thdr.spec_sz = term[pattern->type].item_size;\n+\t\t\thdr.last_sz = 0;\n+\t\t\thdr.mask_sz = term[pattern->type].item_size;\n+\t\t}\n+\n+\t\trte_memcpy(RTE_PTR_ADD(pattern_data, len), &hdr, sizeof(cnxk_pattern_hdr_t));\n+\t\tlen += sizeof(cnxk_pattern_hdr_t);\n+\n+\t\t/* Copy pattern spec data */\n+\t\tif (pattern->spec) {\n+\t\t\trte_memcpy(RTE_PTR_ADD(pattern_data, len), pattern->spec,\n+\t\t\t\t   term[pattern->type].item_size);\n+\t\t\tlen += term[pattern->type].item_size;\n+\t\t}\n+\n+\t\t/* Copy pattern last data */\n+\t\tif (pattern->last) {\n+\t\t\trte_memcpy(RTE_PTR_ADD(pattern_data, len), pattern->last,\n+\t\t\t\t   term[pattern->type].item_size);\n+\t\t\tlen += term[pattern->type].item_size;\n+\t\t}\n+\n+\t\t/* Copy pattern mask data */\n+\t\tif (pattern->mask) {\n+\t\t\trte_memcpy(RTE_PTR_ADD(pattern_data, len), pattern->mask,\n+\t\t\t\t   term[pattern->type].item_size);\n+\t\t\tlen += term[pattern->type].item_size;\n+\t\t}\n+\t\tpattern++;\n+\t}\n+\n+\treturn len;\n+}\n+\n+static void\n+populate_pattern_data(void *buffer, uint32_t *length, const struct rte_flow_item *pattern,\n+\t\t      uint16_t nb_pattern)\n+{\n+\tuint64_t pattern_data[BUFSIZ];\n+\tuint32_t len;\n+\tuint32_t sz;\n+\n+\tmemset(pattern_data, 0, BUFSIZ * sizeof(uint64_t));\n+\t/* Prepare pattern_data */\n+\tsz = prepare_pattern_data(pattern, nb_pattern, pattern_data);\n+\n+\tcnxk_rep_msg_populate_type(buffer, length, CNXK_TYPE_PATTERN, sz);\n+\n+\tlen = *length;\n+\t/* Populate the pattern data */\n+\trte_memcpy(RTE_PTR_ADD(buffer, len), pattern_data, sz);\n+\tlen += sz;\n+\n+\t*length = len;\n+}\n+\n+static uint16_t\n+populate_rss_action_conf(const struct rte_flow_action_rss *conf, void *rss_action_conf)\n+{\n+\tint len, sz;\n+\n+\tlen = sizeof(struct rte_flow_action_rss) - sizeof(conf->key) - sizeof(conf->queue);\n+\n+\tif (rss_action_conf)\n+\t\trte_memcpy(rss_action_conf, conf, len);\n+\n+\tif (conf->key) {\n+\t\tsz = conf->key_len;\n+\t\tif (rss_action_conf)\n+\t\t\trte_memcpy(RTE_PTR_ADD(rss_action_conf, len), conf->key, sz);\n+\t\tlen += sz;\n+\t}\n+\n+\tif (conf->queue) {\n+\t\tsz = conf->queue_num * sizeof(conf->queue);\n+\t\tif (rss_action_conf)\n+\t\t\trte_memcpy(RTE_PTR_ADD(rss_action_conf, len), conf->queue, sz);\n+\t\tlen += sz;\n+\t}\n+\n+\treturn len;\n+}\n+\n+static uint16_t\n+populate_vxlan_encap_action_conf(const struct rte_flow_action_vxlan_encap *vxlan_conf,\n+\t\t\t\t void *vxlan_encap_action_data)\n+{\n+\tconst struct rte_flow_item *pattern;\n+\tuint64_t nb_patterns = 0;\n+\tuint16_t len, sz;\n+\n+\tpattern = vxlan_conf->definition;\n+\tfor (; pattern->type != RTE_FLOW_ITEM_TYPE_END; pattern++)\n+\t\tnb_patterns++;\n+\n+\tlen = sizeof(uint64_t);\n+\trte_memcpy(vxlan_encap_action_data, &nb_patterns, len);\n+\tpattern = vxlan_conf->definition;\n+\t/* Prepare pattern_data */\n+\tsz = prepare_pattern_data(pattern, nb_patterns, RTE_PTR_ADD(vxlan_encap_action_data, len));\n+\n+\tlen += sz;\n+\tif (len > BUFSIZ) {\n+\t\tplt_err(\"Incomplete item definition loaded, len %d\", len);\n+\t\treturn 0;\n+\t}\n+\n+\treturn len;\n+}\n+\n+static uint16_t\n+prepare_action_data(const struct rte_flow_action *action, uint16_t nb_action, uint64_t *action_data)\n+{\n+\tvoid *action_conf_data = NULL;\n+\tcnxk_action_hdr_t hdr;\n+\tuint16_t len = 0, sz = 0;\n+\tint i = 0;\n+\n+\tfor (i = 0; i < nb_action; i++) {\n+\t\tif (action->conf) {\n+\t\t\tswitch (action->type) {\n+\t\t\tcase RTE_FLOW_ACTION_TYPE_RSS:\n+\t\t\t\tsz = populate_rss_action_conf(action->conf, NULL);\n+\t\t\t\taction_conf_data = plt_zmalloc(sz, 0);\n+\t\t\t\tif (populate_rss_action_conf(action->conf, action_conf_data) !=\n+\t\t\t\t    sz) {\n+\t\t\t\t\tplt_err(\"Populating RSS action config failed\");\n+\t\t\t\t\treturn 0;\n+\t\t\t\t}\n+\t\t\t\tbreak;\n+\t\t\tcase RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:\n+\t\t\t\taction_conf_data = plt_zmalloc(BUFSIZ, 0);\n+\t\t\t\tsz = populate_vxlan_encap_action_conf(action->conf,\n+\t\t\t\t\t\t\t\t      action_conf_data);\n+\t\t\t\tif (!sz) {\n+\t\t\t\t\tplt_err(\"Populating vxlan action config failed\");\n+\t\t\t\t\treturn 0;\n+\t\t\t\t}\n+\t\t\t\tbreak;\n+\t\t\tdefault:\n+\t\t\t\tsz = action_info[action->type].conf_size;\n+\t\t\t\taction_conf_data = plt_zmalloc(sz, 0);\n+\t\t\t\trte_memcpy(action_conf_data, action->conf, sz);\n+\t\t\t\tbreak;\n+\t\t\t};\n+\t\t}\n+\n+\t\t/* Populate the action type hdr */\n+\t\tmemset(&hdr, 0, sizeof(cnxk_action_hdr_t));\n+\t\thdr.type = action->type;\n+\t\thdr.conf_sz = sz;\n+\n+\t\trte_memcpy(RTE_PTR_ADD(action_data, len), &hdr, sizeof(cnxk_action_hdr_t));\n+\t\tlen += sizeof(cnxk_action_hdr_t);\n+\n+\t\t/* Copy action conf data */\n+\t\tif (action_conf_data) {\n+\t\t\trte_memcpy(RTE_PTR_ADD(action_data, len), action_conf_data, sz);\n+\t\t\tlen += sz;\n+\t\t\tplt_free(action_conf_data);\n+\t\t\taction_conf_data = NULL;\n+\t\t}\n+\n+\t\taction++;\n+\t}\n+\n+\treturn len;\n+}\n+\n+static void\n+populate_action_data(void *buffer, uint32_t *length, const struct rte_flow_action *action,\n+\t\t     uint16_t nb_action)\n+{\n+\tuint64_t action_data[BUFSIZ];\n+\tuint32_t len;\n+\tuint32_t sz;\n+\n+\tmemset(action_data, 0, BUFSIZ * sizeof(uint64_t));\n+\t/* Prepare action_data */\n+\tsz = prepare_action_data(action, nb_action, action_data);\n+\n+\tcnxk_rep_msg_populate_type(buffer, length, CNXK_TYPE_ACTION, sz);\n+\n+\tlen = *length;\n+\t/* Populate the action data */\n+\trte_memcpy(RTE_PTR_ADD(buffer, len), action_data, sz);\n+\tlen += sz;\n+\n+\t*length = len;\n+}\n+\n+static int\n+process_flow_rule(struct cnxk_rep_dev *rep_dev, const struct rte_flow_attr *attr,\n+\t\t  const struct rte_flow_item pattern[], const struct rte_flow_action actions[],\n+\t\t  cnxk_rep_msg_ack_data_t *adata, cnxk_rep_msg_t msg)\n+{\n+\tcnxk_rep_msg_flow_create_meta_t msg_fc_meta;\n+\tuint16_t n_pattern, n_action;\n+\tuint32_t len = 0, rc = 0;\n+\tvoid *buffer;\n+\tsize_t size;\n+\n+\tsize = MAX_BUFFER_SIZE;\n+\tbuffer = plt_zmalloc(size, 0);\n+\tif (!buffer) {\n+\t\tplt_err(\"Failed to allocate mem\");\n+\t\trc = -ENOMEM;\n+\t\tgoto fail;\n+\t}\n+\n+\t/* Get no of actions and patterns */\n+\tcnxk_flow_params_count(pattern, actions, &n_pattern, &n_action);\n+\n+\t/* Adding the header */\n+\tcnxk_rep_msg_populate_header(buffer, &len);\n+\n+\t/* Representor port identified as rep_xport queue */\n+\tmsg_fc_meta.portid = rep_dev->rep_id;\n+\tmsg_fc_meta.nb_pattern = n_pattern;\n+\tmsg_fc_meta.nb_action = n_action;\n+\n+\tcnxk_rep_msg_populate_command_meta(buffer, &len, &msg_fc_meta,\n+\t\t\t\t\t   sizeof(cnxk_rep_msg_flow_create_meta_t), msg);\n+\n+\t/* Populate flow create parameters data */\n+\tpopulate_attr_data(buffer, &len, attr);\n+\tpopulate_pattern_data(buffer, &len, pattern, n_pattern);\n+\tpopulate_action_data(buffer, &len, actions, n_action);\n+\n+\tcnxk_rep_msg_populate_msg_end(buffer, &len);\n+\n+\trc = cnxk_rep_msg_send_process(rep_dev, buffer, len, adata);\n+\tif (rc) {\n+\t\tplt_err(\"Failed to process the message, err %d\", rc);\n+\t\tgoto fail;\n+\t}\n+\n+\treturn 0;\n+fail:\n+\treturn rc;\n+}\n+\n+static struct rte_flow *\n+cnxk_rep_flow_create_native(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,\n+\t\t\t    const struct rte_flow_item pattern[],\n+\t\t\t    const struct rte_flow_action actions[], struct rte_flow_error *error)\n+{\n+\tstruct cnxk_rep_dev *rep_dev = cnxk_rep_pmd_priv(eth_dev);\n+\tstruct roc_npc_flow *flow;\n+\tuint16_t new_entry;\n+\tint rc;\n+\n+\tflow = cnxk_flow_create_common(eth_dev, attr, pattern, actions, error, true);\n+\tif (!flow) {\n+\t\tplt_err(\"Fail to create flow\");\n+\t\tgoto fail;\n+\t}\n+\n+\t/* Shifting the rules with higher priority than exception path rules */\n+\tnew_entry = (uint16_t)flow->mcam_id;\n+\trc = cnxk_eswitch_flow_rule_shift(rep_dev->hw_func, &new_entry);\n+\tif (rc) {\n+\t\tplt_err(\"Failed to shift the flow rule entry, err %d\", rc);\n+\t\tgoto fail;\n+\t}\n+\n+\tflow->mcam_id = new_entry;\n+\n+\treturn (struct rte_flow *)flow;\n+fail:\n+\treturn NULL;\n+}\n+\n+static struct rte_flow *\n+cnxk_rep_flow_create(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,\n+\t\t     const struct rte_flow_item pattern[], const struct rte_flow_action actions[],\n+\t\t     struct rte_flow_error *error)\n+{\n+\tstruct cnxk_rep_dev *rep_dev = cnxk_rep_pmd_priv(eth_dev);\n+\tstruct rte_flow *flow = NULL;\n+\tcnxk_rep_msg_ack_data_t adata;\n+\tint rc = 0;\n+\n+\t/* If representor not representing any active VF, return 0 */\n+\tif (!rep_dev->is_vf_active) {\n+\t\trte_flow_error_set(error, -EAGAIN, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n+\t\t\t\t   \"Represented VF not active yet\");\n+\t\treturn 0;\n+\t}\n+\n+\tif (rep_dev->native_repte)\n+\t\treturn cnxk_rep_flow_create_native(eth_dev, attr, pattern, actions, error);\n+\n+\trc = process_flow_rule(rep_dev, attr, pattern, actions, &adata, CNXK_REP_MSG_FLOW_CREATE);\n+\tif (!rc || adata.u.sval < 0) {\n+\t\tif (adata.u.sval < 0) {\n+\t\t\trc = (int)adata.u.sval;\n+\t\t\trte_flow_error_set(error, adata.u.sval, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t\t   NULL, \"Failed to validate flow\");\n+\t\t\tgoto fail;\n+\t\t}\n+\n+\t\tflow = adata.u.data;\n+\t\tif (!flow) {\n+\t\t\trte_flow_error_set(error, adata.u.sval, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t\t   NULL, \"Failed to create flow\");\n+\t\t\tgoto fail;\n+\t\t}\n+\t} else {\n+\t\trte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n+\t\t\t\t   \"Failed to create flow\");\n+\t\tgoto fail;\n+\t}\n+\tplt_rep_dbg(\"Flow %p created successfully\", adata.u.data);\n+\n+\treturn flow;\n+fail:\n+\treturn NULL;\n+}\n+\n+struct rte_flow_ops cnxk_rep_flow_ops = {\n+\t.create = cnxk_rep_flow_create,\n+};\ndiff --git a/drivers/net/cnxk/cnxk_rep_msg.h b/drivers/net/cnxk/cnxk_rep_msg.h\nindex 277e25d92a..d27a234e48 100644\n--- a/drivers/net/cnxk/cnxk_rep_msg.h\n+++ b/drivers/net/cnxk/cnxk_rep_msg.h\n@@ -12,6 +12,10 @@\n typedef enum CNXK_TYPE {\n \tCNXK_TYPE_HEADER = 0,\n \tCNXK_TYPE_MSG,\n+\tCNXK_TYPE_ATTR,\n+\tCNXK_TYPE_PATTERN,\n+\tCNXK_TYPE_ACTION,\n+\tCNXK_TYPE_FLOW\n } cnxk_type_t;\n \n typedef enum CNXK_REP_MSG {\n@@ -23,6 +27,8 @@ typedef enum CNXK_REP_MSG {\n \tCNXK_REP_MSG_ETH_SET_MAC,\n \tCNXK_REP_MSG_ETH_STATS_GET,\n \tCNXK_REP_MSG_ETH_STATS_CLEAR,\n+\t/* Flow operation msgs */\n+\tCNXK_REP_MSG_FLOW_CREATE,\n \t/* End of messaging sequence */\n \tCNXK_REP_MSG_END,\n } cnxk_rep_msg_t;\n@@ -96,6 +102,27 @@ typedef struct cnxk_rep_msg_eth_stats_meta {\n \tuint16_t portid;\n } __rte_packed cnxk_rep_msg_eth_stats_meta_t;\n \n+/* Flow create msg meta */\n+typedef struct cnxk_rep_msg_flow_create_meta {\n+\tuint16_t portid;\n+\tuint16_t nb_pattern;\n+\tuint16_t nb_action;\n+} __rte_packed cnxk_rep_msg_flow_create_meta_t;\n+\n+/* Type pattern meta */\n+typedef struct cnxk_pattern_hdr {\n+\tuint16_t type;\n+\tuint16_t spec_sz;\n+\tuint16_t last_sz;\n+\tuint16_t mask_sz;\n+} __rte_packed cnxk_pattern_hdr_t;\n+\n+/* Type action meta */\n+typedef struct cnxk_action_hdr {\n+\tuint16_t type;\n+\tuint16_t conf_sz;\n+} __rte_packed cnxk_action_hdr_t;\n+\n void cnxk_rep_msg_populate_command(void *buffer, uint32_t *length, cnxk_rep_msg_t type,\n \t\t\t\t   uint32_t size);\n void cnxk_rep_msg_populate_command_meta(void *buffer, uint32_t *length, void *msg_meta, uint32_t sz,\ndiff --git a/drivers/net/cnxk/cnxk_rep_ops.c b/drivers/net/cnxk/cnxk_rep_ops.c\nindex 0ba4d55398..8bcb689468 100644\n--- a/drivers/net/cnxk/cnxk_rep_ops.c\n+++ b/drivers/net/cnxk/cnxk_rep_ops.c\n@@ -647,7 +647,8 @@ int\n cnxk_rep_flow_ops_get(struct rte_eth_dev *ethdev, const struct rte_flow_ops **ops)\n {\n \tPLT_SET_USED(ethdev);\n-\tPLT_SET_USED(ops);\n+\t*ops = &cnxk_rep_flow_ops;\n+\n \treturn 0;\n }\n \ndiff --git a/drivers/net/cnxk/meson.build b/drivers/net/cnxk/meson.build\nindex 9ca7732713..8cc06f4967 100644\n--- a/drivers/net/cnxk/meson.build\n+++ b/drivers/net/cnxk/meson.build\n@@ -39,6 +39,7 @@ sources = files(\n         'cnxk_rep.c',\n         'cnxk_rep_msg.c',\n         'cnxk_rep_ops.c',\n+        'cnxk_rep_flow.c',\n         'cnxk_stats.c',\n         'cnxk_tm.c',\n )\n",
    "prefixes": [
        "v5",
        "22/23"
    ]
}