42
42
#include <linux/types.h>
43
43
#include <net/sctp/sctp.h>
44
44
#include <linux/crc32c.h>
46
static inline __u32 sctp_crc32c(__u32 crc, u8 *buffer, u16 length)
48
return crc32c(crc, buffer, length);
51
static inline __u32 sctp_start_cksum(__u8 *buffer, __u16 length)
53
__u32 crc = ~(__u32)0;
54
__u8 zero[sizeof(__u32)] = {0};
56
/* Optimize this routine to be SCTP specific, knowing how
57
* to skip the checksum field of the SCTP header.
45
#include <linux/crc32.h>
47
static inline __wsum sctp_csum_update(const void *buff, int len, __wsum sum)
49
/* This uses the crypto implementation of crc32c, which is either
50
* implemented w/ hardware support or resolves to __crc32c_le().
60
/* Calculate CRC up to the checksum. */
61
crc = sctp_crc32c(crc, buffer, sizeof(struct sctphdr) - sizeof(__u32));
63
/* Skip checksum field of the header. */
64
crc = sctp_crc32c(crc, zero, sizeof(__u32));
66
/* Calculate the rest of the CRC. */
67
crc = sctp_crc32c(crc, &buffer[sizeof(struct sctphdr)],
68
length - sizeof(struct sctphdr));
72
static inline __u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32)
74
return sctp_crc32c(crc32, buffer, length);
77
static inline __le32 sctp_end_cksum(__u32 crc32)
79
return cpu_to_le32(~crc32);
82
/* Calculate the CRC32C checksum of an SCTP packet. */
52
return crc32c(sum, buff, len);
55
static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2,
58
return __crc32c_le_combine(csum, csum2, len);
83
61
static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
84
62
unsigned int offset)
86
const struct sk_buff *iter;
88
__u32 crc32 = sctp_start_cksum(skb->data + offset,
89
skb_headlen(skb) - offset);
90
skb_walk_frags(skb, iter)
91
crc32 = sctp_update_cksum((__u8 *) iter->data,
92
skb_headlen(iter), crc32);
94
return sctp_end_cksum(crc32);
64
struct sctphdr *sh = sctp_hdr(skb);
65
__le32 ret, old = sh->checksum;
66
const struct skb_checksum_ops ops = {
67
.update = sctp_csum_update,
68
.combine = sctp_csum_combine,
72
ret = cpu_to_le32(~__skb_checksum(skb, offset, skb->len - offset,
97
79
#endif /* __sctp_checksum_h__ */