]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
1. Enabled SetIpFilter() in UefiPxeBcDxe module.
[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
8d285ec0 144 CpuDeadLoop ();\r
e48e37fc 145 Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
dc361cc5 146 if (Private == NULL) {\r
147 return EFI_OUT_OF_RESOURCES;\r
148 }\r
149\r
150 Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
151 Private->Controller = ControllerHandle;\r
152 Private->Image = This->DriverBindingHandle;\r
153 CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));\r
154 Private->PxeBc.Mode = &Private->Mode;\r
155 CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));\r
156\r
157 Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
158 Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
159 Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
160\r
161 for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {\r
162 Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
163 }\r
164\r
165 //\r
166 // Get the NII interface\r
167 //\r
168 Status = gBS->OpenProtocol (\r
169 ControllerHandle,\r
170 &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
171 (VOID **) &Private->Nii,\r
172 This->DriverBindingHandle,\r
173 ControllerHandle,\r
174 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
175 );\r
176 if (EFI_ERROR (Status)) {\r
177 goto ON_ERROR;\r
178 }\r
179\r
8d285ec0 180 Status = NetLibCreateServiceChild (\r
181 ControllerHandle,\r
182 This->DriverBindingHandle,\r
183 &gEfiArpServiceBindingProtocolGuid,\r
184 &Private->ArpChild\r
185 );\r
186 if (EFI_ERROR (Status)) {\r
187 goto ON_ERROR;\r
188 }\r
189\r
190 Status = gBS->OpenProtocol (\r
191 Private->ArpChild,\r
192 &gEfiArpProtocolGuid,\r
193 (VOID **) &Private->Arp,\r
194 This->DriverBindingHandle,\r
195 ControllerHandle,\r
196 EFI_OPEN_PROTOCOL_BY_DRIVER\r
197 );\r
198 if (EFI_ERROR (Status)) {\r
199 goto ON_ERROR;\r
200 }\r
201\r
dc361cc5 202 Status = NetLibCreateServiceChild (\r
203 ControllerHandle,\r
204 This->DriverBindingHandle,\r
205 &gEfiDhcp4ServiceBindingProtocolGuid,\r
206 &Private->Dhcp4Child\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->Dhcp4Child,\r
214 &gEfiDhcp4ProtocolGuid,\r
215 (VOID **) &Private->Dhcp4,\r
216 This->DriverBindingHandle,\r
217 ControllerHandle,\r
218 EFI_OPEN_PROTOCOL_BY_DRIVER\r
219 );\r
220 if (EFI_ERROR (Status)) {\r
221 goto ON_ERROR;\r
222 }\r
223\r
224 Status = NetLibCreateServiceChild (\r
225 ControllerHandle,\r
226 This->DriverBindingHandle,\r
227 &gEfiMtftp4ServiceBindingProtocolGuid,\r
228 &Private->Mtftp4Child\r
229 );\r
230\r
231 if (EFI_ERROR (Status)) {\r
232 goto ON_ERROR;\r
233 }\r
234\r
235 Status = gBS->OpenProtocol (\r
236 Private->Mtftp4Child,\r
237 &gEfiMtftp4ProtocolGuid,\r
238 (VOID **) &Private->Mtftp4,\r
239 This->DriverBindingHandle,\r
240 ControllerHandle,\r
241 EFI_OPEN_PROTOCOL_BY_DRIVER\r
242 );\r
243\r
244 if (EFI_ERROR (Status)) {\r
245 goto ON_ERROR;\r
246 }\r
247\r
248 Status = NetLibCreateServiceChild (\r
249 ControllerHandle,\r
250 This->DriverBindingHandle,\r
251 &gEfiUdp4ServiceBindingProtocolGuid,\r
252 &Private->Udp4Child\r
253 );\r
254\r
255 if (EFI_ERROR (Status)) {\r
256 goto ON_ERROR;\r
257 }\r
258\r
259 Status = gBS->OpenProtocol (\r
260 Private->Udp4Child,\r
261 &gEfiUdp4ProtocolGuid,\r
262 (VOID **) &Private->Udp4,\r
263 This->DriverBindingHandle,\r
264 ControllerHandle,\r
265 EFI_OPEN_PROTOCOL_BY_DRIVER\r
266 );\r
267\r
268 if (EFI_ERROR (Status)) {\r
269 goto ON_ERROR;\r
270 }\r
271\r
e48e37fc 272 ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
8d285ec0 273 Private->Udp4CfgData.AcceptBroadcast = FALSE;\r
dc361cc5 274 Private->Udp4CfgData.AcceptPromiscuous = FALSE;\r
275 Private->Udp4CfgData.AcceptAnyPort = FALSE;\r
276 Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
277 Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;\r
278 Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;\r
279 Private->Udp4CfgData.DoNotFragment = FALSE;\r
280 Private->Udp4CfgData.ReceiveTimeout = 10000; // 10 milliseconds\r
281 Private->Udp4CfgData.UseDefaultAddress = FALSE;\r
282\r
283 PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4);\r
284\r
285 Status = gBS->InstallMultipleProtocolInterfaces (\r
286 &ControllerHandle,\r
287 &gEfiPxeBaseCodeProtocolGuid,\r
288 &Private->PxeBc,\r
289 &gEfiLoadFileProtocolGuid,\r
290 &Private->LoadFile,\r
291 NULL\r
292 );\r
293 if (EFI_ERROR (Status)) {\r
294 goto ON_ERROR;\r
295 }\r
296\r
297 return EFI_SUCCESS;\r
298\r
299ON_ERROR:\r
300\r
301 if (Private->Udp4Child != NULL) {\r
302 gBS->CloseProtocol (\r
303 Private->Udp4Child,\r
304 &gEfiUdp4ProtocolGuid,\r
305 This->DriverBindingHandle,\r
306 ControllerHandle\r
307 );\r
308 NetLibDestroyServiceChild (\r
309 ControllerHandle,\r
310 This->DriverBindingHandle,\r
51dc1f65 311 &gEfiUdp4ServiceBindingProtocolGuid,\r
dc361cc5 312 Private->Udp4Child\r
313 );\r
314 }\r
315\r
316 if (Private->Mtftp4Child != NULL) {\r
317 gBS->CloseProtocol (\r
318 Private->Mtftp4Child,\r
319 &gEfiMtftp4ProtocolGuid,\r
320 This->DriverBindingHandle,\r
321 ControllerHandle\r
322 );\r
323\r
324 NetLibDestroyServiceChild (\r
325 ControllerHandle,\r
326 This->DriverBindingHandle,\r
51dc1f65 327 &gEfiMtftp4ServiceBindingProtocolGuid,\r
dc361cc5 328 Private->Mtftp4Child\r
329 );\r
330 }\r
331\r
332 if (Private->Dhcp4Child != NULL) {\r
333 gBS->CloseProtocol (\r
334 Private->Dhcp4Child,\r
335 &gEfiDhcp4ProtocolGuid,\r
336 This->DriverBindingHandle,\r
337 ControllerHandle\r
338 );\r
339\r
340 NetLibDestroyServiceChild (\r
341 ControllerHandle,\r
342 This->DriverBindingHandle,\r
51dc1f65 343 &gEfiDhcp4ServiceBindingProtocolGuid,\r
dc361cc5 344 Private->Dhcp4Child\r
345 );\r
346 }\r
347\r
8d285ec0 348 if (Private->ArpChild != NULL) {\r
349 gBS->CloseProtocol (\r
350 Private->ArpChild,\r
351 &gEfiArpProtocolGuid,\r
352 This->DriverBindingHandle,\r
353 ControllerHandle\r
354 );\r
355\r
356 NetLibDestroyServiceChild (\r
357 ControllerHandle,\r
358 This->DriverBindingHandle,\r
359 &gEfiArpServiceBindingProtocolGuid,\r
360 Private->ArpChild\r
361 );\r
362 }\r
363\r
e48e37fc 364 gBS->FreePool (Private);\r
dc361cc5 365\r
366 return Status;\r
367}\r
368\r
369\r
370/**\r
371 Stop this driver on ControllerHandle.\r
372\r
373 @param This Protocol instance pointer.\r
374 @param ControllerHandle Handle of device to stop driver on\r
375 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
376 children is zero stop the entire bus driver.\r
377 @param ChildHandleBuffer List of Child Handles to Stop.\r
378\r
379 @return EFI_SUCCESS\r
380 @return EFI_DEVICE_ERROR\r
381 @return Others\r
382\r
383**/\r
384EFI_STATUS\r
385EFIAPI\r
386PxeBcDriverBindingStop (\r
387 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
388 IN EFI_HANDLE ControllerHandle,\r
389 IN UINTN NumberOfChildren,\r
390 IN EFI_HANDLE *ChildHandleBuffer\r
391 )\r
392{\r
393 PXEBC_PRIVATE_DATA *Private;\r
394 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
395 EFI_HANDLE NicHandle;\r
396 EFI_STATUS Status;\r
397\r
398 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
399\r
400 if (NicHandle == NULL) {\r
401\r
402 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
403\r
404 if (NicHandle == NULL) {\r
405\r
406 return EFI_DEVICE_ERROR;\r
407 }\r
408 }\r
409\r
410 Status = gBS->OpenProtocol (\r
411 NicHandle,\r
412 &gEfiPxeBaseCodeProtocolGuid,\r
413 (VOID **) &PxeBc,\r
414 This->DriverBindingHandle,\r
415 ControllerHandle,\r
416 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
417 );\r
418\r
419 if (EFI_ERROR (Status)) {\r
420 return Status;\r
421 }\r
422\r
423 Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);\r
424\r
425 Status = gBS->UninstallMultipleProtocolInterfaces (\r
426 NicHandle,\r
427 &gEfiPxeBaseCodeProtocolGuid,\r
428 &Private->PxeBc,\r
429 &gEfiLoadFileProtocolGuid,\r
430 &Private->LoadFile,\r
431 NULL\r
432 );\r
433\r
434 if (!EFI_ERROR (Status)) {\r
435\r
436 gBS->CloseProtocol (\r
437 Private->Udp4Child,\r
438 &gEfiUdp4ProtocolGuid,\r
439 This->DriverBindingHandle,\r
51dc1f65 440 NicHandle\r
dc361cc5 441 );\r
442 NetLibDestroyServiceChild (\r
51dc1f65 443 NicHandle,\r
dc361cc5 444 This->DriverBindingHandle,\r
445 &gEfiUdp4ServiceBindingProtocolGuid,\r
446 Private->Udp4Child\r
447 );\r
448\r
449 gBS->CloseProtocol (\r
450 Private->Dhcp4Child,\r
451 &gEfiDhcp4ProtocolGuid,\r
452 This->DriverBindingHandle,\r
51dc1f65 453 NicHandle\r
dc361cc5 454 );\r
455 NetLibDestroyServiceChild (\r
51dc1f65 456 NicHandle,\r
dc361cc5 457 This->DriverBindingHandle,\r
458 &gEfiDhcp4ServiceBindingProtocolGuid,\r
459 Private->Dhcp4Child\r
460 );\r
461\r
462 gBS->CloseProtocol (\r
463 Private->Mtftp4Child,\r
464 &gEfiMtftp4ProtocolGuid,\r
465 This->DriverBindingHandle,\r
51dc1f65 466 NicHandle\r
dc361cc5 467 );\r
468 NetLibDestroyServiceChild (\r
51dc1f65 469 NicHandle,\r
dc361cc5 470 This->DriverBindingHandle,\r
471 &gEfiMtftp4ServiceBindingProtocolGuid,\r
472 Private->Mtftp4Child\r
473 );\r
474\r
8d285ec0 475 gBS->CloseProtocol (\r
476 Private->ArpChild,\r
477 &gEfiArpProtocolGuid,\r
478 This->DriverBindingHandle,\r
479 NicHandle\r
480 );\r
481 NetLibDestroyServiceChild (\r
482 NicHandle,\r
483 This->DriverBindingHandle,\r
484 &gEfiArpServiceBindingProtocolGuid,\r
485 Private->ArpChild\r
486 );\r
487\r
e48e37fc 488 gBS->FreePool (Private);\r
dc361cc5 489 }\r
490\r
491 return Status;\r
492}\r
493\r
494EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {\r
495 PxeBcDriverBindingSupported,\r
496 PxeBcDriverBindingStart,\r
497 PxeBcDriverBindingStop,\r
498 0xa,\r
499 NULL,\r
500 NULL\r
501};\r
502\r
503\r