From patchwork Thu Feb 1 12:29:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suanming Mou X-Patchwork-Id: 136257 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 30D3043A39; Thu, 1 Feb 2024 13:30:12 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1FE9B42E03; Thu, 1 Feb 2024 13:30:12 +0100 (CET) Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on2066.outbound.protection.outlook.com [40.107.96.66]) by mails.dpdk.org (Postfix) with ESMTP id 64EB64021D for ; Thu, 1 Feb 2024 13:30:10 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YcBO5nkq7HQbQ+0mvZJtF20yBo07ZeGwdzmFN3eCA1J0ao/CxXOWw0tAUyMIowpbIQ1AvTo5lU+rxXRnlIjKZ6fM+E8muVtziAgssznxVScW6nHs0rzukbH76mmlXS6ShyhVxgKPlc87pn32QPsO3iXSFbjnn6zBdRkw9Tm9NwtAr3Lz1pxDRuYgB3CNPRnOqXADiBdwiFepS2MxQsMIxFRG/okRrulKKzIob22AaRq3OjSPn72YnkGtTSrVMD17DdLUw9Edm0s63NSMnvh7McYVzXGo4UQU8FrbQYtPC5GSlaXPXQvu5GaeIR2JzMJzdczZ3/R2/DEHkEMaGpBFDQ== 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=OBXshfYT7pz8TB3gOJYd638ZlF2F99xWD+RinIjjIus=; b=Q2QjYwqxY/QA8jlwVzrF6pJ67emokxxRiejdhgbYoVghp3lmIgJaSmVotIyNV5wctkJFn0ltcrVUHtUUU2Pyj+H1/TBgbs4xdatFpSOFLTHh6CDHH8gMIq3qwlBNjt42izEfQEUPnTXe5IlNG2UcXiUZHJMyaCtyBEgRNcXQxxUGtxKFL5Ht+AsoYYNPTwT7XwjLYqi9ChPKtMevNf+mcEln5YMPjCQYGPCrmastSORpRYkAFITgAJ4BamSXi5klFlEKheXfQVfaa22tdlWoiwAgmgnD20QWp/5yhvGhsN087q7StyJlhcdhn/VnXWh8705OzfzDaBZTAt72Tjc/IQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=amd.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OBXshfYT7pz8TB3gOJYd638ZlF2F99xWD+RinIjjIus=; b=sHn3kJvV1vrat0cEhLujTooInrSkcRyHxma8XMCX+jXMhhd5dWzD39ZxoVKilzjCRqZmVRm5kih5UVZS0lPt8UIAOPgw5pALekc2zTD+YAXk06VVlw7NTTao9g758CualM50OC4S+JlqCFRLRQDqM4RKZMLttM1dneSFtn1CsBJYqnQQlYenOuApPibE94QGNWuIVXD7vhDqdLi1seYpQKvNuJzKHRKN4Ps7mzXTKpKIbLVVU3jbl4BVo5Bo9APTTnozAlu170m4KczPI5aiOZOToCe8wdW1mzZvXmE7VtvVhlaixmdeSWdYCZYxiI9XPWzmLYF5wIXdOC6OhbiAFA== Received: from CH2PR07CA0065.namprd07.prod.outlook.com (2603:10b6:610:5b::39) by PH7PR12MB5686.namprd12.prod.outlook.com (2603:10b6:510:13d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7228.34; Thu, 1 Feb 2024 12:30:07 +0000 Received: from CH2PEPF0000009A.namprd02.prod.outlook.com (2603:10b6:610:5b:cafe::63) by CH2PR07CA0065.outlook.office365.com (2603:10b6:610:5b::39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.23 via Frontend Transport; Thu, 1 Feb 2024 12:30:06 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CH2PEPF0000009A.mail.protection.outlook.com (10.167.244.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.19 via Frontend Transport; Thu, 1 Feb 2024 12:30:06 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 1 Feb 2024 04:29:55 -0800 Received: from nvidia.com (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 1 Feb 2024 04:29:48 -0800 From: Suanming Mou To: , Ori Kam , Aman Singh , Yuying Zhang , "Dariusz Sosnowski" , Viacheslav Ovsiienko , Matan Azrad , Thomas Monjalon , Andrew Rybchenko CC: Subject: [PATCH v5 1/3] ethdev: rename action modify field data structure Date: Thu, 1 Feb 2024 20:29:20 +0800 Message-ID: <20240201122922.474250-2-suanmingm@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240201122922.474250-1-suanmingm@nvidia.com> References: <20231214031227.363911-1-suanmingm@nvidia.com> <20240201122922.474250-1-suanmingm@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.231.35] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF0000009A:EE_|PH7PR12MB5686:EE_ X-MS-Office365-Filtering-Correlation-Id: 94888964-ce91-4157-033c-08dc232185e4 X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: F74QGSKTTc3EFJw58YB3xXgs0PX2smgoZ7bMJuWJ8Z23qM28uJqTalV5S+Y6YghRZj3H5UZSPrQpu+vPu++hhbMeN+EhYFNhU4bkoeAH0oDrlgceztAf516sktxCHza9c13m7d2oSPE792XA1NbGtjHw6JwhDHbWnbuGtEyiijkhz/tykw1oAHRlQXsdq6neaNQ9xSYuwfpIikWp8zMrtnUhhwJdXVPhAMxvuTJ2WiJ7hiTZZmy588CjSQQongaeBvRlYdr6ilPAVIuSz0ZYj0JdUnqmigsrOiybvH406/W05hajAXVnHmLhXf7ceauHvzVSKgrCYFd1f0zt9vPP26OJmZplu/GF6NZtEwXOu0hV2xNI65JlI+tTqqegx9M3CM7+IrKrJCFEOIE3ts/ySDPh31apiNFDNmHdZxKddr8JlwAb6limrG1LnXIiBzRAq74KrDIJD/2o0piluBHVLe8MCDjYp6TsJGb3iuTp8XG+nnRfhoRZSpX+pyNhi3/+NDwCMvguEej2FKhrH4ele+un5wBktPY6IXnVv9GuGXVWB1LbcMmVLF4+FDKnNHw/pdvZtdF8D9RyIdfSP85Jrh5NJY0gTiRdPnLAWe+r9rS4mRm6oN8Df+Y/IMV4UNdUshEjGUGjhjx2M3RgjCaU+GL6SowuIKlFXR8LKtAW5j1Hf/Y9mDkwj1DFAE3+vjbZthmLiaU/+94TJLqNoveF7pUUwxzd3AdZZ28bQeWiDq0Nk23P8z3tjU8eqM2ZU+7jm0eL+NEb6SILplySbRxh71cQF+XqclvDb4dAFsbnZWg= X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230031)(4636009)(346002)(376002)(39860400002)(136003)(396003)(230922051799003)(230173577357003)(230273577357003)(451199024)(1800799012)(186009)(82310400011)(64100799003)(40470700004)(46966006)(36840700001)(426003)(26005)(16526019)(6286002)(336012)(2616005)(1076003)(83380400001)(478600001)(7696005)(41300700001)(6666004)(36756003)(8676002)(8936002)(4326008)(356005)(316002)(55016003)(36860700001)(40480700001)(40460700003)(2906002)(7636003)(5660300002)(70206006)(82740400003)(70586007)(47076005)(110136005)(86362001); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2024 12:30:06.5410 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 94888964-ce91-4157-033c-08dc232185e4 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CH2PEPF0000009A.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5686 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 Current rte_flow_action_modify_data struct describes the pkt field perfectly and is used only in action. It is planned to be used for item as well. This commit renames it to "rte_flow_field_data" making it compatible to be used by item. Signed-off-by: Suanming Mou Acked-by: Ori Kam Acked-by: Andrew Rybchenko --- app/test-pmd/cmdline_flow.c | 22 +++++++++++----------- doc/guides/prog_guide/rte_flow.rst | 2 +- doc/guides/rel_notes/release_24_03.rst | 1 + drivers/net/mlx5/mlx5_flow.c | 4 ++-- drivers/net/mlx5/mlx5_flow.h | 6 +++--- drivers/net/mlx5/mlx5_flow_dv.c | 10 +++++----- lib/ethdev/rte_flow.h | 12 ++++++++---- 7 files changed, 31 insertions(+), 26 deletions(-) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 359c187b3c..972c6ae490 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -742,13 +742,13 @@ enum index { #define ITEM_RAW_SIZE \ (sizeof(struct rte_flow_item_raw) + ITEM_RAW_PATTERN_SIZE) -/** Maximum size for external pattern in struct rte_flow_action_modify_data. */ -#define ACTION_MODIFY_PATTERN_SIZE 32 +/** Maximum size for external pattern in struct rte_flow_field_data. */ +#define FLOW_FIELD_PATTERN_SIZE 32 /** Storage size for struct rte_flow_action_modify_field including pattern. */ #define ACTION_MODIFY_SIZE \ (sizeof(struct rte_flow_action_modify_field) + \ - ACTION_MODIFY_PATTERN_SIZE) + FLOW_FIELD_PATTERN_SIZE) /** Maximum number of queue indices in struct rte_flow_action_rss. */ #define ACTION_RSS_QUEUE_NUM 128 @@ -942,7 +942,7 @@ static const char *const modify_field_ops[] = { "set", "add", "sub", NULL }; -static const char *const modify_field_ids[] = { +static const char *const flow_field_ids[] = { "start", "mac_dst", "mac_src", "vlan_type", "vlan_id", "mac_type", "ipv4_dscp", "ipv4_ttl", "ipv4_src", "ipv4_dst", @@ -6986,7 +6986,7 @@ static const struct token token_list[] = { ARGS_ENTRY_ARB(0, 0), ARGS_ENTRY_ARB (sizeof(struct rte_flow_action_modify_field), - ACTION_MODIFY_PATTERN_SIZE)), + FLOW_FIELD_PATTERN_SIZE)), .call = parse_vc_conf, }, [ACTION_MODIFY_FIELD_WIDTH] = { @@ -9798,10 +9798,10 @@ parse_vc_modify_field_id(struct context *ctx, const struct token *token, if (ctx->curr != ACTION_MODIFY_FIELD_DST_TYPE_VALUE && ctx->curr != ACTION_MODIFY_FIELD_SRC_TYPE_VALUE) return -1; - for (i = 0; modify_field_ids[i]; ++i) - if (!strcmp_partial(modify_field_ids[i], str, len)) + for (i = 0; flow_field_ids[i]; ++i) + if (!strcmp_partial(flow_field_ids[i], str, len)) break; - if (!modify_field_ids[i]) + if (!flow_field_ids[i]) return -1; if (!ctx->object) return len; @@ -12028,10 +12028,10 @@ comp_set_modify_field_id(struct context *ctx, const struct token *token, RTE_SET_USED(token); if (!buf) - return RTE_DIM(modify_field_ids); - if (ent >= RTE_DIM(modify_field_ids) - 1) + return RTE_DIM(flow_field_ids); + if (ent >= RTE_DIM(flow_field_ids) - 1) return -1; - name = modify_field_ids[ent]; + name = flow_field_ids[ent]; if (ctx->curr == ACTION_MODIFY_FIELD_SRC_TYPE || (strcmp(name, "pointer") && strcmp(name, "value"))) return strlcpy(buf, name, size); diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 900fdaefb6..f936a9ba19 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -3185,7 +3185,7 @@ destination offset as ``48``, and provide immediate value ``0xXXXX85XX``. | ``width`` | number of bits to use | +---------------+-------------------------+ -.. _table_rte_flow_action_modify_data: +.. _table_rte_flow_field_data: .. table:: destination/source field definition diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst index 84d3144215..efeda6ea97 100644 --- a/doc/guides/rel_notes/release_24_03.rst +++ b/doc/guides/rel_notes/release_24_03.rst @@ -124,6 +124,7 @@ ABI Changes * No ABI change that would break compatibility with 23.11. +* ethdev: Rename the experimental ``struct rte_flow_action_modify_data`` to be ``struct rte_flow_field_data`` Known Issues ------------ diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 85e8c77c81..5788a7fb57 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -2493,7 +2493,7 @@ mlx5_validate_action_ct(struct rte_eth_dev *dev, * Validate the level value for modify field action. * * @param[in] data - * Pointer to the rte_flow_action_modify_data structure either src or dst. + * Pointer to the rte_flow_field_data structure either src or dst. * @param[out] error * Pointer to error structure. * @@ -2501,7 +2501,7 @@ mlx5_validate_action_ct(struct rte_eth_dev *dev, * 0 on success, a negative errno value otherwise and rte_errno is set. */ int -flow_validate_modify_field_level(const struct rte_flow_action_modify_data *data, +flow_validate_modify_field_level(const struct rte_flow_field_data *data, struct rte_flow_error *error) { if (data->level == 0) diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index 6dde9de688..ecfb04ead2 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -1121,7 +1121,7 @@ flow_items_to_tunnel(const struct rte_flow_item items[]) * Tag array index. */ static inline uint8_t -flow_tag_index_get(const struct rte_flow_action_modify_data *data) +flow_tag_index_get(const struct rte_flow_field_data *data) { return data->tag_index ? data->tag_index : data->level; } @@ -2523,7 +2523,7 @@ int mlx5_flow_validate_action_default_miss(uint64_t action_flags, const struct rte_flow_attr *attr, struct rte_flow_error *error); int flow_validate_modify_field_level - (const struct rte_flow_action_modify_data *data, + (const struct rte_flow_field_data *data, struct rte_flow_error *error); int mlx5_flow_item_acceptable(const struct rte_flow_item *item, const uint8_t *mask, @@ -2828,7 +2828,7 @@ size_t flow_dv_get_item_hdr_len(const enum rte_flow_item_type item_type); int flow_dv_convert_encap_data(const struct rte_flow_item *items, uint8_t *buf, size_t *size, struct rte_flow_error *error); void mlx5_flow_field_id_to_modify_info - (const struct rte_flow_action_modify_data *data, + (const struct rte_flow_field_data *data, struct field_modify_info *info, uint32_t *mask, uint32_t width, struct rte_eth_dev *dev, const struct rte_flow_attr *attr, struct rte_flow_error *error); diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 115d730317..52620be262 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -1441,7 +1441,7 @@ flow_modify_info_mask_32_masked(uint32_t length, uint32_t off, uint32_t post_mas } static __rte_always_inline enum mlx5_modification_field -mlx5_mpls_modi_field_get(const struct rte_flow_action_modify_data *data) +mlx5_mpls_modi_field_get(const struct rte_flow_field_data *data) { return MLX5_MODI_IN_MPLS_LABEL_0 + data->tag_index; } @@ -1449,7 +1449,7 @@ mlx5_mpls_modi_field_get(const struct rte_flow_action_modify_data *data) static void mlx5_modify_flex_item(const struct rte_eth_dev *dev, const struct mlx5_flex_item *flex, - const struct rte_flow_action_modify_data *data, + const struct rte_flow_field_data *data, struct field_modify_info *info, uint32_t *mask, uint32_t width) { @@ -1573,7 +1573,7 @@ mlx5_modify_flex_item(const struct rte_eth_dev *dev, void mlx5_flow_field_id_to_modify_info - (const struct rte_flow_action_modify_data *data, + (const struct rte_flow_field_data *data, struct field_modify_info *info, uint32_t *mask, uint32_t width, struct rte_eth_dev *dev, const struct rte_flow_attr *attr, struct rte_flow_error *error) @@ -5284,8 +5284,8 @@ flow_dv_validate_action_modify_field(struct rte_eth_dev *dev, struct mlx5_sh_config *config = &priv->sh->config; struct mlx5_hca_attr *hca_attr = &priv->sh->cdev->config.hca_attr; const struct rte_flow_action_modify_field *conf = action->conf; - const struct rte_flow_action_modify_data *src_data = &conf->src; - const struct rte_flow_action_modify_data *dst_data = &conf->dst; + const struct rte_flow_field_data *src_data = &conf->src; + const struct rte_flow_field_data *dst_data = &conf->dst; uint32_t dst_width, src_width, width = conf->width; ret = flow_dv_validate_action_modify_hdr(action_flags, action, error); diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index 1267c146e5..a143ecb194 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -3887,6 +3887,8 @@ struct rte_flow_action_ethdev { /** * Field IDs for MODIFY_FIELD action. + * e.g. the packet field IDs used in RTE_FLOW_ACTION_TYPE_MODIFY_FIELD + * and RTE_FLOW_ITEM_TYPE_COMPARE. */ enum rte_flow_field_id { RTE_FLOW_FIELD_START = 0, /**< Start of a packet. */ @@ -3940,9 +3942,11 @@ enum rte_flow_field_id { * @warning * @b EXPERIMENTAL: this structure may change without prior notice * - * Field description for MODIFY_FIELD action. + * Field description for packet field. + * e.g. the packet fields used in RTE_FLOW_ACTION_TYPE_MODIFY_FIELD + * and RTE_FLOW_ITEM_TYPE_COMPARE. */ -struct rte_flow_action_modify_data { +struct rte_flow_field_data { enum rte_flow_field_id field; /**< Field or memory type ID. */ union { struct { @@ -4051,8 +4055,8 @@ enum rte_flow_modify_op { */ struct rte_flow_action_modify_field { enum rte_flow_modify_op operation; /**< Operation to perform. */ - struct rte_flow_action_modify_data dst; /**< Destination field. */ - struct rte_flow_action_modify_data src; /**< Source field. */ + struct rte_flow_field_data dst; /**< Destination field. */ + struct rte_flow_field_data src; /**< Source field. */ uint32_t width; /**< Number of bits to use from a source field. */ }; From patchwork Thu Feb 1 12:29:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suanming Mou X-Patchwork-Id: 136258 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4EEB643A39; Thu, 1 Feb 2024 13:30:21 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3DEDC42E12; Thu, 1 Feb 2024 13:30:21 +0100 (CET) Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2079.outbound.protection.outlook.com [40.107.94.79]) by mails.dpdk.org (Postfix) with ESMTP id 6446642E0F for ; Thu, 1 Feb 2024 13:30:19 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=m7gcXe8Nl7XojOrcqJdt2ITtzLNJiNMCrPRBT4x5iAKrNcIP/jsR9xT657nqJ3CCSjG6L/gXGqj/0z2k9Igs9p6W249n8JFMA14fHu44grMHLwAL+H0m02vSX0MHXTNiAzrscatov9hrFtKhiplW3zY2fSvYVBHD984MxgNSnQM8j27QHfIUOQQaJil4bRnonvLUaZARqYljxZqgiSqEAx3FrFDN84qZ8uwtGRGBmNwyL+sE9xsq28+wNZJXV0uR0B/qSxTYGROMtc+ZEzruRrnWpb6nc7djfcXcWQkDlMR6xy95DZXgejgR+Tqijy3ykZZ29XlzdNbU7OJGmrld+A== 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=KAQBbQDIUq9RfxeRqxQivXdsBoe5Su70f7xx1a3KzYg=; b=Xl2FqK5yTqtYKDPySPY/idUQL8yXOnCtRYsAiK7gsAVrq7rVngZEB1/8PbQULT5UCO4rXWC561HBwxIJ9+gPo3f+NR4Z4YB2QXt/x6Caji3bjV8+Sgs81EeJ6MDzdUmnrmUZl9ZyrudnJlI12wDY8Jj6//JGf9OGRH0FLqemt9tQi8QgbV6SX4nj/fng9cxPuwFZFqDnzu0oyYSaPnrXziB1sFrKXgEopogNbehdgmwi2KsoRobQhmEOBJwJmlKzQ0GDzrSgubqUgGRwWr3+crsQ95xULrioSTP5cT4jXJisYYisz5TuiUnpk2xEBcdDHcGt5mCP8AeApzWFNIPH5A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=amd.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KAQBbQDIUq9RfxeRqxQivXdsBoe5Su70f7xx1a3KzYg=; b=STq2lGIkPE/8q/399O0T7FsJJ3kUfRXHf4zawk28P9OPg0hIagJevqqRFB4F2g2Z7i9nIN3ytko7v5pbT3hgiyV/xysLtHxjaUGf3wRaMTEXtx9oiF5Q4NtrGZfSkyvCa8nf1u8KRIuZtrj3kSMLI4iwXqwloJZ/P0R1nF8YfT2pVjfjSqa7Q1xbueo38DJLE6U5xfO5CJtBpqjBcKu/2hTcRF6n5hhsGrKuTqadlwQbQSR4+TagwSHAa4aUV4HkNlbOIp+jcwSo0WpfF4N+QDSVS6DqbLFGIC+70m5Lwi5wPW6uPM1I6chdZR/Nbzbpjjylt9yUf6ZADASQv9rRCA== Received: from CH2PR07CA0037.namprd07.prod.outlook.com (2603:10b6:610:5b::11) by SA1PR12MB8743.namprd12.prod.outlook.com (2603:10b6:806:37c::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.24; Thu, 1 Feb 2024 12:30:15 +0000 Received: from CH2PEPF0000009A.namprd02.prod.outlook.com (2603:10b6:610:5b:cafe::a3) by CH2PR07CA0037.outlook.office365.com (2603:10b6:610:5b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.24 via Frontend Transport; Thu, 1 Feb 2024 12:30:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CH2PEPF0000009A.mail.protection.outlook.com (10.167.244.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.19 via Frontend Transport; Thu, 1 Feb 2024 12:30:15 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 1 Feb 2024 04:30:04 -0800 Received: from nvidia.com (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 1 Feb 2024 04:29:59 -0800 From: Suanming Mou To: , Ori Kam , Aman Singh , Yuying Zhang , "Thomas Monjalon" , Andrew Rybchenko CC: Subject: [PATCH v5 2/3] ethdev: add compare item Date: Thu, 1 Feb 2024 20:29:21 +0800 Message-ID: <20240201122922.474250-3-suanmingm@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240201122922.474250-1-suanmingm@nvidia.com> References: <20231214031227.363911-1-suanmingm@nvidia.com> <20240201122922.474250-1-suanmingm@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.231.35] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF0000009A:EE_|SA1PR12MB8743:EE_ X-MS-Office365-Filtering-Correlation-Id: d3d1d11e-ac55-40a3-6b52-08dc23218b16 X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: pt5s+MZbl9rZKMPFiP81k/aY8+mU9HowEWzER4OEvfWYHX6Wqtn0ERhYY67aQ4mHXNCo1eofd1qGLf8VBIXzmit55GO/FMmwvgzNFG8yneCOrF/HbSRfLxc7a4X/TrDkWZU+Q3vJDWNFM+agM+0i2TPDCEA1azZj7Bb6MpoDLnIiB5RNaR1sohc6BYifCzHqzskyAdBI3KXzM2Xq9TK3mbzXlNxWXFBU9IVO0JQsdw5t6yD8bNAObfnDxf1AvPJkeTITgtKycbQ+u3BDjPBd/tD+kdJxNfRUWLsE/VMO1P//xNNeAkBIl3OF2gYG7qp9GlRPh8U28SSjuRreEijfH6zpJQP7Yqk5+us02m0lXi9jV4jySydlmg1g3u4OuV9UlTLfAMykrsEhw4+tM9E+Ffdh6P5EIgyuWfMoOMeFX39VjcxqLkhwdv+frMnvJFJ5bq2YVQAwP5KZ1GF1oNl1Fz5plLeiBbXX/gCRewoW/HQPdmEJ7uU1to+RN5Mhc58ATCLRyUJpO69qmhGc4MxRvEwWdO7iERI0j4Tfy1cH6fepPCa6JDVCHoKnCXNx5fuSJGpyLOaKgzGO4bqan32BmCUFnIAe8sftpdA4YycTQoSiPfo96ACLZF00AXMWUUj7NEsPEE+TWXNplvMguGEAPHW0li2N3a08QqwezdKZ91hMXCisHyT5uTNKxRJCPg6fO1fEijIu52YileL6kgsMaqWFFEw4JWPtzaUeDQt+WAP3EACliEWoZx0m7qyAPzwk2rFkGDOHm5LceSzeJK6kumcFRph5VSTOZJkpTeXSKHMBgp1OcFYgB6IwK/W1Fzq3 X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230031)(4636009)(376002)(39860400002)(346002)(396003)(136003)(230173577357003)(230273577357003)(230922051799003)(451199024)(64100799003)(186009)(82310400011)(1800799012)(40470700004)(46966006)(36840700001)(40460700003)(40480700001)(55016003)(30864003)(16526019)(26005)(70586007)(478600001)(70206006)(6286002)(5660300002)(2906002)(83380400001)(336012)(7696005)(6666004)(8676002)(8936002)(316002)(1076003)(2616005)(110136005)(36860700001)(47076005)(356005)(4326008)(82740400003)(86362001)(426003)(7636003)(36756003)(41300700001)(21314003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2024 12:30:15.2600 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d3d1d11e-ac55-40a3-6b52-08dc23218b16 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CH2PEPF0000009A.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB8743 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 The new item type is added for the case user wants to match traffic based on packet field compare result with other fields or immediate value. e.g. take advantage the compare item user will be able to accumulate a IPv4/TCP packet's TCP data_offset and IPv4 IHL field to a tag register, then compare the tag register with IPv4 header total length to understand the packet has payload or not. The supported operations can be as below: - RTE_FLOW_ITEM_COMPARE_EQ (equal) - RTE_FLOW_ITEM_COMPARE_NE (not equal) - RTE_FLOW_ITEM_COMPARE_LT (less than) - RTE_FLOW_ITEM_COMPARE_LE (less than or equal) - RTE_FLOW_ITEM_COMPARE_GT (great than) - RTE_FLOW_ITEM_COMPARE_GE (great than or equal) A sample for create the comparison flow: flow pattern_template 0 create ingress pattern_template_id 1 template \ compare op mask le a_type mask tag a_tag_index mask 1 b_type \ mask tag b_tag_index mask 2 width mask 0xffffffff / end flow actions_template 0 create ingress actions_template_id 1 template \ count / drop / end mask count / drop / end flow template_table 0 create table_id 1 group 2 priority 1 ingress \ rules_number 1 pattern_template 1 actions_template 1 flow queue 0 create 0 template_table 1 pattern_template 0 \ actions_template 0 postpone no pattern compare op is le \ a_type is tag a_tag_index is 1 b_type is tag b_tag_index is 2 \ width is 32 / end actions count / drop / end Signed-off-by: Suanming Mou Acked-by: Ori Kam Acked-by: Andrew Rybchenko --- app/test-pmd/cmdline_flow.c | 394 ++++++++++++++++++++ doc/guides/nics/features/default.ini | 1 + doc/guides/prog_guide/rte_flow.rst | 7 + doc/guides/rel_notes/release_24_03.rst | 5 + doc/guides/testpmd_app_ug/testpmd_funcs.rst | 24 ++ lib/ethdev/rte_flow.c | 1 + lib/ethdev/rte_flow.h | 332 +++++++++-------- 7 files changed, 615 insertions(+), 149 deletions(-) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 972c6ae490..69b14c6eb1 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -545,6 +545,28 @@ enum index { ITEM_PTYPE, ITEM_PTYPE_VALUE, ITEM_NSH, + ITEM_COMPARE, + ITEM_COMPARE_OP, + ITEM_COMPARE_OP_VALUE, + ITEM_COMPARE_FIELD_A_TYPE, + ITEM_COMPARE_FIELD_A_TYPE_VALUE, + ITEM_COMPARE_FIELD_A_LEVEL, + ITEM_COMPARE_FIELD_A_LEVEL_VALUE, + ITEM_COMPARE_FIELD_A_TAG_INDEX, + ITEM_COMPARE_FIELD_A_TYPE_ID, + ITEM_COMPARE_FIELD_A_CLASS_ID, + ITEM_COMPARE_FIELD_A_OFFSET, + ITEM_COMPARE_FIELD_B_TYPE, + ITEM_COMPARE_FIELD_B_TYPE_VALUE, + ITEM_COMPARE_FIELD_B_LEVEL, + ITEM_COMPARE_FIELD_B_LEVEL_VALUE, + ITEM_COMPARE_FIELD_B_TAG_INDEX, + ITEM_COMPARE_FIELD_B_TYPE_ID, + ITEM_COMPARE_FIELD_B_CLASS_ID, + ITEM_COMPARE_FIELD_B_OFFSET, + ITEM_COMPARE_FIELD_B_VALUE, + ITEM_COMPARE_FIELD_B_POINTER, + ITEM_COMPARE_FIELD_WIDTH, /* Validate/create actions. */ ACTIONS, @@ -742,6 +764,10 @@ enum index { #define ITEM_RAW_SIZE \ (sizeof(struct rte_flow_item_raw) + ITEM_RAW_PATTERN_SIZE) +static const char *const compare_ops[] = { + "eq", "ne", "lt", "le", "gt", "ge", NULL +}; + /** Maximum size for external pattern in struct rte_flow_field_data. */ #define FLOW_FIELD_PATTERN_SIZE 32 @@ -1594,6 +1620,7 @@ static const enum index next_item[] = { ITEM_IB_BTH, ITEM_PTYPE, ITEM_NSH, + ITEM_COMPARE, END_SET, ZERO, }; @@ -2131,6 +2158,38 @@ static const enum index item_nsh[] = { ZERO, }; +static const enum index item_compare_field[] = { + ITEM_COMPARE_OP, + ITEM_COMPARE_FIELD_A_TYPE, + ITEM_COMPARE_FIELD_B_TYPE, + ITEM_NEXT, + ZERO, +}; + +static const enum index compare_field_a[] = { + ITEM_COMPARE_FIELD_A_TYPE, + ITEM_COMPARE_FIELD_A_LEVEL, + ITEM_COMPARE_FIELD_A_TAG_INDEX, + ITEM_COMPARE_FIELD_A_TYPE_ID, + ITEM_COMPARE_FIELD_A_CLASS_ID, + ITEM_COMPARE_FIELD_A_OFFSET, + ITEM_COMPARE_FIELD_B_TYPE, + ZERO, +}; + +static const enum index compare_field_b[] = { + ITEM_COMPARE_FIELD_B_TYPE, + ITEM_COMPARE_FIELD_B_LEVEL, + ITEM_COMPARE_FIELD_B_TAG_INDEX, + ITEM_COMPARE_FIELD_B_TYPE_ID, + ITEM_COMPARE_FIELD_B_CLASS_ID, + ITEM_COMPARE_FIELD_B_OFFSET, + ITEM_COMPARE_FIELD_B_VALUE, + ITEM_COMPARE_FIELD_B_POINTER, + ITEM_COMPARE_FIELD_WIDTH, + ZERO, +}; + static const enum index next_action[] = { ACTION_END, ACTION_VOID, @@ -2873,6 +2932,24 @@ comp_quota_update_name(struct context *ctx, const struct token *token, static int comp_qu_mode_name(struct context *ctx, const struct token *token, unsigned int ent, char *buf, unsigned int size); +static int +comp_set_compare_field_id(struct context *ctx, const struct token *token, + unsigned int ent, char *buf, unsigned int size); +static int +comp_set_compare_op(struct context *ctx, const struct token *token, + unsigned int ent, char *buf, unsigned int size); +static int +parse_vc_compare_op(struct context *ctx, const struct token *token, + const char *str, unsigned int len, void *buf, + unsigned int size); +static int +parse_vc_compare_field_id(struct context *ctx, const struct token *token, + const char *str, unsigned int len, void *buf, + unsigned int size); +static int +parse_vc_compare_field_level(struct context *ctx, const struct token *token, + const char *str, unsigned int len, void *buf, + unsigned int size); struct indlst_conf { uint32_t id; @@ -6007,6 +6084,174 @@ static const struct token token_list[] = { .next = NEXT(item_nsh), .call = parse_vc, }, + [ITEM_COMPARE] = { + .name = "compare", + .help = "match with the comparison result", + .priv = PRIV_ITEM(COMPARE, sizeof(struct rte_flow_item_compare)), + .next = NEXT(NEXT_ENTRY(ITEM_COMPARE_OP)), + .call = parse_vc, + }, + [ITEM_COMPARE_OP] = { + .name = "op", + .help = "operation type", + .next = NEXT(item_compare_field, + NEXT_ENTRY(ITEM_COMPARE_OP_VALUE), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, operation)), + }, + [ITEM_COMPARE_OP_VALUE] = { + .name = "{operation}", + .help = "operation type value", + .call = parse_vc_compare_op, + .comp = comp_set_compare_op, + }, + [ITEM_COMPARE_FIELD_A_TYPE] = { + .name = "a_type", + .help = "compared field type", + .next = NEXT(compare_field_a, + NEXT_ENTRY(ITEM_COMPARE_FIELD_A_TYPE_VALUE), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, a.field)), + }, + [ITEM_COMPARE_FIELD_A_TYPE_VALUE] = { + .name = "{a_type}", + .help = "compared field type value", + .call = parse_vc_compare_field_id, + .comp = comp_set_compare_field_id, + }, + [ITEM_COMPARE_FIELD_A_LEVEL] = { + .name = "a_level", + .help = "compared field level", + .next = NEXT(compare_field_a, + NEXT_ENTRY(ITEM_COMPARE_FIELD_A_LEVEL_VALUE), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, a.level)), + }, + [ITEM_COMPARE_FIELD_A_LEVEL_VALUE] = { + .name = "{a_level}", + .help = "compared field level value", + .call = parse_vc_compare_field_level, + .comp = comp_none, + }, + [ITEM_COMPARE_FIELD_A_TAG_INDEX] = { + .name = "a_tag_index", + .help = "compared field tag array", + .next = NEXT(compare_field_a, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + a.tag_index)), + }, + [ITEM_COMPARE_FIELD_A_TYPE_ID] = { + .name = "a_type_id", + .help = "compared field type ID", + .next = NEXT(compare_field_a, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + a.type)), + }, + [ITEM_COMPARE_FIELD_A_CLASS_ID] = { + .name = "a_class", + .help = "compared field class ID", + .next = NEXT(compare_field_a, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_compare, + a.class_id)), + }, + [ITEM_COMPARE_FIELD_A_OFFSET] = { + .name = "a_offset", + .help = "compared field bit offset", + .next = NEXT(compare_field_a, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + a.offset)), + }, + [ITEM_COMPARE_FIELD_B_TYPE] = { + .name = "b_type", + .help = "comparator field type", + .next = NEXT(compare_field_b, + NEXT_ENTRY(ITEM_COMPARE_FIELD_B_TYPE_VALUE), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + b.field)), + }, + [ITEM_COMPARE_FIELD_B_TYPE_VALUE] = { + .name = "{b_type}", + .help = "comparator field type value", + .call = parse_vc_compare_field_id, + .comp = comp_set_compare_field_id, + }, + [ITEM_COMPARE_FIELD_B_LEVEL] = { + .name = "b_level", + .help = "comparator field level", + .next = NEXT(compare_field_b, + NEXT_ENTRY(ITEM_COMPARE_FIELD_B_LEVEL_VALUE), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + b.level)), + }, + [ITEM_COMPARE_FIELD_B_LEVEL_VALUE] = { + .name = "{b_level}", + .help = "comparator field level value", + .call = parse_vc_compare_field_level, + .comp = comp_none, + }, + [ITEM_COMPARE_FIELD_B_TAG_INDEX] = { + .name = "b_tag_index", + .help = "comparator field tag array", + .next = NEXT(compare_field_b, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + b.tag_index)), + }, + [ITEM_COMPARE_FIELD_B_TYPE_ID] = { + .name = "b_type_id", + .help = "comparator field type ID", + .next = NEXT(compare_field_b, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + b.type)), + }, + [ITEM_COMPARE_FIELD_B_CLASS_ID] = { + .name = "b_class", + .help = "comparator field class ID", + .next = NEXT(compare_field_b, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_compare, + b.class_id)), + }, + [ITEM_COMPARE_FIELD_B_OFFSET] = { + .name = "b_offset", + .help = "comparator field bit offset", + .next = NEXT(compare_field_b, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + b.offset)), + }, + [ITEM_COMPARE_FIELD_B_VALUE] = { + .name = "b_value", + .help = "comparator immediate value", + .next = NEXT(compare_field_b, + NEXT_ENTRY(COMMON_HEX), item_param), + .args = ARGS(ARGS_ENTRY_ARB(0, 0), + ARGS_ENTRY_ARB(0, 0), + ARGS_ENTRY(struct rte_flow_item_compare, + b.value)), + }, + [ITEM_COMPARE_FIELD_B_POINTER] = { + .name = "b_ptr", + .help = "pointer to comparator immediate value", + .next = NEXT(compare_field_b, + NEXT_ENTRY(COMMON_HEX), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + b.pvalue), + ARGS_ENTRY_ARB(0, 0), + ARGS_ENTRY_ARB + (sizeof(struct rte_flow_item_compare), + FLOW_FIELD_PATTERN_SIZE)), + }, + [ITEM_COMPARE_FIELD_WIDTH] = { + .name = "width", + .help = "number of bits to compare", + .next = NEXT(item_compare_field, + NEXT_ENTRY(COMMON_UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, + width)), + }, /* Validate/create actions. */ [ACTIONS] = { @@ -8429,6 +8674,122 @@ parse_vc_item_l2tpv2_type(struct context *ctx, const struct token *token, return len; } +/** Parse operation for compare match item. */ +static int +parse_vc_compare_op(struct context *ctx, const struct token *token, + const char *str, unsigned int len, void *buf, + unsigned int size) +{ + struct rte_flow_item_compare *compare_item; + unsigned int i; + + (void)token; + (void)buf; + (void)size; + if (ctx->curr != ITEM_COMPARE_OP_VALUE) + return -1; + for (i = 0; compare_ops[i]; ++i) + if (!strcmp_partial(compare_ops[i], str, len)) + break; + if (!compare_ops[i]) + return -1; + if (!ctx->object) + return len; + compare_item = ctx->object; + compare_item->operation = (enum rte_flow_item_compare_op)i; + return len; +} + +/** Parse id for compare match item. */ +static int +parse_vc_compare_field_id(struct context *ctx, const struct token *token, + const char *str, unsigned int len, void *buf, + unsigned int size) +{ + struct rte_flow_item_compare *compare_item; + unsigned int i; + + (void)token; + (void)buf; + (void)size; + if (ctx->curr != ITEM_COMPARE_FIELD_A_TYPE_VALUE && + ctx->curr != ITEM_COMPARE_FIELD_B_TYPE_VALUE) + return -1; + for (i = 0; flow_field_ids[i]; ++i) + if (!strcmp_partial(flow_field_ids[i], str, len)) + break; + if (!flow_field_ids[i]) + return -1; + if (!ctx->object) + return len; + compare_item = ctx->object; + if (ctx->curr == ITEM_COMPARE_FIELD_A_TYPE_VALUE) + compare_item->a.field = (enum rte_flow_field_id)i; + else + compare_item->b.field = (enum rte_flow_field_id)i; + return len; +} + +/** Parse level for compare match item. */ +static int +parse_vc_compare_field_level(struct context *ctx, const struct token *token, + const char *str, unsigned int len, void *buf, + unsigned int size) +{ + struct rte_flow_item_compare *compare_item; + struct flex_item *fp = NULL; + uint32_t val; + struct buffer *out = buf; + char *end; + + (void)token; + (void)size; + if (ctx->curr != ITEM_COMPARE_FIELD_A_LEVEL_VALUE && + ctx->curr != ITEM_COMPARE_FIELD_B_LEVEL_VALUE) + return -1; + if (!ctx->object) + return len; + compare_item = ctx->object; + errno = 0; + val = strtoumax(str, &end, 0); + if (errno || (size_t)(end - str) != len) + return -1; + /* No need to validate action template mask value */ + if (out->args.vc.masks) { + if (ctx->curr == ITEM_COMPARE_FIELD_A_LEVEL_VALUE) + compare_item->a.level = val; + else + compare_item->b.level = val; + return len; + } + if ((ctx->curr == ITEM_COMPARE_FIELD_A_LEVEL_VALUE && + compare_item->a.field == RTE_FLOW_FIELD_FLEX_ITEM) || + (ctx->curr == ITEM_COMPARE_FIELD_B_LEVEL_VALUE && + compare_item->b.field == RTE_FLOW_FIELD_FLEX_ITEM)) { + if (val >= FLEX_MAX_PARSERS_NUM) { + printf("Bad flex item handle\n"); + return -1; + } + fp = flex_items[ctx->port][val]; + if (!fp) { + printf("Bad flex item handle\n"); + return -1; + } + } + if (ctx->curr == ITEM_COMPARE_FIELD_A_LEVEL_VALUE) { + if (compare_item->a.field != RTE_FLOW_FIELD_FLEX_ITEM) + compare_item->a.level = val; + else + compare_item->a.flex_handle = fp->flex_handle; + } else if (ctx->curr == ITEM_COMPARE_FIELD_B_LEVEL_VALUE) { + if (compare_item->b.field != RTE_FLOW_FIELD_FLEX_ITEM) + compare_item->b.level = val; + else + compare_item->b.flex_handle = fp->flex_handle; + } + return len; +} + /** Parse meter color action type. */ static int parse_vc_action_meter_color_type(struct context *ctx, const struct token *token, @@ -11915,6 +12276,39 @@ comp_rule_id(struct context *ctx, const struct token *token, return i; } +/** Complete operation for compare match item. */ +static int +comp_set_compare_op(struct context *ctx, const struct token *token, + unsigned int ent, char *buf, unsigned int size) +{ + RTE_SET_USED(ctx); + RTE_SET_USED(token); + if (!buf) + return RTE_DIM(compare_ops); + if (ent < RTE_DIM(compare_ops) - 1) + return strlcpy(buf, compare_ops[ent], size); + return -1; +} + +/** Complete field id for compare match item. */ +static int +comp_set_compare_field_id(struct context *ctx, const struct token *token, + unsigned int ent, char *buf, unsigned int size) +{ + const char *name; + + RTE_SET_USED(token); + if (!buf) + return RTE_DIM(flow_field_ids); + if (ent >= RTE_DIM(flow_field_ids) - 1) + return -1; + name = flow_field_ids[ent]; + if (ctx->curr == ITEM_COMPARE_FIELD_B_TYPE || + (strcmp(name, "pointer") && strcmp(name, "value"))) + return strlcpy(buf, name, size); + return -1; +} + /** Complete type field for RSS action. */ static int comp_vc_action_rss_type(struct context *ctx, const struct token *token, diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini index 5115963136..1ded1d5de1 100644 --- a/doc/guides/nics/features/default.ini +++ b/doc/guides/nics/features/default.ini @@ -88,6 +88,7 @@ aggr_affinity = ah = any = arp_eth_ipv4 = +compare = conntrack = ecpri = esp = diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index f936a9ba19..dc038e2c39 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1587,6 +1587,13 @@ the packet. - ``value``: Specific value to match. +Item: ``COMPARE`` +^^^^^^^^^^^^^^^^^ + +Matches the comparison result between packet fields or value. + +- ``compare``: Comparison information. + Actions ~~~~~~~ diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst index efeda6ea97..ffceab59e4 100644 --- a/doc/guides/rel_notes/release_24_03.rst +++ b/doc/guides/rel_notes/release_24_03.rst @@ -70,6 +70,11 @@ New Features * Added a fath path function ``rte_eth_tx_queue_count`` to get the number of used descriptors of a Tx queue. +* **Added compare flow matching criteria.** + + Added ``RTE_FLOW_ITEM_TYPE_COMPARE`` to allow matching on compare + result between the packet fields or value. + * **Updated Atomic Rules' Arkville PMD.** * Added support for Atomic Rules' TK242 packet-capture family of devices diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index ab18a80b30..c79d8929f5 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -3856,6 +3856,13 @@ This section lists supported pattern items and their attributes, if any. - ``packet_type {unsigned}``: packet type. +- ``compare``: match the comparison result between packet fields or value. + + - ``op {string}``: comparison operation type. + - ``a_type {string}``: compared field. + - ``b_type {string}``: comparator field. + - ``width {unsigned}``: comparison width. + Actions list ^^^^^^^^^^^^ @@ -5320,6 +5327,23 @@ A RAW rule can be created as following using ``pattern_hex`` key and mask. pattern_hex mask 0000000000000000000000000000000000000000000000000000ffffffff / end actions queue index 4 / end +Sample match with comparison rule +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Match with comparsion rule can be created as following using ``compare``. + +:: + + testpmd> flow pattern_template 0 create ingress pattern_template_id 1 template compare op mask le + a_type mask tag a_tag_index mask 1 b_type mask tag b_tag_index mask 2 width mask 0xffffffff / end + testpmd> flow actions_template 0 create ingress actions_template_id 1 template count / drop / end + mask count / drop / end + testpmd> flow template_table 0 create table_id 1 group 2 priority 1 ingress rules_number 1 + pattern_template 1 actions_template 1 + testpmd> flow queue 0 create 0 template_table 1 pattern_template 0 actions_template 0 postpone no + pattern compare op is le a_type is tag a_tag_index is 1 b_type is tag b_tag_index is 2 width is 32 / end + actions count / drop / end + BPF Functions -------------- diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index 3f58d792f9..5f63529f9f 100644 --- a/lib/ethdev/rte_flow.c +++ b/lib/ethdev/rte_flow.c @@ -170,6 +170,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = { MK_FLOW_ITEM(TX_QUEUE, sizeof(struct rte_flow_item_tx_queue)), MK_FLOW_ITEM(IB_BTH, sizeof(struct rte_flow_item_ib_bth)), MK_FLOW_ITEM(PTYPE, sizeof(struct rte_flow_item_ptype)), + MK_FLOW_ITEM(COMPARE, sizeof(struct rte_flow_item_compare)), }; /** Generate flow_action[] entry. */ diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index a143ecb194..d906288f2c 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -714,6 +714,13 @@ enum rte_flow_item_type { * @see struct rte_flow_item_random. */ RTE_FLOW_ITEM_TYPE_RANDOM, + + /** + * Matches the packet with compare result. + * + * See struct rte_flow_item_compare. + */ + RTE_FLOW_ITEM_TYPE_COMPARE, }; /** @@ -2365,6 +2372,182 @@ static const struct rte_flow_item_ptype rte_flow_item_ptype_mask = { }; #endif +/** + * Field IDs for packet field. + * e.g. the packet field IDs used in RTE_FLOW_ACTION_TYPE_MODIFY_FIELD + * and RTE_FLOW_ITEM_TYPE_COMPARE. + */ +enum rte_flow_field_id { + RTE_FLOW_FIELD_START = 0, /**< Start of a packet. */ + RTE_FLOW_FIELD_MAC_DST, /**< Destination MAC Address. */ + RTE_FLOW_FIELD_MAC_SRC, /**< Source MAC Address. */ + RTE_FLOW_FIELD_VLAN_TYPE, /**< VLAN Tag Identifier. */ + RTE_FLOW_FIELD_VLAN_ID, /**< VLAN Identifier. */ + RTE_FLOW_FIELD_MAC_TYPE, /**< EtherType. */ + RTE_FLOW_FIELD_IPV4_DSCP, /**< IPv4 DSCP. */ + RTE_FLOW_FIELD_IPV4_TTL, /**< IPv4 Time To Live. */ + RTE_FLOW_FIELD_IPV4_SRC, /**< IPv4 Source Address. */ + RTE_FLOW_FIELD_IPV4_DST, /**< IPv4 Destination Address. */ + RTE_FLOW_FIELD_IPV6_DSCP, /**< IPv6 DSCP. */ + RTE_FLOW_FIELD_IPV6_HOPLIMIT, /**< IPv6 Hop Limit. */ + RTE_FLOW_FIELD_IPV6_SRC, /**< IPv6 Source Address. */ + RTE_FLOW_FIELD_IPV6_DST, /**< IPv6 Destination Address. */ + RTE_FLOW_FIELD_TCP_PORT_SRC, /**< TCP Source Port Number. */ + RTE_FLOW_FIELD_TCP_PORT_DST, /**< TCP Destination Port Number. */ + RTE_FLOW_FIELD_TCP_SEQ_NUM, /**< TCP Sequence Number. */ + RTE_FLOW_FIELD_TCP_ACK_NUM, /**< TCP Acknowledgment Number. */ + RTE_FLOW_FIELD_TCP_FLAGS, /**< TCP Flags. */ + RTE_FLOW_FIELD_UDP_PORT_SRC, /**< UDP Source Port Number. */ + RTE_FLOW_FIELD_UDP_PORT_DST, /**< UDP Destination Port Number. */ + RTE_FLOW_FIELD_VXLAN_VNI, /**< VXLAN Network Identifier. */ + RTE_FLOW_FIELD_GENEVE_VNI, /**< GENEVE Network Identifier. */ + RTE_FLOW_FIELD_GTP_TEID, /**< GTP Tunnel Endpoint Identifier. */ + RTE_FLOW_FIELD_TAG, /**< Tag value. */ + RTE_FLOW_FIELD_MARK, /**< Mark value. */ + RTE_FLOW_FIELD_META, /**< Metadata value. */ + RTE_FLOW_FIELD_POINTER, /**< Memory pointer. */ + RTE_FLOW_FIELD_VALUE, /**< Immediate value. */ + RTE_FLOW_FIELD_IPV4_ECN, /**< IPv4 ECN. */ + RTE_FLOW_FIELD_IPV6_ECN, /**< IPv6 ECN. */ + RTE_FLOW_FIELD_GTP_PSC_QFI, /**< GTP QFI. */ + RTE_FLOW_FIELD_METER_COLOR, /**< Meter color marker. */ + RTE_FLOW_FIELD_IPV6_PROTO, /**< IPv6 next header. */ + RTE_FLOW_FIELD_FLEX_ITEM, /**< Flex item. */ + RTE_FLOW_FIELD_HASH_RESULT, /**< Hash result. */ + RTE_FLOW_FIELD_GENEVE_OPT_TYPE, /**< GENEVE option type. */ + RTE_FLOW_FIELD_GENEVE_OPT_CLASS,/**< GENEVE option class. */ + RTE_FLOW_FIELD_GENEVE_OPT_DATA, /**< GENEVE option data. */ + RTE_FLOW_FIELD_MPLS, /**< MPLS header. */ + RTE_FLOW_FIELD_TCP_DATA_OFFSET, /**< TCP data offset. */ + RTE_FLOW_FIELD_IPV4_IHL, /**< IPv4 IHL. */ + RTE_FLOW_FIELD_IPV4_TOTAL_LEN, /**< IPv4 total length. */ + RTE_FLOW_FIELD_IPV6_PAYLOAD_LEN,/**< IPv6 payload length. */ + RTE_FLOW_FIELD_RANDOM /**< Random value. */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * Field description for packet field. + * e.g. the packet fields used in RTE_FLOW_ACTION_TYPE_MODIFY_FIELD + * and RTE_FLOW_ITEM_TYPE_COMPARE. + */ +struct rte_flow_field_data { + enum rte_flow_field_id field; /**< Field or memory type ID. */ + union { + struct { + /** Encapsulation level and tag index or flex item handle. */ + union { + struct { + /** + * Packet encapsulation level containing + * the field to modify. + * + * - @p 0 requests the default behavior. + * Depending on the packet type, it + * can mean outermost, innermost or + * anything in between. + * + * It basically stands for the + * innermost encapsulation level. + * Modification can be performed + * according to PMD and device + * capabilities. + * + * - @p 1 requests modification to be + * performed on the outermost packet + * encapsulation level. + * + * - @p 2 and subsequent values request + * modification to be performed on + * the specified inner packet + * encapsulation level, from + * outermost to innermost (lower to + * higher values). + * + * Values other than @p 0 are not + * necessarily supported. + * + * @note that for MPLS field, + * encapsulation level also include + * tunnel since MPLS may appear in + * outer, inner or tunnel. + */ + uint8_t level; + union { + /** + * Tag index array inside + * encapsulation level. + * Used for VLAN, MPLS or TAG types. + */ + uint8_t tag_index; + /** + * Geneve option identifier. + * Relevant only for + * RTE_FLOW_FIELD_GENEVE_OPT_XXXX + * modification type. + */ + struct { + /** + * Geneve option type. + */ + uint8_t type; + /** + * Geneve option class. + */ + rte_be16_t class_id; + }; + }; + }; + struct rte_flow_item_flex_handle *flex_handle; + }; + /** Number of bits to skip from a field. */ + uint32_t offset; + }; + /** + * Immediate value for RTE_FLOW_FIELD_VALUE, presented in the + * same byte order and length as in relevant rte_flow_item_xxx. + * The immediate source bitfield offset is inherited from + * the destination's one. + */ + uint8_t value[16]; + /** + * Memory address for RTE_FLOW_FIELD_POINTER, memory layout + * should be the same as for relevant field in the + * rte_flow_item_xxx structure. + */ + void *pvalue; + }; +}; + +/** + * Expected operation types for compare item. + */ +enum rte_flow_item_compare_op { + RTE_FLOW_ITEM_COMPARE_EQ, /* Compare result equal. */ + RTE_FLOW_ITEM_COMPARE_NE, /* Compare result not equal. */ + RTE_FLOW_ITEM_COMPARE_LT, /* Compare result less than. */ + RTE_FLOW_ITEM_COMPARE_LE, /* Compare result less than or equal. */ + RTE_FLOW_ITEM_COMPARE_GT, /* Compare result great than. */ + RTE_FLOW_ITEM_COMPARE_GE, /* Compare result great than or equal. */ +}; + +/** + * + * RTE_FLOW_ITEM_TYPE_COMPARE + * + * Matches the packet with compare result. + * + * The operation means a compare with b result. + */ +struct rte_flow_item_compare { + enum rte_flow_item_compare_op operation; /* The compare operation. */ + struct rte_flow_field_data a; /* Field be compared. */ + struct rte_flow_field_data b; /* Field as comparator. */ + uint32_t width; /* Compare width. */ +}; + /** * Action types. * @@ -3885,155 +4068,6 @@ struct rte_flow_action_ethdev { uint16_t port_id; /**< ethdev port ID */ }; -/** - * Field IDs for MODIFY_FIELD action. - * e.g. the packet field IDs used in RTE_FLOW_ACTION_TYPE_MODIFY_FIELD - * and RTE_FLOW_ITEM_TYPE_COMPARE. - */ -enum rte_flow_field_id { - RTE_FLOW_FIELD_START = 0, /**< Start of a packet. */ - RTE_FLOW_FIELD_MAC_DST, /**< Destination MAC Address. */ - RTE_FLOW_FIELD_MAC_SRC, /**< Source MAC Address. */ - RTE_FLOW_FIELD_VLAN_TYPE, /**< VLAN Tag Identifier. */ - RTE_FLOW_FIELD_VLAN_ID, /**< VLAN Identifier. */ - RTE_FLOW_FIELD_MAC_TYPE, /**< EtherType. */ - RTE_FLOW_FIELD_IPV4_DSCP, /**< IPv4 DSCP. */ - RTE_FLOW_FIELD_IPV4_TTL, /**< IPv4 Time To Live. */ - RTE_FLOW_FIELD_IPV4_SRC, /**< IPv4 Source Address. */ - RTE_FLOW_FIELD_IPV4_DST, /**< IPv4 Destination Address. */ - RTE_FLOW_FIELD_IPV6_DSCP, /**< IPv6 DSCP. */ - RTE_FLOW_FIELD_IPV6_HOPLIMIT, /**< IPv6 Hop Limit. */ - RTE_FLOW_FIELD_IPV6_SRC, /**< IPv6 Source Address. */ - RTE_FLOW_FIELD_IPV6_DST, /**< IPv6 Destination Address. */ - RTE_FLOW_FIELD_TCP_PORT_SRC, /**< TCP Source Port Number. */ - RTE_FLOW_FIELD_TCP_PORT_DST, /**< TCP Destination Port Number. */ - RTE_FLOW_FIELD_TCP_SEQ_NUM, /**< TCP Sequence Number. */ - RTE_FLOW_FIELD_TCP_ACK_NUM, /**< TCP Acknowledgment Number. */ - RTE_FLOW_FIELD_TCP_FLAGS, /**< TCP Flags. */ - RTE_FLOW_FIELD_UDP_PORT_SRC, /**< UDP Source Port Number. */ - RTE_FLOW_FIELD_UDP_PORT_DST, /**< UDP Destination Port Number. */ - RTE_FLOW_FIELD_VXLAN_VNI, /**< VXLAN Network Identifier. */ - RTE_FLOW_FIELD_GENEVE_VNI, /**< GENEVE Network Identifier. */ - RTE_FLOW_FIELD_GTP_TEID, /**< GTP Tunnel Endpoint Identifier. */ - RTE_FLOW_FIELD_TAG, /**< Tag value. */ - RTE_FLOW_FIELD_MARK, /**< Mark value. */ - RTE_FLOW_FIELD_META, /**< Metadata value. */ - RTE_FLOW_FIELD_POINTER, /**< Memory pointer. */ - RTE_FLOW_FIELD_VALUE, /**< Immediate value. */ - RTE_FLOW_FIELD_IPV4_ECN, /**< IPv4 ECN. */ - RTE_FLOW_FIELD_IPV6_ECN, /**< IPv6 ECN. */ - RTE_FLOW_FIELD_GTP_PSC_QFI, /**< GTP QFI. */ - RTE_FLOW_FIELD_METER_COLOR, /**< Meter color marker. */ - RTE_FLOW_FIELD_IPV6_PROTO, /**< IPv6 next header. */ - RTE_FLOW_FIELD_FLEX_ITEM, /**< Flex item. */ - RTE_FLOW_FIELD_HASH_RESULT, /**< Hash result. */ - RTE_FLOW_FIELD_GENEVE_OPT_TYPE, /**< GENEVE option type. */ - RTE_FLOW_FIELD_GENEVE_OPT_CLASS,/**< GENEVE option class. */ - RTE_FLOW_FIELD_GENEVE_OPT_DATA, /**< GENEVE option data. */ - RTE_FLOW_FIELD_MPLS, /**< MPLS header. */ - RTE_FLOW_FIELD_TCP_DATA_OFFSET, /**< TCP data offset. */ - RTE_FLOW_FIELD_IPV4_IHL, /**< IPv4 IHL. */ - RTE_FLOW_FIELD_IPV4_TOTAL_LEN, /**< IPv4 total length. */ - RTE_FLOW_FIELD_IPV6_PAYLOAD_LEN,/**< IPv6 payload length. */ - RTE_FLOW_FIELD_RANDOM /**< Random value. */ -}; - -/** - * @warning - * @b EXPERIMENTAL: this structure may change without prior notice - * - * Field description for packet field. - * e.g. the packet fields used in RTE_FLOW_ACTION_TYPE_MODIFY_FIELD - * and RTE_FLOW_ITEM_TYPE_COMPARE. - */ -struct rte_flow_field_data { - enum rte_flow_field_id field; /**< Field or memory type ID. */ - union { - struct { - /** Encapsulation level and tag index or flex item handle. */ - union { - struct { - /** - * Packet encapsulation level containing - * the field to modify. - * - * - @p 0 requests the default behavior. - * Depending on the packet type, it - * can mean outermost, innermost or - * anything in between. - * - * It basically stands for the - * innermost encapsulation level. - * Modification can be performed - * according to PMD and device - * capabilities. - * - * - @p 1 requests modification to be - * performed on the outermost packet - * encapsulation level. - * - * - @p 2 and subsequent values request - * modification to be performed on - * the specified inner packet - * encapsulation level, from - * outermost to innermost (lower to - * higher values). - * - * Values other than @p 0 are not - * necessarily supported. - * - * @note that for MPLS field, - * encapsulation level also include - * tunnel since MPLS may appear in - * outer, inner or tunnel. - */ - uint8_t level; - union { - /** - * Tag index array inside - * encapsulation level. - * Used for VLAN, MPLS or TAG types. - */ - uint8_t tag_index; - /** - * Geneve option identifier. - * Relevant only for - * RTE_FLOW_FIELD_GENEVE_OPT_XXXX - * modification type. - */ - struct { - /** - * Geneve option type. - */ - uint8_t type; - /** - * Geneve option class. - */ - rte_be16_t class_id; - }; - }; - }; - struct rte_flow_item_flex_handle *flex_handle; - }; - /** Number of bits to skip from a field. */ - uint32_t offset; - }; - /** - * Immediate value for RTE_FLOW_FIELD_VALUE, presented in the - * same byte order and length as in relevant rte_flow_item_xxx. - * The immediate source bitfield offset is inherited from - * the destination's one. - */ - uint8_t value[16]; - /** - * Memory address for RTE_FLOW_FIELD_POINTER, memory layout - * should be the same as for relevant field in the - * rte_flow_item_xxx structure. - */ - void *pvalue; - }; -}; - /** * Operation types for MODIFY_FIELD action. */ From patchwork Thu Feb 1 12:29:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suanming Mou X-Patchwork-Id: 136259 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7909243A39; Thu, 1 Feb 2024 13:30:31 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CADEF42E1E; Thu, 1 Feb 2024 13:30:25 +0100 (CET) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2040.outbound.protection.outlook.com [40.107.236.40]) by mails.dpdk.org (Postfix) with ESMTP id 209FA42E15 for ; Thu, 1 Feb 2024 13:30:24 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cKiHoRfSKZW13nD1rcfST9OHMeWUeIj4S7yhBeQBaElPmlSd3334BN/fbamXivCZw7qu28aXi0MGq+V7fQ3GJvZCZgk1mSZTr8KvcSShiwROoo4Dr6Cy+0IMo2tHm0yEKJ2aKUkzVIeq35+jgMDGmZ860cbWnidTpcL9a59Y3idzc7kxhByslYauaIOjNNiYWJjigGscEfNn2Uh0QUmJji7IJHKnKtJ1PmABrPA72LV2EWwUQLgLH0aoYM9ivTHt6yL+8xKYQamh1O4oyOZp64HIlWzK0XGVqooSHdDIXDaql7QjXErK/81sqfYJCHGnNry2E1fGBL11dTG2YoWfEw== 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=znUpXkGLhgNaiByprQCw53TLAnwjdtjrwh/q1wfQwnE=; b=Skpr4A1xwRK/rb7k6wzRa8I0p4WMde7hZZtoiq5ya6L/Cf4H8j+X/YEW5wEBzz2z87vk56bx2NQQjxl1QRavtLkWndFC3rc7z+w7fdQJu81v/cLFRb9h4u4SFUo3DwEVoGr/m50B0c3EHW+klJgTt3Nxb1n340VCoHyL/S6/avzhQID9hHO8M2Z7i0dyfdLy7BrDhxxMy7YcqZLP/jLSji45IcCtyeyaiWX4FSZ//twspGDlYFPf39VGkUnQnNdme0NNFc/tyveJg014AJSr7jKklQUV367LYQTxHJ3sBESeWu4T6MOv/utBoTXrFS2UPUCHSHe+4FsFpJJG8xi5bA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=amd.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=znUpXkGLhgNaiByprQCw53TLAnwjdtjrwh/q1wfQwnE=; b=gAptlDc3ywcScjX0dRYsuCOYlGfVmPJi28oFlqe4/Jblnrz9B6mu+rVSp7YuB6aBwR1Y7sKyK9w49jBYRA9jO+7/oFnoNUb43kqGd8B5G/XWlceZYbrsV+JsM3J0KL3IgmagMUzBTuanLDD0BR7y6A63920SYPEolVyHGB0qIEIA8Pd8jfg54BvfNYjWtx37rmTSxIm5a8nJXKTMehMWaAaWqzN1bjxWcUtY2eUDHvF6/yr1GuNf+gbFwGaRPej/eKTcumCmz3DUrxAOgBIPtRJVZ5tbm2pVIWHQpqA186xjiMiEccdqM0rZ8jYXPqjRtLCR+VW3wZDhlPboXd631g== Received: from CH0PR03CA0321.namprd03.prod.outlook.com (2603:10b6:610:118::17) by IA1PR12MB6579.namprd12.prod.outlook.com (2603:10b6:208:3a1::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7270.8; Thu, 1 Feb 2024 12:30:19 +0000 Received: from CH2PEPF0000009D.namprd02.prod.outlook.com (2603:10b6:610:118:cafe::8a) by CH0PR03CA0321.outlook.office365.com (2603:10b6:610:118::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.26 via Frontend Transport; Thu, 1 Feb 2024 12:30:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CH2PEPF0000009D.mail.protection.outlook.com (10.167.244.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.19 via Frontend Transport; Thu, 1 Feb 2024 12:30:19 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 1 Feb 2024 04:30:08 -0800 Received: from nvidia.com (10.126.231.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 1 Feb 2024 04:30:05 -0800 From: Suanming Mou To: , Dariusz Sosnowski , Viacheslav Ovsiienko , Ori Kam , Matan Azrad CC: Subject: [PATCH v5 3/3] net/mlx5: add compare item support Date: Thu, 1 Feb 2024 20:29:22 +0800 Message-ID: <20240201122922.474250-4-suanmingm@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240201122922.474250-1-suanmingm@nvidia.com> References: <20231214031227.363911-1-suanmingm@nvidia.com> <20240201122922.474250-1-suanmingm@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.231.35] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF0000009D:EE_|IA1PR12MB6579:EE_ X-MS-Office365-Filtering-Correlation-Id: 6e38fa64-e686-4728-cb68-08dc23218d92 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N3PhEnrRqXQGEx5vVcwMvNEars+slQAImdMs3MjuPFFn9xA6ofUePCELZ92EsB2YzYQuDNxiLNO7id7k9jpR2W7ecthgzq1WOUeFxwT7NcwxspDavqke0NzePoKyJt+nzgmFjc/UVvtBTRbiyM4xPbUYMAC9lMF5XB0p0DPRjamDXpR27106cMDjsR11XGIgm8ZRajkdvkFvP6y0MWuLoWIx8X/orVmexCNMzStamZ54XYMFozCC4tRqZawEQ4tXSnnqvULGsC3Ey8pd488RKUtLz2igTUpY8X8t5LkFwS1cP8ythJkIks3tvZYpdGJWovbgk064D2A4MWv4/jllxLhKhWe4G6/rv2aHJ/rFeXaNU+CPimtmOr87AZJ/OTJ8q9Kt3G9z7A9vLYSZzkOITNK5S5W7u76NkeS17ei1cJGaBB06RnHpSOeOS8RBjFgY4T87Qwd4DfKD91oGVwGFtl9VovHpyxulHF7ggAkpPv7Rmn2teZNPwAOt8QVppoLULiSjFE9w5U1ke9zKvhrWBDMfPrJ891Eojc+lpWMSP3RfXJV5/tMhCH1o+IRAZkp4ciB/+TiqgaKXQo/+WomHsT96hjvq8dX+GECHL4ch2qqO8kX5nsV1Q4bJ3Bi7lq7gZWQKQbtCqM+YbgqJVXhFrWBg3riXXm+Gq6X7JOGYebdxXVe5iBsPLcYuN9+ztQIbZII1FAs4+uqlx9oCBvtI8rp2lUB0Bwq/reGGjOtuVAf1003WwDwYfhqSDcgDT/RF X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230031)(4636009)(346002)(376002)(136003)(39860400002)(396003)(230922051799003)(186009)(82310400011)(451199024)(64100799003)(1800799012)(46966006)(40470700004)(36840700001)(41300700001)(36860700001)(47076005)(8936002)(8676002)(4326008)(70206006)(2906002)(5660300002)(86362001)(70586007)(110136005)(36756003)(6636002)(7636003)(83380400001)(82740400003)(356005)(316002)(7696005)(478600001)(6666004)(1076003)(336012)(426003)(16526019)(40480700001)(40460700003)(26005)(6286002)(2616005)(55016003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2024 12:30:19.4306 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6e38fa64-e686-4728-cb68-08dc23218d92 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CH2PEPF0000009D.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6579 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 The compare item allows adding flow match with comparison result. This commit adds compare item support to the PMD code. Due to HW limitation: - Only HWS supported. - Only 32-bit comparison is supported. - Only single compare flow is supported in the flow table. - Only match with compare result between packet fields is supported. Signed-off-by: Suanming Mou Acked-by: Ori Kam --- doc/guides/nics/features/mlx5.ini | 1 + doc/guides/nics/mlx5.rst | 7 +++ doc/guides/rel_notes/release_24_03.rst | 2 + drivers/net/mlx5/mlx5_flow.h | 3 ++ drivers/net/mlx5/mlx5_flow_hw.c | 73 ++++++++++++++++++++++++++ 5 files changed, 86 insertions(+) diff --git a/doc/guides/nics/features/mlx5.ini b/doc/guides/nics/features/mlx5.ini index 0739fe9d63..00e9348fc6 100644 --- a/doc/guides/nics/features/mlx5.ini +++ b/doc/guides/nics/features/mlx5.ini @@ -56,6 +56,7 @@ Usage doc = Y [rte_flow items] aggr_affinity = Y +compare = Y conntrack = Y ecpri = Y esp = Y diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index 6b52fb93c5..18b40bc22d 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -778,6 +778,13 @@ Limitations The flow engine of a process cannot move from active to standby mode if preceding active application rules are still present and vice versa. +- Match with compare result item (``RTE_FLOW_ITEM_TYPE_COMPARE``): + + - Only supported in HW steering(``dv_flow_en`` = 2) mode. + - Only single flow is supported to the flow table. + - Only 32-bit comparison is supported. + - Only match with compare result between packet fields is supported. + Statistics ---------- diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst index ffceab59e4..91b2cafb00 100644 --- a/doc/guides/rel_notes/release_24_03.rst +++ b/doc/guides/rel_notes/release_24_03.rst @@ -80,6 +80,8 @@ New Features * Added support for Atomic Rules' TK242 packet-capture family of devices with PCI IDs: ``0x1024, 0x1025, 0x1026``. + * Added support for comparing result between packet fields or value. + Removed Items ------------- diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index ecfb04ead2..f0a11949e6 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -277,6 +277,9 @@ enum mlx5_feature_name { /* NSH ITEM */ #define MLX5_FLOW_ITEM_NSH (1ull << 53) +/* COMPARE ITEM */ +#define MLX5_FLOW_ITEM_COMPARE (1ull << 54) + /* Outer Masks. */ #define MLX5_FLOW_LAYER_OUTER_L3 \ (MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6) diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c index da873ae2e2..f21c22131c 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -426,6 +426,9 @@ flow_hw_matching_item_flags_get(const struct rte_flow_item items[]) case RTE_FLOW_ITEM_TYPE_GTP: last_item = MLX5_FLOW_LAYER_GTP; break; + case RTE_FLOW_ITEM_TYPE_COMPARE: + last_item = MLX5_FLOW_ITEM_COMPARE; + break; default: break; } @@ -4386,6 +4389,8 @@ flow_hw_table_create(struct rte_eth_dev *dev, rte_errno = EINVAL; goto it_error; } + if (item_templates[i]->item_flags & MLX5_FLOW_ITEM_COMPARE) + matcher_attr.mode = MLX5DR_MATCHER_RESOURCE_MODE_HTABLE; ret = __atomic_fetch_add(&item_templates[i]->refcnt, 1, __ATOMIC_RELAXED) + 1; if (ret <= 1) { @@ -6634,6 +6639,66 @@ flow_hw_prepend_item(const struct rte_flow_item *items, return copied_items; } +static inline bool +flow_hw_item_compare_field_supported(enum rte_flow_field_id field) +{ + switch (field) { + case RTE_FLOW_FIELD_TAG: + case RTE_FLOW_FIELD_META: + case RTE_FLOW_FIELD_VALUE: + return true; + default: + break; + } + return false; +} + +static int +flow_hw_validate_item_compare(const struct rte_flow_item *item, + struct rte_flow_error *error) +{ + const struct rte_flow_item_compare *comp_m = item->mask; + const struct rte_flow_item_compare *comp_v = item->spec; + + if (unlikely(!comp_m)) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "compare item mask is missing"); + if (comp_m->width != UINT32_MAX) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "compare item only support full mask"); + if (!flow_hw_item_compare_field_supported(comp_m->a.field) || + !flow_hw_item_compare_field_supported(comp_m->b.field)) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "compare item field not support"); + if (comp_m->a.field == RTE_FLOW_FIELD_VALUE && + comp_m->b.field == RTE_FLOW_FIELD_VALUE) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "compare between value is not valid"); + if (comp_v) { + if (comp_v->operation != comp_m->operation || + comp_v->a.field != comp_m->a.field || + comp_v->b.field != comp_m->b.field) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "compare item spec/mask not matching"); + if ((comp_v->width & comp_m->width) != 32) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "compare item only support full mask"); + } + return 0; +} + static int flow_hw_pattern_validate(struct rte_eth_dev *dev, const struct rte_flow_pattern_template_attr *attr, @@ -6644,6 +6709,7 @@ flow_hw_pattern_validate(struct rte_eth_dev *dev, int i, tag_idx; bool items_end = false; uint32_t tag_bitmap = 0; + int ret; if (!attr->ingress && !attr->egress && !attr->transfer) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR, NULL, @@ -6781,6 +6847,13 @@ flow_hw_pattern_validate(struct rte_eth_dev *dev, " attribute"); break; } + case RTE_FLOW_ITEM_TYPE_COMPARE: + { + ret = flow_hw_validate_item_compare(&items[i], error); + if (ret) + return ret; + break; + } case RTE_FLOW_ITEM_TYPE_VOID: case RTE_FLOW_ITEM_TYPE_ETH: case RTE_FLOW_ITEM_TYPE_VLAN: