3 Copyright (c) 2007, 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
= NetAllocateZeroPool (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 &gEfiDhcp4ServiceBindingProtocolGuid
,
185 if (EFI_ERROR (Status
)) {
189 Status
= gBS
->OpenProtocol (
191 &gEfiDhcp4ProtocolGuid
,
192 (VOID
**) &Private
->Dhcp4
,
193 This
->DriverBindingHandle
,
195 EFI_OPEN_PROTOCOL_BY_DRIVER
197 if (EFI_ERROR (Status
)) {
201 Status
= NetLibCreateServiceChild (
203 This
->DriverBindingHandle
,
204 &gEfiMtftp4ServiceBindingProtocolGuid
,
205 &Private
->Mtftp4Child
208 if (EFI_ERROR (Status
)) {
212 Status
= gBS
->OpenProtocol (
213 Private
->Mtftp4Child
,
214 &gEfiMtftp4ProtocolGuid
,
215 (VOID
**) &Private
->Mtftp4
,
216 This
->DriverBindingHandle
,
218 EFI_OPEN_PROTOCOL_BY_DRIVER
221 if (EFI_ERROR (Status
)) {
225 Status
= NetLibCreateServiceChild (
227 This
->DriverBindingHandle
,
228 &gEfiUdp4ServiceBindingProtocolGuid
,
232 if (EFI_ERROR (Status
)) {
236 Status
= gBS
->OpenProtocol (
238 &gEfiUdp4ProtocolGuid
,
239 (VOID
**) &Private
->Udp4
,
240 This
->DriverBindingHandle
,
242 EFI_OPEN_PROTOCOL_BY_DRIVER
245 if (EFI_ERROR (Status
)) {
249 NetZeroMem (&Private
->Udp4CfgData
, sizeof (EFI_UDP4_CONFIG_DATA
));
250 Private
->Udp4CfgData
.AcceptBroadcast
= TRUE
;
251 Private
->Udp4CfgData
.AcceptPromiscuous
= FALSE
;
252 Private
->Udp4CfgData
.AcceptAnyPort
= FALSE
;
253 Private
->Udp4CfgData
.AllowDuplicatePort
= TRUE
;
254 Private
->Udp4CfgData
.TypeOfService
= DEFAULT_ToS
;
255 Private
->Udp4CfgData
.TimeToLive
= DEFAULT_TTL
;
256 Private
->Udp4CfgData
.DoNotFragment
= FALSE
;
257 Private
->Udp4CfgData
.ReceiveTimeout
= 10000; // 10 milliseconds
258 Private
->Udp4CfgData
.UseDefaultAddress
= FALSE
;
260 PxeBcInitSeedPacket (&Private
->SeedPacket
, Private
->Udp4
);
262 Status
= gBS
->InstallMultipleProtocolInterfaces (
264 &gEfiPxeBaseCodeProtocolGuid
,
266 &gEfiLoadFileProtocolGuid
,
270 if (EFI_ERROR (Status
)) {
278 if (Private
->Udp4Child
!= NULL
) {
281 &gEfiUdp4ProtocolGuid
,
282 This
->DriverBindingHandle
,
285 NetLibDestroyServiceChild (
287 This
->DriverBindingHandle
,
288 &gEfiUdp4ProtocolGuid
,
293 if (Private
->Mtftp4Child
!= NULL
) {
295 Private
->Mtftp4Child
,
296 &gEfiMtftp4ProtocolGuid
,
297 This
->DriverBindingHandle
,
301 NetLibDestroyServiceChild (
303 This
->DriverBindingHandle
,
304 &gEfiMtftp4ProtocolGuid
,
309 if (Private
->Dhcp4Child
!= NULL
) {
312 &gEfiDhcp4ProtocolGuid
,
313 This
->DriverBindingHandle
,
317 NetLibDestroyServiceChild (
319 This
->DriverBindingHandle
,
320 &gEfiDhcp4ProtocolGuid
,
325 NetFreePool (Private
);
332 Stop this driver on ControllerHandle.
334 @param This Protocol instance pointer.
335 @param ControllerHandle Handle of device to stop driver on
336 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
337 children is zero stop the entire bus driver.
338 @param ChildHandleBuffer List of Child Handles to Stop.
341 @return EFI_DEVICE_ERROR
347 PxeBcDriverBindingStop (
348 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
349 IN EFI_HANDLE ControllerHandle
,
350 IN UINTN NumberOfChildren
,
351 IN EFI_HANDLE
*ChildHandleBuffer
354 PXEBC_PRIVATE_DATA
*Private
;
355 EFI_PXE_BASE_CODE_PROTOCOL
*PxeBc
;
356 EFI_HANDLE NicHandle
;
359 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
361 if (NicHandle
== NULL
) {
363 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiMtftp4ProtocolGuid
);
365 if (NicHandle
== NULL
) {
367 return EFI_DEVICE_ERROR
;
371 Status
= gBS
->OpenProtocol (
373 &gEfiPxeBaseCodeProtocolGuid
,
375 This
->DriverBindingHandle
,
377 EFI_OPEN_PROTOCOL_GET_PROTOCOL
380 if (EFI_ERROR (Status
)) {
384 Private
= PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc
);
386 Status
= gBS
->UninstallMultipleProtocolInterfaces (
388 &gEfiPxeBaseCodeProtocolGuid
,
390 &gEfiLoadFileProtocolGuid
,
395 if (!EFI_ERROR (Status
)) {
399 &gEfiUdp4ProtocolGuid
,
400 This
->DriverBindingHandle
,
403 NetLibDestroyServiceChild (
405 This
->DriverBindingHandle
,
406 &gEfiUdp4ServiceBindingProtocolGuid
,
412 &gEfiDhcp4ProtocolGuid
,
413 This
->DriverBindingHandle
,
416 NetLibDestroyServiceChild (
418 This
->DriverBindingHandle
,
419 &gEfiDhcp4ServiceBindingProtocolGuid
,
424 Private
->Mtftp4Child
,
425 &gEfiMtftp4ProtocolGuid
,
426 This
->DriverBindingHandle
,
429 NetLibDestroyServiceChild (
431 This
->DriverBindingHandle
,
432 &gEfiMtftp4ServiceBindingProtocolGuid
,
436 NetFreePool (Private
);
442 EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding
= {
443 PxeBcDriverBindingSupported
,
444 PxeBcDriverBindingStart
,
445 PxeBcDriverBindingStop
,