From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 71C4443275; Fri, 3 Nov 2023 07:26:52 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 602A742D78; Fri, 3 Nov 2023 07:26:39 +0100 (CET) Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2111.outbound.protection.outlook.com [40.107.93.111]) by mails.dpdk.org (Postfix) with ESMTP id 296D8427DD for ; Fri, 3 Nov 2023 07:26:37 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; 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; s=arcselector9901; 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; bh=DqlcuPCq7pCDDakzv3SLa7EuAVm1UOaNaCHOWYAPRyQ=; b=lTlrG9dY5/eq90NBN2hS7ryq6zOnVrrryQPlEnQLCjndT5Osdpi6K/9NGS8fc0gaHrmYfb8Jl5wFy/bKL4KnNEjDwTouauCZ13kkZ0F0jJNrdq2fTA0HU2z1X7+4nysjaYCN7o0HHhgZhHB+Ce2xgcm2x4+WNeXGfWIndAMWseYKYPnQjI8k9DKTBR6OHpBRr7HVd5oSm5Da6Y/606F7wRfVczYD5aAFOK8d1hlTYJlwPL6YMcXyeLY6BkCOEIaMJaJtdvgwj5RziPP886aqrpWUvI9bMs6yeW4mbydmKqNHrJ/auQZ/nx9G2otLZDggVegMQhPQ17QyPPHgLpojcw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DqlcuPCq7pCDDakzv3SLa7EuAVm1UOaNaCHOWYAPRyQ=; b=XodDZU+thqLMvzFPEorNyon0LPVJgEzXcC9LF7u2Djiu1COt61Q5fwL8ke5wiwwi7AOoG7XhYImFnEni7U3HtygPhPftcw13JhRuFmgPcxHdYS3o2T8DyQABnngnwydDBVYQ+XlbKo2m/c+d8OSqUQ97YRpSjjGf2uO4Zj9pjVI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by MN2PR13MB4102.namprd13.prod.outlook.com (2603:10b6:208:262::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.24; Fri, 3 Nov 2023 06:26:33 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6954.021; Fri, 3 Nov 2023 06:26:32 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 02/11] drivers: add the structures and functions for flow 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 (2603:10b6:a03:54::21) To SJ0PR13MB5545.namprd13.prod.outlook.com (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: 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:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; 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); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Tc3XvtqJ1G2bLQr65POcj+unn6L+kAy4rIHNHIWe4AM1czVNpa2kTObCk01c?= =?us-ascii?Q?lg1Q4QPx/lnsaDrmIGivheC2Vj3Pw3WQai2n0Ug4bCGTNdEyKpXCKtfhXdo0?= =?us-ascii?Q?WMuYq5TIg8IIs5eNfH8yCSIbeuhoA79t5NhTEKk3zA4Di61hG1aKrPKN7kjx?= =?us-ascii?Q?RJ/5kAIlAptT+yW2Ow7/41piYMAYBWY6FOqxo2KXk/siX3XgjJPx44xh28YK?= =?us-ascii?Q?SS1ZMEdQQNfJkAilsFU3yjej9ASJYcbybhsGGE35yhvxHjHf2c+bSOQwoO0y?= =?us-ascii?Q?3LQwHh+T+3IxzggFmG2ZwV/Qp1YK49lhjUqgMgzJeif53chOEdgfO/e9fug+?= =?us-ascii?Q?CoQLQEGgWY5Tw/KhGvAbXMJDAiTueOh7xRUClwffJsarWIaHfBZBnHGK+cnd?= =?us-ascii?Q?M4bhsOAhVDD4gbMdA5I2xXx9R13CVuYfk4Tbqm0slNwHAfqLellcIBWJ30OC?= =?us-ascii?Q?2dcNXVTmphKxp06Hy8ticQl/YvH9g0oNxXLwR7PF/HRbq9do2qURZ/qmJgNO?= =?us-ascii?Q?2nCrMYNcKAepANps3wgpCUMo+NCDuJZOmXyh2hE2ivYfJu6MxLf1QWxUlWOu?= =?us-ascii?Q?PfX/Nl7uQI+X+T+HAI7JSXnDyikv0cxEkXAUNXrnBdGBdQRbM78GMGqBiW7e?= =?us-ascii?Q?+t0I78uo0y2Ikhm5Rjvs4ArY2DJzVqJvKkJvKSUCk44vI+U9Rtu69Wbs1I+8?= =?us-ascii?Q?9/Itq5naIAi256GPJOHjLcYJbGtYtkS0Q0rlGYKIslvq87kErLdruCFw425r?= =?us-ascii?Q?Vg+zJT+n6h02CKmJf9Qb56rtqjsClwsCUJUk/cDuGgBBq8I0s18przXYcsNX?= =?us-ascii?Q?7SBRcvM0JXWaU8k5Kr52q+MwZ056CVQrZUotc+gIt6BE4YLXW2Cy9m6Wx2so?= =?us-ascii?Q?9wmN/heiwYGJ+H6GSldOovGZ4veAKQTEWZ+nZ59ckVgFnHP6WAKVRF32R06i?= =?us-ascii?Q?jpNpfs7wC4f6yI4pIEE1roF/oZrvVpCmuD5Ou/a+oJu+Xoxy73unAg161R4z?= =?us-ascii?Q?eb2ZpItV+rrPFglwrl7ZuDnYVylw8Fu9hBK9zRiI0VhwIP1jpQ7R+Ty4Ur0g?= =?us-ascii?Q?Mhsmss48xJiyVA+1DDL+M3IPgU6n/47b989YRlAlwC1D+WdJEVqOs0e/hzqb?= =?us-ascii?Q?L+xXMgobYeH4vOpAfv4VzA2V4IXJLoipRXqSmECGxOIoQzPJyA9q7wMpdDzX?= =?us-ascii?Q?cJudiNBOkaG4nUKNYIaPo1sILak37Z9Qwx/mLYNcPj7mQ4xdqn5Z/dRH0G2X?= =?us-ascii?Q?HvaflQNrQVEhpHN1+eZLTpCQ+H4qfBsurejaq/hMoE19TPT5Hm5HwPgReugj?= =?us-ascii?Q?WYRdUZ2AT2fK7uUOr87FltvUOoXuJvYQ27NpL7tJW3lHx/Mj50r5696KsSiJ?= =?us-ascii?Q?gRLqDPCNFiVarpfZEcLKYQNHreq5Fm/FbZTLdOKbdQWCT9428/gvt/UTXsN9?= =?us-ascii?Q?mAi7pl1irA5K9JY6S+S0rfUV9Pw6Pu0/3YlzLpRURdP8NIE9L3mxZmq5AqZy?= =?us-ascii?Q?eIDIurudX3heXILfVNQjmmbbE95P4QSB1dl8Y+rVJizjDetoNFk9BzgvGk0w?= =?us-ascii?Q?n7APKk94k2gio3ZnfULhH1vRXbj7qT6Jsur0N50FvBN6JlZM1Un1P6UWToCC?= =?us-ascii?Q?1Q=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 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: 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add the structures and functions to process flow table, which is used in the rte_flow offload logics. This module is used for the CoreNIC firmware. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/common/nfp/nfp_common_ctrl.h | 1 + drivers/net/nfp/meson.build | 1 + drivers/net/nfp/nfp_ethdev.c | 26 +++-- drivers/net/nfp/nfp_net_common.h | 11 ++ drivers/net/nfp/nfp_net_flow.c | 162 +++++++++++++++++++++++++++ drivers/net/nfp/nfp_net_flow.h | 28 +++++ 6 files changed, 222 insertions(+), 7 deletions(-) create mode 100644 drivers/net/nfp/nfp_net_flow.c create mode 100644 drivers/net/nfp/nfp_net_flow.h diff --git a/drivers/common/nfp/nfp_common_ctrl.h b/drivers/common/nfp/nfp_common_ctrl.h index d09fd2b892..cbde987736 100644 --- a/drivers/common/nfp/nfp_common_ctrl.h +++ b/drivers/common/nfp/nfp_common_ctrl.h @@ -223,6 +223,7 @@ struct nfp_net_fw_ver { #define NFP_NET_CFG_CTRL_IPSEC_SM_LOOKUP (0x1 << 3) /**< SA short match lookup */ #define NFP_NET_CFG_CTRL_IPSEC_LM_LOOKUP (0x1 << 4) /**< SA long match lookup */ #define NFP_NET_CFG_CTRL_MULTI_PF (0x1 << 5) +#define NFP_NET_CFG_CTRL_FLOW_STEER (0x1 << 8) /**< Flow Steering */ #define NFP_NET_CFG_CTRL_IN_ORDER (0x1 << 11) /**< Virtio in-order flag */ #define NFP_NET_CFG_CAP_WORD1 0x00a4 diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build index 8407073af8..0d0a0bd8f4 100644 --- a/drivers/net/nfp/meson.build +++ b/drivers/net/nfp/meson.build @@ -36,6 +36,7 @@ sources = files( 'nfp_mtr.c', 'nfp_net_common.c', 'nfp_net_ctrl.c', + 'nfp_net_flow.c', 'nfp_rxtx.c', ) diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index f02caf8056..af5e5d333a 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -23,6 +23,7 @@ #include "nfp_cpp_bridge.h" #include "nfp_ipsec.h" #include "nfp_logs.h" +#include "nfp_net_flow.h" #define NFP_PF_DRIVER_NAME net_nfp_pf @@ -150,6 +151,10 @@ nfp_net_start(struct rte_eth_dev *dev) ctrl_extend |= NFP_NET_CFG_CTRL_IPSEC_SM_LOOKUP | NFP_NET_CFG_CTRL_IPSEC_LM_LOOKUP; + /* Enable flow steer by extend ctrl word1. */ + if ((cap_extend & NFP_NET_CFG_CTRL_FLOW_STEER) != 0) + ctrl_extend |= NFP_NET_CFG_CTRL_FLOW_STEER; + update = NFP_NET_CFG_UPDATE_GEN; if (nfp_ext_reconfig(hw, ctrl_extend, update) != 0) return -EIO; @@ -692,6 +697,14 @@ nfp_net_init(struct rte_eth_dev *eth_dev) /* Recording current stats counters values */ nfp_net_stats_reset(eth_dev); + if ((hw->cap_ext & NFP_NET_CFG_CTRL_FLOW_STEER) != 0) { + err = nfp_net_flow_priv_init(pf_dev, port); + if (err != 0) { + PMD_INIT_LOG(ERR, "Init net flow priv failed"); + return err; + } + } + return 0; } @@ -1115,14 +1128,13 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev, port_cleanup: for (i = 0; i < app_fw_nic->total_phyports; i++) { id = nfp_function_id_get(pf_dev, i); + hw = app_fw_nic->ports[id]; - if (app_fw_nic->ports[id] != NULL && - app_fw_nic->ports[id]->eth_dev != NULL) { - struct rte_eth_dev *tmp_dev; - tmp_dev = app_fw_nic->ports[id]->eth_dev; - nfp_ipsec_uninit(tmp_dev); - rte_eth_dev_release_port(tmp_dev); - app_fw_nic->ports[id] = NULL; + if (hw != NULL && hw->eth_dev != NULL) { + nfp_ipsec_uninit(hw->eth_dev); + if ((hw->super.cap_ext & NFP_NET_CFG_CTRL_FLOW_STEER) != 0) + nfp_net_flow_priv_uninit(pf_dev, id); + rte_eth_dev_release_port(hw->eth_dev); } } nfp_cpp_area_free(pf_dev->ctrl_area); diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h index 30fea7ae02..48791af93a 100644 --- a/drivers/net/nfp/nfp_net_common.h +++ b/drivers/net/nfp/nfp_net_common.h @@ -108,6 +108,14 @@ struct nfp_pf_dev { struct nfp_multi_pf multi_pf; }; +#define NFP_NET_FLOW_LIMIT 1024 + +struct nfp_net_priv { + uint32_t hash_seed; /**< Hash seed for hash tables in this structure. */ + struct rte_hash *flow_table; /**< Hash table to store flow rules. */ + uint16_t flow_count; /**< Flow count in hash table */ +}; + struct nfp_app_fw_nic { /** Backpointer to the PF device */ struct nfp_pf_dev *pf_dev; @@ -177,6 +185,9 @@ struct nfp_net_hw { struct nfp_net_tlv_caps tlv_caps; struct nfp_net_ipsec_data *ipsec_data; + + /** Used for rte_flow of CoreNIC firmware */ + struct nfp_net_priv *priv; }; static inline uint32_t diff --git a/drivers/net/nfp/nfp_net_flow.c b/drivers/net/nfp/nfp_net_flow.c new file mode 100644 index 0000000000..6c02b0f82e --- /dev/null +++ b/drivers/net/nfp/nfp_net_flow.c @@ -0,0 +1,162 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#include "nfp_net_flow.h" + +#include +#include +#include +#include + +#include "nfp_logs.h" + +__rte_unused static int +nfp_net_flow_table_add(struct nfp_net_priv *priv, + struct rte_flow *nfp_flow) +{ + int ret; + + ret = rte_hash_add_key_data(priv->flow_table, &nfp_flow->hash_key, nfp_flow); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Add to flow table failed."); + return ret; + } + + return 0; +} + +__rte_unused static int +nfp_net_flow_table_delete(struct nfp_net_priv *priv, + struct rte_flow *nfp_flow) +{ + int ret; + + ret = rte_hash_del_key(priv->flow_table, &nfp_flow->hash_key); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Delete from flow table failed."); + return ret; + } + + return 0; +} + +__rte_unused static struct rte_flow * +nfp_net_flow_table_search(struct nfp_net_priv *priv, + struct rte_flow *nfp_flow) +{ + int index; + struct rte_flow *flow_find; + + index = rte_hash_lookup_data(priv->flow_table, &nfp_flow->hash_key, + (void **)&flow_find); + if (index < 0) { + PMD_DRV_LOG(DEBUG, "Data NOT found in the flow table."); + return NULL; + } + + return flow_find; +} + +__rte_unused static struct rte_flow * +nfp_net_flow_alloc(uint32_t match_len, + uint32_t action_len, + uint32_t port_id) +{ + char *data; + struct rte_flow *nfp_flow; + struct nfp_net_flow_payload *payload; + + nfp_flow = rte_zmalloc("nfp_flow", sizeof(struct rte_flow), 0); + if (nfp_flow == NULL) + return NULL; + + data = rte_zmalloc("nfp_flow_payload", match_len + action_len, 0); + if (data == NULL) + goto free_flow; + + nfp_flow->port_id = port_id; + payload = &nfp_flow->payload; + payload->match_len = match_len; + payload->action_len = action_len; + payload->match_data = data; + payload->action_data = data + match_len; + + return nfp_flow; + +free_flow: + rte_free(nfp_flow); + + return NULL; +} + +__rte_unused static void +nfp_net_flow_free(struct rte_flow *nfp_flow) +{ + rte_free(nfp_flow->payload.match_data); + rte_free(nfp_flow); +} + +int +nfp_net_flow_priv_init(struct nfp_pf_dev *pf_dev, + uint16_t port) +{ + int ret = 0; + struct nfp_net_priv *priv; + char flow_name[RTE_HASH_NAMESIZE]; + struct nfp_app_fw_nic *app_fw_nic; + const char *pci_name = strchr(pf_dev->pci_dev->name, ':') + 1; + + snprintf(flow_name, sizeof(flow_name), "%s_fl_%u", pci_name, port); + + struct rte_hash_parameters flow_hash_params = { + .name = flow_name, + .entries = NFP_NET_FLOW_LIMIT, + .hash_func = rte_jhash, + .socket_id = rte_socket_id(), + .key_len = sizeof(uint32_t), + .extra_flag = RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY, + }; + + priv = rte_zmalloc("nfp_app_nic_priv", sizeof(struct nfp_net_priv), 0); + if (priv == NULL) { + PMD_INIT_LOG(ERR, "NFP app nic priv creation failed"); + ret = -ENOMEM; + goto exit; + } + + app_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv); + app_fw_nic->ports[port]->priv = priv; + priv->hash_seed = (uint32_t)rte_rand(); + + /* Flow table */ + flow_hash_params.hash_func_init_val = priv->hash_seed; + priv->flow_table = rte_hash_create(&flow_hash_params); + if (priv->flow_table == NULL) { + PMD_INIT_LOG(ERR, "flow hash table creation failed"); + ret = -ENOMEM; + goto free_priv; + } + + return 0; + +free_priv: + rte_free(priv); +exit: + return ret; +} + +void +nfp_net_flow_priv_uninit(struct nfp_pf_dev *pf_dev, + uint16_t port) +{ + struct nfp_net_priv *priv; + struct nfp_app_fw_nic *app_fw_nic; + + app_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv); + priv = app_fw_nic->ports[port]->priv; + + rte_hash_free(priv->flow_table); + rte_free(priv); +} diff --git a/drivers/net/nfp/nfp_net_flow.h b/drivers/net/nfp/nfp_net_flow.h new file mode 100644 index 0000000000..5ec80ba3b6 --- /dev/null +++ b/drivers/net/nfp/nfp_net_flow.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#ifndef __NFP_NET_FLOW_H__ +#define __NFP_NET_FLOW_H__ + +#include "nfp_net_common.h" + +struct nfp_net_flow_payload { + uint16_t cmsg_type; + uint8_t match_len; + uint8_t action_len; + char *match_data; + char *action_data; +}; + +struct rte_flow { + struct nfp_net_flow_payload payload; + uint32_t hash_key; + uint32_t port_id; +}; + +int nfp_net_flow_priv_init(struct nfp_pf_dev *pf_dev, uint16_t port); +void nfp_net_flow_priv_uninit(struct nfp_pf_dev *pf_dev, uint16_t port); + +#endif /* __NFP_NET_FLOW_H__ */ -- 2.39.1