* [Qemu-devel] [PATCH] Add IP checksuming functions to qemu.
@ 2008-07-29 14:03 Gerd Hoffmann
2008-07-29 14:44 ` Anthony Liguori
0 siblings, 1 reply; 2+ messages in thread
From: Gerd Hoffmann @ 2008-07-29 14:03 UTC (permalink / raw)
To: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 131 bytes --]
Hi folks,
This patch adds IP checksumming functions to qemu, so not every nic
driver needs do to it on its own.
cheers,
Gerd
[-- Attachment #2: 0004-Add-IP-checksumming-functions-to-qemu.patch --]
[-- Type: text/x-patch, Size: 3157 bytes --]
>From 1070650dcedeb966fd9baf499c1f85488a1aa48c Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Tue, 29 Jul 2008 13:25:12 +0200
Subject: [PATCH 04/22] Add IP checksumming functions to qemu.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
Makefile.target | 2 +-
net-checksum.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
net.h | 7 +++++
3 files changed, 77 insertions(+), 1 deletions(-)
create mode 100644 net-checksum.c
diff --git a/Makefile.target b/Makefile.target
index ff105c1..42162c3 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -472,7 +472,7 @@ endif #CONFIG_DARWIN_USER
# System emulator target
ifndef CONFIG_USER_ONLY
-OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o
+OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o net-checksum.o
ifdef CONFIG_WIN32
OBJS+=block-raw-win32.o
else
diff --git a/net-checksum.c b/net-checksum.c
new file mode 100644
index 0000000..2aefae2
--- /dev/null
+++ b/net-checksum.c
@@ -0,0 +1,69 @@
+#include "hw/hw.h"
+#include "net.h"
+
+#define PROTO_TCP 6
+#define PROTO_UDP 17
+
+uint32_t net_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;
+}
+
+uint16_t net_checksum_finish(uint32_t sum)
+{
+ while (sum>>16)
+ sum = (sum & 0xFFFF)+(sum >> 16);
+ return ~sum;
+}
+
+uint16_t net_checksum_tcpudp(uint16_t length, uint16_t proto,
+ uint8_t *addrs, uint8_t *buf)
+{
+ uint32_t sum = 0;
+
+ sum += net_checksum_add(length, buf); // payload
+ sum += net_checksum_add(8, addrs); // src + dst address
+ sum += proto + length; // protocol & length
+ return net_checksum_finish(sum);
+}
+
+void net_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 = net_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;
+}
diff --git a/net.h b/net.h
index d00910f..5212b48 100644
--- a/net.h
+++ b/net.h
@@ -48,4 +48,11 @@ struct NICInfo {
extern int nb_nics;
extern NICInfo nd_table[MAX_NICS];
+/* checksumming functions (net-checksum.c) */
+uint32_t net_checksum_add(int len, uint8_t *buf);
+uint16_t net_checksum_finish(uint32_t sum);
+uint16_t net_checksum_tcpudp(uint16_t length, uint16_t proto,
+ uint8_t *addrs, uint8_t *buf);
+void net_checksum_calculate(uint8_t *data, int length);
+
#endif
--
1.5.4.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH] Add IP checksuming functions to qemu.
2008-07-29 14:03 [Qemu-devel] [PATCH] Add IP checksuming functions to qemu Gerd Hoffmann
@ 2008-07-29 14:44 ` Anthony Liguori
0 siblings, 0 replies; 2+ messages in thread
From: Anthony Liguori @ 2008-07-29 14:44 UTC (permalink / raw)
To: qemu-devel
Gerd Hoffmann wrote:
> Hi folks,
>
> This patch adds IP checksumming functions to qemu, so not every nic
> driver needs do to it on its own.
>
> cheers,
> Gerd
>
> From 1070650dcedeb966fd9baf499c1f85488a1aa48c Mon Sep 17 00:00:00 2001
> From: Gerd Hoffmann <kraxel@redhat.com>
> Date: Tue, 29 Jul 2008 13:25:12 +0200
> Subject: [PATCH 04/22] Add IP checksumming functions to qemu.
>
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> Makefile.target | 2 +-
> net-checksum.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> net.h | 7 +++++
> 3 files changed, 77 insertions(+), 1 deletions(-)
> create mode 100644 net-checksum.c
>
> diff --git a/Makefile.target b/Makefile.target
> index ff105c1..42162c3 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -472,7 +472,7 @@ endif #CONFIG_DARWIN_USER
> # System emulator target
> ifndef CONFIG_USER_ONLY
>
> -OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o
> +OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o net-checksum.o
> ifdef CONFIG_WIN32
> OBJS+=block-raw-win32.o
> else
> diff --git a/net-checksum.c b/net-checksum.c
> new file mode 100644
> index 0000000..2aefae2
> --- /dev/null
> +++ b/net-checksum.c
> @@ -0,0 +1,69 @@
>
Can you please add a license/copyright? Since QEMU is mixed licensed,
it's important to have a license in every file.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-07-29 14:44 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-29 14:03 [Qemu-devel] [PATCH] Add IP checksuming functions to qemu Gerd Hoffmann
2008-07-29 14:44 ` Anthony Liguori
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).