|
@@ -1732,33 +1732,6 @@ void netif_device_attach(struct net_device *dev)
|
|
|
}
|
|
|
EXPORT_SYMBOL(netif_device_attach);
|
|
|
|
|
|
-static bool can_checksum_protocol(unsigned long features, __be16 protocol)
|
|
|
-{
|
|
|
- return ((features & NETIF_F_GEN_CSUM) ||
|
|
|
- ((features & NETIF_F_V4_CSUM) &&
|
|
|
- protocol == htons(ETH_P_IP)) ||
|
|
|
- ((features & NETIF_F_V6_CSUM) &&
|
|
|
- protocol == htons(ETH_P_IPV6)) ||
|
|
|
- ((features & NETIF_F_FCOE_CRC) &&
|
|
|
- protocol == htons(ETH_P_FCOE)));
|
|
|
-}
|
|
|
-
|
|
|
-static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb)
|
|
|
-{
|
|
|
- __be16 protocol = skb->protocol;
|
|
|
- int features = dev->features;
|
|
|
-
|
|
|
- if (vlan_tx_tag_present(skb)) {
|
|
|
- features &= dev->vlan_features;
|
|
|
- } else if (protocol == htons(ETH_P_8021Q)) {
|
|
|
- struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
|
|
|
- protocol = veh->h_vlan_encapsulated_proto;
|
|
|
- features &= dev->vlan_features;
|
|
|
- }
|
|
|
-
|
|
|
- return can_checksum_protocol(features, protocol);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* skb_dev_set -- assign a new device to a buffer
|
|
|
* @skb: buffer for the new device
|
|
@@ -2015,6 +1988,17 @@ static inline void skb_orphan_try(struct sk_buff *skb)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool can_checksum_protocol(unsigned long features, __be16 protocol)
|
|
|
+{
|
|
|
+ return ((features & NETIF_F_GEN_CSUM) ||
|
|
|
+ ((features & NETIF_F_V4_CSUM) &&
|
|
|
+ protocol == htons(ETH_P_IP)) ||
|
|
|
+ ((features & NETIF_F_V6_CSUM) &&
|
|
|
+ protocol == htons(ETH_P_IPV6)) ||
|
|
|
+ ((features & NETIF_F_FCOE_CRC) &&
|
|
|
+ protocol == htons(ETH_P_FCOE)));
|
|
|
+}
|
|
|
+
|
|
|
static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features)
|
|
|
{
|
|
|
if (!can_checksum_protocol(protocol, features)) {
|
|
@@ -2117,7 +2101,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
skb_set_transport_header(skb,
|
|
|
skb_checksum_start_offset(skb));
|
|
|
- if (!dev_can_checksum(dev, skb) &&
|
|
|
+ if (!(features & NETIF_F_ALL_CSUM) &&
|
|
|
skb_checksum_help(skb))
|
|
|
goto out_kfree_skb;
|
|
|
}
|