diff --git a/README b/README index d18df54ec9..c0a9ea0ed8 100644 --- a/README +++ b/README @@ -5450,10 +5450,10 @@ List of environment variables (most likely not complete): unset, then it will be made silent if the U-Boot console is silent. - tftpsrcport - If this is set, the value is used for TFTP's + tftpsrcp - If this is set, the value is used for TFTP's UDP source port. - tftpdstport - If this is set, the value is used for TFTP's UDP + tftpdstp - If this is set, the value is used for TFTP's UDP destination port instead of the Well Know Port 69. tftpblocksize - Block size to use for TFTP transfers; if not set, @@ -5467,6 +5467,14 @@ List of environment variables (most likely not complete): faster in networks with high packet loss rates or with unreliable TFTP servers. + tftptimeoutcountmax - maximum count of TFTP timeouts (no + unit, minimum value = 0). Defines how many timeouts + can happen during a single file transfer before that + transfer is aborted. The default is 10, and 0 means + 'no timeouts allowed'. Increasing this value may help + downloads succeed with high packet loss rates, or with + unreliable TFTP servers or client hardware. + vlan - When set to a value < 4095 the traffic over Ethernet is encapsulated/received over 802.1q VLAN tagged frames. diff --git a/configs/bf527-ezkit_defconfig b/configs/bf527-ezkit_defconfig index 2e75225c10..0cc81cc44c 100644 --- a/configs/bf527-ezkit_defconfig +++ b/configs/bf527-ezkit_defconfig @@ -4,3 +4,4 @@ CONFIG_TARGET_BF527_EZKIT=y CONFIG_NET_RANDOM_ETHADDR=y CONFIG_SPI_FLASH=y CONFIG_CC_OPTIMIZE_LIBS_FOR_SPEED=y +CONFIG_NET_TFTP_VARS=n diff --git a/net/Kconfig b/net/Kconfig index 77a2f7e07e..a44a783cae 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -22,4 +22,14 @@ config NETCONSOLE Support the 'nc' input/output device for networked console. See README.NetConsole for details. +config NET_TFTP_VARS + bool "Control TFTP timeout and count through environment" + default y + help + If set, allows controlling the TFTP timeout through the + environment variable tftptimeout, and the TFTP maximum + timeout count through the variable tftptimeoutcountmax. + If unset, timeout and maximum are hard-defined as 1 second + and 10 timouts per TFTP transfer. + endif # if NET diff --git a/net/tftp.c b/net/tftp.c index 1a5113179a..f2889fe4c9 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -602,7 +602,7 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip, } tftp_prev_block = tftp_cur_block; - timeout_count_max = TIMEOUT_COUNT; + timeout_count_max = tftp_timeout_count_max; net_set_timeout_handler(timeout_ms, tftp_timeout_handler); store_block(tftp_cur_block - 1, pkt + 2, len); @@ -697,12 +697,14 @@ static void tftp_timeout_handler(void) void tftp_start(enum proto_t protocol) { +#if CONFIG_NET_TFTP_VARS char *ep; /* Environment pointer */ /* * Allow the user to choose TFTP blocksize and timeout. * TFTP protocol has a minimal timeout of 1 second. */ + ep = getenv("tftpblocksize"); if (ep != NULL) tftp_block_size_option = simple_strtol(ep, NULL, 10); @@ -717,6 +719,17 @@ void tftp_start(enum proto_t protocol) timeout_ms = 1000; } + ep = getenv("tftptimeoutcountmax"); + if (ep != NULL) + tftp_timeout_count_max = simple_strtol(ep, NULL, 10); + + if (tftp_timeout_count_max < 0) { + printf("TFTP timeout count max (%d ms) negative, set to 0\n", + tftp_timeout_count_max); + tftp_timeout_count_max = 0; + } +#endif + debug("TFTP blocksize = %i, timeout = %ld ms\n", tftp_block_size_option, timeout_ms); @@ -842,7 +855,7 @@ void tftp_start_server(void) puts("Loading: *\b"); - timeout_count_max = TIMEOUT_COUNT; + timeout_count_max = tftp_timeout_count_max; timeout_count = 0; timeout_ms = TIMEOUT; net_set_timeout_handler(timeout_ms, tftp_timeout_handler);