0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #ifndef __sctp_checksum_h__
0024 #define __sctp_checksum_h__
0025
0026 #include <linux/types.h>
0027 #include <net/sctp/sctp.h>
0028 #include <linux/crc32c.h>
0029 #include <linux/crc32.h>
0030
0031 static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum)
0032 {
0033
0034
0035
0036 return (__force __wsum)crc32c((__force __u32)sum, buff, len);
0037 }
0038
0039 static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2,
0040 int offset, int len)
0041 {
0042 return (__force __wsum)__crc32c_le_combine((__force __u32)csum,
0043 (__force __u32)csum2, len);
0044 }
0045
0046 static const struct skb_checksum_ops sctp_csum_ops = {
0047 .update = sctp_csum_update,
0048 .combine = sctp_csum_combine,
0049 };
0050
0051 static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
0052 unsigned int offset)
0053 {
0054 struct sctphdr *sh = (struct sctphdr *)(skb->data + offset);
0055 __le32 old = sh->checksum;
0056 __wsum new;
0057
0058 sh->checksum = 0;
0059 new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0,
0060 &sctp_csum_ops);
0061 sh->checksum = old;
0062
0063 return cpu_to_le32((__force __u32)new);
0064 }
0065
0066 #endif