]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / NetworkPkg / HttpBootDxe / HttpBootDhcp6.c
index 2538bd116ca42ddb47c2081c4fab3e03c0399766..b22cef4ff58743898c3ff863ab2a52f995b2dd2b 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   Functions implementation related with DHCPv6 for HTTP boot driver.\r
 \r
-Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution.  \r
-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
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -26,70 +20,70 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 UINT32\r
 HttpBootBuildDhcp6Options (\r
-  IN  HTTP_BOOT_PRIVATE_DATA       *Private,\r
-  OUT EFI_DHCP6_PACKET_OPTION      **OptList,\r
-  IN  UINT8                        *Buffer\r
+  IN  HTTP_BOOT_PRIVATE_DATA   *Private,\r
+  OUT EFI_DHCP6_PACKET_OPTION  **OptList,\r
+  IN  UINT8                    *Buffer\r
   )\r
 {\r
-  HTTP_BOOT_DHCP6_OPTION_ENTRY     OptEnt;\r
-  UINT16                           Value;\r
-  UINT32                           Index;\r
+  HTTP_BOOT_DHCP6_OPTION_ENTRY  OptEnt;\r
+  UINT16                        Value;\r
+  UINT32                        Index;\r
 \r
   Index      = 0;\r
-  OptList[0] = (EFI_DHCP6_PACKET_OPTION *) Buffer;\r
+  OptList[0] = (EFI_DHCP6_PACKET_OPTION *)Buffer;\r
 \r
   //\r
   // Append client option request option\r
   //\r
-  OptList[Index]->OpCode     = HTONS (HTTP_BOOT_DHCP6_OPT_ORO);\r
-  OptList[Index]->OpLen      = HTONS (8);\r
-  OptEnt.Oro                 = (HTTP_BOOT_DHCP6_OPTION_ORO *) OptList[Index]->Data;\r
-  OptEnt.Oro->OpCode[0]      = HTONS(HTTP_BOOT_DHCP6_OPT_BOOT_FILE_URL);\r
-  OptEnt.Oro->OpCode[1]      = HTONS(HTTP_BOOT_DHCP6_OPT_BOOT_FILE_PARAM);\r
-  OptEnt.Oro->OpCode[2]      = HTONS(HTTP_BOOT_DHCP6_OPT_DNS_SERVERS);\r
-  OptEnt.Oro->OpCode[3]      = HTONS(HTTP_BOOT_DHCP6_OPT_VENDOR_CLASS);\r
+  OptList[Index]->OpCode = HTONS (DHCP6_OPT_ORO);\r
+  OptList[Index]->OpLen  = HTONS (8);\r
+  OptEnt.Oro             = (HTTP_BOOT_DHCP6_OPTION_ORO *)OptList[Index]->Data;\r
+  OptEnt.Oro->OpCode[0]  = HTONS (DHCP6_OPT_BOOT_FILE_URL);\r
+  OptEnt.Oro->OpCode[1]  = HTONS (DHCP6_OPT_BOOT_FILE_PARAM);\r
+  OptEnt.Oro->OpCode[2]  = HTONS (DHCP6_OPT_DNS_SERVERS);\r
+  OptEnt.Oro->OpCode[3]  = HTONS (DHCP6_OPT_VENDOR_CLASS);\r
   Index++;\r
-  OptList[Index]             = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);\r
+  OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);\r
 \r
   //\r
   // Append client network device interface option\r
   //\r
-  OptList[Index]->OpCode     = HTONS (HTTP_BOOT_DHCP6_OPT_UNDI);\r
-  OptList[Index]->OpLen      = HTONS ((UINT16)3);\r
-  OptEnt.Undi                = (HTTP_BOOT_DHCP6_OPTION_UNDI *) OptList[Index]->Data;\r
+  OptList[Index]->OpCode = HTONS (DHCP6_OPT_UNDI);\r
+  OptList[Index]->OpLen  = HTONS ((UINT16)3);\r
+  OptEnt.Undi            = (HTTP_BOOT_DHCP6_OPTION_UNDI *)OptList[Index]->Data;\r
 \r
   if (Private->Nii != NULL) {\r
-    OptEnt.Undi->Type        = Private->Nii->Type;\r
-    OptEnt.Undi->MajorVer    = Private->Nii->MajorVer;\r
-    OptEnt.Undi->MinorVer    = Private->Nii->MinorVer;\r
+    OptEnt.Undi->Type     = Private->Nii->Type;\r
+    OptEnt.Undi->MajorVer = Private->Nii->MajorVer;\r
+    OptEnt.Undi->MinorVer = Private->Nii->MinorVer;\r
   } else {\r
-    OptEnt.Undi->Type        = DEFAULT_UNDI_TYPE;\r
-    OptEnt.Undi->MajorVer    = DEFAULT_UNDI_MAJOR;\r
-    OptEnt.Undi->MinorVer    = DEFAULT_UNDI_MINOR;\r
+    OptEnt.Undi->Type     = DEFAULT_UNDI_TYPE;\r
+    OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR;\r
+    OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR;\r
   }\r
 \r
   Index++;\r
-  OptList[Index]             = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);\r
+  OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);\r
 \r
   //\r
   // Append client system architecture option\r
   //\r
-  OptList[Index]->OpCode     = HTONS (HTTP_BOOT_DHCP6_OPT_ARCH);\r
-  OptList[Index]->OpLen      = HTONS ((UINT16) sizeof (HTTP_BOOT_DHCP6_OPTION_ARCH));\r
-  OptEnt.Arch                = (HTTP_BOOT_DHCP6_OPTION_ARCH *) OptList[Index]->Data;\r
-  Value                      = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);\r
+  OptList[Index]->OpCode = HTONS (DHCP6_OPT_ARCH);\r
+  OptList[Index]->OpLen  = HTONS ((UINT16)sizeof (HTTP_BOOT_DHCP6_OPTION_ARCH));\r
+  OptEnt.Arch            = (HTTP_BOOT_DHCP6_OPTION_ARCH *)OptList[Index]->Data;\r
+  Value                  = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);\r
   CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));\r
   Index++;\r
-  OptList[Index]             = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);\r
+  OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);\r
 \r
   //\r
   // Append vendor class identify option.\r
   //\r
