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 A372A4548E; Wed, 19 Jun 2024 11:16:10 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1DC6F42D72; Wed, 19 Jun 2024 11:15:41 +0200 (CEST) Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2122.outbound.protection.outlook.com [40.107.244.122]) by mails.dpdk.org (Postfix) with ESMTP id 0B14B410E4 for ; Wed, 19 Jun 2024 11:14:55 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cWL/DMADdo1egIXLac4IJUWVQZU4QRRoc4eVttCRpx/ipRTb1gD229OJXgsv197BAYP5M3KnYPlU74MaEy6JzPGhF7w4yVxpb7Rwe16R2QTD2BjXumOS4Tom1NXCvtxqgCNMnO9c0E+10kDtK5/aonWCMWLNSkGa8L0Nt/j3YB0mH78tbExgDZW49IpIqMgYF76H+pWehKDc0Dtzkg5o45rUf35VJLtQs/9jFycK4ytG4L1O0/p9pid9UzNRsI/va5crAGkkGpQWShQxFs9cgoDJRaAadpjD+pVneYUq27ggjDz5QZ51mRM1fvhfPYhUxpmeKHXXEUScWe807jW2QA== 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=rEdidNzxzfsDwS9A3KvixXABikzlZRPw9+m1hNSi7u8=; b=iSeOcJRkkQXSDUktbj+e0r/Vh02M+7kZ2JEu1lfCOOWnBiNUXEIKuj3mCYA/bSciaH5eIUbGhnssQEiZFmfJ6+UD50a5fZh4MOPrUjLzmdZz5pAL6gzC5sTF3LvBj1+zAOSjMiA9qko30XBt4F+pQAVxIulIMZMfaJzsyHj9O0Tc/FSFaoi+54T1iwOqFKyD+0KDwuSfBuPyDiwhG9gh/yYda7KirBLF5Fmd+S8V2Ik6KZo3eMB43Iozid55RmeC4x/LbIft6lW4bESMZSiaiumUHGuQWZW9QwwDjUwXaFwn3WDyU207VAL+LShGVF/OAoPvtLufm6GocPyh6bUUMQ== 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=rEdidNzxzfsDwS9A3KvixXABikzlZRPw9+m1hNSi7u8=; b=vFtbIKAS5JexLXsGXEBOJcAfCHk7e+BgSVoe1aDmJ/LQCFLdMxr3px7UjS6Ifrlynpzdp4qo1ezWtFEdixjcc3n8TDLbenMeyxivkCgL2ukbFSW8Jza5oNSGlbAQ4xs9yLjQ1123Ech8yN/hCTO8bFhlItjM6sZOT6C1lMqDNOc= 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:53 +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:53 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 08/21] net/nfp: support modify IPv4 source address Date: Wed, 19 Jun 2024 17:13:45 +0800 Message-Id: <20240619091358.3479247-9-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: b38b204e-ee10-4da2-7b07-08dc9040472f 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?U6OvP8eV4te3WNf0Efz15HvMB4nVmuVsfZh4hnkIuazOC4lJ0CVXrAqlB/SE?= =?us-ascii?Q?Lg5FUK9JWsVnWzebJiXIDFpAlgu7YWdLfx7QoBxZ6FRCS6CKwmfei5LkXWYk?= =?us-ascii?Q?mIPwxVmJxtexSTVZIAC8sUVgl/zpC/fxWZ3D07eBRsIfOXh2sbS1POzQpAym?= =?us-ascii?Q?Kx6plTPSnhgumGMS+3sOPjWBFOc9rLreJ78Cga/wWzgfuIOPvCKM1OXMDgAN?= =?us-ascii?Q?+Eo/MJ/6itJbc1LLFB7pYmpVX06FK2y6dIar5dcDKaCLYBncerk1p5UYwAb2?= =?us-ascii?Q?aR6MkDET8ZdgyqlxPc0y3hIHYcFxgtm0H+F2xIV8ykZ9hBIhwwppXczTQvBl?= =?us-ascii?Q?38rPjK3XcG1eC4+r/6UgLAgDl+EQne/XbbcJp5k1H18WYyEnu8X1t/m5sq9u?= =?us-ascii?Q?hOphCcOH7dIzNWofPlS1sPdDRf0KMVXMzZX5YqmkuC7jIVXuUnyFPAoXjebp?= =?us-ascii?Q?/OWuE6T8LwCUmJZHSM2cBBBsY4eZ0uxNqwhRv2mWrqDTNvAQJtoXoPCGJeH9?= =?us-ascii?Q?wXMFi2YhKg+ghgb09VYeGJpUvPpbTeRgX2793vla3ncO+cahx4IW85su5EQl?= =?us-ascii?Q?NfKaKosVwj8EXyOol6/ocX9K6b7uIcD91KyXOe6KCb+Z+FHnBRz0ETkluEn7?= =?us-ascii?Q?kPCk1A6Q5bVv25Qa58WNvE7RQDOh23t/bbtA0tnqErwa5u0ln0zFWJc1hleZ?= =?us-ascii?Q?wIiE521vxqtYV+RrkGVClW6LvN9cddF6MT9iYK/b0CalQc4ir262s2YOhxkE?= =?us-ascii?Q?qSta++8NyYgOLWwXBxmYs9FKNKeyCy353PAPJMZ2OvXD+72/yT2v0A8WBWSY?= =?us-ascii?Q?5ndu9M9WpAMQAp+/enFF4fV59DCJpzp/UJdxFuDZAS3rWiC/482xSKg4Ia8T?= =?us-ascii?Q?DMhle4upmOR6qeayl6tQvWtdPJO6eTp6RNZ0h7HwSY1u+wI2D1cQVx4dTKj+?= =?us-ascii?Q?Oba4NLuihfxSz5KyF6KM4/wX35GZblInObpwH1+XtgdYgO8NYDv6ivkOwtUI?= =?us-ascii?Q?8UzbJS7Y3kJu5e8y7EWKGtlOUyaMr0ejwgedQ3KkHUmpE4PVCkPSidTkFpqD?= =?us-ascii?Q?6KxtBpQQRwMD/sIKKkG/cvHixgbhy1nQxkGKEimyG9sD+vjInI7D/pcXJ5l7?= =?us-ascii?Q?PeOHotoPFFkt+0iOsca15kQyVJenyNjOVG7L51ZbdLLFaYxfrvTt1Ktciaol?= =?us-ascii?Q?jHHaKTGTsko9L7LrlaKEXOtG6u4mZG7JTAE9bBV4/P8SypYDMgNsjuvCGKcl?= =?us-ascii?Q?EDg1noaYa4WnB/EF5R0HkcdviMTlTn3tz/WRepc2LdYcvRY1vULN91tdx1iH?= =?us-ascii?Q?UE3mpkDPZuKuFHguTh2XkY2e6jwoiSinHCHrnUXgX/VnTfkCC2ybi4Avwqy/?= =?us-ascii?Q?JYrLayM=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?uaOdDl0KF+kTzxqyDPta+op7e35iojzvjSBchwot8cpMYlE/oKAJLmoMevBe?= =?us-ascii?Q?bqCq+oXR1HLjIeLxbF8+MgB+iF8cKQjBR7HK296TSPd60c4h4n/a9DkEWs4X?= =?us-ascii?Q?yCN0LS5Xhtll6WfSJGS3hPDuv5nPL7FN7PYBuYNbF1TvpfsVhzaWWDbTkg6H?= =?us-ascii?Q?kLcYOAtOcA2Tn2/dd/kVXF/YxdG940jzphF8IuI8tk4HyeTeIAQt5LMvOkeI?= =?us-ascii?Q?f95b0oLNHi5HevSMNyDBKJlklMx0LPiJ0KjJXkA1cREMHjt80YntNCKgRd4s?= =?us-ascii?Q?8bjtalGLI53vx59DbN+mQM3aX25PiFBLNi1WuDavDdbkOwaguUOTe6Bx3bkj?= =?us-ascii?Q?UY8kO78vegg6XTcdtFDyMadzotvHjXrzwe5sNolZrxn8UYViWwI4WuQEZ9OB?= =?us-ascii?Q?4tqd1B6Ul05VAY77GL1DCs65LXSN2y1Cr2JstkYWLG1Xmj+yB/TsboZ/wx9O?= =?us-ascii?Q?u/IJWELmjn5o5Ohw9eQmA81TKCAs/u6FOvO+vkR6Po4LC0hHlUSV7MDSyHYB?= =?us-ascii?Q?4E3yPnTwbZWo/+uhDqjqnz4ljQKVgLljLfU3a2hESUBbehkYQPP0xoSEQ2iM?= =?us-ascii?Q?Jw16OpzZlpytG87nO4dE4Mwpn8McEy+a1gGFcjr2xQehH2rvOHdxIg4AFOtK?= =?us-ascii?Q?p8JKkaMdzhdfHqiBX5HP7Hhv3kL5NUzc1vguxlbulvjwS2uT7MKeiuqPSy4a?= =?us-ascii?Q?vVkQ7QlfxJjW9+XUwyAUWn64abOoZPi2a9e8EpNjuXKC+i6SUgzuMjrbFF1v?= =?us-ascii?Q?fk3myxF2IbYaj7k8bpSzB02GdQP6wFukbNw0sJukyHfJ0P3cQKM8iUPftqvN?= =?us-ascii?Q?J8BqCoyD2pdIBHcqVDYzVx8711F541hTL2+X3ZQREBCBDPMXnuCijIbkQJ6o?= =?us-ascii?Q?3xmdrlAsZoZrF/j+PJRkFbpe4sIGkWTcWyLs8G1ENu14AxElZezgBQDE65V9?= =?us-ascii?Q?vikvjfuNxhzo24DWrd5oBEYRusH9vSJg/X4RYsXiygXnyKN+memCMImqrdsX?= =?us-ascii?Q?z8YJqK0QoszaaGU456xwstZtC4sY8bYn14tYT0XtzuYXVauwXbC3O8TlJ4f0?= =?us-ascii?Q?G0xOKizhj0IfQeU4KiJt6Ko0GzZwiFVANt2l8ATrwBcBfDJ1WQHnw7all0CM?= =?us-ascii?Q?ylqRemwzDF4ABtzwbUZNzUqEAjaOiKdZd+S5COuFH+S+kcVvX3gRYTp+Pzmx?= =?us-ascii?Q?dXcgN4ve8m2mZeDTBEzg25N8QJ10l6QtR0rw1t9JH4O0J0xoNQjIhpqdUvGp?= =?us-ascii?Q?9f7UsWDBJRKoejxQDt9FGymYL+O7RVjPKRfnIBp3Jk4xXJaPOKJ2ca/vuwwe?= =?us-ascii?Q?d5hlR14jlDjz1qZXiupx78JD5aJOWqHN1QRxIPCVLIe9RKZimZ5m1HUKdQl+?= =?us-ascii?Q?6ir/mCEQOcsQYrg+ipdF1sfi13+fGjwGdNHIm4y85Zg/JGNvzMW9oHfwxf55?= =?us-ascii?Q?hSq1gmqvFdBkDWSvOwC6uuDTMk6JOWfTM4IQMlni2NVWZF4LOEoa5hWhgH3w?= =?us-ascii?Q?O9Dj9nkIkvFyj3YJLQCH/uQrTmOojLdnSMe5gMZqDeljsewDPdCqfuRTDj6Q?= =?us-ascii?Q?p4JjWCYB9sVuBtXk73c9GcS7mQSMs/J55IkyQgVzjhcOJkgmS6VcHUcb4GN2?= =?us-ascii?Q?2A=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: b38b204e-ee10-4da2-7b07-08dc9040472f 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:53.6631 (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: 9tTUb9/sb06r2iqPMa8pvQ+46+J9LC05tKBRFMddyizpSwI+wO57J9itorQQcOjGEr6MnuMLyMlbgrp3wMFr2s04KWEw9L2FBDFLeu8TnJU= 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 Add the framework of modify field flow action and the logic of modify IPv4 source address action. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- doc/guides/nics/features/nfp.ini | 1 + drivers/net/nfp/flower/nfp_flower_flow.c | 172 +++++++++++++++++++++++ 2 files changed, 173 insertions(+) diff --git a/doc/guides/nics/features/nfp.ini b/doc/guides/nics/features/nfp.ini index b20049b4f5..5b507cfe94 100644 --- a/doc/guides/nics/features/nfp.ini +++ b/doc/guides/nics/features/nfp.ini @@ -51,6 +51,7 @@ drop = Y jump = Y mark = Y meter = Y +modify_field = Y of_pop_vlan = Y of_push_vlan = Y of_set_vlan_pcp = Y diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c b/drivers/net/nfp/flower/nfp_flower_flow.c index 95f9e8c2d6..8997d67627 100644 --- a/drivers/net/nfp/flower/nfp_flower_flow.c +++ b/drivers/net/nfp/flower/nfp_flower_flow.c @@ -1205,6 +1205,129 @@ 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: + 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: + return 32; + 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) +{ + switch (field) { + case RTE_FLOW_FIELD_IPV4_SRC: + return nfp_flow_action_calculate_ipv4_addr(param); + default: + break; /* NOTREACHED */ + } + + return -ENOTSUP; +} + +static int +nfp_flow_action_calculate_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 nfp_flow_action_calculate_modify_dispatch(param, dst_data->field); +} + 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, @@ -1235,6 +1358,7 @@ static nfp_flow_key_calculate_action_fn action_fns[] = { [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, + [RTE_FLOW_ACTION_TYPE_MODIFY_FIELD] = nfp_flow_action_calculate_modify, }; static int @@ -4104,6 +4228,53 @@ nfp_flow_action_compile_rss(struct nfp_action_compile_param *param) return 0; } +static int +nfp_flow_action_compile_modify_dispatch(struct nfp_action_compile_param *param, + enum rte_flow_field_id field) +{ + switch (field) { + case RTE_FLOW_FIELD_IPV4_SRC: + return nfp_flow_action_compile_ipv4_src(param); + default: + break; /* NOTREACHED */ + } + + return -ENOTSUP; +} + +static int +nfp_flow_action_compile_modify(struct nfp_action_compile_param *param) +{ + int ret; + struct rte_flow_action action = {}; + const struct rte_flow_action *action_old; + const struct rte_flow_action_modify_field *conf; + + conf = param->action->conf; + + if (conf->src.field == RTE_FLOW_FIELD_POINTER) { + action.conf = conf->src.pvalue; + } else if (conf->src.field == RTE_FLOW_FIELD_VALUE) { + action.conf = (void *)(uintptr_t)&conf->src.value; + } else { + PMD_DRV_LOG(ERR, "The SRC field of flow modify is not right"); + return -EINVAL; + } + + /* Store the old action pointer */ + action_old = param->action; + + param->action = &action; + ret = nfp_flow_action_compile_modify_dispatch(param, conf->dst.field); + if (ret != 0) + PMD_DRV_LOG(ERR, "Something wrong when modify dispatch"); + + /* Reload the old action pointer */ + param->action = action_old; + + return ret; +} + static nfp_flow_action_compile_fn action_compile_fns[] = { [RTE_FLOW_ACTION_TYPE_VOID] = nfp_flow_action_compile_stub, [RTE_FLOW_ACTION_TYPE_DROP] = nfp_flow_action_compile_drop, @@ -4134,6 +4305,7 @@ static nfp_flow_action_compile_fn action_compile_fns[] = { [RTE_FLOW_ACTION_TYPE_CONNTRACK] = nfp_flow_action_compile_stub, [RTE_FLOW_ACTION_TYPE_MARK] = nfp_flow_action_compile_mark, [RTE_FLOW_ACTION_TYPE_RSS] = nfp_flow_action_compile_rss, + [RTE_FLOW_ACTION_TYPE_MODIFY_FIELD] = nfp_flow_action_compile_modify, }; static int -- 2.39.1