2009-09-25 14:20:13

by Matt Fleming

[permalink] [raw]
Subject: [PATCH] lib/checksum.c: Fix another endianess bug

From: Matt Fleming <[email protected]>

This fix allows the generic checksum code to work on my little endian
system. The previous fix was not enough, as "buff" is a big-endian
value. Without this patch I see malformed TCP packets.

Signed-off-by: Matt Fleming <[email protected]>
---
lib/checksum.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/checksum.c b/lib/checksum.c
index b2e2fd4..c34f030 100644
--- a/lib/checksum.c
+++ b/lib/checksum.c
@@ -55,10 +55,10 @@ static unsigned int do_csum(const unsigned char *buff, int len)
goto out;
odd = 1 & (unsigned long) buff;
if (odd) {
-#ifdef __LITTLE_ENDIAN
+#ifdef __BIG_ENDIAN
result = *buff;
#else
- result += (*buff << 8);
+ result = (*buff << 8);
#endif
len--;
buff++;
--
1.6.3.GIT


2009-09-25 17:00:42

by Mike Frysinger

[permalink] [raw]
Subject: Re: [PATCH] lib/checksum.c: Fix another endianess bug

On Fri, Sep 25, 2009 at 10:20, Matt Fleming wrote:
> From: Matt Fleming <[email protected]>
>
> This fix allows the generic checksum code to work on my little endian
> system. The previous fix was not enough, as "buff" is a big-endian
> value. Without this patch I see malformed TCP packets.

can you try this one ?
http://lkml.org/lkml/2009/6/23/597
-mike

2009-09-28 08:06:55

by Matt Fleming

[permalink] [raw]
Subject: Re: [PATCH] lib/checksum.c: Fix another endianess bug

On Fri, Sep 25, 2009 at 01:00:25PM -0400, Mike Frysinger wrote:
> On Fri, Sep 25, 2009 at 10:20, Matt Fleming wrote:
> > From: Matt Fleming <[email protected]>
> >
> > This fix allows the generic checksum code to work on my little endian
> > system. The previous fix was not enough, as "buff" is a big-endian
> > value. Without this patch I see malformed TCP packets.
>
> can you try this one ?
> http://lkml.org/lkml/2009/6/23/597
> -mike

Yep, that one works fine also. Thanks, Mike. Who's going to pick this
up? I'm guessing this commit is also applicable for stable? Though, I
don't know if there are any little-endian users of this code in stable.

2009-09-28 20:39:56

by Mike Frysinger

[permalink] [raw]
Subject: Re: [PATCH] lib/checksum.c: Fix another endianess bug

On Mon, Sep 28, 2009 at 04:07, Matt Fleming wrote:
> On Fri, Sep 25, 2009 at 01:00:25PM -0400, Mike Frysinger wrote:
>> On Fri, Sep 25, 2009 at 10:20, Matt Fleming wrote:
>> > From: Matt Fleming <[email protected]>
>> >
>> > This fix allows the generic checksum code to work on my little endian
>> > system. The previous fix was not enough, as "buff" is a big-endian
>> > value. Without this patch I see malformed TCP packets.
>>
>> can you try this one ?
>> http://lkml.org/lkml/2009/6/23/597
>
> Yep, that one works fine also. Thanks, Mike. Who's going to pick this
> up? I'm guessing this commit is also applicable for stable? Though, I
> don't know if there are any little-endian users of this code in stable.

i'm converting Blackfin to it now that the LE issues should be fixed,
but i'm going to hold off on pushing the change until it can be tested

as for picking up the fix, let's ask Andrew ...
-mike

2009-10-24 11:58:45

by Matt Fleming

[permalink] [raw]
Subject: Re: [PATCH] lib/checksum.c: Fix another endianess bug

On Mon, Sep 28, 2009 at 04:39:38PM -0400, Mike Frysinger wrote:
> On Mon, Sep 28, 2009 at 04:07, Matt Fleming wrote:
> > On Fri, Sep 25, 2009 at 01:00:25PM -0400, Mike Frysinger wrote:
> >> On Fri, Sep 25, 2009 at 10:20, Matt Fleming wrote:
> >> > From: Matt Fleming <[email protected]>
> >> >
> >> > This fix allows the generic checksum code to work on my little endian
> >> > system. The previous fix was not enough, as "buff" is a big-endian
> >> > value. Without this patch I see malformed TCP packets.
> >>
> >> can you try this one ?
> >> http://lkml.org/lkml/2009/6/23/597
> >
> > Yep, that one works fine also. Thanks, Mike. Who's going to pick this
> > up? I'm guessing this commit is also applicable for stable? Though, I
> > don't know if there are any little-endian users of this code in stable.
>
> i'm converting Blackfin to it now that the LE issues should be fixed,
> but i'm going to hold off on pushing the change until it can be tested
>
> as for picking up the fix, let's ask Andrew ...
> -mike

Ping?

Andrew, Arnd, could one of you pick this up?

2009-10-24 22:51:36

by Mike Frysinger

[permalink] [raw]
Subject: Re: [PATCH] lib/checksum.c: Fix another endianess bug

On Sat, Oct 24, 2009 at 07:59, Matt Fleming wrote:
> On Mon, Sep 28, 2009 at 04:39:38PM -0400, Mike Frysinger wrote:
>> On Mon, Sep 28, 2009 at 04:07, Matt Fleming wrote:
>> > On Fri, Sep 25, 2009 at 01:00:25PM -0400, Mike Frysinger wrote:
>> >> On Fri, Sep 25, 2009 at 10:20, Matt Fleming wrote:
>> >> > From: Matt Fleming <[email protected]>
>> >> >
>> >> > This fix allows the generic checksum code to work on my little endian
>> >> > system. The previous fix was not enough, as "buff" is a big-endian
>> >> > value. Without this patch I see malformed TCP packets.
>> >>
>> >> can you try this one ?
>> >> http://lkml.org/lkml/2009/6/23/597
>> >
>> > Yep, that one works fine also. Thanks, Mike. Who's going to pick this
>> > up? I'm guessing this commit is also applicable for stable? Though, I
>> > don't know if there are any little-endian users of this code in stable.
>>
>> i'm converting Blackfin to it now that the LE issues should be fixed,
>> but i'm going to hold off on pushing the change until it can be tested
>>
>> as for picking up the fix, let's ask Andrew ...
>
> Ping?
>
> Andrew, Arnd, could one of you pick this up?

we've been using the generic checksum code with this fix on Blackfin
boards for the last month and havent noticed any regressions so far
...
-mike

2009-10-25 10:03:27

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH] lib/checksum.c: lib/checksum: fix one more thinko

