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