X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=net%2Fnet.c;h=a6096324126ada55e2f30afe023d376f6720ff16;hb=6f6e6e09b24e9a9dfa4af28f3e7704d335411cb4;hp=cab4b2dd885cde6b952a6ba8737e2f1913ca073f;hpb=5cfaa4e54d0eb8232fa1cf092d955fdaed5b673d;p=u-boot diff --git a/net/net.c b/net/net.c index cab4b2dd88..a609632412 100644 --- a/net/net.c +++ b/net/net.c @@ -80,7 +80,9 @@ #include #include "bootp.h" #include "tftp.h" +#ifdef CONFIG_CMD_RARP #include "rarp.h" +#endif #include "nfs.h" #ifdef CONFIG_STATUS_LED #include @@ -96,8 +98,6 @@ #include "dns.h" #endif -#if defined(CONFIG_CMD_NET) - DECLARE_GLOBAL_DATA_PTR; #ifndef CONFIG_ARP_TIMEOUT @@ -197,6 +197,8 @@ volatile uchar *NetTxPacket = 0; /* THE transmit packet */ static int net_check_prereq (proto_t protocol); +static int NetTryCount; + /**********************************************************************/ IPaddr_t NetArpWaitPacketIP; @@ -320,6 +322,7 @@ NetLoop(proto_t protocol) NetArpWaitReplyIP = 0; NetArpWaitTxPacket = NULL; NetTxPacket = NULL; + NetTryCount = 1; if (!NetTxPacket) { int i; @@ -400,11 +403,13 @@ restart: BootpRequest (); break; +#if defined(CONFIG_CMD_RARP) case RARP: RarpTry = 0; NetOurIP = 0; RarpRequest (); break; +#endif #if defined(CONFIG_CMD_PING) case PING: PingStart(); @@ -558,17 +563,30 @@ startAgainHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len) void NetStartAgain (void) { char *nretry; - int noretry = 0, once = 0; + int retry_forever = 0; + unsigned long retrycnt = 0; + + nretry = getenv("netretry"); + if (nretry) { + if (!strcmp(nretry, "yes")) + retry_forever = 1; + else if (!strcmp(nretry, "no")) + retrycnt = 0; + else if (!strcmp(nretry, "once")) + retrycnt = 1; + else + retrycnt = simple_strtoul(nretry, NULL, 0); + } else + retry_forever = 1; - if ((nretry = getenv ("netretry")) != NULL) { - noretry = (strcmp (nretry, "no") == 0); - once = (strcmp (nretry, "once") == 0); - } - if (noretry) { - eth_halt (); + if ((!retry_forever) && (NetTryCount >= retrycnt)) { + eth_halt(); NetState = NETLOOP_FAIL; return; } + + NetTryCount++; + #ifndef CONFIG_NET_MULTI NetSetTimeout (10000UL, startAgainTimeout); NetSetHandler (startAgainHandler); @@ -580,7 +598,7 @@ void NetStartAgain (void) eth_init (gd->bd); if (NetRestartWrap) { NetRestartWrap = 0; - if (NetDevExists && !once) { + if (NetDevExists) { NetSetTimeout (10000UL, startAgainTimeout); NetSetHandler (startAgainHandler); } else { @@ -1187,7 +1205,8 @@ static IP_t *__NetDefragment(IP_t *ip, int *lenp) h = payload + h->next_hole; } - if (offset8 + (len / 8) <= h - payload) { + /* last fragment may be 1..7 bytes, the "+7" forces acceptance */ + if (offset8 + ((len + 7) / 8) <= h - payload) { /* no overlap with holes (dup fragment?) */ return NULL; } @@ -1477,6 +1496,7 @@ NetReceive(volatile uchar * inpkt, int len) } break; +#ifdef CONFIG_CMD_RARP case PROT_RARP: debug("Got RARP\n"); arp = (ARP_t *)ip; @@ -1500,7 +1520,7 @@ NetReceive(volatile uchar * inpkt, int len) (*packetHandler)(0,0,0,0); } break; - +#endif case PROT_IP: debug("Got IP\n"); /* Before we start poking the header, make sure it is there */ @@ -1714,10 +1734,12 @@ static int net_check_prereq (proto_t protocol) } /* Fall through */ - case DHCP: +#ifdef CONFIG_CMD_RARP case RARP: +#endif case BOOTP: case CDP: + case DHCP: if (memcmp (NetOurEther, "\0\0\0\0\0\0", 6) == 0) { #ifdef CONFIG_NET_MULTI extern int eth_get_dev_index (void); @@ -1843,7 +1865,7 @@ NetSetIP(volatile uchar * xip, IPaddr_t dest, int dport, int sport, int len) ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2); } -void copy_filename (char *dst, char *src, int size) +void copy_filename (char *dst, const char *src, int size) { if (*src && (*src == '"')) { ++src; @@ -1856,15 +1878,15 @@ void copy_filename (char *dst, char *src, int size) *dst = '\0'; } -#endif - #if defined(CONFIG_CMD_NFS) || defined(CONFIG_CMD_SNTP) || defined(CONFIG_CMD_DNS) /* - * make port a little random, but use something trivial to compute + * make port a little random (1024-17407) + * This keeps the math somewhat trivial to compute, and seems to work with + * all supported protocols/clients/servers */ unsigned int random_port(void) { - return 1024 + (get_timer(0) % 0x8000);; + return 1024 + (get_timer(0) % 0x4000); } #endif @@ -1878,27 +1900,6 @@ void ip_to_string (IPaddr_t x, char *s) ); } -IPaddr_t string_to_ip(char *s) -{ - IPaddr_t addr; - char *e; - int i; - - if (s == NULL) - return(0); - - for (addr=0, i=0; i<4; ++i) { - ulong val = s ? simple_strtoul(s, &e, 10) : 0; - addr <<= 8; - addr |= (val & 0xFF); - if (s) { - s = (*e) ? e+1 : e; - } - } - - return (htonl(addr)); -} - void VLAN_to_string(ushort x, char *s) { x = ntohs(x); @@ -1912,7 +1913,7 @@ void VLAN_to_string(ushort x, char *s) sprintf(s, "%d", x & VLAN_IDMASK); } -ushort string_to_VLAN(char *s) +ushort string_to_VLAN(const char *s) { ushort id; @@ -1927,11 +1928,6 @@ ushort string_to_VLAN(char *s) return htons(id); } -IPaddr_t getenv_IPaddr (char *var) -{ - return (string_to_ip(getenv(var))); -} - ushort getenv_VLAN(char *var) { return (string_to_VLAN(getenv(var)));