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
,
276 if (EFI_ERROR (Status
)) {
280 Status
= gBS
->OpenProtocol (
282 &gEfiUdp4ProtocolGuid
,
283 (VOID
**) &Private
->Udp4
,
284 This
->DriverBindingHandle
,
286 EFI_OPEN_PROTOCOL_BY_DRIVER
289 if (EFI_ERROR (Status
)) {
293 ZeroMem (&Private
->Udp4CfgData
, sizeof (EFI_UDP4_CONFIG_DATA
));
294 Private
->Udp4CfgData
.AcceptBroadcast
= FALSE
;
295 Private
->Udp4CfgData
.AcceptPromiscuous
= FALSE
;
296 Private
->Udp4CfgData
.AcceptAnyPort
= FALSE
;
297 Private
->Udp4CfgData
.AllowDuplicatePort
= TRUE
;
298 Private
->Udp4CfgData
.TypeOfService
= DEFAULT_ToS
;
299 Private
->Udp4CfgData
.TimeToLive
= DEFAULT_TTL
;
300 Private
->Udp4CfgData
.DoNotFragment
= FALSE
;
301 Private
->Udp4CfgData
.ReceiveTimeout
= 10000; // 10 milliseconds
302 Private
->Udp4CfgData
.UseDefaultAddress
= FALSE
;
304 PxeBcInitSeedPacket (&Private
->SeedPacket
, Private
->Udp4
);
305 Private
->MacLen
= Private
->SeedPacket
.Dhcp4
.Header
.HwAddrLen
;
306 CopyMem (&Private
->Mac
, &Private
->SeedPacket
.Dhcp4
.Header
.ClientHwAddr
[0], Private
->MacLen
);
309 ZeroMem (&Private
->Ip4ConfigData
, sizeof (EFI_IP4_CONFIG_DATA
));
310 Private
->Ip4ConfigData
.DefaultProtocol
= EFI_IP_PROTO_ICMP
;
311 Private
->Ip4ConfigData
.AcceptIcmpErrors
= TRUE
;
312 Private
->Ip4ConfigData
.TypeOfService
= DEFAULT_ToS
;
313 Private
->Ip4ConfigData
.TimeToLive
= DEFAULT_TTL
;
314 Private
->Ip4ConfigData
.DoNotFragment
= FALSE
;
315 Private
->Ip4ConfigData
.RawData
= FALSE
;
317 Status
= gBS
->InstallMultipleProtocolInterfaces (
319 &gEfiPxeBaseCodeProtocolGuid
,
321 &gEfiLoadFileProtocolGuid
,
325 if (EFI_ERROR (Status
)) {
333 if (Private
->Udp4Child
!= NULL
) {
336 &gEfiUdp4ProtocolGuid
,
337 This
->DriverBindingHandle
,
340 NetLibDestroyServiceChild (
342 This
->DriverBindingHandle
,
343 &gEfiUdp4ServiceBindingProtocolGuid
,
348 if (Private
->Mtftp4Child
!= NULL
) {
350 Private
->Mtftp4Child
,
351 &gEfiMtftp4ProtocolGuid
,
352 This
->DriverBindingHandle
,
356 NetLibDestroyServiceChild (
358 This
->DriverBindingHandle
,
359 &gEfiMtftp4ServiceBindingProtocolGuid
,
364 if (Private
->Ip4Child
!= NULL
) {
367 &gEfiIp4ProtocolGuid
,
368 This
->DriverBindingHandle
,
372 NetLibDestroyServiceChild (
374 This
->DriverBindingHandle
,
375 &gEfiIp4ServiceBindingProtocolGuid
,
380 if (Private
->Dhcp4Child
!= NULL
) {
383 &gEfiDhcp4ProtocolGuid
,
384 This
->DriverBindingHandle
,
388 NetLibDestroyServiceChild (
390 This
->DriverBindingHandle
,
391 &gEfiDhcp4ServiceBindingProtocolGuid
,
396 if (Private
->ArpChild
!= NULL
) {
399 &gEfiArpProtocolGuid
,
400 This
->DriverBindingHandle
,
404 NetLibDestroyServiceChild (
406 This
->DriverBindingHandle
,
407 &gEfiArpServiceBindingProtocolGuid
,
412 gBS
->FreePool (Private
);
419 Stop this driver on ControllerHandle.
421 @param This Protocol instance pointer.
422 @param ControllerHandle Handle of device to stop driver on
423 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
424 children is zero stop the entire bus driver.
425 @param ChildHandleBuffer List of Child Handles to Stop.
428 @return EFI_DEVICE_ERROR
434 PxeBcDriverBindingStop (
435 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
436 IN EFI_HANDLE ControllerHandle
,
437 IN UINTN NumberOfChildren
,
438 IN EFI_HANDLE
*ChildHandleBuffer
441 PXEBC_PRIVATE_DATA
*Private
;
442 EFI_PXE_BASE_CODE_PROTOCOL
*PxeBc
;
443 EFI_HANDLE NicHandle
;
446 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiArpProtocolGuid
);
447 if (NicHandle
== NULL
) {
448 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
450 if (NicHandle
== NULL
) {
451 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiIp4ProtocolGuid
);
453 if (NicHandle
== NULL
) {
454 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiUdp4ProtocolGuid
);
456 if (NicHandle
== NULL
) {
457 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp4ProtocolGuid
);
459 if (NicHandle
== NULL
) {
460 return EFI_DEVICE_ERROR
;
467 Status
= gBS
->OpenProtocol (
469 &gEfiPxeBaseCodeProtocolGuid
,
471 This
->DriverBindingHandle
,
473 EFI_OPEN_PROTOCOL_GET_PROTOCOL
476 if (EFI_ERROR (Status
)) {
480 Private
= PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc
);
482 Status
= gBS
->UninstallMultipleProtocolInterfaces (
484 &gEfiPxeBaseCodeProtocolGuid
,
486 &gEfiLoadFileProtocolGuid
,
491 if (!EFI_ERROR (Status
)) {
495 &gEfiUdp4ProtocolGuid
,
496 This
->DriverBindingHandle
,
499 NetLibDestroyServiceChild (
501 This
->DriverBindingHandle
,
502 &gEfiUdp4ServiceBindingProtocolGuid
,
508 &gEfiDhcp4ProtocolGuid
,
509 This
->DriverBindingHandle
,
512 NetLibDestroyServiceChild (
514 This
->DriverBindingHandle
,
515 &gEfiDhcp4ServiceBindingProtocolGuid
,
520 Private
->Mtftp4Child
,
521 &gEfiMtftp4ProtocolGuid
,
522 This
->DriverBindingHandle
,
525 NetLibDestroyServiceChild (
527 This
->DriverBindingHandle
,
528 &gEfiMtftp4ServiceBindingProtocolGuid
,
534 &gEfiIp4ProtocolGuid
,
535 This
->DriverBindingHandle
,
538 NetLibDestroyServiceChild (
540 This
->DriverBindingHandle
,
541 &gEfiIp4ServiceBindingProtocolGuid
,
547 &gEfiArpProtocolGuid
,
548 This
->DriverBindingHandle
,
551 NetLibDestroyServiceChild (
553 This
->DriverBindingHandle
,
554 &gEfiArpServiceBindingProtocolGuid
,
558 gBS
->FreePool (Private
);
564 EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding
= {
565 PxeBcDriverBindingSupported
,
566 PxeBcDriverBindingStart
,
567 PxeBcDriverBindingStop
,