|
@@ -2324,6 +2324,13 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
|
skb->vlan_tci = 0;
|
|
|
}
|
|
|
|
|
|
+ /* If encapsulation offload request, verify we are testing
|
|
|
+ * hardware encapsulation features instead of standard
|
|
|
+ * features for the netdev
|
|
|
+ */
|
|
|
+ if (skb->encapsulation)
|
|
|
+ features &= dev->hw_enc_features;
|
|
|
+
|
|
|
if (netif_needs_gso(skb, features)) {
|
|
|
if (unlikely(dev_gso_segment(skb, features)))
|
|
|
goto out_kfree_skb;
|
|
@@ -2339,8 +2346,12 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
|
* checksumming here.
|
|
|
*/
|
|
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
- skb_set_transport_header(skb,
|
|
|
- skb_checksum_start_offset(skb));
|
|
|
+ if (skb->encapsulation)
|
|
|
+ skb_set_inner_transport_header(skb,
|
|
|
+ skb_checksum_start_offset(skb));
|
|
|
+ else
|
|
|
+ skb_set_transport_header(skb,
|
|
|
+ skb_checksum_start_offset(skb));
|
|
|
if (!(features & NETIF_F_ALL_CSUM) &&
|
|
|
skb_checksum_help(skb))
|
|
|
goto out_kfree_skb;
|