TFTP: allow for adjustable retransmission timout
authorWolfgang Denk <wd@denx.de>
Sun, 17 Jan 2010 22:55:53 +0000 (23:55 +0100)
committerWolfgang Denk <wd@denx.de>
Sun, 21 Mar 2010 21:22:44 +0000 (22:22 +0100)
So far, TFTP negotiated a fixed retransmission timeout of 5 seconds.
In some cases (busy networks, slow TFTP servers) this caused very
slow transfers. A new environment variable "tftptimeout" allows to
set this timeout. Lowering this value may make downloads succeed
faster in networks with high packet loss rates or with unreliable
TFTP servers.

Signed-off-by: Wolfgang Denk <wd@denx.de>
Cc: Ben Warren <biggerbadderben@gmail.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
README
net/tftp.c

diff --git a/README b/README
index 1158e24de776b4f1ad01c987c6200855a1d77424..940b50794213d72606271bce2204d15c8f72c616 100644 (file)
--- a/README
+++ b/README
@@ -3005,7 +3005,9 @@ environment. As long as you don't save the environment you are
 working with an in-memory copy. In case the Flash area containing the
 environment is erased by accident, a default environment is provided.
 
-Some configuration options can be set using Environment Variables:
+Some configuration options can be set using Environment Variables.
+
+List of environment variables (most likely not complete):
 
   baudrate     - see CONFIG_BAUDRATE
 
@@ -3117,7 +3119,7 @@ Some configuration options can be set using Environment Variables:
                  available network interfaces.
                  It just stays at the currently selected interface.
 
-   netretry    - When set to "no" each network operation will
+  netretry     - When set to "no" each network operation will
                  either succeed or fail without retrying.
                  When set to "once" the network operation will
                  fail when all the available network interfaces
@@ -3133,7 +3135,18 @@ Some configuration options can be set using Environment Variables:
   tftpdstport  - If this is set, the value is used for TFTP's UDP
                  destination port instead of the Well Know Port 69.
 
-   vlan                - When set to a value < 4095 the traffic over
+  tftpblocksize - Block size to use for TFTP transfers; if not set,
+                 we use the TFTP server's default block size
+
+  tftptimeout  - Retransmission timeout for TFTP packets (in milli-
+                 seconds, minimum value is 1000 = 1 second). Defines
+                 when a packet is considered to be lost so it has to
+                 be retransmitted. The default is 5000 = 5 seconds.
+                 Lowering this value may make downloads succeed
+                 faster in networks with high packet loss rates or
+                 with unreliable TFTP servers.
+
+  vlan         - When set to a value < 4095 the traffic over
                  Ethernet is encapsulated/received over 802.1q
                  VLAN tagged frames.
 
index a02463b003f1a710c1179e01cddf64101bd03e9f..ed559b71d57b5437e88b6c3f331dd324f0607ec9 100644 (file)
@@ -211,7 +211,7 @@ TftpSend (void)
                pkt += 5 /*strlen("octet")*/ + 1;
                strcpy ((char *)pkt, "timeout");
                pkt += 7 /*strlen("timeout")*/ + 1;
-               sprintf((char *)pkt, "%lu", TIMEOUT / 1000);
+               sprintf((char *)pkt, "%lu", TftpTimeoutMSecs / 1000);
                debug("send option \"timeout %s\"\n", (char *)pkt);
                pkt += strlen((char *)pkt) + 1;
 #ifdef CONFIG_TFTP_TSIZE
@@ -413,7 +413,6 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
                }
 
                TftpLastBlock = TftpBlock;
-               TftpTimeoutMSecs = TIMEOUT;
                TftpTimeoutCountMax = TIMEOUT_COUNT;
                NetSetTimeout (TftpTimeoutMSecs, TftpTimeout);
 
@@ -528,10 +527,25 @@ TftpStart (void)
 {
        char *ep;             /* Environment pointer */
 
-       /* Allow the user to choose tftpblocksize */
+       /*
+        * Allow the user to choose TFTP blocksize and timeout.
+        * TFTP protocol has a minimal timeout of 1 second.
+        */
        if ((ep = getenv("tftpblocksize")) != NULL)
                TftpBlkSizeOption = simple_strtol(ep, NULL, 10);
-       debug("tftp block size is %i\n", TftpBlkSizeOption);
+
+       if ((ep = getenv("tftptimeout")) != NULL)
+               TftpTimeoutMSecs = simple_strtol(ep, NULL, 10);
+
+       if (TftpTimeoutMSecs < 1000) {
+               printf("TFTP timeout (%ld ms) too low, "
+                       "set minimum = 1000 ms\n",
+                       TftpTimeoutMSecs);
+               TftpTimeoutMSecs = 1000;
+       }
+
+       debug("TFTP blocksize = %i, timeout = %ld ms\n",
+               TftpBlkSizeOption, TftpTimeoutMSecs);
 
        TftpServerIP = NetServerIP;
        if (BootFile[0] == '\0') {
@@ -588,7 +602,6 @@ TftpStart (void)
 
        puts ("Loading: *\b");
 
-       TftpTimeoutMSecs = TftpRRQTimeoutMSecs;
        TftpTimeoutCountMax = TftpRRQTimeoutCountMax;
 
        NetSetTimeout (TftpTimeoutMSecs, TftpTimeout);