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

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
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -4277,8 +4277,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
		if (unlikely(adapter->vlgrp &&
			    (status & E1000_RXD_STAT_VP))) {
			vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
						 le16_to_cpu(rx_desc->special) &
						 E1000_RXD_SPC_VLAN_MASK);
						 le16_to_cpu(rx_desc->special));
		} else {
			netif_receive_skb(skb);
		}
@@ -4286,8 +4285,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
		if (unlikely(adapter->vlgrp &&
			    (status & E1000_RXD_STAT_VP))) {
			vlan_hwaccel_rx(skb, adapter->vlgrp,
					le16_to_cpu(rx_desc->special) &
					E1000_RXD_SPC_VLAN_MASK);
					le16_to_cpu(rx_desc->special));
		} else {
			netif_rx(skb);
		}
@@ -4464,16 +4462,14 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
#ifdef CONFIG_E1000_NAPI
		if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
			vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
				le16_to_cpu(rx_desc->wb.middle.vlan) &
				E1000_RXD_SPC_VLAN_MASK);
				le16_to_cpu(rx_desc->wb.middle.vlan));
		} else {
			netif_receive_skb(skb);
		}
#else /* CONFIG_E1000_NAPI */
		if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
			vlan_hwaccel_rx(skb, adapter->vlgrp,
				le16_to_cpu(rx_desc->wb.middle.vlan) &
				E1000_RXD_SPC_VLAN_MASK);
				le16_to_cpu(rx_desc->wb.middle.vlan));
		} else {
			netif_rx(skb);
		}
+1 −2
Original line number Diff line number Diff line
@@ -98,8 +98,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,

	if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
		vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
					 le16_to_cpu(vlan) &
					 E1000_RXD_SPC_VLAN_MASK);
					 le16_to_cpu(vlan));
	else
		netif_receive_skb(skb);

+1 −2
Original line number Diff line number Diff line
@@ -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))
		vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
					 le16_to_cpu(vlan) &
					 E1000_RXD_SPC_VLAN_MASK);
					 le16_to_cpu(vlan));
	else
		netif_receive_skb(skb);
}
+2 −4
Original line number Diff line number Diff line
@@ -2045,16 +2045,14 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
#ifdef CONFIG_IXGB_NAPI
		if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) {
			vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
				le16_to_cpu(rx_desc->special) &
					IXGB_RX_DESC_SPECIAL_VLAN_MASK);
				le16_to_cpu(rx_desc->special));
		} else {
			netif_receive_skb(skb);
		}
#else /* CONFIG_IXGB_NAPI */
		if(adapter->vlgrp && (status & IXGB_RX_DESC_STATUS_VP)) {
			vlan_hwaccel_rx(skb, adapter->vlgrp,
				le16_to_cpu(rx_desc->special) &
					IXGB_RX_DESC_SPECIAL_VLAN_MASK);
				le16_to_cpu(rx_desc->special));
		} else {
			netif_rx(skb);
		}
+1 −1
Original line number Diff line number Diff line
@@ -1510,7 +1510,7 @@ static int __netdev_rx(struct net_device *dev, int *quota)
			if (debug > 4)
				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(skb, np->vlgrp, le16_to_cpu(desc->vlanid) & VLAN_VID_MASK);
			vlan_netdev_receive_skb(skb, np->vlgrp, le16_to_cpu(desc->vlanid));
		} else
#endif /* VLAN_SUPPORT */
			netdev_receive_skb(skb);
Loading