+++ /dev/null
-/** @file\r
- The driver binding for UEFI PXEBC protocol.\r
-\r
-Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\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
-\r
-**/\r
-\r
-\r
-#include "PxeBcImpl.h"\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {\r
- PxeBcDriverBindingSupported,\r
- PxeBcDriverBindingStart,\r
- PxeBcDriverBindingStop,\r
- 0xa,\r
- NULL,\r
- NULL\r
-};\r
-\r
-/**\r
- This is the declaration of an EFI image entry point. This entry point is\r
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including\r
- both device drivers and bus drivers.\r
-\r
- @param ImageHandle The firmware allocated handle for the UEFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The operation completed successfully.\r
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- return EfiLibInstallDriverBindingComponentName2 (\r
- ImageHandle,\r
- SystemTable,\r
- &gPxeBcDriverBinding,\r
- ImageHandle,\r
- &gPxeBcComponentName,\r
- &gPxeBcComponentName2\r
- );\r
-}\r
-\r
-\r
-/**\r
- Test to see if this driver supports ControllerHandle. This service\r
- is called by the EFI boot service ConnectController(). In\r
- order to make drivers as small as possible, there are a few calling\r
- restrictions for this service. ConnectController() must\r
- follow these calling restrictions. If any other agent wishes to call\r
- Supported() it must also follow these calling restrictions.\r
- PxeBc requires DHCP4 and MTFTP4 protocols.\r
-\r
- @param This Protocol instance pointer.\r
- @param ControllerHandle Handle of device to test\r
- @param RemainingDevicePath Optional parameter use to pick a specific child\r
- device to start.\r
-\r
- @retval EFI_SUCCESS This driver supports this device\r
- @retval EFI_ALREADY_STARTED This driver is already running on this device\r
- @retval other This driver does not support this device\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
- )\r
-{\r
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
- EFI_STATUS Status;\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiPxeBaseCodeProtocolGuid,\r
- (VOID **) &PxeBc,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- return EFI_ALREADY_STARTED;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiDhcp4ServiceBindingProtocolGuid,\r
- NULL,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
-\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiMtftp4ServiceBindingProtocolGuid,\r
- NULL,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
-\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Start this driver on ControllerHandle. This service is called by the\r
- EFI boot service ConnectController(). In order to make\r
- drivers as small as possible, there are a few calling restrictions for\r
- this service. ConnectController() must follow these\r
- calling restrictions. If any other agent wishes to call Start() it\r
- must also follow these calling restrictions.\r
-\r
- @param This Protocol instance pointer.\r
- @param ControllerHandle Handle of device to bind driver to\r
- @param RemainingDevicePath Optional parameter use to pick a specific child\r
- device to start.\r
-\r
- @retval EFI_SUCCESS This driver is added to ControllerHandle\r
- @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
- @retval other This driver does not support this device\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
- )\r
-{\r
- PXEBC_PRIVATE_DATA *Private;\r
- UINTN Index;\r
- EFI_STATUS Status;\r
- EFI_IP4_MODE_DATA Ip4ModeData;\r
-\r
- Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
- if (Private == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
- Private->Controller = ControllerHandle;\r
- Private->Image = This->DriverBindingHandle;\r
- CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));\r
- Private->PxeBc.Mode = &Private->Mode;\r
- CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));\r
-\r
- Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
- Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
- Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
-\r
- for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {\r
- Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
- }\r
-\r
- //\r
- // Get the NII interface if it exists.\r
- //\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
- (VOID **) &Private->Nii,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- Private->Nii = NULL;\r
- }\r
-\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiArpServiceBindingProtocolGuid,\r
- &Private->ArpChild\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Private->ArpChild,\r
- &gEfiArpProtocolGuid,\r
- (VOID **) &Private->Arp,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiDhcp4ServiceBindingProtocolGuid,\r
- &Private->Dhcp4Child\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Private->Dhcp4Child,\r
- &gEfiDhcp4ProtocolGuid,\r
- (VOID **) &Private->Dhcp4,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiIp4ServiceBindingProtocolGuid,\r
- &Private->Ip4Child\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Private->Ip4Child,\r
- &gEfiIp4ProtocolGuid,\r
- (VOID **) &Private->Ip4,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // Get max packet size from Ip4 to calculate block size for Tftp later.\r
- //\r
- Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;\r
-\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiMtftp4ServiceBindingProtocolGuid,\r
- &Private->Mtftp4Child\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Private->Mtftp4Child,\r
- &gEfiMtftp4ProtocolGuid,\r
- (VOID **) &Private->Mtftp4,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- &Private->Udp4ReadChild\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // The UDP instance for EfiPxeBcUdpRead\r
- //\r
- Status = gBS->OpenProtocol (\r
- Private->Udp4ReadChild,\r
- &gEfiUdp4ProtocolGuid,\r
- (VOID **) &Private->Udp4Read,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // The UDP instance for EfiPxeBcUdpWrite\r
- //\r
- Status = NetLibCreateServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- &Private->Udp4WriteChild\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Private->Udp4WriteChild,\r
- &gEfiUdp4ProtocolGuid,\r
- (VOID **) &Private->Udp4Write,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
- ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
- Private->Udp4CfgData.AcceptBroadcast = FALSE;\r
- Private->Udp4CfgData.AcceptPromiscuous = FALSE;\r
- Private->Udp4CfgData.AcceptAnyPort = TRUE;\r
- Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
- Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;\r
- Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;\r
- Private->Udp4CfgData.DoNotFragment = FALSE;\r
- Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
- Private->Udp4CfgData.UseDefaultAddress = FALSE;\r
-\r
- PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read);\r
- Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;\r
- CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);\r
-\r
-\r
- ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));\r
- Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;\r
- Private->Ip4ConfigData.AcceptIcmpErrors = TRUE;\r
- Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS;\r
- Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL;\r
- Private->Ip4ConfigData.DoNotFragment = FALSE;\r
- Private->Ip4ConfigData.RawData = FALSE;\r
-\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &ControllerHandle,\r
- &gEfiPxeBaseCodeProtocolGuid,\r
- &Private->PxeBc,\r
- &gEfiLoadFileProtocolGuid,\r
- &Private->LoadFile,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\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
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-ON_ERROR:\r
-\r
- if (Private->Udp4WriteChild != NULL) {\r
- gBS->CloseProtocol (\r
- Private->Udp4WriteChild,\r
- &gEfiUdp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- Private->Udp4WriteChild\r
- );\r
- }\r
-\r
- if (Private->Udp4ReadChild != NULL) {\r
- gBS->CloseProtocol (\r
- Private->Udp4ReadChild,\r
- &gEfiUdp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- Private->Udp4ReadChild\r
- );\r
- }\r
-\r
- if (Private->Mtftp4Child != NULL) {\r
- gBS->CloseProtocol (\r
- Private->Mtftp4Child,\r
- &gEfiMtftp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
-\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiMtftp4ServiceBindingProtocolGuid,\r
- Private->Mtftp4Child\r
- );\r
- }\r
-\r
- if (Private->Ip4Child != NULL) {\r
- gBS->CloseProtocol (\r
- Private->Ip4Child,\r
- &gEfiIp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
-\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiIp4ServiceBindingProtocolGuid,\r
- Private->Ip4Child\r
- );\r
- }\r
-\r
- if (Private->Dhcp4Child != NULL) {\r
- gBS->CloseProtocol (\r
- Private->Dhcp4Child,\r
- &gEfiDhcp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
-\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiDhcp4ServiceBindingProtocolGuid,\r
- Private->Dhcp4Child\r
- );\r
- }\r
-\r
- if (Private->ArpChild != NULL) {\r
- gBS->CloseProtocol (\r
- Private->ArpChild,\r
- &gEfiArpProtocolGuid,\r
- This->DriverBindingHandle,\r
- ControllerHandle\r
- );\r
-\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiArpServiceBindingProtocolGuid,\r
- Private->ArpChild\r
- );\r
- }\r
-\r
- FreePool (Private);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Stop this driver on ControllerHandle. This service is called by the\r
- EFI boot service DisconnectController(). In order to\r
- make drivers as small as possible, there are a few calling\r
- restrictions for this service. DisconnectController()\r
- must follow these calling restrictions. If any other agent wishes\r
- to call Stop() it must also follow these calling restrictions.\r
-\r
- @param This Protocol instance pointer.\r
- @param ControllerHandle Handle of device to stop driver on\r
- @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
- children is zero stop the entire bus driver.\r
- @param ChildHandleBuffer List of Child Handles to Stop.\r
-\r
- @retval EFI_SUCCESS This driver is removed ControllerHandle\r
- @retval other This driver was not removed from this device\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
- )\r
-{\r
- PXEBC_PRIVATE_DATA *Private;\r
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
- EFI_HANDLE NicHandle;\r
- EFI_STATUS Status;\r
-\r
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
- if (NicHandle == NULL) {\r
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
-\r
- if (NicHandle == NULL) {\r
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
-\r
- if (NicHandle == NULL) {\r
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
-\r
- if (NicHandle == NULL) {\r
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
-\r
- if (NicHandle == NULL) {\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- NicHandle,\r
- &gEfiPxeBaseCodeProtocolGuid,\r
- (VOID **) &PxeBc,\r
- This->DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Stop functionality of PXE Base Code protocol\r
- //\r
- Status = PxeBc->Stop (PxeBc);\r
- if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {\r
- return Status;\r
- }\r
-\r
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);\r
-\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- NicHandle,\r
- &gEfiPxeBaseCodeProtocolGuid,\r
- &Private->PxeBc,\r
- &gEfiLoadFileProtocolGuid,\r
- &Private->LoadFile,\r
- NULL\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
-\r
- gBS->CloseProtocol (\r
- Private->Udp4WriteChild,\r
- &gEfiUdp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- NicHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- ControllerHandle,\r
- This->DriverBindingHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- Private->Udp4WriteChild\r
- );\r
-\r
- gBS->CloseProtocol (\r
- Private->Udp4ReadChild,\r
- &gEfiUdp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- NicHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- NicHandle,\r
- This->DriverBindingHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- Private->Udp4ReadChild\r
- );\r
-\r
- gBS->CloseProtocol (\r
- Private->Dhcp4Child,\r
- &gEfiDhcp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- NicHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- NicHandle,\r
- This->DriverBindingHandle,\r
- &gEfiDhcp4ServiceBindingProtocolGuid,\r
- Private->Dhcp4Child\r
- );\r
-\r
- gBS->CloseProtocol (\r
- Private->Mtftp4Child,\r
- &gEfiMtftp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- NicHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- NicHandle,\r
- This->DriverBindingHandle,\r
- &gEfiMtftp4ServiceBindingProtocolGuid,\r
- Private->Mtftp4Child\r
- );\r
-\r
- gBS->CloseProtocol (\r
- Private->Ip4Child,\r
- &gEfiIp4ProtocolGuid,\r
- This->DriverBindingHandle,\r
- NicHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- NicHandle,\r
- This->DriverBindingHandle,\r
- &gEfiIp4ServiceBindingProtocolGuid,\r
- Private->Ip4Child\r
- );\r
-\r
- gBS->CloseProtocol (\r
- Private->ArpChild,\r
- &gEfiArpProtocolGuid,\r
- This->DriverBindingHandle,\r
- NicHandle\r
- );\r
- NetLibDestroyServiceChild (\r
- NicHandle,\r
- This->DriverBindingHandle,\r
- &gEfiArpServiceBindingProtocolGuid,\r
- Private->ArpChild\r
- );\r
-\r
- FreePool (Private);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r