From b3ba1c016b8fb2c970da9aae3fcb48fb4c255c94 Mon Sep 17 00:00:00 2001 From: "Joseph C. Lehner" Date: Thu, 2 May 2019 12:18:22 +0200 Subject: [PATCH] Conditionally enable TFTP block rollover hack --- tftp.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tftp.c b/tftp.c index f81f877..1e0dd73 100644 --- a/tftp.c +++ b/tftp.c @@ -314,6 +314,7 @@ int tftp_put(struct nmrpd_args *args) char rx[2048], tx[2048]; const char *file_remote = args->file_remote; char *val, *end; + bool freeze_block = false; sock = -1; ret = -1; @@ -400,7 +401,7 @@ int tftp_put(struct nmrpd_args *args) if (timeouts || ackblock == block) { if (!timeouts) { - if (block < UINT16_MAX) { + if (!freeze_block) { ++block; } @@ -432,9 +433,20 @@ int tftp_put(struct nmrpd_args *args) } if (ackblock != -1 && ++errors > 5) { - fprintf(stderr, "Protocol error; bailing out.\n"); - ret = -1; - goto cleanup; + if (ackblock == UINT16_MAX && block == 0 && !freeze_block) { + /* work around the 32 MiB limit if block rollover is not + * supported, by transmitting all remaining packets as + * block #65535 - reported working on a Netgear D7000. + */ + block = UINT16_MAX; + freeze_block = true; + errors = 0; + printf("Transmitting rest of file as block %d.\n", block); + } else { + fprintf(stderr, "Protocol error; bailing out.\n"); + ret = -1; + goto cleanup; + } } } -- 2.25.1