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
- Previous message: rpms/sysstat/F-9 sysstat-8.0.4-cpu.patch, NONE, 1.1 sysstat.spec, 1.63, 1.64
- Next message: rpms/ocaml/devel .cvsignore, 1.9, 1.10 ocaml.spec, 1.38, 1.39 sources, 1.11, 1.12
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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.
- Previous message: rpms/sysstat/F-9 sysstat-8.0.4-cpu.patch, NONE, 1.1 sysstat.spec, 1.63, 1.64
- Next message: rpms/ocaml/devel .cvsignore, 1.9, 1.10 ocaml.spec, 1.38, 1.39 sources, 1.11, 1.12
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the scm-commits
mailing list