[U-Boot] [PATCH] [ARM] Change the UDP Checksum code to work with ARM data alignment.

Tom Evans
2008-08-26T04:01:36Z

> From: Ben Warren <biggerbadderben@gmail.com>
> Subject: Re: [U-Boot] ARM: net.c: UDP Checksum code
> failing every packet
> To: Tom Evans <tom@ceos.com.au>
> Cc: U-Boot <u-boot@lists.denx.de>
> Message-ID: <48AA4BAE.2060204@gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>
> Tom Evans wrote:
> > > Ben Warren wrote:
> > ...
> > Besides which, I've never made a patch before, and
> > couldn't find any instructions on how to do so.
> >
> There is good documentation out there, just not where
> you looked.

I followed Ben's instructions and here's the resulting patch.

I don't have any hardware that is supported in the current distribution,
so I can't perform a full compile-run-test pass on this patch. I've run
the changes on our modified u-boot setup and it works. I've also changed
the distribution Makefile for our cross compiler, added "#define
CONFIG_UDP_CHECKSUM 1" to cradle.h, done "make cradle_config ; make"
without any errors.

Signed-off-by: Tom Evans <tom.evans@ceos.com.au>
---
net/net.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/net/net.c b/net/net.c
index 313d5d8..c8cda77 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1494,10 +1494,12 @@ NetReceive(volatile uchar * inpkt, int len)

xsum = ip->ip_p;
xsum += (ntohs(ip->udp_len));
- xsum += (ntohl(ip->ip_src) >> 16) & 0x0000ffff;
- xsum += (ntohl(ip->ip_src) >> 0) & 0x0000ffff;
- xsum += (ntohl(ip->ip_dst) >> 16) & 0x0000ffff;
- xsum += (ntohl(ip->ip_dst) >> 0) & 0x0000ffff;
+ tmp = NetReadIP(&ip->ip_src);
+ xsum += (ntohl(tmp) >> 16) & 0x0000ffff;
+ xsum += (ntohl(tmp) >> 0) & 0x0000ffff;
+ tmp = NetReadIP(&ip->ip_dst);
+ xsum += (ntohl(tmp) >> 16) & 0x0000ffff;
+ xsum += (ntohl(tmp) >> 0) & 0x0000ffff;

sumlen = ntohs(ip->udp_len);
sumptr = (ushort *) &(ip->udp_src);
@@ -1520,7 +1522,7 @@ NetReceive(volatile uchar * inpkt, int len)
xsum = (xsum & 0x0000ffff) + ((xsum >>
16) & 0x0000ffff);
}
if ((xsum != 0x00000000) && (xsum != 0x0000ffff)) {
- printf(" UDP wrong checksum %08lx %08x\n",
+ printf("\nUDP wrong checksum %08lx %08x\n",
xsum, ntohs(ip->udp_xsum));
return;
}
--
1.5.5.1

--
===
Tom Evans Tom.Evans at ceos.com.au
CEOS Pty Ltd www.ceos.com.au
3/17 Burgundy St, Heidelberg,
Victoria 3084, Australia

Phone (+61 3) 9458 4955
Direct Unsupported
FAX (+61 3) 9458 4966
Mobile 0405 776 431