summaryrefslogtreecommitdiff
path: root/net/net.c
diff options
context:
space:
mode:
authorStefan Roese <sr@denx.de>2005-08-12 20:06:52 +0200
committerStefan Roese <sr@denx.de>2005-08-12 20:06:52 +0200
commit8534bf9ac0c4c37ff684c03189a564f0aae7b076 (patch)
treeda8eaf34d2d2b5db985bde1b7346fc8b95ba3e3c /net/net.c
parent5315dfa9d138252d62aa740e6d022e61cde8be04 (diff)
downloadu-boot-imx-8534bf9ac0c4c37ff684c03189a564f0aae7b076.zip
u-boot-imx-8534bf9ac0c4c37ff684c03189a564f0aae7b076.tar.gz
u-boot-imx-8534bf9ac0c4c37ff684c03189a564f0aae7b076.tar.bz2
Add UPD-Checksum code, fix problem in net.c (return instead of break)
Patch by Reinhard Arlt, 12 Aug 2005
Diffstat (limited to 'net/net.c')
-rw-r--r--net/net.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/net/net.c b/net/net.c
index 5b06495..787c10a 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1410,7 +1410,7 @@ NetReceive(volatile uchar * inpkt, int len)
puts (" ICMP Host Redirect to ");
print_IPaddr(icmph->un.gateway);
putc(' ');
- break;
+ return;
#if (CONFIG_COMMANDS & CFG_CMD_PING)
case ICMP_ECHO_REPLY:
/*
@@ -1418,7 +1418,7 @@ NetReceive(volatile uchar * inpkt, int len)
*/
/* XXX point to ip packet */
(*packetHandler)((uchar *)ip, 0, 0, 0);
- break;
+ return;
#endif
default:
return;
@@ -1427,6 +1427,46 @@ NetReceive(volatile uchar * inpkt, int len)
return;
}
+#ifdef CONFIG_UDP_CHECKSUM
+ if (ip->udp_xsum != 0) {
+ ulong xsum;
+ ushort *sumptr;
+ ushort sumlen;
+
+ 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;
+
+ sumlen = ntohs(ip->udp_len);
+ sumptr = (ushort *) &(ip->udp_src);
+
+ while (sumlen > 1) {
+ ushort sumdata;
+
+ sumdata = *sumptr++;
+ xsum += ntohs(sumdata);
+ sumlen -= 2;
+ }
+ if (sumlen > 0) {
+ ushort sumdata;
+
+ sumdata = *(unsigned char *) sumptr;
+ sumdata = (sumdata << 8) & 0xff00;
+ xsum += sumdata;
+ }
+ while ((xsum >> 16) != 0) {
+ xsum = (xsum & 0x0000ffff) + ((xsum >> 16) & 0x0000ffff);
+ }
+ if ((xsum != 0x00000000) && (xsum != 0x0000ffff)) {
+ printf(" UDP wrong checksum %08x %08x\n", xsum, ntohs(ip->udp_xsum));
+ return;
+ }
+ }
+#endif
+
#ifdef CONFIG_NETCONSOLE
nc_input_packet((uchar *)ip +IP_HDR_SIZE,
ntohs(ip->udp_dst),