]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c
Clean up the private GUID definition in module Level.
[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
9f82599a 4Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 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
9f82599a 80 NULL,\r
81 NULL,\r
82 TRUE\r
72ed3d75 83};\r
84\r
7bce0c5a 85/**\r
86 The entry point for IP4 config driver which install the driver\r
87 binding and component name protocol on its image.\r
88\r
89 @param ImageHandle The image handle of the driver.\r
90 @param SystemTable The system table.\r
b2570da8 91\r
7bce0c5a 92 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
93 @retval Others Failed to install protocols.\r
94\r
95**/\r
b2570da8 96EFI_STATUS\r
6d3ea23f 97EFIAPI\r
b2570da8 98Ip4ConfigDriverEntryPoint (\r
99 IN EFI_HANDLE ImageHandle,\r
100 IN EFI_SYSTEM_TABLE *SystemTable\r
101 )\r
b2570da8 102{\r
83cbd279 103 return EfiLibInstallDriverBindingComponentName2 (\r
b2570da8 104 ImageHandle,\r
105 SystemTable,\r
106 &gIp4ConfigDriverBinding,\r
107 ImageHandle,\r
108 &gIp4ConfigComponentName,\r
83cbd279 109 &gIp4ConfigComponentName2\r
b2570da8 110 );\r
111}\r
112\r
113\r
114/**\r
115 Test to see if this driver supports ControllerHandle.\r
116\r
117 @param This Protocol instance pointer.\r
118 @param ControllerHandle Handle of device to test\r
119 @param RemainingDevicePath Optional parameter use to pick a specific child\r
120 device to start.\r
121\r
122 @retval EFI_SUCCES This driver supports this device\r
123 @retval EFI_ALREADY_STARTED This driver is already running on this device\r
124 @retval other This driver does not support this device\r
125\r
126**/\r
127EFI_STATUS\r
128EFIAPI\r
129Ip4ConfigDriverBindingSupported (\r
130 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
131 IN EFI_HANDLE ControllerHandle,\r
132 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
133 )\r
134{\r
135 EFI_STATUS Status;\r
136\r
137 Status = gBS->OpenProtocol (\r
138 ControllerHandle,\r
139 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
140 NULL,\r
141 This->DriverBindingHandle,\r
142 ControllerHandle,\r
143 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
144 );\r
145\r
146 return Status;\r
147}\r
148\r
149\r
150/**\r
151 Start this driver on ControllerHandle.\r
152\r
153 @param This Protocol instance pointer.\r
154 @param ControllerHandle Handle of device to bind driver to\r
155 @param RemainingDevicePath Optional parameter use to pick a specific child\r
156 device to start.\r
157\r
158 @retval EFI_SUCCES This driver is added to ControllerHandle\r
159 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
160 @retval other This driver does not support this device\r
161\r
162**/\r
163EFI_STATUS\r
164EFIAPI\r
165Ip4ConfigDriverBindingStart (\r
166 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
167 IN EFI_HANDLE ControllerHandle,\r
168 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
169 )\r
170{\r
171 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
172 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
173 EFI_HANDLE MnpHandle;\r
174 IP4_CONFIG_INSTANCE *Instance;\r
175 EFI_SIMPLE_NETWORK_MODE SnpMode;\r
b2570da8 176 NIC_IP4_CONFIG_INFO *NicConfig;\r
b2570da8 177 EFI_STATUS Status;\r
d80ea739 178 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
c22b6cdf 179\r
d80ea739 180 Status = gBS->HandleProtocol (\r
181 ControllerHandle,\r
182 &gEfiDevicePathProtocolGuid,\r
183 (VOID **) &ParentDevicePath\r
184 );\r
185 if (EFI_ERROR (Status)) {\r
186 return Status;\r
187 }\r
b2570da8 188\r
189 //\r
190 // Check for multiple start.\r
191 //\r
192 Status = gBS->OpenProtocol (\r
193 ControllerHandle,\r
194 &gEfiIp4ConfigProtocolGuid,\r
4eb65aff 195 (VOID **) &Ip4Config,\r
b2570da8 196 This->DriverBindingHandle,\r
197 ControllerHandle,\r
198 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
199 );\r
200\r
201 if (!EFI_ERROR (Status)) {\r
202 return EFI_ALREADY_STARTED;\r
203 }\r
204\r
205 //\r
206 // Create a MNP child\r
207 //\r
208 Mnp = NULL;\r
209 MnpHandle = NULL;\r
210 Instance = NULL;\r
211\r
212 Status = NetLibCreateServiceChild (\r
213 ControllerHandle,\r
214 This->DriverBindingHandle,\r
215 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
216 &MnpHandle\r
217 );\r
218\r
219 if (EFI_ERROR (Status)) {\r
220 return Status;\r
221 }\r
222\r
223 Status = gBS->OpenProtocol (\r
224 MnpHandle,\r
225 &gEfiManagedNetworkProtocolGuid,\r
226 (VOID **) &Mnp,\r
227 This->DriverBindingHandle,\r
228 ControllerHandle,\r
229 EFI_OPEN_PROTOCOL_BY_DRIVER\r
230 );\r
231\r
232 if (EFI_ERROR (Status)) {\r
233 goto ON_ERROR;\r
234 }\r
235\r
236 //\r
237 // Allocate an instance then initialize it\r
238 //\r
72ed3d75 239 Instance = AllocateCopyPool (sizeof (IP4_CONFIG_INSTANCE), &mIp4ConfigTemplate);\r
b2570da8 240\r
241 if (Instance == NULL) {\r
242 Status = EFI_OUT_OF_RESOURCES;\r
243 goto ON_ERROR;\r
244 }\r
245\r
b2570da8 246 Instance->Controller = ControllerHandle;\r
247 Instance->Image = This->DriverBindingHandle;\r
d80ea739 248 Instance->ParentDevicePath = ParentDevicePath;\r
b2570da8 249\r
67a58d0f 250 CopyMem (&Instance->Ip4ConfigProtocol, &mIp4ConfigProtocolTemplate, sizeof (mIp4ConfigProtocolTemplate));\r
b2570da8 251\r
252 Instance->State = IP4_CONFIG_STATE_IDLE;\r
253 Instance->Mnp = Mnp;\r
254 Instance->MnpHandle = MnpHandle;\r
255\r
b2570da8 256 Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);\r
257\r
258 if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
259 goto ON_ERROR;\r
260 }\r
261\r
262 Instance->NicAddr.Type = (UINT16) SnpMode.IfType;\r
263 Instance->NicAddr.Len = (UINT8) SnpMode.HwAddressSize;\r
63886849 264 CopyMem (&Instance->NicAddr.MacAddr, &SnpMode.CurrentAddress, Instance->NicAddr.Len);\r
b2570da8 265\r
266 //\r
267 // Add it to the global list, and compose the name\r
268 //\r
74df5026 269 Status = NetLibGetMacString (Instance->Controller, Instance->Image, &Instance->MacString);\r
270 if (EFI_ERROR (Status)) {\r
b2570da8 271 goto ON_ERROR;\r
272 }\r
273\r
63886849 274 Status = Ip4ConfigDeviceInit (Instance);\r
63886849 275\r
b2570da8 276 //\r
74df5026 277 // Install the IP4_CONFIG protocols\r
b2570da8 278 //\r
279 Status = gBS->InstallMultipleProtocolInterfaces (\r
280 &ControllerHandle,\r
281 &gEfiIp4ConfigProtocolGuid,\r
282 &Instance->Ip4ConfigProtocol,\r
b2570da8 283 NULL\r
284 );\r
285\r
286 if (EFI_ERROR (Status)) {\r
b2570da8 287 goto ON_ERROR;\r
288 }\r
289\r
9f82599a 290 //\r
291 // A dedicated timer is used to poll underlying media status.\r
292 //\r
293 Status = gBS->CreateEvent (\r
294 EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
295 TPL_CALLBACK,\r
296 MediaChangeDetect,\r
297 Instance,\r
298 &Instance->Timer\r
299 );\r
300\r
301 if (EFI_ERROR (Status)) {\r
302 goto ON_ERROR;\r
303 }\r
304\r
b2570da8 305 //\r
306 // Get the previous configure parameters. If an error happend here,\r
307 // just ignore it because the driver should be able to operate.\r
308 //\r
74df5026 309 NicConfig = Ip4ConfigReadVariable (Instance);\r
b2570da8 310 if (NicConfig != NULL) {\r
afbccd0a 311 if (!NicConfig->Perment) {\r
74df5026 312 //\r
313 // Delete the non-permanent configuration.\r
314 //\r
315 Ip4ConfigWriteVariable (Instance, NULL);\r
316 }\r
317\r
766c7483 318 FreePool (NicConfig);\r
b2570da8 319 }\r
320\r
321 return EFI_SUCCESS;\r
322\r
323ON_ERROR:\r
324 if (Instance != NULL) {\r
766c7483 325 FreePool (Instance);\r
b2570da8 326 }\r
327\r
328 if (Mnp != NULL) {\r
329 gBS->CloseProtocol (\r
330 MnpHandle,\r
331 &gEfiManagedNetworkProtocolGuid,\r
332 This->DriverBindingHandle,\r
333 ControllerHandle\r
334 );\r
335 }\r
336\r
337 NetLibDestroyServiceChild (\r
338 ControllerHandle,\r
339 This->DriverBindingHandle,\r
baa9a782 340 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
b2570da8 341 MnpHandle\r
342 );\r
343\r
344 return Status;\r
345}\r
346\r
347\r
348/**\r
349 Stop this driver on ControllerHandle.\r
350\r
351 @param This Protocol instance pointer.\r
352 @param ControllerHandle Handle of device to stop driver on\r
353 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
354 children is zero stop the entire bus driver.\r
355 @param ChildHandleBuffer List of Child Handles to Stop.\r
356\r
357 @retval EFI_SUCCES This driver is removed ControllerHandle\r
358 @retval other This driver was not removed from this device\r
359\r
360**/\r
361EFI_STATUS\r
362EFIAPI\r
363Ip4ConfigDriverBindingStop (\r
364 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
365 IN EFI_HANDLE ControllerHandle,\r
366 IN UINTN NumberOfChildren,\r
367 IN EFI_HANDLE *ChildHandleBuffer\r
368 )\r
369{\r
370 IP4_CONFIG_INSTANCE *Instance;\r
371 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
372 EFI_HANDLE NicHandle;\r
373 EFI_STATUS Status;\r
374\r
375 //\r
376 // IP4_CONFIG instance opens an MNP child. It may also create and open\r
377 // a DHCP child. If this is the DHCP handle, stop the DHCP process. If\r
378 // it is the MNP child, stop the whole driver.\r
379 //\r
380 //\r
381 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
382\r
383 if (NicHandle != NULL) {\r
384 //\r
385 // Get our context back then clean the DHCP up. Notify the user if necessary.\r
386 //\r
387 Status = gBS->OpenProtocol (\r
388 NicHandle,\r
389 &gEfiIp4ConfigProtocolGuid,\r
390 (VOID **) &Ip4Config,\r
391 This->DriverBindingHandle,\r
392 ControllerHandle,\r
393 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
394 );\r
395\r
396 if (EFI_ERROR (Status)) {\r
397 return Status;\r
398 }\r
399\r
400 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
401 ASSERT (ControllerHandle == Instance->Dhcp4Handle);\r
402\r
403 Ip4ConfigCleanDhcp4 (Instance);\r
404\r
405 Instance->State = IP4_CONFIG_STATE_CONFIGURED;\r
406 Instance->Result = EFI_DEVICE_ERROR;\r
407\r
408 if (Instance->DoneEvent != NULL) {\r
409 gBS->SignalEvent (Instance->DoneEvent);\r
410 }\r
411\r
412 return EFI_SUCCESS;\r
413 }\r
414\r
415 //\r
416 // This is a MNP handle, stop the whole driver\r
417 //\r
418 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
419\r
420 if (NicHandle == NULL) {\r
421 return EFI_SUCCESS;\r
422 }\r
423\r
424 //\r
425 // Get our context back.\r
426 //\r
427 Status = gBS->OpenProtocol (\r
428 NicHandle,\r
429 &gEfiIp4ConfigProtocolGuid,\r
430 (VOID **) &Ip4Config,\r
431 This->DriverBindingHandle,\r
432 ControllerHandle,\r
433 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
434 );\r
435\r
436 if (EFI_ERROR (Status)) {\r
437 return Status;\r
438 }\r
439\r
440 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
441\r
63886849 442 Ip4ConfigDeviceUnload (Instance);\r
443\r
b2570da8 444 //\r
445 // Unload the protocols first to inform the top drivers\r
446 //\r
447 Status = gBS->UninstallMultipleProtocolInterfaces (\r
448 NicHandle,\r
449 &gEfiIp4ConfigProtocolGuid,\r
450 &Instance->Ip4ConfigProtocol,\r
b2570da8 451 NULL\r
452 );\r
453\r
454 if (EFI_ERROR (Status)) {\r
455 return Status;\r
456 }\r
457\r
458 //\r
459 // Release all the resources\r
460 //\r
461 if (Instance->MnpHandle != NULL) {\r
462 gBS->CloseProtocol (\r
463 Instance->MnpHandle,\r
464 &gEfiManagedNetworkProtocolGuid,\r
465 This->DriverBindingHandle,\r
466 NicHandle\r
467 );\r
468\r
469 NetLibDestroyServiceChild (\r
470 NicHandle,\r
471 Instance->Image,\r
472 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
473 Instance->MnpHandle\r
474 );\r
475\r
476 Instance->Mnp = NULL;\r
477 Instance->MnpHandle = NULL;\r
478 }\r
479\r
74df5026 480 if (Instance->MacString != NULL) {\r
481 FreePool (Instance->MacString);\r
482 }\r
483\r
9f82599a 484 if (Instance->Timer != NULL) {\r
485 gBS->SetTimer (Instance->Timer, TimerCancel, 0);\r
486 gBS->CloseEvent (Instance->Timer);\r
487 Instance->Timer = NULL;\r
488 }\r
489 \r
b2570da8 490 Ip4ConfigCleanConfig (Instance);\r
766c7483 491 FreePool (Instance);\r
b2570da8 492\r
493 return EFI_SUCCESS;\r
494}\r