]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - 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
1/** @file\r
2 The driver binding for IP4 CONFIG protocol.\r
3\r
4Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at<BR>\r
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
13**/\r
14\r
15\r
16#include "Ip4Config.h"\r
17#include "Ip4ConfigNv.h"\r
18#include "NicIp4Variable.h"\r
19\r
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
28\r
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
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
89\r
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
94EFI_STATUS\r
95EFIAPI\r
96Ip4ConfigDriverEntryPoint (\r
97 IN EFI_HANDLE ImageHandle,\r
98 IN EFI_SYSTEM_TABLE *SystemTable\r
99 )\r
100{\r
101 return EfiLibInstallDriverBindingComponentName2 (\r
102 ImageHandle,\r
103 SystemTable,\r
104 &gIp4ConfigDriverBinding,\r
105 ImageHandle,\r
106 &gIp4ConfigComponentName,\r
107 &gIp4ConfigComponentName2\r
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
174 NIC_IP4_CONFIG_INFO *NicConfig;\r
175 EFI_STATUS Status;\r
176 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
177\r
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
186\r
187 //\r
188 // Check for multiple start.\r
189 //\r
190 Status = gBS->OpenProtocol (\r
191 ControllerHandle,\r
192 &gEfiIp4ConfigProtocolGuid,\r
193 (VOID **) &Ip4Config,\r
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
237 Instance = AllocateCopyPool (sizeof (IP4_CONFIG_INSTANCE), &mIp4ConfigTemplate);\r
238\r
239 if (Instance == NULL) {\r
240 Status = EFI_OUT_OF_RESOURCES;\r
241 goto ON_ERROR;\r
242 }\r
243\r
244 Instance->Controller = ControllerHandle;\r
245 Instance->Image = This->DriverBindingHandle;\r
246 Instance->ParentDevicePath = ParentDevicePath;\r
247\r
248 CopyMem (&Instance->Ip4ConfigProtocol, &mIp4ConfigProtocolTemplate, sizeof (mIp4ConfigProtocolTemplate));\r
249\r
250 Instance->State = IP4_CONFIG_STATE_IDLE;\r
251 Instance->Mnp = Mnp;\r
252 Instance->MnpHandle = MnpHandle;\r
253\r
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
262 CopyMem (&Instance->NicAddr.MacAddr, &SnpMode.CurrentAddress, Instance->NicAddr.Len);\r
263\r
264 //\r
265 // Add it to the global list, and compose the name\r
266 //\r
267 Status = NetLibGetMacString (Instance->Controller, Instance->Image, &Instance->MacString);\r
268 if (EFI_ERROR (Status)) {\r
269 goto ON_ERROR;\r
270 }\r
271\r
272 Status = Ip4ConfigDeviceInit (Instance);\r
273\r
274 //\r
275 // Install the IP4_CONFIG protocols\r
276 //\r
277 Status = gBS->InstallMultipleProtocolInterfaces (\r
278 &ControllerHandle,\r
279 &gEfiIp4ConfigProtocolGuid,\r
280 &Instance->Ip4ConfigProtocol,\r
281 NULL\r
282 );\r
283\r
284 if (EFI_ERROR (Status)) {\r
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
292 NicConfig = Ip4ConfigReadVariable (Instance);\r
293 if (NicConfig != NULL) {\r
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
313 FreePool (NicConfig);\r
314 }\r
315\r
316 return EFI_SUCCESS;\r
317\r
318ON_ERROR:\r
319 if (Instance != NULL) {\r
320 FreePool (Instance);\r
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
335 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
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
437 Ip4ConfigDeviceUnload (Instance);\r
438\r
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
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
475 if (Instance->MacString != NULL) {\r
476 FreePool (Instance->MacString);\r
477 }\r
478\r
479 Ip4ConfigCleanConfig (Instance);\r
480 FreePool (Instance);\r
481\r
482 return EFI_SUCCESS;\r
483}\r