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 DBF904548E; Wed, 19 Jun 2024 11:15:32 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D5B77427A3; Wed, 19 Jun 2024 11:15:19 +0200 (CEST) Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2125.outbound.protection.outlook.com [40.107.244.125]) by mails.dpdk.org (Postfix) with ESMTP id 15ECF4021D for ; Wed, 19 Jun 2024 11:14:40 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Cy1KtVZM35PWTO8sHkPElN0sgVGsdQPvd1RpUKdX++FfEN4z5E8s74i9P4EPdTtANeauylF9lfivv1s7yIonPzdLrv0GdECKS85M1Aj1Jvlp29c1k+f6uXtWoKd72844p0JuteP7FfbVm8Qyi7qSm/ai37VYOyNmIjpY2+KFp/xypSE3aY475svxoW6KyepPZNCzeMniQR/pNWm9nioTZ/D0Z8CJzFWKxw8Ku19UV9u1AJJItaUj3HxY1FsCejGhJzEPB8tDhgoBxkljxkWXHKHhgWZSESIQin2o0pvw1uedWsm7hvALHwnXxnEsvF2FkO8zxjTcEDiYcTFdVv7NOg== 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=4LwVweDrF5OHSu3OIpY4FtpihYV4rZBIZXb78WcCHzI=; b=FTZIy2XjPqaTxNRCBx8dCd2YDWn2VvlQ6XpQZmK3TT8NDOZEq8FHoJhHLq7vc7iuLbuTdp16KBDODRUS8oA4QIjK+lo0J/OEH90wG2mOHiranBFwDTvLKqqLUbOCRX+5CjZgvpTdMwYvirvgFlBn43lTzNiPmesWh3xFIiQrsBlyocMegD0CdwZ30ScqU2qL6YcrL3RO0ktVr2lDHTd+aIDjI03YH50B/0PYNvaIvPngYC3F34I8mTRicSLEQFyaV1fC2an7f466NpDj/V7KR23vau+8tsr/l5Xgkhkg9x28y9oFVq4wSw5F/nNQWK6WEwQWtXRacHpGY0r+0d8LFg== 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=4LwVweDrF5OHSu3OIpY4FtpihYV4rZBIZXb78WcCHzI=; b=Y4jUoFbe1WScd2oJWba+No/HpI8g2Knm6/5LcfDPS9y4Aow+ToZhdvZAElAq+u5Fqqj96VzRNLPsBMTsY22zcNcJ4rqKdZJiHZIpu7obQNbsNRoKqgWfPIeqDImdAn3Yvm0fKTD8t5WzgrOgnRO3xndXYu9+8BTW6qxs7812z0o= 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:38 +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:38 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 04/21] net/nfp: refactor flow action calculate function Date: Wed, 19 Jun 2024 17:13:41 +0800 Message-Id: <20240619091358.3479247-5-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: e2fb2244-11da-41d9-1734-08dc90403e1e 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?pI949Tee3EEDV6RWxvPWmh/WWGfCNfyLnRLGDL63jvC5eTD5gQdn3IhCTw3I?= =?us-ascii?Q?PpjKBuoVLOKM6P2wRaUBJ3vajKxR7qTp92yykVn3p+Xe3BpPx3auqI7h44I7?= =?us-ascii?Q?3ATaRcSggi+5QKfJXjy2zI6GC6BbiMFYo2ujoQfKhtlc4iHob9q0plUWt9xO?= =?us-ascii?Q?nSJ2YX5ccsDY+XGJzCZcewx/FanyjpJs7mGVP1Bo0fo7GRk8ZGxjHJhlEQMv?= =?us-ascii?Q?jQmKUcFcm+TpsfCFMHoN15Huq5MYEJt4MbiMbpgbREP3Db8vUTX95eB5GXIm?= =?us-ascii?Q?hMLbgV90c+v3WTiEwZEYXSdncHnBH/zyZpfLryod9fZTYPwDw4kK5eppRGPf?= =?us-ascii?Q?iaBdsgOgoLe3i+Z2OL4dMBgf3/OsbjI/OG+qA0M4Z2wmnFblZ48pCTi/N3hk?= =?us-ascii?Q?HVe70cgCr0LDHQsXpo30xe5IkHklcCsdtaztJ6sw1syrdsnBF8/Od4M+zvcR?= =?us-ascii?Q?XQcuLc19VFdwObiwFsCobvCw+JUtECr8kYnugxM8xuL5xnDvWn3QNmKUA7rU?= =?us-ascii?Q?LXxDQtcxCKWS4ZUjzb7EYw1ajdBZd6vVMlAG+TPvWJNHidAG34DKPdQT2Nfe?= =?us-ascii?Q?Mz0P/gzUz3Qc53nkz6v5m1/V3CARqSbnBqqH3x+ZDA3QVCgSg/CF/LURQMJr?= =?us-ascii?Q?r6lw6xXarKxLeb0vIVuyabmeTgt8zg033m4Vd9jEJAea4p1zH3veC/rVlwQK?= =?us-ascii?Q?IzNTVHgLGg1xK1Obi+RcBZ353f5x9jpATbVj5Al8uYYwSQmfAZygQTlTRnmY?= =?us-ascii?Q?5fQYIe8vZBrGF6ylH8iSJ6EPn5YCV4TIj7G9AV7pWspQeu6Ig8WxUarEmRsw?= =?us-ascii?Q?yq5kWcqswws9G+XI9ohh9W3A21JxD3K2jElP47sqTqLQlFP/pxJN6GMifl6x?= =?us-ascii?Q?ylJH4TwkgQyqWUnTfbQi4R3kcKt0iPJX4abGGIKz3UwHnsogjp1zDQK3CPxY?= =?us-ascii?Q?3Fs1suHbarQZdraHFbu65Fc5WVNiNMTmcvePq7NV/xQOFzcjJXO6CFpwdlwY?= =?us-ascii?Q?hK5Hh4/qQKDsQhQVFNY6ux2un95JqxH6m+ytTMWTk9Lvhxorlsnj50eiztPk?= =?us-ascii?Q?/gz+ufButAcIYW6ZTyHR/GpV8sUXH/3mKrgUvX78CslpSJwmCQuczcihHr8G?= =?us-ascii?Q?rBtUumlXkO2hR+tVJ8LUA6Z5hvHNaXSttHMFxB9Q4fYeyF6AE4CJ5lKQ++Z7?= =?us-ascii?Q?diXBfg0BLZxqSH9y/nk2jSA8nh3BvRc7utvWt2fFGTgPn4gvQoJPIMfU0fjs?= =?us-ascii?Q?GHzs2slzWxM7YmprXWh5aIqGp9oWaXPTB4OLCS3kWCQ8huJKjnxc0zU3cUly?= =?us-ascii?Q?DLOXS16MY7S1RhYKV+9mJwEJP9FxllQIABLn4tT/x6hDWyPTl6TDWg/7Hk2u?= =?us-ascii?Q?sJqRmH4=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?NmmD++WVzCMGu4xT07Xps68eklUgxRhm9Vuz0i3CtsAWX0G7RynJRva6Ogms?= =?us-ascii?Q?xqtn93OBiSvq0hghd6Y8VfS68tUK4nHWj7Jrh1JL2n9ukeS2Ihk9/m3HI1MK?= =?us-ascii?Q?xuOaItzwDCLwI4C/679szT77VxcyFSGWLPpWbr+A3rD01ww0sDAVSAb2bmrS?= =?us-ascii?Q?93m2Eu7t4N1MRNDFauC9Z6JZHwIQy+tG/xsC5CwXNzRi2HBMdnAJZZ1CUieS?= =?us-ascii?Q?xgfbiAfGulV7rWh8Vz2CXgOeQNvc9AaWxTAZH+IMzIFyDSdpl1wWMM8auC0X?= =?us-ascii?Q?4IrlaDuom653dMkq9kwBn9yDw68b0hUqxJqS4jeu9AsJ1UgI10sNHBJVc3mC?= =?us-ascii?Q?DnxlNTPyL6NqBJn7UVYq4AvEVVuuhBwKCcLGI67AUde0eqmjrciBIpS6sJ3W?= =?us-ascii?Q?WFF+XCjCYZ0rLtIHNYd3DPWpGhfgG34L97j7Z1n8ZH0h+G9Ix7/BPfD57bPf?= =?us-ascii?Q?qIkLY7jM62LoXTHByDQB2dvAOVVNKo2qmr9T+FpWEsVQty+81edbf7hKjYWi?= =?us-ascii?Q?n9dDiS+p8meur36HCXt93jd0AEOlhvP8Q92Ww2+D170F32KYXp2e2yspw7q1?= =?us-ascii?Q?0w3MIJoE2jmmBJACdIpdF6Oq63fKFv8PBTHahJ3QQMdFitLIQS064foj42y3?= =?us-ascii?Q?r9keRPrm4jp39PJ8lsdrtZ1xhrI5FMgw5J2FSD/kQ1GuNU0QoPbsSE2osO+6?= =?us-ascii?Q?Af03O/Y8ZjX7tTuQGxIow6JbFpak+lEXyGEureOjUd7o0MCHC8k04bcYvgrJ?= =?us-ascii?Q?/SefaJ9oZhidBpQgHo2hRDiiX0NabxOhMfm6qlQK/k7oDEDMINCYuzxZKvue?= =?us-ascii?Q?TULzI+cIMgLg7oLCkIdaRu78kmoUhwYSD4Jb3uOt4gUJiUBqUz9E+NKs6ft8?= =?us-ascii?Q?lddakKU9CvFcNFBvZZnLQc279aCQZ+/DMVbKRjYOdjyXYGSiUt43F5ZVHkOW?= =?us-ascii?Q?yF0+MdwazzeSt6FErk0iE/OEcv7EwSPMS0/aUJZBQzV+xMgq8qUrh5j2S7TS?= =?us-ascii?Q?8cNmylF26eCtE66opBRSDviCuwNnkgHmUIBLkqbsVwqnL0UDhgr0Q/hY8wev?= =?us-ascii?Q?ZltY730Tg02mjFwHAUtfyPy949HF1mpgdbSh+Wy0LRd8OgqucIVXRLuCPnYM?= =?us-ascii?Q?wcYyIcQzBBY9on9YiNe5wjEcSAxVfk2Qypzm25hovZa4iiN/03hbZfjNY/K/?= =?us-ascii?Q?TAsBogksnmDO0wAUSDgxvPrBfBZS52kN2i/rUOdBwoGA7mmzyKQCYnK7X2GE?= =?us-ascii?Q?nsFW1NZx9MsIcYtRMmJFggCVDkT6oiQ7aBCe/P+yriSlmfLDcDy3EjONgqrA?= =?us-ascii?Q?kUhKbutUPlxSw7bm+CXI2JA/uYQ0oX+DdZPou5bZ3P3T8/m7GF0zbgade/jL?= =?us-ascii?Q?7OEgYQjEv6lFgBwrNlj+4Jfkt0h5umocPmANcKBPHGWKVPyqYOoBqOGLFK7M?= =?us-ascii?Q?WpYnEAsH+h5DHe5Afa4td5E2SCO2kf69GJfLQaf2m3VMYZmeRY2gb1nfcwZG?= =?us-ascii?Q?Ccf8000Ouje+Miq0G9R8pB6C7gnnPBckuDgGvV7sB/PVYjfXdH1iMtu5jHH4?= =?us-ascii?Q?1Mw2MDQBOmos157+SODw/Jhl8VcaIdRSCHkWnZ9fs3xPbLdOsfOPndIm1pTJ?= =?us-ascii?Q?AQ=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: e2fb2244-11da-41d9-1734-08dc90403e1e 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:38.2286 (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: jWijJb53Ovtp9ieXfWcJR+Dml58WxAW+JKaDef12/AX/AaXvaokq//gN9lNZLl6F8cCkcxIW5Vrm6J5w/IsbMoswBY9a5cr90I5oOMLdqIU= 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 action 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 | 361 +++++++++++++---------- 1 file changed, 199 insertions(+), 162 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c b/drivers/net/nfp/flower/nfp_flower_flow.c index 9717af9c9c..9477e4a94f 100644 --- a/drivers/net/nfp/flower/nfp_flower_flow.c +++ b/drivers/net/nfp/flower/nfp_flower_flow.c @@ -984,184 +984,221 @@ struct nfp_action_flag { bool ttl_tos_flag; }; +struct nfp_action_calculate_param { + const struct rte_flow_action *action; + struct nfp_fl_key_ls *key_ls; + struct nfp_action_flag *flag; +}; + +typedef int (*nfp_flow_key_calculate_action_fn)(struct nfp_action_calculate_param *param); + +static int +nfp_flow_action_calculate_stub(struct nfp_action_calculate_param *param __rte_unused) +{ + return 0; +} + +static int +nfp_flow_action_calculate_port(struct nfp_action_calculate_param *param) +{ + param->key_ls->act_size += sizeof(struct nfp_fl_act_output); + + return 0; +} + +static int +nfp_flow_action_calculate_mac(struct nfp_action_calculate_param *param) +{ + if (!param->flag->mac_set_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_eth); + param->flag->mac_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_calculate_pop_vlan(struct nfp_action_calculate_param *param) +{ + param->key_ls->act_size += sizeof(struct nfp_fl_act_pop_vlan); + + return 0; +} + +static int +nfp_flow_action_calculate_push_vlan(struct nfp_action_calculate_param *param) +{ + param->key_ls->act_size += sizeof(struct nfp_fl_act_push_vlan); + + return 0; +} + +static int +nfp_flow_action_calculate_ipv4_addr(struct nfp_action_calculate_param *param) +{ + if (!param->flag->ip_set_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_ip4_addrs); + param->flag->ip_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_calculate_ipv6_addr(struct nfp_action_calculate_param *param) +{ + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_ipv6_addr); + + return 0; +} + +static int +nfp_flow_action_calculate_tp(struct nfp_action_calculate_param *param) +{ + if (!param->flag->tp_set_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_tport); + param->flag->tp_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_calculate_ttl(struct nfp_action_calculate_param *param) +{ + if ((param->key_ls->key_layer & NFP_FLOWER_LAYER_IPV4) != 0) { + if (!param->flag->ttl_tos_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_ip4_ttl_tos); + param->flag->ttl_tos_flag = true; + } + } else { + if (!param->flag->tc_hl_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); + param->flag->tc_hl_flag = true; + } + } + + return 0; +} + +static int +nfp_flow_action_calculate_ipv4_dscp(struct nfp_action_calculate_param *param) +{ + if (!param->flag->ttl_tos_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_ip4_ttl_tos); + param->flag->ttl_tos_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_calculate_ipv6_dscp(struct nfp_action_calculate_param *param) +{ + if (!param->flag->tc_hl_flag) { + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); + param->flag->tc_hl_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_calculate_encap(struct nfp_action_calculate_param *param) +{ + param->key_ls->act_size += sizeof(struct nfp_fl_act_pre_tun); + param->key_ls->act_size += sizeof(struct nfp_fl_act_set_tun); + + return 0; +} + +static int +nfp_flow_action_calculate_meter(struct nfp_action_calculate_param *param) +{ + if (param->flag->meter_flag) { + PMD_DRV_LOG(ERR, "Only support one meter action."); + return -ENOTSUP; + } + + param->key_ls->act_size += sizeof(struct nfp_fl_act_meter); + param->flag->meter_flag = true; + + return 0; +} + +static int +nfp_flow_action_calculate_mark(struct nfp_action_calculate_param *param) +{ + param->key_ls->act_size += sizeof(struct nfp_fl_act_mark); + + return 0; +} + +static nfp_flow_key_calculate_action_fn action_fns[] = { + [RTE_FLOW_ACTION_TYPE_VOID] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_DROP] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_COUNT] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_JUMP] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_PORT_ID] = nfp_flow_action_calculate_port, + [RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = nfp_flow_action_calculate_port, + [RTE_FLOW_ACTION_TYPE_SET_MAC_SRC] = nfp_flow_action_calculate_mac, + [RTE_FLOW_ACTION_TYPE_SET_MAC_DST] = nfp_flow_action_calculate_mac, + [RTE_FLOW_ACTION_TYPE_OF_POP_VLAN] = nfp_flow_action_calculate_pop_vlan, + [RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN] = nfp_flow_action_calculate_push_vlan, + [RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC] = nfp_flow_action_calculate_ipv4_addr, + [RTE_FLOW_ACTION_TYPE_SET_IPV4_DST] = nfp_flow_action_calculate_ipv4_addr, + [RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC] = nfp_flow_action_calculate_ipv6_addr, + [RTE_FLOW_ACTION_TYPE_SET_IPV6_DST] = nfp_flow_action_calculate_ipv6_addr, + [RTE_FLOW_ACTION_TYPE_SET_TP_SRC] = nfp_flow_action_calculate_tp, + [RTE_FLOW_ACTION_TYPE_SET_TP_DST] = nfp_flow_action_calculate_tp, + [RTE_FLOW_ACTION_TYPE_SET_TTL] = nfp_flow_action_calculate_ttl, + [RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP] = nfp_flow_action_calculate_ipv4_dscp, + [RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP] = nfp_flow_action_calculate_ipv6_dscp, + [RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP] = nfp_flow_action_calculate_encap, + [RTE_FLOW_ACTION_TYPE_RAW_ENCAP] = nfp_flow_action_calculate_encap, + [RTE_FLOW_ACTION_TYPE_VXLAN_DECAP] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_RAW_DECAP] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_METER] = nfp_flow_action_calculate_meter, + [RTE_FLOW_ACTION_TYPE_CONNTRACK] = nfp_flow_action_calculate_stub, + [RTE_FLOW_ACTION_TYPE_MARK] = nfp_flow_action_calculate_mark, + [RTE_FLOW_ACTION_TYPE_RSS] = nfp_flow_action_calculate_stub, +}; + static int nfp_flow_key_layers_calculate_actions(const struct rte_flow_action actions[], struct nfp_fl_key_ls *key_ls) { - int ret = 0; + int ret; struct nfp_action_flag flag = {}; const struct rte_flow_action *action; + struct nfp_action_calculate_param param = { + .key_ls = key_ls, + .flag = &flag, + }; for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { /* Make sure actions length no longer than NFP_FL_MAX_A_SIZ */ if (key_ls->act_size > NFP_FL_MAX_A_SIZ) { PMD_DRV_LOG(ERR, "The action list is too long."); - ret = -ERANGE; - break; + return -EINVAL; } - switch (action->type) { - case RTE_FLOW_ACTION_TYPE_VOID: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_VOID detected"); - break; - case RTE_FLOW_ACTION_TYPE_DROP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_DROP detected"); - break; - case RTE_FLOW_ACTION_TYPE_COUNT: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_COUNT detected"); - break; - case RTE_FLOW_ACTION_TYPE_JUMP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_JUMP detected"); - break; - case RTE_FLOW_ACTION_TYPE_PORT_ID: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_PORT_ID detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_output); - break; - case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_output); - break; - case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_MAC_SRC detected"); - if (!flag.mac_set_flag) { - key_ls->act_size += sizeof(struct nfp_fl_act_set_eth); - flag.mac_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_MAC_DST: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_MAC_DST detected"); - if (!flag.mac_set_flag) { - key_ls->act_size += sizeof(struct nfp_fl_act_set_eth); - flag.mac_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_POP_VLAN detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_pop_vlan); - break; - case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_push_vlan); - break; - case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID detected"); - break; - case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP detected"); - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC detected"); - if (!flag.ip_set_flag) { - key_ls->act_size += - sizeof(struct nfp_fl_act_set_ip4_addrs); - flag.ip_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV4_DST detected"); - if (!flag.ip_set_flag) { - key_ls->act_size += - sizeof(struct nfp_fl_act_set_ip4_addrs); - flag.ip_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_set_ipv6_addr); - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV6_DST detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_set_ipv6_addr); - break; - case RTE_FLOW_ACTION_TYPE_SET_TP_SRC: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_TP_SRC detected"); - if (!flag.tp_set_flag) { - key_ls->act_size += sizeof(struct nfp_fl_act_set_tport); - flag.tp_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_TP_DST: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_TP_DST detected"); - if (!flag.tp_set_flag) { - key_ls->act_size += sizeof(struct nfp_fl_act_set_tport); - flag.tp_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_TTL: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_TTL detected"); - if ((key_ls->key_layer & NFP_FLOWER_LAYER_IPV4) != 0) { - if (!flag.ttl_tos_flag) { - key_ls->act_size += - sizeof(struct nfp_fl_act_set_ip4_ttl_tos); - flag.ttl_tos_flag = true; - } - } else { - if (!flag.tc_hl_flag) { - key_ls->act_size += - sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); - flag.tc_hl_flag = true; - } - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP detected"); - if (!flag.ttl_tos_flag) { - key_ls->act_size += - sizeof(struct nfp_fl_act_set_ip4_ttl_tos); - flag.ttl_tos_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP detected"); - if (!flag.tc_hl_flag) { - key_ls->act_size += - sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); - flag.tc_hl_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_pre_tun); - key_ls->act_size += sizeof(struct nfp_fl_act_set_tun); - break; - case RTE_FLOW_ACTION_TYPE_RAW_ENCAP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_RAW_ENCAP detected"); - key_ls->act_size += sizeof(struct nfp_fl_act_pre_tun); - key_ls->act_size += sizeof(struct nfp_fl_act_set_tun); - break; - case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_VXLAN_DECAP detected"); - break; - case RTE_FLOW_ACTION_TYPE_RAW_DECAP: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_RAW_DECAP detected"); - break; - case RTE_FLOW_ACTION_TYPE_METER: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_METER detected"); - if (!flag.meter_flag) { - key_ls->act_size += sizeof(struct nfp_fl_act_meter); - flag.meter_flag = true; - } else { - PMD_DRV_LOG(ERR, "Only support one meter action."); - return -ENOTSUP; - } - break; - case RTE_FLOW_ACTION_TYPE_CONNTRACK: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_CONNTRACK detected"); - break; - case RTE_FLOW_ACTION_TYPE_MARK: - key_ls->act_size += sizeof(struct nfp_fl_act_mark); - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_MARK detected"); - break; - case RTE_FLOW_ACTION_TYPE_RSS: - PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_RSS detected"); - break; - default: - PMD_DRV_LOG(ERR, "Action type %d not supported.", action->type); - return -ENOTSUP; + if (action->type >= RTE_DIM(action_fns) || action_fns[action->type] == NULL) { + PMD_DRV_LOG(ERR, "Flow action %d unsupported", action->type); + return -ERANGE; + } + + param.action = action; + ret = action_fns[action->type](¶m); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Flow action %d calculate fail", action->type); + return ret; } } - return ret; + return 0; } static int -- 2.39.1