]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
Fixed one bug in UefiPxeBc start()/stop(). That would cause stop() failure.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcDriver.c
CommitLineData
dc361cc5 1/** @file\r
2\r
51dc1f65 3Copyright (c) 2007 - 2008, Intel Corporation\r
dc361cc5 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 PxeBcDriver.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 "PxeBcImpl.h"\r
25\r
26\r
27/**\r
28 The entry point for PxeBc driver which install the driver\r
29 binding and component name protocol on its image.\r
30\r
31 @param ImageHandle The Image handle of the driver\r
32 @param SystemTable The system table\r
33\r
34 @return EFI_SUCCESS\r
35 @return Others\r
36\r
37**/\r
38EFI_STATUS\r
39PxeBcDriverEntryPoint (\r
40 IN EFI_HANDLE ImageHandle,\r
41 IN EFI_SYSTEM_TABLE *SystemTable\r
42 )\r
43{\r
44 return EfiLibInstallDriverBindingComponentName2 (\r
45 ImageHandle,\r
46 SystemTable,\r
47 &gPxeBcDriverBinding,\r
48 ImageHandle,\r
49 &gPxeBcComponentName,\r
50 &gPxeBcComponentName2\r
51 );\r
52}\r
53\r
54\r
55/**\r
56 Test to see if this driver supports ControllerHandle.\r
57\r
58 @param This Protocol instance pointer.\r
59 @param ControllerHandle Handle of device to test\r
60 @param RemainingDevicePath Optional parameter use to pick a specific child\r
61 device to start.\r
62\r
63 @return EFI_SUCCES\r
64 @return EFI_ALREADY_STARTED\r
65 @return Others\r
66\r
67**/\r
68EFI_STATUS\r
69EFIAPI\r
70PxeBcDriverBindingSupported (\r
71 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
72 IN EFI_HANDLE ControllerHandle,\r
73 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
74 )\r
75{\r
76 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
77 EFI_STATUS Status;\r
78\r
79 Status = gBS->OpenProtocol (\r
80 ControllerHandle,\r
81 &gEfiPxeBaseCodeProtocolGuid,\r
82 (VOID **) &PxeBc,\r
83 This->DriverBindingHandle,\r
84 ControllerHandle,\r
85 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
86 );\r
87\r
88 if (!EFI_ERROR (Status)) {\r
89 return EFI_ALREADY_STARTED;\r
90 }\r
91\r
92 Status = gBS->OpenProtocol (\r
93 ControllerHandle,\r
94 &gEfiDhcp4ServiceBindingProtocolGuid,\r
95 NULL,\r
96 This->DriverBindingHandle,\r
97 ControllerHandle,\r
98 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
99 );\r
100\r
101 if (!EFI_ERROR (Status)) {\r
102\r
103 Status = gBS->OpenProtocol (\r
104 ControllerHandle,\r
105 &gEfiMtftp4ServiceBindingProtocolGuid,\r
106 NULL,\r
107 This->DriverBindingHandle,\r
108 ControllerHandle,\r
109 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
110 );\r
111\r
112 }\r
113\r
114 return Status;\r
115}\r
116\r
117\r
118/**\r
119 Start this driver on ControllerHandle.\r
120\r
121 @param This Protocol instance pointer.\r
122 @param ControllerHandle Handle of device to bind driver to\r
123 @param RemainingDevicePath Optional parameter use to pick a specific child\r
124 device to start.\r
125\r
126 @return EFI_SUCCES\r
127 @return EFI_ALREADY_STARTED\r
128 @return EFI_OUT_OF_RESOURCES\r
129 @return Others\r
130\r
131**/\r
132EFI_STATUS\r
133EFIAPI\r
134PxeBcDriverBindingStart (\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 PXEBC_PRIVATE_DATA *Private;\r
141 UINTN Index;\r
142 EFI_STATUS Status;\r
143\r
144 Private = NetAllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
145 if (Private == NULL) {\r
146 return EFI_OUT_OF_RESOURCES;\r
147 }\r
148\r
149 Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
150 Private->Controller = ControllerHandle;\r
151 Private->Image = This->DriverBindingHandle;\r
152 CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));\r
153 Private->PxeBc.Mode = &Private->Mode;\r
154 CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));\r
155\r
156 Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
157 Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
158 Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
159\r
160 for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {\r
161 Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
162 }\r
163\r
164 //\r
165 // Get the NII interface\r
166 //\r
167 Status = gBS->OpenProtocol (\r
168 ControllerHandle,\r
169 &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
170 (VOID **) &Private->Nii,\r
171 This->DriverBindingHandle,\r
172 ControllerHandle,\r
173 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
174 );\r
175 if (EFI_ERROR (Status)) {\r
176 goto ON_ERROR;\r
177 }\r
178\r
179 Status = NetLibCreateServiceChild (\r
180 ControllerHandle,\r
181 This->DriverBindingHandle,\r
182 &gEfiDhcp4ServiceBindingProtocolGuid,\r
183 &Private->Dhcp4Child\r
184 );\r
185 if (EFI_ERROR (Status)) {\r
186 goto ON_ERROR;\r
187 }\r
188\r
189 Status = gBS->OpenProtocol (\r
190 Private->Dhcp4Child,\r
191 &gEfiDhcp4ProtocolGuid,\r
192 (VOID **) &Private->Dhcp4,\r
193 This->DriverBindingHandle,\r
194 ControllerHandle,\r
195 EFI_OPEN_PROTOCOL_BY_DRIVER\r
196 );\r
197 if (EFI_ERROR (Status)) {\r
198 goto ON_ERROR;\r
199 }\r
200\r
201 Status = NetLibCreateServiceChild (\r
202 ControllerHandle,\r
203 This->DriverBindingHandle,\r
204 &gEfiMtftp4ServiceBindingProtocolGuid,\r
205 &Private->Mtftp4Child\r
206 );\r
207\r
208 if (EFI_ERROR (Status)) {\r
209 goto ON_ERROR;\r
210 }\r
211\r
212 Status = gBS->OpenProtocol (\r
213 Private->Mtftp4Child,\r
214 &gEfiMtftp4ProtocolGuid,\r
215 (VOID **) &Private->Mtftp4,\r
216 This->DriverBindingHandle,\r
217 ControllerHandle,\r
218 EFI_OPEN_PROTOCOL_BY_DRIVER\r
219 );\r
220\r
221 if (EFI_ERROR (Status)) {\r
222 goto ON_ERROR;\r
223 }\r
224\r
225 Status = NetLibCreateServiceChild (\r
226 ControllerHandle,\r
227 This->DriverBindingHandle,\r
228 &gEfiUdp4ServiceBindingProtocolGuid,\r
229 &Private->Udp4Child\r
230 );\r
231\r
232 if (EFI_ERROR (Status)) {\r
233 goto ON_ERROR;\r
234 }\r
235\r
236 Status = gBS->OpenProtocol (\r
237 Private->Udp4Child,\r
238 &gEfiUdp4ProtocolGuid,\r
239 (VOID **) &Private->Udp4,\r
240 This->DriverBindingHandle,\r
241 ControllerHandle,\r
242 EFI_OPEN_PROTOCOL_BY_DRIVER\r
243 );\r
244\r
245 if (EFI_ERROR (Status)) {\r
246 goto ON_ERROR;\r
247 }\r
248\r
249 NetZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
250 Private->Udp4CfgData.AcceptBroadcast = TRUE;\r
251 Private->Udp4CfgData.AcceptPromiscuous = FALSE;\r
252 Private->Udp4CfgData.AcceptAnyPort = FALSE;\r
253 Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
254 Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;\r
255 Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;\r
256 Private->Udp4CfgData.DoNotFragment = FALSE;\r
257 Private->Udp4CfgData.ReceiveTimeout = 10000; // 10 milliseconds\r
258 Private->Udp4CfgData.UseDefaultAddress = FALSE;\r
259\r
260 PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4);\r
261\r
262 Status = gBS->InstallMultipleProtocolInterfaces (\r
263 &ControllerHandle,\r
264 &gEfiPxeBaseCodeProtocolGuid,\r
265 &Private->PxeBc,\r
266 &gEfiLoadFileProtocolGuid,\r
267 &Private->LoadFile,\r
268 NULL\r
269 );\r
270 if (EFI_ERROR (Status)) {\r
271 goto ON_ERROR;\r
272 }\r
273\r
274 return EFI_SUCCESS;\r
275\r
276ON_ERROR:\r
277\r
278 if (Private->Udp4Child != NULL) {\r
279 gBS->CloseProtocol (\r
280 Private->Udp4Child,\r
281 &gEfiUdp4ProtocolGuid,\r
282 This->DriverBindingHandle,\r
283 ControllerHandle\r
284 );\r
285 NetLibDestroyServiceChild (\r
286 ControllerHandle,\r
287 This->DriverBindingHandle,\r
51dc1f65 288 &gEfiUdp4ServiceBindingProtocolGuid,\r
dc361cc5 289 Private->Udp4Child\r
290 );\r
291 }\r
292\r
293 if (Private->Mtftp4Child != NULL) {\r
294 gBS->CloseProtocol (\r
295 Private->Mtftp4Child,\r
296 &gEfiMtftp4ProtocolGuid,\r
297 This->DriverBindingHandle,\r
298 ControllerHandle\r
299 );\r
300\r
301 NetLibDestroyServiceChild (\r
302 ControllerHandle,\r
303 This->DriverBindingHandle,\r
51dc1f65 304 &gEfiMtftp4ServiceBindingProtocolGuid,\r
dc361cc5 305 Private->Mtftp4Child\r
306 );\r
307 }\r
308\r
309 if (Private->Dhcp4Child != NULL) {\r
310 gBS->CloseProtocol (\r
311 Private->Dhcp4Child,\r
312 &gEfiDhcp4ProtocolGuid,\r
313 This->DriverBindingHandle,\r
314 ControllerHandle\r
315 );\r
316\r
317 NetLibDestroyServiceChild (\r
318 ControllerHandle,\r
319 This->DriverBindingHandle,\r
51dc1f65 320 &gEfiDhcp4ServiceBindingProtocolGuid,\r
dc361cc5 321 Private->Dhcp4Child\r
322 );\r
323 }\r
324\r
325 NetFreePool (Private);\r
326\r
327 return Status;\r
328}\r
329\r
330\r
331/**\r
332 Stop this driver on ControllerHandle.\r
333\r
334 @param This Protocol instance pointer.\r
335 @param ControllerHandle Handle of device to stop driver on\r
336 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
337 children is zero stop the entire bus driver.\r
338 @param ChildHandleBuffer List of Child Handles to Stop.\r
339\r
340 @return EFI_SUCCESS\r
341 @return EFI_DEVICE_ERROR\r
342 @return Others\r
343\r
344**/\r
345EFI_STATUS\r
346EFIAPI\r
347PxeBcDriverBindingStop (\r
348 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
349 IN EFI_HANDLE ControllerHandle,\r
350 IN UINTN NumberOfChildren,\r
351 IN EFI_HANDLE *ChildHandleBuffer\r
352 )\r
353{\r
354 PXEBC_PRIVATE_DATA *Private;\r
355 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
356 EFI_HANDLE NicHandle;\r
357 EFI_STATUS Status;\r
358\r
359 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
360\r
361 if (NicHandle == NULL) {\r
362\r
363 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
364\r
365 if (NicHandle == NULL) {\r
366\r
367 return EFI_DEVICE_ERROR;\r
368 }\r
369 }\r
370\r
371 Status = gBS->OpenProtocol (\r
372 NicHandle,\r
373 &gEfiPxeBaseCodeProtocolGuid,\r
374 (VOID **) &PxeBc,\r
375 This->DriverBindingHandle,\r
376 ControllerHandle,\r
377 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
378 );\r
379\r
380 if (EFI_ERROR (Status)) {\r
381 return Status;\r
382 }\r
383\r
384 Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);\r
385\r
386 Status = gBS->UninstallMultipleProtocolInterfaces (\r
387 NicHandle,\r
388 &gEfiPxeBaseCodeProtocolGuid,\r
389 &Private->PxeBc,\r
390 &gEfiLoadFileProtocolGuid,\r
391 &Private->LoadFile,\r
392 NULL\r
393 );\r
394\r
395 if (!EFI_ERROR (Status)) {\r
396\r
397 gBS->CloseProtocol (\r
398 Private->Udp4Child,\r
399 &gEfiUdp4ProtocolGuid,\r
400 This->DriverBindingHandle,\r
51dc1f65 401 NicHandle\r
dc361cc5 402 );\r
403 NetLibDestroyServiceChild (\r
51dc1f65 404 NicHandle,\r
dc361cc5 405 This->DriverBindingHandle,\r
406 &gEfiUdp4ServiceBindingProtocolGuid,\r
407 Private->Udp4Child\r
408 );\r
409\r
410 gBS->CloseProtocol (\r
411 Private->Dhcp4Child,\r
412 &gEfiDhcp4ProtocolGuid,\r
413 This->DriverBindingHandle,\r
51dc1f65 414 NicHandle\r
dc361cc5 415 );\r
416 NetLibDestroyServiceChild (\r
51dc1f65 417 NicHandle,\r
dc361cc5 418 This->DriverBindingHandle,\r
419 &gEfiDhcp4ServiceBindingProtocolGuid,\r
420 Private->Dhcp4Child\r
421 );\r
422\r
423 gBS->CloseProtocol (\r
424 Private->Mtftp4Child,\r
425 &gEfiMtftp4ProtocolGuid,\r
426 This->DriverBindingHandle,\r
51dc1f65 427 NicHandle\r
dc361cc5 428 );\r
429 NetLibDestroyServiceChild (\r
51dc1f65 430 NicHandle,\r
dc361cc5 431 This->DriverBindingHandle,\r
432 &gEfiMtftp4ServiceBindingProtocolGuid,\r
433 Private->Mtftp4Child\r
434 );\r
435\r
436 NetFreePool (Private);\r
437 }\r
438\r
439 return Status;\r
440}\r
441\r
442EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {\r
443 PxeBcDriverBindingSupported,\r
444 PxeBcDriverBindingStart,\r
445 PxeBcDriverBindingStop,\r
446 0xa,\r
447 NULL,\r
448 NULL\r
449};\r
450\r
451\r