aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2021-12-13 09:35:23 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2022-01-13 07:55:51 +0000
commite3ef89ba96730180f55b9fc6af4c29e1482b9ac6 (patch)
tree41161ea66f7a0729b50a98762a540a025a2692d7
parent0078d54c0985a41ef172022bb9880cf751982f8b (diff)
downloadsrc-e3ef89ba96730180f55b9fc6af4c29e1482b9ac6.tar.gz
src-e3ef89ba96730180f55b9fc6af4c29e1482b9ac6.zip
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 (cherry picked from commit 4f36ed513cc8fc3fe780b23ecda8cb1fdc6edf7d)
-rw-r--r--stand/libsa/tftp.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/stand/libsa/tftp.c b/stand/libsa/tftp.c
index 37f8b64f99aa..a63ca8d16d4d 100644
--- a/stand/libsa/tftp.c
+++ b/stand/libsa/tftp.c
@@ -113,6 +113,8 @@ struct tftp_handle {
unsigned long tftp_tsize;
void *pkt;
struct tftphdr *tftp_hdr;
+ char *tftp_cache;
+ bool lastacksent;
};
struct tftprecv_extra {
@@ -377,6 +379,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);
}
@@ -591,7 +594,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);