Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|---|
2 | /* SCTP kernel reference Implementation |
3 | * Copyright (c) 1999-2001 Motorola, Inc. |
4 | * Copyright (c) 2001-2003 International Business Machines, Corp. |
5 | * |
6 | * This file is part of the SCTP kernel reference Implementation |
7 | * |
8 | * SCTP Checksum functions |
9 | * |
10 | * Please send any bug reports or fixes you make to the |
11 | * email address(es): |
12 | * lksctp developers <linux-sctp@vger.kernel.org> |
13 | * |
14 | * Written or modified by: |
15 | * Dinakaran Joseph |
16 | * Jon Grimm <jgrimm@us.ibm.com> |
17 | * Sridhar Samudrala <sri@us.ibm.com> |
18 | * |
19 | * Rewritten to use libcrc32c by: |
20 | * Vlad Yasevich <vladislav.yasevich@hp.com> |
21 | */ |
22 | |
23 | #ifndef __sctp_checksum_h__ |
24 | #define __sctp_checksum_h__ |
25 | |
26 | #include <linux/types.h> |
27 | #include <linux/sctp.h> |
28 | #include <linux/crc32c.h> |
29 | #include <linux/crc32.h> |
30 | |
31 | static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum) |
32 | { |
33 | /* This uses the crypto implementation of crc32c, which is either |
34 | * implemented w/ hardware support or resolves to __crc32c_le(). |
35 | */ |
36 | return (__force __wsum)crc32c((__force __u32)sum, buff, len); |
37 | } |
38 | |
39 | static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2, |
40 | int offset, int len) |
41 | { |
42 | return (__force __wsum)__crc32c_le_combine((__force __u32)csum, |
43 | (__force __u32)csum2, len); |
44 | } |
45 | |
46 | static const struct skb_checksum_ops sctp_csum_ops = { |
47 | .update = sctp_csum_update, |
48 | .combine = sctp_csum_combine, |
49 | }; |
50 | |
51 | static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, |
52 | unsigned int offset) |
53 | { |
54 | struct sctphdr *sh = (struct sctphdr *)(skb->data + offset); |
55 | __le32 old = sh->checksum; |
56 | __wsum new; |
57 | |
58 | sh->checksum = 0; |
59 | new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0, |
60 | &sctp_csum_ops); |
61 | sh->checksum = old; |
62 | |
63 | return cpu_to_le32((__force __u32)new); |
64 | } |
65 | |
66 | #endif /* __sctp_checksum_h__ */ |
67 |
Warning: This file is not a C or C++ file. It does not have highlighting.