Impl
inline unsigned short ip_standard_chksum(void* dataptr, int len) noexcept {
unsigned int acc;
unsigned short src;
unsigned char* octetptr;
acc = 0;
/* dataptr may be at odd or even addresses */
octetptr = (unsigned char*)dataptr;
while (len > 1) {
/* declare first octet as most significant
thus assume network order, ignoring host order */
src = (unsigned short)((*octetptr) << 8);
octetptr++;
/* declare second octet as least significant */
src |= (*octetptr);
octetptr++;
acc += src;
len -= 2;
}
if (len > 0) {
/* accumulate remaining octet */
src = (unsigned short)((*octetptr) << 8);
acc += src;
}
/* add deferred carry bits */
acc = (unsigned int)((acc >> 16) + (acc & 0x0000ffffUL));
if ((acc & 0xffff0000UL) != 0) {
acc = (unsigned int)((acc >> 16) + (acc & 0x0000ffffUL));
}
/* This maybe a little confusing: reorder sum using htons()
instead of ntohs() since it has a little less call overhead.
The caller must invert bits for Internet sum ! */
return ntohs((unsigned short)acc);
}
inline unsigned short inet_chksum(void* dataptr, int len) noexcept {
return (unsigned short)~ip_standard_chksum(dataptr, len);
}
inline unsigned int FOLD_U32T(unsigned int u) noexcept {
return ((unsigned int)(((u) >> 16) + ((u) & 0x0000ffffUL)));
}
inline unsigned int SWAP_BYTES_IN_WORD(unsigned int w) noexcept {
return (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8);
}
inline unsigned short ine