3 Copyright (c) 2006, 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 "Ip4Config.h"
28 Stop all the auto configuration when the IP4 configure driver is
31 @param ImageHandle The driver that is being unloaded
33 @retval EFI_SUCCESS The driver has been ready for unload.
39 IN EFI_HANDLE ImageHandle
45 // Stop all the IP4_CONFIG instances
47 for (Index
= 0; Index
< MAX_IP4_CONFIG_IN_VARIABLE
; Index
++) {
48 if (mIp4ConfigNicList
[Index
] == NULL
) {
52 gIp4ConfigDriverBinding
.Stop (
53 &gIp4ConfigDriverBinding
,
54 mIp4ConfigNicList
[Index
]->MnpHandle
,
60 return NetLibDefaultUnload (ImageHandle
);
63 //@MT: EFI_DRIVER_ENTRY_POINT (Ip4ConfigDriverEntryPoint)
66 Ip4ConfigDriverEntryPoint (
67 IN EFI_HANDLE ImageHandle
,
68 IN EFI_SYSTEM_TABLE
*SystemTable
74 The entry point for IP4 config driver which install the driver
75 binding and component name protocol on its image.
79 ImageHandle - The Image handle of the driver
80 SystemTable - The system table
84 EFI_SUCCESS - All the related protocols are installed on the driver
85 Others - Failed to install the protocol
89 return NetLibInstallAllDriverProtocolsWithUnload (
92 &gIp4ConfigDriverBinding
,
94 &gIp4ConfigComponentName
,
103 Test to see if this driver supports ControllerHandle.
105 @param This Protocol instance pointer.
106 @param ControllerHandle Handle of device to test
107 @param RemainingDevicePath Optional parameter use to pick a specific child
110 @retval EFI_SUCCES This driver supports this device
111 @retval EFI_ALREADY_STARTED This driver is already running on this device
112 @retval other This driver does not support this device
117 Ip4ConfigDriverBindingSupported (
118 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
119 IN EFI_HANDLE ControllerHandle
,
120 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
125 Status
= gBS
->OpenProtocol (
127 &gEfiManagedNetworkServiceBindingProtocolGuid
,
129 This
->DriverBindingHandle
,
131 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
139 Start this driver on ControllerHandle.
141 @param This Protocol instance pointer.
142 @param ControllerHandle Handle of device to bind driver to
143 @param RemainingDevicePath Optional parameter use to pick a specific child
146 @retval EFI_SUCCES This driver is added to ControllerHandle
147 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
148 @retval other This driver does not support this device
153 Ip4ConfigDriverBindingStart (
154 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
155 IN EFI_HANDLE ControllerHandle
,
156 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
159 EFI_IP4_CONFIG_PROTOCOL
*Ip4Config
;
160 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
161 EFI_HANDLE MnpHandle
;
162 IP4_CONFIG_INSTANCE
*Instance
;
163 EFI_SIMPLE_NETWORK_MODE SnpMode
;
164 IP4_CONFIG_VARIABLE
*Variable
;
165 NIC_IP4_CONFIG_INFO
*NicConfig
;
166 IP4_CONFIG_VARIABLE
*NewVariable
;
171 // Check for multiple start.
173 Status
= gBS
->OpenProtocol (
175 &gEfiIp4ConfigProtocolGuid
,
177 This
->DriverBindingHandle
,
179 EFI_OPEN_PROTOCOL_GET_PROTOCOL
182 if (!EFI_ERROR (Status
)) {
183 return EFI_ALREADY_STARTED
;
187 // Create a MNP child
193 Status
= NetLibCreateServiceChild (
195 This
->DriverBindingHandle
,
196 &gEfiManagedNetworkServiceBindingProtocolGuid
,
200 if (EFI_ERROR (Status
)) {
204 Status
= gBS
->OpenProtocol (
206 &gEfiManagedNetworkProtocolGuid
,
208 This
->DriverBindingHandle
,
210 EFI_OPEN_PROTOCOL_BY_DRIVER
213 if (EFI_ERROR (Status
)) {
218 // Allocate an instance then initialize it
220 Instance
= NetAllocatePool (sizeof (IP4_CONFIG_INSTANCE
));
222 if (Instance
== NULL
) {
223 Status
= EFI_OUT_OF_RESOURCES
;
227 Instance
->Signature
= IP4_CONFIG_INSTANCE_SIGNATURE
;
228 Instance
->Controller
= ControllerHandle
;
229 Instance
->Image
= This
->DriverBindingHandle
;
231 Instance
->Ip4ConfigProtocol
= mIp4ConfigProtocolTemplate
;
232 Instance
->NicIp4Protocol
= mNicIp4ConfigProtocolTemplate
;
234 Instance
->State
= IP4_CONFIG_STATE_IDLE
;
236 Instance
->MnpHandle
= MnpHandle
;
238 Instance
->DoneEvent
= NULL
;
239 Instance
->ReconfigEvent
= NULL
;
240 Instance
->Result
= EFI_NOT_READY
;
241 Instance
->NicConfig
= NULL
;
243 Instance
->Dhcp4
= NULL
;
244 Instance
->Dhcp4Handle
= NULL
;
245 Instance
->Dhcp4Event
= NULL
;
247 Status
= Mnp
->GetModeData (Mnp
, NULL
, &SnpMode
);
249 if (EFI_ERROR (Status
) && (Status
!= EFI_NOT_STARTED
)) {
253 Instance
->NicAddr
.Type
= (UINT16
) SnpMode
.IfType
;
254 Instance
->NicAddr
.Len
= (UINT8
) SnpMode
.HwAddressSize
;
255 Instance
->NicAddr
.MacAddr
= SnpMode
.CurrentAddress
;
258 // Add it to the global list, and compose the name
260 for (Index
= 0; Index
< MAX_IP4_CONFIG_IN_VARIABLE
; Index
++) {
261 if (mIp4ConfigNicList
[Index
] == NULL
) {
262 mIp4ConfigNicList
[Index
] = Instance
;
263 Instance
->NicIndex
= Index
;
265 if (Instance
->NicAddr
.Type
== NET_IFTYPE_ETHERNET
) {
266 Instance
->NicName
[0] = 'e';
267 Instance
->NicName
[1] = 't';
268 Instance
->NicName
[2] = 'h';
269 Instance
->NicName
[3] = (UINT16
) ('0' + Index
);
270 Instance
->NicName
[4] = 0;
272 Instance
->NicName
[0] = 'u';
273 Instance
->NicName
[1] = 'n';
274 Instance
->NicName
[2] = 'k';
275 Instance
->NicName
[3] = (UINT16
) ('0' + Index
);
276 Instance
->NicName
[4] = 0;
283 if (Index
== MAX_IP4_CONFIG_IN_VARIABLE
) {
284 Status
= EFI_OUT_OF_RESOURCES
;
289 // Install the IP4_CONFIG and NIC_IP4CONFIG protocols
291 Status
= gBS
->InstallMultipleProtocolInterfaces (
293 &gEfiIp4ConfigProtocolGuid
,
294 &Instance
->Ip4ConfigProtocol
,
295 &gEfiNicIp4ConfigProtocolGuid
,
296 &Instance
->NicIp4Protocol
,
300 if (EFI_ERROR (Status
)) {
301 mIp4ConfigNicList
[Index
] = NULL
;
306 // Get the previous configure parameters. If an error happend here,
307 // just ignore it because the driver should be able to operate.
309 Variable
= Ip4ConfigReadVariable ();
311 if (Variable
== NULL
) {
315 NicConfig
= Ip4ConfigFindNicVariable (Variable
, &Instance
->NicAddr
);
317 if (NicConfig
== NULL
) {
322 // Don't modify the permant static configuration
324 if (NicConfig
->Perment
&& (NicConfig
->Source
== IP4_CONFIG_SOURCE_STATIC
)) {
329 // Delete the non-permant configuration and remove the previous
330 // acquired DHCP parameters. Only doing DHCP itself is permant
334 if (!NicConfig
->Perment
) {
335 NewVariable
= Ip4ConfigModifyVariable (Variable
, &Instance
->NicAddr
, NULL
);
337 } else if (NicConfig
->Source
== IP4_CONFIG_SOURCE_DHCP
) {
338 NetZeroMem (&NicConfig
->Ip4Info
, sizeof (EFI_IP4_IPCONFIG_DATA
));
339 NewVariable
= Ip4ConfigModifyVariable (Variable
, &Instance
->NicAddr
, NicConfig
);
343 Ip4ConfigWriteVariable (NewVariable
);
345 if (NewVariable
!= NULL
) {
346 NetFreePool (NewVariable
);
350 NetFreePool (Variable
);
352 if (NicConfig
!= NULL
) {
353 NetFreePool (NicConfig
);
359 if (Instance
!= NULL
) {
360 NetFreePool (Instance
);
366 &gEfiManagedNetworkProtocolGuid
,
367 This
->DriverBindingHandle
,
372 NetLibDestroyServiceChild (
374 This
->DriverBindingHandle
,
375 &gEfiManagedNetworkProtocolGuid
,
384 Stop this driver on ControllerHandle.
386 @param This Protocol instance pointer.
387 @param ControllerHandle Handle of device to stop driver on
388 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
389 children is zero stop the entire bus driver.
390 @param ChildHandleBuffer List of Child Handles to Stop.
392 @retval EFI_SUCCES This driver is removed ControllerHandle
393 @retval other This driver was not removed from this device
398 Ip4ConfigDriverBindingStop (
399 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
400 IN EFI_HANDLE ControllerHandle
,
401 IN UINTN NumberOfChildren
,
402 IN EFI_HANDLE
*ChildHandleBuffer
405 IP4_CONFIG_INSTANCE
*Instance
;
406 EFI_IP4_CONFIG_PROTOCOL
*Ip4Config
;
407 EFI_HANDLE NicHandle
;
411 // IP4_CONFIG instance opens an MNP child. It may also create and open
412 // a DHCP child. If this is the DHCP handle, stop the DHCP process. If
413 // it is the MNP child, stop the whole driver.
416 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiDhcp4ProtocolGuid
);
418 if (NicHandle
!= NULL
) {
420 // Get our context back then clean the DHCP up. Notify the user if necessary.
422 Status
= gBS
->OpenProtocol (
424 &gEfiIp4ConfigProtocolGuid
,
425 (VOID
**) &Ip4Config
,
426 This
->DriverBindingHandle
,
428 EFI_OPEN_PROTOCOL_GET_PROTOCOL
431 if (EFI_ERROR (Status
)) {
435 Instance
= IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config
);
436 ASSERT (ControllerHandle
== Instance
->Dhcp4Handle
);
438 Ip4ConfigCleanDhcp4 (Instance
);
440 Instance
->State
= IP4_CONFIG_STATE_CONFIGURED
;
441 Instance
->Result
= EFI_DEVICE_ERROR
;
443 if (Instance
->DoneEvent
!= NULL
) {
444 gBS
->SignalEvent (Instance
->DoneEvent
);
451 // This is a MNP handle, stop the whole driver
453 NicHandle
= NetLibGetNicHandle (ControllerHandle
, &gEfiManagedNetworkProtocolGuid
);
455 if (NicHandle
== NULL
) {
460 // Get our context back.
462 Status
= gBS
->OpenProtocol (
464 &gEfiIp4ConfigProtocolGuid
,
465 (VOID
**) &Ip4Config
,
466 This
->DriverBindingHandle
,
468 EFI_OPEN_PROTOCOL_GET_PROTOCOL
471 if (EFI_ERROR (Status
)) {
475 Instance
= IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config
);
478 // Unload the protocols first to inform the top drivers
480 Status
= gBS
->UninstallMultipleProtocolInterfaces (
482 &gEfiIp4ConfigProtocolGuid
,
483 &Instance
->Ip4ConfigProtocol
,
484 &gEfiNicIp4ConfigProtocolGuid
,
485 &Instance
->NicIp4Protocol
,
489 if (EFI_ERROR (Status
)) {
494 // Release all the resources
496 if (Instance
->MnpHandle
!= NULL
) {
499 &gEfiManagedNetworkProtocolGuid
,
500 This
->DriverBindingHandle
,
504 NetLibDestroyServiceChild (
507 &gEfiManagedNetworkServiceBindingProtocolGuid
,
511 Instance
->Mnp
= NULL
;
512 Instance
->MnpHandle
= NULL
;
515 Ip4ConfigCleanConfig (Instance
);
516 mIp4ConfigNicList
[Instance
->NicIndex
] = NULL
;
517 NetFreePool (Instance
);
522 EFI_DRIVER_BINDING_PROTOCOL gIp4ConfigDriverBinding
= {
523 Ip4ConfigDriverBindingSupported
,
524 Ip4ConfigDriverBindingStart
,
525 Ip4ConfigDriverBindingStop
,