]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Add UPD-Checksum code, fix problem in net.c (return instead of break)
authorStefan Roese <sr@denx.de>
Fri, 12 Aug 2005 18:06:52 +0000 (20:06 +0200)
committerStefan Roese <sr@denx.de>
Fri, 12 Aug 2005 18:06:52 +0000 (20:06 +0200)
Patch by Reinhard Arlt, 12 Aug 2005

CHANGELOG
net/net.c

index 3ead7aebc29ea11fdff9fd0b91eba42098d78586..1325ffeb5e8e8279cff33119954114eefa0f361f 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,9 @@
 Changes for U-Boot 1.1.3:
 ======================================================================
 
+* Add UPD-Checksum code, fix problem in net.c (return instead of break)
+  Patch by Reinhard Arlt, 12 Aug 2005
+
 * esd PCI405 board updated
   Patch by Matthias Fuchs, 28 Jul 2005
 
index 5b0649568945d4d09f709435891959a124f45174..787c10af56e1d4b6246bd649b08976a96db35ed1 100644 (file)
--- 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),