sctp: Change sctp to implement csum_levels
authorTom Herbert <therbert@google.com>
Thu, 28 Aug 2014 04:27:06 +0000 (21:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 30 Aug 2014 03:41:11 +0000 (20:41 -0700)
CHECKSUM_UNNECESSARY may be applied to the SCTP CRC so we need to
appropriate account for this by decrementing csum_level. This is
done by calling __skb_dec_checksum_unnecessary.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/input.c

index c1b991294516fd1ef29de13cf24f06c1d63c8be2..b6493b3f11a97f359d0ec70cde2812082f65910f 100644 (file)
@@ -133,9 +133,13 @@ int sctp_rcv(struct sk_buff *skb)
        __skb_pull(skb, skb_transport_offset(skb));
        if (skb->len < sizeof(struct sctphdr))
                goto discard_it;
-       if (!sctp_checksum_disable && !skb_csum_unnecessary(skb) &&
-                 sctp_rcv_checksum(net, skb) < 0)
+
+       skb->csum_valid = 0; /* Previous value not applicable */
+       if (skb_csum_unnecessary(skb))
+               __skb_decr_checksum_unnecessary(skb);
+       else if (!sctp_checksum_disable && sctp_rcv_checksum(net, skb) < 0)
                goto discard_it;
+       skb->csum_valid = 1;
 
        skb_pull(skb, sizeof(struct sctphdr));