Drain NMRP rx buffer before TFTP upload
More debug log spam
This commit is contained in:
parent
cecd5a0625
commit
7d3124fb4b
3 changed files with 40 additions and 3 deletions
29
nmrp.c
29
nmrp.c
|
|
@ -348,6 +348,32 @@ static void sigh(int sig)
|
||||||
g_interrupted = 1;
|
g_interrupted = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nmrp_drain(void* arg)
|
||||||
|
{
|
||||||
|
// between nmrpflash sending the TFTP WRQ packet, and the router
|
||||||
|
// responding with ACK(0)/OACK, some devices send extraneous
|
||||||
|
// CONF_REQ and/or TFTP_UL_REQ packets.
|
||||||
|
//
|
||||||
|
// we drain the NMRP receive buffer here, otherwise it might seem
|
||||||
|
// as if these packets arrived *after* the TFTP upload.
|
||||||
|
|
||||||
|
struct nmrp_pkt rx;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (pkt_recv((struct ethsock*)arg, &rx) == 0) {
|
||||||
|
if (rx.msg.code != NMRP_C_CONF_REQ && rx.msg.code != NMRP_C_TFTP_UL_REQ) {
|
||||||
|
if (verbosity > 1) {
|
||||||
|
printf("Drained unexpected packet type %s\n", msg_code_str(rx.msg.code));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbosity > 1) {
|
||||||
|
printf("Drained %d packet(s) from rx buffer\n", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const char *spinner = "\\|/-";
|
static const char *spinner = "\\|/-";
|
||||||
|
|
||||||
int nmrp_do(struct nmrpd_args *args)
|
int nmrp_do(struct nmrpd_args *args)
|
||||||
|
|
@ -564,6 +590,9 @@ int nmrp_do(struct nmrpd_args *args)
|
||||||
ulreqs = 0;
|
ulreqs = 0;
|
||||||
ka_reqs = 0;
|
ka_reqs = 0;
|
||||||
|
|
||||||
|
args->on_tftp_ack0_callback = &nmrp_drain;
|
||||||
|
args->on_tftp_ack0_arg = sock;
|
||||||
|
|
||||||
while (!g_interrupted) {
|
while (!g_interrupted) {
|
||||||
if (expect != NMRP_C_NONE && rx.msg.code != expect) {
|
if (expect != NMRP_C_NONE && rx.msg.code != expect) {
|
||||||
fprintf(stderr, "Received %s while waiting for %s!\n",
|
fprintf(stderr, "Received %s while waiting for %s!\n",
|
||||||
|
|
|
||||||
3
nmrpd.h
3
nmrpd.h
|
|
@ -112,6 +112,9 @@ struct nmrpd_args {
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
const char *region;
|
const char *region;
|
||||||
off_t offset;
|
off_t offset;
|
||||||
|
|
||||||
|
void (*on_tftp_ack0_callback)(void*);
|
||||||
|
void* on_tftp_ack0_arg;
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *leafname(const char *path);
|
const char *leafname(const char *path);
|
||||||
|
|
|
||||||
11
tftp.c
11
tftp.c
|
|
@ -328,8 +328,8 @@ ssize_t 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 rollover;
|
bool rollover, tftp_ack0_callback_called;
|
||||||
const unsigned rx_timeout = MAX(args->rx_timeout / (args->blind ? 50 : 5), 2000);
|
const unsigned rx_timeout = MIN(args->rx_timeout / (args->blind ? 50 : 5), 2000);
|
||||||
const unsigned max_timeouts = args->blind ? 3 : 5;
|
const unsigned max_timeouts = args->blind ? 3 : 5;
|
||||||
#ifndef NMRPFLASH_WINDOWS
|
#ifndef NMRPFLASH_WINDOWS
|
||||||
int enabled = 1;
|
int enabled = 1;
|
||||||
|
|
@ -393,7 +393,6 @@ ssize_t tftp_put(struct nmrpd_args *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
|
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
|
||||||
printf("errno=%d\n", errno);
|
|
||||||
sock_perror("bind");
|
sock_perror("bind");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
@ -415,6 +414,7 @@ ssize_t tftp_put(struct nmrpd_args *args)
|
||||||
rollover = false;
|
rollover = false;
|
||||||
/* Not really, but this way the loop sends our WRQ before receiving */
|
/* Not really, but this way the loop sends our WRQ before receiving */
|
||||||
timeouts = 1;
|
timeouts = 1;
|
||||||
|
tftp_ack0_callback_called = false;
|
||||||
|
|
||||||
pkt_mkwrq(tx, file_remote, TFTP_BLKSIZE);
|
pkt_mkwrq(tx, file_remote, TFTP_BLKSIZE);
|
||||||
|
|
||||||
|
|
@ -440,6 +440,11 @@ ssize_t tftp_put(struct nmrpd_args *args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ackblock && args->on_tftp_ack0_callback && !tftp_ack0_callback_called) {
|
||||||
|
args->on_tftp_ack0_callback(args->on_tftp_ack0_arg);
|
||||||
|
tftp_ack0_callback_called = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeouts || ackblock == block) {
|
if (timeouts || ackblock == block) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue