14 const std::uint16_t *buf = (
const std::uint16_t *)ip;
15 std::uint32_t cksum = 0;
17 while (size >=
sizeof(std::uint16_t))
20 size -=
sizeof(std::uint16_t);
24 cksum += *(uint8_t *)buf;
26 cksum = (cksum >> 16) + (cksum & 0xffff);
27 cksum += (cksum >> 16);
28 return static_cast<uint16_t
>(~cksum);
36 for (
long i = 0; i < 1000000; ++i)
39 const size_t size = 16 + (prng->
rand_get<std::uint8_t>() & 127);
43 ASSERT_EQ(orig_csum,
ip_checksum_slow(raw, size)) <<
"checksum algorithm inconsistency #1";
45 std::uint8_t old_prefix[16];
46 std::memcpy(old_prefix, raw, 16);
47 const int n = (prng->
rand_get<std::uint8_t>() & 7);
48 for (
int j = 0; j < n; ++j)
50 const size_t idx = (prng->
rand_get<std::uint8_t>() & 15);
51 const std::uint8_t newval = prng->
rand_get<std::uint8_t>();
58 ASSERT_EQ(verify_csum,
ip_checksum_slow(raw, size)) <<
"checksum algorithm inconsistency #2";
59 ASSERT_EQ(updated_csum, verify_csum)
61 <<
" size=" << size <<
" n=" << n
62 <<
" orig=" << orig_csum
63 <<
" updated=" << updated_csum
64 <<
" verify=" << verify_csum
void init_headroom(const size_t headroom)
Initializes the headroom (offset) of the buffer.
T * write_alloc(const size_t size)
Allocate space for writing data to the buffer.
T rand_get()
Create a data object filled with random bytes.
virtual void rand_bytes(unsigned char *buf, size_t size)=0
Fill a buffer with random bytes.
std::uint32_t diff16(const std::uint32_t *old, const std::uint32_t *new_, const std::uint32_t oldsum)
std::uint32_t cunfold(const std::uint16_t sum)
std::uint16_t cfold(const std::uint32_t sum)
std::uint16_t checksum(const void *data, const size_t size)
std::uint16_t ip_checksum_slow(const void *ip, size_t size)