linux/net/sctp
Daniel Borkmann e6d8b64b34 net: sctp: fix and consolidate SCTP checksumming code
This fixes an outstanding bug found through IPVS, where SCTP packets
with skb->data_len > 0 (non-linearized) and empty frag_list, but data
accumulated in frags[] member, are forwarded with incorrect checksum
letting SCTP initial handshake fail on some systems. Linearizing each
SCTP skb in IPVS to prevent that would not be a good solution as
this leads to an additional and unnecessary performance penalty on
the load-balancer itself for no good reason (as we actually only want
to update the checksum, and can do that in a different/better way
presented here).

The actual problem is elsewhere, namely, that SCTP's checksumming
in sctp_compute_cksum() does not take frags[] into account like
skb_checksum() does. So while we are fixing this up, we better reuse
the existing code that we have anyway in __skb_checksum() and use it
for walking through the data doing checksumming. This will not only
fix this issue, but also consolidates some SCTP code with core
sk_buff code, bringing it closer together and removing respectively
avoiding reimplementation of skb_checksum() for no good reason.

As crc32c() can use hardware implementation within the crypto layer,
we leave that intact (it wraps around / falls back to e.g. slice-by-8
algorithm in __crc32c_le() otherwise); plus use the __crc32c_le_combine()
combinator for crc32c blocks.

Also, we remove all other SCTP checksumming code, so that we only
have to use sctp_compute_cksum() from now on; for doing that, we need
to transform SCTP checkumming in output path slightly, and can leave
the rest intact.

Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-11-03 23:04:57 -05:00
..
Kconfig net: sctp: get rid of SCTP_DBG_TSNS entirely 2013-07-02 00:08:03 -07:00
Makefile sctp: implement sctp association probing module 2010-04-30 22:41:09 -04:00
associola.c sctp: fix some comments in chunk.c and associola.c 2013-10-28 01:02:34 -04:00
auth.c sctp: merge two if statements to one 2013-10-28 01:02:34 -04:00
bind_addr.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
chunk.c sctp: fix some comments in chunk.c and associola.c 2013-10-28 01:02:34 -04:00
command.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
debug.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
endpointola.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
input.c net: sctp: rfc4443: do not report ICMP redirects to user space 2013-09-16 21:40:15 -04:00
inqueue.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
ipv6.c ipv6: make lookups simpler and faster 2013-10-09 00:01:25 -04:00
objcnt.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
output.c net: sctp: fix and consolidate SCTP checksumming code 2013-11-03 23:04:57 -05:00
outqueue.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
primitive.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
probe.c net: sctp: probe: allow more advanced ingress filtering by mark 2013-09-03 21:44:11 -04:00
proc.c net: proc_fs: trivial: print UIDs as unsigned int 2013-08-15 14:37:46 -07:00
protocol.c Revert "net: sctp: convert sctp_checksum_disable module param into sctp sysctl" 2013-08-09 13:09:41 -07:00
sm_make_chunk.c sctp: remove the repeat initialize with 0 2013-10-28 01:02:34 -04:00
sm_sideeffect.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
sm_statefuns.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
sm_statetable.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
socket.c net ipv4: Convert ipv4.ip_local_port_range to be per netns v3 2013-09-30 21:59:38 -07:00
ssnmap.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
sysctl.c Revert "net: sctp: convert sctp_checksum_disable module param into sctp sysctl" 2013-08-09 13:09:41 -07:00
transport.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2013-08-16 15:37:26 -07:00
tsnmap.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
ulpevent.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00
ulpqueue.c net: sctp: trivial: update bug report in header comment 2013-08-09 11:33:02 -07:00