]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/net.c
Add lmb_free
[karo-tx-uboot.git] / net / net.c
index cac3e09d96dc2302f230fc6c1574fca834e83149..f55c7facf2783676ccd683e90fd45523e899e9f6 100644 (file)
--- a/net/net.c
+++ b/net/net.c
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define ARP_TIMEOUT            5UL             /* Seconds before trying ARP again */
+#ifndef        CONFIG_ARP_TIMEOUT
+# define ARP_TIMEOUT           50UL    /* Deciseconds before trying ARP again */
+#elif (CONFIG_ARP_TIMEOUT < 100)
+# error "Due to possible overflow CONFIG_ARP_TIMEOUT must be greater than 100ms"
+#else
+# if (CONFIG_ARP_TIMEOUT % 100)
+#  warning "Supported ARP_TIMEOUT precision is 100ms"
+# endif
+# define ARP_TIMEOUT           (CONFIG_ARP_TIMEOUT / 100)
+#endif
+
+
 #ifndef        CONFIG_NET_RETRY_COUNT
-# define ARP_TIMEOUT_COUNT     5               /* # of timeouts before giving up  */
+# define ARP_TIMEOUT_COUNT     5       /* # of timeouts before giving up  */
 #else
-# define ARP_TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT)
+# define ARP_TIMEOUT_COUNT     CONFIG_NET_RETRY_COUNT
 #endif
 
 #if 0
@@ -129,7 +140,7 @@ uchar               NetOurEther[6];         /* Our ethernet address                 */
 uchar          NetServerEther[6] =     /* Boot server enet address             */
                        { 0, 0, 0, 0, 0, 0 };
 IPaddr_t       NetOurIP;               /* Our IP addr (0 = unknown)            */
-IPaddr_t       NetServerIP;            /* Our IP addr (0 = unknown)            */
+IPaddr_t       NetServerIP;            /* Server IP addr (0 = unknown)         */
 volatile uchar *NetRxPkt;              /* Current receive packet               */
 int            NetRxPktLen;            /* Current rx packet length             */
 unsigned       NetIPID;                /* IP packet ID                         */
@@ -158,7 +169,7 @@ ushort              NetOurNativeVLAN = 0xFFFF;      /* ditto                        */
 char           BootFile[128];          /* Boot File name                       */
 
 #if defined(CONFIG_CMD_PING)
-IPaddr_t       NetPingIP;              /* the ip address to ping               */
+IPaddr_t       NetPingIP;              /* the ip address to ping               */
 
 static void PingStart(void);
 #endif
@@ -196,7 +207,7 @@ IPaddr_t    NetArpWaitReplyIP;
 uchar         *NetArpWaitPacketMAC;    /* MAC address of waiting packet's destination  */
 uchar         *NetArpWaitTxPacket;     /* THE transmit packet                  */
 int            NetArpWaitTxPacketSize;
-uchar          NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
+uchar          NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
 ulong          NetArpWaitTimerStart;
 int            NetArpWaitTry;
 
@@ -253,7 +264,7 @@ void ArpTimeoutCheck(void)
        t = get_timer(0);
 
        /* check for arp timeout */
-       if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ) {
+       if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ / 10) {
                NetArpWaitTry++;
 
                if (NetArpWaitTry >= ARP_TIMEOUT_COUNT) {
@@ -494,7 +505,7 @@ restart:
                 *      Check the ethernet for a new packet.  The ethernet
                 *      receive routine will process it.
                 */
-                       eth_rx();
+               eth_rx();
 
                /*
                 *      Abort if ctrl-c was pressed.
@@ -596,7 +607,9 @@ void NetStartAgain (void)
        NetSetHandler (startAgainHandler);
 #else  /* !CONFIG_NET_MULTI*/
        eth_halt ();
+#if !defined(CONFIG_NET_DO_NOT_TRY_ANOTHER)
        eth_try_another (!NetRestarted);
+#endif
        eth_init (gd->bd);
        if (NetRestartWrap) {
                NetRestartWrap = 0;
@@ -738,7 +751,7 @@ int PingSend(void)
        s = &ip->udp_src;               /* XXX ICMP starts here */
        s[0] = htons(0x0800);           /* echo-request, code */
        s[1] = 0;                       /* checksum */
-       s[2] = 0;                       /* identifier */
+       s[2] = 0;                       /* identifier */
        s[3] = htons(PingSeqNo++);      /* sequence number */
        s[1] = ~NetCksum((uchar *)s, 8/2);
 
@@ -1394,6 +1407,10 @@ NetReceive(volatile uchar * inpkt, int len)
                if (ip->ip_off & htons(0x1fff)) { /* Can't deal w/ fragments */
                        return;
                }
+               /* can't deal with headers > 20 bytes */
+               if ((ip->ip_hl_v & 0x0f) > 0x05) {
+                       return;
+               }
                if (!NetCksumOk((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2)) {
                        puts ("checksum bad\n");
                        return;