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 843894548E; Wed, 19 Jun 2024 11:16:00 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3E755427E1; Wed, 19 Jun 2024 11:15:30 +0200 (CEST) Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2126.outbound.protection.outlook.com [40.107.101.126]) by mails.dpdk.org (Postfix) with ESMTP id 952284021D for ; Wed, 19 Jun 2024 11:14:52 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=U5+d5tvgvZhFovaCMBMuUpYCszHvkKlvvGlo438f1Z+ne+JtB9DA07C5+lkgBoKa0cg54F1pdZV1sbv0vH6oR9NRbyK16rxnxFYPECLI9bwP2e47p00mv7IpMG+D2oHiCoQ15PER2KAIQ0NQdlXEOxNQAHgByEemcIBWydEdCNJpKiWNbuZJ9kEet78tLCo+hj4VwgU5tgvHpyElc+if7Yu3p1y3+rOKzaPKHu8vfULw+Q9PQZdsya4EzZwx+Om1bYka81wOj6AeLgnx2KF6veCx9YmsPVpGfzHLDRmotjeYU35j4hqHNKnkXLiw1ty8mAP8pKE/dlZbO01IcOVQzQ== 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=onr0FzTuUwyOBeyOjrVpjhahKAr+cRrtWoMP76lLsmU=; b=AkLYw2qlxWCeTVlEtTxXD/BRhaBtkbMHcj1HtI0ssfji73/I1WbOf1sldOAe17w5oKe6k0RWHOYrLncKbdri8J64VGp74pKcrD2czgPhUxsA8dcgIU4i6VQWBOavCNuEUac8778119L3CC6Zj+pM0/sOX5YxeR6Lxr2phT1cRwXlOX266wavc89bUb9L/lwdBJtCEEXuS0IfAtc+BBU4tfptHe2VGlA1413pOqcMfNNzS3zsk1lc31/a/Hjh3W8HrHehSAInPadvMtpQJpSbYPmKoyht5UhzsgU37VrT/n1z+5iZ//8ph6rkULDlXGNbOiIwGvwYortNzGf5lKu1PQ== 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=onr0FzTuUwyOBeyOjrVpjhahKAr+cRrtWoMP76lLsmU=; b=PzA++aBicnin8J8zRpUUCzH/8cGvBy5q7pZtFLWKcH/7sMpz8JqbC9uyDq3inBYam+JmHXtG24NJDwdRQIKQlEE+F+AtC+CW4NltoYMJnmr7R7oqlpFByQ1ZSvaZNnvPRMzhESRgHC4nZU/PnRmapzIzLRUQttVg6JzRf//gz7Y= 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 SJ0PR13MB5523.namprd13.prod.outlook.com (2603:10b6:a03:425::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7677.31; Wed, 19 Jun 2024 09:14:51 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833%4]) with mapi id 15.20.7677.030; Wed, 19 Jun 2024 09:14:51 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 07/21] net/nfp: refactor flow item calculate function Date: Wed, 19 Jun 2024 17:13:44 +0800 Message-Id: <20240619091358.3479247-8-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20240619091358.3479247-1-chaoyong.he@corigine.com> References: <20240619091358.3479247-1-chaoyong.he@corigine.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BYAPR05CA0027.namprd05.prod.outlook.com (2603:10b6:a03:c0::40) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|SJ0PR13MB5523:EE_ X-MS-Office365-Filtering-Correlation-Id: bf313975-d127-47eb-e226-08dc90404538 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230037|52116011|376011|1800799021|366013|38350700011; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?5NjzAsHTf1AsnA1NY49TRQiV3psApNmH18OatjFKjXcR0DdYjN7nwngjGyr5?= =?us-ascii?Q?kDil4YZscp/ldD7t4rn9r/BawnPaMoKxlx6WYwOhM41Ut5mssbYe5vJGuKWg?= =?us-ascii?Q?G5RKtaX7h42W+pVhvFY3k3ldADHKbYh/qQd2/j5x0dna2qKLSnvUFZT5xt6S?= =?us-ascii?Q?uzJ7Cob6166d4NQQVT3V5sgqYR/1viM/DqWg14AMcPfUL18St5dK1VIodKVs?= =?us-ascii?Q?yUdc76x6uwQisyLbhmw9R7gAZh+5cKfKCJjS37GE0hc3MMuCk7Sb+Bh+jFek?= =?us-ascii?Q?BWH6GyxlyEHYvRN15vCynkHOI1oTU5vBQRUVlKAVgFARMNT0HJbd4xHsWshB?= =?us-ascii?Q?qCLaL+QlRk3d3ulbdVOdJQF6svFONW4gB6+HWeoxFrQnZ2xQObO5wPb16ur+?= =?us-ascii?Q?AWht/q5CLtmvlW9btyuXxHhQTWhRphopa4z4rk5zq6ZEr4RLIoRllzOQ6sXQ?= =?us-ascii?Q?PKV8ue8Z92qzfeOShERYU/q8Yg+TlQmifTLCrCTIxdpDzBaoAh4thHjOrC0b?= =?us-ascii?Q?tb2tr9s8W1540kGdDn/4ddHe/+ReFI1FaxmvAH73Ik5/qKaLSOq1l3SXlaOc?= =?us-ascii?Q?Yqnyzkytiyi8qmk0ezC2LCckRE1ZSOP+HZq/pbii3tkYF8ijQbmmLCCx16P1?= =?us-ascii?Q?FPt1TD+7R9DSohCGHu4Bl4Y6hfLX/iND3tHtMUMyVngtReJP//3HCKJEtLhe?= =?us-ascii?Q?CqfXjmuqaPxQaVchBJ7HD9C2HMdgVxmhmiEue3Fb80QfLxkmD8NvmKk6ROab?= =?us-ascii?Q?6sJNAukjhlegcldvaEgT9buEjYmiMAZFyH9CpUw2dAq+fomf7ZRW4Is9o7Zu?= =?us-ascii?Q?fwfAGPvm+Sb4LtOrr0KCT1GArEgwd7YdknU5wBWowg2ICieJ8RLnJ+EyXEYg?= =?us-ascii?Q?NpjmdqOTDwQqR4nfd+m3/QEO8V/W3A05+7X/vSnjtMDAkWugn37Xjzvc16lA?= =?us-ascii?Q?zxalf+mz40XpDkfWZPByjuF1VDyKBXUsnfFreeC+GINRrYk3CUyUr1udtK/R?= =?us-ascii?Q?zpPwkZQKY2AbEnDuu8b1gMbPNyGW2VReVS7Gc2zSvu/KrZ3t8GEVfzxvP4Hx?= =?us-ascii?Q?LF0bC3Uq71oCIa+hChR5l1HeXRy30tDv8aWZNS99nAbxVTy1OtZsB7SqDfE4?= =?us-ascii?Q?tL46a1AZgovLGT113eJ3w665c/K+V9gI6JQhjROmHRt8k7xIh8/Y8lUagxe/?= =?us-ascii?Q?lNsza18gRjQQiFE+EEiJR3ZfmpkLjCaV2nFZeHxJjj/ms/UjCa+sjdUzM1T7?= =?us-ascii?Q?OP/kvVevAfaABH+mgk3+J34YJKJIfIidBBUnoLlSOcdSbmjzHwQ0gq0ncLiQ?= =?us-ascii?Q?8GY8lQoQ9+szFnUlAp4YoPNzg+s857XxYWzTWfCsRAo++9rJkHhJpVGfSfJP?= =?us-ascii?Q?I9t/r9w=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230037)(52116011)(376011)(1800799021)(366013)(38350700011); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?858M5pB/BwQ840SZhLja9N5Ra5kOQ3HP0NFG+twjoU9tTvAekJrQnIuBG7tX?= =?us-ascii?Q?eiFtjVlGpoO2a2T3TGHfhbdfGO2hmuNEfrRdXHOdWUfR8joNjIvpfzycBWoi?= =?us-ascii?Q?yEqiXoLWixroswBTTC/latEJGKMbHq3DZ9Y/fMDF+K09Z3dKxZ3pRaGQ1HZA?= =?us-ascii?Q?2zxPyQJKBk/DTctaUTAzglTO3PFlSjIM3cZfvh/IHnmf1kcZwHRa6aayTlJq?= =?us-ascii?Q?UGscrBrnf06ZNR60WYGR7vOXGCa3swrdxi9hYYSsuPH1ykVH/n0Brj3bCVlI?= =?us-ascii?Q?M6xKuP+0P7gJ+oM4Mk71/LrLIiMh7AZqhj84S/M4nkMjQHu2/qPCDqbwabe2?= =?us-ascii?Q?oP2zqkx5iLzlYwPN7QE524+AeEQPfLfee8/LyM/SZ3HFr57TEu7Pvacqiq0V?= =?us-ascii?Q?J5Fmj4mpz6/Ep6VtFoDuny0sYTxbmE3SzE5jSj126PzeWjIYZjOZ+00swPZc?= =?us-ascii?Q?o/5eOogbusAgmMxuqGtciB0euSMjRPn+EZbBpNQ+T5jXbCR6AHtS9NWsTfB+?= =?us-ascii?Q?PvRkfwgabuCgaIOMQxawejPZ6jqq2O/2ZUfUfgOeJqFLAtjEBFBh7GCgX57r?= =?us-ascii?Q?T3B2EYwxqRvOZyQphnl2b7aiamXRFzWISDJ2hMvuxLFzgjWAYVk6fkC9Qw5o?= =?us-ascii?Q?fIZrmH9X16Goq2bz7jhubxnR9Xms6LLNjNtrEZRDeTajubmknqzH3Yk6GuQi?= =?us-ascii?Q?qRmpR4dte2jWe2elJcQuJKKfCcaRMJNLT40JDJ/0P/N0Zh/WcaJfoUewgg0Y?= =?us-ascii?Q?YNKaAiJdgVkiPNX8bK6nJ7iqE+CAHjShZzHjm/7lU+PSX5SOxiGD/xJamuNW?= =?us-ascii?Q?yxZBLrsgxTD84SdbQCgxzrhhyDx0BZ3itNOOyqSTnII5Ypcuu0FMkBUce0G7?= =?us-ascii?Q?11bQkTgkbmdVWBNuWItJ3+Jk10Yy/6/08uMXAYP8JrO/EfgxT4zptBELPxDP?= =?us-ascii?Q?Sd6VemLA+cTPooyptc/zEiY4CeD9E7c4tDb4N5LbfA525o0pavtPudsVagLw?= =?us-ascii?Q?6bjsT+lw9OqFh83xJ1GPvpXkjuoALrNkdMRkWfmj7v4KUrTUgATf4m/8wQrB?= =?us-ascii?Q?LRJnbiYX594RKRM5pOGiuGKR1057SgxzXKtNpbE9VsNIU7t17auv+uCjShYd?= =?us-ascii?Q?bKAt+/jAvLjOu649FArJPOjiqe/pMhUkhG2Fe2DNoZ4cCD3h5/hxvn7/FC1g?= =?us-ascii?Q?U+mB8shkvo8pC3ZsVhzoFJCjKDeiGnzOi8X3fDmUOb38tUnTCTOFOTim1o9M?= =?us-ascii?Q?a3vSDvfA5ApnMrCkrQ1A+8nVQun/c+NIzLVOk/l9Kur0engXOMuvarydp3fB?= =?us-ascii?Q?98eRvEADfbgsrP+FFRdviEmEVyqJtARaBROJgR4NlUmJg12PjFXrsl8kXPjF?= =?us-ascii?Q?lX2nFLGq90dvaITr9SuSv4K+s/POzODKxfgpAz92yTaquj3FHFQaV8CI5Pp5?= =?us-ascii?Q?qgquaIWlWsgFM/SNRMUvn1VLMgNj9FlHs3U+/LJqYk7zwSYYzArZ2sciJFOp?= =?us-ascii?Q?A/I09BN8Fz4nc6cooMEYwITk7qPE6hXg2RtcZ9N73n4lRtEosUNTMpwvHgEM?= =?us-ascii?Q?peKtk7CdMJ5lL+vKTCesEX9ClJn3Mp6NlJTiLxoEzFETEpmHU+g3lMf50q9g?= =?us-ascii?Q?Ew=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: bf313975-d127-47eb-e226-08dc90404538 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2024 09:14:51.0700 (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: AW2CJoEYcdbdLbhX+PzLfJPlYgD+pTJ/S9qgFceaeNzZ7lo5JmoIblkWEh73f5OQsG60IHuon0Fg6XRfA8eREkwgJnj6GQB5raLBScZMRsc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR13MB5523 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 Refactor the flow item calculate function, break the big function with a long 'switch' control statement into a array of small functions, which makes the logic more clear and easy to reuse. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/net/nfp/flower/nfp_flower_flow.c | 367 ++++++++++++++--------- 1 file changed, 217 insertions(+), 150 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c b/drivers/net/nfp/flower/nfp_flower_flow.c index db4551d98b..95f9e8c2d6 100644 --- a/drivers/net/nfp/flower/nfp_flower_flow.c +++ b/drivers/net/nfp/flower/nfp_flower_flow.c @@ -814,164 +814,231 @@ struct nfp_item_flag { bool outer_ip6_flag; }; +struct nfp_item_calculate_param { + const struct rte_flow_item *item; + struct nfp_fl_key_ls *key_ls; + struct nfp_item_flag *flag; +}; + +typedef int (*nfp_flow_key_calculate_item_fn)(struct nfp_item_calculate_param *param); + +static int +nfp_flow_item_calculate_stub(struct nfp_item_calculate_param *param __rte_unused) +{ + return 0; +} + +static int +nfp_flow_item_calculate_eth(struct nfp_item_calculate_param *param) +{ + if (param->item->spec != NULL) { + param->key_ls->key_layer |= NFP_FLOWER_LAYER_MAC; + param->key_ls->key_size += sizeof(struct nfp_flower_mac_mpls); + } + + return 0; +} + +static int +nfp_flow_item_calculate_port(struct nfp_item_calculate_param *param) +{ + struct rte_eth_dev *ethdev; + struct nfp_flower_representor *repr; + const struct rte_flow_item_port_id *port_id; + + port_id = param->item->spec; + if (port_id == NULL || port_id->id >= RTE_MAX_ETHPORTS) + return -ERANGE; + + ethdev = &rte_eth_devices[port_id->id]; + repr = ethdev->data->dev_private; + param->key_ls->port = repr->port_id; + + return 0; +} + +static int +nfp_flow_item_calculate_vlan(struct nfp_item_calculate_param *param) +{ + param->key_ls->vlan = NFP_FLOWER_MASK_VLAN_CFI; + + return 0; +} + +static int +nfp_flow_item_calculate_ipv4(struct nfp_item_calculate_param *param) +{ + param->key_ls->key_layer |= NFP_FLOWER_LAYER_IPV4; + param->key_ls->key_size += sizeof(struct nfp_flower_ipv4); + if (!param->flag->outer_ip4_flag) + param->flag->outer_ip4_flag = true; + + return 0; +} + +static int +nfp_flow_item_calculate_ipv6(struct nfp_item_calculate_param *param) +{ + param->key_ls->key_layer |= NFP_FLOWER_LAYER_IPV6; + param->key_ls->key_size += sizeof(struct nfp_flower_ipv6); + if (!param->flag->outer_ip6_flag) + param->flag->outer_ip6_flag = true; + + return 0; +} + +static int +nfp_flow_item_calculate_l4(struct nfp_item_calculate_param *param) +{ + param->key_ls->key_layer |= NFP_FLOWER_LAYER_TP; + param->key_ls->key_size += sizeof(struct nfp_flower_tp_ports); + + return 0; +} + +static int +nfp_flow_item_calculate_vxlan(struct nfp_item_calculate_param *param) +{ + struct nfp_fl_key_ls *key_ls = param->key_ls; + + /* Clear IPv4 and IPv6 bits */ + key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV4; + key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV6; + key_ls->tun_type = NFP_FL_TUN_VXLAN; + key_ls->key_layer |= NFP_FLOWER_LAYER_VXLAN; + if (param->flag->outer_ip4_flag) { + key_ls->key_size += sizeof(struct nfp_flower_ipv4_udp_tun); + /* + * The outer l3 layer information is + * in `struct nfp_flower_ipv4_udp_tun`. + */ + key_ls->key_size -= sizeof(struct nfp_flower_ipv4); + } else if (param->flag->outer_ip6_flag) { + key_ls->key_layer |= NFP_FLOWER_LAYER_EXT_META; + key_ls->key_layer_two |= NFP_FLOWER_LAYER2_TUN_IPV6; + key_ls->key_size += sizeof(struct nfp_flower_ext_meta); + key_ls->key_size += sizeof(struct nfp_flower_ipv6_udp_tun); + /* + * The outer l3 layer information is + * in `struct nfp_flower_ipv6_udp_tun`. + */ + key_ls->key_size -= sizeof(struct nfp_flower_ipv6); + } else { + PMD_DRV_LOG(ERR, "No outer IP layer for VXLAN tunnel."); + return -EINVAL; + } + + return 0; +} + +static int +nfp_flow_item_calculate_geneve(struct nfp_item_calculate_param *param) +{ + struct nfp_fl_key_ls *key_ls = param->key_ls; + + /* Clear IPv4 and IPv6 bits */ + key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV4; + key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV6; + key_ls->tun_type = NFP_FL_TUN_GENEVE; + key_ls->key_layer |= NFP_FLOWER_LAYER_EXT_META; + key_ls->key_layer_two |= NFP_FLOWER_LAYER2_GENEVE; + key_ls->key_size += sizeof(struct nfp_flower_ext_meta); + if (param->flag->outer_ip4_flag) { + key_ls->key_size += sizeof(struct nfp_flower_ipv4_udp_tun); + /* + * The outer l3 layer information is + * in `struct nfp_flower_ipv4_udp_tun`. + */ + key_ls->key_size -= sizeof(struct nfp_flower_ipv4); + } else if (param->flag->outer_ip6_flag) { + key_ls->key_layer_two |= NFP_FLOWER_LAYER2_TUN_IPV6; + key_ls->key_size += sizeof(struct nfp_flower_ipv6_udp_tun); + /* + * The outer l3 layer information is + * in `struct nfp_flower_ipv6_udp_tun`. + */ + key_ls->key_size -= sizeof(struct nfp_flower_ipv6); + } else { + PMD_DRV_LOG(ERR, "No outer IP layer for GENEVE tunnel."); + return -EINVAL; + } + + return 0; +} + +static int +nfp_flow_item_calculate_gre(struct nfp_item_calculate_param *param) +{ + struct nfp_fl_key_ls *key_ls = param->key_ls; + + /* Clear IPv4 and IPv6 bits */ + key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV4; + key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV6; + key_ls->tun_type = NFP_FL_TUN_GRE; + key_ls->key_layer |= NFP_FLOWER_LAYER_EXT_META; + key_ls->key_layer_two |= NFP_FLOWER_LAYER2_GRE; + key_ls->key_size += sizeof(struct nfp_flower_ext_meta); + if (param->flag->outer_ip4_flag) { + key_ls->key_size += sizeof(struct nfp_flower_ipv4_gre_tun); + /* + * The outer l3 layer information is + * in `struct nfp_flower_ipv4_gre_tun`. + */ + key_ls->key_size -= sizeof(struct nfp_flower_ipv4); + } else if (param->flag->outer_ip6_flag) { + key_ls->key_layer_two |= NFP_FLOWER_LAYER2_TUN_IPV6; + key_ls->key_size += sizeof(struct nfp_flower_ipv6_gre_tun); + /* + * The outer l3 layer information is + * in `struct nfp_flower_ipv6_gre_tun`. + */ + key_ls->key_size -= sizeof(struct nfp_flower_ipv6); + } else { + PMD_DRV_LOG(ERR, "No outer IP layer for GRE tunnel."); + return -EINVAL; + } + + return 0; +} + +static nfp_flow_key_calculate_item_fn item_fns[] = { + [RTE_FLOW_ITEM_TYPE_ETH] = nfp_flow_item_calculate_eth, + [RTE_FLOW_ITEM_TYPE_PORT_ID] = nfp_flow_item_calculate_port, + [RTE_FLOW_ITEM_TYPE_VLAN] = nfp_flow_item_calculate_vlan, + [RTE_FLOW_ITEM_TYPE_IPV4] = nfp_flow_item_calculate_ipv4, + [RTE_FLOW_ITEM_TYPE_IPV6] = nfp_flow_item_calculate_ipv6, + [RTE_FLOW_ITEM_TYPE_TCP] = nfp_flow_item_calculate_l4, + [RTE_FLOW_ITEM_TYPE_UDP] = nfp_flow_item_calculate_l4, + [RTE_FLOW_ITEM_TYPE_SCTP] = nfp_flow_item_calculate_l4, + [RTE_FLOW_ITEM_TYPE_VXLAN] = nfp_flow_item_calculate_vxlan, + [RTE_FLOW_ITEM_TYPE_GENEVE] = nfp_flow_item_calculate_geneve, + [RTE_FLOW_ITEM_TYPE_GRE] = nfp_flow_item_calculate_gre, + [RTE_FLOW_ITEM_TYPE_GRE_KEY] = nfp_flow_item_calculate_stub, +}; + static int nfp_flow_key_layers_calculate_items(const struct rte_flow_item items[], struct nfp_fl_key_ls *key_ls) { - struct rte_eth_dev *ethdev; + int ret; struct nfp_item_flag flag = {}; const struct rte_flow_item *item; - struct nfp_flower_representor *representor; - const struct rte_flow_item_port_id *port_id; + struct nfp_item_calculate_param param = { + .key_ls = key_ls, + .flag = &flag, + }; for (item = items; item->type != RTE_FLOW_ITEM_TYPE_END; ++item) { - switch (item->type) { - case RTE_FLOW_ITEM_TYPE_ETH: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_ETH detected"); - /* - * Eth is set with no specific params. - * NFP does not need this. - */ - if (item->spec == NULL) - continue; - key_ls->key_layer |= NFP_FLOWER_LAYER_MAC; - key_ls->key_size += sizeof(struct nfp_flower_mac_mpls); - break; - case RTE_FLOW_ITEM_TYPE_PORT_ID: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_PORT_ID detected"); - port_id = item->spec; - if (port_id->id >= RTE_MAX_ETHPORTS) - return -ERANGE; - ethdev = &rte_eth_devices[port_id->id]; - representor = ethdev->data->dev_private; - key_ls->port = representor->port_id; - break; - case RTE_FLOW_ITEM_TYPE_VLAN: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_VLAN detected"); - key_ls->vlan = NFP_FLOWER_MASK_VLAN_CFI; - break; - case RTE_FLOW_ITEM_TYPE_IPV4: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_IPV4 detected"); - key_ls->key_layer |= NFP_FLOWER_LAYER_IPV4; - key_ls->key_size += sizeof(struct nfp_flower_ipv4); - if (!flag.outer_ip4_flag) - flag.outer_ip4_flag = true; - break; - case RTE_FLOW_ITEM_TYPE_IPV6: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_IPV6 detected"); - key_ls->key_layer |= NFP_FLOWER_LAYER_IPV6; - key_ls->key_size += sizeof(struct nfp_flower_ipv6); - if (!flag.outer_ip6_flag) - flag.outer_ip6_flag = true; - break; - case RTE_FLOW_ITEM_TYPE_TCP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_TCP detected"); - key_ls->key_layer |= NFP_FLOWER_LAYER_TP; - key_ls->key_size += sizeof(struct nfp_flower_tp_ports); - break; - case RTE_FLOW_ITEM_TYPE_UDP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_UDP detected"); - key_ls->key_layer |= NFP_FLOWER_LAYER_TP; - key_ls->key_size += sizeof(struct nfp_flower_tp_ports); - break; - case RTE_FLOW_ITEM_TYPE_SCTP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_SCTP detected"); - key_ls->key_layer |= NFP_FLOWER_LAYER_TP; - key_ls->key_size += sizeof(struct nfp_flower_tp_ports); - break; - case RTE_FLOW_ITEM_TYPE_VXLAN: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_VXLAN detected"); - /* Clear IPv4 and IPv6 bits */ - key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV4; - key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV6; - key_ls->tun_type = NFP_FL_TUN_VXLAN; - key_ls->key_layer |= NFP_FLOWER_LAYER_VXLAN; - if (flag.outer_ip4_flag) { - key_ls->key_size += sizeof(struct nfp_flower_ipv4_udp_tun); - /* - * The outer l3 layer information is - * in `struct nfp_flower_ipv4_udp_tun`. - */ - key_ls->key_size -= sizeof(struct nfp_flower_ipv4); - } else if (flag.outer_ip6_flag) { - key_ls->key_layer |= NFP_FLOWER_LAYER_EXT_META; - key_ls->key_layer_two |= NFP_FLOWER_LAYER2_TUN_IPV6; - key_ls->key_size += sizeof(struct nfp_flower_ext_meta); - key_ls->key_size += sizeof(struct nfp_flower_ipv6_udp_tun); - /* - * The outer l3 layer information is - * in `struct nfp_flower_ipv6_udp_tun`. - */ - key_ls->key_size -= sizeof(struct nfp_flower_ipv6); - } else { - PMD_DRV_LOG(ERR, "No outer IP layer for VXLAN tunnel."); - return -EINVAL; - } - break; - case RTE_FLOW_ITEM_TYPE_GENEVE: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_GENEVE detected"); - /* Clear IPv4 and IPv6 bits */ - key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV4; - key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV6; - key_ls->tun_type = NFP_FL_TUN_GENEVE; - key_ls->key_layer |= NFP_FLOWER_LAYER_EXT_META; - key_ls->key_layer_two |= NFP_FLOWER_LAYER2_GENEVE; - key_ls->key_size += sizeof(struct nfp_flower_ext_meta); - if (flag.outer_ip4_flag) { - key_ls->key_size += sizeof(struct nfp_flower_ipv4_udp_tun); - /* - * The outer l3 layer information is - * in `struct nfp_flower_ipv4_udp_tun`. - */ - key_ls->key_size -= sizeof(struct nfp_flower_ipv4); - } else if (flag.outer_ip6_flag) { - key_ls->key_layer_two |= NFP_FLOWER_LAYER2_TUN_IPV6; - key_ls->key_size += sizeof(struct nfp_flower_ipv6_udp_tun); - /* - * The outer l3 layer information is - * in `struct nfp_flower_ipv6_udp_tun`. - */ - key_ls->key_size -= sizeof(struct nfp_flower_ipv6); - } else { - PMD_DRV_LOG(ERR, "No outer IP layer for GENEVE tunnel."); - return -EINVAL; - } - break; - case RTE_FLOW_ITEM_TYPE_GRE: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_GRE detected"); - /* Clear IPv4 and IPv6 bits */ - key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV4; - key_ls->key_layer &= ~NFP_FLOWER_LAYER_IPV6; - key_ls->tun_type = NFP_FL_TUN_GRE; - key_ls->key_layer |= NFP_FLOWER_LAYER_EXT_META; - key_ls->key_layer_two |= NFP_FLOWER_LAYER2_GRE; - key_ls->key_size += sizeof(struct nfp_flower_ext_meta); - if (flag.outer_ip4_flag) { - key_ls->key_size += sizeof(struct nfp_flower_ipv4_gre_tun); - /* - * The outer l3 layer information is - * in `struct nfp_flower_ipv4_gre_tun`. - */ - key_ls->key_size -= sizeof(struct nfp_flower_ipv4); - } else if (flag.outer_ip6_flag) { - key_ls->key_layer_two |= NFP_FLOWER_LAYER2_TUN_IPV6; - key_ls->key_size += sizeof(struct nfp_flower_ipv6_gre_tun); - /* - * The outer l3 layer information is - * in `struct nfp_flower_ipv6_gre_tun`. - */ - key_ls->key_size -= sizeof(struct nfp_flower_ipv6); - } else { - PMD_DRV_LOG(ERR, "No outer IP layer for GRE tunnel."); - return -1; - } - break; - case RTE_FLOW_ITEM_TYPE_GRE_KEY: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_GRE_KEY detected"); - break; - default: - PMD_DRV_LOG(ERR, "Item type %d not supported.", item->type); - return -ENOTSUP; + if (item->type >= RTE_DIM(item_fns) || item_fns[item->type] == NULL) { + PMD_DRV_LOG(ERR, "Flow item %d unsupported", item->type); + return -ERANGE; + } + + param.item = item; + ret = item_fns[item->type](¶m); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Flow item %d calculate fail", item->type); + return ret; } } -- 2.39.1