]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Implement IP checksum for uip
authorAsias He <asias.hejun@gmail.com>
Wed, 29 Jun 2011 08:47:09 +0000 (16:47 +0800)
committerPekka Enberg <penberg@kernel.org>
Thu, 30 Jun 2011 07:41:56 +0000 (10:41 +0300)
Other protocal, e.g. TCP, UDP, ICMP, can use uip_csum() to make
checsksum as well.

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/Makefile
tools/kvm/include/kvm/uip.h
tools/kvm/uip/csum.c [new file with mode: 0644]

index 7dc5bb2ebe320f1122815bf85a08d804da285f9e..ece542c0a20ef8fa2acfb3b89efa12abfbbb5824 100644 (file)
@@ -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
index e48420d8ec1d9f54df09904dc366f2c67d2680a5..00100e18a4676c8188cb9d12966fdd523e6a2c53 100644 (file)
@@ -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 (file)
index 0000000..8023ddb
--- /dev/null
@@ -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));
+}