]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcBoot.c
index 253115308e8159d9f38ef773148b4acace8d7f57..f22a151e256dd7efd235d7d8ed78cd50137bc9e1 100644 (file)
@@ -1,21 +1,15 @@
 /** @file\r
   Boot functions implementation for UefiPxeBc Driver.\r
 \r
-  Copyright (c) 2009 - 2014, 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
 #include "PxeBcImpl.h"\r
 \r
-\r
 /**\r
   Display the string of the boot item.\r
 \r
 **/\r
 VOID\r
 PxeBcDisplayBootItem (\r
-  IN UINT8                 *Str,\r
-  IN UINT8                 Len\r
+  IN UINT8  *Str,\r
+  IN UINT8  Len\r
   )\r
 {\r
-  UINT8                    Tmp;\r
+  UINT8  Tmp;\r
 \r
   //\r
   // Cut off the chars behind 70th.\r
   //\r
-  Len       = (UINT8) MIN (PXEBC_DISPLAY_MAX_LINE, Len);\r
-  Tmp       = Str[Len];\r
-  Str[Len]  = 0;\r
+  Len      = (UINT8)MIN (PXEBC_DISPLAY_MAX_LINE, Len);\r
+  Tmp      = Str[Len];\r
+  Str[Len] = 0;\r
   AsciiPrint ("%a \n", Str);\r
 \r
   //\r
   // Restore the original 70th char.\r
   //\r
-  Str[Len]  = Tmp;\r
+  Str[Len] = Tmp;\r
 }\r
 \r
