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 AA84946BAE for ; Fri, 18 Jul 2025 21:37:49 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A246140B8F; Fri, 18 Jul 2025 21:37:49 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 7379B40611 for ; Fri, 18 Jul 2025 21:37:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752867468; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=alXuF1EVp55X5STTUCycAQpkzdVTRmLB8qMkosgDRFs=; b=e7FO3i0sEQKUtA1b5GKvNJd1iZD1qtlASd/iCtTU0zB94icBUhDIgTSrfwZmKZEkHIrCzX EWwozq5Ya5TWSv9eYX3IBZnnMbI06dGI1JUVy7oKJPVtK90bBbPlH9YH2i+vcjxobvx0dH zKO/qWtW+qd7bdKqNsvwatHSATFh/zE= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-130-pocdrOfRMOu1TOO83KLRLg-1; Fri, 18 Jul 2025 15:37:41 -0400 X-MC-Unique: pocdrOfRMOu1TOO83KLRLg-1 X-Mimecast-MFC-AGG-ID: pocdrOfRMOu1TOO83KLRLg_1752867461 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EC9C5195FCC2; Fri, 18 Jul 2025 19:37:40 +0000 (UTC) Received: from rh.redhat.com (unknown [10.44.32.40]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A26E3180049D; Fri, 18 Jul 2025 19:37:39 +0000 (UTC) From: Kevin Traynor To: Jiawen Wu Cc: dpdk stable Subject: patch 'net/txgbe: fix raw pattern match for FDIR rule' has been queued to stable release 24.11.3 Date: Fri, 18 Jul 2025 20:31:12 +0100 Message-ID: <20250718193247.1008129-138-ktraynor@redhat.com> In-Reply-To: <20250718193247.1008129-1-ktraynor@redhat.com> References: <20250718193247.1008129-1-ktraynor@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: guP5kVBaoMqqqXgI3tcXfa2XfFYsiYaV3CFXnLRWbWM_1752867461 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit content-type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Hi, FYI, your patch has been queued to stable release 24.11.3 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 07/23/25. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable/commit/cac9d1b2e71b6bcf4c9603f6a92eed5f38f1681c Thanks. Kevin --- >From cac9d1b2e71b6bcf4c9603f6a92eed5f38f1681c Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Fri, 13 Jun 2025 16:41:45 +0800 Subject: [PATCH] net/txgbe: fix raw pattern match for FDIR rule [ upstream commit aa4974765499225e13225190a0dc6adaab785c80 ] The raw pattern is required to be two hex bytes on hardware, but it is string in the raw item. So the length of raw spec should be 4, and the string should be converted to the two hex bytes. And relative of raw spec is supported to be optical. Fixes: b973ee26747a ("net/txgbe: parse flow director filter") Signed-off-by: Jiawen Wu --- drivers/net/txgbe/txgbe_ethdev.h | 5 ++- drivers/net/txgbe/txgbe_fdir.c | 24 +++++++++++++-- drivers/net/txgbe/txgbe_flow.c | 53 ++++++++++++++++++++++++-------- 3 files changed, 67 insertions(+), 15 deletions(-) diff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h index 302ea9f037..50a81ca1ec 100644 --- a/drivers/net/txgbe/txgbe_ethdev.h +++ b/drivers/net/txgbe/txgbe_ethdev.h @@ -117,4 +117,5 @@ struct txgbe_fdir_rule { uint8_t queue; /* assigned rx queue */ uint8_t flex_bytes_offset; + bool flex_relative; }; @@ -122,4 +123,5 @@ struct txgbe_hw_fdir_info { struct txgbe_hw_fdir_mask mask; uint8_t flex_bytes_offset; + bool flex_relative; uint16_t collision; uint16_t free; @@ -557,6 +559,7 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction, int txgbe_fdir_configure(struct rte_eth_dev *dev); int txgbe_fdir_set_input_mask(struct rte_eth_dev *dev); +uint16_t txgbe_fdir_get_flex_base(struct txgbe_fdir_rule *rule); int txgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev, - uint16_t offset); + uint16_t offset, uint16_t flex_base); int txgbe_fdir_filter_program(struct rte_eth_dev *dev, struct txgbe_fdir_rule *rule, diff --git a/drivers/net/txgbe/txgbe_fdir.c b/drivers/net/txgbe/txgbe_fdir.c index f627ab681d..75bf30c00c 100644 --- a/drivers/net/txgbe/txgbe_fdir.c +++ b/drivers/net/txgbe/txgbe_fdir.c @@ -259,7 +259,22 @@ txgbe_fdir_store_input_mask(struct rte_eth_dev *dev) } +uint16_t +txgbe_fdir_get_flex_base(struct txgbe_fdir_rule *rule) +{ + if (!rule->flex_relative) + return TXGBE_FDIRFLEXCFG_BASE_MAC; + + if (rule->input.flow_type & TXGBE_ATR_L4TYPE_MASK) + return TXGBE_FDIRFLEXCFG_BASE_PAY; + + if (rule->input.flow_type & TXGBE_ATR_L3TYPE_MASK) + return TXGBE_FDIRFLEXCFG_BASE_L3; + + return TXGBE_FDIRFLEXCFG_BASE_L2; +} + int txgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev, - uint16_t offset) + uint16_t offset, uint16_t flex_base) { struct txgbe_hw *hw = TXGBE_DEV_HW(dev); @@ -269,5 +284,5 @@ txgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev, uint32_t flexreg, flex; flexreg = rd32(hw, TXGBE_FDIRFLEXCFG(i / 4)); - flex = TXGBE_FDIRFLEXCFG_BASE_MAC; + flex = flex_base; flex |= TXGBE_FDIRFLEXCFG_OFST(offset / 2); flexreg &= ~(TXGBE_FDIRFLEXCFG_ALL(~0UL, i % 4)); @@ -911,4 +926,9 @@ txgbe_fdir_flush(struct rte_eth_dev *dev) info->remove = 0; + memset(&info->mask, 0, sizeof(struct txgbe_hw_fdir_mask)); + info->mask_added = false; + info->flex_relative = false; + info->flex_bytes_offset = 0; + return ret; } diff --git a/drivers/net/txgbe/txgbe_flow.c b/drivers/net/txgbe/txgbe_flow.c index e0b1e1e5ba..210928a4fe 100644 --- a/drivers/net/txgbe/txgbe_flow.c +++ b/drivers/net/txgbe/txgbe_flow.c @@ -2067,4 +2067,6 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, /* Get the flex byte info */ if (item->type == RTE_FLOW_ITEM_TYPE_RAW) { + uint16_t pattern = 0; + /* Not supported last point for range*/ if (item->last) { @@ -2083,4 +2085,5 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, } + rule->b_mask = TRUE; raw_mask = item->mask; @@ -2099,17 +2102,19 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, } + rule->b_spec = TRUE; raw_spec = item->spec; /* check spec */ - if (raw_spec->relative != 0 || - raw_spec->search != 0 || + if (raw_spec->search != 0 || raw_spec->reserved != 0 || raw_spec->offset > TXGBE_MAX_FLX_SOURCE_OFF || raw_spec->offset % 2 || raw_spec->limit != 0 || - raw_spec->length != 2 || + raw_spec->length != 4 || /* pattern can't be 0xffff */ (raw_spec->pattern[0] == 0xff && - raw_spec->pattern[1] == 0xff)) { + raw_spec->pattern[1] == 0xff && + raw_spec->pattern[2] == 0xff && + raw_spec->pattern[3] == 0xff)) { memset(rule, 0, sizeof(struct txgbe_fdir_rule)); rte_flow_error_set(error, EINVAL, @@ -2121,5 +2126,7 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, /* check pattern mask */ if (raw_mask->pattern[0] != 0xff || - raw_mask->pattern[1] != 0xff) { + raw_mask->pattern[1] != 0xff || + raw_mask->pattern[2] != 0xff || + raw_mask->pattern[3] != 0xff) { memset(rule, 0, sizeof(struct txgbe_fdir_rule)); rte_flow_error_set(error, EINVAL, @@ -2130,8 +2137,17 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, rule->mask.flex_bytes_mask = 0xffff; - rule->input.flex_bytes = - (((uint16_t)raw_spec->pattern[1]) << 8) | - raw_spec->pattern[0]; + /* Convert pattern string to hex bytes */ + if (sscanf((const char *)raw_spec->pattern, "%hx", &pattern) != 1) { + memset(rule, 0, sizeof(struct txgbe_fdir_rule)); + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, "Failed to parse raw pattern"); + return -rte_errno; + } + rule->input.flex_bytes = (pattern & 0x00FF) << 8; + rule->input.flex_bytes |= (pattern & 0xFF00) >> 8; + rule->flex_bytes_offset = raw_spec->offset; + rule->flex_relative = raw_spec->relative; } @@ -2834,8 +2850,14 @@ txgbe_flow_create(struct rte_eth_dev *dev, fdir_info->flex_bytes_offset = fdir_rule.flex_bytes_offset; + fdir_info->flex_relative = fdir_rule.flex_relative; - if (fdir_rule.mask.flex_bytes_mask) + if (fdir_rule.mask.flex_bytes_mask) { + uint16_t flex_base; + + flex_base = txgbe_fdir_get_flex_base(&fdir_rule); txgbe_fdir_set_flexbytes_offset(dev, - fdir_rule.flex_bytes_offset); + fdir_rule.flex_bytes_offset, + flex_base); + } ret = txgbe_fdir_set_input_mask(dev); @@ -2859,5 +2881,7 @@ txgbe_flow_create(struct rte_eth_dev *dev, if (fdir_info->flex_bytes_offset != - fdir_rule.flex_bytes_offset) + fdir_rule.flex_bytes_offset || + fdir_info->flex_relative != + fdir_rule.flex_relative) goto out; } @@ -3087,6 +3111,11 @@ txgbe_flow_destroy(struct rte_eth_dev *dev, fdir_rule_ptr, entries); rte_free(fdir_rule_ptr); - if (TAILQ_EMPTY(&filter_fdir_list)) + if (TAILQ_EMPTY(&filter_fdir_list)) { + memset(&fdir_info->mask, 0, + sizeof(struct txgbe_hw_fdir_mask)); fdir_info->mask_added = false; + fdir_info->flex_relative = false; + fdir_info->flex_bytes_offset = 0; + } } break; -- 2.50.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2025-07-18 20:29:15.879656568 +0100 +++ 0138-net-txgbe-fix-raw-pattern-match-for-FDIR-rule.patch 2025-07-18 20:29:11.101907855 +0100 @@ -1 +1 @@ -From aa4974765499225e13225190a0dc6adaab785c80 Mon Sep 17 00:00:00 2001 +From cac9d1b2e71b6bcf4c9603f6a92eed5f38f1681c Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit aa4974765499225e13225190a0dc6adaab785c80 ] + @@ -12 +13,0 @@ -Cc: stable@dpdk.org @@ -22 +23 @@ -index 36d51fcbb8..0a3c634937 100644 +index 302ea9f037..50a81ca1ec 100644 @@ -37 +38 @@ -@@ -562,6 +564,7 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction, +@@ -557,6 +559,7 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction, @@ -92 +93 @@ -index 269f0b54e3..8670c3e1d7 100644 +index e0b1e1e5ba..210928a4fe 100644 @@ -162 +163 @@ -@@ -2837,8 +2853,14 @@ txgbe_flow_create(struct rte_eth_dev *dev, +@@ -2834,8 +2850,14 @@ txgbe_flow_create(struct rte_eth_dev *dev, @@ -179 +180 @@ -@@ -2862,5 +2884,7 @@ txgbe_flow_create(struct rte_eth_dev *dev, +@@ -2859,5 +2881,7 @@ txgbe_flow_create(struct rte_eth_dev *dev, @@ -188 +189 @@ -@@ -3090,6 +3114,11 @@ txgbe_flow_destroy(struct rte_eth_dev *dev, +@@ -3087,6 +3111,11 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,