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

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

Dear Tom Evans,
In message 48B38020.4010204@ceos.com.au you wrote:
I followed Ben's instructions and here's the resulting patch.
I'm sorry, but this patch is corrupted and cannot be applied.
--- 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;
In the original code, there were no spaces but TAB characters used for indentation. Someone (you?) must have changed this, and in a way that was not even noticed when you created the patch. This is very strange. Something is severely broken in your setup.
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);
^^^^^^^^^^^^^^^^^^^^
Here your mailer wrapped long lines, which also makes the patch useless.
Please fix and resubmit.
Best regards,
Wolfgang Denk
participants (2)
-
Tom Evans
-
Wolfgang Denk