-\r
 /**\r
   Select and maintain the boot prompt if needed.\r
 \r
@@ -62,22 +55,22 @@ PxeBcDisplayBootItem (
 **/\r
 EFI_STATUS\r
 PxeBcSelectBootPrompt (\r
-  IN PXEBC_PRIVATE_DATA      *Private\r
+  IN PXEBC_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  PXEBC_DHCP_PACKET_CACHE    *Cache;\r
-  PXEBC_VENDOR_OPTION        *VendorOpt;\r
-  EFI_PXE_BASE_CODE_MODE     *Mode;\r
-  EFI_EVENT                  TimeoutEvent;\r
-  EFI_EVENT                  DescendEvent;\r
-  EFI_INPUT_KEY              InputKey;\r
-  EFI_STATUS                 Status;\r
-  UINT32                     OfferType;\r
-  UINT8                      Timeout;\r
-  UINT8                      *Prompt;\r
-  UINT8                      PromptLen;\r
-  INT32                      SecCol;\r
-  INT32                      SecRow;\r
+  PXEBC_DHCP_PACKET_CACHE  *Cache;\r
+  PXEBC_VENDOR_OPTION      *VendorOpt;\r
+  EFI_PXE_BASE_CODE_MODE   *Mode;\r
+  EFI_EVENT                TimeoutEvent;\r
+  EFI_EVENT                DescendEvent;\r
+  EFI_INPUT_KEY            InputKey;\r
+  EFI_STATUS               Status;\r
+  UINT32                   OfferType;\r
+  UINT8                    Timeout;\r
+  UINT8                    *Prompt;\r
+  UINT8                    PromptLen;\r
+  INT32                    SecCol;\r
+  INT32                    SecRow;\r
 \r
   TimeoutEvent = NULL;\r
   DescendEvent = NULL;\r
@@ -88,7 +81,7 @@ PxeBcSelectBootPrompt (
   //\r
   // Only DhcpPxe10 and ProxyPxe10 offer needs boot prompt.\r
   //\r
-  if (OfferType != PxeOfferTypeProxyPxe10 && OfferType != PxeOfferTypeDhcpPxe10) {\r
+  if ((OfferType != PxeOfferTypeProxyPxe10) && (OfferType != PxeOfferTypeDhcpPxe10)) {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
@@ -101,21 +94,22 @@ PxeBcSelectBootPrompt (
   //\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
+      (Cache->Dhcp4.OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL))\r
+  {\r
     return EFI_ABORTED;\r
   }\r
-  \r
+\r
   if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) {\r
     return EFI_TIMEOUT;\r
   }\r
 \r
   Timeout   = VendorOpt->MenuPrompt->Timeout;\r
   Prompt    = VendorOpt->MenuPrompt->Prompt;\r
-  PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1);\r
+  PromptLen = (UINT8)(VendorOpt->MenuPromptLen - 1);\r
 \r
   //\r
   // The valid scope of Timeout refers to PXE2.1 spec.\r
@@ -123,6 +117,7 @@ PxeBcSelectBootPrompt (
   if (Timeout == 0) {\r
     return EFI_TIMEOUT;\r
   }\r
+\r
   if (Timeout == 255) {\r
     return EFI_SUCCESS;\r
   }\r
@@ -144,7 +139,7 @@ PxeBcSelectBootPrompt (
   Status = gBS->SetTimer (\r
                   TimeoutEvent,\r
                   TimerRelative,\r
-                  Timeout * TICKS_PER_SECOND\r
+                  MultU64x32 (Timeout, TICKS_PER_SECOND)\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
@@ -190,46 +185,43 @@ PxeBcSelectBootPrompt (
       gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow);\r
       AsciiPrint ("(%d) ", Timeout--);\r
     }\r
+\r
     if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) {\r
       gBS->Stall (10 * TICKS_PER_MS);\r
       continue;\r
     }\r
+\r
     //\r
     // Parse the input key by user.\r
     // If <F8> or <Ctrl> + <M> is pressed, return success to display the boot menu.\r
     //\r
     if (InputKey.ScanCode == 0) {\r
-\r
       switch (InputKey.UnicodeChar) {\r
+        case CTRL ('c'):\r
+          Status = EFI_ABORTED;\r
+          break;\r
 \r
-      case CTRL ('c'):\r
-        Status = EFI_ABORTED;\r
-        break;\r
-\r
-      case CTRL ('m'):\r
-      case 'm':\r
-      case 'M':\r
-        Status = EFI_SUCCESS;\r
-        break;\r
+        case CTRL ('m'):\r
+        case 'm':\r
+        case 'M':\r
+          Status = EFI_SUCCESS;\r
+          break;\r
 \r
-      default:\r
-        continue;\r
+        default:\r
+          continue;\r
       }\r
-\r
     } else {\r
-\r
       switch (InputKey.ScanCode) {\r
+        case SCAN_F8:\r
+          Status = EFI_SUCCESS;\r
+          break;\r
 \r
-      case SCAN_F8:\r
-        Status = EFI_SUCCESS;\r
-        break;\r
-\r
-      case SCAN_ESC:\r
-        Status = EFI_ABORTED;\r
-        break;\r
+        case SCAN_ESC:\r
+          Status = EFI_ABORTED;\r
+          break;\r
 \r
-      default:\r
-        continue;\r
+        default:\r
+          continue;\r
       }\r
     }\r
 \r
@@ -239,12 +231,13 @@ PxeBcSelectBootPrompt (
   //\r
   // Reset the cursor on the screen.\r
   //\r
-  gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1);\r
+  gST->ConOut->SetCursorPosition (gST->ConOut, 0, SecRow + 1);\r
 \r
 ON_EXIT:\r
   if (DescendEvent != NULL) {\r
     gBS->CloseEvent (DescendEvent);\r
   }\r
+\r
   if (TimeoutEvent != NULL) {\r
     gBS->CloseEvent (TimeoutEvent);\r
   }\r
@@ -252,7 +245,6 @@ ON_EXIT:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Select the boot menu by user's input.\r
 \r
@@ -262,31 +254,31 @@ ON_EXIT:
 \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
 PxeBcSelectBootMenu (\r
-  IN  PXEBC_PRIVATE_DATA              *Private,\r
-  OUT UINT16                          *Type,\r
-  IN  BOOLEAN                         UseDefaultItem\r
+  IN  PXEBC_PRIVATE_DATA  *Private,\r
+  OUT UINT16              *Type,\r
+  IN  BOOLEAN             UseDefaultItem\r
   )\r
 {\r
-  EFI_PXE_BASE_CODE_MODE     *Mode;\r
-  PXEBC_DHCP_PACKET_CACHE    *Cache;\r
-  PXEBC_VENDOR_OPTION        *VendorOpt;\r
-  EFI_INPUT_KEY              InputKey;\r
-  UINT32                     OfferType;\r
-  UINT8                      MenuSize;\r
-  UINT8                      MenuNum;\r
-  INT32                      TopRow;\r
-  UINT16                     Select;\r
-  UINT16                     LastSelect;\r
-  UINT8                      Index;\r
-  BOOLEAN                    Finish;\r
-  CHAR8                      Blank[PXEBC_DISPLAY_MAX_LINE];\r
-  PXEBC_BOOT_MENU_ENTRY      *MenuItem;\r
-  PXEBC_BOOT_MENU_ENTRY      *MenuArray[PXEBC_MENU_MAX_NUM];\r
+  EFI_PXE_BASE_CODE_MODE   *Mode;\r
+  PXEBC_DHCP_PACKET_CACHE  *Cache;\r
+  PXEBC_VENDOR_OPTION      *VendorOpt;\r
+  EFI_INPUT_KEY            InputKey;\r
+  UINT32                   OfferType;\r
+  UINT8                    MenuSize;\r
+  UINT8                    MenuNum;\r
+  INT32                    TopRow;\r
+  UINT16                   Select;\r
+  UINT16                   LastSelect;\r
+  UINT8                    Index;\r
+  BOOLEAN                  Finish;\r
+  CHAR8                    Blank[PXEBC_DISPLAY_MAX_LINE];\r
+  PXEBC_BOOT_MENU_ENTRY    *MenuItem;\r
+  PXEBC_BOOT_MENU_ENTRY    *MenuArray[PXEBC_MENU_MAX_NUM];\r
 \r
   Finish    = FALSE;\r
   Select    = 0;\r
@@ -310,10 +302,10 @@ PxeBcSelectBootMenu (
   //\r
   // Display the boot menu on the screen.\r
   //\r
-  SetMem (Blank, sizeof(Blank), ' ');\r
+  SetMem (Blank, sizeof (Blank), ' ');\r
 \r
-  MenuSize  = VendorOpt->BootMenuLen;\r
-  MenuItem  = VendorOpt->BootMenu;\r
+  MenuSize = VendorOpt->BootMenuLen;\r
+  MenuItem = VendorOpt->BootMenu;\r
 \r
   if (MenuSize == 0) {\r
     return EFI_DEVICE_ERROR;\r
@@ -321,9 +313,9 @@ PxeBcSelectBootMenu (
 \r
   while (MenuSize > 0 && Index < PXEBC_MENU_MAX_NUM) {\r
     ASSERT (MenuItem != NULL);\r
-    MenuArray[Index]  = MenuItem;\r
-    MenuSize          = (UINT8) (MenuSize - (MenuItem->DescLen + 3));\r
-    MenuItem          = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + MenuItem->DescLen + 3);\r
+    MenuArray[Index] = MenuItem;\r
+    MenuSize         = (UINT8)(MenuSize - (MenuItem->DescLen + 3));\r
+    MenuItem         = (PXEBC_BOOT_MENU_ENTRY *)((UINT8 *)MenuItem + MenuItem->DescLen + 3);\r
     Index++;\r
   }\r
 \r
@@ -366,60 +358,62 @@ PxeBcSelectBootMenu (
 \r
     if (InputKey.ScanCode == 0) {\r
       switch (InputKey.UnicodeChar) {\r
-      case CTRL ('c'):\r
-        InputKey.ScanCode = SCAN_ESC;\r
-        break;\r
+        case CTRL ('c'):\r
+          InputKey.ScanCode = SCAN_ESC;\r
+          break;\r
 \r
-      case CTRL ('j'):  /* linefeed */\r
-      case CTRL ('m'):  /* return */\r
-        Finish = TRUE;\r
-        break;\r
+        case CTRL ('j'): /* linefeed */\r
+        case CTRL ('m'): /* return */\r
+          Finish = TRUE;\r
+          break;\r
 \r
-      case CTRL ('i'):  /* tab */\r
-      case ' ':\r
-      case 'd':\r
-      case 'D':\r
-        InputKey.ScanCode = SCAN_DOWN;\r
-        break;\r
+        case CTRL ('i'): /* tab */\r
+        case ' ':\r
+        case 'd':\r
+        case 'D':\r
+          InputKey.ScanCode = SCAN_DOWN;\r
+          break;\r
 \r
-      case CTRL ('h'):  /* backspace */\r
-      case 'u':\r
-      case 'U':\r
-        InputKey.ScanCode = SCAN_UP;\r
-        break;\r
+        case CTRL ('h'): /* backspace */\r
+        case 'u':\r
+        case 'U':\r
+          InputKey.ScanCode = SCAN_UP;\r
+          break;\r
 \r
-      default:\r
-        InputKey.ScanCode = 0;\r
+        default:\r
+          InputKey.ScanCode = 0;\r
       }\r
     }\r
 \r
     switch (InputKey.ScanCode) {\r
-    case SCAN_LEFT:\r
-    case SCAN_UP:\r
-      if (Select != 0) {\r
-        Select--;\r
-      }\r
-      break;\r
+      case SCAN_LEFT:\r
+      case SCAN_UP:\r
+        if (Select != 0) {\r
+          Select--;\r
+        }\r
 \r
-    case SCAN_DOWN:\r
-    case SCAN_RIGHT:\r
-      if (++Select == MenuNum) {\r
-        Select--;\r
-      }\r
-      break;\r
+        break;\r
 \r
-    case SCAN_PAGE_UP:\r
-    case SCAN_HOME:\r
-      Select = 0;\r
-      break;\r
+      case SCAN_DOWN:\r
+      case SCAN_RIGHT:\r
+        if (++Select == MenuNum) {\r
+          Select--;\r
+        }\r
 \r
-    case SCAN_PAGE_DOWN:\r
-    case SCAN_END:\r
-      Select = (UINT16) (MenuNum - 1);\r
-      break;\r
+        break;\r
 \r
-    case SCAN_ESC:\r
-      return EFI_ABORTED;\r
+      case SCAN_PAGE_UP:\r
+      case SCAN_HOME:\r
+        Select = 0;\r
+        break;\r
+\r
+      case SCAN_PAGE_DOWN:\r
+      case SCAN_END:\r
+        Select = (UINT16)(MenuNum - 1);\r
+        break;\r
+\r
+      case SCAN_ESC:\r
+        return EFI_ABORTED;\r
     }\r
 \r
     //\r
@@ -446,7 +440,6 @@ PxeBcSelectBootMenu (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Parse out the boot information from the last Dhcp4 reply packet.\r
 \r
@@ -459,8 +452,8 @@ PxeBcSelectBootMenu (
 **/\r
 EFI_STATUS\r
 PxeBcDhcp4BootInfo (\r
-  IN OUT PXEBC_PRIVATE_DATA   *Private,\r
-     OUT UINT64               *BufferSize\r
+  IN OUT PXEBC_PRIVATE_DATA  *Private,\r
+  OUT UINT64                 *BufferSize\r
   )\r
 {\r
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
@@ -470,7 +463,7 @@ PxeBcDhcp4BootInfo (
   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
@@ -487,7 +480,20 @@ PxeBcDhcp4BootInfo (
     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
@@ -498,7 +504,7 @@ PxeBcDhcp4BootInfo (
   VendorOpt = &Cache4->VendorOpt;\r
   if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) && IS_VALID_BOOT_SERVERS (VendorOpt->BitMap)) {\r
     Entry = VendorOpt->BootSvr;\r
-    if (VendorOpt->BootSvrLen >= sizeof (PXEBC_BOOT_SVR_ENTRY) && Entry->IpCnt > 0) {\r
+    if ((VendorOpt->BootSvrLen >= sizeof (PXEBC_BOOT_SVR_ENTRY)) && (Entry->IpCnt > 0)) {\r
       CopyMem (\r
         &Private->ServerIp,\r
         &Entry->IpAddr[0],\r
@@ -506,6 +512,7 @@ PxeBcDhcp4BootInfo (
         );\r
     }\r
   }\r
+\r
   if (Private->ServerIp.Addr[0] == 0) {\r
     //\r
     // ServerIp.Addr[0] equals zero means we failed to get IP address from boot server list.\r
@@ -517,6 +524,7 @@ PxeBcDhcp4BootInfo (
       sizeof (EFI_IPv4_ADDRESS)\r
       );\r
   }\r
+\r
   if (Private->ServerIp.Addr[0] == 0) {\r
     //\r
     // Still failed , use the IP address from option 54.\r
@@ -538,7 +546,7 @@ PxeBcDhcp4BootInfo (
     // Parse the boot file size by option.\r
     //\r
     CopyMem (&Value, Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value));\r
-    Value       = NTOHS (Value);\r
+    Value = NTOHS (Value);\r
     //\r
     // The field of boot file size is 512 bytes in unit.\r
     //\r
@@ -564,7 +572,7 @@ PxeBcDhcp4BootInfo (
   //\r
   // Save the value of boot file size.\r
   //\r
-  Private->BootFileSize = (UINTN) *BufferSize;\r
+  Private->BootFileSize = (UINTN)*BufferSize;\r
 \r
   //\r
   // Display all the information: boot server address, boot file name and boot file size.\r
@@ -577,7 +585,6 @@ PxeBcDhcp4BootInfo (
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Parse out the boot information from the last Dhcp6 reply packet.\r
 \r
@@ -591,8 +598,8 @@ PxeBcDhcp4BootInfo (
 **/\r
 EFI_STATUS\r
 PxeBcDhcp6BootInfo (\r
-  IN OUT PXEBC_PRIVATE_DATA   *Private,\r
-     OUT UINT64               *BufferSize\r
+  IN OUT PXEBC_PRIVATE_DATA  *Private,\r
+  OUT UINT64                 *BufferSize\r
   )\r
 {\r
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
@@ -617,29 +624,43 @@ PxeBcDhcp6BootInfo (
     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
+  //\r
+  Status = PxeBcSetIp6Address (Private);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
 \r
   //\r
   // Parse (m)tftp server ip address and bootfile name.\r
   //\r
   Status = PxeBcExtractBootFileUrl (\r
+             Private,\r
              &Private->BootFileName,\r
              &Private->ServerIp.v6,\r
-             (CHAR8 *) (Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL]->Data),\r
+             (CHAR8 *)(Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL]->Data),\r
              NTOHS (Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_URL]->OpLen)\r
              );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
-  //\r
-  // Set the station address to IP layer.\r
-  //\r
-  Status = PxeBcSetIp6Address (Private);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  \r
   //\r
   // Parse the value of boot file size.\r
   //\r
@@ -647,10 +668,11 @@ PxeBcDhcp6BootInfo (
     //\r
     // Parse it out if have the boot file parameter option.\r
     //\r
-    Status = PxeBcExtractBootFileParam ((CHAR8 *) Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_PARAM]->Data, &Value);\r
+    Status = PxeBcExtractBootFileParam ((CHAR8 *)Cache6->OptList[PXEBC_DHCP6_IDX_BOOT_FILE_PARAM]->Data, &Value);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
+\r
     //\r
     // The field of boot file size is 512 bytes in unit.\r
     //\r
@@ -676,7 +698,7 @@ PxeBcDhcp6BootInfo (
   //\r
   // Save the value of boot file size.\r
   //\r
-  Private->BootFileSize = (UINTN) *BufferSize;\r
+  Private->BootFileSize = (UINTN)*BufferSize;\r
 \r
   //\r
   // Display all the information: boot server address, boot file name and boot file size.\r
@@ -689,7 +711,6 @@ PxeBcDhcp6BootInfo (
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Extract the discover information and boot server entry from the\r
   cached packets if unspecified.\r
@@ -709,17 +730,17 @@ PxeBcExtractDiscoverInfo (
   IN     PXEBC_PRIVATE_DATA               *Private,\r
   IN     UINT16                           Type,\r
   IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO  **DiscoverInfo,\r
-     OUT PXEBC_BOOT_SVR_ENTRY             **BootEntry,\r
-     OUT EFI_PXE_BASE_CODE_SRVLIST        **SrvList\r
+  OUT PXEBC_BOOT_SVR_ENTRY                **BootEntry,\r
+  OUT EFI_PXE_BASE_CODE_SRVLIST           **SrvList\r
   )\r
 {\r
-  EFI_PXE_BASE_CODE_MODE          *Mode;\r
-  PXEBC_DHCP4_PACKET_CACHE        *Cache4;\r
-  PXEBC_VENDOR_OPTION             *VendorOpt;\r
-  PXEBC_BOOT_SVR_ENTRY            *Entry;\r
-  BOOLEAN                         IsFound;\r
-  EFI_PXE_BASE_CODE_DISCOVER_INFO *Info;\r
-  UINT16                          Index;\r
+  EFI_PXE_BASE_CODE_MODE           *Mode;\r
+  PXEBC_DHCP4_PACKET_CACHE         *Cache4;\r
+  PXEBC_VENDOR_OPTION              *VendorOpt;\r
+  PXEBC_BOOT_SVR_ENTRY             *Entry;\r
+  BOOLEAN                          IsFound;\r
+  EFI_PXE_BASE_CODE_DISCOVER_INFO  *Info;\r
+  UINT16                           Index;\r
 \r
   Mode = Private->PxeBc.Mode;\r
   Info = *DiscoverInfo;\r
@@ -736,7 +757,7 @@ PxeBcExtractDiscoverInfo (
     //\r
     CopyMem (&Info->SrvList[0].IpAddr, &Private->ServerIp, sizeof (EFI_IP_ADDRESS));\r
 \r
-    *SrvList  = Info->SrvList;\r
+    *SrvList = Info->SrvList;\r
   } else {\r
     Entry     = NULL;\r
     IsFound   = FALSE;\r
@@ -755,8 +776,8 @@ PxeBcExtractDiscoverInfo (
     //\r
     Info->UseMCast    = (BOOLEAN) !IS_DISABLE_MCAST_DISCOVER (VendorOpt->DiscoverCtrl);\r
     Info->UseBCast    = (BOOLEAN) !IS_DISABLE_BCAST_DISCOVER (VendorOpt->DiscoverCtrl);\r
-    Info->MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST (VendorOpt->DiscoverCtrl);\r
-    Info->UseUCast    = (BOOLEAN) IS_VALID_BOOT_SERVERS (VendorOpt->BitMap);\r
+    Info->MustUseList = (BOOLEAN)IS_ENABLE_USE_SERVER_LIST (VendorOpt->DiscoverCtrl);\r
+    Info->UseUCast    = (BOOLEAN)IS_VALID_BOOT_SERVERS (VendorOpt->BitMap);\r
 \r
     if (Info->UseMCast) {\r
       //\r
@@ -770,11 +791,12 @@ PxeBcExtractDiscoverInfo (
     if (Info->UseUCast) {\r
       Entry = VendorOpt->BootSvr;\r
 \r
-      while (((UINT8) (Entry - VendorOpt->BootSvr)) < VendorOpt->BootSvrLen) {\r
+      while (((UINT8)(Entry - VendorOpt->BootSvr)) < VendorOpt->BootSvrLen) {\r
         if (Entry->Type == HTONS (Type)) {\r
           IsFound = TRUE;\r
           break;\r
         }\r
+\r
         Entry = GET_NEXT_BOOT_SVR_ENTRY (Entry);\r
       }\r
 \r
@@ -786,8 +808,9 @@ PxeBcExtractDiscoverInfo (
       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
+\r
         CopyMem (*DiscoverInfo, Info, sizeof (*Info));\r
         Info = *DiscoverInfo;\r
       }\r
@@ -795,7 +818,7 @@ PxeBcExtractDiscoverInfo (
       for (Index = 0; Index < Info->IpCnt; Index++) {\r
         CopyMem (&Info->SrvList[Index].IpAddr, &Entry->IpAddr[Index], sizeof (EFI_IPv4_ADDRESS));\r
         Info->SrvList[Index].AcceptAnyResponse = !Info->MustUseList;\r
-        Info->SrvList[Index].Type = NTOHS (Entry->Type);\r
+        Info->SrvList[Index].Type              = NTOHS (Entry->Type);\r
       }\r
     }\r
 \r
@@ -806,7 +829,6 @@ PxeBcExtractDiscoverInfo (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Build the discover packet and send out for boot server.\r
 \r
@@ -826,13 +848,13 @@ PxeBcExtractDiscoverInfo (
 **/\r
 EFI_STATUS\r
 PxeBcDiscoverBootServer (\r
-  IN  PXEBC_PRIVATE_DATA                *Private,\r
-  IN  UINT16                            Type,\r
-  IN  UINT16                            *Layer,\r
-  IN  BOOLEAN                           UseBis,\r
-  IN  EFI_IP_ADDRESS                    *DestIp,\r
-  IN  UINT16                            IpCount,\r
-  IN  EFI_PXE_BASE_CODE_SRVLIST         *SrvList\r
+  IN  PXEBC_PRIVATE_DATA         *Private,\r
+  IN  UINT16                     Type,\r
+  IN  UINT16                     *Layer,\r
+  IN  BOOLEAN                    UseBis,\r
+  IN  EFI_IP_ADDRESS             *DestIp,\r
+  IN  UINT16                     IpCount,\r
+  IN  EFI_PXE_BASE_CODE_SRVLIST  *SrvList\r
   )\r
 {\r
   if (Private->PxeBc.Mode->UsingIpv6) {\r
@@ -856,7 +878,6 @@ PxeBcDiscoverBootServer (
   }\r
 }\r
 \r
-\r
 /**\r
   Discover all the boot information for boot file.\r
 \r
@@ -871,8 +892,8 @@ PxeBcDiscoverBootServer (
 **/\r
 EFI_STATUS\r
 PxeBcDiscoverBootFile (\r
-  IN OUT PXEBC_PRIVATE_DATA   *Private,\r
-     OUT UINT64               *BufferSize\r
+  IN OUT PXEBC_PRIVATE_DATA  *Private,\r
+  OUT UINT64                 *BufferSize\r
   )\r
 {\r
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
@@ -914,7 +935,6 @@ PxeBcDiscoverBootFile (
   }\r
 \r
   if (!EFI_ERROR (Status)) {\r
-\r
     if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) {\r
       //\r
       // Local boot(PXE bootstrap server) need abort\r
@@ -926,7 +946,7 @@ PxeBcDiscoverBootFile (
     // Start to discover the boot server to get (m)tftp server ip address, bootfile\r
     // name and bootfile size.\r
     //\r
-    UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected);\r
+    UseBis = (BOOLEAN)(Mode->BisSupported && Mode->BisDetected);\r
     Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
@@ -948,8 +968,9 @@ PxeBcDiscoverBootFile (
           &Mode->ProxyOffer.Dhcpv4,\r
           &Mode->PxeReply.Dhcpv4,\r
           Private->PxeReply.Dhcp4.Packet.Ack.Length\r
-          );      \r
+          );\r
       }\r
+\r
       Mode->ProxyOfferReceived = TRUE;\r
     }\r
   }\r
@@ -966,21 +987,20 @@ PxeBcDiscoverBootFile (
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Install PxeBaseCodeCallbackProtocol if not installed before.\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
 EFI_STATUS\r
 PxeBcInstallCallback (\r
-  IN OUT PXEBC_PRIVATE_DATA   *Private,\r
-     OUT BOOLEAN              *NewMakeCallback\r
+  IN OUT PXEBC_PRIVATE_DATA  *Private,\r
+  OUT BOOLEAN                *NewMakeCallback\r
   )\r
 {\r
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
@@ -991,12 +1011,11 @@ PxeBcInstallCallback (
   //\r
   PxeBc  = &Private->PxeBc;\r
   Status = gBS->HandleProtocol (\r
-                  Private->Controller,\r
+                  Private->Mode.UsingIpv6 ? Private->Ip6Nic->Controller : Private->Ip4Nic->Controller,\r
                   &gEfiPxeBaseCodeCallbackProtocolGuid,\r
-                  (VOID **) &Private->PxeBcCallback\r
+                  (VOID **)&Private->PxeBcCallback\r
                   );\r
   if (Status == EFI_UNSUPPORTED) {\r
-\r
     CopyMem (\r
       &Private->LoadFileCallback,\r
       &gPxeBcCallBackTemplate,\r
@@ -1007,13 +1026,13 @@ PxeBcInstallCallback (
     // Install a default callback if user didn't offer one.\r
     //\r
     Status = gBS->InstallProtocolInterface (\r
-                    &Private->Controller,\r
+                    Private->Mode.UsingIpv6 ? &Private->Ip6Nic->Controller : &Private->Ip4Nic->Controller,\r
                     &gEfiPxeBaseCodeCallbackProtocolGuid,\r
                     EFI_NATIVE_INTERFACE,\r
                     &Private->LoadFileCallback\r
                     );\r
 \r
-    (*NewMakeCallback) = (BOOLEAN) (Status == EFI_SUCCESS);\r
+    (*NewMakeCallback) = (BOOLEAN)(Status == EFI_SUCCESS);\r
 \r
     Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, NewMakeCallback);\r
     if (EFI_ERROR (Status)) {\r
@@ -1025,7 +1044,6 @@ PxeBcInstallCallback (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Uninstall PxeBaseCodeCallbackProtocol.\r
 \r
@@ -1036,29 +1054,27 @@ PxeBcInstallCallback (
 **/\r
 VOID\r
 PxeBcUninstallCallback (\r
-  IN PXEBC_PRIVATE_DATA        *Private,\r
-  IN BOOLEAN                   NewMakeCallback\r
+  IN PXEBC_PRIVATE_DATA  *Private,\r
+  IN BOOLEAN             NewMakeCallback\r
   )\r
 {\r
-  EFI_PXE_BASE_CODE_PROTOCOL   *PxeBc;\r
+  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
 \r
   PxeBc = &Private->PxeBc;\r
 \r
   if (NewMakeCallback) {\r
-\r
     NewMakeCallback = FALSE;\r
 \r
     PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback);\r
 \r
     gBS->UninstallProtocolInterface (\r
-          Private->Controller,\r
-          &gEfiPxeBaseCodeCallbackProtocolGuid,\r
-          &Private->LoadFileCallback\r
-          );\r
+           Private->Mode.UsingIpv6 ? Private->Ip6Nic->Controller : Private->Ip4Nic->Controller,\r
+           &gEfiPxeBaseCodeCallbackProtocolGuid,\r
+           &Private->LoadFileCallback\r
+           );\r
   }\r
 }\r
 \r
-\r
 /**\r
   Download one of boot file in the list, and it's special for IPv6.\r
 \r
@@ -1075,15 +1091,15 @@ PxeBcUninstallCallback (
 **/\r
 EFI_STATUS\r
 PxeBcReadBootFileList (\r
-  IN     PXEBC_PRIVATE_DATA           *Private,\r
-  IN OUT UINT64                       *BufferSize,\r
-  IN     VOID                         *Buffer           OPTIONAL\r
+  IN     PXEBC_PRIVATE_DATA  *Private,\r
+  IN OUT UINT64              *BufferSize,\r
+  IN     VOID                *Buffer           OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS                          Status;\r
-  EFI_PXE_BASE_CODE_PROTOCOL          *PxeBc;\r
+  EFI_STATUS                  Status;\r
+  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
 \r
-  PxeBc        = &Private->PxeBc;\r
+  PxeBc = &Private->PxeBc;\r
 \r
   //\r
   // Try to download the boot file if everything is ready.\r
@@ -1101,16 +1117,13 @@ PxeBcReadBootFileList (
                       NULL,\r
                       FALSE\r
                       );\r
-\r
-\r
   } else {\r
-    Status      = EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
   }\r
 \r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Load boot file into user buffer.\r
 \r
@@ -1127,17 +1140,17 @@ PxeBcReadBootFileList (
 **/\r
 EFI_STATUS\r
 PxeBcLoadBootFile (\r
-  IN     PXEBC_PRIVATE_DATA           *Private,\r
-  IN OUT UINTN                        *BufferSize,\r
-  IN     VOID                         *Buffer         OPTIONAL\r
+  IN     PXEBC_PRIVATE_DATA  *Private,\r
+  IN OUT UINTN               *BufferSize,\r
+  IN     VOID                *Buffer         OPTIONAL\r
   )\r
 {\r
-  BOOLEAN                             NewMakeCallback;\r
-  UINT64                              RequiredSize;\r
-  UINT64                              CurrentSize;\r
-  EFI_STATUS                          Status;\r
-  EFI_PXE_BASE_CODE_PROTOCOL          *PxeBc;\r
-  EFI_PXE_BASE_CODE_MODE              *PxeBcMode;\r
+  BOOLEAN                     NewMakeCallback;\r
+  UINT64                      RequiredSize;\r
+  UINT64                      CurrentSize;\r
+  EFI_STATUS                  Status;\r
+  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
+  EFI_PXE_BASE_CODE_MODE      *PxeBcMode;\r
 \r
   NewMakeCallback = FALSE;\r
   PxeBc           = &Private->PxeBc;\r
@@ -1149,7 +1162,7 @@ PxeBcLoadBootFile (
   // Install pxebc callback protocol if hasn't been installed yet.\r
   //\r
   Status = PxeBcInstallCallback (Private, &NewMakeCallback);\r
-  if (EFI_ERROR(Status)) {\r
+  if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
@@ -1172,7 +1185,7 @@ PxeBcLoadBootFile (
       //\r
       // Get the right buffer size of the bootfile required.\r
       //\r
-      if (CurrentSize < RequiredSize || Buffer == NULL) {\r
+      if ((CurrentSize < RequiredSize) || (Buffer == NULL)) {\r
         //\r
         // It's buffer too small if the size of user buffer is smaller than the required.\r
         //\r
@@ -1180,8 +1193,9 @@ PxeBcLoadBootFile (
         Status      = EFI_BUFFER_TOO_SMALL;\r
         goto ON_EXIT;\r
       }\r
+\r
       CurrentSize = RequiredSize;\r
-    } else if (RequiredSize == 0 && PxeBcMode->UsingIpv6) {\r
+    } else if ((RequiredSize == 0) && PxeBcMode->UsingIpv6) {\r
       //\r
       // Try to download another bootfile in list if failed to get the filesize of the last one.\r
       // It's special for the case of IPv6.\r
@@ -1189,7 +1203,7 @@ PxeBcLoadBootFile (
       Status = PxeBcReadBootFileList (Private, &CurrentSize, Buffer);\r
       goto ON_EXIT;\r
     }\r
-  } else if (CurrentSize < Private->BootFileSize || Buffer == NULL ) {\r
+  } else if ((CurrentSize < Private->BootFileSize) || (Buffer == NULL)) {\r
     //\r
     // It's buffer too small if the size of user buffer is smaller than the required.\r
     //\r
@@ -1224,13 +1238,13 @@ PxeBcLoadBootFile (
   }\r
 \r
 ON_EXIT:\r
-  *BufferSize = (UINTN) CurrentSize;\r
-  PxeBcUninstallCallback(Private, NewMakeCallback);\r
+  *BufferSize = (UINTN)CurrentSize;\r
+  PxeBcUninstallCallback (Private, NewMakeCallback);\r
 \r
   if (Status == EFI_SUCCESS) {\r
-    AsciiPrint ("\n  Succeed to download NBP file.\n");\r
+    AsciiPrint ("\n  NBP file downloaded successfully.\n");\r
     return EFI_SUCCESS;\r
-  } else if (Status == EFI_BUFFER_TOO_SMALL && Buffer != NULL) {\r
+  } else if ((Status == EFI_BUFFER_TOO_SMALL) && (Buffer != NULL)) {\r
     AsciiPrint ("\n  PXE-E05: Buffer size is smaller than the requested file.\n");\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     AsciiPrint ("\n  PXE-E07: Network device error.\n");\r
@@ -1239,7 +1253,7 @@ ON_EXIT:
   } else if (Status == EFI_NO_MEDIA) {\r
     AsciiPrint ("\n  PXE-E12: Could not detect network connection.\n");\r
   } else if (Status == EFI_NO_RESPONSE) {\r
-    AsciiPrint ("\n  PXE-E16: No offer received.\n");\r
+    AsciiPrint ("\n  PXE-E16: No valid offer received.\n");\r
   } else if (Status == EFI_TIMEOUT) {\r
     AsciiPrint ("\n  PXE-E18: Server response timeout.\n");\r
   } else if (Status == EFI_ABORTED) {\r
@@ -1256,4 +1270,3 @@ ON_EXIT:
 \r
   return Status;\r
 }\r
-\r