Skip to content
  1. Nov 04, 2013
    • Daniel Borkmann's avatar
      net: sctp: fix and consolidate SCTP checksumming code · e6d8b64b
      Daniel Borkmann authored
      
      
      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: default avatarDaniel Borkmann <dborkman@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e6d8b64b
    • Daniel Borkmann's avatar
      net: skb_checksum: allow custom update/combine for walking skb · 2817a336
      Daniel Borkmann authored
      
      
      Currently, skb_checksum walks over 1) linearized, 2) frags[], and
      3) frag_list data and calculats the one's complement, a 32 bit
      result suitable for feeding into itself or csum_tcpudp_magic(),
      but unsuitable for SCTP as we're calculating CRC32c there.
      
      Hence, in order to not re-implement the very same function in
      SCTP (and maybe other protocols) over and over again, use an
      update() + combine() callback internally to allow for walking
      over the skb with different algorithms.
      
      Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      2817a336
    • Daniel Borkmann's avatar
      lib: crc32: add test cases for crc32{, c}_combine routines · efba721f
      Daniel Borkmann authored
      
      
      We already have 100 test cases for crcs itself, so split the test
      buffer with a-prio known checksums, and test crc of two blocks
      against crc of the whole block for the same results.
      
      Output/result with CONFIG_CRC32_SELFTEST=y:
      
        [    2.687095] crc32: CRC_LE_BITS = 64, CRC_BE BITS = 64
        [    2.687097] crc32: self tests passed, processed 225944 bytes in 278177 nsec
        [    2.687383] crc32c: CRC_LE_BITS = 64
        [    2.687385] crc32c: self tests passed, processed 225944 bytes in 141708 nsec
        [    7.336771] crc32_combine: 113072 self tests passed
        [   12.050479] crc32c_combine: 113072 self tests passed
        [   17.633089] alg: No test for crc32 (crc32-pclmul)
      
      Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      efba721f
    • Daniel Borkmann's avatar
      lib: crc32: add functionality to combine two crc32{, c}s in GF(2) · 6e95fcaa
      Daniel Borkmann authored
      
      
      This patch adds a combinator to merge two or more crc32{,c}s
      into a new one. This is useful for checksum computations of
      fragmented skbs that use crc32/crc32c as checksums.
      
      The arithmetics for combining both in the GF(2) was taken and
      slightly modified from zlib. Only passing two crcs is insufficient
      as two crcs and the length of the second piece is needed for
      merging. The code is made generic, so that only polynomials
      need to be passed for crc32_le resp. crc32c_le.
      
      Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6e95fcaa
    • Daniel Borkmann's avatar
      lib: crc32: clean up spacing in test cases · d921e049
      Daniel Borkmann authored
      
      
      This is nothing more but a whitepace cleanup, as 80 chars is not a
      hard but soft limit, and otherwise makes the test cases array really
      look ugly. So fix it up.
      
      Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d921e049
  2. Nov 02, 2013