From ff93f08c063dc45a11f3dbeb20a13c70cd5f6802 Mon Sep 17 00:00:00 2001 From: Doug Ambrisko Date: Tue, 9 Apr 2002 19:13:43 +0000 Subject: [PATCH] Better handle the case with a network that drops packets by retrying with a back off. This was discovered when Luigi sent me code to handle this for Etherboot. The Etherboot patch worked okay but FreeBSD's tftpd had trouble handling it and would fail to transfer the file since it would abort on send and not retry. Submitted by: luigi MFC after: 1 week --- libexec/tftpd/tftpd.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/libexec/tftpd/tftpd.c b/libexec/tftpd/tftpd.c index 719286667c9..057a3bd2166 100644 --- a/libexec/tftpd/tftpd.c +++ b/libexec/tftpd/tftpd.c @@ -576,9 +576,19 @@ xmitfile(struct formats *pf) (void)setjmp(timeoutbuf); send_data: - if (send(peer, dp, size + 4, 0) != size + 4) { - syslog(LOG_ERR, "write: %m"); - goto abort; + { + int i, t = 1; + for (i = 0; ; i++){ + if (send(peer, dp, size + 4, 0) != size + 4) { + sleep(t); + t = (t < 32) ? t<< 1 : t; + if (i >= 12) { + syslog(LOG_ERR, "write: %m"); + goto abort; + } + } + break; + } } read_ahead(file, pf->f_convert); for ( ; ; ) {