get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133809,
    "url": "http://patchwork.dpdk.org/api/patches/133809/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231103062606.2632012-3-chaoyong.he@corigine.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": "<20231103062606.2632012-3-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231103062606.2632012-3-chaoyong.he@corigine.com",
    "date": "2023-11-03T06:25:57",
    "name": "[02/11] drivers: add the structures and functions for flow offload",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "2fad4845e133429a1b9cb9b30da90e2012c58776",
    "submitter": {
        "id": 2554,
        "url": "http://patchwork.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20231103062606.2632012-3-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 30130,
            "url": "http://patchwork.dpdk.org/api/series/30130/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=30130",
            "date": "2023-11-03T06:25:55",
            "name": "Add basic flow support for corenic firmware",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/30130/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/133809/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/133809/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 71C4443275;\n\tFri,  3 Nov 2023 07:26:52 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 602A742D78;\n\tFri,  3 Nov 2023 07:26:39 +0100 (CET)",
            "from NAM10-DM6-obe.outbound.protection.outlook.com\n (mail-dm6nam10on2111.outbound.protection.outlook.com [40.107.93.111])\n by mails.dpdk.org (Postfix) with ESMTP id 296D8427DD\n for <dev@dpdk.org>; Fri,  3 Nov 2023 07:26:37 +0100 (CET)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MN2PR13MB4102.namprd13.prod.outlook.com (2603:10b6:208:262::16)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.24; Fri, 3 Nov\n 2023 06:26:33 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6954.021; Fri, 3 Nov 2023\n 06:26:32 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=TQ9x50ZuZ7hscTqUSzuMXRvUHd5NYL/pZky17ykTEvnl196qj08zn8z+zOPW+UzZ9jkovzRMXOKA6+ZGh//0gW7GvmkKdYdKa1GbXAfjK1diiezDYmpGDwy7o2VhhMTf2oo2SnVwI9neQWZFjxIKdx9UPpaeaVoNFDhMzW+eakhaCY6jHwCVgBzPRPphMuErYrhxIisXPPwTHJ9t+SeIMwQ1FYr/mvyivs8l9boTpHYYaqYPTroaeQ0ps/DNwONaGEYZj45dqdcOP2hARD0hhrooRJGQtCX5On1PNlmxRpSALxJMACx8H+41wC9S67Pw2UzDz7OKuuHpFDjZGA+73w==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=DqlcuPCq7pCDDakzv3SLa7EuAVm1UOaNaCHOWYAPRyQ=;\n b=lTlrG9dY5/eq90NBN2hS7ryq6zOnVrrryQPlEnQLCjndT5Osdpi6K/9NGS8fc0gaHrmYfb8Jl5wFy/bKL4KnNEjDwTouauCZ13kkZ0F0jJNrdq2fTA0HU2z1X7+4nysjaYCN7o0HHhgZhHB+Ce2xgcm2x4+WNeXGfWIndAMWseYKYPnQjI8k9DKTBR6OHpBRr7HVd5oSm5Da6Y/606F7wRfVczYD5aAFOK8d1hlTYJlwPL6YMcXyeLY6BkCOEIaMJaJtdvgwj5RziPP886aqrpWUvI9bMs6yeW4mbydmKqNHrJ/auQZ/nx9G2otLZDggVegMQhPQ17QyPPHgLpojcw==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=DqlcuPCq7pCDDakzv3SLa7EuAVm1UOaNaCHOWYAPRyQ=;\n b=XodDZU+thqLMvzFPEorNyon0LPVJgEzXcC9LF7u2Djiu1COt61Q5fwL8ke5wiwwi7AOoG7XhYImFnEni7U3HtygPhPftcw13JhRuFmgPcxHdYS3o2T8DyQABnngnwydDBVYQ+XlbKo2m/c+d8OSqUQ97YRpSjjGf2uO4Zj9pjVI=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Chaoyong He <chaoyong.he@corigine.com>,\n Long Wu <long.wu@corigine.com>, Peng Zhang <peng.zhang@corigine.com>",
        "Subject": "[PATCH 02/11] drivers: add the structures and functions for flow\n offload",
        "Date": "Fri,  3 Nov 2023 14:25:57 +0800",
        "Message-Id": "<20231103062606.2632012-3-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231103062606.2632012-1-chaoyong.he@corigine.com>",
        "References": "<20231103062606.2632012-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BYAPR02CA0044.namprd02.prod.outlook.com\n (2603:10b6:a03:54::21) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|MN2PR13MB4102:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "17112ce8-843f-4e65-19a2-08dbdc35d263",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n X9h4j/A28Zbatq91cv113QNNXlZ7RremSborAF+NTOZGwwpDaYf18+Fwrb4ZY3FF3SnLt1psOcjmjAyTcu6SjY/WVpF89pU2xNIqMqZFiNUqj67Yxx9JEYKQ8/86WkmVuVqXwysTMOwuc4enQfr8KCZSrvDWKfGGDJ8UFoPwEcGuxZ43ZXvf4MZmpxjfQPupEVHyMX0tsmpt3rBOiIKN5Vm9Wofy35KRsEUbm5FuQOSgCoTDBp84Y7Xmr8DGXrOcngLsewXmzqKyLChSUuGsSTN6tpBXiVLyiyTzBUvqAMn/GtD7/4enmmrYqtbMeMvfjXu8kaFHRQf4lS25LAp3PfYBu90jPPNKCSBQoLGWEN5jwbhA3zjka1865JSiqwDFa/J6pS9oadLeyRlpGvfdQyeMAftNb8EZdGtmclZaFP8d3/wYN6meGPANDTv7rkPfKdUDzKCdnWa/jMiuMqiwYu4ea0bpdqfWpwEeOsFNqswzqidRHD0lew+VuPRvJvaWjmF2WoU/PGLiT5RnFX1N4DZm0qOMW2OEjqbAUoz+xJQ5OUw4ldUUnA6ZvXYsQVJSxuAKRYQ+3gSTgYG6d1mx23haNGOf4hP01+Re858TS1zKqvG1V1WeW8vHvDRj1PH97bUn+yMuFMP/mbpDapaZDycBKwfmNLa20a6ZDXculnA=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(39840400004)(346002)(396003)(366004)(136003)(376002)(230922051799003)(186009)(64100799003)(451199024)(1800799009)(316002)(6916009)(54906003)(66476007)(66556008)(66946007)(6666004)(6486002)(478600001)(52116002)(6506007)(5660300002)(38350700005)(41300700001)(36756003)(2906002)(86362001)(4326008)(8676002)(8936002)(44832011)(107886003)(1076003)(2616005)(26005)(83380400001)(38100700002)(6512007);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n Tc3XvtqJ1G2bLQr65POcj+unn6L+kAy4rIHNHIWe4AM1czVNpa2kTObCk01clg1Q4QPx/lnsaDrmIGivheC2Vj3Pw3WQai2n0Ug4bCGTNdEyKpXCKtfhXdo0WMuYq5TIg8IIs5eNfH8yCSIbeuhoA79t5NhTEKk3zA4Di61hG1aKrPKN7kjxRJ/5kAIlAptT+yW2Ow7/41piYMAYBWY6FOqxo2KXk/siX3XgjJPx44xh28YKSS1ZMEdQQNfJkAilsFU3yjej9ASJYcbybhsGGE35yhvxHjHf2c+bSOQwoO0y3LQwHh+T+3IxzggFmG2ZwV/Qp1YK49lhjUqgMgzJeif53chOEdgfO/e9fug+CoQLQEGgWY5Tw/KhGvAbXMJDAiTueOh7xRUClwffJsarWIaHfBZBnHGK+cndM4bhsOAhVDD4gbMdA5I2xXx9R13CVuYfk4Tbqm0slNwHAfqLellcIBWJ30OC2dcNXVTmphKxp06Hy8ticQl/YvH9g0oNxXLwR7PF/HRbq9do2qURZ/qmJgNO2nCrMYNcKAepANps3wgpCUMo+NCDuJZOmXyh2hE2ivYfJu6MxLf1QWxUlWOuPfX/Nl7uQI+X+T+HAI7JSXnDyikv0cxEkXAUNXrnBdGBdQRbM78GMGqBiW7e+t0I78uo0y2Ikhm5Rjvs4ArY2DJzVqJvKkJvKSUCk44vI+U9Rtu69Wbs1I+89/Itq5naIAi256GPJOHjLcYJbGtYtkS0Q0rlGYKIslvq87kErLdruCFw425rVg+zJT+n6h02CKmJf9Qb56rtqjsClwsCUJUk/cDuGgBBq8I0s18przXYcsNX7SBRcvM0JXWaU8k5Kr52q+MwZ056CVQrZUotc+gIt6BE4YLXW2Cy9m6Wx2so9wmN/heiwYGJ+H6GSldOovGZ4veAKQTEWZ+nZ59ckVgFnHP6WAKVRF32R06ijpNpfs7wC4f6yI4pIEE1roF/oZrvVpCmuD5Ou/a+oJu+Xoxy73unAg161R4zeb2ZpItV+rrPFglwrl7ZuDnYVylw8Fu9hBK9zRiI0VhwIP1jpQ7R+Ty4Ur0gMhsmss48xJiyVA+1DDL+M3IPgU6n/47b989YRlAlwC1D+WdJEVqOs0e/hzqbL+xXMgobYeH4vOpAfv4VzA2V4IXJLoipRXqSmECGxOIoQzPJyA9q7wMpdDzXcJudiNBOkaG4nUKNYIaPo1sILak37Z9Qwx/mLYNcPj7mQ4xdqn5Z/dRH0G2XHvaflQNrQVEhpHN1+eZLTpCQ+H4qfBsurejaq/hMoE19TPT5Hm5HwPgReugjWYRdUZ2AT2fK7uUOr87FltvUOoXuJvYQ27NpL7tJW3lHx/Mj50r5696KsSiJgRLqDPCNFiVarpfZEcLKYQNHreq5Fm/FbZTLdOKbdQWCT9428/gvt/UTXsN9mAi7pl1irA5K9JY6S+S0rfUV9Pw6Pu0/3YlzLpRURdP8NIE9L3mxZmq5AqZyeIDIurudX3heXILfVNQjmmbbE95P4QSB1dl8Y+rVJizjDetoNFk9BzgvGk0wn7APKk94k2gio3ZnfULhH1vRXbj7qT6Jsur0N50FvBN6JlZM1Un1P6UWToCC1Q==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 17112ce8-843f-4e65-19a2-08dbdc35d263",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "03 Nov 2023 06:26:32.7028 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n lQFmzsKKy61ZFtDsTDL7T9g8OywuApPqtG40MuhB/CEJY6gOcL3kI65NNsPmKb6liSkDs/4tWdk5aABZyLpEQTyvDSW4Bp1IiEVq9LPjreQ=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR13MB4102",
        "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": "Add the structures and functions to process flow table, which is used in\nthe rte_flow offload logics.\nThis module is used for the CoreNIC firmware.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Peng Zhang <peng.zhang@corigine.com>\n---\n drivers/common/nfp/nfp_common_ctrl.h |   1 +\n drivers/net/nfp/meson.build          |   1 +\n drivers/net/nfp/nfp_ethdev.c         |  26 +++--\n drivers/net/nfp/nfp_net_common.h     |  11 ++\n drivers/net/nfp/nfp_net_flow.c       | 162 +++++++++++++++++++++++++++\n drivers/net/nfp/nfp_net_flow.h       |  28 +++++\n 6 files changed, 222 insertions(+), 7 deletions(-)\n create mode 100644 drivers/net/nfp/nfp_net_flow.c\n create mode 100644 drivers/net/nfp/nfp_net_flow.h",
    "diff": "diff --git a/drivers/common/nfp/nfp_common_ctrl.h b/drivers/common/nfp/nfp_common_ctrl.h\nindex d09fd2b892..cbde987736 100644\n--- a/drivers/common/nfp/nfp_common_ctrl.h\n+++ b/drivers/common/nfp/nfp_common_ctrl.h\n@@ -223,6 +223,7 @@ struct nfp_net_fw_ver {\n #define NFP_NET_CFG_CTRL_IPSEC_SM_LOOKUP  (0x1 << 3) /**< SA short match lookup */\n #define NFP_NET_CFG_CTRL_IPSEC_LM_LOOKUP  (0x1 << 4) /**< SA long match lookup */\n #define NFP_NET_CFG_CTRL_MULTI_PF         (0x1 << 5)\n+#define NFP_NET_CFG_CTRL_FLOW_STEER       (0x1 << 8) /**< Flow Steering */\n #define NFP_NET_CFG_CTRL_IN_ORDER         (0x1 << 11) /**< Virtio in-order flag */\n \n #define NFP_NET_CFG_CAP_WORD1           0x00a4\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex 8407073af8..0d0a0bd8f4 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -36,6 +36,7 @@ sources = files(\n         'nfp_mtr.c',\n         'nfp_net_common.c',\n         'nfp_net_ctrl.c',\n+        'nfp_net_flow.c',\n         'nfp_rxtx.c',\n )\n \ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex f02caf8056..af5e5d333a 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -23,6 +23,7 @@\n #include \"nfp_cpp_bridge.h\"\n #include \"nfp_ipsec.h\"\n #include \"nfp_logs.h\"\n+#include \"nfp_net_flow.h\"\n \n #define NFP_PF_DRIVER_NAME net_nfp_pf\n \n@@ -150,6 +151,10 @@ nfp_net_start(struct rte_eth_dev *dev)\n \t\tctrl_extend |= NFP_NET_CFG_CTRL_IPSEC_SM_LOOKUP\n \t\t\t\t| NFP_NET_CFG_CTRL_IPSEC_LM_LOOKUP;\n \n+\t/* Enable flow steer by extend ctrl word1. */\n+\tif ((cap_extend & NFP_NET_CFG_CTRL_FLOW_STEER) != 0)\n+\t\tctrl_extend |= NFP_NET_CFG_CTRL_FLOW_STEER;\n+\n \tupdate = NFP_NET_CFG_UPDATE_GEN;\n \tif (nfp_ext_reconfig(hw, ctrl_extend, update) != 0)\n \t\treturn -EIO;\n@@ -692,6 +697,14 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \t/* Recording current stats counters values */\n \tnfp_net_stats_reset(eth_dev);\n \n+\tif ((hw->cap_ext & NFP_NET_CFG_CTRL_FLOW_STEER) != 0) {\n+\t\terr = nfp_net_flow_priv_init(pf_dev, port);\n+\t\tif (err != 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Init net flow priv failed\");\n+\t\t\treturn err;\n+\t\t}\n+\t}\n+\n \treturn 0;\n }\n \n@@ -1115,14 +1128,13 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n port_cleanup:\n \tfor (i = 0; i < app_fw_nic->total_phyports; i++) {\n \t\tid = nfp_function_id_get(pf_dev, i);\n+\t\thw = app_fw_nic->ports[id];\n \n-\t\tif (app_fw_nic->ports[id] != NULL &&\n-\t\t\t\tapp_fw_nic->ports[id]->eth_dev != NULL) {\n-\t\t\tstruct rte_eth_dev *tmp_dev;\n-\t\t\ttmp_dev = app_fw_nic->ports[id]->eth_dev;\n-\t\t\tnfp_ipsec_uninit(tmp_dev);\n-\t\t\trte_eth_dev_release_port(tmp_dev);\n-\t\t\tapp_fw_nic->ports[id] = NULL;\n+\t\tif (hw != NULL && hw->eth_dev != NULL) {\n+\t\t\tnfp_ipsec_uninit(hw->eth_dev);\n+\t\t\tif ((hw->super.cap_ext & NFP_NET_CFG_CTRL_FLOW_STEER) != 0)\n+\t\t\t\tnfp_net_flow_priv_uninit(pf_dev, id);\n+\t\t\trte_eth_dev_release_port(hw->eth_dev);\n \t\t}\n \t}\n \tnfp_cpp_area_free(pf_dev->ctrl_area);\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 30fea7ae02..48791af93a 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -108,6 +108,14 @@ struct nfp_pf_dev {\n \tstruct nfp_multi_pf multi_pf;\n };\n \n+#define NFP_NET_FLOW_LIMIT    1024\n+\n+struct nfp_net_priv {\n+\tuint32_t hash_seed; /**< Hash seed for hash tables in this structure. */\n+\tstruct rte_hash *flow_table; /**< Hash table to store flow rules. */\n+\tuint16_t flow_count; /**< Flow count in hash table */\n+};\n+\n struct nfp_app_fw_nic {\n \t/** Backpointer to the PF device */\n \tstruct nfp_pf_dev *pf_dev;\n@@ -177,6 +185,9 @@ struct nfp_net_hw {\n \tstruct nfp_net_tlv_caps tlv_caps;\n \n \tstruct nfp_net_ipsec_data *ipsec_data;\n+\n+\t/** Used for rte_flow of CoreNIC firmware */\n+\tstruct nfp_net_priv *priv;\n };\n \n static inline uint32_t\ndiff --git a/drivers/net/nfp/nfp_net_flow.c b/drivers/net/nfp/nfp_net_flow.c\nnew file mode 100644\nindex 0000000000..6c02b0f82e\n--- /dev/null\n+++ b/drivers/net/nfp/nfp_net_flow.c\n@@ -0,0 +1,162 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"nfp_net_flow.h\"\n+\n+#include <rte_flow_driver.h>\n+#include <rte_hash.h>\n+#include <rte_jhash.h>\n+#include <rte_malloc.h>\n+\n+#include \"nfp_logs.h\"\n+\n+__rte_unused static int\n+nfp_net_flow_table_add(struct nfp_net_priv *priv,\n+\t\tstruct rte_flow *nfp_flow)\n+{\n+\tint ret;\n+\n+\tret = rte_hash_add_key_data(priv->flow_table, &nfp_flow->hash_key, nfp_flow);\n+\tif (ret != 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Add to flow table failed.\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+__rte_unused static int\n+nfp_net_flow_table_delete(struct nfp_net_priv *priv,\n+\t\tstruct rte_flow *nfp_flow)\n+{\n+\tint ret;\n+\n+\tret = rte_hash_del_key(priv->flow_table, &nfp_flow->hash_key);\n+\tif (ret < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Delete from flow table failed.\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+__rte_unused static struct rte_flow *\n+nfp_net_flow_table_search(struct nfp_net_priv *priv,\n+\t\tstruct rte_flow *nfp_flow)\n+{\n+\tint index;\n+\tstruct rte_flow *flow_find;\n+\n+\tindex = rte_hash_lookup_data(priv->flow_table, &nfp_flow->hash_key,\n+\t\t\t(void **)&flow_find);\n+\tif (index < 0) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Data NOT found in the flow table.\");\n+\t\treturn NULL;\n+\t}\n+\n+\treturn flow_find;\n+}\n+\n+__rte_unused static struct rte_flow *\n+nfp_net_flow_alloc(uint32_t match_len,\n+\t\tuint32_t action_len,\n+\t\tuint32_t port_id)\n+{\n+\tchar *data;\n+\tstruct rte_flow *nfp_flow;\n+\tstruct nfp_net_flow_payload *payload;\n+\n+\tnfp_flow = rte_zmalloc(\"nfp_flow\", sizeof(struct rte_flow), 0);\n+\tif (nfp_flow == NULL)\n+\t\treturn NULL;\n+\n+\tdata = rte_zmalloc(\"nfp_flow_payload\", match_len + action_len, 0);\n+\tif (data == NULL)\n+\t\tgoto free_flow;\n+\n+\tnfp_flow->port_id      = port_id;\n+\tpayload                = &nfp_flow->payload;\n+\tpayload->match_len     = match_len;\n+\tpayload->action_len    = action_len;\n+\tpayload->match_data    = data;\n+\tpayload->action_data   = data + match_len;\n+\n+\treturn nfp_flow;\n+\n+free_flow:\n+\trte_free(nfp_flow);\n+\n+\treturn NULL;\n+}\n+\n+__rte_unused static void\n+nfp_net_flow_free(struct rte_flow *nfp_flow)\n+{\n+\trte_free(nfp_flow->payload.match_data);\n+\trte_free(nfp_flow);\n+}\n+\n+int\n+nfp_net_flow_priv_init(struct nfp_pf_dev *pf_dev,\n+\t\tuint16_t port)\n+{\n+\tint ret = 0;\n+\tstruct nfp_net_priv *priv;\n+\tchar flow_name[RTE_HASH_NAMESIZE];\n+\tstruct nfp_app_fw_nic *app_fw_nic;\n+\tconst char *pci_name = strchr(pf_dev->pci_dev->name, ':') + 1;\n+\n+\tsnprintf(flow_name, sizeof(flow_name), \"%s_fl_%u\", pci_name, port);\n+\n+\tstruct rte_hash_parameters flow_hash_params = {\n+\t\t.name       = flow_name,\n+\t\t.entries    = NFP_NET_FLOW_LIMIT,\n+\t\t.hash_func  = rte_jhash,\n+\t\t.socket_id  = rte_socket_id(),\n+\t\t.key_len    = sizeof(uint32_t),\n+\t\t.extra_flag = RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY,\n+\t};\n+\n+\tpriv = rte_zmalloc(\"nfp_app_nic_priv\", sizeof(struct nfp_net_priv), 0);\n+\tif (priv == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"NFP app nic priv creation failed\");\n+\t\tret = -ENOMEM;\n+\t\tgoto exit;\n+\t}\n+\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv);\n+\tapp_fw_nic->ports[port]->priv = priv;\n+\tpriv->hash_seed = (uint32_t)rte_rand();\n+\n+\t/* Flow table */\n+\tflow_hash_params.hash_func_init_val = priv->hash_seed;\n+\tpriv->flow_table = rte_hash_create(&flow_hash_params);\n+\tif (priv->flow_table == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"flow hash table creation failed\");\n+\t\tret = -ENOMEM;\n+\t\tgoto free_priv;\n+\t}\n+\n+\treturn 0;\n+\n+free_priv:\n+\trte_free(priv);\n+exit:\n+\treturn ret;\n+}\n+\n+void\n+nfp_net_flow_priv_uninit(struct nfp_pf_dev *pf_dev,\n+\t\tuint16_t port)\n+{\n+\tstruct nfp_net_priv *priv;\n+\tstruct nfp_app_fw_nic *app_fw_nic;\n+\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv);\n+\tpriv = app_fw_nic->ports[port]->priv;\n+\n+\trte_hash_free(priv->flow_table);\n+\trte_free(priv);\n+}\ndiff --git a/drivers/net/nfp/nfp_net_flow.h b/drivers/net/nfp/nfp_net_flow.h\nnew file mode 100644\nindex 0000000000..5ec80ba3b6\n--- /dev/null\n+++ b/drivers/net/nfp/nfp_net_flow.h\n@@ -0,0 +1,28 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef __NFP_NET_FLOW_H__\n+#define __NFP_NET_FLOW_H__\n+\n+#include \"nfp_net_common.h\"\n+\n+struct nfp_net_flow_payload {\n+\tuint16_t cmsg_type;\n+\tuint8_t match_len;\n+\tuint8_t action_len;\n+\tchar *match_data;\n+\tchar *action_data;\n+};\n+\n+struct rte_flow {\n+\tstruct nfp_net_flow_payload payload;\n+\tuint32_t hash_key;\n+\tuint32_t port_id;\n+};\n+\n+int nfp_net_flow_priv_init(struct nfp_pf_dev *pf_dev, uint16_t port);\n+void nfp_net_flow_priv_uninit(struct nfp_pf_dev *pf_dev, uint16_t port);\n+\n+#endif /* __NFP_NET_FLOW_H__ */\n",
    "prefixes": [
        "02/11"
    ]
}