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: Patrick McHardy <kaber@trash.net> Acked-by: Jeff Garzik <jgarzik@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
4b5a698ef4
Коммит
38b221957b
|
@ -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 @@ copydone:
|
|||
#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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1165,7 +1165,7 @@ NETIF_RX_MUX(struct bdx_priv *priv, u32 rxd_val1, u16 rxd_vlan,
|
|||
GET_RXD_VLAN_ID(rxd_vlan))->name);
|
||||
/* NAPI variant of receive functions */
|
||||
vlan_hwaccel_receive_skb(skb, priv->vlgrp,
|
||||
GET_RXD_VLAN_ID(rxd_vlan));
|
||||
GET_RXD_VLAN_TCI(rxd_vlan));
|
||||
} else {
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
|
|
@ -309,6 +309,7 @@ struct rxf_desc {
|
|||
#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_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_PRIO(x) GET_BITS_SHIFT((x), 3, 13)
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче