patch 'net/intel: fix assumption about tag placement order' has been queued to stable release 23.11.6
Shani Peretz
shperetz at nvidia.com
Sun Dec 21 15:56:21 CET 2025
Hi,
FYI, your patch has been queued to stable release 23.11.6
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 12/26/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/shanipr/dpdk-stable
This queued commit can be viewed at:
https://github.com/shanipr/dpdk-stable/commit/da7ede080e148b05a6c3ba0dd6a30805557ffe22
Thanks.
Shani
---
>From da7ede080e148b05a6c3ba0dd6a30805557ffe22 Mon Sep 17 00:00:00 2001
From: Bruce Richardson <bruce.richardson at intel.com>
Date: Fri, 18 Jul 2025 16:43:12 +0100
Subject: [PATCH] net/intel: fix assumption about tag placement order
[ upstream commit 21168355589ea9edfcb2925f4952ecb05470f92f ]
The specific placement of outer/inner VLAN tags in NIC descriptors
is configurable. Therefore, remove the assumption that if the L2Tag2
field is filled in, that the L2Tag1 must also be. Instead, check the
existing mbuf VLAN flags, and move tags and set flags as appropriate.
This fixes an issue where, with QinQ packets with different Tag ethtypes
(0x88a8 vs 0x8100), we get an mbuf reporting two valid tags, but only
having had one tag stripped.
Fixes: cc9d0456b870 ("i40e: support double vlan stripping and insertion")
Fixes: 1e728b01120c ("net/iavf: rework Tx path")
Fixes: e0dcf94a0d7f ("net/ice: support VLAN ops")
Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
Acked-by: Ciara Loftus <ciara.loftus at intel.com>
---
drivers/net/i40e/i40e_rxtx.c | 10 +++++++---
drivers/net/iavf/iavf_rxtx.c | 12 +++++++-----
drivers/net/ice/ice_rxtx.c | 10 +++++++---
3 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 4dafc23bc1..338d6304c5 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -128,9 +128,13 @@ i40e_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union i40e_rx_desc *rxdp)
#ifndef RTE_LIBRTE_I40E_16BYTE_RX_DESC
if (rte_le_to_cpu_16(rxdp->wb.qword2.ext_status) &
(1 << I40E_RX_DESC_EXT_STATUS_L2TAG2P_SHIFT)) {
- mb->ol_flags |= RTE_MBUF_F_RX_QINQ_STRIPPED | RTE_MBUF_F_RX_QINQ |
- RTE_MBUF_F_RX_VLAN_STRIPPED | RTE_MBUF_F_RX_VLAN;
- mb->vlan_tci_outer = mb->vlan_tci;
+ if ((mb->ol_flags & RTE_MBUF_F_RX_VLAN_STRIPPED) == 0) {
+ mb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+ } else {
+ /* if two tags, move Tag1 to outer tag field */
+ mb->ol_flags |= RTE_MBUF_F_RX_QINQ_STRIPPED | RTE_MBUF_F_RX_QINQ;
+ mb->vlan_tci_outer = mb->vlan_tci;
+ }
mb->vlan_tci = rte_le_to_cpu_16(rxdp->wb.qword2.l2tag2_2);
PMD_RX_LOG(DEBUG, "Descriptor l2tag2_1: %u, l2tag2_2: %u",
rte_le_to_cpu_16(rxdp->wb.qword2.l2tag2_1),
diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
index 9237f65936..73418f2830 100644
--- a/drivers/net/iavf/iavf_rxtx.c
+++ b/drivers/net/iavf/iavf_rxtx.c
@@ -1200,11 +1200,13 @@ iavf_flex_rxd_to_vlan_tci(struct rte_mbuf *mb,
#ifndef RTE_LIBRTE_IAVF_16BYTE_RX_DESC
if (rte_le_to_cpu_16(rxdp->wb.status_error1) &
(1 << IAVF_RX_FLEX_DESC_STATUS1_L2TAG2P_S)) {
- mb->ol_flags |= RTE_MBUF_F_RX_QINQ_STRIPPED |
- RTE_MBUF_F_RX_QINQ |
- RTE_MBUF_F_RX_VLAN_STRIPPED |
- RTE_MBUF_F_RX_VLAN;
- mb->vlan_tci_outer = mb->vlan_tci;
+ if ((mb->ol_flags & RTE_MBUF_F_RX_VLAN_STRIPPED) == 0) {
+ mb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+ } else {
+ /* if two tags, move Tag1 to outer tag field */
+ mb->ol_flags |= RTE_MBUF_F_RX_QINQ_STRIPPED | RTE_MBUF_F_RX_QINQ;
+ mb->vlan_tci_outer = mb->vlan_tci;
+ }
mb->vlan_tci = rte_le_to_cpu_16(rxdp->wb.l2tag2_2nd);
PMD_RX_LOG(DEBUG, "Descriptor l2tag2_1: %u, l2tag2_2: %u",
rte_le_to_cpu_16(rxdp->wb.l2tag2_1st),
diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
index 6af16f9aed..9c7d82b8f4 100644
--- a/drivers/net/ice/ice_rxtx.c
+++ b/drivers/net/ice/ice_rxtx.c
@@ -1659,9 +1659,13 @@ ice_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union ice_rx_flex_desc *rxdp)
#ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
if (rte_le_to_cpu_16(rxdp->wb.status_error1) &
(1 << ICE_RX_FLEX_DESC_STATUS1_L2TAG2P_S)) {
- mb->ol_flags |= RTE_MBUF_F_RX_QINQ_STRIPPED | RTE_MBUF_F_RX_QINQ |
- RTE_MBUF_F_RX_VLAN_STRIPPED | RTE_MBUF_F_RX_VLAN;
- mb->vlan_tci_outer = mb->vlan_tci;
+ if ((mb->ol_flags & RTE_MBUF_F_RX_VLAN_STRIPPED) == 0) {
+ mb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+ } else {
+ /* if two tags, move Tag1 to outer tag field */
+ mb->ol_flags |= RTE_MBUF_F_RX_QINQ_STRIPPED | RTE_MBUF_F_RX_QINQ;
+ mb->vlan_tci_outer = mb->vlan_tci;
+ }
mb->vlan_tci = rte_le_to_cpu_16(rxdp->wb.l2tag2_2nd);
PMD_RX_LOG(DEBUG, "Descriptor l2tag2_1: %u, l2tag2_2: %u",
rte_le_to_cpu_16(rxdp->wb.l2tag2_1st),
--
2.43.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2025-12-21 16:54:19.039875124 +0200
+++ 0033-net-intel-fix-assumption-about-tag-placement-order.patch 2025-12-21 16:54:16.959044000 +0200
@@ -1 +1 @@
-From 21168355589ea9edfcb2925f4952ecb05470f92f Mon Sep 17 00:00:00 2001
+From da7ede080e148b05a6c3ba0dd6a30805557ffe22 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 21168355589ea9edfcb2925f4952ecb05470f92f ]
+
@@ -17 +18,0 @@
-Cc: stable at dpdk.org
@@ -22,3 +23,3 @@
- drivers/net/intel/i40e/i40e_rxtx.c | 10 +++++++---
- drivers/net/intel/iavf/iavf_rxtx.c | 12 +++++++-----
- drivers/net/intel/ice/ice_rxtx.c | 10 +++++++---
+ drivers/net/i40e/i40e_rxtx.c | 10 +++++++---
+ drivers/net/iavf/iavf_rxtx.c | 12 +++++++-----
+ drivers/net/ice/ice_rxtx.c | 10 +++++++---
@@ -27,6 +28,6 @@
-diff --git a/drivers/net/intel/i40e/i40e_rxtx.c b/drivers/net/intel/i40e/i40e_rxtx.c
-index b149a4c127..50b74149e3 100644
---- a/drivers/net/intel/i40e/i40e_rxtx.c
-+++ b/drivers/net/intel/i40e/i40e_rxtx.c
-@@ -128,9 +128,13 @@ i40e_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union ci_rx_desc *rxdp)
- #ifndef RTE_NET_INTEL_USE_16BYTE_DESC
+diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
+index 4dafc23bc1..338d6304c5 100644
+--- a/drivers/net/i40e/i40e_rxtx.c
++++ b/drivers/net/i40e/i40e_rxtx.c
+@@ -128,9 +128,13 @@ i40e_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union i40e_rx_desc *rxdp)
+ #ifndef RTE_LIBRTE_I40E_16BYTE_RX_DESC
@@ -48,6 +49,6 @@
-diff --git a/drivers/net/intel/iavf/iavf_rxtx.c b/drivers/net/intel/iavf/iavf_rxtx.c
-index 50adc7ea1a..982e16f929 100644
---- a/drivers/net/intel/iavf/iavf_rxtx.c
-+++ b/drivers/net/intel/iavf/iavf_rxtx.c
-@@ -1184,11 +1184,13 @@ iavf_flex_rxd_to_vlan_tci(struct rte_mbuf *mb,
-
+diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
+index 9237f65936..73418f2830 100644
+--- a/drivers/net/iavf/iavf_rxtx.c
++++ b/drivers/net/iavf/iavf_rxtx.c
+@@ -1200,11 +1200,13 @@ iavf_flex_rxd_to_vlan_tci(struct rte_mbuf *mb,
+ #ifndef RTE_LIBRTE_IAVF_16BYTE_RX_DESC
@@ -71,6 +72,6 @@
-diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
-index 5e72c231f7..aa8b838955 100644
---- a/drivers/net/intel/ice/ice_rxtx.c
-+++ b/drivers/net/intel/ice/ice_rxtx.c
-@@ -1835,9 +1835,13 @@ ice_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union ci_rx_flex_desc *rxdp)
- #ifndef RTE_NET_INTEL_USE_16BYTE_DESC
+diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
+index 6af16f9aed..9c7d82b8f4 100644
+--- a/drivers/net/ice/ice_rxtx.c
++++ b/drivers/net/ice/ice_rxtx.c
+@@ -1659,9 +1659,13 @@ ice_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union ice_rx_flex_desc *rxdp)
+ #ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
More information about the stable
mailing list