2 Driver Binding functions implementationfor for UefiPxeBc Driver.
4 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php.
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "PxeBcImpl.h"
20 EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp4DriverBinding
= {
21 PxeBcIp4DriverBindingSupported
,
22 PxeBcIp4DriverBindingStart
,
23 PxeBcIp4DriverBindingStop
,
29 EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp6DriverBinding
= {
30 PxeBcIp6DriverBindingSupported
,
31 PxeBcIp6DriverBindingStart
,
32 PxeBcIp6DriverBindingStop
,
39 Get the Nic handle using any child handle in the IPv4 stack.
41 @param[in] ControllerHandle Pointer to child handle over IPv4.
43 @return NicHandle The pointer to the Nic handle.
47 PxeBcGetNicByIp4Children (
48 IN EFI_HANDLE ControllerHandle
53 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiArpProtocolGuid
);
54 if (NicHandle
== NULL
) {
55 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiIp4ProtocolGuid
);
56 if (NicHandle
== NULL
) {
57 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiUdp4ProtocolGuid
);
58 if (NicHandle
== NULL
) {
59 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
60 if (NicHandle
== NULL
) {
61 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp4ProtocolGuid
);
62 if (NicHandle
== NULL
) {
75 Get the Nic handle using any child handle in the IPv6 stack.
77 @param[in] ControllerHandle Pointer to child handle over IPv6.
79 @return NicHandle The pointer to the Nic handle.
83 PxeBcGetNicByIp6Children (
84 IN EFI_HANDLE ControllerHandle
89 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiIp6ProtocolGuid
);
90 if (NicHandle
== NULL
) {
91 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiUdp6ProtocolGuid
);
92 if (NicHandle
== NULL
) {
93 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp6ProtocolGuid
);
94 if (NicHandle
== NULL
) {
95 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp6ProtocolGuid
);
96 if (NicHandle
== NULL
) {
108 Destroy the opened instances based on IPv4.
110 @param[in] This Pointer to the EFI_DRIVER_BINDING_PROTOCOL.
111 @param[in] Private Pointer to PXEBC_PRIVATE_DATA.
115 PxeBcDestroyIp4Children (
116 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
117 IN PXEBC_PRIVATE_DATA
*Private
120 ASSERT(Private
!= NULL
);
122 if (Private
->ArpChild
!= NULL
) {
124 // Close Arp for PxeBc->Arp and destroy the instance.
128 &gEfiArpProtocolGuid
,
129 This
->DriverBindingHandle
,
133 NetLibDestroyServiceChild (
135 This
->DriverBindingHandle
,
136 &gEfiArpServiceBindingProtocolGuid
,
141 if (Private
->Ip4Child
!= NULL
) {
143 // Close Ip4 for background ICMP error message and destroy the instance.
147 &gEfiIp4ProtocolGuid
,
148 This
->DriverBindingHandle
,
152 NetLibDestroyServiceChild (
154 This
->DriverBindingHandle
,
155 &gEfiIp4ServiceBindingProtocolGuid
,
160 if (Private
->Udp4WriteChild
!= NULL
) {
162 // Close Udp4 for PxeBc->UdpWrite and destroy the instance.
165 Private
->Udp4WriteChild
,
166 &gEfiUdp4ProtocolGuid
,
167 This
->DriverBindingHandle
,
171 NetLibDestroyServiceChild (
173 This
->DriverBindingHandle
,
174 &gEfiUdp4ServiceBindingProtocolGuid
,
175 Private
->Udp4WriteChild
179 if (Private
->Udp4ReadChild
!= NULL
) {
181 // Close Udp4 for PxeBc->UdpRead and destroy the instance.
184 Private
->Udp4ReadChild
,
185 &gEfiUdp4ProtocolGuid
,
186 This
->DriverBindingHandle
,
190 NetLibDestroyServiceChild (
192 This
->DriverBindingHandle
,
193 &gEfiUdp4ServiceBindingProtocolGuid
,
194 Private
->Udp4ReadChild
198 if (Private
->Mtftp4Child
!= NULL
) {
200 // Close Mtftp4 for PxeBc->Mtftp4 and destroy the instance.
203 Private
->Mtftp4Child
,
204 &gEfiMtftp4ProtocolGuid
,
205 This
->DriverBindingHandle
,
209 NetLibDestroyServiceChild (
211 This
->DriverBindingHandle
,
212 &gEfiMtftp4ServiceBindingProtocolGuid
,
217 if (Private
->Dhcp4Child
!= NULL
) {
219 // Close Dhcp4 for PxeBc->Dhcp4 and destroy the instance.
223 &gEfiDhcp4ProtocolGuid
,
224 This
->DriverBindingHandle
,
228 NetLibDestroyServiceChild (
230 This
->DriverBindingHandle
,
231 &gEfiDhcp4ServiceBindingProtocolGuid
,
236 if (Private
->Ip4Nic
!= NULL
) {
238 // Close PxeBcPrivate from the parent Nic handle and destroy the virtual handle.
243 This
->DriverBindingHandle
,
244 Private
->Ip4Nic
->Controller
247 gBS
->UninstallMultipleProtocolInterfaces (
248 Private
->Ip4Nic
->Controller
,
249 &gEfiDevicePathProtocolGuid
,
250 Private
->Ip4Nic
->DevicePath
,
251 &gEfiLoadFileProtocolGuid
,
252 &Private
->Ip4Nic
->LoadFile
,
253 &gEfiPxeBaseCodeProtocolGuid
,
258 if (Private
->Snp
!= NULL
) {
260 // Close SNP from the child virtual handle
263 Private
->Ip4Nic
->Controller
,
264 &gEfiSimpleNetworkProtocolGuid
,
265 This
->DriverBindingHandle
,
266 Private
->Ip4Nic
->Controller
269 gBS
->UninstallProtocolInterface (
270 Private
->Ip4Nic
->Controller
,
271 &gEfiSimpleNetworkProtocolGuid
,
275 FreePool (Private
->Ip4Nic
);
278 Private
->ArpChild
= NULL
;
279 Private
->Ip4Child
= NULL
;
280 Private
->Udp4WriteChild
= NULL
;
281 Private
->Udp4ReadChild
= NULL
;
282 Private
->Mtftp4Child
= NULL
;
283 Private
->Dhcp4Child
= NULL
;
284 Private
->Ip4Nic
= NULL
;
289 Destroy the opened instances based on IPv6.
291 @param[in] This Pointer to the EFI_DRIVER_BINDING_PROTOCOL.
292 @param[in] Private Pointer to PXEBC_PRIVATE_DATA.
296 PxeBcDestroyIp6Children (
297 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
298 IN PXEBC_PRIVATE_DATA
*Private
301 ASSERT(Private
!= NULL
);
303 if (Private
->Ip6Child
!= NULL
) {
305 // Close Ip6 for Ip6->Ip6Config and destroy the instance.
309 &gEfiIp6ProtocolGuid
,
310 This
->DriverBindingHandle
,
314 NetLibDestroyServiceChild (
316 This
->DriverBindingHandle
,
317 &gEfiIp6ServiceBindingProtocolGuid
,
322 if (Private
->Udp6WriteChild
!= NULL
) {
324 // Close Udp6 for PxeBc->UdpWrite and destroy the instance.
327 Private
->Udp6WriteChild
,
328 &gEfiUdp6ProtocolGuid
,
329 This
->DriverBindingHandle
,
332 NetLibDestroyServiceChild (
334 This
->DriverBindingHandle
,
335 &gEfiUdp6ServiceBindingProtocolGuid
,
336 Private
->Udp6WriteChild
340 if (Private
->Udp6ReadChild
!= NULL
) {
342 // Close Udp6 for PxeBc->UdpRead and destroy the instance.
345 Private
->Udp6ReadChild
,
346 &gEfiUdp6ProtocolGuid
,
347 This
->DriverBindingHandle
,
350 NetLibDestroyServiceChild (
352 This
->DriverBindingHandle
,
353 &gEfiUdp6ServiceBindingProtocolGuid
,
354 Private
->Udp6ReadChild
358 if (Private
->Mtftp6Child
!= NULL
) {
360 // Close Mtftp6 for PxeBc->Mtftp and destroy the instance.
363 Private
->Mtftp6Child
,
364 &gEfiMtftp6ProtocolGuid
,
365 This
->DriverBindingHandle
,
369 NetLibDestroyServiceChild (
371 This
->DriverBindingHandle
,
372 &gEfiMtftp6ServiceBindingProtocolGuid
,
377 if (Private
->Dhcp6Child
!= NULL
) {
379 // Close Dhcp6 for PxeBc->Dhcp and destroy the instance.
383 &gEfiDhcp6ProtocolGuid
,
384 This
->DriverBindingHandle
,
388 NetLibDestroyServiceChild (
390 This
->DriverBindingHandle
,
391 &gEfiDhcp6ServiceBindingProtocolGuid
,
396 if (Private
->Ip6Nic
!= NULL
) {
398 // Close PxeBcPrivate from the parent Nic handle and destroy the virtual handle.
403 This
->DriverBindingHandle
,
404 Private
->Ip6Nic
->Controller
407 gBS
->UninstallMultipleProtocolInterfaces (
408 Private
->Ip6Nic
->Controller
,
409 &gEfiDevicePathProtocolGuid
,
410 Private
->Ip6Nic
->DevicePath
,
411 &gEfiLoadFileProtocolGuid
,
412 &Private
->Ip6Nic
->LoadFile
,
413 &gEfiPxeBaseCodeProtocolGuid
,
417 if (Private
->Snp
!= NULL
) {
419 // Close SNP from the child virtual handle
422 Private
->Ip6Nic
->Controller
,
423 &gEfiSimpleNetworkProtocolGuid
,
424 This
->DriverBindingHandle
,
425 Private
->Ip6Nic
->Controller
427 gBS
->UninstallProtocolInterface (
428 Private
->Ip6Nic
->Controller
,
429 &gEfiSimpleNetworkProtocolGuid
,
433 FreePool (Private
->Ip6Nic
);
436 Private
->Ip6Child
= NULL
;
437 Private
->Udp6WriteChild
= NULL
;
438 Private
->Udp6ReadChild
= NULL
;
439 Private
->Mtftp6Child
= NULL
;
440 Private
->Dhcp6Child
= NULL
;
441 Private
->Ip6Nic
= NULL
;
442 Private
->Mode
.Ipv6Available
= FALSE
;
446 Check whether UNDI protocol supports IPv6.
448 @param[in] ControllerHandle Controller handle.
449 @param[in] Private Pointer to PXEBC_PRIVATE_DATA.
450 @param[out] Ipv6Support TRUE if UNDI supports IPv6.
452 @retval EFI_SUCCESS Get the result whether UNDI supports IPv6 by NII or AIP protocol successfully.
453 @retval EFI_NOT_FOUND Don't know whether UNDI supports IPv6 since NII or AIP is not available.
457 PxeBcCheckIpv6Support (
458 IN EFI_HANDLE ControllerHandle
,
459 IN PXEBC_PRIVATE_DATA
*Private
,
460 OUT BOOLEAN
*Ipv6Support
464 EFI_ADAPTER_INFORMATION_PROTOCOL
*Aip
;
466 EFI_GUID
*InfoTypesBuffer
;
467 UINTN InfoTypeBufferCount
;
473 ASSERT (Private
!= NULL
&& Ipv6Support
!= NULL
);
476 // Check whether the UNDI supports IPv6 by NII protocol.
478 if (Private
->Nii
!= NULL
) {
479 *Ipv6Support
= Private
->Nii
->Ipv6Supported
;
484 // Check whether the UNDI supports IPv6 by AIP protocol.
488 // Get the NIC handle by SNP protocol.
490 Handle
= NetLibGetSnpHandle (ControllerHandle
, NULL
);
491 if (Handle
== NULL
) {
492 return EFI_NOT_FOUND
;
496 Status
= gBS
->HandleProtocol (
498 &gEfiAdapterInformationProtocolGuid
,
501 if (EFI_ERROR (Status
) || Aip
== NULL
) {
502 return EFI_NOT_FOUND
;
505 InfoTypesBuffer
= NULL
;
506 InfoTypeBufferCount
= 0;
507 Status
= Aip
->GetSupportedTypes (Aip
, &InfoTypesBuffer
, &InfoTypeBufferCount
);
508 if (EFI_ERROR (Status
) || InfoTypesBuffer
== NULL
) {
509 FreePool (InfoTypesBuffer
);
510 return EFI_NOT_FOUND
;
514 for (TypeIndex
= 0; TypeIndex
< InfoTypeBufferCount
; TypeIndex
++) {
515 if (CompareGuid (&InfoTypesBuffer
[TypeIndex
], &gEfiAdapterInfoUndiIpv6SupportGuid
)) {
521 FreePool (InfoTypesBuffer
);
523 return EFI_NOT_FOUND
;
527 // We now have adapter information block.
531 Status
= Aip
->GetInformation (Aip
, &gEfiAdapterInfoUndiIpv6SupportGuid
, &InfoBlock
, &InfoBlockSize
);
532 if (EFI_ERROR (Status
) || InfoBlock
== NULL
) {
533 FreePool (InfoBlock
);
534 return EFI_NOT_FOUND
;
537 *Ipv6Support
= ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT
*) InfoBlock
)->Ipv6Support
;
538 FreePool (InfoBlock
);
544 Create the opened instances based on IPv4.
546 @param[in] This Pointer to EFI_DRIVER_BINDING_PROTOCOL.
547 @param[in] ControllerHandle Handle of the child to destroy.
548 @param[in] Private Handle Pointer to PXEBC_PRIVATE_DATA.
550 @retval EFI_SUCCESS The instances based on IPv4 were all created successfully.
551 @retval Others An unexpected error occurred.
555 PxeBcCreateIp4Children (
556 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
557 IN EFI_HANDLE ControllerHandle
,
558 IN PXEBC_PRIVATE_DATA
*Private
562 IPv4_DEVICE_PATH Ip4Node
;
563 EFI_PXE_BASE_CODE_MODE
*Mode
;
564 EFI_UDP4_CONFIG_DATA
*Udp4CfgData
;
565 EFI_IP4_CONFIG_DATA
*Ip4CfgData
;
566 EFI_IP4_MODE_DATA Ip4ModeData
;
567 PXEBC_PRIVATE_PROTOCOL
*Id
;
568 EFI_SIMPLE_NETWORK_PROTOCOL
*Snp
;
570 if (Private
->Ip4Nic
!= NULL
) {
572 // Already created before.
578 // Create Dhcp4 child and open Dhcp4 protocol for PxeBc->Dhcp.
580 Status
= NetLibCreateServiceChild (
582 This
->DriverBindingHandle
,
583 &gEfiDhcp4ServiceBindingProtocolGuid
,
586 if (EFI_ERROR (Status
)) {
590 Status
= gBS
->OpenProtocol (
592 &gEfiDhcp4ProtocolGuid
,
593 (VOID
**) &Private
->Dhcp4
,
594 This
->DriverBindingHandle
,
596 EFI_OPEN_PROTOCOL_BY_DRIVER
598 if (EFI_ERROR (Status
)) {
603 // Create Mtftp4 child and open Mtftp4 protocol for PxeBc->Mtftp.
605 Status
= NetLibCreateServiceChild (
607 This
->DriverBindingHandle
,
608 &gEfiMtftp4ServiceBindingProtocolGuid
,
609 &Private
->Mtftp4Child
611 if (EFI_ERROR (Status
)) {
615 Status
= gBS
->OpenProtocol (
616 Private
->Mtftp4Child
,
617 &gEfiMtftp4ProtocolGuid
,
618 (VOID
**) &Private
->Mtftp4
,
619 This
->DriverBindingHandle
,
621 EFI_OPEN_PROTOCOL_BY_DRIVER
623 if (EFI_ERROR (Status
)) {
628 // Create Udp4 child and open Udp4 protocol for PxeBc->UdpRead.
630 Status
= NetLibCreateServiceChild (
632 This
->DriverBindingHandle
,
633 &gEfiUdp4ServiceBindingProtocolGuid
,
634 &Private
->Udp4ReadChild
636 if (EFI_ERROR (Status
)) {
640 Status
= gBS
->OpenProtocol (
641 Private
->Udp4ReadChild
,
642 &gEfiUdp4ProtocolGuid
,
643 (VOID
**) &Private
->Udp4Read
,
644 This
->DriverBindingHandle
,
646 EFI_OPEN_PROTOCOL_BY_DRIVER
648 if (EFI_ERROR (Status
)) {
653 // Create Udp4 child and open Udp4 protocol for PxeBc->UdpWrite.
655 Status
= NetLibCreateServiceChild (
657 This
->DriverBindingHandle
,
658 &gEfiUdp4ServiceBindingProtocolGuid
,
659 &Private
->Udp4WriteChild
661 if (EFI_ERROR (Status
)) {
665 Status
= gBS
->OpenProtocol (
666 Private
->Udp4WriteChild
,
667 &gEfiUdp4ProtocolGuid
,
668 (VOID
**) &Private
->Udp4Write
,
669 This
->DriverBindingHandle
,
671 EFI_OPEN_PROTOCOL_BY_DRIVER
673 if (EFI_ERROR (Status
)) {
678 // Create Arp child and open Arp protocol for PxeBc->Arp.
680 Status
= NetLibCreateServiceChild (
682 This
->DriverBindingHandle
,
683 &gEfiArpServiceBindingProtocolGuid
,
686 if (EFI_ERROR (Status
)) {
690 Status
= gBS
->OpenProtocol (
692 &gEfiArpProtocolGuid
,
693 (VOID
**) &Private
->Arp
,
694 This
->DriverBindingHandle
,
696 EFI_OPEN_PROTOCOL_BY_DRIVER
698 if (EFI_ERROR (Status
)) {
703 // Create Ip4 child and open Ip4 protocol for background ICMP packets.
705 Status
= NetLibCreateServiceChild (
707 This
->DriverBindingHandle
,
708 &gEfiIp4ServiceBindingProtocolGuid
,
711 if (EFI_ERROR (Status
)) {
715 Status
= gBS
->OpenProtocol (
717 &gEfiIp4ProtocolGuid
,
718 (VOID
**) &Private
->Ip4
,
719 This
->DriverBindingHandle
,
721 EFI_OPEN_PROTOCOL_BY_DRIVER
723 if (EFI_ERROR (Status
)) {
728 // Get max packet size from Ip4 to calculate block size for Tftp later.
730 Status
= Private
->Ip4
->GetModeData (Private
->Ip4
, &Ip4ModeData
, NULL
, NULL
);
731 if (EFI_ERROR (Status
)) {
735 Private
->Ip4MaxPacketSize
= Ip4ModeData
.MaxPacketSize
;
737 Private
->Ip4Nic
= AllocateZeroPool (sizeof (PXEBC_VIRTUAL_NIC
));
738 if (Private
->Ip4Nic
== NULL
) {
739 return EFI_OUT_OF_RESOURCES
;
742 Private
->Ip4Nic
->Private
= Private
;
743 Private
->Ip4Nic
->Signature
= PXEBC_VIRTUAL_NIC_SIGNATURE
;
746 // Create a device path node for Ipv4 virtual nic, and append it.
748 ZeroMem (&Ip4Node
, sizeof (IPv4_DEVICE_PATH
));
749 Ip4Node
.Header
.Type
= MESSAGING_DEVICE_PATH
;
750 Ip4Node
.Header
.SubType
= MSG_IPv4_DP
;
751 Ip4Node
.StaticIpAddress
= FALSE
;
753 SetDevicePathNodeLength (&Ip4Node
.Header
, sizeof (Ip4Node
));
755 Private
->Ip4Nic
->DevicePath
= AppendDevicePathNode (Private
->DevicePath
, &Ip4Node
.Header
);
757 if (Private
->Ip4Nic
->DevicePath
== NULL
) {
758 Status
= EFI_OUT_OF_RESOURCES
;
763 &Private
->Ip4Nic
->LoadFile
,
764 &gLoadFileProtocolTemplate
,
765 sizeof (EFI_LOAD_FILE_PROTOCOL
)
769 // Create a new handle for IPv4 virtual nic,
770 // and install PxeBaseCode, LoadFile and DevicePath protocols.
772 Status
= gBS
->InstallMultipleProtocolInterfaces (
773 &Private
->Ip4Nic
->Controller
,
774 &gEfiDevicePathProtocolGuid
,
775 Private
->Ip4Nic
->DevicePath
,
776 &gEfiLoadFileProtocolGuid
,
777 &Private
->Ip4Nic
->LoadFile
,
778 &gEfiPxeBaseCodeProtocolGuid
,
782 if (EFI_ERROR (Status
)) {
786 if (Private
->Snp
!= NULL
) {
788 // Install SNP protocol on purpose is for some OS loader backward
789 // compatibility consideration.
791 Status
= gBS
->InstallProtocolInterface (
792 &Private
->Ip4Nic
->Controller
,
793 &gEfiSimpleNetworkProtocolGuid
,
794 EFI_NATIVE_INTERFACE
,
797 if (EFI_ERROR (Status
)) {
802 // Open SNP on the child handle BY_DRIVER. It will prevent any additionally
803 // layering to perform the experiment.
805 Status
= gBS
->OpenProtocol (
806 Private
->Ip4Nic
->Controller
,
807 &gEfiSimpleNetworkProtocolGuid
,
809 This
->DriverBindingHandle
,
810 Private
->Ip4Nic
->Controller
,
811 EFI_OPEN_PROTOCOL_BY_DRIVER
813 if (EFI_ERROR (Status
)) {
819 // Open PxeBaseCodePrivate protocol by child to setup a parent-child relationship between
820 // real NIC handle and the virtual IPv4 NIC handle.
822 Status
= gBS
->OpenProtocol (
826 This
->DriverBindingHandle
,
827 Private
->Ip4Nic
->Controller
,
828 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
830 if (EFI_ERROR (Status
)) {
835 // Set default configure data for Udp4Read and Ip4 instance.
837 Mode
= Private
->PxeBc
.Mode
;
838 Udp4CfgData
= &Private
->Udp4CfgData
;
839 Ip4CfgData
= &Private
->Ip4CfgData
;
841 Udp4CfgData
->AcceptBroadcast
= FALSE
;
842 Udp4CfgData
->AcceptAnyPort
= TRUE
;
843 Udp4CfgData
->AllowDuplicatePort
= TRUE
;
844 Udp4CfgData
->TypeOfService
= Mode
->ToS
;
845 Udp4CfgData
->TimeToLive
= Mode
->TTL
;
846 Udp4CfgData
->ReceiveTimeout
= PXEBC_DEFAULT_LIFETIME
;
847 Udp4CfgData
->TransmitTimeout
= PXEBC_DEFAULT_LIFETIME
;
849 Ip4CfgData
->AcceptIcmpErrors
= TRUE
;
850 Ip4CfgData
->DefaultProtocol
= EFI_IP_PROTO_ICMP
;
851 Ip4CfgData
->TypeOfService
= Mode
->ToS
;
852 Ip4CfgData
->TimeToLive
= Mode
->TTL
;
853 Ip4CfgData
->ReceiveTimeout
= PXEBC_DEFAULT_LIFETIME
;
854 Ip4CfgData
->TransmitTimeout
= PXEBC_DEFAULT_LIFETIME
;
859 PxeBcDestroyIp4Children (This
, Private
);
865 Create the opened instances based on IPv6.
867 @param[in] This Pointer to EFI_DRIVER_BINDING_PROTOCOL.
868 @param[in] ControllerHandle Handle of the child to destroy.
869 @param[in] Private Handle Pointer to PXEBC_PRIVATE_DATA.
871 @retval EFI_SUCCESS The instances based on IPv6 were all created successfully.
872 @retval Others An unexpected error occurred.
876 PxeBcCreateIp6Children (
877 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
878 IN EFI_HANDLE ControllerHandle
,
879 IN PXEBC_PRIVATE_DATA
*Private
883 IPv6_DEVICE_PATH Ip6Node
;
884 EFI_UDP6_CONFIG_DATA
*Udp6CfgData
;
885 EFI_IP6_CONFIG_DATA
*Ip6CfgData
;
886 EFI_IP6_MODE_DATA Ip6ModeData
;
887 PXEBC_PRIVATE_PROTOCOL
*Id
;
888 EFI_SIMPLE_NETWORK_PROTOCOL
*Snp
;
891 if (Private
->Ip6Nic
!= NULL
) {
893 // Already created before.
898 Private
->Ip6Nic
= AllocateZeroPool (sizeof (PXEBC_VIRTUAL_NIC
));
900 if (Private
->Ip6Nic
== NULL
) {
901 return EFI_OUT_OF_RESOURCES
;
904 Private
->Ip6Nic
->Private
= Private
;
905 Private
->Ip6Nic
->Signature
= PXEBC_VIRTUAL_NIC_SIGNATURE
;
908 // Create Dhcp6 child and open Dhcp6 protocol for PxeBc->Dhcp.
910 Status
= NetLibCreateServiceChild (
912 This
->DriverBindingHandle
,
913 &gEfiDhcp6ServiceBindingProtocolGuid
,
916 if (EFI_ERROR (Status
)) {
920 Status
= gBS
->OpenProtocol (
922 &gEfiDhcp6ProtocolGuid
,
923 (VOID
**) &Private
->Dhcp6
,
924 This
->DriverBindingHandle
,
926 EFI_OPEN_PROTOCOL_BY_DRIVER
928 if (EFI_ERROR (Status
)) {
933 // Generate a random IAID for the Dhcp6 assigned address.
935 Private
->IaId
= NET_RANDOM (NetRandomInitSeed ());
936 if (Private
->Snp
!= NULL
) {
937 for (Index
= 0; Index
< Private
->Snp
->Mode
->HwAddressSize
; Index
++) {
938 Private
->IaId
|= (Private
->Snp
->Mode
->CurrentAddress
.Addr
[Index
] << ((Index
<< 3) & 31));
943 // Create Mtftp6 child and open Mtftp6 protocol for PxeBc->Mtftp.
945 Status
= NetLibCreateServiceChild (
947 This
->DriverBindingHandle
,
948 &gEfiMtftp6ServiceBindingProtocolGuid
,
949 &Private
->Mtftp6Child
951 if (EFI_ERROR (Status
)) {
955 Status
= gBS
->OpenProtocol (
956 Private
->Mtftp6Child
,
957 &gEfiMtftp6ProtocolGuid
,
958 (VOID
**) &Private
->Mtftp6
,
959 This
->DriverBindingHandle
,
961 EFI_OPEN_PROTOCOL_BY_DRIVER
963 if (EFI_ERROR (Status
)) {
968 // Create Udp6 child and open Udp6 protocol for PxeBc->UdpRead.
970 Status
= NetLibCreateServiceChild (
972 This
->DriverBindingHandle
,
973 &gEfiUdp6ServiceBindingProtocolGuid
,
974 &Private
->Udp6ReadChild
976 if (EFI_ERROR (Status
)) {
980 Status
= gBS
->OpenProtocol (
981 Private
->Udp6ReadChild
,
982 &gEfiUdp6ProtocolGuid
,
983 (VOID
**) &Private
->Udp6Read
,
984 This
->DriverBindingHandle
,
986 EFI_OPEN_PROTOCOL_BY_DRIVER
988 if (EFI_ERROR (Status
)) {
993 // Create Udp6 child and open Udp6 protocol for PxeBc->UdpWrite.
995 Status
= NetLibCreateServiceChild (
997 This
->DriverBindingHandle
,
998 &gEfiUdp6ServiceBindingProtocolGuid
,
999 &Private
->Udp6WriteChild
1001 if (EFI_ERROR (Status
)) {
1005 Status
= gBS
->OpenProtocol (
1006 Private
->Udp6WriteChild
,
1007 &gEfiUdp6ProtocolGuid
,
1008 (VOID
**) &Private
->Udp6Write
,
1009 This
->DriverBindingHandle
,
1011 EFI_OPEN_PROTOCOL_BY_DRIVER
1013 if (EFI_ERROR (Status
)) {
1018 // Create Ip6 child and open Ip6 protocol for background ICMP6 packets.
1020 Status
= NetLibCreateServiceChild (
1022 This
->DriverBindingHandle
,
1023 &gEfiIp6ServiceBindingProtocolGuid
,
1026 if (EFI_ERROR (Status
)) {
1030 Status
= gBS
->OpenProtocol (
1032 &gEfiIp6ProtocolGuid
,
1033 (VOID
**) &Private
->Ip6
,
1034 This
->DriverBindingHandle
,
1036 EFI_OPEN_PROTOCOL_BY_DRIVER
1038 if (EFI_ERROR (Status
)) {
1043 // Get max packet size from Ip6 to calculate block size for Tftp later.
1045 Status
= Private
->Ip6
->GetModeData (Private
->Ip6
, &Ip6ModeData
, NULL
, NULL
);
1046 if (EFI_ERROR (Status
)) {
1050 Private
->Ip6MaxPacketSize
= Ip6ModeData
.MaxPacketSize
;
1053 // Locate Ip6->Ip6Config and store it for set IPv6 address.
1055 Status
= gBS
->HandleProtocol (
1057 &gEfiIp6ConfigProtocolGuid
,
1058 (VOID
**) &Private
->Ip6Cfg
1060 if (EFI_ERROR (Status
)) {
1065 // Create a device path node for Ipv6 virtual nic, and append it.
1067 ZeroMem (&Ip6Node
, sizeof (IPv6_DEVICE_PATH
));
1068 Ip6Node
.Header
.Type
= MESSAGING_DEVICE_PATH
;
1069 Ip6Node
.Header
.SubType
= MSG_IPv6_DP
;
1070 Ip6Node
.PrefixLength
= IP6_PREFIX_LENGTH
;
1072 SetDevicePathNodeLength (&Ip6Node
.Header
, sizeof (Ip6Node
));
1074 Private
->Ip6Nic
->DevicePath
= AppendDevicePathNode (Private
->DevicePath
, &Ip6Node
.Header
);
1076 if (Private
->Ip6Nic
->DevicePath
== NULL
) {
1077 Status
= EFI_OUT_OF_RESOURCES
;
1082 &Private
->Ip6Nic
->LoadFile
,
1083 &gLoadFileProtocolTemplate
,
1084 sizeof (EFI_LOAD_FILE_PROTOCOL
)
1088 // Create a new handle for IPv6 virtual nic,
1089 // and install PxeBaseCode, LoadFile and DevicePath protocols.
1091 Status
= gBS
->InstallMultipleProtocolInterfaces (
1092 &Private
->Ip6Nic
->Controller
,
1093 &gEfiDevicePathProtocolGuid
,
1094 Private
->Ip6Nic
->DevicePath
,
1095 &gEfiLoadFileProtocolGuid
,
1096 &Private
->Ip6Nic
->LoadFile
,
1097 &gEfiPxeBaseCodeProtocolGuid
,
1101 if (EFI_ERROR (Status
)) {
1105 if (Private
->Snp
!= NULL
) {
1107 // Install SNP protocol on purpose is for some OS loader backward
1108 // compatibility consideration.
1110 Status
= gBS
->InstallProtocolInterface (
1111 &Private
->Ip6Nic
->Controller
,
1112 &gEfiSimpleNetworkProtocolGuid
,
1113 EFI_NATIVE_INTERFACE
,
1116 if (EFI_ERROR (Status
)) {
1121 // Open SNP on the child handle BY_DRIVER. It will prevent any additionally
1122 // layering to perform the experiment.
1124 Status
= gBS
->OpenProtocol (
1125 Private
->Ip6Nic
->Controller
,
1126 &gEfiSimpleNetworkProtocolGuid
,
1128 This
->DriverBindingHandle
,
1129 Private
->Ip6Nic
->Controller
,
1130 EFI_OPEN_PROTOCOL_BY_DRIVER
1132 if (EFI_ERROR (Status
)) {
1138 // Open PxeBaseCodePrivate protocol by child to setup a parent-child relationship between
1139 // real NIC handle and the virtual IPv6 NIC handle.
1141 Status
= gBS
->OpenProtocol (
1145 This
->DriverBindingHandle
,
1146 Private
->Ip6Nic
->Controller
,
1147 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
1149 if (EFI_ERROR (Status
)) {
1154 // Set IPv6 avaiable flag and set default configure data for
1155 // Udp6Read and Ip6 instance.
1157 Status
= PxeBcCheckIpv6Support (ControllerHandle
, Private
, &Private
->Mode
.Ipv6Available
);
1158 if (EFI_ERROR (Status
)) {
1160 // Fail to get the data whether UNDI supports IPv6. Set default value.
1162 Private
->Mode
.Ipv6Available
= TRUE
;
1165 if (!Private
->Mode
.Ipv6Available
) {
1169 Udp6CfgData
= &Private
->Udp6CfgData
;
1170 Ip6CfgData
= &Private
->Ip6CfgData
;
1172 Udp6CfgData
->AcceptAnyPort
= TRUE
;
1173 Udp6CfgData
->AllowDuplicatePort
= TRUE
;
1174 Udp6CfgData
->HopLimit
= PXEBC_DEFAULT_HOPLIMIT
;
1175 Udp6CfgData
->ReceiveTimeout
= PXEBC_DEFAULT_LIFETIME
;
1176 Udp6CfgData
->TransmitTimeout
= PXEBC_DEFAULT_LIFETIME
;
1178 Ip6CfgData
->AcceptIcmpErrors
= TRUE
;
1179 Ip6CfgData
->DefaultProtocol
= IP6_ICMP
;
1180 Ip6CfgData
->HopLimit
= PXEBC_DEFAULT_HOPLIMIT
;
1181 Ip6CfgData
->ReceiveTimeout
= PXEBC_DEFAULT_LIFETIME
;
1182 Ip6CfgData
->TransmitTimeout
= PXEBC_DEFAULT_LIFETIME
;
1187 PxeBcDestroyIp6Children (This
, Private
);
1193 The entry point for UefiPxeBc driver that installs the driver
1194 binding and component name protocol on its image.
1196 @param[in] ImageHandle The Image handle of the driver.
1197 @param[in] SystemTable The system table.
1205 PxeBcDriverEntryPoint (
1206 IN EFI_HANDLE ImageHandle
,
1207 IN EFI_SYSTEM_TABLE
*SystemTable
1212 Status
= EfiLibInstallDriverBindingComponentName2 (
1215 &gPxeBcIp4DriverBinding
,
1217 &gPxeBcComponentName
,
1218 &gPxeBcComponentName2
1220 if (EFI_ERROR (Status
)) {
1224 Status
= EfiLibInstallDriverBindingComponentName2 (
1227 &gPxeBcIp6DriverBinding
,
1229 &gPxeBcComponentName
,
1230 &gPxeBcComponentName2
1232 if (EFI_ERROR (Status
)) {
1233 gBS
->UninstallMultipleProtocolInterfaces (
1235 &gEfiDriverBindingProtocolGuid
,
1236 &gPxeBcIp4DriverBinding
,
1237 &gEfiComponentName2ProtocolGuid
,
1238 &gPxeBcComponentName2
,
1239 &gEfiComponentNameProtocolGuid
,
1240 &gPxeBcComponentName
,
1249 Test to see if this driver supports ControllerHandle. This is the worker function for
1250 PxeBcIp4(6)DriverBindingSupported.
1252 @param[in] This The pointer to the driver binding protocol.
1253 @param[in] ControllerHandle The handle of device to be tested.
1254 @param[in] RemainingDevicePath Optional parameter used to pick a specific child
1255 device to be started.
1256 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.
1258 @retval EFI_SUCCESS This driver supports this device.
1259 @retval EFI_UNSUPPORTED This driver does not support this device.
1265 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1266 IN EFI_HANDLE ControllerHandle
,
1267 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
,
1272 EFI_GUID
*DhcpServiceBindingGuid
;
1273 EFI_GUID
*MtftpServiceBindingGuid
;
1275 if (IpVersion
== IP_VERSION_4
) {
1276 DhcpServiceBindingGuid
= &gEfiDhcp4ServiceBindingProtocolGuid
;
1277 MtftpServiceBindingGuid
= &gEfiMtftp4ServiceBindingProtocolGuid
;
1279 DhcpServiceBindingGuid
= &gEfiDhcp6ServiceBindingProtocolGuid
;
1280 MtftpServiceBindingGuid
= &gEfiMtftp6ServiceBindingProtocolGuid
;
1284 // Try to open the Mtftp and Dhcp protocol to test whether IP stack is ready.
1286 Status
= gBS
->OpenProtocol (
1288 DhcpServiceBindingGuid
,
1290 This
->DriverBindingHandle
,
1292 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
1294 if (!EFI_ERROR (Status
)) {
1295 Status
= gBS
->OpenProtocol (
1297 MtftpServiceBindingGuid
,
1299 This
->DriverBindingHandle
,
1301 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
1306 // It's unsupported case if IP stack are not ready.
1308 if (EFI_ERROR (Status
)) {
1309 return EFI_UNSUPPORTED
;
1316 Start this driver on ControllerHandle. This is the worker function for
1317 PxeBcIp4(6)DriverBindingStart.
1319 @param[in] This The pointer to the driver binding protocol.
1320 @param[in] ControllerHandle The handle of device to be started.
1321 @param[in] RemainingDevicePath Optional parameter used to pick a specific child
1322 device to be started.
1323 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.
1326 @retval EFI_SUCCESS This driver is installed to ControllerHandle.
1327 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.
1328 @retval other This driver does not support this device.
1334 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1335 IN EFI_HANDLE ControllerHandle
,
1336 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
,
1340 PXEBC_PRIVATE_DATA
*Private
;
1342 PXEBC_PRIVATE_PROTOCOL
*Id
;
1346 Status
= gBS
->OpenProtocol (
1350 This
->DriverBindingHandle
,
1352 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1354 if (!EFI_ERROR (Status
)) {
1356 // Skip the initialization if the driver has been started already.
1358 Private
= PXEBC_PRIVATE_DATA_FROM_ID (Id
);
1362 // If the driver has not been started yet, it should do initialization.
1364 Private
= AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA
));
1365 if (Private
== NULL
) {
1366 return EFI_OUT_OF_RESOURCES
;
1371 &gPxeBcProtocolTemplate
,
1372 sizeof (EFI_PXE_BASE_CODE_PROTOCOL
)
1375 Private
->Signature
= PXEBC_PRIVATE_DATA_SIGNATURE
;
1376 Private
->Controller
= ControllerHandle
;
1377 Private
->Image
= This
->ImageHandle
;
1378 Private
->PxeBc
.Mode
= &Private
->Mode
;
1379 Private
->Mode
.Ipv6Supported
= TRUE
;
1380 Private
->Mode
.AutoArp
= TRUE
;
1381 Private
->Mode
.TTL
= DEFAULT_TTL
;
1382 Private
->Mode
.ToS
= DEFAULT_ToS
;
1385 // Open device path to prepare for appending virtual NIC node.
1387 Status
= gBS
->OpenProtocol (
1389 &gEfiDevicePathProtocolGuid
,
1390 (VOID
**) &Private
->DevicePath
,
1391 This
->DriverBindingHandle
,
1393 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1396 if (EFI_ERROR (Status
)) {
1401 // Get the NII interface if it exists, it's not required.
1403 Status
= gBS
->OpenProtocol (
1405 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
,
1406 (VOID
**) &Private
->Nii
,
1407 This
->DriverBindingHandle
,
1409 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1411 if (EFI_ERROR (Status
)) {
1412 Private
->Nii
= NULL
;
1416 // Install PxeBaseCodePrivate protocol onto the real NIC handler.
1417 // PxeBaseCodePrivate protocol is only used to keep the relationship between
1418 // NIC handle and virtual child handles.
1419 // gEfiCallerIdGuid will be used as its protocol guid.
1421 Status
= gBS
->InstallProtocolInterface (
1424 EFI_NATIVE_INTERFACE
,
1427 if (EFI_ERROR (Status
)) {
1432 // Try to locate SNP protocol.
1434 NetLibGetSnpHandle(ControllerHandle
, &Private
->Snp
);
1437 if (IpVersion
== IP_VERSION_4
) {
1439 // Try to create virtual NIC handle for IPv4.
1441 Status
= PxeBcCreateIp4Children (This
, ControllerHandle
, Private
);
1444 // Try to create virtual NIC handle for IPv6.
1446 Status
= PxeBcCreateIp6Children (This
, ControllerHandle
, Private
);
1448 if (EFI_ERROR (Status
)) {
1450 // Failed to start PXE driver if IPv4 and IPv6 stack are both not available.
1452 Status
= EFI_DEVICE_ERROR
;
1460 gBS
->UninstallProtocolInterface (
1467 if (IpVersion
== IP_VERSION_4
) {
1468 PxeBcDestroyIp4Children (This
, Private
);
1470 PxeBcDestroyIp6Children (This
, Private
);
1473 if (FirstStart
&& Private
!= NULL
) {
1482 Stop this driver on ControllerHandle. This is the worker function for
1483 PxeBcIp4(6)DriverBindingStop.
1485 @param[in] This Protocol instance pointer.
1486 @param[in] ControllerHandle Handle of device to stop driver on.
1487 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
1488 children is zero stop the entire bus driver.
1489 @param[in] ChildHandleBuffer List of Child Handles to Stop.
1490 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.
1492 @retval EFI_SUCCESS This driver was removed ControllerHandle.
1493 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
1494 @retval Others This driver was not removed from this device
1500 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1501 IN EFI_HANDLE ControllerHandle
,
1502 IN UINTN NumberOfChildren
,
1503 IN EFI_HANDLE
*ChildHandleBuffer
,
1507 PXEBC_PRIVATE_DATA
*Private
;
1508 PXEBC_VIRTUAL_NIC
*VirtualNic
;
1509 EFI_LOAD_FILE_PROTOCOL
*LoadFile
;
1511 EFI_HANDLE NicHandle
;
1512 PXEBC_PRIVATE_PROTOCOL
*Id
;
1520 Status
= gBS
->OpenProtocol (
1522 &gEfiLoadFileProtocolGuid
,
1523 (VOID
**) &LoadFile
,
1524 This
->DriverBindingHandle
,
1526 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1528 if (EFI_ERROR (Status
)) {
1530 // Get the Nic handle by any pass-over service child handle.
1532 if (IpVersion
== IP_VERSION_4
) {
1533 NicHandle
= PxeBcGetNicByIp4Children (ControllerHandle
);
1535 NicHandle
= PxeBcGetNicByIp6Children (ControllerHandle
);
1537 if (NicHandle
== NULL
) {
1542 // Try to retrieve the private data by PxeBcPrivate protocol.
1544 Status
= gBS
->OpenProtocol (
1548 This
->DriverBindingHandle
,
1550 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1552 if (EFI_ERROR (Status
)) {
1555 Private
= PXEBC_PRIVATE_DATA_FROM_ID (Id
);
1559 // It's a virtual handle with LoadFileProtocol.
1561 Status
= gBS
->OpenProtocol (
1563 &gEfiLoadFileProtocolGuid
,
1564 (VOID
**) &LoadFile
,
1565 This
->DriverBindingHandle
,
1567 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1569 if (EFI_ERROR (Status
)) {
1573 VirtualNic
= PXEBC_VIRTUAL_NIC_FROM_LOADFILE (LoadFile
);
1574 Private
= VirtualNic
->Private
;
1575 NicHandle
= Private
->Controller
;
1579 // Stop functionality of PXE Base Code protocol
1581 Status
= Private
->PxeBc
.Stop (&Private
->PxeBc
);
1582 if (Status
!= EFI_SUCCESS
&& Status
!= EFI_NOT_STARTED
) {
1587 if (Private
->Ip4Nic
!= NULL
&& IpVersion
== IP_VERSION_4
) {
1588 PxeBcDestroyIp4Children (This
, Private
);
1591 if (Private
->Ip6Nic
!= NULL
&& IpVersion
== IP_VERSION_6
) {
1592 PxeBcDestroyIp6Children (This
, Private
);
1595 if (Private
->Ip4Nic
== NULL
&& Private
->Ip6Nic
== NULL
) {
1596 gBS
->UninstallProtocolInterface (
1608 Test to see if this driver supports ControllerHandle. This service
1609 is called by the EFI boot service ConnectController(). In
1610 order to make drivers as small as possible, there are a few calling
1611 restrictions for this service. ConnectController() must
1612 follow these calling restrictions. If any other agent wishes to call
1613 Supported() it must also follow these calling restrictions.
1615 @param[in] This The pointer to the driver binding protocol.
1616 @param[in] ControllerHandle The handle of device to be tested.
1617 @param[in] RemainingDevicePath Optional parameter used to pick a specific child
1618 device to be started.
1620 @retval EFI_SUCCESS This driver supports this device.
1621 @retval EFI_UNSUPPORTED This driver does not support this device.
1626 PxeBcIp4DriverBindingSupported (
1627 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1628 IN EFI_HANDLE ControllerHandle
,
1629 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
1632 return PxeBcSupported (
1635 RemainingDevicePath
,
1641 Start this driver on ControllerHandle. This service is called by the
1642 EFI boot service ConnectController(). In order to make
1643 drivers as small as possible, there are a few calling restrictions for
1644 this service. ConnectController() must follow these
1645 calling restrictions. If any other agent wishes to call Start() it
1646 must also follow these calling restrictions.
1648 @param[in] This The pointer to the driver binding protocol.
1649 @param[in] ControllerHandle The handle of device to be started.
1650 @param[in] RemainingDevicePath Optional parameter used to pick a specific child
1651 device to be started.
1653 @retval EFI_SUCCESS This driver is installed to ControllerHandle.
1654 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.
1655 @retval other This driver does not support this device.
1660 PxeBcIp4DriverBindingStart (
1661 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1662 IN EFI_HANDLE ControllerHandle
,
1663 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
1669 RemainingDevicePath
,
1675 Stop this driver on ControllerHandle. This service is called by the
1676 EFI boot service DisconnectController(). In order to
1677 make drivers as small as possible, there are a few calling
1678 restrictions for this service. DisconnectController()
1679 must follow these calling restrictions. If any other agent wishes
1680 to call Stop() it must also follow these calling restrictions.
1682 @param[in] This Protocol instance pointer.
1683 @param[in] ControllerHandle Handle of device to stop driver on
1684 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
1685 children is zero stop the entire bus driver.
1686 @param[in] ChildHandleBuffer List of Child Handles to Stop.
1688 @retval EFI_SUCCESS This driver is removed ControllerHandle
1689 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
1690 @retval Others This driver was not removed from this device.
1695 PxeBcIp4DriverBindingStop (
1696 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1697 IN EFI_HANDLE ControllerHandle
,
1698 IN UINTN NumberOfChildren
,
1699 IN EFI_HANDLE
*ChildHandleBuffer
1712 Test to see if this driver supports ControllerHandle. This service
1713 is called by the EFI boot service ConnectController(). In
1714 order to make drivers as small as possible, there are a few calling
1715 restrictions for this service. ConnectController() must
1716 follow these calling restrictions. If any other agent wishes to call
1717 Supported() it must also follow these calling restrictions.
1719 @param[in] This The pointer to the driver binding protocol.
1720 @param[in] ControllerHandle The handle of device to be tested.
1721 @param[in] RemainingDevicePath Optional parameter use to pick a specific child
1722 device to be started.
1724 @retval EFI_SUCCESS This driver supports this device.
1725 @retval EFI_UNSUPPORTED This driver does not support this device.
1730 PxeBcIp6DriverBindingSupported (
1731 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1732 IN EFI_HANDLE ControllerHandle
,
1733 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
1736 return PxeBcSupported (
1739 RemainingDevicePath
,
1745 Start this driver on ControllerHandle. This service is called by the
1746 EFI boot service ConnectController(). In order to make
1747 drivers as small as possible, there are a few calling restrictions for
1748 this service. ConnectController() must follow these
1749 calling restrictions. If any other agent wishes to call Start() it
1750 must also follow these calling restrictions.
1752 @param[in] This The pointer to the driver binding protocol.
1753 @param[in] ControllerHandle The handle of device to be started.
1754 @param[in] RemainingDevicePath Optional parameter used to pick a specific child
1755 device to be started.
1757 @retval EFI_SUCCESS This driver is installed to ControllerHandle.
1758 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.
1759 @retval other This driver does not support this device.
1764 PxeBcIp6DriverBindingStart (
1765 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1766 IN EFI_HANDLE ControllerHandle
,
1767 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
1773 RemainingDevicePath
,
1779 Stop this driver on ControllerHandle. This service is called by the
1780 EFI boot service DisconnectController(). In order to
1781 make drivers as small as possible, there are a few calling
1782 restrictions for this service. DisconnectController()
1783 must follow these calling restrictions. If any other agent wishes
1784 to call Stop() it must also follow these calling restrictions.
1786 @param[in] This Protocol instance pointer.
1787 @param[in] ControllerHandle Handle of device to stop driver on
1788 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
1789 children is zero stop the entire bus driver.
1790 @param[in] ChildHandleBuffer List of Child Handles to Stop.
1792 @retval EFI_SUCCESS This driver is removed ControllerHandle
1793 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
1794 @retval Others This driver was not removed from this device.
1799 PxeBcIp6DriverBindingStop (
1800 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
1801 IN EFI_HANDLE ControllerHandle
,
1802 IN UINTN NumberOfChildren
,
1803 IN EFI_HANDLE
*ChildHandleBuffer