Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Dec 2021 10:53:21 GMT
From:      Emmanuel Vadot <manu@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 4f36ed513cc8 - main - loader: tftp: Don't let tftp timeout
Message-ID:  <202112161053.1BGArLqm091120@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by manu:

URL: https://cgit.FreeBSD.org/src/commit/?id=4f36ed513cc8fc3fe780b23ecda8cb1fdc6edf7d

commit 4f36ed513cc8fc3fe780b23ecda8cb1fdc6edf7d
Author:     Emmanuel Vadot <manu@FreeBSD.org>
AuthorDate: 2021-12-13 09:35:23 +0000
Commit:     Emmanuel Vadot <manu@FreeBSD.org>
CommitDate: 2021-12-16 10:50:34 +0000

    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
---
 stand/libsa/tftp.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/stand/libsa/tftp.c b/stand/libsa/tftp.c
index 78eedddcb1f6..dcfce29a9968 100644
--- a/stand/libsa/tftp.c
+++ b/stand/libsa/tftp.c
@@ -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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202112161053.1BGArLqm091120>