-  OptList[Index]->OpCode       = HTONS (HTTP_BOOT_DHCP6_OPT_VENDOR_CLASS);\r
-  OptList[Index]->OpLen        = HTONS ((UINT16) sizeof (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS));\r
-  OptEnt.VendorClass           = (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *) OptList[Index]->Data;\r
+  OptList[Index]->OpCode       = HTONS (DHCP6_OPT_VENDOR_CLASS);\r
+  OptList[Index]->OpLen        = HTONS ((UINT16)sizeof (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS));\r
+  OptEnt.VendorClass           = (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *)OptList[Index]->Data;\r
   OptEnt.VendorClass->Vendor   = HTONL (HTTP_BOOT_DHCP6_ENTERPRISE_NUM);\r
-  OptEnt.VendorClass->ClassLen = HTONS ((UINT16) sizeof (HTTP_BOOT_CLASS_ID));\r
+  OptEnt.VendorClass->ClassLen = HTONS ((UINT16)sizeof (HTTP_BOOT_CLASS_ID));\r
   CopyMem (\r
     &OptEnt.VendorClass->ClassId,\r
     DEFAULT_CLASS_ID_DATA,\r
@@ -132,38 +126,35 @@ HttpBootBuildDhcp6Options (
   @param[in]  OptTag        The required option tag.\r
 \r
   @retval     NULL          Failed to parse the required option.\r
-  @retval     Others        The postion of the required option in buffer.\r
+  @retval     Others        The position of the required option in buffer.\r
 \r
 **/\r
 EFI_DHCP6_PACKET_OPTION *\r
 HttpBootParseDhcp6Options (\r
-  IN UINT8                       *Buffer,\r
-  IN UINT32                      Length,\r
-  IN UINT16                      OptTag\r
+  IN UINT8   *Buffer,\r
+  IN UINT32  Length,\r
+  IN UINT16  OptTag\r
   )\r
 {\r
-  EFI_DHCP6_PACKET_OPTION        *Option;\r
-  UINT32                         Offset;\r
+  EFI_DHCP6_PACKET_OPTION  *Option;\r
+  UINT32                   Offset;\r
 \r
-  Option  = (EFI_DHCP6_PACKET_OPTION *) Buffer;\r
-  Offset  = 0;\r
+  Option = (EFI_DHCP6_PACKET_OPTION *)Buffer;\r
+  Offset = 0;\r
 \r
   //\r
   // OpLen and OpCode here are both stored in network order.\r
   //\r
   while (Offset < Length) {\r
-\r
     if (NTOHS (Option->OpCode) == OptTag) {\r
-\r
       return Option;\r
     }\r
 \r
-    Offset += (NTOHS(Option->OpLen) + 4);\r
-    Option  = (EFI_DHCP6_PACKET_OPTION *) (Buffer + Offset);\r
+    Offset += (NTOHS (Option->OpLen) + 4);\r
+    Option  = (EFI_DHCP6_PACKET_OPTION *)(Buffer + Offset);\r
   }\r
 \r
   return NULL;\r
-\r
 }\r
 \r
 /**\r
@@ -177,70 +168,70 @@ HttpBootParseDhcp6Options (
 **/\r
 EFI_STATUS\r
 HttpBootParseDhcp6Packet (\r
-  IN  HTTP_BOOT_DHCP6_PACKET_CACHE    *Cache6\r
+  IN  HTTP_BOOT_DHCP6_PACKET_CACHE  *Cache6\r
   )\r
 {\r
-  EFI_DHCP6_PACKET               *Offer;\r
-  EFI_DHCP6_PACKET_OPTION        **Options;\r
-  EFI_DHCP6_PACKET_OPTION        *Option;\r
-  HTTP_BOOT_OFFER_TYPE           OfferType;\r
-  EFI_IPv6_ADDRESS               IpAddr;\r
-  BOOLEAN                        IsProxyOffer;\r
-  BOOLEAN                        IsHttpOffer;\r
-  BOOLEAN                        IsDnsOffer;\r
-  BOOLEAN                        IpExpressedUri;\r
-  EFI_STATUS                     Status;\r
-  UINT32                         Offset;\r
-  UINT32                         Length;\r
-  \r
+  EFI_DHCP6_PACKET         *Offer;\r
+  EFI_DHCP6_PACKET_OPTION  **Options;\r
+  EFI_DHCP6_PACKET_OPTION  *Option;\r
+  HTTP_BOOT_OFFER_TYPE     OfferType;\r
+  EFI_IPv6_ADDRESS         IpAddr;\r
+  BOOLEAN                  IsProxyOffer;\r
+  BOOLEAN                  IsHttpOffer;\r
+  BOOLEAN                  IsDnsOffer;\r
+  BOOLEAN                  IpExpressedUri;\r
+  EFI_STATUS               Status;\r
+  UINT32                   Offset;\r
+  UINT32                   Length;\r
+\r
   IsDnsOffer     = FALSE;\r
   IpExpressedUri = FALSE;\r
   IsProxyOffer   = TRUE;\r
   IsHttpOffer    = FALSE;\r
-  Offer        = &Cache6->Packet.Offer;\r
-  Options      = Cache6->OptList;\r
-  \r
+  Offer          = &Cache6->Packet.Offer;\r
+  Options        = Cache6->OptList;\r
+\r
   ZeroMem (Cache6->OptList, sizeof (Cache6->OptList));\r
 \r
-  Option  = (EFI_DHCP6_PACKET_OPTION *) (Offer->Dhcp6.Option);\r
-  Offset  = 0;\r
-  Length  = GET_DHCP6_OPTION_SIZE (Offer);\r
+  Option = (EFI_DHCP6_PACKET_OPTION *)(Offer->Dhcp6.Option);\r
+  Offset = 0;\r
+  Length = GET_DHCP6_OPTION_SIZE (Offer);\r
 \r
   //\r
   // OpLen and OpCode here are both stored in network order, since they are from original packet.\r
   //\r
   while (Offset < Length) {\r
-\r
-    if (NTOHS (Option->OpCode) == HTTP_BOOT_DHCP6_OPT_IA_NA) {\r
+    if (NTOHS (Option->OpCode) == DHCP6_OPT_IA_NA) {\r
       Options[HTTP_BOOT_DHCP6_IDX_IA_NA] = Option;\r
-    } else if (NTOHS (Option->OpCode) == HTTP_BOOT_DHCP6_OPT_BOOT_FILE_URL) {\r
+    } else if (NTOHS (Option->OpCode) == DHCP6_OPT_BOOT_FILE_URL) {\r
       //\r
       // The server sends this option to inform the client about an URL to a boot file.\r
       //\r
       Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL] = Option;\r
-    } else if (NTOHS (Option->OpCode) == HTTP_BOOT_DHCP6_OPT_BOOT_FILE_PARAM) {\r
+    } else if (NTOHS (Option->OpCode) == DHCP6_OPT_BOOT_FILE_PARAM) {\r
       Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_PARAM] = Option;\r
-    } else if (NTOHS (Option->OpCode) == HTTP_BOOT_DHCP6_OPT_VENDOR_CLASS) {\r
+    } else if (NTOHS (Option->OpCode) == DHCP6_OPT_VENDOR_CLASS) {\r
       Options[HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS] = Option;\r
-    } else if (NTOHS (Option->OpCode) == HTTP_BOOT_DHCP6_OPT_DNS_SERVERS) {\r
+    } else if (NTOHS (Option->OpCode) == DHCP6_OPT_DNS_SERVERS) {\r
       Options[HTTP_BOOT_DHCP6_IDX_DNS_SERVER] = Option;\r
     }\r
 \r
     Offset += (NTOHS (Option->OpLen) + 4);\r
-    Option  = (EFI_DHCP6_PACKET_OPTION *) (Offer->Dhcp6.Option + Offset);\r
+    Option  = (EFI_DHCP6_PACKET_OPTION *)(Offer->Dhcp6.Option + Offset);\r
   }\r
+\r
   //\r
   // The offer with assigned client address is NOT a proxy offer.\r
-  // An ia_na option, embeded with valid ia_addr option and a status_code of success.\r
+  // An ia_na option, embedded with valid ia_addr option and a status_code of success.\r
   //\r
   Option = Options[HTTP_BOOT_DHCP6_IDX_IA_NA];\r
   if (Option != NULL) {\r
     Option = HttpBootParseDhcp6Options (\r
                Option->Data + 12,\r
                NTOHS (Option->OpLen),\r
-               HTTP_BOOT_DHCP6_OPT_STATUS_CODE\r
+               DHCP6_OPT_STATUS_CODE\r
                );\r
-    if ((Option != NULL && Option->Data[0] == 0) || (Option == NULL)) {\r
+    if (((Option != NULL) && (Option->Data[0] == 0)) || (Option == NULL)) {\r
       IsProxyOffer = FALSE;\r
     }\r
   }\r
@@ -250,10 +241,11 @@ HttpBootParseDhcp6Packet (
   //\r
   Option = Options[HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS];\r
 \r
-  if (Option != NULL &&\r
-      NTOHS(Option->OpLen) >= 10 &&\r
-      CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 10) == 0) {\r
-      IsHttpOffer = TRUE;\r
+  if ((Option != NULL) &&\r
+      (NTOHS (Option->OpLen) >= 16) &&\r
+      (CompareMem ((Option->Data + 6), DEFAULT_CLASS_ID_DATA, 10) == 0))\r
+  {\r
+    IsHttpOffer = TRUE;\r
   }\r
 \r
   //\r
@@ -267,17 +259,17 @@ HttpBootParseDhcp6Packet (
   //\r
   // Http offer must have a boot URI.\r
   //\r
-  if (IsHttpOffer && Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL] == NULL) {\r
+  if (IsHttpOffer && (Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL] == NULL)) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
\r
+\r
   //\r
-  // Try to retrieve the IP of HTTP server from URI. \r
+  // Try to retrieve the IP of HTTP server from URI.\r
   //\r
   if (IsHttpOffer) {\r
     Status = HttpParseUrl (\r
-               (CHAR8*) Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
-               (UINT32) AsciiStrLen ((CHAR8*) Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data),\r
+               (CHAR8 *)Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
+               (UINT32)AsciiStrLen ((CHAR8 *)Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data),\r
                FALSE,\r
                &Cache6->UriParser\r
                );\r
@@ -286,7 +278,7 @@ HttpBootParseDhcp6Packet (
     }\r
 \r
     Status = HttpUrlGetIp6 (\r
-               (CHAR8*) Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
+               (CHAR8 *)Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
                Cache6->UriParser,\r
                &IpAddr\r
                );\r
@@ -298,7 +290,11 @@ HttpBootParseDhcp6Packet (
   //\r
   if (IsHttpOffer) {\r
     if (IpExpressedUri) {\r
-      OfferType = IsProxyOffer ? HttpOfferTypeProxyIpUri : HttpOfferTypeDhcpIpUri;\r
+      if (IsProxyOffer) {\r
+        OfferType = HttpOfferTypeProxyIpUri;\r
+      } else {\r
+        OfferType = IsDnsOffer ? HttpOfferTypeDhcpIpUriDns : HttpOfferTypeDhcpIpUri;\r
+      }\r
     } else {\r
       if (!IsProxyOffer) {\r
         OfferType = IsDnsOffer ? HttpOfferTypeDhcpNameUriDns : HttpOfferTypeDhcpNameUri;\r
@@ -306,7 +302,6 @@ HttpBootParseDhcp6Packet (
         OfferType = HttpOfferTypeProxyNameUri;\r
       }\r
     }\r
-\r
   } else {\r
     if (!IsProxyOffer) {\r
       OfferType = IsDnsOffer ? HttpOfferTypeDhcpDns : HttpOfferTypeDhcpOnly;\r
@@ -314,7 +309,7 @@ HttpBootParseDhcp6Packet (
       return EFI_DEVICE_ERROR;\r
     }\r
   }\r
-  \r
+\r
   Cache6->OfferType = OfferType;\r
   return EFI_SUCCESS;\r
 }\r
@@ -325,17 +320,24 @@ HttpBootParseDhcp6Packet (
   @param[in]  Dst          The pointer to the cache buffer for DHCPv6 packet.\r
   @param[in]  Src          The pointer to the DHCPv6 packet to be cached.\r
 \r
+  @retval     EFI_SUCCESS                Packet is copied.\r
+  @retval     EFI_BUFFER_TOO_SMALL       Cache buffer is not big enough to hold the packet.\r
+\r
 **/\r
-VOID\r
+EFI_STATUS\r
 HttpBootCacheDhcp6Packet (\r
-  IN EFI_DHCP6_PACKET          *Dst,\r
-  IN EFI_DHCP6_PACKET          *Src\r
+  IN EFI_DHCP6_PACKET  *Dst,\r
+  IN EFI_DHCP6_PACKET  *Src\r
   )\r
 {\r
-  ASSERT (Dst->Size >= Src->Length);\r
+  if (Dst->Size < Src->Length) {\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
 \r
   CopyMem (&Dst->Dhcp6, &Src->Dhcp6, Src->Length);\r
   Dst->Length = Src->Length;\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -344,16 +346,20 @@ HttpBootCacheDhcp6Packet (
   @param[in]  Private               The pointer to HTTP_BOOT_PRIVATE_DATA.\r
   @param[in]  RcvdOffer             The pointer to the received offer packet.\r
 \r
+  @retval     EFI_SUCCESS      Cache and parse the packet successfully.\r
+  @retval     Others           Operation failed.\r
+\r
 **/\r
-VOID\r
+EFI_STATUS\r
 HttpBootCacheDhcp6Offer (\r
   IN HTTP_BOOT_PRIVATE_DATA  *Private,\r
   IN EFI_DHCP6_PACKET        *RcvdOffer\r
   )\r
 {\r
-  HTTP_BOOT_DHCP6_PACKET_CACHE   *Cache6;\r
-  EFI_DHCP6_PACKET               *Offer;\r
-  HTTP_BOOT_OFFER_TYPE           OfferType;\r
+  HTTP_BOOT_DHCP6_PACKET_CACHE  *Cache6;\r
+  EFI_DHCP6_PACKET              *Offer;\r
+  HTTP_BOOT_OFFER_TYPE          OfferType;\r
+  EFI_STATUS                    Status;\r
 \r
   Cache6 = &Private->OfferBuffer[Private->OfferNum].Dhcp6;\r
   Offer  = &Cache6->Packet.Offer;\r
@@ -361,13 +367,16 @@ HttpBootCacheDhcp6Offer (
   //\r
   // Cache the content of DHCPv6 packet firstly.\r
   //\r
-  HttpBootCacheDhcp6Packet(Offer, RcvdOffer);\r
+  Status = HttpBootCacheDhcp6Packet (Offer, RcvdOffer);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
 \r
   //\r
   // Validate the DHCPv6 packet, and parse the options and offer type.\r
   //\r
   if (EFI_ERROR (HttpBootParseDhcp6Packet (Cache6))) {\r
-    return ;\r
+    return EFI_ABORTED;\r
   }\r
 \r
   //\r
@@ -378,7 +387,9 @@ HttpBootCacheDhcp6Offer (
   ASSERT (Private->OfferCount[OfferType] < HTTP_BOOT_OFFER_MAX_NUM);\r
   Private->OfferIndex[OfferType][Private->OfferCount[OfferType]] = Private->OfferNum;\r
   Private->OfferCount[OfferType]++;\r
-  Private->OfferNum++;  \r
+  Private->OfferNum++;\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -397,71 +408,105 @@ HttpBootCacheDhcp6Offer (
   @retval EFI_NOT_READY         Only used in the Dhcp6Selecting state. The EFI DHCPv6 Protocol\r
                                 driver will continue to wait for more packets.\r
   @retval EFI_ABORTED           Told the EFI DHCPv6 Protocol driver to abort the current process.\r
+  @retval EFI_OUT_OF_RESOURCES  There are not enough resources.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 HttpBootDhcp6CallBack (\r
-  IN  EFI_DHCP6_PROTOCOL           *This,\r
-  IN  VOID                         *Context,\r
-  IN  EFI_DHCP6_STATE              CurrentState,\r
-  IN  EFI_DHCP6_EVENT              Dhcp6Event,\r
-  IN  EFI_DHCP6_PACKET             *Packet,\r
-  OUT EFI_DHCP6_PACKET             **NewPacket     OPTIONAL\r
+  IN  EFI_DHCP6_PROTOCOL  *This,\r
+  IN  VOID                *Context,\r
+  IN  EFI_DHCP6_STATE     CurrentState,\r
+  IN  EFI_DHCP6_EVENT     Dhcp6Event,\r
+  IN  EFI_DHCP6_PACKET    *Packet,\r
+  OUT EFI_DHCP6_PACKET    **NewPacket     OPTIONAL\r
   )\r
 {\r
-   HTTP_BOOT_PRIVATE_DATA          *Private;\r
-   EFI_DHCP6_PACKET                *SelectAd;\r
-   EFI_STATUS                      Status;\r
-   if ((Dhcp6Event != Dhcp6RcvdAdvertise) && (Dhcp6Event != Dhcp6SelectAdvertise)) {\r
-     return EFI_SUCCESS;\r
-   }\r
-\r
-   ASSERT (Packet != NULL);\r
-   \r
-   Private     = (HTTP_BOOT_PRIVATE_DATA *) Context;\r
-   Status = EFI_SUCCESS;\r
-   switch (Dhcp6Event) {\r
-    \r
-   case Dhcp6RcvdAdvertise:\r
-     Status = EFI_NOT_READY;\r
-     if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {\r
-       //\r
-       // Cache the dhcp offers to OfferBuffer[] for select later, and record\r
-       // the OfferIndex and OfferCount.\r
-       //\r
-       HttpBootCacheDhcp6Offer (Private, Packet);\r
-     }\r
-     break;\r
-\r
-   case Dhcp6SelectAdvertise:\r
-     //\r
-     // Select offer by the default policy or by order, and record the SelectIndex\r
-     // and SelectProxyType.\r
-     //\r
-     HttpBootSelectDhcpOffer (Private);\r
-\r
-     if (Private->SelectIndex == 0) {\r
-       Status = EFI_ABORTED;\r
-     } else {\r
-       ASSERT (NewPacket != NULL);\r
-       SelectAd   = &Private->OfferBuffer[Private->SelectIndex - 1].Dhcp6.Packet.Offer;\r
-       *NewPacket = AllocateZeroPool (SelectAd->Size);\r
-       ASSERT (*NewPacket != NULL);\r
-       CopyMem (*NewPacket, SelectAd, SelectAd->Size);\r
-     }\r
-     break;\r
-     \r
-   default:\r
-     break;\r
-  }\r
-\r
-  return Status;   \r
+  HTTP_BOOT_PRIVATE_DATA  *Private;\r
+  EFI_DHCP6_PACKET        *SelectAd;\r
+  EFI_STATUS              Status;\r
+  BOOLEAN                 Received;\r
+\r
+  if ((Dhcp6Event != Dhcp6SendSolicit) &&\r
+      (Dhcp6Event != Dhcp6RcvdAdvertise) &&\r
+      (Dhcp6Event != Dhcp6SendRequest) &&\r
+      (Dhcp6Event != Dhcp6RcvdReply) &&\r
+      (Dhcp6Event != Dhcp6SelectAdvertise))\r
+  {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  ASSERT (Packet != NULL);\r
+\r
+  Private = (HTTP_BOOT_PRIVATE_DATA *)Context;\r
+  Status  = EFI_SUCCESS;\r
+  if ((Private->HttpBootCallback != NULL) && (Dhcp6Event != Dhcp6SelectAdvertise)) {\r
+    Received = (BOOLEAN)(Dhcp6Event == Dhcp6RcvdAdvertise || Dhcp6Event == Dhcp6RcvdReply);\r
+    Status   = Private->HttpBootCallback->Callback (\r
+                                            Private->HttpBootCallback,\r
+                                            HttpBootDhcp6,\r
+                                            Received,\r
+                                            Packet->Length,\r
+                                            &Packet->Dhcp6\r
+                                            );\r
+    if (EFI_ERROR (Status)) {\r
+      return EFI_ABORTED;\r
+    }\r
+  }\r
+\r
+  switch (Dhcp6Event) {\r
+    case Dhcp6RcvdAdvertise:\r
+      Status = EFI_NOT_READY;\r
+      if (Packet->Length > HTTP_BOOT_DHCP6_PACKET_MAX_SIZE) {\r
+        //\r
+        // Ignore the incoming packets which exceed the maximum length.\r
+        //\r
+        break;\r
+      }\r
+\r
+      if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {\r
+        //\r
+        // Cache the dhcp offers to OfferBuffer[] for select later, and record\r
+        // the OfferIndex and OfferCount.\r
+        // If error happens, just ignore this packet and continue to wait more offer.\r
+        //\r
+        HttpBootCacheDhcp6Offer (Private, Packet);\r
+      }\r
+\r
+      break;\r
+\r
+    case Dhcp6SelectAdvertise:\r
+      //\r
+      // Select offer by the default policy or by order, and record the SelectIndex\r
+      // and SelectProxyType.\r
+      //\r
+      HttpBootSelectDhcpOffer (Private);\r
+\r
+      if (Private->SelectIndex == 0) {\r
+        Status = EFI_ABORTED;\r
+      } else {\r
+        ASSERT (NewPacket != NULL);\r
+        SelectAd   = &Private->OfferBuffer[Private->SelectIndex - 1].Dhcp6.Packet.Offer;\r
+        *NewPacket = AllocateZeroPool (SelectAd->Size);\r
+        if (*NewPacket == NULL) {\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
+\r
+        CopyMem (*NewPacket, SelectAd, SelectAd->Size);\r
+      }\r
+\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return Status;\r
 }\r
 \r
 /**\r
   Check whether IP driver could route the message which will be sent to ServerIp address.\r
-  \r
+\r
   This function will check the IP6 route table every 1 seconds until specified timeout is expired, if a valid\r
   route is found in IP6 route table, the address will be filed in GatewayAddr and return.\r
 \r
@@ -471,23 +516,23 @@ HttpBootDhcp6CallBack (
 \r
   @retval     EFI_SUCCESS         Found a valid gateway address successfully.\r
   @retval     EFI_TIMEOUT         The operation is time out.\r
-  @retval     Other               Unexpect error happened.\r
-  \r
+  @retval     Other               Unexpected error happened.\r
+\r
 **/\r
 EFI_STATUS\r
 HttpBootCheckRouteTable (\r
-  IN  HTTP_BOOT_PRIVATE_DATA        *Private,\r
-  IN  UINTN                         TimeOutInSecond,\r
-  OUT EFI_IPv6_ADDRESS              *GatewayAddr\r
+  IN  HTTP_BOOT_PRIVATE_DATA  *Private,\r
+  IN  UINTN                   TimeOutInSecond,\r
+  OUT EFI_IPv6_ADDRESS        *GatewayAddr\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  EFI_IP6_PROTOCOL                 *Ip6;\r
-  EFI_IP6_MODE_DATA                Ip6ModeData;\r
-  UINTN                            Index;\r
-  EFI_EVENT                        TimeOutEvt;\r
-  UINTN                            RetryCount;\r
-  BOOLEAN                          GatewayIsFound;\r
+  EFI_STATUS         Status;\r
+  EFI_IP6_PROTOCOL   *Ip6;\r
+  EFI_IP6_MODE_DATA  Ip6ModeData;\r
+  UINTN              Index;\r
+  EFI_EVENT          TimeOutEvt;\r
+  UINTN              RetryCount;\r
+  BOOLEAN            GatewayIsFound;\r
 \r
   ASSERT (GatewayAddr != NULL);\r
   ASSERT (Private != NULL);\r
@@ -504,7 +549,7 @@ HttpBootCheckRouteTable (
     if (EFI_ERROR (Status)) {\r
       goto ON_EXIT;\r
     }\r
-    \r
+\r
     //\r
     // Find out the gateway address which can route the message which send to ServerIp.\r
     //\r
@@ -519,28 +564,33 @@ HttpBootCheckRouteTable (
     if (Ip6ModeData.AddressList != NULL) {\r
       FreePool (Ip6ModeData.AddressList);\r
     }\r
+\r
     if (Ip6ModeData.GroupTable != NULL) {\r
       FreePool (Ip6ModeData.GroupTable);\r
     }\r
+\r
     if (Ip6ModeData.RouteTable != NULL) {\r
       FreePool (Ip6ModeData.RouteTable);\r
     }\r
+\r
     if (Ip6ModeData.NeighborCache != NULL) {\r
       FreePool (Ip6ModeData.NeighborCache);\r
     }\r
+\r
     if (Ip6ModeData.PrefixTable != NULL) {\r
       FreePool (Ip6ModeData.PrefixTable);\r
     }\r
+\r
     if (Ip6ModeData.IcmpTypeList != NULL) {\r
       FreePool (Ip6ModeData.IcmpTypeList);\r
     }\r
-    \r
-    if (GatewayIsFound || RetryCount == TimeOutInSecond) {\r
+\r
+    if (GatewayIsFound || (RetryCount == TimeOutInSecond)) {\r
       break;\r
     }\r
-    \r
+\r
     RetryCount++;\r
-    \r
+\r
     //\r
     // Delay 1 second then recheck it again.\r
     //\r
@@ -561,23 +611,24 @@ HttpBootCheckRouteTable (
     if (EFI_ERROR (Status)) {\r
       goto ON_EXIT;\r
     }\r
+\r
     while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {\r
       Ip6->Poll (Ip6);\r
     }\r
   }\r
-  \r
+\r
 ON_EXIT:\r
   if (TimeOutEvt != NULL) {\r
     gBS->CloseEvent (TimeOutEvt);\r
   }\r
-  \r
+\r
   if (GatewayIsFound) {\r
     Status = EFI_SUCCESS;\r
   } else if (RetryCount == TimeOutInSecond) {\r
     Status = EFI_TIMEOUT;\r
   }\r
 \r
-  return Status; \r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -585,23 +636,23 @@ ON_EXIT:
 \r
   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.\r
 \r
-  @retval     EFI_SUCCESS         Switch the IP policy succesfully.\r
-  @retval     Others              Unexpect error happened.\r
+  @retval     EFI_SUCCESS         Switch the IP policy successfully.\r
+  @retval     Others              Unexpected error happened.\r
 \r
 **/\r
 EFI_STATUS\r
 HttpBootSetIp6Policy (\r
-  IN HTTP_BOOT_PRIVATE_DATA        *Private\r
+  IN HTTP_BOOT_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_IP6_CONFIG_POLICY            Policy;\r
-  EFI_IP6_CONFIG_PROTOCOL          *Ip6Config;\r
-  EFI_STATUS                       Status;\r
-  UINTN                            DataSize;\r
+  EFI_IP6_CONFIG_POLICY    Policy;\r
+  EFI_IP6_CONFIG_PROTOCOL  *Ip6Config;\r
+  EFI_STATUS               Status;\r
+  UINTN                    DataSize;\r
+\r
+  Ip6Config = Private->Ip6Config;\r
+  DataSize  = sizeof (EFI_IP6_CONFIG_POLICY);\r
 \r
-  Ip6Config       = Private->Ip6Config;\r
-  DataSize        = sizeof (EFI_IP6_CONFIG_POLICY);\r
-  \r
   //\r
   // Get and store the current policy of IP6 driver.\r
   //\r
@@ -620,19 +671,20 @@ HttpBootSetIp6Policy (
     Status = Ip6Config->SetData (\r
                           Ip6Config,\r
                           Ip6ConfigDataTypePolicy,\r
-                          sizeof(EFI_IP6_CONFIG_POLICY),\r
+                          sizeof (EFI_IP6_CONFIG_POLICY),\r
                           &Policy\r
                           );\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
   }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
   This function will register the default DNS addresses to the network device.\r
-  \r
+\r
   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.\r
   @param[in]  DataLength          Size of the buffer pointed to by DnsServerData in bytes.\r
   @param[in]  DnsServerData       Point a list of DNS server address in an array\r
@@ -644,17 +696,17 @@ HttpBootSetIp6Policy (
 **/\r
 EFI_STATUS\r
 HttpBootSetIp6Dns (\r
-  IN HTTP_BOOT_PRIVATE_DATA         *Private,\r
-  IN UINTN                          DataLength,\r
-  IN VOID                           *DnsServerData\r
+  IN HTTP_BOOT_PRIVATE_DATA  *Private,\r
+  IN UINTN                   DataLength,\r
+  IN VOID                    *DnsServerData\r
   )\r
 {\r
-  EFI_IP6_CONFIG_PROTOCOL        *Ip6Config;\r
-  \r
+  EFI_IP6_CONFIG_PROTOCOL  *Ip6Config;\r
+\r
   ASSERT (Private->UsingIpv6);\r
 \r
   Ip6Config = Private->Ip6Config;\r
-  \r
+\r
   return Ip6Config->SetData (\r
                       Ip6Config,\r
                       Ip6ConfigDataTypeDnsServer,\r
@@ -665,7 +717,7 @@ HttpBootSetIp6Dns (
 \r
 /**\r
   This function will register the IPv6 gateway address to the network device.\r
-  \r
+\r
   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.\r
 \r
   @retval     EFI_SUCCESS         The new IP configuration has been configured successfully.\r
@@ -674,17 +726,17 @@ HttpBootSetIp6Dns (
 **/\r
 EFI_STATUS\r
 HttpBootSetIp6Gateway (\r
-  IN HTTP_BOOT_PRIVATE_DATA         *Private\r
+  IN HTTP_BOOT_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_IP6_CONFIG_PROTOCOL           *Ip6Config;\r
-  EFI_STATUS                        Status;\r
+  EFI_IP6_CONFIG_PROTOCOL  *Ip6Config;\r
+  EFI_STATUS               Status;\r
 \r
   ASSERT (Private->UsingIpv6);\r
   Ip6Config = Private->Ip6Config;\r
\r
+\r
   //\r
-  // Set the default gateway address. \r
+  // Set the default gateway address.\r
   //\r
   if (!Private->NoGateway && !NetIp6IsUnspecifiedAddr (&Private->GatewayIp.v6)) {\r
     Status = Ip6Config->SetData (\r
@@ -693,7 +745,7 @@ HttpBootSetIp6Gateway (
                           sizeof (EFI_IPv6_ADDRESS),\r
                           &Private->GatewayIp.v6\r
                           );\r
-    if (EFI_ERROR(Status)) {\r
+    if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
   }\r
@@ -703,7 +755,7 @@ HttpBootSetIp6Gateway (
 \r
 /**\r
   This function will register the station IP address.\r
-  \r
+\r
   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.\r
 \r
   @retval     EFI_SUCCESS         The new IP address has been configured successfully.\r
@@ -712,40 +764,40 @@ HttpBootSetIp6Gateway (
 **/\r
 EFI_STATUS\r
 HttpBootSetIp6Address (\r
-  IN HTTP_BOOT_PRIVATE_DATA         *Private\r
-)\r
+  IN HTTP_BOOT_PRIVATE_DATA  *Private\r
+  )\r
 {\r
-  EFI_STATUS                         Status;\r
-  EFI_IP6_PROTOCOL                   *Ip6;\r
-  EFI_IP6_CONFIG_PROTOCOL            *Ip6Cfg;\r
-  EFI_IP6_CONFIG_POLICY              Policy;\r
-  EFI_IP6_CONFIG_MANUAL_ADDRESS      CfgAddr;\r
-  EFI_IPv6_ADDRESS                   *Ip6Addr;\r
-  EFI_IPv6_ADDRESS                   GatewayAddr;\r
-  EFI_IP6_CONFIG_DATA                Ip6CfgData;\r
-  EFI_EVENT                          MappedEvt; \r
-  UINTN                              DataSize;\r
-  BOOLEAN                            IsAddressOk;\r
-  UINTN                              Index;\r
+  EFI_STATUS                     Status;\r
+  EFI_IP6_PROTOCOL               *Ip6;\r
+  EFI_IP6_CONFIG_PROTOCOL        *Ip6Cfg;\r
+  EFI_IP6_CONFIG_POLICY          Policy;\r
+  EFI_IP6_CONFIG_MANUAL_ADDRESS  CfgAddr;\r
+  EFI_IPv6_ADDRESS               *Ip6Addr;\r
+  EFI_IPv6_ADDRESS               GatewayAddr;\r
+  EFI_IP6_CONFIG_DATA            Ip6CfgData;\r
+  EFI_EVENT                      MappedEvt;\r
+  UINTN                          DataSize;\r
+  BOOLEAN                        IsAddressOk;\r
+  UINTN                          Index;\r
 \r
   ASSERT (Private->UsingIpv6);\r
-  \r
+\r
   MappedEvt   = NULL;\r
   IsAddressOk = FALSE;\r
   Ip6Addr     = NULL;\r
   Ip6Cfg      = Private->Ip6Config;\r
   Ip6         = Private->Ip6;\r
-  \r
+\r
   ZeroMem (&CfgAddr, sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));\r
   CopyMem (&CfgAddr, &Private->StationIp.v6, sizeof (EFI_IPv6_ADDRESS));\r
   ZeroMem (&Ip6CfgData, sizeof (EFI_IP6_CONFIG_DATA));\r
-  \r
-  Ip6CfgData.AcceptIcmpErrors    = TRUE;\r
-  Ip6CfgData.DefaultProtocol     = IP6_ICMP;\r
-  Ip6CfgData.HopLimit            = HTTP_BOOT_DEFAULT_HOPLIMIT;\r
-  Ip6CfgData.ReceiveTimeout      = HTTP_BOOT_DEFAULT_LIFETIME;\r
-  Ip6CfgData.TransmitTimeout     = HTTP_BOOT_DEFAULT_LIFETIME;\r
-    \r
+\r
+  Ip6CfgData.AcceptIcmpErrors = TRUE;\r
+  Ip6CfgData.DefaultProtocol  = IP6_ICMP;\r
+  Ip6CfgData.HopLimit         = HTTP_BOOT_DEFAULT_HOPLIMIT;\r
+  Ip6CfgData.ReceiveTimeout   = HTTP_BOOT_DEFAULT_LIFETIME;\r
+  Ip6CfgData.TransmitTimeout  = HTTP_BOOT_DEFAULT_LIFETIME;\r
+\r
   Status = Ip6->Configure (Ip6, &Ip6CfgData);\r
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
@@ -768,13 +820,13 @@ HttpBootSetIp6Address (
   Status = Ip6Cfg->SetData (\r
                      Ip6Cfg,\r
                      Ip6ConfigDataTypePolicy,\r
-                     sizeof(EFI_IP6_CONFIG_POLICY),\r
+                     sizeof (EFI_IP6_CONFIG_POLICY),\r
                      &Policy\r
                      );\r
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
-  \r
+\r
   //\r
   // Create a notify event to set address flag when DAD if IP6 driver succeeded.\r
   //\r
@@ -788,7 +840,7 @@ HttpBootSetIp6Address (
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
-  \r
+\r
   //\r
   // Set static host ip6 address. This is a asynchronous process.\r
   //\r
@@ -797,7 +849,7 @@ HttpBootSetIp6Address (
                      Ip6ConfigDataTypeManualAddress,\r
                      MappedEvt\r
                      );\r
-  if (EFI_ERROR(Status)) {\r
+  if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -806,8 +858,8 @@ HttpBootSetIp6Address (
                      Ip6ConfigDataTypeManualAddress,\r
                      sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS),\r
                      &CfgAddr\r
-                     ); \r
-  if (EFI_ERROR (Status) && Status != EFI_NOT_READY) {\r
+                     );\r
+  if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {\r
     goto ON_EXIT;\r
   } else if (Status == EFI_NOT_READY) {\r
     //\r
@@ -816,47 +868,50 @@ HttpBootSetIp6Address (
     while (!IsAddressOk) {\r
       Ip6->Poll (Ip6);\r
     }\r
+\r
     //\r
     // Check whether the Ip6 Address setting is successed.\r
     //\r
     DataSize = 0;\r
-    Status = Ip6Cfg->GetData (\r
-                       Ip6Cfg,\r
-                       Ip6ConfigDataTypeManualAddress,\r
-                       &DataSize,\r
-                       NULL\r
-                       );\r
-    if (Status != EFI_BUFFER_TOO_SMALL || DataSize == 0) {\r
+    Status   = Ip6Cfg->GetData (\r
+                         Ip6Cfg,\r
+                         Ip6ConfigDataTypeManualAddress,\r
+                         &DataSize,\r
+                         NULL\r
+                         );\r
+    if ((Status != EFI_BUFFER_TOO_SMALL) || (DataSize == 0)) {\r
       Status = EFI_DEVICE_ERROR;\r
       goto ON_EXIT;\r
     }\r
-    \r
+\r
     Ip6Addr = AllocatePool (DataSize);\r
     if (Ip6Addr == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
+\r
     Status = Ip6Cfg->GetData (\r
                        Ip6Cfg,\r
                        Ip6ConfigDataTypeManualAddress,\r
                        &DataSize,\r
-                       (VOID *) Ip6Addr\r
+                       (VOID *)Ip6Addr\r
                        );\r
     if (EFI_ERROR (Status)) {\r
       Status = EFI_DEVICE_ERROR;\r
       goto ON_EXIT;\r
     }\r
 \r
-    for (Index = 0; Index < DataSize / sizeof (EFI_IPv6_ADDRESS); Index ++) {\r
+    for (Index = 0; Index < DataSize / sizeof (EFI_IPv6_ADDRESS); Index++) {\r
       if (CompareMem (Ip6Addr + Index, &CfgAddr, sizeof (EFI_IPv6_ADDRESS)) == 0) {\r
         break;\r
       }\r
     }\r
+\r
     if (Index == DataSize / sizeof (EFI_IPv6_ADDRESS)) {\r
       Status = EFI_ABORTED;\r
       goto ON_EXIT;\r
-    } \r
+    }\r
   }\r
-    \r
+\r
 ON_EXIT:\r
   if (MappedEvt != NULL) {\r
     Ip6Cfg->UnregisterDataNotify (\r
@@ -870,8 +925,8 @@ ON_EXIT:
   if (Ip6Addr != NULL) {\r
     FreePool (Ip6Addr);\r
   }\r
-  \r
-  return Status;    \r
+\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -885,17 +940,17 @@ ON_EXIT:
 **/\r
 EFI_STATUS\r
 HttpBootDhcp6Sarr (\r
-  IN HTTP_BOOT_PRIVATE_DATA         *Private\r
+  IN HTTP_BOOT_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_DHCP6_PROTOCOL               *Dhcp6;\r
-  EFI_DHCP6_CONFIG_DATA            Config;\r
-  EFI_DHCP6_MODE_DATA              Mode;\r
-  EFI_DHCP6_RETRANSMISSION         *Retransmit;\r
-  EFI_DHCP6_PACKET_OPTION          *OptList[HTTP_BOOT_DHCP6_OPTION_MAX_NUM];\r
-  UINT32                           OptCount;\r
-  UINT8                            Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE];\r
-  EFI_STATUS                       Status;\r
+  EFI_DHCP6_PROTOCOL        *Dhcp6;\r
+  EFI_DHCP6_CONFIG_DATA     Config;\r
+  EFI_DHCP6_MODE_DATA       Mode;\r
+  EFI_DHCP6_RETRANSMISSION  *Retransmit;\r
+  EFI_DHCP6_PACKET_OPTION   *OptList[HTTP_BOOT_DHCP6_OPTION_MAX_NUM];\r
+  UINT32                    OptCount;\r
+  UINT8                     Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE];\r
+  EFI_STATUS                Status;\r
 \r
   Dhcp6 = Private->Dhcp6;\r
   ASSERT (Dhcp6 != NULL);\r
@@ -904,16 +959,16 @@ HttpBootDhcp6Sarr (
   // Build options list for the request packet.\r
   //\r
   OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer);\r
-  ASSERT (OptCount >0);\r
-  \r
+  ASSERT (OptCount > 0);\r
+\r
   Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION));\r
   if (Retransmit == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-  \r
+\r
   ZeroMem (&Mode, sizeof (EFI_DHCP6_MODE_DATA));\r
   ZeroMem (&Config, sizeof (EFI_DHCP6_CONFIG_DATA));\r
-  \r
+\r
   Config.OptionCount           = OptCount;\r
   Config.OptionList            = OptList;\r
   Config.Dhcp6Callback         = HttpBootDhcp6CallBack;\r
@@ -928,7 +983,7 @@ HttpBootDhcp6Sarr (
   Retransmit->Mrc              = 4;\r
   Retransmit->Mrt              = 32;\r
   Retransmit->Mrd              = 60;\r
-  \r
+\r
   //\r
   // Configure the DHCPv6 instance for HTTP boot.\r
   //\r
@@ -937,14 +992,15 @@ HttpBootDhcp6Sarr (
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
+\r
   //\r
   // Initialize the record fields for DHCPv6 offer in private data.\r
   //\r
-  Private->OfferNum      = 0;\r
-  Private->SelectIndex   = 0;\r
+  Private->OfferNum    = 0;\r
+  Private->SelectIndex = 0;\r
   ZeroMem (Private->OfferCount, sizeof (Private->OfferCount));\r
   ZeroMem (Private->OfferIndex, sizeof (Private->OfferIndex));\r
-  \r
+\r
   //\r
   // Start DHCPv6 S.A.R.R. process to acquire IPv6 address.\r
   //\r
@@ -952,7 +1008,7 @@ HttpBootDhcp6Sarr (
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
-  \r
+\r
   //\r
   // Get the acquired IPv6 address and store them.\r
   //\r
@@ -960,14 +1016,14 @@ HttpBootDhcp6Sarr (
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
-  \r
+\r
   ASSERT (Mode.Ia->State == Dhcp6Bound);\r
   CopyMem (&Private->StationIp.v6, &Mode.Ia->IaAddress[0].IpAddress, sizeof (EFI_IPv6_ADDRESS));\r
-  \r
+\r
   AsciiPrint ("\n  Station IPv6 address is ");\r
   HttpBootShowIp6Addr (&Private->StationIp.v6);\r
   AsciiPrint ("\n");\r
-  \r
+\r
 ON_EXIT:\r
   if (EFI_ERROR (Status)) {\r
     Dhcp6->Stop (Dhcp6);\r
@@ -978,12 +1034,11 @@ ON_EXIT:
     if (Mode.ClientId != NULL) {\r
       FreePool (Mode.ClientId);\r
     }\r
+\r
     if (Mode.Ia != NULL) {\r
       FreePool (Mode.Ia);\r
     }\r
   }\r
 \r
-  return Status; \r
-    \r
+  return Status;\r
 }\r
-\r