49#include <machine/in_cksum.h>
56#ifndef HAVE_MD_IN_CKSUM
66#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x)
70 sum = q_util.s[0] + q_util.s[1] + q_util.s[2] + q_util.s[3]; \
75 l_util.l = q_util.s[0] + q_util.s[1] + q_util.s[2] + q_util.s[3]; \
76 sum = l_util.s[0] + l_util.s[1]; \
81#if _BYTE_ORDER == _LITTLE_ENDIAN
83 0x00000000, 0x000000FF, 0x0000FFFF, 0x00FFFFFF,
84 0x00000000, 0x0000FF00, 0x00FFFF00, 0xFFFFFF00,
85 0x00000000, 0x00FF0000, 0xFFFF0000, 0xFFFF0000,
86 0x00000000, 0xFF000000, 0xFF000000, 0xFF000000,
89 0x00000000, 0xFF000000, 0xFFFF0000, 0xFFFFFF00,
90 0x00000000, 0x00FF0000, 0x00FFFF00, 0x00FFFFFF,
91 0x00000000, 0x0000FF00, 0x0000FFFF, 0x0000FFFF,
92 0x00000000, 0x000000FF, 0x000000FF, 0x000000FF,
109 const u_int32_t *lw = (
const u_int32_t *) buf;
115 if ((3 & (
long) lw) == 0 && len == 20) {
116 sum = (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3] + lw[4];
121 if ((offset = 3 & (
long) lw) != 0) {
122 const u_int32_t *masks =
in_masks + (offset << 2);
123 lw = (u_int32_t *) (((
long) lw) - offset);
124 sum = *lw++ & masks[len >= 3 ? 3 : len];
135 offset = 32 - (0x1f & (long) lw);
136 if (offset < 32 && len > offset) {
139 sum += (u_int64_t) lw[0];
143 sum += (u_int64_t) lw[0] + lw[1];
147 sum += (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3];
158 while ((len -= 32) >= 4) {
159 u_int64_t prefilling = lw[8];
160 sum += prefilled + lw[1] + lw[2] + lw[3]
161 + lw[4] + lw[5] + lw[6] + lw[7];
163 prefilled = prefilling;
166 sum += prefilled + lw[1] + lw[2] + lw[3]
167 + lw[4] + lw[5] + lw[6] + lw[7];
172 while ((len -= 16) >= 0) {
173 sum += (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3];
177 while ((len -= 4) >= 0) {
178 sum += (u_int64_t) *lw++;
182 sum += (u_int64_t) (
in_masks[len] & *lw);
190 u_int64_t sum = a + b;
203 sum = (u_int64_t) a + b + c;
219 if (((uintptr_t)data ^ a->
clen) & 1)
246 return (~sum & 0xffff);
255 return (~sum & 0xffff);
static u_int64_t in_cksumdata(const void *buf, int len)
u_short in_addword(u_short a, u_short b)
u_int in_cksum_hdr(const struct ip *ip)
u_short in_cksum_skip(struct mbuf *m, int len, int skip)
static int in_cksum_skip_partial(void *arg, void *data, u_int len)
u_short in_pseudo(u_int32_t a, u_int32_t b, u_int32_t c)
static const u_int32_t in_masks[]