/** @file\r
Boot functions implementation for UefiPxeBc Driver.\r
\r
- Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
\r
- 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
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
//\r
// According to the PXE specification 2.1, Table 2-1 PXE DHCP Options,\r
// we must not consider a boot prompt or boot menu if all of the following hold:\r
- // - the PXE_DISCOVERY_CONTROL tag(6) is present inside the Vendor Options(43), and has bit 3 set \r
+ // - the PXE_DISCOVERY_CONTROL tag(6) is present inside the Vendor Options(43), and has bit 3 set\r
// - a boot file name has been presented in the initial DHCP or ProxyDHCP offer packet.\r
//\r
if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) &&\r
Cache->Dhcp4.OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {\r
return EFI_ABORTED;\r
}\r
- \r
+\r
if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) {\r
return EFI_TIMEOUT;\r
}\r
\r
@retval EFI_ABORTED User cancel operation.\r
@retval EFI_SUCCESS Select the boot menu success.\r
- @retval EFI_NOT_READY Read the input key from the keybroad has not finish.\r
+ @retval EFI_NOT_READY Read the input key from the keyboard has not finish.\r
\r
**/\r
EFI_STATUS\r
UINT16 Value;\r
PXEBC_VENDOR_OPTION *VendorOpt;\r
PXEBC_BOOT_SVR_ENTRY *Entry;\r
- \r
+\r
PxeBc = &Private->PxeBc;\r
Mode = PxeBc->Mode;\r
Status = EFI_SUCCESS;\r
Cache4 = &Private->DhcpAck.Dhcp4;\r
}\r
\r
- ASSERT (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);\r
+ if (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL) {\r
+ //\r
+ // This should never happen in a correctly configured DHCP / PXE\r
+ // environment. One misconfiguration that can cause it is two DHCP servers\r
+ // mistakenly running on the same network segment at the same time, and\r
+ // racing each other in answering DHCP requests. Thus, the DHCP packets\r
+ // that the edk2 PXE client considers "belonging together" may actually be\r
+ // entirely independent, coming from two (competing) DHCP servers.\r
+ //\r
+ // Try to deal with this gracefully. Note that this check is not\r
+ // comprehensive, as we don't try to identify all such errors.\r
+ //\r
+ return EFI_PROTOCOL_ERROR;\r
+ }\r
\r
//\r
// Parse the boot server address.\r
Cache6 = &Private->DhcpAck.Dhcp6;\r
}\r
\r
- ASSERT (Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL] != NULL);\r
+ if (Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL] == NULL) {\r
+ //\r
+ // This should never happen in a correctly configured DHCP / PXE\r
+ // environment. One misconfiguration that can cause it is two DHCP servers\r
+ // mistakenly running on the same network segment at the same time, and\r
+ // racing each other in answering DHCP requests. Thus, the DHCP packets\r
+ // that the edk2 PXE client considers "belonging together" may actually be\r
+ // entirely independent, coming from two (competing) DHCP servers.\r
+ //\r
+ // Try to deal with this gracefully. Note that this check is not\r
+ // comprehensive, as we don't try to identify all such errors.\r
+ //\r
+ return EFI_PROTOCOL_ERROR;\r
+ }\r
\r
//\r
// Set the station address to IP layer.\r
if (Info->IpCnt >= 1) {\r
*DiscoverInfo = AllocatePool (sizeof (*Info) + (Info->IpCnt - 1) * sizeof (**SrvList));\r
if (*DiscoverInfo == NULL) {\r
- return EFI_OUT_OF_RESOURCES; \r
- } \r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
CopyMem (*DiscoverInfo, Info, sizeof (*Info));\r
Info = *DiscoverInfo;\r
}\r
&Mode->ProxyOffer.Dhcpv4,\r
&Mode->PxeReply.Dhcpv4,\r
Private->PxeReply.Dhcp4.Packet.Ack.Length\r
- ); \r
+ );\r
}\r
Mode->ProxyOfferReceived = TRUE;\r
}\r
@param[in, out] Private Pointer to PxeBc private data.\r
@param[out] NewMakeCallback If TRUE, it is a new callback.\r
Otherwise, it is not new callback.\r
- @retval EFI_SUCCESS PxeBaseCodeCallbackProtocol installed succesfully.\r
+ @retval EFI_SUCCESS PxeBaseCodeCallbackProtocol installed successfully.\r
@retval Others Failed to install PxeBaseCodeCallbackProtocol.\r
\r
**/\r