From: Asias He Date: Wed, 29 Jun 2011 08:47:09 +0000 (+0800) Subject: kvm tools: Implement IP checksum for uip X-Git-Tag: next-20110824~3^2~183 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=624043fdc10ddab50157e6bdcde8f04e3f066a5a;p=karo-tx-linux.git kvm tools: Implement IP checksum for uip Other protocal, e.g. TCP, UDP, ICMP, can use uip_csum() to make checsksum as well. Signed-off-by: Asias He Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile index 7dc5bb2ebe32..ece542c0a20e 100644 --- a/tools/kvm/Makefile +++ b/tools/kvm/Makefile @@ -48,6 +48,7 @@ OBJS += irq.o OBJS += uip/arp.o OBJS += uip/ipv4.o OBJS += uip/buf.o +OBJS += uip/csum.o OBJS += kvm-cmd.o OBJS += kvm-debug.o OBJS += kvm-help.o diff --git a/tools/kvm/include/kvm/uip.h b/tools/kvm/include/kvm/uip.h index e48420d8ec1d..00100e18a467 100644 --- a/tools/kvm/include/kvm/uip.h +++ b/tools/kvm/include/kvm/uip.h @@ -103,6 +103,8 @@ static inline u16 uip_ip_len(struct uip_ip *ip) int uip_tx_do_ipv4(struct uip_tx_arg *arg); int uip_tx_do_arp(struct uip_tx_arg *arg); +u16 uip_csum_ip(struct uip_ip *ip); + struct uip_buf *uip_buf_set_used(struct uip_info *info, struct uip_buf *buf); struct uip_buf *uip_buf_set_free(struct uip_info *info, struct uip_buf *buf); struct uip_buf *uip_buf_get_used(struct uip_info *info); diff --git a/tools/kvm/uip/csum.c b/tools/kvm/uip/csum.c new file mode 100644 index 000000000000..8023ddbc71aa --- /dev/null +++ b/tools/kvm/uip/csum.c @@ -0,0 +1,25 @@ +#include "kvm/uip.h" + +static u16 uip_csum(u16 csum, u8 *addr, u16 count) +{ + long sum = csum; + + while (count > 1) { + sum += *(u16 *)addr; + addr += 2; + count -= 2; + } + + if (count > 0) + sum += *(unsigned char *)addr; + + while (sum>>16) + sum = (sum & 0xffff) + (sum >> 16); + + return ~sum; +} + +u16 uip_csum_ip(struct uip_ip *ip) +{ + return uip_csum(0, &ip->vhl, uip_ip_hdrlen(ip)); +}