sctp: Perform software checksum if packet has to be fragmented.
authorVlad Yasevich <vyasevich@gmail.com>
Wed, 16 Oct 2013 02:01:31 +0000 (22:01 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 17 Oct 2013 19:24:44 +0000 (15:24 -0400)
IP/IPv6 fragmentation knows how to compute only TCP/UDP checksum.
This causes problems if SCTP packets has to be fragmented and
ipsummed has been set to PARTIAL due to checksum offload support.
This condition can happen when retransmitting after MTU discover,
or when INIT or other control chunks are larger then MTU.
Check for the rare fragmentation condition in SCTP and use software
checksum calculation in this case.

CC: Fan Du <fan.du@windriver.com>
Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/output.c

index d35b54cb3020128f67b4904f21828b1fc5dce178..319137340d158df36094c45b8eae1fc13df50825 100644 (file)
@@ -537,7 +537,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
         */
        if (!sctp_checksum_disable) {
                if (!(dst->dev->features & NETIF_F_SCTP_CSUM) ||
-                   (dst_xfrm(dst) != NULL)) {
+                   (dst_xfrm(dst) != NULL) || packet->ipfragok) {
                        __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);
 
                        /* 3) Put the resultant value into the checksum field in the