[U-Boot] ARM: net.c: UDP Checksum code failing every packet

Ben Warren biggerbadderben at gmail.com
Tue Aug 19 04:57:07 CEST 2008


Hi Tom,

Tom Evans wrote:
> UDP Checksumming is enabled with the configuration variable
> CONFIG_UDP_CHECKSUM. This is only enabled in 7 out of 437
> include/configs/*.h files. Enabling UDP checksumming can be useful, as 
> it allows any errors (in downloading via TFTP) to be retried rather than 
> resulting in an image CRC error when the whole download has finished. 
> The download isn't meant to fail, but I'm seeing intermittent corrupted 
> downloads currently.
>
> If CONFIG_UDP_CHECKSUM is enabled on an ARM core, and the CPU is prior 
> to ARM Core Version 6, all packets are reported as having checksum errors.
>
> This is due to the ARM's 32-bit alignment requirements and the following 
> four lines of code in net/net.c::NetReceive()
>
>      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;
>
> The original Ethernet packet is (usually, this is not controlled) 32-bit 
> aligned, the Ethernet header is 14 bytes long, so by design the aligned 
> fields in the IP (and other) headers are all misaligned, at least with 
> the NE2000 driver we're using.
>
> ARM (prior to V6) "silently corrupts" misaligned reads. For 32-bit reads 
> offset by 16 bits it reads 32-bits from the aligned address two bytes 
> below that requested, and then swaps the words.
>
> If the above lines are changed to match other related ARM-related 
> modifications as follows, then the UDP checksum code works:
>
>      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;
>
> I'm afraid I can't generate a patch to do this. Could someone else 
> please incorporate this change if required?
>
>   
Everything seems logical until this point.  Why can't you create a patch?

regards,
Ben



More information about the U-Boot mailing list