From: Joseph C. Lehner Date: Thu, 2 May 2019 10:18:22 +0000 (+0200) Subject: Conditionally enable TFTP block rollover hack X-Git-Tag: v0.9.14~17 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b3ba1c016b8fb2c970da9aae3fcb48fb4c255c94;p=oweals%2Fnmrpflash.git Conditionally enable TFTP block rollover hack --- 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; + } } }