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 B4CF045BB5; Wed, 23 Oct 2024 20:33:01 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A418842F01; Wed, 23 Oct 2024 20:33:01 +0200 (CEST) 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 7D693402A7 for ; Wed, 23 Oct 2024 20:32:58 +0200 (CEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05lp2169.outbound.protection.outlook.com [104.47.17.169]) by mx-outbound42-14.eu-central-1c.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 23 Oct 2024 18:32:57 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kTHjKddIFPk4I2oaZUjlDlwMUuETWQBKnipAfMwXl3T0IpKyyK6TDTEKiGAi4+2SHdm4B7/aa8c77vV5a9u7OJjOnWKc5txjxjbiH17faXvM7k1fSruGRUMWyUR8AVx0P3zTc3LMd8ORncQBhKI/eSyD9g7ddHiMunhoFzdOGcKMepEY4UC94YZqb2UosJZanzKgGV/H1LdyDAPRVX1L7wF461sKq7bClc+rUOszeItZ7gBjQoUQrlP1U5dgnkbTH1OaQH3+Ghzzsic5A0YgdLFFQ9nXIGdgKhfofyv7mR9j6rpMzKdOc/NGW+JVaj4aW9SdnTI2KLC25OwGooQrVA== 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=gg7exYkNdYOMZ/nCbtkqugJ89HT2ov3g6OKShoxc/As=; b=RkWykZwP9q0hRZwu55uf2Urim/z8LJkUY5NOmNQAbbGS4gFxQh3/tNZmOGP3vQrxF50eJOghiezC1LdA5rIqUwqcLFv1rygJVNomasih8hpjsjJgRJg96Ih0XQ33Ika8n1NkYYTh8OM8R/zpZbcVRgGAC7nnoc3C7BHBLDw7YFCPNE8FOTv+9A23mirNUthad4AEJ4pkhE1NDmkTE2RqdK3PL2G78pc0SRRXRN5/rDH7ksRPRsrqbhyWz7ncmpKdCZkxa8Q3beUv1XPgoySQmFb+85zM0eJiN9cBiWLJG0WdbRfBY6pN2ClXozMZK27sIyQDcixVF/wtHoZUw5B4nw== 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=gg7exYkNdYOMZ/nCbtkqugJ89HT2ov3g6OKShoxc/As=; b=lHgdRcJlcipeHAzmIhksHLFxssfEAG1W9maoHrf8exVdvZ59gknjEHKzKCEXnlqqlVG/+qAGO/lOkraVY90dxvpwKcQ7Z8Cxup9oydFbqmWRxx4oSeQVIAStR3Zf36es3qyChzlQ0RoStBs7RNs7PjRUWdm1ztJz3SFarySG2Nw= Received: from DU7PR01CA0006.eurprd01.prod.exchangelabs.com (2603:10a6:10:50f::6) by VI1P190MB0607.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:12a::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8026.23; Wed, 23 Oct 2024 17:01:42 +0000 Received: from DB5PEPF00014B9E.eurprd02.prod.outlook.com (2603:10a6:10:50f:cafe::47) by DU7PR01CA0006.outlook.office365.com (2603:10a6:10:50f::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8069.31 via Frontend Transport; Wed, 23 Oct 2024 17:01:41 +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 DB5PEPF00014B9E.mail.protection.outlook.com (10.167.8.171) with Microsoft SMTP Server id 15.20.8093.14 via Frontend Transport; Wed, 23 Oct 2024 17:01:41 +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, Danylo Vodopianov Subject: [PATCH v3 65/73] net/ntnic: add flow aging API Date: Wed, 23 Oct 2024 19:00:13 +0200 Message-ID: <20241023170032.314155-66-sil-plv@napatech.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20241023170032.314155-1-sil-plv@napatech.com> References: <20241021210527.2075431-1-sil-plv@napatech.com> <20241023170032.314155-1-sil-plv@napatech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DB5PEPF00014B9E:EE_|VI1P190MB0607:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 56707144-afa4-4f42-99a3-08dcf3845e10 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|36860700013|1800799024|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?hFsMgYydy6DyroyTiBteV1JRh1XzAiO3Aw1hFsluPTS9U+pvkM7TmXgml57L?= =?us-ascii?Q?zs6OA+5LD30ykM4jpkpgDc7TA8adN4DWs+oMlJMqPby2TvXfjK0nFNFD86IT?= =?us-ascii?Q?MFdl79cb1W3TwWuH9XV/oryQzCcwV9BDn0RVlvtgyExn3Og2h5tyUKmU2eiN?= =?us-ascii?Q?JVyrD5XdZbv4GrUbgKrqnygKTWf/fEd9OyG6mC0cTjcqFKZv0lI9BJN0r2Jz?= =?us-ascii?Q?t9TfXslyw5u11CsL07fp7A1+hqekxWj9QjtZeGJSD8MAKU6bZHkc0v8DHmBC?= =?us-ascii?Q?hwV13s4D+Lzg6S1FPIGN/8lv3KnW+6Rn/fzZnf22ndkVh8UYXxlDSWUiCqzp?= =?us-ascii?Q?B+ytLsoHMFmHvpBE7NoefBkx+vNIcE+mmHGZ9JH+CTT9+t7E+VraEkvFusGd?= =?us-ascii?Q?+XdoeYF5vIP675jqPyXiF9FSK8hNR3Th3Wc3a1mN18+Sj7+D821ml1raklmS?= =?us-ascii?Q?j6xHaeaEeLPWIuo/fkuFaJDk2vSIjCrZV6JjM2P65J0ceR/pVxpFPgIr26ay?= =?us-ascii?Q?MzNtm85bNQwuIK8UPObBrCR7hjK7UCcmmN6p3h55bHTuBH0VkQSaaqciangi?= =?us-ascii?Q?CHZ68VTeqBGQOhQmaxFWrpp7LQa9rMuZhMmDzyq0+p3d+k/bQ+AJRxUeKFjG?= =?us-ascii?Q?ouk2RfI9HYDhLkM9QjmCg81hIpOQR+PSmZmaHpPlUOYGMMO2hlLWTpos7bOh?= =?us-ascii?Q?QfB+MqDSV3nsAksvVVe7OD4/cDUFKcTrYLJw/cn7/elYr8HFxKn3vn7YLR/6?= =?us-ascii?Q?bnYIxNM8qO9QzpRDnENaMJObFunvsmSa1kYI5uB/8QSfUveWrf06qNvN0O4d?= =?us-ascii?Q?gUGb7y7d9BQy/Blv/A1FTrSVLEF31JnVZS5nIyP8peoSKCsGf/H7kYJJMEiq?= =?us-ascii?Q?4QqRxxT/1Wr9GoEAJXMykEyTsD2Zj1aCi7bUKMCUV0SKU7LRMswb1zVsCH9s?= =?us-ascii?Q?tHeY1DHzRcHSXw0KNvaCLcukzQIZW8CFcQGOdmCq/RCbpi2McpgqbM4pUmt9?= =?us-ascii?Q?ZW38GTi+ypKmYw5qCYPYwk9wZRzZ58e1I3swn8OpIk9R6B4WSqRmKtskTJCj?= =?us-ascii?Q?Y7zPpqQS36nFbYs7ldjGwXuVQFQ0vvxbwfDMguJO/TI/M41PaWOJt9s6G30M?= =?us-ascii?Q?Hr6g8lGqu3E1SW5flvSgGP+T78GbuDIv6Ho/WfXl13hmOfKHxn3sW61YYlJu?= =?us-ascii?Q?ab9dCairQV2+a3qvoAHypiWSabXploRfVsLHTUWFAH/EFTicQkaVTqUd1bn3?= =?us-ascii?Q?V/TpNRshoSiV57JOU3i5zCqERA5aNI2GYWq4BivAXB3UhKZQh3ceM/YVLuWZ?= =?us-ascii?Q?26Ly3189RTkAKanOnjHR5KGH9jcq/3tHNlL7qYrh4d+569JMcTGPcsts1euX?= =?us-ascii?Q?122GDLmdCyjuuIyswtvpwZ7U4R61NtnnW11zYgzlhWUhqkSKgA=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)(376014)(36860700013)(1800799024)(82310400026); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: rubi/dckfjagXMeIGm8Ko3T8yzoW8HOiTEwYcz3vUha/RK/LZQy1nHeHTufaQBMBOrYZX6b6bJVt5WEfnpoHLs7kNxYffcqpoDPZKYF0n40MyYnEraeQRMeE2TsX4ABwChusVKLMU/w3WAf8h0609pwVhzFU55VsfiN7om6sVRfRsebvVmTnz5ZNfWbv9mStqj2GZUmeC7KVk47PDfxCLcjIdGJoccLo6FvHZcKUEtjKvUk9sjkgN+7hmJWdWgrIPNwKEzJAr1WpgBkkdk1ksm+EXZRHdxotR4HrJpECfLBDswzwggNme+qbBxDzY4+QZXmSvff0we6UtReGiGqO2t9MVpmM1rbKqbiYJ2HYSk73mSAhT3a+ePmejm/2E60wpizp03mXWoYu+odvKC1IQyNKDwV2mA6IDiIPmTL9SDhDlYFWd7uZWaERbyf/v70TylV4pdjBUPhpK9CpieNqZ1LUqS2TLqufyGi8GkeKhuaUp4EPCxmu2C67Bo6lsHWns68bRH00lhR5ABNE2UMMVFNzsqJwSFbvl570tU1aaj0+Chz+3Kkyw1OF6i8mkHCgpLbTv+5L2MDIyWHJ2XnPUZUsRlpbdtlkF0sofIDWWfED6+rblBKfytU8nMVwPaQ8UI3Uth5/JAOvUwD/ulbCXUYcM9Ks8RpXs01B8qcbrSY= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Oct 2024 17:01:41.5865 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 56707144-afa4-4f42-99a3-08dcf3845e10 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: DB5PEPF00014B9E.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1P190MB0607 X-OriginatorOrg: napatech.com X-BESS-ID: 1729708377-310766-12792-45798-1 X-BESS-VER: 2019.1_20241018.1852 X-BESS-Apparent-Source-IP: 104.47.17.169 X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVubmxpZAVgZQMNnYOM3ALDUxzc TE1DI5xSzNJCnNIinV2CI5zSjFJDVRqTYWAPZojitBAAAA X-BESS-Outbound-Spam-Score: 0.00 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.259926 [from cloudscan19-22.eu-central-1b.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 e2fce02afa..9f8670b32d 100644 --- a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c +++ b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c @@ -718,6 +718,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; @@ -844,6 +929,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