xref: /kvmtool/net/uip/csum.c (revision d8db9f85af2aee50b6576937c7af5737c838d1c8)
1*d8db9f85SAsias He #include "kvm/uip.h"
2*d8db9f85SAsias He 
3*d8db9f85SAsias He static u16 uip_csum(u16 csum, u8 *addr, u16 count)
4*d8db9f85SAsias He {
5*d8db9f85SAsias He 	long sum = csum;
6*d8db9f85SAsias He 
7*d8db9f85SAsias He 	while (count > 1) {
8*d8db9f85SAsias He 		sum	+= *(u16 *)addr;
9*d8db9f85SAsias He 		addr	+= 2;
10*d8db9f85SAsias He 		count	-= 2;
11*d8db9f85SAsias He 	}
12*d8db9f85SAsias He 
13*d8db9f85SAsias He 	if (count > 0)
14*d8db9f85SAsias He 		sum += *(unsigned char *)addr;
15*d8db9f85SAsias He 
16*d8db9f85SAsias He 	while (sum>>16)
17*d8db9f85SAsias He 		sum = (sum & 0xffff) + (sum >> 16);
18*d8db9f85SAsias He 
19*d8db9f85SAsias He 	return ~sum;
20*d8db9f85SAsias He }
21*d8db9f85SAsias He 
22*d8db9f85SAsias He u16 uip_csum_ip(struct uip_ip *ip)
23*d8db9f85SAsias He {
24*d8db9f85SAsias He 	return uip_csum(0, &ip->vhl, uip_ip_hdrlen(ip));
25*d8db9f85SAsias He }
26