[syslinux:firmware] efi, udp: implement receive timeout

syslinux-bot for Matt Fleming matt.fleming at intel.com
Fri Jul 12 05:57:04 PDT 2013


Commit-ID:  7ab8f23aa2140951608544ed557f7529cf32d98d
Gitweb:     http://www.syslinux.org/commit/7ab8f23aa2140951608544ed557f7529cf32d98d
Author:     Matt Fleming <matt.fleming at intel.com>
AuthorDate: Fri, 12 Jul 2013 13:47:22 +0100
Committer:  Matt Fleming <matt.fleming at intel.com>
CommitDate: Fri, 12 Jul 2013 13:53:07 +0100

efi, udp: implement receive timeout

We currently wait indefinitely in core_udp_recv() when reading packets.
Implement a timeout, which is what all the other network stacks do. By
timing out we are now able to handle packet loss on the network, e.g.
we'll now re-send TFTP requests instead of waiting for ACK packets that
will never come.

Signed-off-by: Matt Fleming <matt.fleming at intel.com>

---
 efi/udp.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/efi/udp.c b/efi/udp.c
index 301074d..db9bc8f 100644
--- a/efi/udp.c
+++ b/efi/udp.c
@@ -182,6 +182,7 @@ int core_udp_recv(struct pxe_pvt_inode *socket, void *buf, uint16_t *buf_len,
     EFI_UDP4 *udp;
     size_t size;
     int rv = -1;
+    jiffies_t start;
 
     (void)socket;
 
@@ -197,8 +198,19 @@ int core_udp_recv(struct pxe_pvt_inode *socket, void *buf, uint16_t *buf_len,
     if (status != EFI_SUCCESS)
 	goto bail;
 
-    while (cb_status == -1)
+    start = jiffies();
+    while (cb_status == -1) {
+	/* 15ms receive timeout... */
+	if (jiffies() - start >= 15) {
+	    if (jiffies() - start >= 30)
+		dprintf("Failed to cancel UDP\n");
+
+	    uefi_call_wrapper(udp->Cancel, 2, udp, &token);
+	    dprintf("core_udp_recv: timed out\n");
+	}
+
 	uefi_call_wrapper(udp->Poll, 1, udp);
+    }
 
     if (cb_status == 0)
 	rv = 0;
@@ -206,6 +218,9 @@ int core_udp_recv(struct pxe_pvt_inode *socket, void *buf, uint16_t *buf_len,
     /* Reset */
     cb_status = -1;
 
+    if (rv)
+	goto bail;
+
     rxdata = token.Packet.RxData;
     frag = &rxdata->FragmentTable[0];
 


More information about the Syslinux-commits mailing list