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