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 113F746B72 for ; Mon, 14 Jul 2025 17:12:12 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E209D40430; Mon, 14 Jul 2025 17:12:11 +0200 (CEST) Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by mails.dpdk.org (Postfix) with ESMTP id 3FA6D4042F for ; Mon, 14 Jul 2025 17:12:11 +0200 (CEST) Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-3a575a988f9so2548005f8f.0 for ; Mon, 14 Jul 2025 08:12:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752505931; x=1753110731; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kleOHZDhDGMG0f7eZkYRh/EUFMTILTtB4Aj1egr/HZk=; b=FvDM/0stYkcoLT3fqxF7QUm0nl4m5B8DLnuoYILcqQ8ebQ7YwpunVzquNxe3WSUp24 1UFt+e7v5hFgIDfJHUbtF9nwBNXNiHOj2Rf0yjsxJxAKr2MBpaCVLSCgxOvY6CiVlltE uh1WMS/MKWfJRgB7wyqiqMRa6QVW707b9f0kVsjvxXegSoAsipbvY0wwM7+D3qK/t6Eq KlEOMpcBXKrtponlshw648ynbOiWRnyoOzlg9tYxqAFav2wG/91RvPf8bs+jUVwkT+7T LV9UIvToNFrqhWzPvgl5Llfrrf5XxYi00bZSsskGecmHjuqKgJ0NElUJXzmKE/VIAzDE VIWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752505931; x=1753110731; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kleOHZDhDGMG0f7eZkYRh/EUFMTILTtB4Aj1egr/HZk=; b=qLFAwnDOwlYd6Ihnc2cBBe2KvQRyrh2RkTVdUK3xgOKWKOZQqmK7gT2MGM28UOy6YQ eoLLOdRG84zgCFNtX3UzqAc3xwI7y2azQ9lujdmQI7efzBIIHuq+PeAVPDkf84ZSL0cb eBAIQiotmuZtX7z3eyNeT7JmRrH7C02S8gsyXiMnAuT4FT2gVIJemEWBVhSa5uJg7bN1 OgrXTJQdlR9yE/4hdRqdGe+EOqRYA7zoselW8o02bdfNRO09q8gq3/ZCii3VTBcfDp68 4MQL+19YzonSf+QCFUBTcZyugipjgOpziaOwRE70tNxkv9udIKUFKmbrVUaJtux6LPPX 4hIA== X-Gm-Message-State: AOJu0YwXobYV2ynmnuvM4gUQ3DLE8YO3RNouC1XZEwarvgF+n/VzIhM3 y86CChf5cD+pagUqD/pguS0WDGQ3JSo1Q1oq5gd14N8hZPa8Wu5yFZNnfdsjL/x7 X-Gm-Gg: ASbGnctbKAUHXFmdaUAhl8rS866ApMsEm7vkWMRllqaQW/nmmLSHNb6TSuCxUqWyvv9 nr6bmoVIbm174Zywbvp5wHQHXLnVHKoaRDKNfrUHRxz41yUERijX5TcL6lfsuHdn+u63xpFPZpF nOsjgy6W3pKZH+Ran5aHT0orc3gDarP1c5YAeoXKX5C4Wh8eDqwCcStueGXyf8BhsnlA4c5wLuC hznEex0uMwmylBNnjPa7eKXXP7Q3vu52iAijGqP54ZFBNjuo0sieFZd/AvQivI7MyrOLU/4Qkqc 8niTpmhWemy3qmo7CIO/E3xYHYkJUBkXVQBuM5kbvZsalvNhD0+I3feKxs8AtP2c1lRF5OwIICk EZBlTNuB2fPx+Ykm7iZCAgYolOW/L X-Google-Smtp-Source: AGHT+IEktLbL15QU5464UdfJqEQZNxs+ZLyZuXWLIvnm4EEMc1hs+fNOXnXaaT21geRRhXsLeWiQdQ== X-Received: by 2002:a5d:64a8:0:b0:3a5:1c71:432a with SMTP id ffacd0b85a97d-3b5f1880597mr9518124f8f.14.1752505930520; Mon, 14 Jul 2025 08:12:10 -0700 (PDT) Received: from localhost ([2a01:4b00:d036:ae00:a923:75e5:f97f:ef33]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-3b5e8e269a0sm12518114f8f.86.2025.07.14.08.12.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Jul 2025 08:12:09 -0700 (PDT) From: luca.boccassi@gmail.com To: Jiawen Wu Cc: dpdk stable Subject: patch 'net/txgbe: fix raw pattern match for FDIR rule' has been queued to stable release 22.11.9 Date: Mon, 14 Jul 2025 16:10:57 +0100 Message-ID: <20250714151121.219866-2-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250714151121.219866-1-luca.boccassi@gmail.com> References: <20250630122556.1133654-23-luca.boccassi@gmail.com> <20250714151121.219866-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 22.11.9 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/16/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/bluca/dpdk-stable This queued commit can be viewed at: https://github.com/bluca/dpdk-stable/commit/e3b14717d8ee3377dcbe977f848b644bd110f2f7 Thanks. Luca Boccassi --- >From e3b14717d8ee3377dcbe977f848b644bd110f2f7 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 4625236cb7..448826d32d 100644 --- a/drivers/net/txgbe/txgbe_ethdev.h +++ b/drivers/net/txgbe/txgbe_ethdev.h @@ -114,11 +114,13 @@ struct txgbe_fdir_rule { uint32_t soft_id; /* an unique value for this rule */ uint8_t queue; /* assigned rx queue */ uint8_t flex_bytes_offset; + bool flex_relative; }; 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; uint16_t maxhash; @@ -551,8 +553,9 @@ 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, bool del, bool update); 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 @@ -258,9 +258,24 @@ txgbe_fdir_store_input_mask(struct rte_eth_dev *dev) return 0; } +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); int i; @@ -268,7 +283,7 @@ txgbe_fdir_set_flexbytes_offset(struct rte_eth_dev *dev, for (i = 0; i < 64; i++) { 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)); flexreg |= TXGBE_FDIRFLEXCFG_ALL(flex, i % 4); @@ -910,6 +925,11 @@ txgbe_fdir_flush(struct rte_eth_dev *dev) info->add = 0; 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 4186562665..4c01435352 100644 --- a/drivers/net/txgbe/txgbe_flow.c +++ b/drivers/net/txgbe/txgbe_flow.c @@ -2066,6 +2066,8 @@ 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) { rte_flow_error_set(error, EINVAL, @@ -2082,6 +2084,7 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, return -rte_errno; } + rule->b_mask = TRUE; raw_mask = item->mask; /* check mask */ @@ -2098,19 +2101,21 @@ txgbe_parse_fdir_filter_normal(struct rte_eth_dev *dev __rte_unused, return -rte_errno; } + 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, RTE_FLOW_ERROR_TYPE_ITEM, @@ -2120,7 +2125,9 @@ 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, RTE_FLOW_ERROR_TYPE_ITEM, @@ -2129,10 +2136,19 @@ 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; } if (item->type != RTE_FLOW_ITEM_TYPE_END) { @@ -2833,10 +2849,16 @@ txgbe_flow_create(struct rte_eth_dev *dev, sizeof(struct txgbe_hw_fdir_mask)); 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); if (ret) @@ -2858,7 +2880,9 @@ 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; } } @@ -3086,8 +3110,13 @@ txgbe_flow_destroy(struct rte_eth_dev *dev, TAILQ_REMOVE(&filter_fdir_list, 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; case RTE_ETH_FILTER_L2_TUNNEL: -- 2.47.2 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2025-07-14 16:09:40.802995103 +0100 +++ 0002-net-txgbe-fix-raw-pattern-match-for-FDIR-rule.patch 2025-07-14 16:09:40.680448281 +0100 @@ -1 +1 @@ -From aa4974765499225e13225190a0dc6adaab785c80 Mon Sep 17 00:00:00 2001 +From e3b14717d8ee3377dcbe977f848b644bd110f2f7 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 4625236cb7..448826d32d 100644 @@ -25 +26 @@ -@@ -116,11 +116,13 @@ struct txgbe_fdir_rule { +@@ -114,11 +114,13 @@ struct txgbe_fdir_rule { @@ -39 +40 @@ -@@ -561,8 +563,9 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction, +@@ -551,8 +553,9 @@ void txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction, @@ -102 +103 @@ -index 269f0b54e3..8670c3e1d7 100644 +index 4186562665..4c01435352 100644 @@ -182,2 +183,2 @@ -@@ -2836,10 +2852,16 @@ txgbe_flow_create(struct rte_eth_dev *dev, - fdir_info->mask = fdir_rule.mask; +@@ -2833,10 +2849,16 @@ txgbe_flow_create(struct rte_eth_dev *dev, + sizeof(struct txgbe_hw_fdir_mask)); @@ -201 +202 @@ -@@ -2861,7 +2883,9 @@ txgbe_flow_create(struct rte_eth_dev *dev, +@@ -2858,7 +2880,9 @@ txgbe_flow_create(struct rte_eth_dev *dev, @@ -212 +213 @@ -@@ -3089,8 +3113,13 @@ txgbe_flow_destroy(struct rte_eth_dev *dev, +@@ -3086,8 +3110,13 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,