From: Asias He Date: Wed, 29 Jun 2011 08:47:16 +0000 (+0800) Subject: kvm tools: Implement uip_csum_udp() to calculate UDP checksum X-Git-Tag: next-20110824~3^2~176 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=6ae4ad4cd6f73145c1726bf6bb9c114cc83d688e;p=karo-tx-linux.git kvm tools: Implement uip_csum_udp() to calculate UDP checksum Signed-off-by: Asias He Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/include/kvm/uip.h b/tools/kvm/include/kvm/uip.h index 979e2b0d36c5..e2ad66aaf99f 100644 --- a/tools/kvm/include/kvm/uip.h +++ b/tools/kvm/include/kvm/uip.h @@ -161,6 +161,7 @@ int uip_tx_do_ipv4(struct uip_tx_arg *arg); int uip_tx_do_arp(struct uip_tx_arg *arg); u16 uip_csum_icmp(struct uip_icmp *icmp); +u16 uip_csum_udp(struct uip_udp *udp); u16 uip_csum_ip(struct uip_ip *ip); struct uip_buf *uip_buf_set_used(struct uip_info *info, struct uip_buf *buf); diff --git a/tools/kvm/uip/csum.c b/tools/kvm/uip/csum.c index c86bfdf74f9a..a152a0f85372 100644 --- a/tools/kvm/uip/csum.c +++ b/tools/kvm/uip/csum.c @@ -31,3 +31,32 @@ u16 uip_csum_icmp(struct uip_icmp *icmp) ip = &icmp->ip; return icmp->csum = uip_csum(0, &icmp->type, htons(ip->len) - uip_ip_hdrlen(ip) - 8); /* icmp header len = 8 */ } + +u16 uip_csum_udp(struct uip_udp *udp) +{ + struct uip_pseudo_hdr hdr; + struct uip_ip *ip; + int udp_len; + u8 *pad; + + ip = &udp->ip; + + hdr.sip = ip->sip; + hdr.dip = ip->dip; + hdr.zero = 0; + hdr.proto = ip->proto; + hdr.len = udp->len; + + udp_len = uip_udp_len(udp); + + if (udp_len % 2) { + pad = (u8 *)&udp->sport + udp_len; + *pad = 0; + memcpy((u8 *)&udp->sport + udp_len + 1, &hdr, sizeof(hdr)); + return uip_csum(0, (u8 *)&udp->sport, udp_len + 1 + sizeof(hdr)); + } else { + memcpy((u8 *)&udp->sport + udp_len, &hdr, sizeof(hdr)); + return uip_csum(0, (u8 *)&udp->sport, udp_len + sizeof(hdr)); + } + +}