[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