diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 54277df0f73..24ea2d71e7e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -749,7 +749,8 @@ EXPORT_SYMBOL(dev_get_by_index); | |||
749 | * @ha: hardware address | 749 | * @ha: hardware address |
750 | * | 750 | * |
751 | * Search for an interface by MAC address. Returns NULL if the device | 751 | * Search for an interface by MAC address. Returns NULL if the device |
752 | * is not found or a pointer to the device. The caller must hold RCU | 752 | * is not found or a pointer to the device. |
753 | * The caller must hold RCU or RTNL. | ||
753 | * The returned device has not had its ref count increased | 754 | * The returned device has not had its ref count increased |
754 | * and the caller must therefore be careful about locking | 755 | * and the caller must therefore be careful about locking |
755 | * | 756 | * |
@@ -2001,7 +2002,7 @@ static bool can_checksum_protocol(unsigned long features, __be16 protocol) | |||
2001 | 2002 | ||
2002 | static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features) | 2003 | static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features) |
2003 | { | 2004 | { |
2004 | if (!can_checksum_protocol(protocol, features)) { | 2005 | if (!can_checksum_protocol(features, protocol)) { |
2005 | features &= ~NETIF_F_ALL_CSUM; | 2006 | features &= ~NETIF_F_ALL_CSUM; |
2006 | features &= ~NETIF_F_SG; | 2007 | features &= ~NETIF_F_SG; |
2007 | } else if (illegal_highdma(skb->dev, skb)) { | 2008 | } else if (illegal_highdma(skb->dev, skb)) { |
@@ -2023,13 +2024,13 @@ int netif_skb_features(struct sk_buff *skb) | |||
2023 | return harmonize_features(skb, protocol, features); | 2024 | return harmonize_features(skb, protocol, features); |
2024 | } | 2025 | } |
2025 | 2026 | ||
2026 | features &= skb->dev->vlan_features; | 2027 | features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_TX); |
2027 | 2028 | ||
2028 | if (protocol != htons(ETH_P_8021Q)) { | 2029 | if (protocol != htons(ETH_P_8021Q)) { |
2029 | return harmonize_features(skb, protocol, features); | 2030 | return harmonize_features(skb, protocol, features); |
2030 | } else { | 2031 | } else { |
2031 | features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | | 2032 | features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | |
2032 | NETIF_F_GEN_CSUM; | 2033 | NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_TX; |
2033 | return harmonize_features(skb, protocol, features); | 2034 | return harmonize_features(skb, protocol, features); |
2034 | } | 2035 | } |
2035 | } | 2036 | } |