]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4.c
Fix component name bugs when input Controller Name is invalid
[mirror_edk2.git] / EdkModulePkg / Universal / Network / PxeDhcp4 / Dxe / PxeDhcp4.c
CommitLineData
878ddf1f 1/*++\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 PxeDhcp4.c\r
14 \r
15Abstract:\r
16\r
17--*/\r
18\r
19\r
20#include "PxeDhcp4.h"\r
21\r
22/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
23\r
24//\r
25// Prototypes\r
26// Driver model protocol interface\r
27//\r
28EFI_STATUS\r
29EFIAPI\r
30PxeDhcp4DriverEntryPoint (\r
31 IN EFI_HANDLE ImageHandle,\r
32 IN EFI_SYSTEM_TABLE *SystemTable\r
33 );\r
34\r
35EFI_STATUS\r
36EFIAPI\r
37PxeDhcp4DriverBindingSupported (\r
38 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
39 IN EFI_HANDLE ControllerHandle,\r
40 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
41 );\r
42\r
43EFI_STATUS\r
44EFIAPI\r
45PxeDhcp4DriverBindingStart (\r
46 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
47 IN EFI_HANDLE ControllerHandle,\r
48 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
49 );\r
50\r
51EFI_STATUS\r
52EFIAPI\r
53PxeDhcp4DriverBindingStop (\r
54 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
55 IN EFI_HANDLE ControllerHandle,\r
56 IN UINTN NumberOfChildren,\r
57 IN EFI_HANDLE *ChildHandleBuffer\r
58 );\r
59\r
60/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
61\r
62//\r
63// PXE DHCP Protocol Interface\r
64//\r
65EFI_DRIVER_BINDING_PROTOCOL gPxeDhcp4DriverBinding = {\r
66 PxeDhcp4DriverBindingSupported,\r
67 PxeDhcp4DriverBindingStart,\r
68 PxeDhcp4DriverBindingStop,\r
61fb1657 69 0xa,\r
878ddf1f 70 NULL,\r
71 NULL\r
72};\r
73\r
74/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
75EFI_STATUS\r
76EFIAPI\r
77PxeDhcp4DriverBindingSupported (\r
78 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
79 IN EFI_HANDLE ControllerHandle,\r
80 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
81 )\r
82/*++\r
83\r
84 Routine Description:\r
85 Test to see if this driver supports ControllerHandle. Any\r
86 ControllerHandle that contains a PxeBaseCode protocol can be\r
87 supported.\r
88\r
89 Arguments:\r
90 This - Protocol instance pointer.\r
91 ControllerHandle - Handle of device to test.\r
92 RemainingDevicePath - Not used.\r
93\r
94 Returns:\r
95 EFI_SUCCESS - This driver supports this device.\r
96 EFI_ALREADY_STARTED - This driver is already running on this\r
97 device.\r
98 other - This driver does not support this device.\r
99\r
100--*/\r
101{\r
102 EFI_STATUS Status;\r
103 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
104\r
105 //\r
106 // Open the IO Abstraction(s) needed to perform the supported test.\r
107 //\r
108 Status = gBS->OpenProtocol (\r
109 ControllerHandle,\r
110 &gEfiPxeBaseCodeProtocolGuid,\r
111 (VOID **) &PxeBc,\r
112 This->DriverBindingHandle,\r
113 ControllerHandle,\r
114 EFI_OPEN_PROTOCOL_BY_DRIVER\r
115 );\r
116\r
117 if (EFI_ERROR (Status)) {\r
118 return Status;\r
119 }\r
120 //\r
121 // Close the I/O Abstraction(s) used to perform the supported test.\r
122 //\r
123 return gBS->CloseProtocol (\r
124 ControllerHandle,\r
125 &gEfiPxeBaseCodeProtocolGuid,\r
126 This->DriverBindingHandle,\r
127 ControllerHandle\r
128 );\r
129}\r
130\r
131/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
132EFI_STATUS\r
133EFIAPI\r
134PxeDhcp4DriverBindingStart (\r
135 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
136 IN EFI_HANDLE ControllerHandle,\r
137 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
138 )\r
139/*++\r
140\r
141 Routine Description:\r
142 Start this driver on ControllerHandle by opening a PxeBaseCode\r
143 protocol and installing a PxeDhcp4 protocol on ControllerHandle.\r
144\r
145 Arguments:\r
146 This - Protocol instance pointer.\r
147 ControllerHandle - Handle of device to bind driver to.\r
148 RemainingDevicePath - Not used, always produce all possible\r
149 children.\r
150\r
151 Returns:\r
152 EFI_SUCCESS - This driver is added to ControllerHandle.\r
153 EFI_ALREADY_STARTED - This driver is already running on\r
154 ControllerHandle.\r
155 other - This driver does not support this device.\r
156\r
157--*/\r
158{\r
159 EFI_STATUS Status;\r
160 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
161 EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
162 PXE_DHCP4_PRIVATE_DATA *Private;\r
163\r
164 //\r
165 // Connect to the PxeBaseCode interface on ControllerHandle.\r
166 //\r
167 Status = gBS->OpenProtocol (\r
168 ControllerHandle,\r
169 &gEfiPxeBaseCodeProtocolGuid,\r
170 (VOID **) &PxeBc,\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 return Status;\r
178 }\r
179 //\r
180 // BaseCode has already grabbed the SimpleNetwork interface\r
181 // so just do a HandleProtocol() to get it.\r
182 //\r
183 Status = gBS->HandleProtocol (\r
184 ControllerHandle,\r
185 &gEfiSimpleNetworkProtocolGuid,\r
186 (VOID **) &Snp\r
187 );\r
188\r
189 if (EFI_ERROR (Status)) {\r
190 goto error_exit;\r
191 }\r
192\r
193 ASSERT (Snp);\r
194\r
195 //\r
196 // Initialize the PXE DHCP device instance.\r
197 //\r
198 Status = gBS->AllocatePool (\r
199 EfiBootServicesData,\r
200 sizeof (PXE_DHCP4_PRIVATE_DATA),\r
201 (VOID **) &Private\r
202 );\r
203\r
204 if (EFI_ERROR (Status)) {\r
205 goto error_exit;\r
206 }\r
207 //\r
208 //\r
209 //\r
210 ZeroMem (Private, sizeof (PXE_DHCP4_PRIVATE_DATA));\r
211\r
212 Private->Signature = PXE_DHCP4_PRIVATE_DATA_SIGNATURE;\r
213 Private->PxeBc = PxeBc;\r
214 Private->Snp = Snp;\r
215 Private->Handle = ControllerHandle;\r
216 Private->PxeDhcp4.Revision = EFI_PXE_DHCP4_PROTOCOL_REVISION;\r
217 Private->PxeDhcp4.Run = PxeDhcp4Run;\r
218 Private->PxeDhcp4.Setup = PxeDhcp4Setup;\r
219 Private->PxeDhcp4.Init = PxeDhcp4Init;\r
220 Private->PxeDhcp4.Select = PxeDhcp4Select;\r
221 Private->PxeDhcp4.Renew = PxeDhcp4Renew;\r
222 Private->PxeDhcp4.Rebind = PxeDhcp4Rebind;\r
223 Private->PxeDhcp4.Release = PxeDhcp4Release;\r
224 Private->PxeDhcp4.Data = NULL;\r
225\r
226 //\r
227 // Install protocol interfaces for the PXE DHCP device.\r
228 //\r
229 Status = gBS->InstallProtocolInterface (\r
230 &ControllerHandle,\r
231 &gEfiPxeDhcp4ProtocolGuid,\r
232 EFI_NATIVE_INTERFACE,\r
233 &Private->PxeDhcp4\r
234 );\r
235\r
236 if (!EFI_ERROR (Status)) {\r
237 return Status;\r
238 }\r
239\r
240error_exit: ;\r
241 gBS->CloseProtocol (\r
242 ControllerHandle,\r
243 &gEfiPxeBaseCodeProtocolGuid,\r
244 This->DriverBindingHandle,\r
245 ControllerHandle\r
246 );\r
247\r
248 return Status;\r
249}\r
250\r
251/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
252EFI_STATUS\r
253EFIAPI\r
254PxeDhcp4DriverBindingStop (\r
255 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
256 IN EFI_HANDLE ControllerHandle,\r
257 IN UINTN NumberOfChildren,\r
258 IN EFI_HANDLE *ChildHandleBuffer\r
259 )\r
260/*++\r
261\r
262 Routine Description:\r
263 Stop this driver on ControllerHandle by removing PXE DHCP\r
264 protocol and closing the PXE Base Code protocol on\r
265 ControllerHandle.\r
266\r
267 Arguments:\r
268 This - Protocol instance pointer.\r
269 ControllerHandle - Handle of device to stop driver on.\r
270 NumberOfChildren - Not used.\r
271 ChildHandleBuffer - Not used.\r
272\r
273 Returns:\r
274 EFI_SUCCESS - This driver is removed ControllerHandle.\r
275 other - This driver was not removed from this\r
276 device.\r
277\r
278--*/\r
279{\r
280 EFI_STATUS Status;\r
281 EFI_PXE_DHCP4_PROTOCOL *PxeDhcp4;\r
282 PXE_DHCP4_PRIVATE_DATA *Private;\r
283\r
284 //\r
285 // Get our context back.\r
286 //\r
287 Status = gBS->OpenProtocol (\r
288 ControllerHandle,\r
289 &gEfiPxeDhcp4ProtocolGuid,\r
290 (VOID **) &PxeDhcp4,\r
291 This->DriverBindingHandle,\r
292 ControllerHandle,\r
293 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
294 );\r
295\r
296 if (EFI_ERROR (Status)) {\r
297 return EFI_UNSUPPORTED;\r
298 }\r
299\r
300 Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (PxeDhcp4);\r
301\r
302 //\r
303 // Release allocated resources\r
304 //\r
305 if (Private->PxeDhcp4.Data) {\r
306 gBS->FreePool (Private->PxeDhcp4.Data);\r
307 Private->PxeDhcp4.Data = NULL;\r
308 }\r
309 //\r
310 // Uninstall our protocol\r
311 //\r
312 Status = gBS->UninstallProtocolInterface (\r
313 ControllerHandle,\r
314 &gEfiPxeDhcp4ProtocolGuid,\r
315 &Private->PxeDhcp4\r
316 );\r
317\r
318 if (EFI_ERROR (Status)) {\r
319 return Status;\r
320 }\r
321 //\r
322 // Close any consumed protocols\r
323 //\r
324 Status = gBS->CloseProtocol (\r
325 ControllerHandle,\r
326 &gEfiPxeBaseCodeProtocolGuid,\r
327 This->DriverBindingHandle,\r
328 ControllerHandle\r
329 );\r
330\r
331 if (EFI_ERROR (Status)) {\r
332 return Status;\r
333 }\r
334 //\r
335 // Release our private data\r
336 //\r
337 gBS->FreePool (Private);\r
338\r
339 return Status;\r
340}\r
341\r
342/* EOF - PxeDhcp4.c */\r