rpms/xenner/F-9 xenner-csum.diff,NONE,1.1 xenner.spec,1.11,1.12

Gerd Hoffmann (kraxel) fedora-extras-commits at redhat.com
Wed Apr 23 08:45:41 UTC 2008


Author: kraxel

Update of /cvs/pkgs/rpms/xenner/F-9
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv23207

Modified Files:
	xenner.spec 
Added Files:
	xenner-csum.diff 
Log Message:
- fix tcp/udp checksumming (rhbz #443452).

xenner-csum.diff:

--- NEW FILE xenner-csum.diff ---
# HG changeset patch
# User kraxel
# Date Tue Apr 22 13:08:42 2008 +0000
# Node ID 34f0d0f825f1b9810446b5c07cad67ddcbad0616
# parent: 09f969f7c71c02e443fd0d69e392a7cf505d82cf
- netbackd: implement tcp/udp checksumming
  (offloading to tun device doesn't work ...)

--- a/GNUmakefile	Wed Apr 16 06:47:56 2008 +0000
+++ b/GNUmakefile	Tue Apr 22 13:08:42 2008 +0000
@@ -128,7 +128,7 @@ xenner-stats: xenner-stats.o statistics.
 
 evtchnd: evtchnd.o daemon.o
 blkbackd: blkbackd.o xenbackd.o daemon.o libqemublock.a
-netbackd: netbackd.o xenbackd.o daemon.o
+netbackd: netbackd.o xenbackd.o daemon.o checksum.o hexdump.o
 vfbbackd: vfbbackd.o xenbackd.o daemon.o libxenctrl.a
 
 
--- a/Run.sh	Wed Apr 16 06:47:56 2008 +0000
+++ b/Run.sh	Tue Apr 22 13:08:42 2008 +0000
@@ -8,8 +8,8 @@ append_os="xencons=xvc console=xvc0 root
 append_os="xencons=xvc console=xvc0 root=/dev/ram0 rw ramdisk_size=65536"
 
 # defaults
-#kernel32="$(echo test/vmlinux-xen31-32.bin)"
-kernel32="$(echo $HOME/BUILD/kernel-2.6.18*/linux-*/build-i386-xen32/vmlinux)"
+kernel32="$(echo test/vmlinux-xen31-32.bin)"
+#kernel32="$(echo $HOME/BUILD/kernel-2.6.18*/linux-*/build-i386-xen32/vmlinux)"
 initrd32="$initrd_tty"
 append32="$append_tty"
 
@@ -57,6 +57,7 @@ done
 
 # boot
 set -ex
-exec ./xenner -m 128 -k "$kernel" -K "${kernel}.asm" \
-	-r "$initrd" -a "$append" -l xenner.log \
+exec ./xenner -m 128 -kernel "$kernel" -initrd "$initrd" \
+	-append "$append" -logfile xenner.log \
+	-network 00:00:11:22:33:44,br0 \
 	"$@"
--- a/netbackd.c	Wed Apr 16 06:47:56 2008 +0000
+++ b/netbackd.c	Tue Apr 22 13:08:42 2008 +0000
@@ -26,6 +26,7 @@
 #include "list.h"
 #include "daemon.h"
 #include "xenbackd.h"
+#include "checksum.h"
 
 /* ------------------------------------------------------------- */
 
@@ -176,16 +177,12 @@ static void *net_tx_thread(void *arg)
 		net_tx_error(netdev, &txreq, rc);
 		continue;
 	    }
-	    if (txreq.flags & NETTXF_extra_info) {
+	    if (txreq.flags & NETTXF_more_data) {
 		d1printf("%s: FIXME: more data flag\n", __FUNCTION__);
 		net_tx_error(netdev, &txreq, rc);
 		continue;
 	    }
 #endif
-	    if (txreq.flags & NETTXF_csum_blank) {
-		/* ask tun to checksum for us */
-		netdev_nocsum(netdev, 1);
-	    }
 
 	    if (txreq.size < 14) {
 		d1printf("%s: bad packet size: %d\n", __FUNCTION__, txreq.size);
@@ -211,13 +208,15 @@ static void *net_tx_thread(void *arg)
 	    page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev,
 					   netdev->xendev.dom,
 					   txreq.gref, PROT_READ);
-	    d2printf("%s: map grant ref %d -> %p\n", __FUNCTION__,
+	    d3printf("%s: map grant ref %d -> %p\n", __FUNCTION__,
 		     txreq.gref, page);
 	    if (NULL == page) {
 		d1printf("%s: error: gref dereference failed\n", __FUNCTION__);
 		net_tx_error(netdev, &txreq, rc);
 		continue;
 	    }
+	    if (txreq.flags & NETTXF_csum_blank)
+		checksum_calculate(page + txreq.offset, txreq.size);
 	    len = write(netdev->tun, page + txreq.offset, txreq.size);
 	    xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1);
 	    status = (len == txreq.size) ? NETIF_RSP_OKAY : NETIF_RSP_ERROR;
@@ -255,7 +254,7 @@ static void net_rx_response(struct netde
     }
     
 #if 1
-    d2printf("%s: status %d, flags 0x%x\n",
+    d3printf("%s: status %d, flags 0x%x\n",
 	     __FUNCTION__, resp->status, resp->flags);
 #endif
     
@@ -300,7 +299,7 @@ static void *net_rx_thread(void *arg)
 	page = xc_gnttab_map_grant_ref(netdev->xendev.gnttabdev,
 				       netdev->xendev.dom,
 				       rxreq.gref, PROT_WRITE);
-	d2printf("%s: map grant ref %d -> %p\n", __FUNCTION__,
+	d3printf("%s: map grant ref %d -> %p\n", __FUNCTION__,
 		 rxreq.gref, page);
 	if (NULL == page) {
 	    d1printf("%s: error: gref dereference failed\n", __FUNCTION__);
@@ -346,6 +345,8 @@ static void netdev_nocsum(struct netdev 
     netdev->nocsum = nocsum;
     if (-1 == ioctl(netdev->tun, TUNSETNOCSUM, netdev->nocsum))
 	d1printf("ioctl TUNSETNOCSUM %d: %s\n", netdev->nocsum, strerror(errno));
+    else
+	d1printf("ioctl TUNSETNOCSUM %d: ok\n", netdev->nocsum);
 }
 	    
 /* ------------------------------------------------------------- */
@@ -396,10 +397,10 @@ static void net_setup_backend(struct net
 	strncpy(netdev->ifname, ifreq.ifr_name, IFNAMSIZ);
 	d1printf("%s: created interface %s\n", __FUNCTION__, netdev->ifname);
 
+	netdev->nocsum = -1;
+	netdev_nocsum(netdev, 1);
 	if (netdev->bridge)
 	    netdev_bridge_init(netdev);
-	if (-1 == ioctl(netdev->tun, TUNSETNOCSUM, netdev->nocsum))
-	    d1printf("ioctl TUNSETIFF %d: %s\n", netdev->nocsum, strerror(errno));
 	if (-1 == ioctl(netdev->tun, TUNSETPERSIST, 0))
 	    d1printf("ioctl TUNSETPERSIST off: %s\n", strerror(errno));
 	    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/checksum.c	Tue Apr 22 13:08:42 2008 +0000
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+#include "checksum.h"
+#include "daemon.h"
+#include "hexdump.h"
+
+static uint32_t checksum_add(int len, uint8_t *buf)
+{
+    uint32_t sum = 0;
+    int i;
+
+    for (i = 0; i < len; i++) {
+	if (i & 1)
+	    sum += (uint32_t)buf[i];
+	else
+	    sum += (uint32_t)buf[i] << 8;
+    }
+    return sum;
+}
+
+static uint16_t checksum_finish(uint32_t sum)
+{
+    while (sum>>16)
+	sum = (sum & 0xFFFF)+(sum >> 16);
+    return ~sum;
+}
+
+uint16_t checksum_ip_hdr(int len, uint8_t *buf)
+{
+    return checksum_finish(checksum_add(len, buf));
+}
+
+uint16_t checksum_tcpudp(uint16_t length, uint16_t proto,
+			 uint8_t *addrs, uint8_t *buf)
+{
+    uint32_t sum = 0;
+    
+    sum += checksum_add(length, buf);         // payload
+    sum += checksum_add(8, addrs);            // src + dst address
+    sum += proto + length;                    // protocol & length
+    return checksum_finish(sum);
+}
+
+void checksum_calculate(uint8_t *data, int length)
+{
+    int hlen, plen, proto, csum_offset;
+    uint16_t csum;
+
+    if ((data[14] & 0xf0) != 0x40)
+	return; /* not IPv4 */
+    hlen  = (data[14] & 0x0f) * 4;
+    plen  = (data[16] << 8 | data[17]) - hlen;
+    proto = data[23];
+
+    switch (proto) {
+    case PROTO_TCP:
+	csum_offset = 16;
+	break;
+    case PROTO_UDP:
+	csum_offset = 6;
+	break;
+    default:
+	return;
+    }
+
+    if (plen < csum_offset+2)
+	return;
+
+    data[14+hlen+csum_offset]   = 0;
+    data[14+hlen+csum_offset+1] = 0;
+    csum = checksum_tcpudp(plen, proto, data+14+12, data+14+hlen);
+    data[14+hlen+csum_offset]   = csum >> 8;
+    data[14+hlen+csum_offset+1] = csum & 0xff;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/checksum.h	Tue Apr 22 13:08:42 2008 +0000
@@ -0,0 +1,7 @@
+#define PROTO_TCP  6
+#define PROTO_UDP 17
+
+uint16_t checksum_ip_hdr(int len, uint8_t *buf);
+uint16_t checksum_tcpudp(uint16_t length, uint16_t proto,
+			 uint8_t *addrs, uint8_t *buf);
+void checksum_calculate(uint8_t *data, int length);



Index: xenner.spec
===================================================================
RCS file: /cvs/pkgs/rpms/xenner/F-9/xenner.spec,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- xenner.spec	11 Apr 2008 15:17:03 -0000	1.11
+++ xenner.spec	23 Apr 2008 08:45:06 -0000	1.12
@@ -1,11 +1,12 @@
 Name:         xenner
 License:      GPLv2+
 Version:      0.29
-Release:      1%{?dist}
+Release:      2%{?dist}
 Summary:      Xen emulator for kvm
 Group:        Applications/Emulators
 Source:       %{name}-%{version}.tar.gz
 Patch01:      %{name}-mmx.diff
+Patch02:      %{name}-csum.diff
 URL:          http://dl.bytesex.org/releases/%{name}/%{name}-%{version}.tar.gz
 Requires:     xen-runtime
 Provides:     xen-hypervisor-abi = 3.2
@@ -25,6 +26,7 @@
 %prep
 %setup -q
 %patch01 -p1 -b .mmx
+%patch02 -p1 -b .csum
 
 %build
 export CFLAGS="%{optflags}"
@@ -56,6 +58,8 @@
 rm -rf %{buildroot}
 
 %changelog
+* Tue Apr 22 2008 Gerd Hoffmann <kraxel at redhat.com> - 0.29-2.fc9
+- fix tcp/udp checksumming (rhbz #443452).
 * Fri Apr 11 2008 Gerd Hoffmann <kraxel at redhat.com> - 0.29-1.fc9
 - update to version 0.29
   - merge Daniels fixes.




More information about the scm-commits mailing list