net: lwip: tftp: time out if there is no reply from server
When there is no reply from the TFTP server, do_tftpb() should eventually time out. Add a 10 second timer for that purpose. Reported-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#define PROGRESS_PRINT_STEP_BYTES (10 * 1024)
|
#define PROGRESS_PRINT_STEP_BYTES (10 * 1024)
|
||||||
|
/* Max time to wait for first data packet from server */
|
||||||
|
#define NO_RSP_TIMEOUT_MS 10000
|
||||||
|
|
||||||
enum done_state {
|
enum done_state {
|
||||||
NOT_DONE = 0,
|
NOT_DONE = 0,
|
||||||
@@ -140,6 +142,17 @@ static const struct tftp_context tftp_context = {
|
|||||||
tftp_error
|
tftp_error
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void no_response(void *arg)
|
||||||
|
{
|
||||||
|
struct tftp_ctx *ctx = (struct tftp_ctx *)arg;
|
||||||
|
|
||||||
|
if (ctx->size)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printf("Timeout!\n");
|
||||||
|
ctx->done = FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
|
static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
|
||||||
ip_addr_t srvip, uint16_t srvport)
|
ip_addr_t srvip, uint16_t srvport)
|
||||||
{
|
{
|
||||||
@@ -184,6 +197,7 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sys_timeout(NO_RSP_TIMEOUT_MS, no_response, &ctx);
|
||||||
while (!ctx.done) {
|
while (!ctx.done) {
|
||||||
net_lwip_rx(udev, netif);
|
net_lwip_rx(udev, netif);
|
||||||
sys_check_timeouts();
|
sys_check_timeouts();
|
||||||
@@ -193,6 +207,7 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sys_untimeout(no_response, (void *)&ctx);
|
||||||
|
|
||||||
tftp_cleanup();
|
tftp_cleanup();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user