|
@@ -116,10 +116,10 @@ static void ip_cmsg_recv_checksum(struct msghdr *msg, struct sk_buff *skb,
|
|
|
if (skb->ip_summed != CHECKSUM_COMPLETE)
|
|
|
return;
|
|
|
|
|
|
- if (offset != 0)
|
|
|
- csum = csum_sub(csum,
|
|
|
- csum_partial(skb_transport_header(skb) + tlen,
|
|
|
- offset, 0));
|
|
|
+ if (offset != 0) {
|
|
|
+ int tend_off = skb_transport_offset(skb) + tlen;
|
|
|
+ csum = csum_sub(csum, skb_checksum(skb, tend_off, offset, 0));
|
|
|
+ }
|
|
|
|
|
|
put_cmsg(msg, SOL_IP, IP_CHECKSUM, sizeof(__wsum), &csum);
|
|
|
}
|