6 static inline unsigned short from32to16(
unsigned int x) {
8 x = (x & 0xffff) + (x >> 16);
10 x = (x & 0xffff) + (x >> 16);
15 static unsigned int do_csum(
const unsigned char *buff,
int len) {
17 unsigned int result = 0;
21 odd = 1 & (
unsigned long) buff;
23 #ifdef __LITTLE_ENDIAN 24 result += (*buff << 8);
32 if (2 & (
unsigned long) buff) {
33 result += *(
unsigned short *) buff;
38 const unsigned char *end = buff + ((unsigned)len & ~3);
39 unsigned int carry = 0;
41 unsigned int w = *(
unsigned int *) buff;
48 result = (result & 0xffff) + (result >> 16);
51 result += *(
unsigned short *) buff;
56 #ifdef __LITTLE_ENDIAN 59 result += (*buff << 8);
61 result = from32to16(result);
63 result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
86 return (__sum16)~do_csum(iph,ihl*4);
__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
Calculate the IPv4 checksum (optimized for IP headers, which always checksum on 4 octet boundaries) ...