|
@@ -298,13 +298,10 @@ void rawv6_err(struct sock *sk, struct sk_buff *skb,
|
|
static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
|
|
static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
|
|
{
|
|
{
|
|
if ((raw6_sk(sk)->checksum || sk->sk_filter) &&
|
|
if ((raw6_sk(sk)->checksum || sk->sk_filter) &&
|
|
- skb->ip_summed != CHECKSUM_UNNECESSARY) {
|
|
|
|
- if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
|
|
|
|
- /* FIXME: increment a raw6 drops counter here */
|
|
|
|
- kfree_skb(skb);
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
|
|
|
+ skb_checksum_complete(skb)) {
|
|
|
|
+ /* FIXME: increment a raw6 drops counter here */
|
|
|
|
+ kfree_skb(skb);
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/* Charge it to the socket. */
|
|
/* Charge it to the socket. */
|
|
@@ -337,32 +334,25 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
|
|
if (!rp->checksum)
|
|
if (!rp->checksum)
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
|
|
|
- if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
|
|
|
|
- if (skb->ip_summed == CHECKSUM_HW) {
|
|
|
|
- skb_postpull_rcsum(skb, skb->nh.raw,
|
|
|
|
- skb->h.raw - skb->nh.raw);
|
|
|
|
|
|
+ if (skb->ip_summed == CHECKSUM_HW) {
|
|
|
|
+ skb_postpull_rcsum(skb, skb->nh.raw,
|
|
|
|
+ skb->h.raw - skb->nh.raw);
|
|
|
|
+ if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr,
|
|
|
|
+ &skb->nh.ipv6h->daddr,
|
|
|
|
+ skb->len, inet->num, skb->csum))
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
- if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
|
|
|
|
- &skb->nh.ipv6h->daddr,
|
|
|
|
- skb->len, inet->num, skb->csum)) {
|
|
|
|
- LIMIT_NETDEBUG(KERN_DEBUG "raw v6 hw csum failure.\n");
|
|
|
|
- skb->ip_summed = CHECKSUM_NONE;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (skb->ip_summed == CHECKSUM_NONE)
|
|
|
|
- skb->csum = ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
|
|
|
|
- &skb->nh.ipv6h->daddr,
|
|
|
|
- skb->len, inet->num, 0);
|
|
|
|
}
|
|
}
|
|
|
|
+ if (skb->ip_summed != CHECKSUM_UNNECESSARY)
|
|
|
|
+ skb->csum = ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
|
|
|
|
+ &skb->nh.ipv6h->daddr,
|
|
|
|
+ skb->len, inet->num, 0);
|
|
|
|
|
|
if (inet->hdrincl) {
|
|
if (inet->hdrincl) {
|
|
- if (skb->ip_summed != CHECKSUM_UNNECESSARY &&
|
|
|
|
- (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
|
|
|
|
|
|
+ if (skb_checksum_complete(skb)) {
|
|
/* FIXME: increment a raw6 drops counter here */
|
|
/* FIXME: increment a raw6 drops counter here */
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
rawv6_rcv_skb(sk, skb);
|
|
rawv6_rcv_skb(sk, skb);
|
|
@@ -407,7 +397,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
|
|
if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
|
|
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
|
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
|
} else if (msg->msg_flags&MSG_TRUNC) {
|
|
} else if (msg->msg_flags&MSG_TRUNC) {
|
|
- if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)))
|
|
|
|
|
|
+ if (__skb_checksum_complete(skb))
|
|
goto csum_copy_err;
|
|
goto csum_copy_err;
|
|
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
|
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
|
} else {
|
|
} else {
|