]>
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 | */ |
af2697a0 | 51 | return (__force __wsum)crc32c((__force __u32)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 | { |
af2697a0 XL |
57 | return (__force __wsum)__crc32c_le_combine((__force __u32)csum, |
58 | (__force __u32)csum2, len); | |
9ad0977f | 59 | } |
a05b1019 | 60 | |
024ec3de JS |
61 | static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, |
62 | unsigned int offset) | |
63 | { | |
4799d267 | 64 | struct sctphdr *sh = (struct sctphdr *)(skb->data + offset); |
e6d8b64b DB |
65 | const struct skb_checksum_ops ops = { |
66 | .update = sctp_csum_update, | |
67 | .combine = sctp_csum_combine, | |
68 | }; | |
af2697a0 XL |
69 | __le32 old = sh->checksum; |
70 | __wsum new; | |
024ec3de | 71 | |
e6d8b64b | 72 | sh->checksum = 0; |
af2697a0 | 73 | new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0, &ops); |
e6d8b64b | 74 | sh->checksum = old; |
024ec3de | 75 | |
af2697a0 | 76 | return cpu_to_le32((__force __u32)new); |
024ec3de JS |
77 | } |
78 | ||
a05b1019 | 79 | #endif /* __sctp_checksum_h__ */ |