loader: tftp: Don't let tftp timeout

When we load a kernel or module we open/close it a few times.
Since we're using the same port number each time and that we requested
the same file the ACK that we send are valid on the server side and the
server send us the file multiple times.
This makes tftp loading time very inconsistant due to the UDP "flood" that
we have to process.

Reviewed by:	imp, tsoome
MFC after:	2 weeks
Sponsored by:	Beckhoff Automation GmbH & Co. KG
Differential Revision:	https://reviews.freebsd.org/D33407
This commit is contained in:
Emmanuel Vadot 2021-12-13 10:35:23 +01:00
parent 70661eaafa
commit 4f36ed513c

View File

@ -114,6 +114,8 @@ struct tftp_handle {
unsigned long tftp_tsize;
void *pkt;
struct tftphdr *tftp_hdr;
char *tftp_cache;
bool lastacksent;
};
struct tftprecv_extra {
@ -378,6 +380,7 @@ tftp_makereq(struct tftp_handle *h)
if (res < h->tftp_blksize) {
h->islastblock = 1; /* very short file */
tftp_sendack(h, h->currblock);
h->lastacksent = true;
}
return (0);
}
@ -594,7 +597,8 @@ tftp_close(struct open_file *f)
struct tftp_handle *tftpfile;
tftpfile = f->f_fsdata;
/* let it time out ... */
if (tftpfile->lastacksent == false)
tftp_senderr(tftpfile, 0, "No error: file closed");
if (tftpfile) {
free(tftpfile->path);