aboutsummaryrefslogtreecommitdiffstats
path: root/efi/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'efi/udp.c')
-rw-r--r--efi/udp.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/efi/udp.c b/efi/udp.c
index 744ff0f6..30a8c777 100644
--- a/efi/udp.c
+++ b/efi/udp.c
@@ -14,6 +14,42 @@ extern EFI_GUID Udp4ServiceBindingProtocol, Udp4Protocol;
*/
static struct efi_binding *udp_reader;
+/**
+ * Try to configure this UDP socket
+ *
+ * @param:udp, the EFI_UDP4 socket to configure
+ * @param:udata, the EFI_UDP4_CONFIG_DATA to use
+ * @param:f, the name of the function as a wide string.
+ *
+ * @out: status as EFI_STATUS
+ */
+
+EFI_STATUS core_udp_configure(EFI_UDP4 *udp, EFI_UDP4_CONFIG_DATA *udata,
+ short unsigned int *f)
+{
+ EFI_STATUS status;
+ int unmapped = 1;
+ jiffies_t start, last, cur;
+
+ last = start = jiffies();
+ while (unmapped){
+ status = uefi_call_wrapper(udp->Configure, 2, udp, udata);
+ if (status != EFI_NO_MAPPING)
+ unmapped = 0;
+ else {
+ cur = jiffies();
+ if ( (cur - last) >= EFI_NOMAP_PRINT_DELAY ) {
+ last = cur;
+ Print(L"%s: stalling on configure with no mapping\n", f);
+ } else if ( (cur - start) > EFI_NOMAP_PRINT_DELAY * EFI_NOMAP_PRINT_COUNT) {
+ Print(L"%s: aborting on no mapping\n", f);
+ unmapped = 0;
+ }
+ }
+ }
+ return status;
+}
+
/**
* Open a socket
*
@@ -42,7 +78,7 @@ int core_udp_open(struct pxe_pvt_inode *socket)
memset(&udata, 0, sizeof(udata));
- status = uefi_call_wrapper(udp->Configure, 2, udp, &udata);
+ status = core_udp_configure(udp, &udata, L"core_udp_open");
if (status != EFI_SUCCESS)
goto bail;
@@ -116,7 +152,7 @@ void core_udp_connect(struct pxe_pvt_inode *socket, uint32_t ip,
udata.AcceptPromiscuous = TRUE;
udata.TimeToLive = 64;
- status = uefi_call_wrapper(udp->Configure, 2, udp, &udata);
+ status = core_udp_configure(udp, &udata, L"core_udp_connect");
if (status != EFI_SUCCESS) {
Print(L"Failed to configure UDP: %d\n", status);
return;
@@ -263,8 +299,6 @@ void core_udp_send(struct pxe_pvt_inode *socket, const void *data, size_t len)
if (status != EFI_SUCCESS)
goto bail;
- txdata->UdpSessionData = NULL;
- txdata->GatewayAddress = NULL;
txdata->DataLength = len;
txdata->FragmentCount = 1;
frag = &txdata->FragmentTable[0];
@@ -339,7 +373,7 @@ void core_udp_sendto(struct pxe_pvt_inode *socket, const void *data,
udata.AcceptPromiscuous = TRUE;
udata.TimeToLive = 64;
- status = uefi_call_wrapper(udp->Configure, 2, udp, &udata);
+ status = core_udp_configure(udp, &udata, L"core_udp_sendto");
if (status != EFI_SUCCESS)
goto bail;
@@ -348,8 +382,6 @@ void core_udp_sendto(struct pxe_pvt_inode *socket, const void *data,
if (status != EFI_SUCCESS)
goto bail;
- txdata->UdpSessionData = NULL;
- txdata->GatewayAddress = NULL;
txdata->DataLength = len;
txdata->FragmentCount = 1;
frag = &txdata->FragmentTable[0];