From patchwork Tue Dec 5 02:54:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chaoyong He X-Patchwork-Id: 134848 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 3D56E433FD; Tue, 5 Dec 2023 03:55:35 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C5D6442D9A; Tue, 5 Dec 2023 03:55:24 +0100 (CET) Received: from NAM04-DM6-obe.outbound.protection.outlook.com (mail-dm6nam04on2127.outbound.protection.outlook.com [40.107.102.127]) by mails.dpdk.org (Postfix) with ESMTP id 4CA7642D0C for ; Tue, 5 Dec 2023 03:55:23 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GpeE2TOXKiVgNFvKohT+xY9mmmaJLm+rk2a1Kz0LKzhloAF2/gcqct3yyo8dv9GhSuHEAluBa0pAZYllcrscN66zTBczzw0wsNptmw6k13IB5RX1cJ0uPhQXLmi3RZWUJiPI5uydFlVmqunlo7vCXR8C96AzcbgVdrePft5Wtr4i+B2qBS27riCvnz5PO0rzx/BeiK2quqjebBpnzvTdcdJ3qJvK56fjBKzpsM6YxOJ9qa3jvVxga4ipHOvOPzgFq6UfQyAgRB51jhEa945wF+6gc1OGSwhbuWqetH+sRkoNuLq/T5IKQTH7+qAjbmh4B29qfZELb/6aq24hkfWbcw== 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=rWswxz+boVr3EIptEtN2vhl3GtOKfPBTYoePdH+PO6c=; b=LcR8OYTZd0GoSRmIpjarze3s4ykw1Lj3gYN4Lq4rFvOWqZiBSJhNyavnPKohsnXaafGQ2zCPvTUwwy+DKpU4ibZHwRFtItQkw5WoBRcM8JdRzefTeIAIWoKH59KsPYszfJk4nnR5Shmm+tm2uGPYmQKoZ4IOrF3JIG0Oa3R8ok2f5MnfjTtuV1kAahDatJoiSq9AAePnKXrOplUtVYsnChk202cnYZq+1i+fw40h2rtAOwLxD7oZtsHUG5f1WgJN1Rt2RGQeFP5pvXP6FfEKLKE3TLNqoxMgkBXd0W/hAC4uzMIJKeYjmu2yocNd9qFuH7xn0a1or/jITfAt/vLXBQ== 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=rWswxz+boVr3EIptEtN2vhl3GtOKfPBTYoePdH+PO6c=; b=lN+aMoSP2DB9qwLBRzYtb+6zlUoKxIG8KRg7SegdenODrFC/2/VRtKU/gkM21XovW1tmS2CCsR/pWGmkPtdvnNl5EtSaBlBA7XFFEcU7NlPsv4aNk4jLxDQOrhmASuxfAlqJUy+zNG2gWN6AheW/o0EKvU/8ntKl5zwLiuY0u0Y= 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 LV3PR13MB6528.namprd13.prod.outlook.com (2603:10b6:408:1a5::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.34; Tue, 5 Dec 2023 02:55:21 +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.7046.033; Tue, 5 Dec 2023 02:55:21 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH v2 02/11] net/nfp: add the structures and functions for flow offload Date: Tue, 5 Dec 2023 10:54:48 +0800 Message-Id: <20231205025457.1067372-3-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231205025457.1067372-1-chaoyong.he@corigine.com> References: <20231103062606.2632012-1-chaoyong.he@corigine.com> <20231205025457.1067372-1-chaoyong.he@corigine.com> X-ClientProxiedBy: SJ0PR03CA0214.namprd03.prod.outlook.com (2603:10b6:a03:39f::9) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|LV3PR13MB6528:EE_ X-MS-Office365-Filtering-Correlation-Id: 67f640c3-23d8-410a-0fe1-08dbf53d9eb8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: nMtrcYHLn+Bm8sfB45dQIYqvEzTRwaV4NddrZvnJRpm5YrgsdURo1/M85ngWUJ0qyyYnBhd0ZB1vT/nl9TXMoDdfylwURr7lamZB2snjlsyu6reRjNrYqU663hMcI6J3IMDfeeltBFGN5cJ8JqhGwmrMkh+DmmdJ7GJ1hSyPAbTPEJE4idq0EwYjKtfOhmoWtjFepMbsqo9ruegmzYW9/DorgPpAIr6w/bxxOJJYrJPViIip3/51TeMiFg24aLr4TYXVEY3EQRQPeecrjKmfSVKXAMXSoEFDvmllSZJeLVeW8R4h8kXZzp+kCZZUOiFjozI9PIQDqcTVmO45pITA62XclOqa71qllGrMBXvZiL481T4idcwp6LAYsM2tZ5fqqRzK2Qu/Mw7g6iKr5d+kVTjcyS1jE/j/RtZhp2npsrsTOs7fS2n1SnuOQyk3sltq3N8fRatlayoq4prBG+JGxc0N1b2/AxxDDoPvLq03E9hNGAUs6KjespbEkcdD08BPU6gQTGPNVg78Jld/OKJSVYebxI+kUUSrPOaQx/rZhB1rtSzi8EnQlWCpy9ocBWknBRXScAQPGWwXcRvKgL7EiKz4+EoRMbKQtEk/kefutjBOVAo1axWooi82JhFFv9CcJC3xvgT/H0jILVdMui2cESgQvg/uy+K8GYtx5CtRaO8= 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)(396003)(136003)(366004)(346002)(39840400004)(376002)(230922051799003)(186009)(1800799012)(451199024)(64100799003)(2906002)(86362001)(44832011)(4326008)(8676002)(8936002)(5660300002)(36756003)(41300700001)(38350700005)(26005)(2616005)(52116002)(478600001)(6506007)(6486002)(6512007)(1076003)(316002)(54906003)(6916009)(66476007)(83380400001)(6666004)(38100700002)(66556008)(107886003)(66946007); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Gxb75xGklPsMaIF8OX+J4mFdtNUmDy8rpWcXqsms1FK9cD3pSLj+8PsvZWWf35izqHJIq1/CC2oKXON1yTPFoNSD7D3+uN7SXMNn3hLtvF4xMl6abpFVEUdc7l0EdhbpRxKLn/Qxx9mgeJIrBac8hnPZdChYxWUwIN/9N7UYawC6iaFGefQ/URfqeESXYiRg7lVZqhcas6PSCGsTNOZDG+kxGdB4JAxo1u4UBEoVE5/WjvkeLaukdKz8Ix0URmGyFC8GvBjTjGFX9YS4+dOPp7lAiGFrsedEDOnpXzsiGOX/8rGDBvXihf5mgiEjYaia50ZN/Liqig6xSpPnytMg11avfCQEP0SvL6vgIwCutf/nJYr+Mpa7vEiVbqTfSJpOdr7iHZEAORief4WQ+x/vx+/OLTqjbM1cEqfJDLfSk+yCx2CH0t6P/HR2mamJMoSB0LkFTPhKjPfg7i6VHfMmGPdJ2PjKDZ5Wxa2mxk2AcEMGTVXiLtHzYQU6+qcH2n7UheCaVrYThiNGEb8tP/yisFhFoSKXIE8B5vdldS2i2hI/oGo7bXwOdkNR7W8VKR0oO5ZhwL71LyZ/EHZlxiUqzY+lw+1NlDzxLpShcQhhiRw4K9l8OkJsH1kelBNm87dunOz6XHPAPFEJI/XwOxMczSFE9lxtqTc18ngA3KVNoZAUtJyNEWI/ES9VNKhCEYeTgeyhJ6jAGyvwhGOAb1o8nvuqetM0U/E5LfRp5PgXRcqh4jHHTk3HEurhtcKoO1nDqcKdqBucbqK0PYlY5mgi0DP95zCxiTgdFDF/96jSfvy1EqRwoDQj9BV/Fbr+138Cb9rk7129P3Dw316A9Qj9DqXsCV2bIMr3yZuxv2zjulqznfBBfdu892QUP/693HULhMk+qq76byBScJSCkHV17TjYAbioPZmE2ydRYx2sV4FPoqdVSYT4CntxI57nJO8VNc5VhKoxcDrHnwg/31FwCbPrgz33s/uV1lZEoEDJNAuO215VpMgfrceD6qYY2btsIitaaC2S2ien++TrdZhY3Ye3uSfHQ/WvWlIjlKC7kTpUQR+8YZggZwbASDRO5A4ANWbh3x2JquKLT3rMgvKFPZovFXC+xIwvE4hvZCrqaYJg3i6HSZ/bXV3LSRFFP+RDYAZ6a8UfGqbM/vZiOX+ZAwgxVEyETQ9Fu7M/aSRhGdPgYfPD61f6t/hJkKN3IrDYuiuhPgaLn+u0N20M7d975dp41dTN4xwOlnN35sbGibH80TjcLhpDWigyoovniArBrvvCcuusklri5iMa1EggjPs8ncEnp03LvGrLDlxN7SM+UVyu5lSCe7BlrqfrMHxK+7+gpoFPxqm/3HsoNpyPulUy1CRGameMwUkXyXG2FbwBfmyDY19PEHJfrpRQNVOYPkAhxMQmN/ypqMJdnkpB3pIOxAJe26DQQlFxQXtvwloMtwVroTkWDMWP+Ghj/CBNt5ks/fd8Fwk0MDWSW8LV+foLmO87PsIzLvnO70DLsh4Rs/EdFcRvx8UprilieRkPpVB2Wnk8IVkpXifyae/oTwp4XL23dQGOKk37nSa0qsrEgMLBNMBU7LxSeK0E0ETWotFooiz2ElszRrz3N3LSag== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 67f640c3-23d8-410a-0fe1-08dbf53d9eb8 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Dec 2023 02:55:21.0842 (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: TPIZM2QrR0Xtf6dKYrXKT8FD3m+hYpuV9lEY84Z6aR6O4MLQWUclp6CuUf6QTTW1tojbbPBczek6p5akqwoa94bRA6K24mNALT5irUte1ok= X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR13MB6528 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 | 27 ++++- drivers/net/nfp/nfp_net_common.h | 11 ++ drivers/net/nfp/nfp_net_flow.c | 166 +++++++++++++++++++++++++++ drivers/net/nfp/nfp_net_flow.h | 28 +++++ 6 files changed, 228 insertions(+), 6 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 537b4fe792..d0a1950ff3 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 @@ -151,6 +152,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; @@ -323,6 +328,10 @@ nfp_net_uninit(struct rte_eth_dev *eth_dev) struct nfp_net_hw *net_hw; net_hw = eth_dev->data->dev_private; + + if ((net_hw->super.cap_ext & NFP_NET_CFG_CTRL_FLOW_STEER) != 0) + nfp_net_flow_priv_uninit(net_hw->pf_dev, net_hw->idx); + rte_free(net_hw->eth_xstats_base); nfp_ipsec_uninit(eth_dev); if (net_hw->mac_stats_area != NULL) @@ -762,6 +771,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"); + goto xstats_free; + } + } + return 0; xstats_free: @@ -1195,13 +1212,11 @@ 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_net_uninit(tmp_dev); - rte_eth_dev_release_port(tmp_dev); + if (hw != NULL && hw->eth_dev != NULL) { + nfp_net_uninit(hw->eth_dev); + rte_eth_dev_release_port(hw->eth_dev); } } nfp_cpp_area_release_free(pf_dev->ctrl_area); diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h index ded491cbdc..eb668a1505 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..25da9ed8ac --- /dev/null +++ b/drivers/net/nfp/nfp_net_flow.c @@ -0,0 +1,166 @@ +/* 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; + + if (pf_dev == NULL) + return; + + app_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv); + priv = app_fw_nic->ports[port]->priv; + if (priv != NULL) + 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__ */