]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c
Fix a typo in Ip4ConfigDriverBindingStart(): it should be gEfiManagedNetworkServiceBi...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4ConfigDriver.c
CommitLineData
b2570da8 1/** @file\r
402fa70f 2 The driver binding for IP4 CONFIG protocol.\r
b2570da8 3\r
e5eed7d3
HT
4Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
b2570da8 6are licensed and made available under the terms and conditions of the BSD License\r
402fa70f 7which accompanies this distribution. The full text of the license may be found at<BR>\r
b2570da8 8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
b2570da8 13**/\r
14\r
15\r
16#include "Ip4Config.h"\r
c40a1556 17#include "Ip4ConfigNv.h"\r
74df5026 18#include "NicIp4Variable.h"\r
b2570da8 19\r
c8d8f1e3 20EFI_DRIVER_BINDING_PROTOCOL gIp4ConfigDriverBinding = {\r
21 Ip4ConfigDriverBindingSupported,\r
22 Ip4ConfigDriverBindingStart,\r
23 Ip4ConfigDriverBindingStop,\r
24 0xa,\r
25 NULL,\r
26 NULL\r
27};\r
b2570da8 28\r
72ed3d75 29//\r
30// The intance of template of IP4 Config private data\r
31//\r
32IP4_CONFIG_INSTANCE mIp4ConfigTemplate = {\r
33 IP4_CONFIG_INSTANCE_SIGNATURE,\r
34 NULL,\r
35 NULL,\r
36 (EFI_DEVICE_PATH_PROTOCOL *) NULL,\r
37 {\r
38 NULL,\r
39 NULL,\r
40 NULL\r
41 },\r
42 {\r
43 NULL,\r
44 NULL,\r
45 NULL\r
46 },\r
47 NULL,\r
48 (EFI_DEVICE_PATH_PROTOCOL *) NULL,\r
49 NULL,\r
50 {\r
51 FALSE,\r
52 FALSE,\r
53 {\r
54 0\r
55 },\r
56 {\r
57 0\r
58 },\r
59 {\r
60 0\r
61 }\r
62 },\r
63 0,\r
64 (EFI_MANAGED_NETWORK_PROTOCOL *) NULL,\r
65 NULL,\r
66 NULL,\r
67 NULL,\r
68 EFI_NOT_READY,\r
69 {\r
70 0,\r
71 0,\r
72 {\r
73 0\r
74 }\r
75 },\r
76 (CHAR16 *) NULL,\r
77 (NIC_IP4_CONFIG_INFO *) NULL,\r
78 (EFI_DHCP4_PROTOCOL *) NULL,\r
79 NULL,\r
80 NULL\r
81};\r
82\r
7bce0c5a 83/**\r
84 The entry point for IP4 config driver which install the driver\r
85 binding and component name protocol on its image.\r
86\r
87 @param ImageHandle The image handle of the driver.\r
88 @param SystemTable The system table.\r
b2570da8 89\r
7bce0c5a 90 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
91 @retval Others Failed to install protocols.\r
92\r
93**/\r
b2570da8 94EFI_STATUS\r
6d3ea23f 95EFIAPI\r
b2570da8 96Ip4ConfigDriverEntryPoint (\r
97 IN EFI_HANDLE ImageHandle,\r
98 IN EFI_SYSTEM_TABLE *SystemTable\r
99 )\r
b2570da8 100{\r
83cbd279 101 return EfiLibInstallDriverBindingComponentName2 (\r
b2570da8 102 ImageHandle,\r
103 SystemTable,\r
104 &gIp4ConfigDriverBinding,\r
105 ImageHandle,\r
106 &gIp4ConfigComponentName,\r
83cbd279 107 &gIp4ConfigComponentName2\r
b2570da8 108 );\r
109}\r
110\r
111\r
112/**\r
113 Test to see if this driver supports ControllerHandle.\r
114\r
115 @param This Protocol instance pointer.\r
116 @param ControllerHandle Handle of device to test\r
117 @param RemainingDevicePath Optional parameter use to pick a specific child\r
118 device to start.\r
119\r
120 @retval EFI_SUCCES This driver supports this device\r
121 @retval EFI_ALREADY_STARTED This driver is already running on this device\r
122 @retval other This driver does not support this device\r
123\r
124**/\r
125EFI_STATUS\r
126EFIAPI\r
127Ip4ConfigDriverBindingSupported (\r
128 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
129 IN EFI_HANDLE ControllerHandle,\r
130 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
131 )\r
132{\r
133 EFI_STATUS Status;\r
134\r
135 Status = gBS->OpenProtocol (\r
136 ControllerHandle,\r
137 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
138 NULL,\r
139 This->DriverBindingHandle,\r
140 ControllerHandle,\r
141 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
142 );\r
143\r
144 return Status;\r
145}\r
146\r
147\r
148/**\r
149 Start this driver on ControllerHandle.\r
150\r
151 @param This Protocol instance pointer.\r
152 @param ControllerHandle Handle of device to bind driver to\r
153 @param RemainingDevicePath Optional parameter use to pick a specific child\r
154 device to start.\r
155\r
156 @retval EFI_SUCCES This driver is added to ControllerHandle\r
157 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
158 @retval other This driver does not support this device\r
159\r
160**/\r
161EFI_STATUS\r
162EFIAPI\r
163Ip4ConfigDriverBindingStart (\r
164 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
165 IN EFI_HANDLE ControllerHandle,\r
166 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
167 )\r
168{\r
169 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
170 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
171 EFI_HANDLE MnpHandle;\r
172 IP4_CONFIG_INSTANCE *Instance;\r
173 EFI_SIMPLE_NETWORK_MODE SnpMode;\r
b2570da8 174 NIC_IP4_CONFIG_INFO *NicConfig;\r
b2570da8 175 EFI_STATUS Status;\r
d80ea739 176 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
c22b6cdf 177\r
d80ea739 178 Status = gBS->HandleProtocol (\r
179 ControllerHandle,\r
180 &gEfiDevicePathProtocolGuid,\r
181 (VOID **) &ParentDevicePath\r
182 );\r
183 if (EFI_ERROR (Status)) {\r
184 return Status;\r
185 }\r
b2570da8 186\r
187 //\r
188 // Check for multiple start.\r
189 //\r
190 Status = gBS->OpenProtocol (\r
191 ControllerHandle,\r
192 &gEfiIp4ConfigProtocolGuid,\r
4eb65aff 193 (VOID **) &Ip4Config,\r
b2570da8 194 This->DriverBindingHandle,\r
195 ControllerHandle,\r
196 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
197 );\r
198\r
199 if (!EFI_ERROR (Status)) {\r
200 return EFI_ALREADY_STARTED;\r
201 }\r
202\r
203 //\r
204 // Create a MNP child\r
205 //\r
206 Mnp = NULL;\r
207 MnpHandle = NULL;\r
208 Instance = NULL;\r
209\r
210 Status = NetLibCreateServiceChild (\r
211 ControllerHandle,\r
212 This->DriverBindingHandle,\r
213 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
214 &MnpHandle\r
215 );\r
216\r
217 if (EFI_ERROR (Status)) {\r
218 return Status;\r
219 }\r
220\r
221 Status = gBS->OpenProtocol (\r
222 MnpHandle,\r
223 &gEfiManagedNetworkProtocolGuid,\r
224 (VOID **) &Mnp,\r
225 This->DriverBindingHandle,\r
226 ControllerHandle,\r
227 EFI_OPEN_PROTOCOL_BY_DRIVER\r
228 );\r
229\r
230 if (EFI_ERROR (Status)) {\r
231 goto ON_ERROR;\r
232 }\r
233\r
234 //\r
235 // Allocate an instance then initialize it\r
236 //\r
72ed3d75 237 Instance = AllocateCopyPool (sizeof (IP4_CONFIG_INSTANCE), &mIp4ConfigTemplate);\r
b2570da8 238\r
239 if (Instance == NULL) {\r
240 Status = EFI_OUT_OF_RESOURCES;\r
241 goto ON_ERROR;\r
242 }\r
243\r
b2570da8 244 Instance->Controller = ControllerHandle;\r
245 Instance->Image = This->DriverBindingHandle;\r
d80ea739 246 Instance->ParentDevicePath = ParentDevicePath;\r
b2570da8 247\r
67a58d0f 248 CopyMem (&Instance->Ip4ConfigProtocol, &mIp4ConfigProtocolTemplate, sizeof (mIp4ConfigProtocolTemplate));\r
b2570da8 249\r
250 Instance->State = IP4_CONFIG_STATE_IDLE;\r
251 Instance->Mnp = Mnp;\r
252 Instance->MnpHandle = MnpHandle;\r
253\r
b2570da8 254 Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);\r
255\r
256 if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
257 goto ON_ERROR;\r
258 }\r
259\r
260 Instance->NicAddr.Type = (UINT16) SnpMode.IfType;\r
261 Instance->NicAddr.Len = (UINT8) SnpMode.HwAddressSize;\r
63886849 262 CopyMem (&Instance->NicAddr.MacAddr, &SnpMode.CurrentAddress, Instance->NicAddr.Len);\r
b2570da8 263\r
264 //\r
265 // Add it to the global list, and compose the name\r
266 //\r
74df5026 267 Status = NetLibGetMacString (Instance->Controller, Instance->Image, &Instance->MacString);\r
268 if (EFI_ERROR (Status)) {\r
b2570da8 269 goto ON_ERROR;\r
270 }\r
271\r
63886849 272 Status = Ip4ConfigDeviceInit (Instance);\r
63886849 273\r
b2570da8 274 //\r
74df5026 275 // Install the IP4_CONFIG protocols\r
b2570da8 276 //\r
277 Status = gBS->InstallMultipleProtocolInterfaces (\r
278 &ControllerHandle,\r
279 &gEfiIp4ConfigProtocolGuid,\r
280 &Instance->Ip4ConfigProtocol,\r
b2570da8 281 NULL\r
282 );\r
283\r
284 if (EFI_ERROR (Status)) {\r
b2570da8 285 goto ON_ERROR;\r
286 }\r
287\r
288 //\r
289 // Get the previous configure parameters. If an error happend here,\r
290 // just ignore it because the driver should be able to operate.\r
291 //\r
74df5026 292 NicConfig = Ip4ConfigReadVariable (Instance);\r
b2570da8 293 if (NicConfig != NULL) {\r
74df5026 294 if (NicConfig->Perment) {\r
295 if (NicConfig->Source == IP4_CONFIG_SOURCE_STATIC) {\r
296 //\r
297 // Don't modify the permanent static configuration.\r
298 //\r
299 } else if (NicConfig->Source == IP4_CONFIG_SOURCE_DHCP) {\r
300 //\r
301 // Remove the previous acquired DHCP parameters.\r
302 //\r
303 ZeroMem (&NicConfig->Ip4Info, sizeof (EFI_IP4_IPCONFIG_DATA));\r
304 Ip4ConfigWriteVariable (Instance, NicConfig);\r
305 }\r
306 } else {\r
307 //\r
308 // Delete the non-permanent configuration.\r
309 //\r
310 Ip4ConfigWriteVariable (Instance, NULL);\r
311 }\r
312\r
766c7483 313 FreePool (NicConfig);\r
b2570da8 314 }\r
315\r
316 return EFI_SUCCESS;\r
317\r
318ON_ERROR:\r
319 if (Instance != NULL) {\r
766c7483 320 FreePool (Instance);\r
b2570da8 321 }\r
322\r
323 if (Mnp != NULL) {\r
324 gBS->CloseProtocol (\r
325 MnpHandle,\r
326 &gEfiManagedNetworkProtocolGuid,\r
327 This->DriverBindingHandle,\r
328 ControllerHandle\r
329 );\r
330 }\r
331\r
332 NetLibDestroyServiceChild (\r
333 ControllerHandle,\r
334 This->DriverBindingHandle,\r
baa9a782 335 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
b2570da8 336 MnpHandle\r
337 );\r
338\r
339 return Status;\r
340}\r
341\r
342\r
343/**\r
344 Stop this driver on ControllerHandle.\r
345\r
346 @param This Protocol instance pointer.\r
347 @param ControllerHandle Handle of device to stop driver on\r
348 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
349 children is zero stop the entire bus driver.\r
350 @param ChildHandleBuffer List of Child Handles to Stop.\r
351\r
352 @retval EFI_SUCCES This driver is removed ControllerHandle\r
353 @retval other This driver was not removed from this device\r
354\r
355**/\r
356EFI_STATUS\r
357EFIAPI\r
358Ip4ConfigDriverBindingStop (\r
359 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
360 IN EFI_HANDLE ControllerHandle,\r
361 IN UINTN NumberOfChildren,\r
362 IN EFI_HANDLE *ChildHandleBuffer\r
363 )\r
364{\r
365 IP4_CONFIG_INSTANCE *Instance;\r
366 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
367 EFI_HANDLE NicHandle;\r
368 EFI_STATUS Status;\r
369\r
370 //\r
371 // IP4_CONFIG instance opens an MNP child. It may also create and open\r
372 // a DHCP child. If this is the DHCP handle, stop the DHCP process. If\r
373 // it is the MNP child, stop the whole driver.\r
374 //\r
375 //\r
376 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
377\r
378 if (NicHandle != NULL) {\r
379 //\r
380 // Get our context back then clean the DHCP up. Notify the user if necessary.\r
381 //\r
382 Status = gBS->OpenProtocol (\r
383 NicHandle,\r
384 &gEfiIp4ConfigProtocolGuid,\r
385 (VOID **) &Ip4Config,\r
386 This->DriverBindingHandle,\r
387 ControllerHandle,\r
388 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
389 );\r
390\r
391 if (EFI_ERROR (Status)) {\r
392 return Status;\r
393 }\r
394\r
395 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
396 ASSERT (ControllerHandle == Instance->Dhcp4Handle);\r
397\r
398 Ip4ConfigCleanDhcp4 (Instance);\r
399\r
400 Instance->State = IP4_CONFIG_STATE_CONFIGURED;\r
401 Instance->Result = EFI_DEVICE_ERROR;\r
402\r
403 if (Instance->DoneEvent != NULL) {\r
404 gBS->SignalEvent (Instance->DoneEvent);\r
405 }\r
406\r
407 return EFI_SUCCESS;\r
408 }\r
409\r
410 //\r
411 // This is a MNP handle, stop the whole driver\r
412 //\r
413 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
414\r
415 if (NicHandle == NULL) {\r
416 return EFI_SUCCESS;\r
417 }\r
418\r
419 //\r
420 // Get our context back.\r
421 //\r
422 Status = gBS->OpenProtocol (\r
423 NicHandle,\r
424 &gEfiIp4ConfigProtocolGuid,\r
425 (VOID **) &Ip4Config,\r
426 This->DriverBindingHandle,\r
427 ControllerHandle,\r
428 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
429 );\r
430\r
431 if (EFI_ERROR (Status)) {\r
432 return Status;\r
433 }\r
434\r
435 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
436\r
63886849 437 Ip4ConfigDeviceUnload (Instance);\r
438\r
b2570da8 439 //\r
440 // Unload the protocols first to inform the top drivers\r
441 //\r
442 Status = gBS->UninstallMultipleProtocolInterfaces (\r
443 NicHandle,\r
444 &gEfiIp4ConfigProtocolGuid,\r
445 &Instance->Ip4ConfigProtocol,\r
b2570da8 446 NULL\r
447 );\r
448\r
449 if (EFI_ERROR (Status)) {\r
450 return Status;\r
451 }\r
452\r
453 //\r
454 // Release all the resources\r
455 //\r
456 if (Instance->MnpHandle != NULL) {\r
457 gBS->CloseProtocol (\r
458 Instance->MnpHandle,\r
459 &gEfiManagedNetworkProtocolGuid,\r
460 This->DriverBindingHandle,\r
461 NicHandle\r
462 );\r
463\r
464 NetLibDestroyServiceChild (\r
465 NicHandle,\r
466 Instance->Image,\r
467 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
468 Instance->MnpHandle\r
469 );\r
470\r
471 Instance->Mnp = NULL;\r
472 Instance->MnpHandle = NULL;\r
473 }\r
474\r
74df5026 475 if (Instance->MacString != NULL) {\r
476 FreePool (Instance->MacString);\r
477 }\r
478\r
b2570da8 479 Ip4ConfigCleanConfig (Instance);\r
766c7483 480 FreePool (Instance);\r
b2570da8 481\r
482 return EFI_SUCCESS;\r
483}\r