All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH NFSIM]: Fix invalid IP checksums on 64bit
@ 2005-01-06 14:29 Patrick McHardy
  2005-01-07  1:25 ` Patrick McHardy
  0 siblings, 1 reply; 2+ messages in thread
From: Patrick McHardy @ 2005-01-06 14:29 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Netfilter Development Mailinglist

[-- Attachment #1: Type: text/plain, Size: 246 bytes --]

IP checksums are calculated wrong on 64 bit because too large types are 
used.
This patch fixes them and a couple of unrelated snprintf-sizeof-warnings 
in the
same file. I still get invalid TCP checksums, but couldn't locate the 
problem yet.



[-- Attachment #2: 4.diff --]
[-- Type: text/x-patch, Size: 1537 bytes --]

Index: core/ipv4/ipv4.c
===================================================================
--- core/ipv4/ipv4.c	(revision 3578)
+++ core/ipv4/ipv4.c	(working copy)
@@ -565,7 +565,7 @@
 	iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
 }
 
-static inline unsigned short from32to16(unsigned long x)
+static inline unsigned short from32to16(unsigned int x)
 {
 	/* add up 16-bit and 16-bit for 16+c bit */
 	x = (x & 0xffff) + (x >> 16);
@@ -574,10 +574,10 @@
 	return x;
 }
 
-static unsigned long do_csum(const unsigned char * buff, int len)
+static unsigned int do_csum(const unsigned char * buff, int len)
 {
 	int odd, count;
-	unsigned long result = 0;
+	unsigned int result = 0;
 
 	if (len <= 0)
 		return 0;
@@ -819,7 +819,7 @@
 	switch (iph->protocol) {
 	case IPPROTO_ICMP:
 		icmph = (struct icmphdr *)(iph + 1);
-		ptr += sprintf(ptr, "%u %u ",
+		ptr += sprintf(ptr, "%Zu %u ",
 		       iplen - sizeof(struct icmphdr), iph->protocol);
 
 		if (len < sizeof(struct icmphdr)) {
@@ -855,7 +855,7 @@
 
 	case IPPROTO_UDP:
 		udph = (struct udphdr *)(iph + 1);
-		ptr += sprintf(ptr, "%u %u ",
+		ptr += sprintf(ptr, "%Zu %u ",
 		       iplen - sizeof(struct udphdr), iph->protocol);
 
 		if (len < sizeof(struct udphdr)) {
@@ -891,7 +891,7 @@
 		tcph = (struct tcphdr *)(iph + 1);
 		if (len < sizeof(struct tcphdr)) {
 			/* Assume no tcp options... */
-			ptr += sprintf(ptr, "%u %u ",
+			ptr += sprintf(ptr, "%Zu %u ",
 				       iplen - sizeof(*tcph), iph->protocol);
 
 			ptr += sprintf(ptr, "-TRUNCATED-");

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH NFSIM]: Fix invalid IP checksums on 64bit
  2005-01-06 14:29 [PATCH NFSIM]: Fix invalid IP checksums on 64bit Patrick McHardy
@ 2005-01-07  1:25 ` Patrick McHardy
  0 siblings, 0 replies; 2+ messages in thread
From: Patrick McHardy @ 2005-01-07  1:25 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Netfilter Development Mailinglist

[-- Attachment #1: Type: text/plain, Size: 440 bytes --]

Patrick McHardy wrote:

> IP checksums are calculated wrong on 64 bit because too large types 
> are used.
> This patch fixes them and a couple of unrelated 
> snprintf-sizeof-warnings in the
> same file. I still get invalid TCP checksums, but couldn't locate the 
> problem yet.
>
I found the real bug, my previous fix just hid it. This patch fixes
all checksum problems, the calculated checksum are equal to the ones
of a 32-bit binary.


[-- Attachment #2: 6.diff --]
[-- Type: text/x-patch, Size: 1203 bytes --]

Index: core/ipv4/ipv4.c
===================================================================
--- core/ipv4/ipv4.c	(revision 3579)
+++ core/ipv4/ipv4.c	(working copy)
@@ -600,7 +600,7 @@
 		if (count) {
 		        unsigned long carry = 0;
 			do {
-				unsigned long w = *(unsigned long *) buff;
+				unsigned int w = *(unsigned int *) buff;
 				count--;
 				buff += 4;
 				result += carry;
@@ -819,7 +819,7 @@
 	switch (iph->protocol) {
 	case IPPROTO_ICMP:
 		icmph = (struct icmphdr *)(iph + 1);
-		ptr += sprintf(ptr, "%u %u ",
+		ptr += sprintf(ptr, "%Zu %u ",
 		       iplen - sizeof(struct icmphdr), iph->protocol);
 
 		if (len < sizeof(struct icmphdr)) {
@@ -855,7 +855,7 @@
 
 	case IPPROTO_UDP:
 		udph = (struct udphdr *)(iph + 1);
-		ptr += sprintf(ptr, "%u %u ",
+		ptr += sprintf(ptr, "%Zu %u ",
 		       iplen - sizeof(struct udphdr), iph->protocol);
 
 		if (len < sizeof(struct udphdr)) {
@@ -891,7 +891,7 @@
 		tcph = (struct tcphdr *)(iph + 1);
 		if (len < sizeof(struct tcphdr)) {
 			/* Assume no tcp options... */
-			ptr += sprintf(ptr, "%u %u ",
+			ptr += sprintf(ptr, "%Zu %u ",
 				       iplen - sizeof(*tcph), iph->protocol);
 
 			ptr += sprintf(ptr, "-TRUNCATED-");

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2005-01-07  1:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-06 14:29 [PATCH NFSIM]: Fix invalid IP checksums on 64bit Patrick McHardy
2005-01-07  1:25 ` Patrick McHardy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.