2 The driver binding for IP4 CONFIG protocol.
4 Copyright (c) 2006 - 2009, Intel Corporation.<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at<BR>
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "Ip4Config.h"
17 #include "Ip4ConfigNV.h"
19 EFI_DRIVER_BINDING_PROTOCOL gIp4ConfigDriverBinding
= {
20 Ip4ConfigDriverBindingSupported
,
21 Ip4ConfigDriverBindingStart
,
22 Ip4ConfigDriverBindingStop
,
29 Stop all the auto configuration when the IP4 configure driver is
32 @param ImageHandle The driver that is being unloaded
34 @retval EFI_SUCCESS The driver has been ready for unload.
40 IN EFI_HANDLE ImageHandle
45 Ip4ConfigFormUnload ();
48 // Stop all the IP4_CONFIG instances
50 for (Index
= 0; Index
< MAX_IP4_CONFIG_IN_VARIABLE
; Index
++) {
51 if (mIp4ConfigNicList
[Index
] == NULL
) {
55 gIp4ConfigDriverBinding
.Stop (
56 &gIp4ConfigDriverBinding
,
57 mIp4ConfigNicList
[Index
]->MnpHandle
,
63 return NetLibDefaultUnload (ImageHandle
);
67 The entry point for IP4 config driver which install the driver
68 binding and component name protocol on its image.
70 @param ImageHandle The image handle of the driver.
71 @param SystemTable The system table.
73 @retval EFI_SUCCES All the related protocols are installed on the driver.
74 @retval Others Failed to install protocols.
79 Ip4ConfigDriverEntryPoint (
80 IN EFI_HANDLE ImageHandle
,
81 IN EFI_SYSTEM_TABLE
*SystemTable
86 return EfiLibInstallDriverBindingComponentName2 (
89 &gIp4ConfigDriverBinding
,
91 &gIp4ConfigComponentName
,
92 &gIp4ConfigComponentName2
98 Test to see if this driver supports ControllerHandle.
100 @param This Protocol instance pointer.
101 @param ControllerHandle Handle of device to test
102 @param RemainingDevicePath Optional parameter use to pick a specific child
105 @retval EFI_SUCCES This driver supports this device
106 @retval EFI_ALREADY_STARTED This driver is already running on this device
107 @retval other This driver does not support this device
112 Ip4ConfigDriverBindingSupported (
113 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
114 IN EFI_HANDLE ControllerHandle
,
115 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
120 Status
= gBS
->OpenProtocol (
122 &gEfiManagedNetworkServiceBindingProtocolGuid
,
124 This
->DriverBindingHandle
,
126 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
134 Start this driver on ControllerHandle.
136 @param This Protocol instance pointer.
137 @param ControllerHandle Handle of device to bind driver to
138 @param RemainingDevicePath Optional parameter use to pick a specific child
141 @retval EFI_SUCCES This driver is added to ControllerHandle
142 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
143 @retval other This driver does not support this device
148 Ip4ConfigDriverBindingStart (
149 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
150 IN EFI_HANDLE ControllerHandle
,
151 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
154 EFI_IP4_CONFIG_PROTOCOL
*Ip4Config
;
155 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
156 EFI_HANDLE MnpHandle
;
157 IP4_CONFIG_INSTANCE
*Instance
;
158 EFI_SIMPLE_NETWORK_MODE SnpMode
;
159 IP4_CONFIG_VARIABLE
*Variable
;
160 NIC_IP4_CONFIG_INFO
*NicConfig
;
161 IP4_CONFIG_VARIABLE
*NewVariable
;
166 // Check for multiple start.
168 Status
= gBS
->OpenProtocol (
170 &gEfiIp4ConfigProtocolGuid
,
171 (VOID
**) &Ip4Config
,
172 This
->DriverBindingHandle
,
174 EFI_OPEN_PROTOCOL_GET_PROTOCOL
177 if (!EFI_ERROR (Status
)) {
178 return EFI_ALREADY_STARTED
;
182 // Create a MNP child
188 Status
= NetLibCreateServiceChild (
190 This
->DriverBindingHandle
,
191 &gEfiManagedNetworkServiceBindingProtocolGuid
,
195 if (EFI_ERROR (Status
)) {
199 Status
= gBS
->OpenProtocol (
201 &gEfiManagedNetworkProtocolGuid
,
203 This
->DriverBindingHandle
,
205 EFI_OPEN_PROTOCOL_BY_DRIVER
208 if (EFI_ERROR (Status
)) {
213 // Allocate an instance then initialize it
215 Instance
= AllocatePool (sizeof (IP4_CONFIG_INSTANCE
));
217 if (Instance
== NULL
) {
218 Status
= EFI_OUT_OF_RESOURCES
;
222 Instance
->Signature
= IP4_CONFIG_INSTANCE_SIGNATURE
;
223 Instance
->Controller
= ControllerHandle
;
224 Instance
->Image
= This
->DriverBindingHandle
;
226 CopyMem (&Instance
->Ip4ConfigProtocol
, &mIp4ConfigProtocolTemplate
, sizeof (mIp4ConfigProtocolTemplate
));
228 Instance
->State
= IP4_CONFIG_STATE_IDLE
;
230 Instance
->MnpHandle
= MnpHandle
;
232 Instance
->DoneEvent
= NULL
;
233 Instance
->ReconfigEvent
= NULL
;
234 Instance
->Result
= EFI_NOT_READY
;
235 Instance
->NicConfig
= NULL
;
237 Instance
->Dhcp4
= NULL
;
238 Instance
->Dhcp4Handle
= NULL
;
239 Instance
->Dhcp4Event
= NULL
;
241 Status
= Mnp
->GetModeData (Mnp
, NULL
, &SnpMode
);
243 if (EFI_ERROR (Status
) && (Status
!= EFI_NOT_STARTED
)) {
247 Instance
->NicAddr
.Type
= (UINT16
) SnpMode
.IfType
;
248 Instance
->NicAddr
.Len
= (UINT8
) SnpMode
.HwAddressSize
;
249 CopyMem (&Instance
->NicAddr
.MacAddr
, &SnpMode
.CurrentAddress
, Instance
->NicAddr
.Len
);
252 // Add it to the global list, and compose the name
254 for (Index
= 0; Index
< MAX_IP4_CONFIG_IN_VARIABLE
; Index
++) {
255 if (mIp4ConfigNicList
[Index
] == NULL
) {
256 mIp4ConfigNicList
[Index
] = Instance
;
257 Instance
->NicIndex
= Index
;
259 if (Instance
->NicAddr
.Type
== NET_IFTYPE_ETHERNET
) {
260 Instance
->NicName
[0] = 'e';
261 Instance
->NicName
[1] = 't';
262 Instance
->NicName
[2] = 'h';
263 Instance
->NicName
[3] = (UINT16
) ('0' + Index
);
264 Instance
->NicName
[4] = 0;
266 Instance
->NicName
[0] = 'u';
267 Instance
->NicName
[1] = 'n';
268 Instance
->NicName
[2] = 'k';
269 Instance
->NicName
[3] = (UINT16
) ('0' + Index
);
270 Instance
->NicName
[4] = 0;
277 if (Index
== MAX_IP4_CONFIG_IN_VARIABLE
) {
278 Status
= EFI_OUT_OF_RESOURCES
;
282 Status
= Ip4ConfigDeviceInit (Instance
);
283 if (!EFI_ERROR (Status
)) {
285 // Try to add a port configuration page for this controller.
287 Ip4ConfigUpdateForm (Instance
, TRUE
);
291 // Install the IP4_CONFIG and NIC_IP4CONFIG protocols
293 Status
= gBS
->InstallMultipleProtocolInterfaces (
295 &gEfiIp4ConfigProtocolGuid
,
296 &Instance
->Ip4ConfigProtocol
,
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 ZeroMem (&NicConfig
->Ip4Info
, sizeof (EFI_IP4_IPCONFIG_DATA
));
339 NewVariable
= Ip4ConfigModifyVariable (Variable
, &Instance
->NicAddr
, NicConfig
);
343 Ip4ConfigWriteVariable (NewVariable
);
345 if (NewVariable
!= NULL
) {
346 gBS
->FreePool (NewVariable
);
350 gBS
->FreePool (Variable
);
352 if (NicConfig
!= NULL
) {
353 gBS
->FreePool (NicConfig
);
359 if (Instance
!= NULL
) {
360 gBS
->FreePool (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
);
477 Ip4ConfigDeviceUnload (Instance
);
480 // Unload the protocols first to inform the top drivers
482 Status
= gBS
->UninstallMultipleProtocolInterfaces (
484 &gEfiIp4ConfigProtocolGuid
,
485 &Instance
->Ip4ConfigProtocol
,
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 gBS
->FreePool (Instance
);