Commit 9ad0977fe10bd5d052a6db7738afe017367c2e32

Authored by Vlad Yasevich
Committed by David S. Miller
1 parent 1bf40954cf

[SCTP]: Use crc32c library for checksum calculations.

The crc32c library used an identical table and algorithm
as SCTP.  Switch to using the library instead of carrying
our own table.  Using crypto layer proved to have too
much overhead compared to using the library directly.

Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 7 changed files with 82 additions and 230 deletions Side-by-side Diff

include/net/sctp/checksum.h
  1 +/* SCTP kernel reference Implementation
  2 + * Copyright (c) 1999-2001 Motorola, Inc.
  3 + * Copyright (c) 2001-2003 International Business Machines, Corp.
  4 + *
  5 + * This file is part of the SCTP kernel reference Implementation
  6 + *
  7 + * SCTP Checksum functions
  8 + *
  9 + * The SCTP reference implementation is free software;
  10 + * you can redistribute it and/or modify it under the terms of
  11 + * the GNU General Public License as published by
  12 + * the Free Software Foundation; either version 2, or (at your option)
  13 + * any later version.
  14 + *
  15 + * The SCTP reference implementation is distributed in the hope that it
  16 + * will be useful, but WITHOUT ANY WARRANTY; without even the implied
  17 + * ************************
  18 + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  19 + * See the GNU General Public License for more details.
  20 + *
  21 + * You should have received a copy of the GNU General Public License
  22 + * along with GNU CC; see the file COPYING. If not, write to
  23 + * the Free Software Foundation, 59 Temple Place - Suite 330,
  24 + * Boston, MA 02111-1307, USA.
  25 + *
  26 + * Please send any bug reports or fixes you make to the
  27 + * email address(es):
  28 + * lksctp developers <lksctp-developers@lists.sourceforge.net>
  29 + *
  30 + * Or submit a bug report through the following website:
  31 + * http://www.sf.net/projects/lksctp
  32 + *
  33 + * Written or modified by:
  34 + * Dinakaran Joseph
  35 + * Jon Grimm <jgrimm@us.ibm.com>
  36 + * Sridhar Samudrala <sri@us.ibm.com>
  37 + *
  38 + * Rewritten to use libcrc32c by:
  39 + * Vlad Yasevich <vladislav.yasevich@hp.com>
  40 + *
  41 + * Any bugs reported given to us we will try to fix... any fixes shared will
  42 + * be incorporated into the next SCTP release.
  43 + */
  44 +
  45 +#include <linux/types.h>
  46 +#include <net/sctp/sctp.h>
  47 +#include <linux/crc32c.h>
  48 +
  49 +static inline __u32 sctp_start_cksum(__u8 *buffer, __u16 length)
  50 +{
  51 + __u32 crc = ~(__u32) 0;
  52 + __u8 zero[sizeof(__u32)] = {0};
  53 +
  54 + /* Optimize this routine to be SCTP specific, knowing how
  55 + * to skip the checksum field of the SCTP header.
  56 + */
  57 +
  58 + /* Calculate CRC up to the checksum. */
  59 + crc = crc32c(crc, buffer, sizeof(struct sctphdr) - sizeof(__u32));
  60 +
  61 + /* Skip checksum field of the header. */
  62 + crc = crc32c(crc, zero, sizeof(__u32));
  63 +
  64 + /* Calculate the rest of the CRC. */
  65 + crc = crc32c(crc, &buffer[sizeof(struct sctphdr)],
  66 + length - sizeof(struct sctphdr));
  67 + return crc;
  68 +}
  69 +
  70 +static inline __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32)
  71 +{
  72 + return crc32c(crc32, buffer, length);
  73 +}
  74 +
  75 +static inline __u32 sctp_end_cksum(__u32 crc32)
  76 +{
  77 + return ntohl(~crc32);
  78 +}
include/net/sctp/sctp.h
... ... @@ -150,13 +150,6 @@
150 150 int sctp_primitive_ASCONF(struct sctp_association *, void *arg);
151 151  
152 152 /*
153   - * sctp/crc32c.c
154   - */
155   -__u32 sctp_start_cksum(__u8 *ptr, __u16 count);
156   -__u32 sctp_update_cksum(__u8 *ptr, __u16 count, __u32 cksum);
157   -__u32 sctp_end_cksum(__u32 cksum);
158   -
159   -/*
160 153 * sctp/input.c
161 154 */
162 155 int sctp_rcv(struct sk_buff *skb);
... ... @@ -10,6 +10,7 @@
10 10 select CRYPTO_HMAC
11 11 select CRYPTO_SHA1
12 12 select CRYPTO_MD5 if SCTP_HMAC_MD5
  13 + select LIBCRC32C
