In Double VLAN Mode (DVM), the hardware switch recipe
ICE_SW_LKUP_VLAN matches on both the VLAN ID and the TPID.
Previously, ice_vlan_filter_set() always initialized the VLAN
filter with the hardcoded RTE_ETHER_TYPE_VLAN (0x8100), regardless
of the outer TPID configured by the user via vlan_tpid_set().
This caused a mismatch when a non-standard outer TPID such as
0x88a8 (IEEE 802.1ad) was configured: the hardware filter was
programmed with TPID 0x8100 while incoming packets carried TPID
0x88a8, resulting in all such packets being dropped by the VLAN
pruning logic.
Fix this by replacing the hardcoded RTE_ETHER_TYPE_VLAN with
pf->outer_ethertype in the ICE_VLAN() macro call. This field is
already updated by ice_vlan_tpid_set() when the user configures
the outer TPID, and defaults to RTE_ETHER_TYPE_VLAN at
initialization, so the change is safe for standard 802.1q traffic.
In SVM, the TPID is not part of the hardware lookup key, so this
change has no functional impact in that mode.
Fixes: 295b34f55b00 ("net/ice: fix VLAN 0 adding based on VLAN mode")
Cc: [email protected]
Signed-off-by: KAVYA AV <[email protected]>
---
drivers/net/intel/ice/ice_ethdev.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/intel/ice/ice_ethdev.c
b/drivers/net/intel/ice/ice_ethdev.c
index 0f2e7aee14..eaf3354000 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -5038,7 +5038,8 @@ static int
ice_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
{
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
- struct ice_vlan vlan = ICE_VLAN(RTE_ETHER_TYPE_VLAN, vlan_id);
+ /* Use the configured outer_ethertype instead of hardcoded 0x8100 */
+ struct ice_vlan vlan = ICE_VLAN(pf->outer_ethertype, vlan_id);
struct ice_vsi *vsi = pf->main_vsi;
int ret;
--
2.43.0