]>
Commit | Line | Data |
---|---|---|
9ad0977f VY |
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 | |
a6227e26 JK |
22 | * along with GNU CC; see the file COPYING. If not, see |
23 | * <http://www.gnu.org/licenses/>. | |
9ad0977f VY |
24 | * |
25 | * Please send any bug reports or fixes you make to the | |
26 | * email address(es): | |
91705c61 | 27 | * lksctp developers <linux-sctp@vger.kernel.org> |
9ad0977f | 28 | * |
9ad0977f VY |
29 | * Written or modified by: |
30 | * Dinakaran Joseph | |
31 | * Jon Grimm <jgrimm@us.ibm.com> | |
32 | * Sridhar Samudrala <sri@us.ibm.com> | |
33 | * | |
34 | * Rewritten to use libcrc32c by: | |
35 | * Vlad Yasevich <vladislav.yasevich@hp.com> | |
9ad0977f VY |
36 | */ |
37 | ||
a05b1019 DB |
38 | #ifndef __sctp_checksum_h__ |
39 | #define __sctp_checksum_h__ | |
40 | ||
9ad0977f VY |
41 | #include <linux/types.h> |
42 | #include <net/sctp/sctp.h> | |
43 | #include <linux/crc32c.h> | |
e6d8b64b | 44 | #include <linux/crc32.h> |
9ad0977f | 45 | |
e6d8b64b | 46 | static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum) |
9ad0977f | 47 | { |
e6d8b64b DB |
48 | /* This uses the crypto implementation of crc32c, which is either |
49 | * implemented w/ hardware support or resolves to __crc32c_le(). | |
9ad0977f | 50 | */ |
e6d8b64b | 51 | return crc32c(sum, buff, len); |
9ad0977f VY |
52 | } |
53 | ||
e6d8b64b DB |
54 | static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2, |
55 | int offset, int len) | |
9ad0977f | 56 | { |
e6d8b64b | 57 | return __crc32c_le_combine(csum, csum2, len); |
9ad0977f | 58 | } |
a05b1019 | 59 | |
024ec3de JS |
60 | static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, |
61 | unsigned int offset) | |
62 | { | |
e6d8b64b DB |
63 | struct sctphdr *sh = sctp_hdr(skb); |
64 | __le32 ret, old = sh->checksum; | |
65 | const struct skb_checksum_ops ops = { | |
66 | .update = sctp_csum_update, | |
67 | .combine = sctp_csum_combine, | |
68 | }; | |
024ec3de | 69 | |
e6d8b64b DB |
70 | sh->checksum = 0; |
71 | ret = cpu_to_le32(~__skb_checksum(skb, offset, skb->len - offset, | |
72 | ~(__u32)0, &ops)); | |
73 | sh->checksum = old; | |
024ec3de | 74 | |
e6d8b64b | 75 | return ret; |
024ec3de JS |
76 | } |
77 | ||
a05b1019 | 78 | #endif /* __sctp_checksum_h__ */ |