Commit 38b22195 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

netdrv: don't truncate VLAN TCI with VLAN stripping

The vlan_hwaccel_{rx,receive_skb} functions expect the full TCI field
for priority mappings, don't truncate the upper 4 bits.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Acked-by: default avatarJeff Garzik <jgarzik@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4b5a698e
...@@ -4277,8 +4277,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, ...@@ -4277,8 +4277,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
if (unlikely(adapter->vlgrp && if (unlikely(adapter->vlgrp &&
(status & E1000_RXD_STAT_VP))) { (status & E1000_RXD_STAT_VP))) {
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->special) & le16_to_cpu(rx_desc->special));
E1000_RXD_SPC_VLAN_MASK);
} else { } else {
netif_receive_skb(skb); netif_receive_skb(skb);
} }
...@@ -4286,8 +4285,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, ...@@ -4286,8 +4285,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
if (unlikely(adapter->vlgrp && if (unlikely(adapter->vlgrp &&
(status & E1000_RXD_STAT_VP))) { (status & E1000_RXD_STAT_VP))) {
vlan_hwaccel_rx(skb, adapter->vlgrp, vlan_hwaccel_rx(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->special) & le16_to_cpu(rx_desc->special));
E1000_RXD_SPC_VLAN_MASK);
} else { } else {
netif_rx(skb); netif_rx(skb);
} }
...@@ -4464,16 +4462,14 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, ...@@ -4464,16 +4462,14 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
#ifdef CONFIG_E1000_NAPI #ifdef CONFIG_E1000_NAPI
if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->wb.middle.vlan) & le16_to_cpu(rx_desc->wb.middle.vlan));
E1000_RXD_SPC_VLAN_MASK);
} else { } else {
netif_receive_skb(skb); netif_receive_skb(skb);
} }
#else /* CONFIG_E1000_NAPI */ #else /* CONFIG_E1000_NAPI */
if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) { if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
vlan_hwaccel_rx(skb, adapter->vlgrp, vlan_hwaccel_rx(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->wb.middle.vlan) & le16_to_cpu(rx_desc->wb.middle.vlan));
E1000_RXD_SPC_VLAN_MASK);
} else { } else {
netif_rx(skb); netif_rx(skb);
} }
......
...@@ -98,8 +98,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter, ...@@ -98,8 +98,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,
if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(vlan) & le16_to_cpu(vlan));
E1000_RXD_SPC_VLAN_MASK);
else else
netif_receive_skb(skb); netif_receive_skb(skb);
......
...@@ -3391,8 +3391,7 @@ static void igb_receive_skb(struct igb_adapter *adapter, u8 status, __le16 vlan, ...@@ -3391,8 +3391,7 @@ static void igb_receive_skb(struct igb_adapter *adapter, u8 status, __le16 vlan,
{ {
if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(vlan) & le16_to_cpu(vlan));
E1000_RXD_SPC_VLAN_MASK);
else else
netif_receive_skb(skb); netif_receive_skb(skb);
} }
......
...@@ -2045,16 +2045,14 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) ...@@ -2045,16 +2045,14 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
#ifdef CONFIG_IXGB_NAPI #ifdef CONFIG_IXGB_NAPI
if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) { if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) {
vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->special) & le16_to_cpu(rx_desc->special));
IXGB_RX_DESC_SPECIAL_VLAN_MASK);
} else { } else {
netif_receive_skb(skb); netif_receive_skb(skb);
} }
#else /* CONFIG_IXGB_NAPI */ #else /* CONFIG_IXGB_NAPI */
if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) { if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) {
vlan_hwaccel_rx(skb, adapter->vlgrp, vlan_hwaccel_rx(skb, adapter->vlgrp,
le16_to_cpu(rx_desc->special) & le16_to_cpu(rx_desc->special));
IXGB_RX_DESC_SPECIAL_VLAN_MASK);
} else { } else {
netif_rx(skb); netif_rx(skb);
} }
......
...@@ -1510,7 +1510,7 @@ static int __netdev_rx(struct net_device *dev, int *quota) ...@@ -1510,7 +1510,7 @@ static int __netdev_rx(struct net_device *dev, int *quota)
if (debug > 4) if (debug > 4)
printk(KERN_DEBUG " netdev_rx() vlanid = %d\n", le16_to_cpu(desc->vlanid)); printk(KERN_DEBUG " netdev_rx() vlanid = %d\n", le16_to_cpu(desc->vlanid));
/* vlan_netdev_receive_skb() expects a packet with the VLAN tag stripped out */ /* vlan_netdev_receive_skb() expects a packet with the VLAN tag stripped out */
vlan_netdev_receive_skb(skb, np->vlgrp, le16_to_cpu(desc->vlanid) & VLAN_VID_MASK); vlan_netdev_receive_skb(skb, np->vlgrp, le16_to_cpu(desc->vlanid));
} else } else
#endif /* VLAN_SUPPORT */ #endif /* VLAN_SUPPORT */
netdev_receive_skb(skb); netdev_receive_skb(skb);
......
...@@ -1165,7 +1165,7 @@ NETIF_RX_MUX(struct bdx_priv *priv, u32 rxd_val1, u16 rxd_vlan, ...@@ -1165,7 +1165,7 @@ NETIF_RX_MUX(struct bdx_priv *priv, u32 rxd_val1, u16 rxd_vlan,
GET_RXD_VLAN_ID(rxd_vlan))->name); GET_RXD_VLAN_ID(rxd_vlan))->name);
/* NAPI variant of receive functions */ /* NAPI variant of receive functions */
vlan_hwaccel_receive_skb(skb, priv->vlgrp, vlan_hwaccel_receive_skb(skb, priv->vlgrp,
GET_RXD_VLAN_ID(rxd_vlan)); GET_RXD_VLAN_TCI(rxd_vlan));
} else { } else {
netif_receive_skb(skb); netif_receive_skb(skb);
} }
......
...@@ -309,6 +309,7 @@ struct rxf_desc { ...@@ -309,6 +309,7 @@ struct rxf_desc {
#define GET_RXD_PKT_ID(x) GET_BITS_SHIFT((x), 3, 28) #define GET_RXD_PKT_ID(x) GET_BITS_SHIFT((x), 3, 28)
#define GET_RXD_VTAG(x) GET_BITS_SHIFT((x), 1, 31) #define GET_RXD_VTAG(x) GET_BITS_SHIFT((x), 1, 31)
#define GET_RXD_VLAN_ID(x) GET_BITS_SHIFT((x), 12, 0) #define GET_RXD_VLAN_ID(x) GET_BITS_SHIFT((x), 12, 0)
#define GET_RXD_VLAN_TCI(x) GET_BITS_SHIFT((x), 16, 0)
#define GET_RXD_CFI(x) GET_BITS_SHIFT((x), 1, 12) #define GET_RXD_CFI(x) GET_BITS_SHIFT((x), 1, 12)
#define GET_RXD_PRIO(x) GET_BITS_SHIFT((x), 3, 13) #define GET_RXD_PRIO(x) GET_BITS_SHIFT((x), 3, 13)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment