Call nmrp_discard only when neccessary

Speeds up TFTP transfers on Windows
This commit is contained in:
Joseph C. Lehner 2024-09-30 12:18:41 +02:00
parent 20fb82ab3a
commit d6e3f15d55
3 changed files with 10 additions and 5 deletions

6
nmrp.c
View file

@ -359,7 +359,7 @@ static void sigh(int sig)
g_interrupted = 1; g_interrupted = 1;
} }
void nmrp_discard(struct ethsock *sock) bool nmrp_discard(struct ethsock *sock)
{ {
// between nmrpflash sending the TFTP WRQ packet, and the router // between nmrpflash sending the TFTP WRQ packet, and the router
// responding with ACK(0)/OACK, some devices send extraneous // responding with ACK(0)/OACK, some devices send extraneous
@ -377,7 +377,8 @@ void nmrp_discard(struct ethsock *sock)
struct nmrp_pkt rx; struct nmrp_pkt rx;
if (pkt_recv(sock, &rx) == 0) { int ret = pkt_recv(sock, &rx);
if (ret == 0) {
if (rx.msg.code != NMRP_C_CONF_REQ && rx.msg.code != NMRP_C_TFTP_UL_REQ) { if (rx.msg.code != NMRP_C_CONF_REQ && rx.msg.code != NMRP_C_TFTP_UL_REQ) {
printf("Discarding unexpected %s packet\n", msg_code_str(rx.msg.code)); printf("Discarding unexpected %s packet\n", msg_code_str(rx.msg.code));
} else if (verbosity > 1) { } else if (verbosity > 1) {
@ -386,6 +387,7 @@ void nmrp_discard(struct ethsock *sock)
} }
ethsock_set_timeout(sock, timeout); ethsock_set_timeout(sock, timeout);
return ret == 0;
} }
static const char *spinner = "\\|/-"; static const char *spinner = "\\|/-";

View file

@ -123,7 +123,7 @@ ssize_t tftp_put(struct nmrpd_args *args);
bool tftp_is_valid_filename(const char *filename); bool tftp_is_valid_filename(const char *filename);
int nmrp_do(struct nmrpd_args *args); int nmrp_do(struct nmrpd_args *args);
void nmrp_discard(struct ethsock *sock); bool nmrp_discard(struct ethsock *sock);
int select_fd(int fd, unsigned timeout); int select_fd(int fd, unsigned timeout);
const char *mac_to_str(uint8_t *mac); const char *mac_to_str(uint8_t *mac);

7
tftp.c
View file

@ -328,7 +328,7 @@ 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, discard;
const unsigned rx_timeout = MAX(args->rx_timeout / 50, 200); const unsigned rx_timeout = MAX(args->rx_timeout / 50, 200);
const unsigned max_timeouts = args->blind ? 3 : 5; const unsigned max_timeouts = args->blind ? 3 : 5;
#ifndef NMRPFLASH_WINDOWS #ifndef NMRPFLASH_WINDOWS
@ -414,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;
discard = true;
pkt_mkwrq(tx, file_remote, TFTP_BLKSIZE); pkt_mkwrq(tx, file_remote, TFTP_BLKSIZE);
@ -490,7 +491,9 @@ ssize_t tftp_put(struct nmrpd_args *args)
} }
ret = tftp_recvfrom(sock, rx, &port, rx_timeout, blksize + 4); ret = tftp_recvfrom(sock, rx, &port, rx_timeout, blksize + 4);
nmrp_discard(args->sock); if (discard) {
discard &= nmrp_discard(args->sock);
}
if (ret < 0) { if (ret < 0) {
goto cleanup; goto cleanup;