]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
CryptoPkg: Update CryptLib inf as the file name changed.
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcDriver.c
index 8dd787be1a00aed74701804713b3d7a6ff77ed75..d84aca7e85abe581b220a2b8f0fee1322b33ace1 100644 (file)
@@ -1,23 +1,16 @@
 /** @file\r
-  Driver Binding functions implementationfor for UefiPxeBc Driver.\r
+  Driver Binding functions implementation for UefiPxeBc Driver.\r
 \r
   (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
-  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<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
-EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp4DriverBinding = {\r
+EFI_DRIVER_BINDING_PROTOCOL  gPxeBcIp4DriverBinding = {\r
   PxeBcIp4DriverBindingSupported,\r
   PxeBcIp4DriverBindingStart,\r
   PxeBcIp4DriverBindingStop,\r
@@ -26,7 +19,7 @@ EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp4DriverBinding = {
   NULL\r
 };\r
 \r
-EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp6DriverBinding = {\r
+EFI_DRIVER_BINDING_PROTOCOL  gPxeBcIp6DriverBinding = {\r
   PxeBcIp6DriverBindingSupported,\r
   PxeBcIp6DriverBindingStart,\r
   PxeBcIp6DriverBindingStop,\r
@@ -45,10 +38,10 @@ EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp6DriverBinding = {
 **/\r
 EFI_HANDLE\r
 PxeBcGetNicByIp4Children (\r
-  IN EFI_HANDLE                 ControllerHandle\r
+  IN EFI_HANDLE  ControllerHandle\r
   )\r
 {\r
-  EFI_HANDLE                    NicHandle;\r
+  EFI_HANDLE  NicHandle;\r
 \r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
   if (NicHandle == NULL) {\r
@@ -70,7 +63,6 @@ PxeBcGetNicByIp4Children (
   return NicHandle;\r
 }\r
 \r
-\r
 /**\r
   Get the Nic handle using any child handle in the IPv6 stack.\r
 \r
@@ -81,10 +73,10 @@ PxeBcGetNicByIp4Children (
 **/\r
 EFI_HANDLE\r
 PxeBcGetNicByIp6Children (\r
-  IN EFI_HANDLE                  ControllerHandle\r
+  IN EFI_HANDLE  ControllerHandle\r
   )\r
 {\r
-  EFI_HANDLE                     NicHandle;\r
+  EFI_HANDLE  NicHandle;\r
 \r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp6ProtocolGuid);\r
   if (NicHandle == NULL) {\r
@@ -103,7 +95,6 @@ PxeBcGetNicByIp6Children (
   return NicHandle;\r
 }\r
 \r
-\r
 /**\r
   Destroy the opened instances based on IPv4.\r
 \r
@@ -117,7 +108,7 @@ PxeBcDestroyIp4Children (
   IN PXEBC_PRIVATE_DATA           *Private\r
   )\r
 {\r
-  ASSERT(Private != NULL);\r
+  ASSERT (Private != NULL);\r
 \r
   if (Private->ArpChild != NULL) {\r
     //\r
@@ -181,11 +172,11 @@ PxeBcDestroyIp4Children (
     // Close Udp4 for PxeBc->UdpRead and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Udp4ReadChild,\r
-          &gEfiUdp4ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Udp4ReadChild,\r
+           &gEfiUdp4ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
 \r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
@@ -200,11 +191,11 @@ PxeBcDestroyIp4Children (
     // Close Mtftp4 for PxeBc->Mtftp4 and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Mtftp4Child,\r
-          &gEfiMtftp4ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Mtftp4Child,\r
+           &gEfiMtftp4ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
 \r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
@@ -219,11 +210,11 @@ PxeBcDestroyIp4Children (
     // Close Dhcp4 for PxeBc->Dhcp4 and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Dhcp4Child,\r
-          &gEfiDhcp4ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Dhcp4Child,\r
+           &gEfiDhcp4ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
 \r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
@@ -256,7 +247,7 @@ PxeBcDestroyIp4Children (
            );\r
     FreePool (Private->Ip4Nic->DevicePath);\r
 \r
-    if (Private->Snp != NULL) { \r
+    if (Private->Snp != NULL) {\r
       //\r
       // Close SNP from the child virtual handle\r
       //\r
@@ -266,26 +257,26 @@ PxeBcDestroyIp4Children (
              This->DriverBindingHandle,\r
              Private->Ip4Nic->Controller\r
              );\r
-             \r
+\r
       gBS->UninstallProtocolInterface (\r
              Private->Ip4Nic->Controller,\r
              &gEfiSimpleNetworkProtocolGuid,\r
              Private->Snp\r
              );\r
     }\r
+\r
     FreePool (Private->Ip4Nic);\r
   }\r
 \r
-  Private->ArpChild         = NULL;\r
-  Private->Ip4Child         = NULL;\r
-  Private->Udp4WriteChild   = NULL;\r
-  Private->Udp4ReadChild    = NULL;\r
-  Private->Mtftp4Child      = NULL;\r
-  Private->Dhcp4Child       = NULL;\r
-  Private->Ip4Nic           = NULL;\r
+  Private->ArpChild       = NULL;\r
+  Private->Ip4Child       = NULL;\r
+  Private->Udp4WriteChild = NULL;\r
+  Private->Udp4ReadChild  = NULL;\r
+  Private->Mtftp4Child    = NULL;\r
+  Private->Dhcp4Child     = NULL;\r
+  Private->Ip4Nic         = NULL;\r
 }\r
 \r
-\r
 /**\r
   Destroy the opened instances based on IPv6.\r
 \r
@@ -299,18 +290,18 @@ PxeBcDestroyIp6Children (
   IN PXEBC_PRIVATE_DATA           *Private\r
   )\r
 {\r
-  ASSERT(Private != NULL);\r
+  ASSERT (Private != NULL);\r
 \r
   if (Private->Ip6Child != NULL) {\r
     //\r
     // Close Ip6 for Ip6->Ip6Config and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Ip6Child,\r
-          &gEfiIp6ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Ip6Child,\r
+           &gEfiIp6ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
 \r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
@@ -343,11 +334,11 @@ PxeBcDestroyIp6Children (
     // Close Udp6 for PxeBc->UdpRead and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Udp6ReadChild,\r
-          &gEfiUdp6ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Udp6ReadChild,\r
+           &gEfiUdp6ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
       This->DriverBindingHandle,\r
@@ -361,11 +352,11 @@ PxeBcDestroyIp6Children (
     // Close Mtftp6 for PxeBc->Mtftp and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Mtftp6Child,\r
-          &gEfiMtftp6ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Mtftp6Child,\r
+           &gEfiMtftp6ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
 \r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
@@ -380,11 +371,11 @@ PxeBcDestroyIp6Children (
     // Close Dhcp6 for PxeBc->Dhcp and destroy the instance.\r
     //\r
     gBS->CloseProtocol (\r
-          Private->Dhcp6Child,\r
-          &gEfiDhcp6ProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Private->Controller\r
-          );\r
+           Private->Dhcp6Child,\r
+           &gEfiDhcp6ProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Private->Controller\r
+           );\r
 \r
     NetLibDestroyServiceChild (\r
       Private->Controller,\r
@@ -416,7 +407,7 @@ PxeBcDestroyIp6Children (
            NULL\r
            );\r
     FreePool (Private->Ip6Nic->DevicePath);\r
-    \r
+\r
     if (Private->Snp != NULL) {\r
       //\r
       // Close SNP from the child virtual handle\r
@@ -433,6 +424,7 @@ PxeBcDestroyIp6Children (
              Private->Snp\r
              );\r
     }\r
+\r
     FreePool (Private->Ip6Nic);\r
   }\r
 \r
@@ -458,20 +450,20 @@ PxeBcDestroyIp6Children (
 **/\r
 EFI_STATUS\r
 PxeBcCheckIpv6Support (\r
-  IN  EFI_HANDLE                   ControllerHandle,\r
-  IN  PXEBC_PRIVATE_DATA           *Private,\r
-  OUT BOOLEAN                      *Ipv6Support\r
+  IN  EFI_HANDLE          ControllerHandle,\r
+  IN  PXEBC_PRIVATE_DATA  *Private,\r
+  OUT BOOLEAN             *Ipv6Support\r
   )\r
 {\r
-  EFI_HANDLE                       Handle;\r
-  EFI_ADAPTER_INFORMATION_PROTOCOL *Aip;\r
-  EFI_STATUS                       Status;\r
-  EFI_GUID                         *InfoTypesBuffer;\r
-  UINTN                            InfoTypeBufferCount;\r
-  UINTN                            TypeIndex;\r
-  BOOLEAN                          Supported;\r
-  VOID                             *InfoBlock;\r
-  UINTN                            InfoBlockSize;\r
+  EFI_HANDLE                        Handle;\r
+  EFI_ADAPTER_INFORMATION_PROTOCOL  *Aip;\r
+  EFI_STATUS                        Status;\r
+  EFI_GUID                          *InfoTypesBuffer;\r
+  UINTN                             InfoTypeBufferCount;\r
+  UINTN                             TypeIndex;\r
+  BOOLEAN                           Supported;\r
+  VOID                              *InfoBlock;\r
+  UINTN                             InfoBlockSize;\r
 \r
   ASSERT (Private != NULL && Ipv6Support != NULL);\r
 \r
@@ -489,7 +481,7 @@ PxeBcCheckIpv6Support (
 \r
   //\r
   // Get the NIC handle by SNP protocol.\r
-  //  \r
+  //\r
   Handle = NetLibGetSnpHandle (ControllerHandle, NULL);\r
   if (Handle == NULL) {\r
     return EFI_NOT_FOUND;\r
@@ -499,16 +491,16 @@ PxeBcCheckIpv6Support (
   Status = gBS->HandleProtocol (\r
                   Handle,\r
                   &gEfiAdapterInformationProtocolGuid,\r
-                  (VOID *) &Aip\r
+                  (VOID *)&Aip\r
                   );\r
-  if (EFI_ERROR (Status) || Aip == NULL) {\r
+  if (EFI_ERROR (Status) || (Aip == NULL)) {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
   InfoTypesBuffer     = NULL;\r
   InfoTypeBufferCount = 0;\r
-  Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);\r
-  if (EFI_ERROR (Status) || InfoTypesBuffer == NULL) {\r
+  Status              = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);\r
+  if (EFI_ERROR (Status) || (InfoTypesBuffer == NULL)) {\r
     FreePool (InfoTypesBuffer);\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -531,16 +523,15 @@ PxeBcCheckIpv6Support (
   //\r
   InfoBlock     = NULL;\r
   InfoBlockSize = 0;\r
-  Status = Aip->GetInformation (Aip, &gEfiAdapterInfoUndiIpv6SupportGuid, &InfoBlock, &InfoBlockSize);\r
-  if (EFI_ERROR (Status) || InfoBlock == NULL) {\r
+  Status        = Aip->GetInformation (Aip, &gEfiAdapterInfoUndiIpv6SupportGuid, &InfoBlock, &InfoBlockSize);\r
+  if (EFI_ERROR (Status) || (InfoBlock == NULL)) {\r
     FreePool (InfoBlock);\r
     return EFI_NOT_FOUND;\r
-  }  \r
+  }\r
 \r
-  *Ipv6Support = ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *) InfoBlock)->Ipv6Support;\r
+  *Ipv6Support = ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InfoBlock)->Ipv6Support;\r
   FreePool (InfoBlock);\r
   return EFI_SUCCESS;\r
-\r
 }\r
 \r
 /**\r
@@ -561,14 +552,14 @@ PxeBcCreateIp4Children (
   IN PXEBC_PRIVATE_DATA           *Private\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  IPv4_DEVICE_PATH                Ip4Node;\r
-  EFI_PXE_BASE_CODE_MODE          *Mode;\r
-  EFI_UDP4_CONFIG_DATA            *Udp4CfgData;\r
-  EFI_IP4_CONFIG_DATA             *Ip4CfgData;\r
-  EFI_IP4_MODE_DATA               Ip4ModeData;\r
-  PXEBC_PRIVATE_PROTOCOL          *Id;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL     *Snp;\r
+  EFI_STATUS                   Status;\r
+  IPv4_DEVICE_PATH             Ip4Node;\r
+  EFI_PXE_BASE_CODE_MODE       *Mode;\r
+  EFI_UDP4_CONFIG_DATA         *Udp4CfgData;\r
+  EFI_IP4_CONFIG_DATA          *Ip4CfgData;\r
+  EFI_IP4_MODE_DATA            Ip4ModeData;\r
+  PXEBC_PRIVATE_PROTOCOL       *Id;\r
+  EFI_SIMPLE_NETWORK_PROTOCOL  *Snp;\r
 \r
   if (Private->Ip4Nic != NULL) {\r
     //\r
@@ -593,7 +584,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   Private->Dhcp4Child,\r
                   &gEfiDhcp4ProtocolGuid,\r
-                  (VOID **) &Private->Dhcp4,\r
+                  (VOID **)&Private->Dhcp4,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -618,7 +609,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   Private->Mtftp4Child,\r
                   &gEfiMtftp4ProtocolGuid,\r
-                  (VOID **) &Private->Mtftp4,\r
+                  (VOID **)&Private->Mtftp4,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -643,7 +634,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   Private->Udp4ReadChild,\r
                   &gEfiUdp4ProtocolGuid,\r
-                  (VOID **) &Private->Udp4Read,\r
+                  (VOID **)&Private->Udp4Read,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -668,7 +659,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   Private->Udp4WriteChild,\r
                   &gEfiUdp4ProtocolGuid,\r
-                  (VOID **) &Private->Udp4Write,\r
+                  (VOID **)&Private->Udp4Write,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -693,7 +684,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   Private->ArpChild,\r
                   &gEfiArpProtocolGuid,\r
-                  (VOID **) &Private->Arp,\r
+                  (VOID **)&Private->Arp,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -718,7 +709,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   Private->Ip4Child,\r
                   &gEfiIp4ProtocolGuid,\r
-                  (VOID **) &Private->Ip4,\r
+                  (VOID **)&Private->Ip4,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -745,13 +736,13 @@ PxeBcCreateIp4Children (
   Private->Ip4Nic->Private   = Private;\r
   Private->Ip4Nic->Signature = PXEBC_VIRTUAL_NIC_SIGNATURE;\r
 \r
-   //\r
+  //\r
   // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.\r
   //\r
   Status = gBS->HandleProtocol (\r
                   ControllerHandle,\r
                   &gEfiIp4Config2ProtocolGuid,\r
-                  (VOID **) &Private->Ip4Config2\r
+                  (VOID **)&Private->Ip4Config2\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto ON_ERROR;\r
@@ -814,16 +805,16 @@ PxeBcCreateIp4Children (
     }\r
 \r
     //\r
-    // Open SNP on the child handle BY_DRIVER. It will prevent any additionally \r
+    // Open SNP on the child handle BY_DRIVER|EXCLUSIVE. It will prevent any additionally\r
     // layering to perform the experiment.\r
     //\r
     Status = gBS->OpenProtocol (\r
                     Private->Ip4Nic->Controller,\r
                     &gEfiSimpleNetworkProtocolGuid,\r
-                    (VOID **) &Snp,\r
+                    (VOID **)&Snp,\r
                     This->DriverBindingHandle,\r
                     Private->Ip4Nic->Controller,\r
-                    EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                    EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE\r
                     );\r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
@@ -837,7 +828,7 @@ PxeBcCreateIp4Children (
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
                   &gEfiCallerIdGuid,\r
-                  (VOID **) &Id,\r
+                  (VOID **)&Id,\r
                   This->DriverBindingHandle,\r
                   Private->Ip4Nic->Controller,\r
                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
@@ -849,9 +840,9 @@ PxeBcCreateIp4Children (
   //\r
   // Set default configure data for Udp4Read and Ip4 instance.\r
   //\r
-  Mode                            = Private->PxeBc.Mode;\r
-  Udp4CfgData                     = &Private->Udp4CfgData;\r
-  Ip4CfgData                      = &Private->Ip4CfgData;\r
+  Mode        = Private->PxeBc.Mode;\r
+  Udp4CfgData = &Private->Udp4CfgData;\r
+  Ip4CfgData  = &Private->Ip4CfgData;\r
 \r
   Udp4CfgData->AcceptBroadcast    = FALSE;\r
   Udp4CfgData->AcceptAnyPort      = TRUE;\r
@@ -861,12 +852,12 @@ PxeBcCreateIp4Children (
   Udp4CfgData->ReceiveTimeout     = PXEBC_DEFAULT_LIFETIME;\r
   Udp4CfgData->TransmitTimeout    = PXEBC_DEFAULT_LIFETIME;\r
 \r
-  Ip4CfgData->AcceptIcmpErrors    = TRUE;\r
-  Ip4CfgData->DefaultProtocol     = EFI_IP_PROTO_ICMP;\r
-  Ip4CfgData->TypeOfService       = Mode->ToS;\r
-  Ip4CfgData->TimeToLive          = Mode->TTL;\r
-  Ip4CfgData->ReceiveTimeout      = PXEBC_DEFAULT_LIFETIME;\r
-  Ip4CfgData->TransmitTimeout     = PXEBC_DEFAULT_LIFETIME;\r
+  Ip4CfgData->AcceptIcmpErrors = TRUE;\r
+  Ip4CfgData->DefaultProtocol  = EFI_IP_PROTO_ICMP;\r
+  Ip4CfgData->TypeOfService    = Mode->ToS;\r
+  Ip4CfgData->TimeToLive       = Mode->TTL;\r
+  Ip4CfgData->ReceiveTimeout   = PXEBC_DEFAULT_LIFETIME;\r
+  Ip4CfgData->TransmitTimeout  = PXEBC_DEFAULT_LIFETIME;\r
 \r
   return EFI_SUCCESS;\r
 \r
@@ -875,7 +866,6 @@ ON_ERROR:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Create the opened instances based on IPv6.\r
 \r
@@ -894,14 +884,14 @@ PxeBcCreateIp6Children (
   IN PXEBC_PRIVATE_DATA           *Private\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  IPv6_DEVICE_PATH                Ip6Node;\r
-  EFI_UDP6_CONFIG_DATA            *Udp6CfgData;\r
-  EFI_IP6_CONFIG_DATA             *Ip6CfgData;\r
-  EFI_IP6_MODE_DATA               Ip6ModeData;\r
-  PXEBC_PRIVATE_PROTOCOL          *Id;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL     *Snp;\r
-  UINTN                           Index;\r
+  EFI_STATUS                   Status;\r
+  IPv6_DEVICE_PATH             Ip6Node;\r
+  EFI_UDP6_CONFIG_DATA         *Udp6CfgData;\r
+  EFI_IP6_CONFIG_DATA          *Ip6CfgData;\r
+  EFI_IP6_MODE_DATA            Ip6ModeData;\r
+  PXEBC_PRIVATE_PROTOCOL       *Id;\r
+  EFI_SIMPLE_NETWORK_PROTOCOL  *Snp;\r
+  UINTN                        Index;\r
 \r
   if (Private->Ip6Nic != NULL) {\r
     //\r
@@ -935,7 +925,7 @@ PxeBcCreateIp6Children (
   Status = gBS->OpenProtocol (\r
                   Private->Dhcp6Child,\r
                   &gEfiDhcp6ProtocolGuid,\r
-                  (VOID **) &Private->Dhcp6,\r
+                  (VOID **)&Private->Dhcp6,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -951,7 +941,7 @@ PxeBcCreateIp6Children (
   if (Private->Snp != NULL) {\r
     for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) {\r
       Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31));\r
-    }  \r
+    }\r
   }\r
 \r
   //\r
@@ -970,7 +960,7 @@ PxeBcCreateIp6Children (
   Status = gBS->OpenProtocol (\r
                   Private->Mtftp6Child,\r
                   &gEfiMtftp6ProtocolGuid,\r
-                  (VOID **) &Private->Mtftp6,\r
+                  (VOID **)&Private->Mtftp6,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -995,7 +985,7 @@ PxeBcCreateIp6Children (
   Status = gBS->OpenProtocol (\r
                   Private->Udp6ReadChild,\r
                   &gEfiUdp6ProtocolGuid,\r
-                  (VOID **) &Private->Udp6Read,\r
+                  (VOID **)&Private->Udp6Read,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -1020,7 +1010,7 @@ PxeBcCreateIp6Children (
   Status = gBS->OpenProtocol (\r
                   Private->Udp6WriteChild,\r
                   &gEfiUdp6ProtocolGuid,\r
-                  (VOID **) &Private->Udp6Write,\r
+                  (VOID **)&Private->Udp6Write,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -1045,7 +1035,7 @@ PxeBcCreateIp6Children (
   Status = gBS->OpenProtocol (\r
                   Private->Ip6Child,\r
                   &gEfiIp6ProtocolGuid,\r
-                  (VOID **) &Private->Ip6,\r
+                  (VOID **)&Private->Ip6,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -1094,7 +1084,7 @@ PxeBcCreateIp6Children (
   Status = gBS->HandleProtocol (\r
                   ControllerHandle,\r
                   &gEfiIp6ConfigProtocolGuid,\r
-                  (VOID **) &Private->Ip6Cfg\r
+                  (VOID **)&Private->Ip6Cfg\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto ON_ERROR;\r
@@ -1104,9 +1094,9 @@ PxeBcCreateIp6Children (
   // Create a device path node for Ipv6 virtual nic, and append it.\r
   //\r
   ZeroMem (&Ip6Node, sizeof (IPv6_DEVICE_PATH));\r
-  Ip6Node.Header.Type     = MESSAGING_DEVICE_PATH;\r
-  Ip6Node.Header.SubType  = MSG_IPv6_DP;\r
-  Ip6Node.PrefixLength    = IP6_PREFIX_LENGTH;\r
+  Ip6Node.Header.Type    = MESSAGING_DEVICE_PATH;\r
+  Ip6Node.Header.SubType = MSG_IPv6_DP;\r
+  Ip6Node.PrefixLength   = IP6_PREFIX_LENGTH;\r
 \r
   SetDevicePathNodeLength (&Ip6Node.Header, sizeof (Ip6Node));\r
 \r
@@ -1140,7 +1130,7 @@ PxeBcCreateIp6Children (
   if (EFI_ERROR (Status)) {\r
     goto ON_ERROR;\r
   }\r
-  \r
+\r
   if (Private->Snp != NULL) {\r
     //\r
     // Install SNP protocol on purpose is for some OS loader backward\r
@@ -1157,16 +1147,16 @@ PxeBcCreateIp6Children (
     }\r
 \r
     //\r
-    // Open SNP on the child handle BY_DRIVER. It will prevent any additionally \r
+    // Open SNP on the child handle BY_DRIVER|EXCLUSIVE. It will prevent any additionally\r
     // layering to perform the experiment.\r
     //\r
     Status = gBS->OpenProtocol (\r
                     Private->Ip6Nic->Controller,\r
                     &gEfiSimpleNetworkProtocolGuid,\r
-                    (VOID **) &Snp,\r
+                    (VOID **)&Snp,\r
                     This->DriverBindingHandle,\r
                     Private->Ip6Nic->Controller,\r
-                    EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                    EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE\r
                     );\r
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
@@ -1180,7 +1170,7 @@ PxeBcCreateIp6Children (
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
                   &gEfiCallerIdGuid,\r
-                  (VOID **) &Id,\r
+                  (VOID **)&Id,\r
                   This->DriverBindingHandle,\r
                   Private->Ip6Nic->Controller,\r
                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
@@ -1190,7 +1180,7 @@ PxeBcCreateIp6Children (
   }\r
 \r
   //\r
-  // Set IPv6 avaiable flag and set default configure data for\r
+  // Set IPv6 available flag and set default configure data for\r
   // Udp6Read and Ip6 instance.\r
   //\r
   Status = PxeBcCheckIpv6Support (ControllerHandle, Private, &Private->Mode.Ipv6Available);\r
@@ -1198,15 +1188,15 @@ PxeBcCreateIp6Children (
     //\r
     // Fail to get the data whether UNDI supports IPv6. Set default value.\r
     //\r
-    Private->Mode.Ipv6Available   = TRUE;\r
+    Private->Mode.Ipv6Available = TRUE;\r
   }\r
 \r
   if (!Private->Mode.Ipv6Available) {\r
     goto ON_ERROR;\r
   }\r
 \r
-  Udp6CfgData                     = &Private->Udp6CfgData;\r
-  Ip6CfgData                      = &Private->Ip6CfgData;\r
+  Udp6CfgData = &Private->Udp6CfgData;\r
+  Ip6CfgData  = &Private->Ip6CfgData;\r
 \r
   Udp6CfgData->AcceptAnyPort      = TRUE;\r
   Udp6CfgData->AllowDuplicatePort = TRUE;\r
@@ -1214,11 +1204,11 @@ PxeBcCreateIp6Children (
   Udp6CfgData->ReceiveTimeout     = PXEBC_DEFAULT_LIFETIME;\r
   Udp6CfgData->TransmitTimeout    = PXEBC_DEFAULT_LIFETIME;\r
 \r
-  Ip6CfgData->AcceptIcmpErrors    = TRUE;\r
-  Ip6CfgData->DefaultProtocol     = IP6_ICMP;\r
-  Ip6CfgData->HopLimit            = PXEBC_DEFAULT_HOPLIMIT;\r
-  Ip6CfgData->ReceiveTimeout      = PXEBC_DEFAULT_LIFETIME;\r
-  Ip6CfgData->TransmitTimeout     = PXEBC_DEFAULT_LIFETIME;\r
+  Ip6CfgData->AcceptIcmpErrors = TRUE;\r
+  Ip6CfgData->DefaultProtocol  = IP6_ICMP;\r
+  Ip6CfgData->HopLimit         = PXEBC_DEFAULT_HOPLIMIT;\r
+  Ip6CfgData->ReceiveTimeout   = PXEBC_DEFAULT_LIFETIME;\r
+  Ip6CfgData->TransmitTimeout  = PXEBC_DEFAULT_LIFETIME;\r
 \r
   return EFI_SUCCESS;\r
 \r
@@ -1227,7 +1217,6 @@ ON_ERROR:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   The entry point for UefiPxeBc driver that installs the driver\r
   binding and component name protocol on its image.\r
@@ -1242,12 +1231,16 @@ ON_ERROR:
 EFI_STATUS\r
 EFIAPI\r
 PxeBcDriverEntryPoint (\r
-  IN EFI_HANDLE             ImageHandle,\r
-  IN EFI_SYSTEM_TABLE       *SystemTable\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
   EFI_STATUS  Status;\r
 \r
+  if ((PcdGet8 (PcdIPv4PXESupport) == PXE_DISABLED) && (PcdGet8 (PcdIPv6PXESupport) == PXE_DISABLED)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
@@ -1269,16 +1262,11 @@ PxeBcDriverEntryPoint (
              &gPxeBcComponentName2\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    gBS->UninstallMultipleProtocolInterfaces (\r
-           ImageHandle,\r
-           &gEfiDriverBindingProtocolGuid,\r
-           &gPxeBcIp4DriverBinding,\r
-           &gEfiComponentName2ProtocolGuid,\r
-           &gPxeBcComponentName2,\r
-           &gEfiComponentNameProtocolGuid,\r
-           &gPxeBcComponentName,\r
-           NULL\r
-           );\r
+    EfiLibUninstallDriverBindingComponentName2 (\r
+      &gPxeBcIp4DriverBinding,\r
+      &gPxeBcComponentName,\r
+      &gPxeBcComponentName2\r
+      );\r
   }\r
 \r
   return Status;\r
@@ -1293,7 +1281,7 @@ PxeBcDriverEntryPoint (
   @param[in]  RemainingDevicePath Optional parameter used to pick a specific child\r
                                   device to be started.\r
   @param[in]  IpVersion           IP_VERSION_4 or IP_VERSION_6.\r
-  \r
+\r
   @retval EFI_SUCCESS         This driver supports this device.\r
   @retval EFI_UNSUPPORTED     This driver does not support this device.\r
 \r
@@ -1307,14 +1295,22 @@ PxeBcSupported (
   IN UINT8                        IpVersion\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  EFI_GUID                        *DhcpServiceBindingGuid;\r
-  EFI_GUID                        *MtftpServiceBindingGuid;\r
-  \r
+  EFI_STATUS  Status;\r
+  EFI_GUID    *DhcpServiceBindingGuid;\r
+  EFI_GUID    *MtftpServiceBindingGuid;\r
+\r
   if (IpVersion == IP_VERSION_4) {\r
+    if (PcdGet8 (PcdIPv4PXESupport) == PXE_DISABLED) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
     DhcpServiceBindingGuid  = &gEfiDhcp4ServiceBindingProtocolGuid;\r
     MtftpServiceBindingGuid = &gEfiMtftp4ServiceBindingProtocolGuid;\r
   } else {\r
+    if (PcdGet8 (PcdIPv6PXESupport) == PXE_DISABLED) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
     DhcpServiceBindingGuid  = &gEfiDhcp6ServiceBindingProtocolGuid;\r
     MtftpServiceBindingGuid = &gEfiMtftp6ServiceBindingProtocolGuid;\r
   }\r
@@ -1323,22 +1319,22 @@ PxeBcSupported (
   // Try to open the Mtftp and Dhcp protocol to test whether IP stack is ready.\r
   //\r
   Status = gBS->OpenProtocol (\r
-                     ControllerHandle,\r
-                     DhcpServiceBindingGuid,\r
-                     NULL,\r
-                     This->DriverBindingHandle,\r
-                     ControllerHandle,\r
-                     EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
-                     );\r
+                  ControllerHandle,\r
+                  DhcpServiceBindingGuid,\r
+                  NULL,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
+                  );\r
   if (!EFI_ERROR (Status)) {\r
     Status = gBS->OpenProtocol (\r
-                       ControllerHandle,\r
-                       MtftpServiceBindingGuid,\r
-                       NULL,\r
-                       This->DriverBindingHandle,\r
-                       ControllerHandle,\r
-                       EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
-                       );\r
+                    ControllerHandle,\r
+                    MtftpServiceBindingGuid,\r
+                    NULL,\r
+                    This->DriverBindingHandle,\r
+                    ControllerHandle,\r
+                    EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
+                    );\r
   }\r
 \r
   //\r
@@ -1376,20 +1372,20 @@ PxeBcStart (
   IN UINT8                        IpVersion\r
   )\r
 {\r
-  PXEBC_PRIVATE_DATA              *Private;\r
-  EFI_STATUS                      Status;\r
-  PXEBC_PRIVATE_PROTOCOL          *Id;\r
-  BOOLEAN                         FirstStart;\r
+  PXEBC_PRIVATE_DATA      *Private;\r
+  EFI_STATUS              Status;\r
+  PXEBC_PRIVATE_PROTOCOL  *Id;\r
+  BOOLEAN                 FirstStart;\r
 \r
   FirstStart = FALSE;\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiCallerIdGuid,\r
-                  (VOID **) &Id,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
+  Status     = gBS->OpenProtocol (\r
+                      ControllerHandle,\r
+                      &gEfiCallerIdGuid,\r
+                      (VOID **)&Id,\r
+                      This->DriverBindingHandle,\r
+                      ControllerHandle,\r
+                      EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                      );\r
   if (!EFI_ERROR (Status)) {\r
     //\r
     // Skip the initialization if the driver has been started already.\r
@@ -1426,7 +1422,7 @@ PxeBcStart (
     Status = gBS->OpenProtocol (\r
                     ControllerHandle,\r
                     &gEfiDevicePathProtocolGuid,\r
-                    (VOID **) &Private->DevicePath,\r
+                    (VOID **)&Private->DevicePath,\r
                     This->DriverBindingHandle,\r
                     ControllerHandle,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -1442,7 +1438,7 @@ PxeBcStart (
     Status = gBS->OpenProtocol (\r
                     ControllerHandle,\r
                     &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
-                    (VOID **) &Private->Nii,\r
+                    (VOID **)&Private->Nii,\r
                     This->DriverBindingHandle,\r
                     ControllerHandle,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -1453,7 +1449,7 @@ PxeBcStart (
 \r
     //\r
     // Install PxeBaseCodePrivate protocol onto the real NIC handler.\r
-    // PxeBaseCodePrivate protocol is only used to keep the relationship between \r
+    // PxeBaseCodePrivate protocol is only used to keep the relationship between\r
     // NIC handle and virtual child handles.\r
     // gEfiCallerIdGuid will be used as its protocol guid.\r
     //\r
@@ -1470,7 +1466,7 @@ PxeBcStart (
     //\r
     // Try to locate SNP protocol.\r
     //\r
-    NetLibGetSnpHandle(ControllerHandle, &Private->Snp);    \r
+    NetLibGetSnpHandle (ControllerHandle, &Private->Snp);\r
   }\r
 \r
   if (IpVersion == IP_VERSION_4) {\r
@@ -1484,6 +1480,7 @@ PxeBcStart (
     //\r
     Status = PxeBcCreateIp6Children (This, ControllerHandle, Private);\r
   }\r
+\r
   if (EFI_ERROR (Status)) {\r
     //\r
     // Failed to start PXE driver if IPv4 and IPv6 stack are both not available.\r
@@ -1509,14 +1506,13 @@ ON_ERROR:
     PxeBcDestroyIp6Children (This, Private);\r
   }\r
 \r
-  if (FirstStart && Private != NULL) {\r
+  if (FirstStart && (Private != NULL)) {\r
     FreePool (Private);\r
   }\r
 \r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Stop this driver on ControllerHandle. This is the worker function for\r
   PxeBcIp4(6)DriverBindingStop.\r
@@ -1543,12 +1539,12 @@ PxeBcStop (
   IN UINT8                        IpVersion\r
   )\r
 {\r
-  PXEBC_PRIVATE_DATA              *Private;\r
-  PXEBC_VIRTUAL_NIC               *VirtualNic;\r
-  EFI_LOAD_FILE_PROTOCOL          *LoadFile;\r
-  EFI_STATUS                      Status;\r
-  EFI_HANDLE                      NicHandle;\r
-  PXEBC_PRIVATE_PROTOCOL          *Id;\r
+  PXEBC_PRIVATE_DATA      *Private;\r
+  PXEBC_VIRTUAL_NIC       *VirtualNic;\r
+  EFI_LOAD_FILE_PROTOCOL  *LoadFile;\r
+  EFI_STATUS              Status;\r
+  EFI_HANDLE              NicHandle;\r
+  PXEBC_PRIVATE_PROTOCOL  *Id;\r
 \r
   Private    = NULL;\r
   NicHandle  = NULL;\r
@@ -1559,7 +1555,7 @@ PxeBcStop (
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
                   &gEfiLoadFileProtocolGuid,\r
-                  (VOID **) &LoadFile,\r
+                  (VOID **)&LoadFile,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -1573,6 +1569,7 @@ PxeBcStop (
     } else {\r
       NicHandle = PxeBcGetNicByIp6Children (ControllerHandle);\r
     }\r
+\r
     if (NicHandle == NULL) {\r
       return EFI_SUCCESS;\r
     }\r
@@ -1583,7 +1580,7 @@ PxeBcStop (
     Status = gBS->OpenProtocol (\r
                     NicHandle,\r
                     &gEfiCallerIdGuid,\r
-                    (VOID **) &Id,\r
+                    (VOID **)&Id,\r
                     This->DriverBindingHandle,\r
                     ControllerHandle,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -1591,8 +1588,8 @@ PxeBcStop (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
-    Private = PXEBC_PRIVATE_DATA_FROM_ID (Id);\r
 \r
+    Private = PXEBC_PRIVATE_DATA_FROM_ID (Id);\r
   } else {\r
     //\r
     // It's a virtual handle with LoadFileProtocol.\r
@@ -1600,7 +1597,7 @@ PxeBcStop (
     Status = gBS->OpenProtocol (\r
                     ControllerHandle,\r
                     &gEfiLoadFileProtocolGuid,\r
-                    (VOID **) &LoadFile,\r
+                    (VOID **)&LoadFile,\r
                     This->DriverBindingHandle,\r
                     ControllerHandle,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -1618,20 +1615,19 @@ PxeBcStop (
   // Stop functionality of PXE Base Code protocol\r
   //\r
   Status = Private->PxeBc.Stop (&Private->PxeBc);\r
-  if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {\r
+  if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_STARTED)) {\r
     return Status;\r
   }\r
 \r
-\r
-  if (Private->Ip4Nic != NULL && IpVersion == IP_VERSION_4) {\r
+  if ((Private->Ip4Nic != NULL) && (IpVersion == IP_VERSION_4)) {\r
     PxeBcDestroyIp4Children (This, Private);\r
   }\r
 \r
-  if (Private->Ip6Nic != NULL && IpVersion == IP_VERSION_6) {\r
+  if ((Private->Ip6Nic != NULL) && (IpVersion == IP_VERSION_6)) {\r
     PxeBcDestroyIp6Children (This, Private);\r
   }\r
 \r
-  if (Private->Ip4Nic == NULL && Private->Ip6Nic == NULL) {\r
+  if ((Private->Ip4Nic == NULL) && (Private->Ip6Nic == NULL)) {\r
     gBS->UninstallProtocolInterface (\r
            NicHandle,\r
            &gEfiCallerIdGuid,\r