24inline std::uint16_t
fold(std::uint32_t sum)
26 sum = (sum >> 16) + (sum & 0xffff);
28 return static_cast<uint16_t
>(sum & 0x0000FFFF);
31inline std::uint16_t
cfold(
const std::uint32_t sum)
33 return static_cast<uint16_t
>(~fold(sum));
36inline std::uint32_t
unfold(
const std::uint16_t sum)
41inline std::uint32_t
cunfold(
const std::uint16_t sum)
46inline std::uint32_t
compute(
const std::uint8_t *buf,
size_t len)
48 std::uint32_t result = 0;
53 const bool odd = size_t(buf) & 1;
56#ifdef OPENVPN_LITTLE_ENDIAN
57 result += (*buf << 8);
69 result += *(std::uint16_t *)buf;
75 const uint8_t *end = buf + (len & ~3);
76 std::uint32_t carry = 0;
79 std::uint32_t w = *(std::uint32_t *)buf;
86 result = (result & 0xffff) + (result >> 16);
90 result += *(std::uint16_t *)buf;
96#ifdef OPENVPN_LITTLE_ENDIAN
99 result += (*buf << 8);
102 result =
fold(result);
104 result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
108inline std::uint32_t
compute(
const void *buf,
const size_t len)
110 return compute((
const std::uint8_t *)buf, len);
113inline std::uint32_t
partial(
const void *buf,
const size_t len,
const std::uint32_t sum)
115 std::uint32_t result =
compute(buf, len);
124inline std::uint32_t
diff16(
const std::uint32_t *old,
125 const std::uint32_t *new_,
126 const std::uint32_t oldsum)
129 std::uint32_t diff[8] = {~old[0], ~old[1], ~old[2], ~old[3],
130 new_[0], new_[1], new_[2], new_[3]};
131 return partial(diff,
sizeof(diff), oldsum);
135inline std::uint32_t
diff16(
const std::uint8_t *old,
136 const std::uint8_t *new_,
137 const std::uint32_t oldsum)
139 return diff16((
const std::uint32_t *)old, (
const std::uint32_t *)new_, oldsum);
142inline std::uint32_t
diff4(
const std::uint32_t old,
143 const std::uint32_t new_,
144 const std::uint32_t oldsum)
146 std::uint32_t diff[2] = {~old, new_};
147 return partial(diff,
sizeof(diff), oldsum);
150inline std::uint32_t
diff2(
const std::uint16_t old,
151 const std::uint16_t new_,
152 const std::uint32_t oldsum)
154 std::uint16_t diff[2] = {std::uint16_t(~old), new_};
155 return partial(diff,
sizeof(diff), oldsum);
158inline std::uint16_t
checksum(
const void *data,
const size_t size)
std::uint32_t diff16(const std::uint32_t *old, const std::uint32_t *new_, const std::uint32_t oldsum)
std::uint32_t compute(const std::uint8_t *buf, size_t len)
std::uint32_t partial(const void *buf, const size_t len, const std::uint32_t sum)
std::uint32_t cunfold(const std::uint16_t sum)
std::uint16_t fold(std::uint32_t sum)
std::uint32_t unfold(const std::uint16_t sum)
std::uint16_t cfold(const std::uint32_t sum)
std::uint32_t diff2(const std::uint16_t old, const std::uint16_t new_, const std::uint32_t oldsum)
std::uint16_t checksum(const void *data, const size_t size)
std::uint32_t diff4(const std::uint32_t old, const std::uint32_t new_, const std::uint32_t oldsum)