|
@@ -2885,7 +2885,9 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
|
if (unlikely(!proto))
|
|
if (unlikely(!proto))
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
- csum = !!can_checksum_protocol(features, proto);
|
|
|
|
|
|
+ csum = !head_skb->encap_hdr_csum &&
|
|
|
|
+ !!can_checksum_protocol(features, proto);
|
|
|
|
+
|
|
__skb_push(head_skb, doffset);
|
|
__skb_push(head_skb, doffset);
|
|
headroom = skb_headroom(head_skb);
|
|
headroom = skb_headroom(head_skb);
|
|
pos = skb_headlen(head_skb);
|
|
pos = skb_headlen(head_skb);
|
|
@@ -2983,6 +2985,8 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
|
nskb->csum = skb_copy_and_csum_bits(head_skb, offset,
|
|
nskb->csum = skb_copy_and_csum_bits(head_skb, offset,
|
|
skb_put(nskb, len),
|
|
skb_put(nskb, len),
|
|
len, 0);
|
|
len, 0);
|
|
|
|
+ SKB_GSO_CB(nskb)->csum_start =
|
|
|
|
+ skb_headroom(nskb) + offset;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3052,6 +3056,8 @@ perform_csum_check:
|
|
nskb->csum = skb_checksum(nskb, doffset,
|
|
nskb->csum = skb_checksum(nskb, doffset,
|
|
nskb->len - doffset, 0);
|
|
nskb->len - doffset, 0);
|
|
nskb->ip_summed = CHECKSUM_NONE;
|
|
nskb->ip_summed = CHECKSUM_NONE;
|
|
|
|
+ SKB_GSO_CB(nskb)->csum_start =
|
|
|
|
+ skb_headroom(nskb) + doffset;
|
|
}
|
|
}
|
|
} while ((offset += len) < head_skb->len);
|
|
} while ((offset += len) < head_skb->len);
|
|
|
|
|