3 Copyright (c) 2007 - 2008, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 The driver binding for IP4 CONFIG protocol.
24 #include "PxeBcImpl.h"
28 The entry point for PxeBc driver which install the driver
29 binding and component name protocol on its image.
31 @param ImageHandle The Image handle of the driver
32 @param SystemTable The system table
39 PxeBcDriverEntryPoint (
40 IN EFI_HANDLE ImageHandle
,
41 IN EFI_SYSTEM_TABLE
*SystemTable
44 return EfiLibInstallDriverBindingComponentName2 (
56 Test to see if this driver supports ControllerHandle.
58 @param This Protocol instance pointer.
59 @param ControllerHandle Handle of device to test
60 @param RemainingDevicePath Optional parameter use to pick a specific child
64 @return EFI_ALREADY_STARTED
70 PxeBcDriverBindingSupported (
71 IN EFI_DRIVER_BINDING_PROTOCOL
* This
,
72 IN EFI_HANDLE ControllerHandle
,
73 IN EFI_DEVICE_PATH_PROTOCOL
* RemainingDevicePath OPTIONAL
76 EFI_PXE_BASE_CODE_PROTOCOL
*PxeBc
;
79 Status
= gBS
->OpenProtocol (
81 &gEfiPxeBaseCodeProtocolGuid
,
83 This
->DriverBindingHandle
,
85 EFI_OPEN_PROTOCOL_GET_PROTOCOL
88 if (!EFI_ERROR (Status
)) {
89 return EFI_ALREADY_STARTED
;
92 Status
= gBS
->OpenProtocol (
94 &gEfiDhcp4ServiceBindingProtocolGuid
,
96 This
->DriverBindingHandle
,
98 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
101 if (!EFI_ERROR (Status
)) {
103 Status
= gBS
->OpenProtocol (
105 &gEfiMtftp4ServiceBindingProtocolGuid
,
107 This
->DriverBindingHandle
,
109 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
119 Start this driver on ControllerHandle.
121 @param This Protocol instance pointer.
122 @param ControllerHandle Handle of device to bind driver to
123 @param RemainingDevicePath Optional parameter use to pick a specific child
127 @return EFI_ALREADY_STARTED
128 @return EFI_OUT_OF_RESOURCES
134 PxeBcDriverBindingStart (
135 IN EFI_DRIVER_BINDING_PROTOCOL
* This
,
136 IN EFI_HANDLE ControllerHandle
,
137 IN EFI_DEVICE_PATH_PROTOCOL
* RemainingDevicePath OPTIONAL
140 PXEBC_PRIVATE_DATA
*Private
;
144 Private
= AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA
));
145 if (Private
== NULL
) {
146 return EFI_OUT_OF_RESOURCES
;
149 Private
->Signature
= PXEBC_PRIVATE_DATA_SIGNATURE
;
150 Private
->Controller
= ControllerHandle
;
151 Private
->Image
= This
->DriverBindingHandle
;
152 CopyMem (&Private
->PxeBc
, &mPxeBcProtocolTemplate
, sizeof (Private
->PxeBc
));
153 Private
->PxeBc
.Mode
= &Private
->Mode
;
154 CopyMem (&Private
->LoadFile
, &mLoadFileProtocolTemplate
, sizeof (Private
->LoadFile
));
156 Private
->ProxyOffer
.Packet
.Offer
.Size
= PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE
;
157 Private
->Dhcp4Ack
.Packet
.Ack
.Size
= PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE
;
158 Private
->PxeReply
.Packet
.Ack
.Size
= PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE
;
160 for (Index
= 0; Index
< PXEBC_MAX_OFFER_NUM
; Index
++) {
161 Private
->Dhcp4Offers
[Index
].Packet
.Offer
.Size
= PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE
;
165 // Get the NII interface
167 Status
= gBS
->OpenProtocol (
169 &gEfiNetworkInterfaceIdentifierProtocolGuid_31
,
170 (VOID
**) &Private
->Nii
,
171 This
->DriverBindingHandle
,
173 EFI_OPEN_PROTOCOL_GET_PROTOCOL
175 if (EFI_ERROR (Status
)) {
179 Status
= NetLibCreateServiceChild (
181 This
->DriverBindingHandle
,
182 &gEfiArpServiceBindingProtocolGuid
,
185 if (EFI_ERROR (Status
)) {
189 Status
= gBS
->OpenProtocol (
191 &gEfiArpProtocolGuid
,
192 (VOID
**) &Private
->Arp
,
193 This
->DriverBindingHandle
,
195 EFI_OPEN_PROTOCOL_BY_DRIVER
197 if (EFI_ERROR (Status
)) {
201 Status
= NetLibCreateServiceChild (
203 This
->DriverBindingHandle
,
204 &gEfiDhcp4ServiceBindingProtocolGuid
,
207 if (EFI_ERROR (Status
)) {
211 Status
= gBS
->OpenProtocol (
213 &gEfiDhcp4ProtocolGuid
,
214 (VOID
**) &Private
->Dhcp4
,
215 This
->DriverBindingHandle
,
217 EFI_OPEN_PROTOCOL_BY_DRIVER
219 if (EFI_ERROR (Status
)) {
223 Status
= NetLibCreateServiceChild (
225 This
->DriverBindingHandle
,
226 &gEfiIp4ServiceBindingProtocolGuid
,
229 if (EFI_ERROR (Status
)) {
233 Status
= gBS
->OpenProtocol (
235 &gEfiIp4ProtocolGuid
,
236 (VOID
**) &Private
->Ip4
,
237 This
->DriverBindingHandle
,
239 EFI_OPEN_PROTOCOL_BY_DRIVER
241 if (EFI_ERROR (Status
)) {
245 Status
= NetLibCreateServiceChild (
247 This
->DriverBindingHandle
,
248 &gEfiMtftp4ServiceBindingProtocolGuid
,
249 &Private
->Mtftp4Child
252 if (EFI_ERROR (Status
)) {
256 Status
= gBS
->OpenProtocol (
257 Private
->Mtftp4Child
,
258 &gEfiMtftp4ProtocolGuid
,
259 (VOID
**) &Private
->Mtftp4
,
260 This
->DriverBindingHandle
,
262 EFI_OPEN_PROTOCOL_BY_DRIVER
265 if (EFI_ERROR (Status
)) {
269 Status
= NetLibCreateServiceChild (
271 This
->DriverBindingHandle
,
272 &gEfiUdp4ServiceBindingProtocolGuid
,
273 &Private
->Udp4ReadChild
276 if (EFI_ERROR (Status
)) {
281 // The UDP instance for EfiPxeBcUdpRead
283 Status
= gBS
->OpenProtocol (
284 Private
->Udp4ReadChild
,
285 &gEfiUdp4ProtocolGuid
,
286 (VOID
**) &Private
->Udp4Read
,
287 This
->DriverBindingHandle
,
289 EFI_OPEN_PROTOCOL_BY_DRIVER
292 if (EFI_ERROR (Status
)) {
297 // The UDP instance for EfiPxeBcUdpWrite
299 Status
= NetLibCreateServiceChild (
301 This
->DriverBindingHandle
,
302 &gEfiUdp4ServiceBindingProtocolGuid
,
303 &Private
->Udp4WriteChild
305 if (EFI_ERROR (Status
)) {
309 Status
= gBS
->OpenProtocol (
310 Private
->Udp4WriteChild
,
311 &gEfiUdp4ProtocolGuid
,
312 (VOID
**) &Private
->Udp4Write
,
313 This
->DriverBindingHandle
,
315 EFI_OPEN_PROTOCOL_BY_DRIVER
317 if (EFI_ERROR (Status
)) {
320 ZeroMem (&Private
->Udp4CfgData
, sizeof (EFI_UDP4_CONFIG_DATA
));
321 Private
->Udp4CfgData
.AcceptBroadcast
= FALSE
;
322 Private
->Udp4CfgData
.AcceptPromiscuous
= FALSE
;
323 Private
->Udp4CfgData
.AcceptAnyPort
= TRUE
;
324 Private
->Udp4CfgData
.AllowDuplicatePort
= TRUE
;
325 Private
->Udp4CfgData
.TypeOfService
= DEFAULT_ToS
;
326 Private
->Udp4CfgData
.TimeToLive
= DEFAULT_TTL
;
327 Private
->Udp4CfgData
.DoNotFragment
= FALSE
;
328 Private
->Udp4CfgData
.ReceiveTimeout
= 50000; // 50 milliseconds
329 Private
->Udp4CfgData
.UseDefaultAddress
= FALSE
;
331 PxeBcInitSeedPacket (&Private
->SeedPacket
, Private
->Udp4Read
);
332 Private
->MacLen
= Private
->SeedPacket
.Dhcp4
.Header
.HwAddrLen
;
333 CopyMem (&Private
->Mac
, &Private
->SeedPacket
.Dhcp4
.Header
.ClientHwAddr
[0], Private
->MacLen
);
336 ZeroMem (&Private
->Ip4ConfigData
, sizeof (EFI_IP4_CONFIG_DATA
));
337 Private
->Ip4ConfigData
.DefaultProtocol
= EFI_IP_PROTO_ICMP
;
338 Private
->Ip4ConfigData
.AcceptIcmpErrors
= TRUE
;
339 Private
->Ip4ConfigData
.TypeOfService
= DEFAULT_ToS
;
340 Private
->Ip4ConfigData
.TimeToLive
= DEFAULT_TTL
;
341 Private
->Ip4ConfigData
.DoNotFragment
= FALSE
;
342 Private
->Ip4ConfigData
.RawData
= FALSE
;
344 Status
= gBS
->InstallMultipleProtocolInterfaces (
346 &gEfiPxeBaseCodeProtocolGuid
,
348 &gEfiLoadFileProtocolGuid
,
352 if (EFI_ERROR (Status
)) {
360 if (Private
->Udp4WriteChild
!= NULL
) {
362 Private
->Udp4WriteChild
,
363 &gEfiUdp4ProtocolGuid
,
364 This
->DriverBindingHandle
,
367 NetLibDestroyServiceChild (
369 This
->DriverBindingHandle
,
370 &gEfiUdp4ServiceBindingProtocolGuid
,
371 Private
->Udp4WriteChild
375 if (Private
->Udp4ReadChild
!= NULL
) {
377 Private
->Udp4ReadChild
,
378 &gEfiUdp4ProtocolGuid
,
379 This
->DriverBindingHandle
,
382 NetLibDestroyServiceChild (
384 This
->DriverBindingHandle
,
385 &gEfiUdp4ServiceBindingProtocolGuid
,
386 Private
->Udp4ReadChild
390 if (Private
->Mtftp4Child
!= NULL
) {
392 Private
->Mtftp4Child
,
393 &gEfiMtftp4ProtocolGuid
,
394 This
->DriverBindingHandle
,
398 NetLibDestroyServiceChild (
400 This
->DriverBindingHandle
,
401 &gEfiMtftp4ServiceBindingProtocolGuid
,
406 if (Private
->Ip4Child
!= NULL
) {
409 &gEfiIp4ProtocolGuid
,
410 This
->DriverBindingHandle
,
414 NetLibDestroyServiceChild (
416 This
->DriverBindingHandle
,
417 &gEfiIp4ServiceBindingProtocolGuid
,
422 if (Private
->Dhcp4Child
!= NULL
) {
425 &gEfiDhcp4ProtocolGuid
,
426 This
->DriverBindingHandle
,
430 NetLibDestroyServiceChild (
432 This
->DriverBindingHandle
,
433 &gEfiDhcp4ServiceBindingProtocolGuid
,
438 if (Private
->ArpChild
!= NULL
) {
441 &gEfiArpProtocolGuid
,
442 This
->DriverBindingHandle
,
446 NetLibDestroyServiceChild (
448 This
->DriverBindingHandle
,
449 &gEfiArpServiceBindingProtocolGuid
,
454 gBS
->FreePool (Private
);
461 Stop this driver on ControllerHandle.
463 @param This Protocol instance pointer.
464 @param ControllerHandle Handle of device to stop driver on
465 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
466 children is zero stop the entire bus driver.
467 @param ChildHandleBuffer List of Child Handles to Stop.
470 @return EFI_DEVICE_ERROR
476 PxeBcDriverBindingStop (
477 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
478 IN EFI_HANDLE ControllerHandle
,
479 IN UINTN NumberOfChildren
,
480 IN EFI_HANDLE
*ChildHandleBuffer
483 PXEBC_PRIVATE_DATA
*Private
;
484 EFI_PXE_BASE_CODE_PROTOCOL
*PxeBc
;
485 EFI_HANDLE NicHandle
;
488 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiArpProtocolGuid
);
489 if (NicHandle
== NULL
) {
490 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
492 if (NicHandle
== NULL
) {
493 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiIp4ProtocolGuid
);
495 if (NicHandle
== NULL
) {
496 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiUdp4ProtocolGuid
);
498 if (NicHandle
== NULL
) {
499 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp4ProtocolGuid
);
501 if (NicHandle
== NULL
) {
502 return EFI_DEVICE_ERROR
;
509 Status
= gBS
->OpenProtocol (
511 &gEfiPxeBaseCodeProtocolGuid
,
513 This
->DriverBindingHandle
,
515 EFI_OPEN_PROTOCOL_GET_PROTOCOL
518 if (EFI_ERROR (Status
)) {
522 Private
= PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc
);
524 Status
= gBS
->UninstallMultipleProtocolInterfaces (
526 &gEfiPxeBaseCodeProtocolGuid
,
528 &gEfiLoadFileProtocolGuid
,
533 if (!EFI_ERROR (Status
)) {
536 Private
->Udp4WriteChild
,
537 &gEfiUdp4ProtocolGuid
,
538 This
->DriverBindingHandle
,
541 NetLibDestroyServiceChild (
543 This
->DriverBindingHandle
,
544 &gEfiUdp4ServiceBindingProtocolGuid
,
545 Private
->Udp4WriteChild
549 Private
->Udp4ReadChild
,
550 &gEfiUdp4ProtocolGuid
,
551 This
->DriverBindingHandle
,
554 NetLibDestroyServiceChild (
556 This
->DriverBindingHandle
,
557 &gEfiUdp4ServiceBindingProtocolGuid
,
558 Private
->Udp4ReadChild
563 &gEfiDhcp4ProtocolGuid
,
564 This
->DriverBindingHandle
,
567 NetLibDestroyServiceChild (
569 This
->DriverBindingHandle
,
570 &gEfiDhcp4ServiceBindingProtocolGuid
,
575 Private
->Mtftp4Child
,
576 &gEfiMtftp4ProtocolGuid
,
577 This
->DriverBindingHandle
,
580 NetLibDestroyServiceChild (
582 This
->DriverBindingHandle
,
583 &gEfiMtftp4ServiceBindingProtocolGuid
,
589 &gEfiIp4ProtocolGuid
,
590 This
->DriverBindingHandle
,
593 NetLibDestroyServiceChild (
595 This
->DriverBindingHandle
,
596 &gEfiIp4ServiceBindingProtocolGuid
,
602 &gEfiArpProtocolGuid
,
603 This
->DriverBindingHandle
,
606 NetLibDestroyServiceChild (
608 This
->DriverBindingHandle
,
609 &gEfiArpServiceBindingProtocolGuid
,
613 gBS
->FreePool (Private
);
619 EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding
= {
620 PxeBcDriverBindingSupported
,
621 PxeBcDriverBindingStart
,
622 PxeBcDriverBindingStop
,