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