X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=net%2Fnet.c;h=313d5d8dab354cbbdc4d32b2f3888a37c11df68f;hb=98824ce3f95e6c4d08d439b779c0acb0048045a6;hp=44feee2290424a852b18e3fde99aa0b036634600;hpb=8d79953d03e6c5b24215609997dafe4daa623cd6;p=u-boot diff --git a/net/net.c b/net/net.c index 44feee2290..313d5d8dab 100644 --- a/net/net.c +++ b/net/net.c @@ -94,11 +94,22 @@ 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. @@ -740,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); @@ -1379,7 +1390,7 @@ NetReceive(volatile uchar * inpkt, int len) puts ("Got IP\n"); #endif if (len < IP_HDR_SIZE) { - debug ("len bad %d < %d\n", len, IP_HDR_SIZE); + debug ("len bad %d < %lu\n", len, (ulong)IP_HDR_SIZE); return; } if (len < ntohs(ip->ip_len)) { @@ -1396,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; @@ -1505,7 +1520,8 @@ NetReceive(volatile uchar * inpkt, int len) xsum = (xsum & 0x0000ffff) + ((xsum >> 16) & 0x0000ffff); } if ((xsum != 0x00000000) && (xsum != 0x0000ffff)) { - printf(" UDP wrong checksum %08x %08x\n", xsum, ntohs(ip->udp_xsum)); + printf(" UDP wrong checksum %08lx %08x\n", + xsum, ntohs(ip->udp_xsum)); return; } }