53 |
{ |
{ |
54 |
u32_t acc; |
u32_t acc; |
55 |
|
|
56 |
|
DEBUGF(INET_DEBUG, ("lwip_chksum(%p, %d)\n", dataptr, len)); |
57 |
for(acc = 0; len > 1; len -= 2) { |
for(acc = 0; len > 1; len -= 2) { |
58 |
acc = acc + *((u16_t *)dataptr)++; |
// acc = acc + *((u16_t *)dataptr)++; |
59 |
|
acc += *(u16_t *)dataptr; |
60 |
|
dataptr = (void *)((u16_t *)dataptr + 1); |
61 |
} |
} |
62 |
|
|
63 |
/* add up any odd byte */ |
/* add up any odd byte */ |
64 |
if(len == 1) { |
if(len == 1) { |
65 |
acc += htons((u16_t)((*(u8_t *)dataptr) & 0xff) << 8); |
acc += htons((u16_t)((*(u8_t *)dataptr) & 0xff) << 8); |
66 |
DEBUGF(INET_DEBUG, ("inet: chksum: odd byte %d\n", *(u8_t *)dataptr)); |
DEBUGF(INET_DEBUG, ("inet: chksum: odd byte %d\n", *(u8_t *)dataptr)); |
67 |
|
} else { |
68 |
|
DEBUGF(INET_DEBUG, ("inet: chksum: no odd byte\n")); |
69 |
} |
} |
70 |
acc = (acc >> 16) + (acc & 0xffffUL); |
acc = (acc >> 16) + (acc & 0xffffUL); |
71 |
|
|
92 |
|
|
93 |
acc = 0; |
acc = 0; |
94 |
swapped = 0; |
swapped = 0; |
95 |
|
/* iterate through all pbuf in chain */ |
96 |
for(q = p; q != NULL; q = q->next) { |
for(q = p; q != NULL; q = q->next) { |
97 |
|
DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", q, q->next)); |
98 |
acc += lwip_chksum(q->payload, q->len); |
acc += lwip_chksum(q->payload, q->len); |
99 |
|
//DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%lx \n", acc)); |
100 |
while(acc >> 16) { |
while(acc >> 16) { |
101 |
acc = (acc & 0xffffUL) + (acc >> 16); |
acc = (acc & 0xffffUL) + (acc >> 16); |
102 |
} |
} |
104 |
swapped = 1 - swapped; |
swapped = 1 - swapped; |
105 |
acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8); |
acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8); |
106 |
} |
} |
107 |
|
//DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%lx \n", acc)); |
108 |
} |
} |
109 |
|
|
110 |
if(swapped) { |
if(swapped) { |
120 |
while(acc >> 16) { |
while(acc >> 16) { |
121 |
acc = (acc & 0xffffUL) + (acc >> 16); |
acc = (acc & 0xffffUL) + (acc >> 16); |
122 |
} |
} |
123 |
|
DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%lx\n", acc)); |
124 |
return ~(acc & 0xffffUL); |
return ~(acc & 0xffffUL); |
125 |
} |
} |
126 |
/*-----------------------------------------------------------------------------------*/ |
/*-----------------------------------------------------------------------------------*/ |