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 &gEfiMtftp4ServiceBindingProtocolGuid
,
227 &Private
->Mtftp4Child
230 if (EFI_ERROR (Status
)) {
234 Status
= gBS
->OpenProtocol (
235 Private
->Mtftp4Child
,
236 &gEfiMtftp4ProtocolGuid
,
237 (VOID
**) &Private
->Mtftp4
,
238 This
->DriverBindingHandle
,
240 EFI_OPEN_PROTOCOL_BY_DRIVER
243 if (EFI_ERROR (Status
)) {
247 Status
= NetLibCreateServiceChild (
249 This
->DriverBindingHandle
,
250 &gEfiUdp4ServiceBindingProtocolGuid
,
254 if (EFI_ERROR (Status
)) {
258 Status
= gBS
->OpenProtocol (
260 &gEfiUdp4ProtocolGuid
,
261 (VOID
**) &Private
->Udp4
,
262 This
->DriverBindingHandle
,
264 EFI_OPEN_PROTOCOL_BY_DRIVER
267 if (EFI_ERROR (Status
)) {
271 ZeroMem (&Private
->Udp4CfgData
, sizeof (EFI_UDP4_CONFIG_DATA
));
272 Private
->Udp4CfgData
.AcceptBroadcast
= FALSE
;
273 Private
->Udp4CfgData
.AcceptPromiscuous
= FALSE
;
274 Private
->Udp4CfgData
.AcceptAnyPort
= FALSE
;
275 Private
->Udp4CfgData
.AllowDuplicatePort
= TRUE
;
276 Private
->Udp4CfgData
.TypeOfService
= DEFAULT_ToS
;
277 Private
->Udp4CfgData
.TimeToLive
= DEFAULT_TTL
;
278 Private
->Udp4CfgData
.DoNotFragment
= FALSE
;
279 Private
->Udp4CfgData
.ReceiveTimeout
= 10000; // 10 milliseconds
280 Private
->Udp4CfgData
.UseDefaultAddress
= FALSE
;
282 PxeBcInitSeedPacket (&Private
->SeedPacket
, Private
->Udp4
);
284 Status
= gBS
->InstallMultipleProtocolInterfaces (
286 &gEfiPxeBaseCodeProtocolGuid
,
288 &gEfiLoadFileProtocolGuid
,
292 if (EFI_ERROR (Status
)) {
300 if (Private
->Udp4Child
!= NULL
) {
303 &gEfiUdp4ProtocolGuid
,
304 This
->DriverBindingHandle
,
307 NetLibDestroyServiceChild (
309 This
->DriverBindingHandle
,
310 &gEfiUdp4ServiceBindingProtocolGuid
,
315 if (Private
->Mtftp4Child
!= NULL
) {
317 Private
->Mtftp4Child
,
318 &gEfiMtftp4ProtocolGuid
,
319 This
->DriverBindingHandle
,
323 NetLibDestroyServiceChild (
325 This
->DriverBindingHandle
,
326 &gEfiMtftp4ServiceBindingProtocolGuid
,
331 if (Private
->Dhcp4Child
!= NULL
) {
334 &gEfiDhcp4ProtocolGuid
,
335 This
->DriverBindingHandle
,
339 NetLibDestroyServiceChild (
341 This
->DriverBindingHandle
,
342 &gEfiDhcp4ServiceBindingProtocolGuid
,
347 if (Private
->ArpChild
!= NULL
) {
350 &gEfiArpProtocolGuid
,
351 This
->DriverBindingHandle
,
355 NetLibDestroyServiceChild (
357 This
->DriverBindingHandle
,
358 &gEfiArpServiceBindingProtocolGuid
,
363 gBS
->FreePool (Private
);
370 Stop this driver on ControllerHandle.
372 @param This Protocol instance pointer.
373 @param ControllerHandle Handle of device to stop driver on
374 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
375 children is zero stop the entire bus driver.
376 @param ChildHandleBuffer List of Child Handles to Stop.
379 @return EFI_DEVICE_ERROR
385 PxeBcDriverBindingStop (
386 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
387 IN EFI_HANDLE ControllerHandle
,
388 IN UINTN NumberOfChildren
,
389 IN EFI_HANDLE
*ChildHandleBuffer
392 PXEBC_PRIVATE_DATA
*Private
;
393 EFI_PXE_BASE_CODE_PROTOCOL
*PxeBc
;
394 EFI_HANDLE NicHandle
;
397 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiArpProtocolGuid
);
399 if (NicHandle
== NULL
) {
401 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
403 if (NicHandle
== NULL
) {
405 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp4ProtocolGuid
);
407 if (NicHandle
== NULL
) {
409 return EFI_DEVICE_ERROR
;
415 Status
= gBS
->OpenProtocol (
417 &gEfiPxeBaseCodeProtocolGuid
,
419 This
->DriverBindingHandle
,
421 EFI_OPEN_PROTOCOL_GET_PROTOCOL
424 if (EFI_ERROR (Status
)) {
428 Private
= PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc
);
430 Status
= gBS
->UninstallMultipleProtocolInterfaces (
432 &gEfiPxeBaseCodeProtocolGuid
,
434 &gEfiLoadFileProtocolGuid
,
439 if (!EFI_ERROR (Status
)) {
443 &gEfiUdp4ProtocolGuid
,
444 This
->DriverBindingHandle
,
447 NetLibDestroyServiceChild (
449 This
->DriverBindingHandle
,
450 &gEfiUdp4ServiceBindingProtocolGuid
,
456 &gEfiDhcp4ProtocolGuid
,
457 This
->DriverBindingHandle
,
460 NetLibDestroyServiceChild (
462 This
->DriverBindingHandle
,
463 &gEfiDhcp4ServiceBindingProtocolGuid
,
468 Private
->Mtftp4Child
,
469 &gEfiMtftp4ProtocolGuid
,
470 This
->DriverBindingHandle
,
473 NetLibDestroyServiceChild (
475 This
->DriverBindingHandle
,
476 &gEfiMtftp4ServiceBindingProtocolGuid
,
482 &gEfiArpProtocolGuid
,
483 This
->DriverBindingHandle
,
486 NetLibDestroyServiceChild (
488 This
->DriverBindingHandle
,
489 &gEfiArpServiceBindingProtocolGuid
,
493 gBS
->FreePool (Private
);
499 EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding
= {
500 PxeBcDriverBindingSupported
,
501 PxeBcDriverBindingStart
,
502 PxeBcDriverBindingStop
,