+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- PxeDhcp4Run.c\r
- \r
-Abstract:\r
- Simplified entry point for starting basic PxeDhcp4 client operation.\r
-\r
---*/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Run (\r
- IN EFI_PXE_DHCP4_PROTOCOL *This,\r
- IN OPTIONAL UINTN OpLen,\r
- IN OPTIONAL VOID *OpList\r
- )\r
-{\r
- PXE_DHCP4_PRIVATE_DATA *Private;\r
- DHCP4_PACKET *offer_list;\r
- EFI_STATUS efi_status;\r
- EFI_IP_ADDRESS zero_ip;\r
- UINTN offers;\r
- UINTN timeout;\r
- UINTN n;\r
- UINT16 seconds;\r
-\r
- //\r
- // Validate parameters.\r
- //\r
- if (This == NULL || (OpLen != 0 && OpList == NULL) || (OpLen == 0 && OpList != NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- for (n = 0; n < OpLen;) {\r
- switch (((UINT8 *) OpList)[n]) {\r
- case DHCP4_PAD:\r
- ++n;\r
- continue;\r
-\r
- case DHCP4_END:\r
- ++n;\r
- break;\r
-\r
- default:\r
- n += 2 + ((UINT8 *) OpList)[n + 1];\r
- continue;\r
- }\r
-\r
- break;\r
- }\r
-\r
- if (n != OpLen) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- //\r
- // Get pointer to instance data.\r
- //\r
- Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
- if (Private == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Private->PxeBc == NULL) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- //\r
- // Initialize DHCP discover packet.\r
- //\r
- efi_status = PxeDhcp4Setup (This, NULL);\r
-\r
- if (EFI_ERROR (efi_status)) {\r
- return efi_status;\r
- }\r
-\r
- for (n = 0; n < OpLen;) {\r
- switch (((UINT8 *) OpList)[n]) {\r
- case DHCP4_PAD:\r
- ++n;\r
- continue;\r
-\r
- case DHCP4_END:\r
- ++n;\r
- break;\r
-\r
- default:\r
- efi_status = add_opt (\r
- &This->Data->Discover,\r
- (DHCP4_OP *) &(((UINT8 *) OpList)[n])\r
- );\r
-\r
- if (EFI_ERROR (efi_status)) {\r
- return efi_status;\r
- }\r
-\r
- n += 2 + ((UINT8 *) OpList)[n + 1];\r
- continue;\r
- }\r
-\r
- break;\r
- }\r
- //\r
- // Basic DHCP D.O.R.A.\r
- // 1, 2, 4, 8, 16 & 32 second timeouts.\r
- // Callback routine can be used to break out earlier.\r
- //\r
- ZeroMem (&zero_ip, sizeof (EFI_IP_ADDRESS));\r
-\r
- for (timeout = 1;;) {\r
- //\r
- // Broadcast DHCP discover and wait for DHCP offers.\r
- //\r
- efi_status = PxeDhcp4Init (This, timeout, &offers, &offer_list);\r
-\r
- if ((efi_status != EFI_NO_RESPONSE) &&\r
- (efi_status != EFI_TIMEOUT) &&\r
- (efi_status != EFI_SUCCESS)) {\r
- return efi_status;\r
- }\r
- //\r
- // Try to select from each DHCP or BOOTP offer.\r
- //\r
- for (n = 0; n < offers; ++n) {\r
- //\r
- // Ignore proxyDHCP offers.\r
- //\r
- if (!CompareMem (&offer_list[n].dhcp4.yiaddr, &zero_ip, 4)) {\r
- continue;\r
- }\r
- //\r
- // Issue DHCP Request and wait for DHCP Ack/Nak.\r
- //\r
- efi_status = PxeDhcp4Select (\r
- This,\r
- timeout,\r
- &offer_list[n]\r
- );\r
-\r
- if (EFI_ERROR (efi_status)) {\r
- continue;\r
- }\r
- //\r
- // Exit when we have got our DHCP Ack.\r
- //\r
- if (This->Data->IsAck) {\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- //\r
- // No DHCP Acks. Release DHCP Offer list storage.\r
- //\r
- if (offer_list != NULL) {\r
- FreePool (offer_list);\r
- offer_list = NULL;\r
- }\r
- //\r
- // Try again until we have used up >= DHCP4_MAX_SECONDS.\r
- //\r
- if ((timeout <<= 1) > DHCP4_MAX_SECONDS) {\r
- if (!EFI_ERROR (efi_status)) {\r
- efi_status = EFI_TIMEOUT;\r
- }\r
-\r
- return efi_status;\r
- }\r
- //\r
- // Next timeout value.\r
- //\r
- CopyMem (&seconds, &This->Data->Discover.dhcp4.secs, 2);\r
-\r
- seconds = htons (htons (seconds) + timeout);\r
-\r
- CopyMem (&This->Data->Discover.dhcp4.secs, &seconds, 2);\r
- }\r
-}\r
-\r
-/* eof - PxeDhcp4Run.c */\r