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
);
448 if (NicHandle
== NULL
) {
450 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
452 if (NicHandle
== NULL
) {
454 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp4ProtocolGuid
);
456 if (NicHandle
== NULL
) {
458 return EFI_DEVICE_ERROR
;
464 Status
= gBS
->OpenProtocol (
466 &gEfiPxeBaseCodeProtocolGuid
,
468 This
->DriverBindingHandle
,
470 EFI_OPEN_PROTOCOL_GET_PROTOCOL
473 if (EFI_ERROR (Status
)) {
477 Private
= PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc
);
479 Status
= gBS
->UninstallMultipleProtocolInterfaces (
481 &gEfiPxeBaseCodeProtocolGuid
,
483 &gEfiLoadFileProtocolGuid
,
488 if (!EFI_ERROR (Status
)) {
492 &gEfiUdp4ProtocolGuid
,
493 This
->DriverBindingHandle
,
496 NetLibDestroyServiceChild (
498 This
->DriverBindingHandle
,
499 &gEfiUdp4ServiceBindingProtocolGuid
,
505 &gEfiDhcp4ProtocolGuid
,
506 This
->DriverBindingHandle
,
509 NetLibDestroyServiceChild (
511 This
->DriverBindingHandle
,
512 &gEfiDhcp4ServiceBindingProtocolGuid
,
517 Private
->Mtftp4Child
,
518 &gEfiMtftp4ProtocolGuid
,
519 This
->DriverBindingHandle
,
522 NetLibDestroyServiceChild (
524 This
->DriverBindingHandle
,
525 &gEfiMtftp4ServiceBindingProtocolGuid
,
531 &gEfiArpProtocolGuid
,
532 This
->DriverBindingHandle
,
535 NetLibDestroyServiceChild (
537 This
->DriverBindingHandle
,
538 &gEfiArpServiceBindingProtocolGuid
,
542 gBS
->FreePool (Private
);
548 EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding
= {
549 PxeBcDriverBindingSupported
,
550 PxeBcDriverBindingStart
,
551 PxeBcDriverBindingStop
,