13 14 ---help---
14 15 Stream Control Transmission Protocol
15 16  
... ... @@ -9,7 +9,7 @@
9 9 transport.o chunk.o sm_make_chunk.o ulpevent.o \
10 10 inqueue.o outqueue.o ulpqueue.o command.o \
11 11 tsnmap.o bind_addr.o socket.o primitive.o \
12   - output.o input.o debug.o ssnmap.o proc.o crc32c.o \
  12 + output.o input.o debug.o ssnmap.o proc.o \
13 13 auth.o
14 14  
15 15 sctp-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o
net/sctp/crc32c.c
1   -/* SCTP kernel reference Implementation
2   - * Copyright (c) 1999-2001 Motorola, Inc.
3   - * Copyright (c) 2001-2003 International Business Machines, Corp.
4   - *
5   - * This file is part of the SCTP kernel reference Implementation
6   - *
7   - * SCTP Checksum functions
8   - *
9   - * The SCTP reference implementation is free software;
10   - * you can redistribute it and/or modify it under the terms of
11   - * the GNU General Public License as published by
12   - * the Free Software Foundation; either version 2, or (at your option)
13   - * any later version.
14   - *
15   - * The SCTP reference implementation is distributed in the hope that it
16   - * will be useful, but WITHOUT ANY WARRANTY; without even the implied
17   - * ************************
18   - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19   - * See the GNU General Public License for more details.
20   - *
21   - * You should have received a copy of the GNU General Public License
22   - * along with GNU CC; see the file COPYING. If not, write to
23   - * the Free Software Foundation, 59 Temple Place - Suite 330,
24   - * Boston, MA 02111-1307, USA.
25   - *
26   - * Please send any bug reports or fixes you make to the
27   - * email address(es):
28   - * lksctp developers <lksctp-developers@lists.sourceforge.net>
29   - *
30   - * Or submit a bug report through the following website:
31   - * http://www.sf.net/projects/lksctp
32   - *
33   - * Written or modified by:
34   - * Dinakaran Joseph
35   - * Jon Grimm <jgrimm@us.ibm.com>
36   - * Sridhar Samudrala <sri@us.ibm.com>
37   - *
38   - * Any bugs reported given to us we will try to fix... any fixes shared will
39   - * be incorporated into the next SCTP release.
40   - */
41   -
42   -/* The following code has been taken directly from
43   - * draft-ietf-tsvwg-sctpcsum-03.txt
44   - *
45   - * The code has now been modified specifically for SCTP knowledge.
46   - */
47   -
48   -#include <linux/types.h>
49   -#include <net/sctp/sctp.h>
50   -
51   -#define CRC32C_POLY 0x1EDC6F41
52   -#define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF])
53   -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
54   -/* Copyright 2001, D. Otis. Use this program, code or tables */
55   -/* extracted from it, as desired without restriction. */
56   -/* */
57   -/* 32 Bit Reflected CRC table generation for SCTP. */
58   -/* To accommodate serial byte data being shifted out least */
59   -/* significant bit first, the table's 32 bit words are reflected */
60   -/* which flips both byte and bit MS and LS positions. The CRC */
61   -/* is calculated MS bits first from the perspective of the serial*/
62   -/* stream. The x^32 term is implied and the x^0 term may also */
63   -/* be shown as +1. The polynomial code used is 0x1EDC6F41. */
64   -/* Castagnoli93 */
65   -/* x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+x^19+x^18+x^14+x^13+ */
66   -/* x^11+x^10+x^9+x^8+x^6+x^0 */
67   -/* Guy Castagnoli Stefan Braeuer and Martin Herrman */
68   -/* "Optimization of Cyclic Redundancy-Check Codes */
69   -/* with 24 and 32 Parity Bits", */
70   -/* IEEE Transactions on Communications, Vol.41, No.6, June 1993 */
71   -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
72   -static const __u32 crc_c[256] = {
73   - 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
74   - 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
75   - 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
76   - 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
77   - 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
78   - 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
79   - 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
80   - 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
81   - 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
82   - 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
83   - 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
84   - 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
85   - 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
86   - 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
87   - 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
88   - 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
89   - 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
90   - 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
91   - 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
92   - 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
93   - 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
94   - 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
95   - 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
96   - 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
97   - 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
98   - 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
99   - 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
100   - 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
101   - 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
102   - 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
103   - 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
104   - 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
105   - 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
106   - 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
107   - 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
108   - 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
109   - 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
110   - 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
111   - 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
112   - 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
113   - 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
114   - 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
115   - 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
116   - 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
117   - 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
118   - 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
119   - 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
120   - 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
121   - 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
122   - 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
123   - 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
124   - 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
125   - 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
126   - 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
127   - 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
128   - 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
129   - 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
130   - 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
131   - 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
132   - 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
133   - 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
134   - 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
135   - 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
136   - 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
137   -};
138   -
139   -__u32 sctp_start_cksum(__u8 *buffer, __u16 length)
140   -{
141   - __u32 crc32 = ~(__u32) 0;
142   - __u32 i;
143   -
144   - /* Optimize this routine to be SCTP specific, knowing how
145   - * to skip the checksum field of the SCTP header.
146   - */
147   -
148   - /* Calculate CRC up to the checksum. */
149   - for (i = 0; i < (sizeof(struct sctphdr) - sizeof(__u32)); i++)
150   - CRC32C(crc32, buffer[i]);
151   -
152   - /* Skip checksum field of the header. */
153   - for (i = 0; i < sizeof(__u32); i++)
154   - CRC32C(crc32, 0);
155   -
156   - /* Calculate the rest of the CRC. */
157   - for (i = sizeof(struct sctphdr); i < length ; i++)
158   - CRC32C(crc32, buffer[i]);
159   -
160   - return crc32;
161   -}
162   -
163   -__u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32)
164   -{
165   - __u32 i;
166   -
167   - for (i = 0; i < length ; i++)
168   - CRC32C(crc32, buffer[i]);
169   -
170   - return crc32;
171   -}
172   -
173   -#if 0
174   -__u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32)
175   -{
176   - __u32 i;
177   - __u32 *_to = (__u32 *)to;
178   - __u32 *_from = (__u32 *)from;
179   -
180   - for (i = 0; i < (length/4); i++) {
181   - _to[i] = _from[i];
182   - CRC32C(crc32, from[i*4]);
183   - CRC32C(crc32, from[i*4+1]);
184   - CRC32C(crc32, from[i*4+2]);
185   - CRC32C(crc32, from[i*4+3]);
186   - }
187   -
188   - return crc32;
189   -}
190   -#endif /* 0 */
191   -
192   -__u32 sctp_end_cksum(__u32 crc32)
193   -{
194   - __u32 result;
195   - __u8 byte0, byte1, byte2, byte3;
196   -
197   - result = ~crc32;
198   -
199   - /* result now holds the negated polynomial remainder;
200   - * since the table and algorithm is "reflected" [williams95].
201   - * That is, result has the same value as if we mapped the message
202   - * to a polyomial, computed the host-bit-order polynomial
203   - * remainder, performed final negation, then did an end-for-end
204   - * bit-reversal.
205   - * Note that a 32-bit bit-reversal is identical to four inplace
206   - * 8-bit reversals followed by an end-for-end byteswap.
207   - * In other words, the bytes of each bit are in the right order,
208   - * but the bytes have been byteswapped. So we now do an explicit
209   - * byteswap. On a little-endian machine, this byteswap and
210   - * the final ntohl cancel out and could be elided.
211   - */
212   - byte0 = result & 0xff;
213   - byte1 = (result>>8) & 0xff;
214   - byte2 = (result>>16) & 0xff;
215   - byte3 = (result>>24) & 0xff;
216   -
217   - crc32 = ((byte0 << 24) |
218   - (byte1 << 16) |
219   - (byte2 << 8) |
220   - byte3);
221   - return crc32;
222   -}
... ... @@ -60,6 +60,7 @@
60 60 #include <net/xfrm.h>
61 61 #include <net/sctp/sctp.h>
62 62 #include <net/sctp/sm.h>
  63 +#include <net/sctp/checksum.h>
63 64  
64 65 /* Forward declarations for internal helpers. */
65 66 static int sctp_rcv_ootb(struct sk_buff *);
... ... @@ -60,6 +60,7 @@
60 60  
61 61 #include <net/sctp/sctp.h>
62 62 #include <net/sctp/sm.h>
  63 +#include <net/sctp/checksum.h>
63 64  
64 65 /* Forward declarations for private helpers. */
65 66 static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet,