aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/output.c
diff options
context:
space:
mode:
authorVlad Yasevich <vyasevich@gmail.com>2013-10-15 22:01:31 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-17 15:24:44 -0400
commitd2dbbba77e95dff4b4f901fee236fef6d9552072 (patch)
treebf5d26559a9cdb4c00ec2bb15b1ea2c18e214a8e /net/sctp/output.c
parent27127a82561a2a3ed955ce207048e1b066a80a2a (diff)
sctp: Perform software checksum if packet has to be fragmented.
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>
Diffstat (limited to 'net/sctp/output.c')
-rw-r--r--net/sctp/output.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/net/sctp/output.c b/net/sctp/output.c
index d35b54cb3020..319137340d15 100644
--- a/net/sctp/output.c
+++ b/net/sctp/output.c
@@ -537,7 +537,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
537 */ 537 */
538 if (!sctp_checksum_disable) { 538 if (!sctp_checksum_disable) {
539 if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || 539 if (!(dst->dev->features & NETIF_F_SCTP_CSUM) ||
540 (dst_xfrm(dst) != NULL)) { 540 (dst_xfrm(dst) != NULL) || packet->ipfragok) {
541 __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); 541 __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);
542 542
543 /* 3) Put the resultant value into the checksum field in the 543 /* 3) Put the resultant value into the checksum field in the