Conditionally enable TFTP block rollover hack
This commit is contained in:
parent
49b156879a
commit
b3ba1c016b
1 changed files with 16 additions and 4 deletions
20
tftp.c
20
tftp.c
|
@ -314,6 +314,7 @@ int tftp_put(struct nmrpd_args *args)
|
||||||
char rx[2048], tx[2048];
|
char rx[2048], tx[2048];
|
||||||
const char *file_remote = args->file_remote;
|
const char *file_remote = args->file_remote;
|
||||||
char *val, *end;
|
char *val, *end;
|
||||||
|
bool freeze_block = false;
|
||||||
|
|
||||||
sock = -1;
|
sock = -1;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@ -400,7 +401,7 @@ int tftp_put(struct nmrpd_args *args)
|
||||||
|
|
||||||
if (timeouts || ackblock == block) {
|
if (timeouts || ackblock == block) {
|
||||||
if (!timeouts) {
|
if (!timeouts) {
|
||||||
if (block < UINT16_MAX) {
|
if (!freeze_block) {
|
||||||
++block;
|
++block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,9 +433,20 @@ int tftp_put(struct nmrpd_args *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ackblock != -1 && ++errors > 5) {
|
if (ackblock != -1 && ++errors > 5) {
|
||||||
fprintf(stderr, "Protocol error; bailing out.\n");
|
if (ackblock == UINT16_MAX && block == 0 && !freeze_block) {
|
||||||
ret = -1;
|
/* work around the 32 MiB limit if block rollover is not
|
||||||
goto cleanup;
|
* 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue