* [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.