aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 660dd41aaaa6..1dad6c0926f2 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1648,10 +1648,10 @@ EXPORT_SYMBOL(netif_device_attach);
1648 1648
1649static bool can_checksum_protocol(unsigned long features, __be16 protocol) 1649static bool can_checksum_protocol(unsigned long features, __be16 protocol)
1650{ 1650{
1651 return ((features & NETIF_F_GEN_CSUM) || 1651 return ((features & NETIF_F_NO_CSUM) ||
1652 ((features & NETIF_F_IP_CSUM) && 1652 ((features & NETIF_F_V4_CSUM) &&
1653 protocol == htons(ETH_P_IP)) || 1653 protocol == htons(ETH_P_IP)) ||
1654 ((features & NETIF_F_IPV6_CSUM) && 1654 ((features & NETIF_F_V6_CSUM) &&
1655 protocol == htons(ETH_P_IPV6)) || 1655 protocol == htons(ETH_P_IPV6)) ||
1656 ((features & NETIF_F_FCOE_CRC) && 1656 ((features & NETIF_F_FCOE_CRC) &&
1657 protocol == htons(ETH_P_FCOE))); 1657 protocol == htons(ETH_P_FCOE)));
@@ -2891,6 +2891,15 @@ static int __netif_receive_skb(struct sk_buff *skb)
2891ncls: 2891ncls:
2892#endif 2892#endif
2893 2893
2894 /* If we got this far with a hardware accelerated VLAN tag, it means
2895 * that we were put in promiscuous mode but nobody is interested in
2896 * this vid. Drop the packet now to prevent it from getting propagated
2897 * to other parts of the stack that won't know how to deal with packets
2898 * tagged in this manner.
2899 */
2900 if (unlikely(vlan_tx_tag_present(skb)))
2901 goto bypass;
2902
2894 /* Handle special case of bridge or macvlan */ 2903 /* Handle special case of bridge or macvlan */
2895 rx_handler = rcu_dereference(skb->dev->rx_handler); 2904 rx_handler = rcu_dereference(skb->dev->rx_handler);
2896 if (rx_handler) { 2905 if (rx_handler) {
@@ -2927,6 +2936,7 @@ ncls:
2927 } 2936 }
2928 } 2937 }
2929 2938
2939bypass:
2930 if (pt_prev) { 2940 if (pt_prev) {
2931 ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); 2941 ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
2932 } else { 2942 } else {