When do_csum gets unaligned data, we really need to treat
the first byte as an even byte, not an odd byte, because
we swap the two halves later.

Found by Mike's checksum-selftest module.

Reported-by: Mike Frysinger <[email protected]>
Signed-off-by: Arnd Bergmann <[email protected]>

---

On Sunday 25 October 2009, Mike Frysinger wrote:

> > Andrew, Arnd, could one of you pick this up?
>
> we've been using the generic checksum code with this fix on Blackfin
> boards for the last month and havent noticed any regressions so far

Mike,

sorry for my unresponsiveness on this one. I kept procrastinating
because I knew I need some to look at the whole logic again to make sure
I really get it right this time.

Andrew,

can you pick this one up to make sure we don't lose it again?
I could also put it into the asm-generic tree, but it feels out
of place there.

Arnd <><


diff --git a/lib/checksum.c b/lib/checksum.c
index b2e2fd4..45c9c93 100644
--- a/lib/checksum.c
+++ b/lib/checksum.c
@@ -56,9 +56,9 @@ static unsigned int do_csum(const unsigned char *buff, int len)
odd = 1 & (unsigned long) buff;
if (odd) {
#ifdef __LITTLE_ENDIAN
- result = *buff;
-#else
result += (*buff << 8);
+#else
+ result = *buff;
#endif
len--;
buff++;