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 D605445492; Wed, 19 Jun 2024 11:20:51 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1B9B042DCE; Wed, 19 Jun 2024 11:20:29 +0200 (CEST) Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2135.outbound.protection.outlook.com [40.107.237.135]) by mails.dpdk.org (Postfix) with ESMTP id 192FA40289 for ; Wed, 19 Jun 2024 11:20:11 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Rc27T9ylv3yw56dg1QpbVr5U9a83gbtf4fwqVFSQ3OMTTJ5UqxWis4XI66Wj+9paMl88rp0AA3qvsbTvJ8JmNai4WLoZows3dNt5H45z7DmOT8AdLNuRn1EpQrPQ5+h116BucfRUCpN5+GOsv2oDJM7hycsOP7xCaKy6nV4Qi6ShOKzSKFXUtclGCJ2QnPfcJq+pIM4i4gsJJW5EbyFJozhMpW6jh2VLaznQwZvOETe0l8lFSL+RU8plsMxc5JrI6SiX+sw6WutBuPCEe4HXkVaCs2G/1Xko4AGqUKcOZdDTsw5xF24M0HeiY/+cRWczhlBftf/oM99La7FEI2oWQQ== 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=HaIBKPGXfyXov00IMt9dVZnjl6lozpgWwU+9QDkYtIs=; b=izea1fPrLpdsT6vIqrXEVZaip/K5Su4HFGR6WUF0eJddYPj09XIEhqZSUOFMuuBwncon4G0pwsNx8hZpnaVC+4Fzfn4zJk6S3XCnfgHzzVxgeRT6bgXAgBG6CFswJVUoHm1fneu5OMFbwAxSSTe/bl3cQYx7wna8rmzo+ZNeLCk/izammUwjbG++tTV27nWeLDjet0+pgzf2sMocdM02dxlCvVRrJFY19xvVrDqNtfn20IWDk/FchbBDuxXI0CAx2m9C5KIzah+SV/GDNGNskcmZvApPKfg16FkGSgPJ5DKMwAdVD/YbT1JixQGm2Vn4XV/BgUmvXm3ivYR5WcNTxA== 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=HaIBKPGXfyXov00IMt9dVZnjl6lozpgWwU+9QDkYtIs=; b=D0xQaQLEma3k1FCu/y6ACMMVRlBI+3Gs5UyWYgUC0y5/qJvlZmEVBS5cDLEDIN+CyOfXCnqbTI38upGnozA4NbOh6t68Qef7WZkuVs2c29jAKK53sgMNcevt6IjsxoXp//gJitxRpcBNnQZAseol3+FN+kx/UKpZkUObx4rSsWo= 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 BY1PR13MB7041.namprd13.prod.outlook.com (2603:10b6:a03:5a8::12) 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:20:09 +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:20:09 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 6/7] net/nfp: split out the flow action check logic Date: Wed, 19 Jun 2024 17:19:40 +0800 Message-Id: <20240619091941.3479371-7-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20240619091941.3479371-1-chaoyong.he@corigine.com> References: <20240619091941.3479371-1-chaoyong.he@corigine.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BY5PR13CA0003.namprd13.prod.outlook.com (2603:10b6:a03:180::16) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|BY1PR13MB7041:EE_ X-MS-Office365-Filtering-Correlation-Id: 7c4689e8-5902-46ae-f29d-08dc90410411 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230037|1800799021|366013|376011|52116011|38350700011; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?y4Njakv+VHX7KfBsHm2OHEzY80xvHJ8rKYyCxEnHYqdK5d9iIsEOmFxWuYEA?= =?us-ascii?Q?NtBexzYqSHpLLi91rSazEp+lZum5Dg0fEADkzJxHi1LwgOVJRAPQlTGAY2mR?= =?us-ascii?Q?xWPc+5HYYiZkD4xG9WAasifBRs7VsTB29wOnRvNkBPxvAUZ8fWn3OFBjtIPZ?= =?us-ascii?Q?Qetsgjhiwb++wCAYNlxhcJxQGPmraMPDIh/o5ujgeAaYh8L9WgM9uPQrOOmz?= =?us-ascii?Q?JF5KxqQbgO1CVOKXYJzfv3HVu/5ynXE+0uIub0ovyOahti23MGvof4StmGtH?= =?us-ascii?Q?HepJ9McNzcGgPMtdaWh+aYL0HNqkjlsmOlubUr5AozUsi5N0OvN6hFdaoog/?= =?us-ascii?Q?t1iKUAGso3EuPm1jhEN7XHUP+w2pf0mIggQNwUNrx6t5I678EcuaZ261EjR6?= =?us-ascii?Q?2whbYWzMNm+Jju+CehJHcjO3j8yeUCY8OCdSRku0FlmhkSnF3wT+ELqiKjk5?= =?us-ascii?Q?VeGn2X4CfNtsPBZG4mu7MQXneD/E1e089xWy2fAVUIApiZfyi+EfBUwwGnej?= =?us-ascii?Q?1R06wW0YDf72GsfxRynuqkMLojICgwgkUy0MXrTrR78hKn93UdfSy5d5O2A0?= =?us-ascii?Q?+ciZjqUY2Sqpw6zmv6FtO8Ft5aUI0BqLT3D3XvBPkuhpi5jmNkfPy1iIlFqz?= =?us-ascii?Q?J2GuCqoM46c+3NRWpHGT5QRz/fG0BgQbUDpPyRAJy9QCKq21E+2Sns6buiCU?= =?us-ascii?Q?5PVIva3jNZuVCvyYaeaq2TbfXKawdWM9ZK3II5AvnndeBrcdFq4Nbu8e52L2?= =?us-ascii?Q?hxGZCGfjHuSAN99KZfBln8/z0/m+l5/N1CQiosvPi4j0gMdu80NgGkoFEa1U?= =?us-ascii?Q?ezSfR3F9IB8wuqwLtckLry2/9BqCR6aie99Zo2JmoXP3qWATKlRF1ANKa1Fg?= =?us-ascii?Q?kksGJ+/cl2oZ57ZbCQBJQQoruCWq2AEkAuLm7PMQnjRVxD/jnVYYKa7sJ3xO?= =?us-ascii?Q?PpmVxux04X3esLAN/EfMs7h7gamZXxwUMB6JlWxhjaVPFCOaRjyUcpehdj7C?= =?us-ascii?Q?4+5fOF4q6iK+NEJXWUlUZa1+PnA6+tDQveKUtJHx+bi52ssdQcI/sDJ8dcU6?= =?us-ascii?Q?oe0VNmggXvLykmRct8Eyx2fQDzFXiyqqnik1pFHvAVhfW2WK67mkhwgZM1m4?= =?us-ascii?Q?xSEvEHPE04tzULr/IdUE/wQ72JiRvZkJVKdTKZzI7tMNLt2C4wvIqQQCmWNg?= =?us-ascii?Q?izCikqP/0fP1a6A/8neNWoRykKsc6S+QGXw4JczhdCqSXn0BNGo/LLaUAmPB?= =?us-ascii?Q?QibFMNpXzDLhaUSrqFAu/DFAzu0W4FlU7/Cf4fwGnhJR8nEYIbF2l9hcNgh+?= =?us-ascii?Q?qwN+0xTM+GqaIhNoHbOuE2NmC5Tgyb2zXOtPYxh4zSAeGRJCJCcbhRAUWzhf?= =?us-ascii?Q?lh6fdIs=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)(1800799021)(366013)(376011)(52116011)(38350700011); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?suIQJEz4Ob7cGnKlY+6okmEPqld7sWq9b6cJe0Vu0M307zIifQQRufnlwYVo?= =?us-ascii?Q?cZYyCml351zMmZtLt0szp69Ts6eonWpisdNfNK3W9DGoIZa1hf7SJD1Yvqcu?= =?us-ascii?Q?X5NoT1L0OIDLAscNAmUehvLIZJRjl0FIVtziLL83uj0cuF4zzHPpvVF04WRp?= =?us-ascii?Q?RWOS6Q51ka+znTD1719gq8Ydpf5bLZ+Hvc8exJy5zRh5mqbyI3J8RvMhPTw9?= =?us-ascii?Q?CR7awkeU/T04PcWT2YUEF+UKq+WUkqmguz3ulOZ2Qp3odeuHn2bzVHUguxDt?= =?us-ascii?Q?1Fdrq8ixl3bwKYYUo3ShhG78gEYVtHjvkw60pGS+TM+zmHZ5pjYdmfPRbl0/?= =?us-ascii?Q?ufbRRTCLd3I8YrpMv/E1lD90RT9mt8x8H8QV0fRdx3Tdx4hCaKmfZigZQsKk?= =?us-ascii?Q?Fj+0QM8XlE6qkbByTNO6SenmB3tHoRTdGmuhFdTJqNCrQ+Fqbqpf05klGqbu?= =?us-ascii?Q?v6U2rbZuMaxR72q/9v5xPOC32Ny0F3Qw7WPcAkHTeLkWq4HOzYRWxsPjDiVz?= =?us-ascii?Q?faRKrITWPtaWPAUhlMb4Ec9gNLJlIUix3dwnSnhTbrN0z/3n379g56Qv18rv?= =?us-ascii?Q?LtfBHizLJfjN3QnT7f+HhAVDWvyCKt4Ipklw6/6dB6IEnf9TRdOTUReSIMiv?= =?us-ascii?Q?RIc65ejx0ToUQQnnjqSF1LmKpkAHbucJ7ywR+ZBmbAOTm2PJhUkfO4P0ghJh?= =?us-ascii?Q?WwsX5gKqEUD5AD6WDXL2dlk7h42p5+ySoGXAt0vWbCS3/6oHqB58vAQ7E0es?= =?us-ascii?Q?vLEyzVJlf8U8Sxs8XoSVCQDsMgrp/xbOPEOqP7w5uAqtIoT9ebv49XPChDzQ?= =?us-ascii?Q?xVyRmawgO6H1KEQmxLRBBjruUT6oBsiCzEP7B3o8IUoNYmzDSP1Vwl7T+RzT?= =?us-ascii?Q?oqJSGpicDqwKMav9BSJbYDRLiU/uzEOdrKFZ2uP4AnDbjRc9qd7gwUagB2FV?= =?us-ascii?Q?uM8KmRRvBSxbuGO6wqlACbGJFQoeyAPPUrjned3AWl7ev347f1T5/CJgR/AM?= =?us-ascii?Q?HwYGhVW8/pmTTjmJ6WF2w6+t1dXNbtAmtgan/xPN3hT96ExWZV0cX94vg5kj?= =?us-ascii?Q?pa5KTPFVs7gs7XCv90rZZXxJApSRF9dNAw8jl/e4YmuI8Um3XPLLn+HntaOM?= =?us-ascii?Q?Khhlp7rVoDxQAsL85GA06DZlzGS3Vgt/0wNqLHJt//DAlw16LveZRIiHeE41?= =?us-ascii?Q?FU9SbOP5JN8u+f09auXZyOTkripULCD99SMmHL2IYyiUITRQcD7EfZrad4yE?= =?us-ascii?Q?LC3dnT6MTCadNDtkpAKla7FD8b2jDmQxI7kKOCHZ+IG44z2YHAqgj7a9nsfZ?= =?us-ascii?Q?R6HynDtIt1jQPzBvFRi9tlOwoYb/C4KeoovPr6JTVJqHmkMg5wAv/Xu1nPWi?= =?us-ascii?Q?OIxPTkXhNy1ntT9FbkM17uXkN6+9hZscuqTrO0kjNon389LH35OJMElmTnA7?= =?us-ascii?Q?fgfV9aMfjwcpQWetNWnqBz3XDHD9KzWKCbDODxZrLnVCgX77lAyjk3kGp3Xb?= =?us-ascii?Q?/oYybS3LamxdZ7P7iBP3tpdloZACH0Ty9Jaj+depDyD7q51aybLS/G3lczZf?= =?us-ascii?Q?isVHQbrpE7US4ePo+x8+GIO2Kdb9nDqqGpmX0CXTxE1Rfn+tWxdLL/GBuJor?= =?us-ascii?Q?7A=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7c4689e8-5902-46ae-f29d-08dc90410411 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:20:09.8028 (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: WW7Mzchk6dMHgU2VvD62hb2R40aCPxqYasyznqCOjrK1cytFOAckANkmj1H6zh1H+B2w65XeXOM5PaNshuGTRcwMzGQ2wY8sm2z6FFZ5SJU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR13MB7041 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 Split out the flow action check logic. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/net/nfp/flower/nfp_flower_flow.c | 368 +++++++++++++++-------- 1 file changed, 244 insertions(+), 124 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c b/drivers/net/nfp/flower/nfp_flower_flow.c index c8270d81f1..87a3d5b394 100644 --- a/drivers/net/nfp/flower/nfp_flower_flow.c +++ b/drivers/net/nfp/flower/nfp_flower_flow.c @@ -1128,8 +1128,246 @@ struct nfp_action_calculate_param { struct nfp_action_flag *flag; }; +typedef int (*nfp_flow_key_check_action_fn)(struct nfp_action_calculate_param *param); typedef int (*nfp_flow_key_calculate_action_fn)(struct nfp_action_calculate_param *param); +static int +nfp_flow_action_check_port(struct nfp_action_calculate_param *param) +{ + uint32_t port_id; + const struct rte_flow_action *action; + const struct rte_flow_action_ethdev *action_ethdev; + const struct rte_flow_action_port_id *action_port_id; + + action = param->action; + if (action->conf == NULL) + return -EINVAL; + + if (action->type == RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT) { + action_ethdev = action->conf; + port_id = action_ethdev->port_id; + } else { + action_port_id = action->conf; + port_id = action_port_id->id; + } + + if (port_id >= RTE_MAX_ETHPORTS) + return -ERANGE; + + return 0; +} + +static int +nfp_flow_action_check_meter(struct nfp_action_calculate_param *param) +{ + if (param->flag->meter_flag) { + PMD_DRV_LOG(ERR, "Only support one meter action."); + return -ENOTSUP; + } + + param->flag->meter_flag = true; + + return 0; +} + +static bool +nfp_flow_field_id_dst_support(enum rte_flow_field_id field) +{ + switch (field) { + case RTE_FLOW_FIELD_IPV4_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV4_DST: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_DST: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_TCP_PORT_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_TCP_PORT_DST: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_UDP_PORT_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_UDP_PORT_DST: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV4_TTL: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_HOPLIMIT: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_MAC_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_MAC_DST: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV4_DSCP: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_DSCP: + return true; + default: + break; + } + + return false; +} + +static bool +nfp_flow_field_id_src_support(enum rte_flow_field_id field) +{ + return field == RTE_FLOW_FIELD_POINTER || + field == RTE_FLOW_FIELD_VALUE; +} + +static uint32_t +nfp_flow_field_width(enum rte_flow_field_id field, + uint32_t inherit) +{ + switch (field) { + case RTE_FLOW_FIELD_IPV4_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV4_DST: + return 32; + case RTE_FLOW_FIELD_IPV6_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_DST: + return 128; + case RTE_FLOW_FIELD_TCP_PORT_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_TCP_PORT_DST: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_UDP_PORT_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_UDP_PORT_DST: + return 16; + case RTE_FLOW_FIELD_IPV4_TTL: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_HOPLIMIT: + return 8; + case RTE_FLOW_FIELD_MAC_SRC: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_MAC_DST: + return 48; + case RTE_FLOW_FIELD_IPV4_DSCP: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_IPV6_DSCP: + return 6; + case RTE_FLOW_FIELD_POINTER: + /* FALLTHROUGH */ + case RTE_FLOW_FIELD_VALUE: + return inherit; + default: + break; + } + + return 0; +} + +static bool +nfp_flow_is_validate_field_data(const struct rte_flow_field_data *data, + uint32_t conf_width, + uint32_t data_width) +{ + if (data->level != 0) { + PMD_DRV_LOG(ERR, "The 'level' is not support"); + return false; + } + + if (data->tag_index != 0) { + PMD_DRV_LOG(ERR, "The 'tag_index' is not support"); + return false; + } + + if (data->class_id != 0) { + PMD_DRV_LOG(ERR, "The 'class_id' is not support"); + return false; + } + + if (data->offset + conf_width > data_width) { + PMD_DRV_LOG(ERR, "The 'offset' value is too big"); + return false; + } + + return true; +} + +static int +nfp_flow_action_check_modify(struct nfp_action_calculate_param *param) +{ + uint32_t width; + uint32_t dst_width; + uint32_t src_width; + const struct rte_flow_field_data *dst_data; + const struct rte_flow_field_data *src_data; + const struct rte_flow_action_modify_field *conf; + + conf = param->action->conf; + if (conf == NULL) + return -EINVAL; + + dst_data = &conf->dst; + src_data = &conf->src; + if (!nfp_flow_field_id_dst_support(dst_data->field) || + !nfp_flow_field_id_src_support(src_data->field)) { + PMD_DRV_LOG(ERR, "Not supported field id"); + return -EINVAL; + } + + width = conf->width; + if (width == 0) { + PMD_DRV_LOG(ERR, "No bits are required to modify"); + return -EINVAL; + } + + dst_width = nfp_flow_field_width(dst_data->field, 0); + src_width = nfp_flow_field_width(src_data->field, dst_width); + if (width > dst_width || width > src_width) { + PMD_DRV_LOG(ERR, "Cannot modify more bits than the width of a field"); + return -EINVAL; + } + + if (!nfp_flow_is_validate_field_data(dst_data, width, dst_width)) { + PMD_DRV_LOG(ERR, "The dest field data has problem"); + return -EINVAL; + } + + return 0; +} + +static nfp_flow_key_check_action_fn check_action_fns[] = { + [RTE_FLOW_ACTION_TYPE_PORT_ID] = nfp_flow_action_check_port, + [RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = nfp_flow_action_check_port, + [RTE_FLOW_ACTION_TYPE_METER] = nfp_flow_action_check_meter, + [RTE_FLOW_ACTION_TYPE_MODIFY_FIELD] = nfp_flow_action_check_modify, +}; + +static int +nfp_flow_key_layers_check_actions(const struct rte_flow_action actions[]) +{ + int ret; + struct nfp_action_flag flag = {}; + const struct rte_flow_action *action; + struct nfp_action_calculate_param param = { + .flag = &flag, + }; + + for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { + if (action->type >= RTE_DIM(check_action_fns)) { + PMD_DRV_LOG(ERR, "Flow action %d unsupported", action->type); + return -ERANGE; + } + + if (check_action_fns[action->type] == NULL) + continue; + + param.action = action; + ret = check_action_fns[action->type](¶m); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Flow action %d calculate fail", action->type); + return ret; + } + } + + return 0; +} + static int nfp_flow_action_calculate_stub(struct nfp_action_calculate_param *param __rte_unused) { @@ -1272,124 +1510,6 @@ nfp_flow_action_calculate_mark(struct nfp_action_calculate_param *param) return 0; } -static bool -nfp_flow_field_id_dst_support(enum rte_flow_field_id field) -{ - switch (field) { - case RTE_FLOW_FIELD_IPV4_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV4_DST: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_DST: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_TCP_PORT_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_TCP_PORT_DST: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_UDP_PORT_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_UDP_PORT_DST: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV4_TTL: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_HOPLIMIT: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_MAC_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_MAC_DST: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV4_DSCP: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_DSCP: - return true; - default: - break; - } - - return false; -} - -static bool -nfp_flow_field_id_src_support(enum rte_flow_field_id field) -{ - return field == RTE_FLOW_FIELD_POINTER || - field == RTE_FLOW_FIELD_VALUE; -} - -static uint32_t -nfp_flow_field_width(enum rte_flow_field_id field, - uint32_t inherit) -{ - switch (field) { - case RTE_FLOW_FIELD_IPV4_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV4_DST: - return 32; - case RTE_FLOW_FIELD_IPV6_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_DST: - return 128; - case RTE_FLOW_FIELD_TCP_PORT_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_TCP_PORT_DST: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_UDP_PORT_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_UDP_PORT_DST: - return 16; - case RTE_FLOW_FIELD_IPV4_TTL: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_HOPLIMIT: - return 8; - case RTE_FLOW_FIELD_MAC_SRC: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_MAC_DST: - return 48; - case RTE_FLOW_FIELD_IPV4_DSCP: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_IPV6_DSCP: - return 6; - case RTE_FLOW_FIELD_POINTER: - /* FALLTHROUGH */ - case RTE_FLOW_FIELD_VALUE: - return inherit; - default: - break; - } - - return 0; -} - -static bool -nfp_flow_is_validate_field_data(const struct rte_flow_field_data *data, - uint32_t conf_width, - uint32_t data_width) -{ - if (data->level != 0) { - PMD_DRV_LOG(ERR, "The 'level' is not support"); - return false; - } - - if (data->tag_index != 0) { - PMD_DRV_LOG(ERR, "The 'tag_index' is not support"); - return false; - } - - if (data->class_id != 0) { - PMD_DRV_LOG(ERR, "The 'class_id' is not support"); - return false; - } - - if (data->offset + conf_width > data_width) { - PMD_DRV_LOG(ERR, "The 'offset' value is too big"); - return false; - } - - return true; -} - static int nfp_flow_action_calculate_modify_dispatch(struct nfp_action_calculate_param *param, enum rte_flow_field_id field) @@ -1569,6 +1689,12 @@ nfp_flow_key_layers_calculate(const struct rte_flow_item items[], return ret; } + ret = nfp_flow_key_layers_check_actions(actions); + if (ret != 0) { + PMD_DRV_LOG(ERR, "flow actions check failed"); + return ret; + } + ret = nfp_flow_key_layers_calculate_actions(actions, key_ls); if (ret != 0) { PMD_DRV_LOG(ERR, "flow actions check failed"); @@ -2588,9 +2714,6 @@ nfp_flow_action_output(char *act_data, const struct rte_flow_action_ethdev *action_ethdev; const struct rte_flow_action_port_id *action_port_id; - if (action->conf == NULL) - return -EINVAL; - if (action->type == RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT) { action_ethdev = action->conf; port_id = action_ethdev->port_id; @@ -2599,9 +2722,6 @@ nfp_flow_action_output(char *act_data, port_id = action_port_id->id; } - if (port_id >= RTE_MAX_ETHPORTS) - return -ERANGE; - ethdev = &rte_eth_devices[port_id]; representor = ethdev->data->dev_private; -- 2.39.1