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