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 A7C2945BC0; Tue, 29 Oct 2024 18:18:11 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7E86842FD9; Tue, 29 Oct 2024 18:17:15 +0100 (CET) Received: from egress-ip11a.ess.de.barracuda.com (egress-ip11a.ess.de.barracuda.com [18.184.203.234]) by mails.dpdk.org (Postfix) with ESMTP id E11D543270 for ; Tue, 29 Oct 2024 18:17:02 +0100 (CET) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05lp2109.outbound.protection.outlook.com [104.47.18.109]) by mx-outbound12-25.eu-central-1a.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 29 Oct 2024 17:17:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sz3Mriut/q4j6JR/YPVTKjia8pf5jxO9901swr8bPPCXzN1rKt/LDloMAL/no/AL7V+svd9QCLQGrXhKFQ5DHxgjwCHGY9jZZErMYp21ZSspCo3ejN9SMIeFPnWfaZ9umprZ14pv0kFBpTyRw044XzSDJ9Lzm9gSAFeu3wtn2ngK0LXG7jPJ7ygqLA8+t70yDBsNZN3tUIiK+A427bgKQP+caRcmGzZFPsmBezzDZkG2WBDKLC7CEB31wDzf8EzXstfGo3hDY+ixQMDPnezPN+oHbxhzCg4J1BtM6EHcUlAOfq6FVQWMmZ3sFeRnaY32ULn+nTQGLZ4MQV2FzV8PTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=+HTcTQMQNBvaxEaNar0esByMiCYJc0yWmiCr/YiGzS4=; b=Pk3oq4mAJlDA1FmjCdpK90uw6BH0anOjBKLB2JtL1qdcKb2NKSHhbGm0LzJPM6+fIrNs5blD43xpolY0n6wEURDiSAu3O8Xv7yezZuDwfMOEJoEo5y+vOcOo41fhH2EPCn3UrdVZQZvPVT8rLqx2hkGbZ5jbQxmHiujlaasNJOIRbdo8hx4wA5cuKo0sWvp6gWcuGoXYS7mXikYmNDMIWauJW4pvdoj8uNK5Cuscnyxedh/2BExNsfWnPf+MdssqMjuLDBXwPEt3KdSBTwC7vQxSS9ZEpCCgdcDh6On1E/Yok0Fs79kMycQ30JQvCcOUX2Me2F7OyN+1wUdYOxJMPQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=fail (sender ip is 178.72.21.4) smtp.rcpttodomain=dpdk.org smtp.mailfrom=napatech.com; dmarc=fail (p=reject sp=reject pct=100) action=oreject header.from=napatech.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=napatech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+HTcTQMQNBvaxEaNar0esByMiCYJc0yWmiCr/YiGzS4=; b=lKksSFNz5kfCkyzywtphxH8fZ4QCoehuTs1awXjZu05R7FzcbPw55EvUhc7nXw7VSwdQb2HKknJljc0u4KGQNL0AfrdvjStyC63w3jjJTZcUOwi3rRl2RLi+5tfsqjyOf5oF4i5be4f8UWLZPZpgVNj1H4g2XG1xsl5MyHTJ49Y= Received: from DUZPR01CA0208.eurprd01.prod.exchangelabs.com (2603:10a6:10:4b6::6) by DB9P190MB1842.EURP190.PROD.OUTLOOK.COM (2603:10a6:10:37d::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8093.31; Tue, 29 Oct 2024 16:43:56 +0000 Received: from DU2PEPF00028D06.eurprd03.prod.outlook.com (2603:10a6:10:4b6:cafe::36) by DUZPR01CA0208.outlook.office365.com (2603:10a6:10:4b6::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.17 via Frontend Transport; Tue, 29 Oct 2024 16:43:56 +0000 X-MS-Exchange-Authentication-Results: spf=fail (sender IP is 178.72.21.4) smtp.mailfrom=napatech.com; dkim=none (message not signed) header.d=none;dmarc=fail action=oreject header.from=napatech.com; Received-SPF: Fail (protection.outlook.com: domain of napatech.com does not designate 178.72.21.4 as permitted sender) receiver=protection.outlook.com; client-ip=178.72.21.4; helo=localhost.localdomain; Received: from localhost.localdomain (178.72.21.4) by DU2PEPF00028D06.mail.protection.outlook.com (10.167.242.166) with Microsoft SMTP Server id 15.20.8114.16 via Frontend Transport; Tue, 29 Oct 2024 16:43:56 +0000 From: Serhii Iliushyk To: dev@dpdk.org Cc: mko-plv@napatech.com, sil-plv@napatech.com, ckm@napatech.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@amd.com, stephen@networkplumber.org, Danylo Vodopianov Subject: [PATCH v4 65/86] net/ntnic: add flow aging API Date: Tue, 29 Oct 2024 17:42:09 +0100 Message-ID: <20241029164243.1648775-66-sil-plv@napatech.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20241029164243.1648775-1-sil-plv@napatech.com> References: <20241021210527.2075431-1-sil-plv@napatech.com> <20241029164243.1648775-1-sil-plv@napatech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PEPF00028D06:EE_|DB9P190MB1842:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 9d7fb72b-0ea1-4556-3f9a-08dcf838e1a7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|36860700013|376014|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?/AngDLQs8fIzoSLDyZUBtnKLKRzbg9aMcMJmrZeUuvhsqNM+GeEOeJTuCXfe?= =?us-ascii?Q?8ZsvXoArAlfPMXG0bKfShGPEh7ztvXQHiQ+a6SnGTm6T7UAAcg2kq80eGy5a?= =?us-ascii?Q?wQR6sUckFEk8JUI/6Iad/8Gb70ss+3m540sx5m/Bl7O40q+fw1LTaUIU/fa+?= =?us-ascii?Q?3JqPAgZURy5cO86fA2UTlDEQSkQ79wHrfYazYnKgg6vWuUCs3qqTZcX8p1hw?= =?us-ascii?Q?HUrY9NU93vl1957xptIhA7Ub39EjmNEtqThK1YLS8SfPUE5HgaGHTXqMCeQQ?= =?us-ascii?Q?duCJV0vgzEvhi9dWhPh4cgb9auTCgCTwJByuOG/d2PRilN9ixGKCs4S8yH+M?= =?us-ascii?Q?Wk/ZjYBcIyS7wD3ZtSbKee10GQbwjAzapbnF2PSXwb9qjC55zN5KN8GiCs2W?= =?us-ascii?Q?B7DN2szRt6qAUL4JtY3fN3vOhcCPacoxhxwtyfRgjSuVcEZtqHnBRKkzSjM4?= =?us-ascii?Q?pi5K359SLJyF51aEqHR9ZplVFhUwNF2O61+RopKWKuxjFeSHsTR5nOo8y/vy?= =?us-ascii?Q?TKmjr2g9Fubu6vHiUXOx+kZZoTiUkUuxcEodhlMhYNcHZPc4x1jppSPgDtX2?= =?us-ascii?Q?gMXhlaRYF/V+gz45UUUhMXJDMirATxOLu5/SpFPfDf6oPc3AiAVtUkXpyGF3?= =?us-ascii?Q?sTOMdKG0omAsQLIJiJwf0c+MH0e9s524yt1tUtKrA2qNw/MYTllnTSokJDxk?= =?us-ascii?Q?LVzJJGqAT05B4YbmguNALUUgFkyEFZZjKiBN28OF/Ina6CCCm9KkApahne3M?= =?us-ascii?Q?XZ7yeIEqZtE+nCyLg5rltekkGlglAaHPJq0p0TDbAedt/7hk8jQaHMdO0oOK?= =?us-ascii?Q?ghFHXR6AXlgVTkzSDj7LQXQzwKjQCgfdpSx39HkRCmMKnd5F4o9P+BHGED7d?= =?us-ascii?Q?HqkzDmMvj+oY3r5uj1z44B0EaSYVh/WqBsypbxi8oOaXk7822bzDcxhd/Spi?= =?us-ascii?Q?A+WoyflIjxKCtMD4iwRqbCX9jJTcM6SKSY5YE8PElkwlw5aIlhhUyuzotmgC?= =?us-ascii?Q?0GEaZpYLEua+asbYxbKL8RocJd8FtxTnoV+x13Qk23BtEllFXPOY3+r1lkKR?= =?us-ascii?Q?/WKmeCbHTimEYX7AMoXs18osA4kuZvQ9BjGnxmVc64rlEYi+zPZMBmI+jBn5?= =?us-ascii?Q?efOIBALP+v699gQmZcKgG5HPtm3kq4ftGfXgOcPSD7SwP0+1Ud48uMzt+FOq?= =?us-ascii?Q?RHOcBQJ1+xkTtoLrW9/3A1GcWC+rgs7kw6z3B8ytiYocsu8A8dk0fMdMfNPd?= =?us-ascii?Q?NN3+NH8+Uc3ZdWAy2/mQpQ1hY9OeA3+4/4p2NfqhvVdNzpogKJFWBw7rU9ua?= =?us-ascii?Q?gKnn1GDKsMPvkFIUZim+1S5pSQ4hkCqHlP5e32pVnArhVlZCM7OVKGzRce4d?= =?us-ascii?Q?M51JU11BhTYCANkHilSGCMrjZI8sO1GwvIcg8BF3/uhyvLkm/A=3D=3D?= X-Forefront-Antispam-Report: CIP:178.72.21.4; CTRY:DK; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:localhost.localdomain; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(1800799024)(36860700013)(376014)(82310400026); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: y6lv2pXmh7xv3P069nJsx7tPqlk0kADIrZ1lG1KvHgkqE2Uvq9QEze+4alYbQ3ZaEbsDX23ctAShw52c+R9z7hkHRPbTcJwc0Ao8UIlr85fam/JuuSW0bUklnGnIpY8VIcZB4XhErKwqx3SPdCAwV+SAU3kGfRR4IXJgFE/uLwna91QqTmntwtHDq5dp91yKCGU03kRp3AAWLTt7PECGHrmn1q84UWe/5dUznED6nXoELxdxgJJM7eH8UfM0jAYDh+MCjyrhojhZyywGIAiWGcciJJuBde872DvdAIPMQm1NyMDjnWz1MhVxQn46ot10za2UXVEIb9W4gvHmJLxp46n9NYShTJhczueMYd4RMXmbacjnvgENvXvgA15uQrpiWYccvKs27hgJsi03gYp6hF2AQiNNOKifNMoJaUCFMv9sMsWRWb8rmET3bsXaSgB6VQSLLinPpnI1J8fNuIrIhaAHCg4K3FzIrZsjm+JOw6YjCcVbWwhRvSkuhfI7bpRJ4jn0azlq9PPsc79nc56yTQmfougAtDHg0eZTemiPHy1LjESaLGPT5ZAfuMoRUHSs3JpuuSYCKE3rJygEKdX2Gt/ioJPQcZ92Zb8c6vcyLlGzFJvWdjlKJJBnhGqr7QBB+oRfhARtFiL6m9SOEA7QLbZb1SYoFYWrLkVDq5y/y68= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Oct 2024 16:43:56.4490 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9d7fb72b-0ea1-4556-3f9a-08dcf838e1a7 X-MS-Exchange-CrossTenant-Id: c4540d0b-728a-4233-9da5-9ea30c7ec3ed X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=c4540d0b-728a-4233-9da5-9ea30c7ec3ed; Ip=[178.72.21.4]; Helo=[localhost.localdomain] X-MS-Exchange-CrossTenant-AuthSource: DU2PEPF00028D06.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9P190MB1842 X-OriginatorOrg: napatech.com X-BESS-ID: 1730222220-303097-12762-31198-1 X-BESS-VER: 2019.1_20241018.1852 X-BESS-Apparent-Source-IP: 104.47.18.109 X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVubmxpZAVgZQ0MzA2MwoNcnMzM TMItksxTTZwtLc1NLAKCXR0Dg5ycxIqTYWAK1Knv5BAAAA X-BESS-Outbound-Spam-Score: 0.00 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.260064 [from cloudscan14-117.eu-central-1a.ess.aws.cudaops.com] Rule breakdown below pts rule name description ---- ---------------------- -------------------------------- 0.00 BSF_BESS_OUTBOUND META: BESS Outbound X-BESS-Outbound-Spam-Status: SCORE=0.00 using account:ESS113687 scores of KILL_LEVEL=7.0 tests=BSF_BESS_OUTBOUND X-BESS-BRTS-Status: 1 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 From: Danylo Vodopianov add flow aging API to the ops structure Signed-off-by: Danylo Vodopianov --- drivers/net/ntnic/nthw/flow_api/flow_api.c | 71 +++++++++++++++ drivers/net/ntnic/ntnic_filter/ntnic_filter.c | 88 +++++++++++++++++++ drivers/net/ntnic/ntnic_mod_reg.h | 21 +++++ 3 files changed, 180 insertions(+) diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api.c b/drivers/net/ntnic/nthw/flow_api/flow_api.c index efe9a1a3b9..b101a9462e 100644 --- a/drivers/net/ntnic/nthw/flow_api/flow_api.c +++ b/drivers/net/ntnic/nthw/flow_api/flow_api.c @@ -1048,6 +1048,70 @@ int flow_nic_set_hasher_fields(struct flow_nic_dev *ndev, int hsh_idx, return profile_inline_ops->flow_nic_set_hasher_fields_inline(ndev, hsh_idx, rss_conf); } +static int flow_get_aged_flows(struct flow_eth_dev *dev, + uint16_t caller_id, + void **context, + uint32_t nb_contexts, + struct rte_flow_error *error) +{ + const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops(); + + if (profile_inline_ops == NULL) { + NT_LOG_DBGX(ERR, FILTER, "profile_inline_ops uninitialized"); + return -1; + } + + if (nb_contexts > 0 && !context) { + error->type = RTE_FLOW_ERROR_TYPE_UNSPECIFIED; + error->message = "rte_flow_get_aged_flows - empty context"; + return -1; + } + + return profile_inline_ops->flow_get_aged_flows_profile_inline(dev, caller_id, context, + nb_contexts, error); +} + +static int flow_info_get(struct flow_eth_dev *dev, uint8_t caller_id, + struct rte_flow_port_info *port_info, struct rte_flow_queue_info *queue_info, + struct rte_flow_error *error) +{ + (void)dev; + (void)caller_id; + (void)port_info; + (void)queue_info; + (void)error; + + const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops(); + + if (profile_inline_ops == NULL) { + NT_LOG_DBGX(ERR, FILTER, "profile_inline module uninitialized"); + return -1; + } + + return 0; +} + +static int flow_configure(struct flow_eth_dev *dev, uint8_t caller_id, + const struct rte_flow_port_attr *port_attr, uint16_t nb_queue, + const struct rte_flow_queue_attr *queue_attr[], struct rte_flow_error *error) +{ + (void)dev; + (void)caller_id; + (void)port_attr; + (void)queue_attr; + (void)nb_queue; + (void)error; + + const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops(); + + if (profile_inline_ops == NULL) { + NT_LOG_DBGX(ERR, FILTER, "profile_inline module uninitialized"); + return -1; + } + + return 0; +} + int flow_get_flm_stats(struct flow_nic_dev *ndev, uint64_t *data, uint64_t size) { const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops(); @@ -1076,6 +1140,13 @@ static const struct flow_filter_ops ops = { .flow_flush = flow_flush, .flow_dev_dump = flow_dev_dump, .flow_get_flm_stats = flow_get_flm_stats, + .flow_get_aged_flows = flow_get_aged_flows, + + /* + * NT Flow asynchronous operations API + */ + .flow_info_get = flow_info_get, + .flow_configure = flow_configure, /* * Other diff --git a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c index ef69064f98..6d65ffd38f 100644 --- a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c +++ b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c @@ -731,6 +731,91 @@ static int eth_flow_dev_dump(struct rte_eth_dev *eth_dev, return res; } +static int eth_flow_get_aged_flows(struct rte_eth_dev *eth_dev, + void **context, + uint32_t nb_contexts, + struct rte_flow_error *error) +{ + const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops(); + + if (flow_filter_ops == NULL) { + NT_LOG_DBGX(ERR, NTNIC, "flow_filter module uninitialized"); + return -1; + } + + struct pmd_internals *internals = (struct pmd_internals *)eth_dev->data->dev_private; + + static struct rte_flow_error flow_error = { + .type = RTE_FLOW_ERROR_TYPE_NONE, + .message = "none" }; + + uint16_t caller_id = get_caller_id(eth_dev->data->port_id); + + int res = flow_filter_ops->flow_get_aged_flows(internals->flw_dev, caller_id, context, + nb_contexts, &flow_error); + + convert_error(error, &flow_error); + return res; +} + +/* + * NT Flow asynchronous operations API + */ + +static int eth_flow_info_get(struct rte_eth_dev *dev, struct rte_flow_port_info *port_info, + struct rte_flow_queue_info *queue_info, struct rte_flow_error *error) +{ + const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops(); + + if (flow_filter_ops == NULL) { + NT_LOG_DBGX(ERR, FILTER, "flow_filter module uninitialized"); + return -1; + } + + struct pmd_internals *internals = dev->data->dev_private; + + static struct rte_flow_error flow_error = { + .type = RTE_FLOW_ERROR_TYPE_NONE, + .message = "none" }; + + int res = flow_filter_ops->flow_info_get(internals->flw_dev, + get_caller_id(dev->data->port_id), + (struct rte_flow_port_info *)port_info, + (struct rte_flow_queue_info *)queue_info, + &flow_error); + + convert_error(error, &flow_error); + return res; +} + +static int eth_flow_configure(struct rte_eth_dev *dev, const struct rte_flow_port_attr *port_attr, + uint16_t nb_queue, const struct rte_flow_queue_attr *queue_attr[], + struct rte_flow_error *error) +{ + const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops(); + + if (flow_filter_ops == NULL) { + NT_LOG_DBGX(ERR, FILTER, "flow_filter module uninitialized"); + return -1; + } + + struct pmd_internals *internals = dev->data->dev_private; + + static struct rte_flow_error flow_error = { + .type = RTE_FLOW_ERROR_TYPE_NONE, + .message = "none" }; + + int res = flow_filter_ops->flow_configure(internals->flw_dev, + get_caller_id(dev->data->port_id), + (const struct rte_flow_port_attr *)port_attr, + nb_queue, + (const struct rte_flow_queue_attr **)queue_attr, + &flow_error); + + convert_error(error, &flow_error); + return res; +} + static int poll_statistics(struct pmd_internals *internals) { int flow; @@ -857,6 +942,9 @@ static const struct rte_flow_ops dev_flow_ops = { .destroy = eth_flow_destroy, .flush = eth_flow_flush, .dev_dump = eth_flow_dev_dump, + .get_aged_flows = eth_flow_get_aged_flows, + .info_get = eth_flow_info_get, + .configure = eth_flow_configure, }; void dev_flow_init(void) diff --git a/drivers/net/ntnic/ntnic_mod_reg.h b/drivers/net/ntnic/ntnic_mod_reg.h index 7325bd1ea8..52f197e873 100644 --- a/drivers/net/ntnic/ntnic_mod_reg.h +++ b/drivers/net/ntnic/ntnic_mod_reg.h @@ -286,6 +286,12 @@ struct profile_inline_ops { FILE *file, struct rte_flow_error *error); + int (*flow_get_aged_flows_profile_inline)(struct flow_eth_dev *dev, + uint16_t caller_id, + void **context, + uint32_t nb_contexts, + struct rte_flow_error *error); + int (*flow_nic_set_hasher_fields_inline)(struct flow_nic_dev *ndev, int hsh_idx, struct nt_eth_rss_conf rss_conf); @@ -355,6 +361,21 @@ struct flow_filter_ops { int (*flow_nic_set_hasher_fields)(struct flow_nic_dev *ndev, int hsh_idx, struct nt_eth_rss_conf rss_conf); int (*hw_mod_hsh_rcp_flush)(struct flow_api_backend_s *be, int start_idx, int count); + + int (*flow_get_aged_flows)(struct flow_eth_dev *dev, + uint16_t caller_id, + void **context, + uint32_t nb_contexts, + struct rte_flow_error *error); + + int (*flow_info_get)(struct flow_eth_dev *dev, uint8_t caller_id, + struct rte_flow_port_info *port_info, struct rte_flow_queue_info *queue_info, + struct rte_flow_error *error); + + int (*flow_configure)(struct flow_eth_dev *dev, uint8_t caller_id, + const struct rte_flow_port_attr *port_attr, uint16_t nb_queue, + const struct rte_flow_queue_attr *queue_attr[], + struct rte_flow_error *error); }; void register_dev_flow_ops(const struct rte_flow_ops *ops); -- 2.45.0