|
@@ -234,7 +234,7 @@ static int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct
|
|
len, fl->proto,
|
|
len, fl->proto,
|
|
skb->csum);
|
|
skb->csum);
|
|
} else {
|
|
} else {
|
|
- u32 tmp_csum = 0;
|
|
|
|
|
|
+ __wsum tmp_csum = 0;
|
|
|
|
|
|
skb_queue_walk(&sk->sk_write_queue, skb) {
|
|
skb_queue_walk(&sk->sk_write_queue, skb) {
|
|
tmp_csum = csum_add(tmp_csum, skb->csum);
|
|
tmp_csum = csum_add(tmp_csum, skb->csum);
|
|
@@ -242,10 +242,10 @@ static int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct
|
|
|
|
|
|
tmp_csum = csum_partial((char *)icmp6h,
|
|
tmp_csum = csum_partial((char *)icmp6h,
|
|
sizeof(struct icmp6hdr), tmp_csum);
|
|
sizeof(struct icmp6hdr), tmp_csum);
|
|
- tmp_csum = csum_ipv6_magic(&fl->fl6_src,
|
|
|
|
- &fl->fl6_dst,
|
|
|
|
- len, fl->proto, tmp_csum);
|
|
|
|
- icmp6h->icmp6_cksum = tmp_csum;
|
|
|
|
|
|
+ icmp6h->icmp6_cksum = csum_ipv6_magic(&fl->fl6_src,
|
|
|
|
+ &fl->fl6_dst,
|
|
|
|
+ len, fl->proto,
|
|
|
|
+ tmp_csum);
|
|
}
|
|
}
|
|
ip6_push_pending_frames(sk);
|
|
ip6_push_pending_frames(sk);
|
|
out:
|
|
out:
|
|
@@ -636,8 +636,8 @@ static int icmpv6_rcv(struct sk_buff **pskb)
|
|
break;
|
|
break;
|
|
/* fall through */
|
|
/* fall through */
|
|
case CHECKSUM_NONE:
|
|
case CHECKSUM_NONE:
|
|
- skb->csum = ~csum_ipv6_magic(saddr, daddr, skb->len,
|
|
|
|
- IPPROTO_ICMPV6, 0);
|
|
|
|
|
|
+ skb->csum = ~csum_unfold(csum_ipv6_magic(saddr, daddr, skb->len,
|
|
|
|
+ IPPROTO_ICMPV6, 0));
|
|
if (__skb_checksum_complete(skb)) {
|
|
if (__skb_checksum_complete(skb)) {
|
|
LIMIT_NETDEBUG(KERN_DEBUG "ICMPv6 checksum failed [" NIP6_FMT " > " NIP6_FMT "]\n",
|
|
LIMIT_NETDEBUG(KERN_DEBUG "ICMPv6 checksum failed [" NIP6_FMT " > " NIP6_FMT "]\n",
|
|
NIP6(*saddr), NIP6(*daddr));
|
|
NIP6(*saddr), NIP6(*daddr));
|