diff --git a/tests/sys/netinet/ip_reass_test.c b/tests/sys/netinet/ip_reass_test.c --- a/tests/sys/netinet/ip_reass_test.c +++ b/tests/sys/netinet/ip_reass_test.c @@ -56,23 +56,20 @@ }; static void -update_cksum(struct ip *ip) +update_cksum(void *ip) { size_t i; + uint16_t *cksump; uint32_t cksum; - uint8_t *cksump; - uint16_t tmp; - ip->ip_sum = 0; - cksump = (char *)ip; - for (cksum = 0, i = 0; i < sizeof(*ip) / sizeof(uint16_t); i++) { - tmp = *cksump++; - tmp = tmp << 8 | *cksump++; - cksum += ntohs(tmp); - } - cksum = (cksum >> 16) + (cksum & 0xffff); - cksum = ~(cksum + (cksum >> 16)); - ip->ip_sum = htons((uint16_t)cksum); + ((struct ip *)ip)->ip_sum = 0; + cksump = (uint16_t *)ip; + cksum = 0; + for (i = 0; i < sizeof(struct ip) / sizeof(uint16_t); i++) + cksum += *cksump++; + while ((cksum >> 16) != 0) + cksum = (cksum & 0xffff) + (cksum >> 16); + ((struct ip *)ip)->ip_sum = (uint16_t)(~cksum); } static struct lopacket *