[U-Boot] [PATCH]Fix checksum to handle odd-length packet
Wolfgang Denk
wd at denx.de
Thu Dec 3 15:08:24 CET 2009
Dear Joakim Tjernlund,
In message <OFDFF8A95F.374EB267-ONC1257681.0042613C-C1257681.004485DD at transmode.se> you wrote:
>
> > > + if (len == 1) {
> > > + xsum += (*p & 0xff00);
> >
> > I doubt that this code is endianess-clean.
>
> Nope, I would think some thing like this would work better:
> count = len >> 1; /* div by 2 */
> for(p--; count; --count)
> xsum += *++p;
>
> if (len & 1) /* Odd */
> xsum += *(u_char *)(++p); /* one byte only */
It probably depends on the definition of "better" ;-)
Running this test code:
-----------------------------------------
#include <stdio.h>
#include <string.h>
#define LENGTH 6
int main (void)
{
char string[LENGTH] = { 1, 2, 3, 4, 5, 0, };
unsigned short array[LENGTH/2];
unsigned short *p;
unsigned short xsum, xsum1, xsum2;
int i, count;
memcpy (array, string, LENGTH);
count = LENGTH / 2;
xsum = 0;
p = array;
while (count > 1) {
printf ("Adding 0x%04x\n", *p);
xsum += *p++;
--count;
}
xsum1 = xsum + (*p & 0xff00);
xsum2 = xsum + *(unsigned char *)(p);
printf ("*p = 0x%04x\n", *p);
printf ("xsum = %04x, xsum1 = %04x, xsum2 = %04x\n",
xsum, xsum1, xsum2);
return (0);
}
-----------------------------------------
on a little endian system gives:
-> ./f-le
Adding 0x0201
Adding 0x0403
*p = 0x0005
xsum = 0604, xsum1 = 0604, xsum2 = 0609
while running it on a big endian system gives
-> ./f-be
Adding 0x0102
Adding 0x0304
*p = 0x0500
xsum = 0406, xsum1 = 0906, xsum2 = 040b
I don't know what you consider to be the exact result, but fact is
that even if we ignore byte swapping, none of the implementations is
endianess clean.
Of course, there is a chance that I mis-implemented your suggestion.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
There is enough for the need of everyone in this world,
but not for the greed of everyone. - Mahatma Gandhi
More information about the U-Boot
mailing list