aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Yasevich <vladislav.yasevich@hp.com>2007-12-16 17:06:41 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:58:20 -0500
commit9ad0977fe10bd5d052a6db7738afe017367c2e32 (patch)
tree811087dfc2e70d7ef120815c7471c943ac193f6d
parent1bf40954cf232a043a49623cf251f787c1871e64 (diff)
[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>
-rw-r--r--include/net/sctp/checksum.h78
-rw-r--r--include/net/sctp/sctp.h7
-rw-r--r--net/sctp/Kconfig1
-rw-r--r--net/sctp/Makefile2
-rw-r--r--net/sctp/crc32c.c222
-rw-r--r--net/sctp/input.c1
-rw-r--r--net/sctp/output.c1
7 files changed, 82 insertions, 230 deletions
diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h
new file mode 100644
index 000000000000..ba75c67cb992
--- /dev/null
+++ b/include/net/sctp/checksum.h
@@ -0,0 +1,78 @@
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
49static 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
70static inline __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32)
71{
72 return crc32c(crc32, buffer, length);
73}
74
75static inline __u32 sctp_end_cksum(__u32 crc32)
76{
77 return ntohl(~crc32);
78}
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 34318a33a94c..1b81ede7c2bc 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -150,13 +150,6 @@ int sctp_primitive_REQUESTHEARTBEAT(struct sctp_association *, void *arg);
150int sctp_primitive_ASCONF(struct sctp_association *, void *arg); 150int 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 * sctp/input.c 153 * sctp/input.c
161 */ 154 */
162int sctp_rcv(struct sk_buff *skb); 155int sctp_rcv(struct sk_buff *skb);
diff --git a/net/sctp/Kconfig b/net/sctp/Kconfig
index 5390bc792159..0b79f869c4ea 100644
--- a/net/sctp/Kconfig
+++ b/net/sctp/Kconfig
@@ -10,6 +10,7 @@ menuconfig IP_SCTP
10 select CRYPTO_HMAC 10 select CRYPTO_HMAC
11 select CRYPTO_SHA1 11 select CRYPTO_SHA1
12 select CRYPTO_MD5 if SCTP_HMAC_MD5 12 select CRYPTO_MD5 if SCTP_HMAC_MD5
13 select LIBCRC32C
13 ---help--- 14 ---help---
14 Stream Control Transmission Protocol 15 Stream Control Transmission Protocol
15 16
diff --git a/net/sctp/Makefile b/net/sctp/Makefile
index 1da7204d9b42..f5356b9d5ee3 100644
--- a/net/sctp/Makefile
+++ b/net/sctp/Makefile
@@ -9,7 +9,7 @@ sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
9 transport.o chunk.o sm_make_chunk.o ulpevent.o \ 9 transport.o chunk.o sm_make_chunk.o ulpevent.o \
10 inqueue.o outqueue.o ulpqueue.o command.o \ 10 inqueue.o outqueue.o ulpqueue.o command.o \
11 tsnmap.o bind_addr.o socket.o primitive.o \ 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 auth.o 13 auth.o
14 14
15sctp-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o 15sctp-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o
diff --git a/net/sctp/crc32c.c b/net/sctp/crc32c.c
deleted file mode 100644
index 181edabdb8ca..000000000000
--- a/net/sctp/crc32c.c
+++ /dev/null
@@ -1,222 +0,0 @@
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/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
72static 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}
diff --git a/net/sctp/input.c b/net/sctp/input.c
index 91ae463b079b..b08c7cb5c9d6 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -60,6 +60,7 @@
60#include <net/xfrm.h> 60#include <net/xfrm.h>
61#include <net/sctp/sctp.h> 61#include <net/sctp/sctp.h>
62#include <net/sctp/sm.h> 62#include <net/sctp/sm.h>
63#include <net/sctp/checksum.h>
63 64
64/* Forward declarations for internal helpers. */ 65/* Forward declarations for internal helpers. */
65static int sctp_rcv_ootb(struct sk_buff *); 66static int sctp_rcv_ootb(struct sk_buff *);
diff --git a/net/sctp/output.c b/net/sctp/output.c
index 847639d542c0..5e811b91f21c 100644
--- a/net/sctp/output.c
+++ b/net/sctp/output.c
@@ -60,6 +60,7 @@
60 60
61#include <net/sctp/sctp.h> 61#include <net/sctp/sctp.h>
62#include <net/sctp/sm.h> 62#include <net/sctp/sm.h>
63#include <net/sctp/checksum.h>
63 64
64/* Forward declarations for private helpers. */ 65/* Forward declarations for private helpers. */
65static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet, 66static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet,