summaryrefslogtreecommitdiffstats
path: root/net.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-05-15 20:58:31 +0000
committerRoy Marples <roy@marples.name>2008-05-15 20:58:31 +0000
commita2651060906270ac143fd6c83e76ffd4d7f2408b (patch)
treefc5c8357b42e2edce07728bca02590fc1c499434 /net.c
parentfba865f71d680975665008401f3c7c2964472de3 (diff)
downloaddhcpcd-a2651060906270ac143fd6c83e76ffd4d7f2408b.tar.xz
Try a new checksum routine.
Diffstat (limited to 'net.c')
-rw-r--r--net.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/net.c b/net.c
index b2dd4538..87feebef 100644
--- a/net.c
+++ b/net.c
@@ -468,20 +468,23 @@ struct udp_dhcp_packet
static uint16_t
checksum(const void *data, uint16_t len)
{
- const uint16_t *addr = data;
+ const uint8_t *addr = data;
uint32_t sum = 0;
while (len > 1) {
- sum += *addr++;
+ sum += addr[0] * 256 + addr[1];
+ addr += 2;
len -= 2;
}
if (len == 1)
- sum += *(const uint8_t *)addr;
+ sum += *addr * 256;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
+ sum = htons(sum);
+
return ~sum;
}