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