]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
NetworkPkg: Apply uncrustify changes
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcDriver.c
CommitLineData
a3bcde70 1/** @file\r
5add2c55 2 Driver Binding functions implementation for UefiPxeBc Driver.\r
a3bcde70 3\r
8f586b85 4 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
b29e6365 5 Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>\r
a3bcde70 6\r
ecf98fbc 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a3bcde70
HT
8\r
9**/\r
10\r
11#include "PxeBcImpl.h"\r
12\r
d1050b9d 13EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp4DriverBinding = {\r
6879581d 14 PxeBcIp4DriverBindingSupported,\r
15 PxeBcIp4DriverBindingStart,\r
16 PxeBcIp4DriverBindingStop,\r
17 0xa,\r
18 NULL,\r
19 NULL\r
20};\r
21\r
d1050b9d 22EFI_DRIVER_BINDING_PROTOCOL gPxeBcIp6DriverBinding = {\r
6879581d 23 PxeBcIp6DriverBindingSupported,\r
24 PxeBcIp6DriverBindingStart,\r
25 PxeBcIp6DriverBindingStop,\r
a3bcde70
HT
26 0xa,\r
27 NULL,\r
28 NULL\r
29};\r
30\r
a3bcde70
HT
31/**\r
32 Get the Nic handle using any child handle in the IPv4 stack.\r
33\r
34 @param[in] ControllerHandle Pointer to child handle over IPv4.\r
35\r
36 @return NicHandle The pointer to the Nic handle.\r
37\r
38**/\r
39EFI_HANDLE\r
40PxeBcGetNicByIp4Children (\r
d1050b9d 41 IN EFI_HANDLE ControllerHandle\r
a3bcde70
HT
42 )\r
43{\r
d1050b9d 44 EFI_HANDLE NicHandle;\r
a3bcde70
HT
45\r
46 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
47 if (NicHandle == NULL) {\r
48 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
49 if (NicHandle == NULL) {\r
50 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
51 if (NicHandle == NULL) {\r
52 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
53 if (NicHandle == NULL) {\r
54 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
55 if (NicHandle == NULL) {\r
56 return NULL;\r
57 }\r
58 }\r
59 }\r
60 }\r
61 }\r
62\r
63 return NicHandle;\r
64}\r
65\r
a3bcde70
HT
66/**\r
67 Get the Nic handle using any child handle in the IPv6 stack.\r
68\r
69 @param[in] ControllerHandle Pointer to child handle over IPv6.\r
70\r
71 @return NicHandle The pointer to the Nic handle.\r
72\r
73**/\r
74EFI_HANDLE\r
75PxeBcGetNicByIp6Children (\r
d1050b9d 76 IN EFI_HANDLE ControllerHandle\r
a3bcde70
HT
77 )\r
78{\r
d1050b9d 79 EFI_HANDLE NicHandle;\r
a3bcde70
HT
80\r
81 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp6ProtocolGuid);\r
82 if (NicHandle == NULL) {\r
83 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp6ProtocolGuid);\r
84 if (NicHandle == NULL) {\r
85 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp6ProtocolGuid);\r
86 if (NicHandle == NULL) {\r
87 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp6ProtocolGuid);\r
88 if (NicHandle == NULL) {\r
89 return NULL;\r
90 }\r
91 }\r
92 }\r
93 }\r
94\r
95 return NicHandle;\r
96}\r
97\r
a3bcde70
HT
98/**\r
99 Destroy the opened instances based on IPv4.\r
100\r
101 @param[in] This Pointer to the EFI_DRIVER_BINDING_PROTOCOL.\r
102 @param[in] Private Pointer to PXEBC_PRIVATE_DATA.\r
103\r
104**/\r
105VOID\r
106PxeBcDestroyIp4Children (\r
107 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
108 IN PXEBC_PRIVATE_DATA *Private\r
109 )\r
110{\r
d1050b9d 111 ASSERT (Private != NULL);\r
a3bcde70
HT
112\r
113 if (Private->ArpChild != NULL) {\r
114 //\r
115 // Close Arp for PxeBc->Arp and destroy the instance.\r
116 //\r
117 gBS->CloseProtocol (\r
118 Private->ArpChild,\r
119 &gEfiArpProtocolGuid,\r
120 This->DriverBindingHandle,\r
121 Private->Controller\r
122 );\r
123\r
124 NetLibDestroyServiceChild (\r
125 Private->Controller,\r
126 This->DriverBindingHandle,\r
127 &gEfiArpServiceBindingProtocolGuid,\r
128 Private->ArpChild\r
129 );\r
130 }\r
131\r
132 if (Private->Ip4Child != NULL) {\r
133 //\r
134 // Close Ip4 for background ICMP error message and destroy the instance.\r
135 //\r
136 gBS->CloseProtocol (\r
137 Private->Ip4Child,\r
138 &gEfiIp4ProtocolGuid,\r
139 This->DriverBindingHandle,\r
140 Private->Controller\r
141 );\r
142\r
143 NetLibDestroyServiceChild (\r
144 Private->Controller,\r
145 This->DriverBindingHandle,\r
146 &gEfiIp4ServiceBindingProtocolGuid,\r
147 Private->Ip4Child\r
148 );\r
149 }\r
150\r
151 if (Private->Udp4WriteChild != NULL) {\r
152 //\r
153 // Close Udp4 for PxeBc->UdpWrite and destroy the instance.\r
154 //\r
155 gBS->CloseProtocol (\r
156 Private->Udp4WriteChild,\r
157 &gEfiUdp4ProtocolGuid,\r
158 This->DriverBindingHandle,\r
159 Private->Controller\r
160 );\r
161\r
162 NetLibDestroyServiceChild (\r
163 Private->Controller,\r
164 This->DriverBindingHandle,\r
165 &gEfiUdp4ServiceBindingProtocolGuid,\r
166 Private->Udp4WriteChild\r
167 );\r
168 }\r
169\r
170 if (Private->Udp4ReadChild != NULL) {\r
171 //\r
172 // Close Udp4 for PxeBc->UdpRead and destroy the instance.\r
173 //\r
174 gBS->CloseProtocol (\r
d1050b9d
MK
175 Private->Udp4ReadChild,\r
176 &gEfiUdp4ProtocolGuid,\r
177 This->DriverBindingHandle,\r
178 Private->Controller\r
179 );\r
a3bcde70
HT
180\r
181 NetLibDestroyServiceChild (\r
182 Private->Controller,\r
183 This->DriverBindingHandle,\r
184 &gEfiUdp4ServiceBindingProtocolGuid,\r
185 Private->Udp4ReadChild\r
186 );\r
187 }\r
188\r
189 if (Private->Mtftp4Child != NULL) {\r
190 //\r
191 // Close Mtftp4 for PxeBc->Mtftp4 and destroy the instance.\r
192 //\r
193 gBS->CloseProtocol (\r
d1050b9d
MK
194 Private->Mtftp4Child,\r
195 &gEfiMtftp4ProtocolGuid,\r
196 This->DriverBindingHandle,\r
197 Private->Controller\r
198 );\r
a3bcde70
HT
199\r
200 NetLibDestroyServiceChild (\r
201 Private->Controller,\r
202 This->DriverBindingHandle,\r
203 &gEfiMtftp4ServiceBindingProtocolGuid,\r
204 Private->Mtftp4Child\r
205 );\r
206 }\r
207\r
208 if (Private->Dhcp4Child != NULL) {\r
209 //\r
210 // Close Dhcp4 for PxeBc->Dhcp4 and destroy the instance.\r
211 //\r
212 gBS->CloseProtocol (\r
d1050b9d
MK
213 Private->Dhcp4Child,\r
214 &gEfiDhcp4ProtocolGuid,\r
215 This->DriverBindingHandle,\r
216 Private->Controller\r
217 );\r
a3bcde70
HT
218\r
219 NetLibDestroyServiceChild (\r
220 Private->Controller,\r
221 This->DriverBindingHandle,\r
222 &gEfiDhcp4ServiceBindingProtocolGuid,\r
223 Private->Dhcp4Child\r
224 );\r
225 }\r
226\r
227 if (Private->Ip4Nic != NULL) {\r
228 //\r
15f3fc85 229 // Close PxeBcPrivate from the parent Nic handle and destroy the virtual handle.\r
a3bcde70
HT
230 //\r
231 gBS->CloseProtocol (\r
232 Private->Controller,\r
9bdc6592 233 &gEfiCallerIdGuid,\r
a3bcde70
HT
234 This->DriverBindingHandle,\r
235 Private->Ip4Nic->Controller\r
236 );\r
237\r
238 gBS->UninstallMultipleProtocolInterfaces (\r
239 Private->Ip4Nic->Controller,\r
240 &gEfiDevicePathProtocolGuid,\r
241 Private->Ip4Nic->DevicePath,\r
242 &gEfiLoadFileProtocolGuid,\r
243 &Private->Ip4Nic->LoadFile,\r
15f3fc85 244 &gEfiPxeBaseCodeProtocolGuid,\r
245 &Private->PxeBc,\r
a3bcde70
HT
246 NULL\r
247 );\r
2fad330f 248 FreePool (Private->Ip4Nic->DevicePath);\r
15f3fc85 249\r
f75a7f56 250 if (Private->Snp != NULL) {\r
15f3fc85 251 //\r
252 // Close SNP from the child virtual handle\r
253 //\r
254 gBS->CloseProtocol (\r
255 Private->Ip4Nic->Controller,\r
256 &gEfiSimpleNetworkProtocolGuid,\r
257 This->DriverBindingHandle,\r
258 Private->Ip4Nic->Controller\r
259 );\r
f75a7f56 260\r
15f3fc85 261 gBS->UninstallProtocolInterface (\r
262 Private->Ip4Nic->Controller,\r
263 &gEfiSimpleNetworkProtocolGuid,\r
264 Private->Snp\r
265 );\r
266 }\r
d1050b9d 267\r
a3bcde70
HT
268 FreePool (Private->Ip4Nic);\r
269 }\r
270\r
d1050b9d
MK
271 Private->ArpChild = NULL;\r
272 Private->Ip4Child = NULL;\r
273 Private->Udp4WriteChild = NULL;\r
274 Private->Udp4ReadChild = NULL;\r
275 Private->Mtftp4Child = NULL;\r
276 Private->Dhcp4Child = NULL;\r
277 Private->Ip4Nic = NULL;\r
a3bcde70
HT
278}\r
279\r
a3bcde70
HT
280/**\r
281 Destroy the opened instances based on IPv6.\r
282\r
283 @param[in] This Pointer to the EFI_DRIVER_BINDING_PROTOCOL.\r
284 @param[in] Private Pointer to PXEBC_PRIVATE_DATA.\r
285\r
286**/\r
287VOID\r
288PxeBcDestroyIp6Children (\r
289 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
290 IN PXEBC_PRIVATE_DATA *Private\r
291 )\r
292{\r
d1050b9d 293 ASSERT (Private != NULL);\r
a3bcde70
HT
294\r
295 if (Private->Ip6Child != NULL) {\r
296 //\r
297 // Close Ip6 for Ip6->Ip6Config and destroy the instance.\r
298 //\r
299 gBS->CloseProtocol (\r
d1050b9d
MK
300 Private->Ip6Child,\r
301 &gEfiIp6ProtocolGuid,\r
302 This->DriverBindingHandle,\r
303 Private->Controller\r
304 );\r
a3bcde70
HT
305\r
306 NetLibDestroyServiceChild (\r
307 Private->Controller,\r
308 This->DriverBindingHandle,\r
309 &gEfiIp6ServiceBindingProtocolGuid,\r
310 Private->Ip6Child\r
311 );\r
312 }\r
313\r
314 if (Private->Udp6WriteChild != NULL) {\r
315 //\r
316 // Close Udp6 for PxeBc->UdpWrite and destroy the instance.\r
317 //\r
318 gBS->CloseProtocol (\r
319 Private->Udp6WriteChild,\r
320 &gEfiUdp6ProtocolGuid,\r
321 This->DriverBindingHandle,\r
322 Private->Controller\r
323 );\r
324 NetLibDestroyServiceChild (\r
325 Private->Controller,\r
326 This->DriverBindingHandle,\r
327 &gEfiUdp6ServiceBindingProtocolGuid,\r
328 Private->Udp6WriteChild\r
329 );\r
330 }\r
331\r
332 if (Private->Udp6ReadChild != NULL) {\r
333 //\r
334 // Close Udp6 for PxeBc->UdpRead and destroy the instance.\r
335 //\r
336 gBS->CloseProtocol (\r
d1050b9d
MK
337 Private->Udp6ReadChild,\r
338 &gEfiUdp6ProtocolGuid,\r
339 This->DriverBindingHandle,\r
340 Private->Controller\r
341 );\r
a3bcde70
HT
342 NetLibDestroyServiceChild (\r
343 Private->Controller,\r
344 This->DriverBindingHandle,\r
345 &gEfiUdp6ServiceBindingProtocolGuid,\r
346 Private->Udp6ReadChild\r
347 );\r
348 }\r
349\r
350 if (Private->Mtftp6Child != NULL) {\r
351 //\r
352 // Close Mtftp6 for PxeBc->Mtftp and destroy the instance.\r
353 //\r
354 gBS->CloseProtocol (\r
d1050b9d
MK
355 Private->Mtftp6Child,\r
356 &gEfiMtftp6ProtocolGuid,\r
357 This->DriverBindingHandle,\r
358 Private->Controller\r
359 );\r
a3bcde70
HT
360\r
361 NetLibDestroyServiceChild (\r
362 Private->Controller,\r
363 This->DriverBindingHandle,\r
364 &gEfiMtftp6ServiceBindingProtocolGuid,\r
365 Private->Mtftp6Child\r
366 );\r
367 }\r
368\r
369 if (Private->Dhcp6Child != NULL) {\r
370 //\r
371 // Close Dhcp6 for PxeBc->Dhcp and destroy the instance.\r
372 //\r
373 gBS->CloseProtocol (\r
d1050b9d
MK
374 Private->Dhcp6Child,\r
375 &gEfiDhcp6ProtocolGuid,\r
376 This->DriverBindingHandle,\r
377 Private->Controller\r
378 );\r
a3bcde70
HT
379\r
380 NetLibDestroyServiceChild (\r
381 Private->Controller,\r
382 This->DriverBindingHandle,\r
383 &gEfiDhcp6ServiceBindingProtocolGuid,\r
384 Private->Dhcp6Child\r
385 );\r
386 }\r
387\r
388 if (Private->Ip6Nic != NULL) {\r
389 //\r
15f3fc85 390 // Close PxeBcPrivate from the parent Nic handle and destroy the virtual handle.\r
a3bcde70
HT
391 //\r
392 gBS->CloseProtocol (\r
393 Private->Controller,\r
9bdc6592 394 &gEfiCallerIdGuid,\r
a3bcde70
HT
395 This->DriverBindingHandle,\r
396 Private->Ip6Nic->Controller\r
397 );\r
15f3fc85 398\r
a3bcde70
HT
399 gBS->UninstallMultipleProtocolInterfaces (\r
400 Private->Ip6Nic->Controller,\r
401 &gEfiDevicePathProtocolGuid,\r
402 Private->Ip6Nic->DevicePath,\r
403 &gEfiLoadFileProtocolGuid,\r
404 &Private->Ip6Nic->LoadFile,\r
15f3fc85 405 &gEfiPxeBaseCodeProtocolGuid,\r
406 &Private->PxeBc,\r
a3bcde70
HT
407 NULL\r
408 );\r
2fad330f 409 FreePool (Private->Ip6Nic->DevicePath);\r
f75a7f56 410\r
15f3fc85 411 if (Private->Snp != NULL) {\r
412 //\r
413 // Close SNP from the child virtual handle\r
414 //\r
415 gBS->CloseProtocol (\r
416 Private->Ip6Nic->Controller,\r
417 &gEfiSimpleNetworkProtocolGuid,\r
418 This->DriverBindingHandle,\r
419 Private->Ip6Nic->Controller\r
420 );\r
421 gBS->UninstallProtocolInterface (\r
422 Private->Ip6Nic->Controller,\r
423 &gEfiSimpleNetworkProtocolGuid,\r
424 Private->Snp\r
425 );\r
426 }\r
d1050b9d 427\r
a3bcde70
HT
428 FreePool (Private->Ip6Nic);\r
429 }\r
430\r
431 Private->Ip6Child = NULL;\r
432 Private->Udp6WriteChild = NULL;\r
433 Private->Udp6ReadChild = NULL;\r
434 Private->Mtftp6Child = NULL;\r
435 Private->Dhcp6Child = NULL;\r
436 Private->Ip6Nic = NULL;\r
437 Private->Mode.Ipv6Available = FALSE;\r
438}\r
439\r
2bbe9553
YT
440/**\r
441 Check whether UNDI protocol supports IPv6.\r
442\r
443 @param[in] ControllerHandle Controller handle.\r
444 @param[in] Private Pointer to PXEBC_PRIVATE_DATA.\r
445 @param[out] Ipv6Support TRUE if UNDI supports IPv6.\r
446\r
447 @retval EFI_SUCCESS Get the result whether UNDI supports IPv6 by NII or AIP protocol successfully.\r
448 @retval EFI_NOT_FOUND Don't know whether UNDI supports IPv6 since NII or AIP is not available.\r
449\r
450**/\r
451EFI_STATUS\r
452PxeBcCheckIpv6Support (\r
d1050b9d
MK
453 IN EFI_HANDLE ControllerHandle,\r
454 IN PXEBC_PRIVATE_DATA *Private,\r
455 OUT BOOLEAN *Ipv6Support\r
2bbe9553
YT
456 )\r
457{\r
d1050b9d
MK
458 EFI_HANDLE Handle;\r
459 EFI_ADAPTER_INFORMATION_PROTOCOL *Aip;\r
460 EFI_STATUS Status;\r
461 EFI_GUID *InfoTypesBuffer;\r
462 UINTN InfoTypeBufferCount;\r
463 UINTN TypeIndex;\r
464 BOOLEAN Supported;\r
465 VOID *InfoBlock;\r
466 UINTN InfoBlockSize;\r
2bbe9553
YT
467\r
468 ASSERT (Private != NULL && Ipv6Support != NULL);\r
469\r
470 //\r
471 // Check whether the UNDI supports IPv6 by NII protocol.\r
472 //\r
473 if (Private->Nii != NULL) {\r
474 *Ipv6Support = Private->Nii->Ipv6Supported;\r
475 return EFI_SUCCESS;\r
476 }\r
477\r
478 //\r
479 // Check whether the UNDI supports IPv6 by AIP protocol.\r
480 //\r
481\r
482 //\r
483 // Get the NIC handle by SNP protocol.\r
f75a7f56 484 //\r
2bbe9553
YT
485 Handle = NetLibGetSnpHandle (ControllerHandle, NULL);\r
486 if (Handle == NULL) {\r
487 return EFI_NOT_FOUND;\r
488 }\r
489\r
490 Aip = NULL;\r
491 Status = gBS->HandleProtocol (\r
492 Handle,\r
493 &gEfiAdapterInformationProtocolGuid,\r
d1050b9d 494 (VOID *)&Aip\r
2bbe9553 495 );\r
d1050b9d 496 if (EFI_ERROR (Status) || (Aip == NULL)) {\r
2bbe9553
YT
497 return EFI_NOT_FOUND;\r
498 }\r
499\r
500 InfoTypesBuffer = NULL;\r
501 InfoTypeBufferCount = 0;\r
d1050b9d
MK
502 Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);\r
503 if (EFI_ERROR (Status) || (InfoTypesBuffer == NULL)) {\r
2bbe9553
YT
504 FreePool (InfoTypesBuffer);\r
505 return EFI_NOT_FOUND;\r
506 }\r
507\r
508 Supported = FALSE;\r
509 for (TypeIndex = 0; TypeIndex < InfoTypeBufferCount; TypeIndex++) {\r
510 if (CompareGuid (&InfoTypesBuffer[TypeIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) {\r
511 Supported = TRUE;\r
512 break;\r
513 }\r
514 }\r
515\r
516 FreePool (InfoTypesBuffer);\r
517 if (!Supported) {\r
518 return EFI_NOT_FOUND;\r
519 }\r
520\r
521 //\r
522 // We now have adapter information block.\r
523 //\r
524 InfoBlock = NULL;\r
525 InfoBlockSize = 0;\r
d1050b9d
MK
526 Status = Aip->GetInformation (Aip, &gEfiAdapterInfoUndiIpv6SupportGuid, &InfoBlock, &InfoBlockSize);\r
527 if (EFI_ERROR (Status) || (InfoBlock == NULL)) {\r
2bbe9553
YT
528 FreePool (InfoBlock);\r
529 return EFI_NOT_FOUND;\r
f75a7f56 530 }\r
2bbe9553 531\r
d1050b9d 532 *Ipv6Support = ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InfoBlock)->Ipv6Support;\r
2bbe9553
YT
533 FreePool (InfoBlock);\r
534 return EFI_SUCCESS;\r
2bbe9553 535}\r
a3bcde70
HT
536\r
537/**\r
538 Create the opened instances based on IPv4.\r
539\r
540 @param[in] This Pointer to EFI_DRIVER_BINDING_PROTOCOL.\r
541 @param[in] ControllerHandle Handle of the child to destroy.\r
542 @param[in] Private Handle Pointer to PXEBC_PRIVATE_DATA.\r
543\r
544 @retval EFI_SUCCESS The instances based on IPv4 were all created successfully.\r
545 @retval Others An unexpected error occurred.\r
546\r
547**/\r
548EFI_STATUS\r
549PxeBcCreateIp4Children (\r
550 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
551 IN EFI_HANDLE ControllerHandle,\r
552 IN PXEBC_PRIVATE_DATA *Private\r
553 )\r
554{\r
d1050b9d
MK
555 EFI_STATUS Status;\r
556 IPv4_DEVICE_PATH Ip4Node;\r
557 EFI_PXE_BASE_CODE_MODE *Mode;\r
558 EFI_UDP4_CONFIG_DATA *Udp4CfgData;\r
559 EFI_IP4_CONFIG_DATA *Ip4CfgData;\r
560 EFI_IP4_MODE_DATA Ip4ModeData;\r
561 PXEBC_PRIVATE_PROTOCOL *Id;\r
562 EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
a3bcde70
HT
563\r
564 if (Private->Ip4Nic != NULL) {\r
565 //\r
566 // Already created before.\r
567 //\r
568 return EFI_SUCCESS;\r
569 }\r
570\r
571 //\r
572 // Create Dhcp4 child and open Dhcp4 protocol for PxeBc->Dhcp.\r
573 //\r
574 Status = NetLibCreateServiceChild (\r
575 ControllerHandle,\r
576 This->DriverBindingHandle,\r
577 &gEfiDhcp4ServiceBindingProtocolGuid,\r
578 &Private->Dhcp4Child\r
579 );\r
580 if (EFI_ERROR (Status)) {\r
581 goto ON_ERROR;\r
582 }\r
583\r
584 Status = gBS->OpenProtocol (\r
585 Private->Dhcp4Child,\r
586 &gEfiDhcp4ProtocolGuid,\r
d1050b9d 587 (VOID **)&Private->Dhcp4,\r
a3bcde70
HT
588 This->DriverBindingHandle,\r
589 ControllerHandle,\r
590 EFI_OPEN_PROTOCOL_BY_DRIVER\r
591 );\r
592 if (EFI_ERROR (Status)) {\r
593 goto ON_ERROR;\r
594 }\r
595\r
596 //\r
597 // Create Mtftp4 child and open Mtftp4 protocol for PxeBc->Mtftp.\r
598 //\r
599 Status = NetLibCreateServiceChild (\r
600 ControllerHandle,\r
601 This->DriverBindingHandle,\r
602 &gEfiMtftp4ServiceBindingProtocolGuid,\r
603 &Private->Mtftp4Child\r
604 );\r
605 if (EFI_ERROR (Status)) {\r
606 goto ON_ERROR;\r
607 }\r
608\r
609 Status = gBS->OpenProtocol (\r
610 Private->Mtftp4Child,\r
611 &gEfiMtftp4ProtocolGuid,\r
d1050b9d 612 (VOID **)&Private->Mtftp4,\r
a3bcde70
HT
613 This->DriverBindingHandle,\r
614 ControllerHandle,\r
615 EFI_OPEN_PROTOCOL_BY_DRIVER\r
616 );\r
617 if (EFI_ERROR (Status)) {\r
618 goto ON_ERROR;\r
619 }\r
620\r
621 //\r
622 // Create Udp4 child and open Udp4 protocol for PxeBc->UdpRead.\r
623 //\r
624 Status = NetLibCreateServiceChild (\r
625 ControllerHandle,\r
626 This->DriverBindingHandle,\r
627 &gEfiUdp4ServiceBindingProtocolGuid,\r
628 &Private->Udp4ReadChild\r
629 );\r
630 if (EFI_ERROR (Status)) {\r
631 goto ON_ERROR;\r
632 }\r
633\r
634 Status = gBS->OpenProtocol (\r
635 Private->Udp4ReadChild,\r
636 &gEfiUdp4ProtocolGuid,\r
d1050b9d 637 (VOID **)&Private->Udp4Read,\r
a3bcde70
HT
638 This->DriverBindingHandle,\r
639 ControllerHandle,\r
640 EFI_OPEN_PROTOCOL_BY_DRIVER\r
641 );\r
642 if (EFI_ERROR (Status)) {\r
643 goto ON_ERROR;\r
644 }\r
645\r
646 //\r
647 // Create Udp4 child and open Udp4 protocol for PxeBc->UdpWrite.\r
648 //\r
649 Status = NetLibCreateServiceChild (\r
650 ControllerHandle,\r
651 This->DriverBindingHandle,\r
652 &gEfiUdp4ServiceBindingProtocolGuid,\r
653 &Private->Udp4WriteChild\r
654 );\r
655 if (EFI_ERROR (Status)) {\r
656 goto ON_ERROR;\r
657 }\r
658\r
659 Status = gBS->OpenProtocol (\r
660 Private->Udp4WriteChild,\r
661 &gEfiUdp4ProtocolGuid,\r
d1050b9d 662 (VOID **)&Private->Udp4Write,\r
a3bcde70
HT
663 This->DriverBindingHandle,\r
664 ControllerHandle,\r
665 EFI_OPEN_PROTOCOL_BY_DRIVER\r
666 );\r
667 if (EFI_ERROR (Status)) {\r
668 goto ON_ERROR;\r
669 }\r
670\r
671 //\r
672 // Create Arp child and open Arp protocol for PxeBc->Arp.\r
673 //\r
674 Status = NetLibCreateServiceChild (\r
675 ControllerHandle,\r
676 This->DriverBindingHandle,\r
677 &gEfiArpServiceBindingProtocolGuid,\r
678 &Private->ArpChild\r
679 );\r
680 if (EFI_ERROR (Status)) {\r
681 goto ON_ERROR;\r
682 }\r
683\r
684 Status = gBS->OpenProtocol (\r
685 Private->ArpChild,\r
686 &gEfiArpProtocolGuid,\r
d1050b9d 687 (VOID **)&Private->Arp,\r
a3bcde70
HT
688 This->DriverBindingHandle,\r
689 ControllerHandle,\r
690 EFI_OPEN_PROTOCOL_BY_DRIVER\r
691 );\r
692 if (EFI_ERROR (Status)) {\r
693 goto ON_ERROR;\r
694 }\r
695\r
696 //\r
697 // Create Ip4 child and open Ip4 protocol for background ICMP packets.\r
698 //\r
699 Status = NetLibCreateServiceChild (\r
700 ControllerHandle,\r
701 This->DriverBindingHandle,\r
702 &gEfiIp4ServiceBindingProtocolGuid,\r
703 &Private->Ip4Child\r
704 );\r
705 if (EFI_ERROR (Status)) {\r
706 goto ON_ERROR;\r
707 }\r
708\r
709 Status = gBS->OpenProtocol (\r
710 Private->Ip4Child,\r
711 &gEfiIp4ProtocolGuid,\r
d1050b9d 712 (VOID **)&Private->Ip4,\r
a3bcde70
HT
713 This->DriverBindingHandle,\r
714 ControllerHandle,\r
715 EFI_OPEN_PROTOCOL_BY_DRIVER\r
716 );\r
717 if (EFI_ERROR (Status)) {\r
718 goto ON_ERROR;\r
719 }\r
720\r
721 //\r
722 // Get max packet size from Ip4 to calculate block size for Tftp later.\r
723 //\r
724 Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);\r
725 if (EFI_ERROR (Status)) {\r
726 goto ON_ERROR;\r
727 }\r
728\r
729 Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;\r
730\r
731 Private->Ip4Nic = AllocateZeroPool (sizeof (PXEBC_VIRTUAL_NIC));\r
732 if (Private->Ip4Nic == NULL) {\r
733 return EFI_OUT_OF_RESOURCES;\r
734 }\r
735\r
736 Private->Ip4Nic->Private = Private;\r
737 Private->Ip4Nic->Signature = PXEBC_VIRTUAL_NIC_SIGNATURE;\r
738\r
d1050b9d 739 //\r
ac99793b
ZL
740 // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.\r
741 //\r
742 Status = gBS->HandleProtocol (\r
743 ControllerHandle,\r
744 &gEfiIp4Config2ProtocolGuid,\r
d1050b9d 745 (VOID **)&Private->Ip4Config2\r
ac99793b
ZL
746 );\r
747 if (EFI_ERROR (Status)) {\r
748 goto ON_ERROR;\r
749 }\r
750\r
a3bcde70
HT
751 //\r
752 // Create a device path node for Ipv4 virtual nic, and append it.\r
753 //\r
754 ZeroMem (&Ip4Node, sizeof (IPv4_DEVICE_PATH));\r
755 Ip4Node.Header.Type = MESSAGING_DEVICE_PATH;\r
756 Ip4Node.Header.SubType = MSG_IPv4_DP;\r
757 Ip4Node.StaticIpAddress = FALSE;\r
758\r
759 SetDevicePathNodeLength (&Ip4Node.Header, sizeof (Ip4Node));\r
760\r
761 Private->Ip4Nic->DevicePath = AppendDevicePathNode (Private->DevicePath, &Ip4Node.Header);\r
762\r
763 if (Private->Ip4Nic->DevicePath == NULL) {\r
764 Status = EFI_OUT_OF_RESOURCES;\r
765 goto ON_ERROR;\r
766 }\r
767\r
768 CopyMem (\r
769 &Private->Ip4Nic->LoadFile,\r
770 &gLoadFileProtocolTemplate,\r
771 sizeof (EFI_LOAD_FILE_PROTOCOL)\r
772 );\r
773\r
774 //\r
775 // Create a new handle for IPv4 virtual nic,\r
776 // and install PxeBaseCode, LoadFile and DevicePath protocols.\r
777 //\r
778 Status = gBS->InstallMultipleProtocolInterfaces (\r
779 &Private->Ip4Nic->Controller,\r
780 &gEfiDevicePathProtocolGuid,\r
781 Private->Ip4Nic->DevicePath,\r
782 &gEfiLoadFileProtocolGuid,\r
783 &Private->Ip4Nic->LoadFile,\r
15f3fc85 784 &gEfiPxeBaseCodeProtocolGuid,\r
785 &Private->PxeBc,\r
a3bcde70
HT
786 NULL\r
787 );\r
788 if (EFI_ERROR (Status)) {\r
789 goto ON_ERROR;\r
790 }\r
791\r
15f3fc85 792 if (Private->Snp != NULL) {\r
793 //\r
794 // Install SNP protocol on purpose is for some OS loader backward\r
795 // compatibility consideration.\r
796 //\r
797 Status = gBS->InstallProtocolInterface (\r
798 &Private->Ip4Nic->Controller,\r
799 &gEfiSimpleNetworkProtocolGuid,\r
800 EFI_NATIVE_INTERFACE,\r
801 Private->Snp\r
802 );\r
803 if (EFI_ERROR (Status)) {\r
804 goto ON_ERROR;\r
805 }\r
806\r
807 //\r
cde5a72d 808 // Open SNP on the child handle BY_DRIVER|EXCLUSIVE. It will prevent any additionally\r
15f3fc85 809 // layering to perform the experiment.\r
810 //\r
811 Status = gBS->OpenProtocol (\r
812 Private->Ip4Nic->Controller,\r
813 &gEfiSimpleNetworkProtocolGuid,\r
d1050b9d 814 (VOID **)&Snp,\r
15f3fc85 815 This->DriverBindingHandle,\r
816 Private->Ip4Nic->Controller,\r
cde5a72d 817 EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE\r
15f3fc85 818 );\r
819 if (EFI_ERROR (Status)) {\r
820 goto ON_ERROR;\r
821 }\r
822 }\r
823\r
a3bcde70 824 //\r
15f3fc85 825 // Open PxeBaseCodePrivate protocol by child to setup a parent-child relationship between\r
a3bcde70
HT
826 // real NIC handle and the virtual IPv4 NIC handle.\r
827 //\r
828 Status = gBS->OpenProtocol (\r
829 ControllerHandle,\r
9bdc6592 830 &gEfiCallerIdGuid,\r
d1050b9d 831 (VOID **)&Id,\r
a3bcde70
HT
832 This->DriverBindingHandle,\r
833 Private->Ip4Nic->Controller,\r
834 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
835 );\r
836 if (EFI_ERROR (Status)) {\r
837 goto ON_ERROR;\r
838 }\r
839\r
840 //\r
841 // Set default configure data for Udp4Read and Ip4 instance.\r
842 //\r
d1050b9d
MK
843 Mode = Private->PxeBc.Mode;\r
844 Udp4CfgData = &Private->Udp4CfgData;\r
845 Ip4CfgData = &Private->Ip4CfgData;\r
a3bcde70 846\r
18127352 847 Udp4CfgData->AcceptBroadcast = FALSE;\r
a3bcde70
HT
848 Udp4CfgData->AcceptAnyPort = TRUE;\r
849 Udp4CfgData->AllowDuplicatePort = TRUE;\r
850 Udp4CfgData->TypeOfService = Mode->ToS;\r
851 Udp4CfgData->TimeToLive = Mode->TTL;\r
852 Udp4CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
853 Udp4CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
854\r
d1050b9d
MK
855 Ip4CfgData->AcceptIcmpErrors = TRUE;\r
856 Ip4CfgData->DefaultProtocol = EFI_IP_PROTO_ICMP;\r
857 Ip4CfgData->TypeOfService = Mode->ToS;\r
858 Ip4CfgData->TimeToLive = Mode->TTL;\r
859 Ip4CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
860 Ip4CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
a3bcde70
HT
861\r
862 return EFI_SUCCESS;\r
863\r
864ON_ERROR:\r
865 PxeBcDestroyIp4Children (This, Private);\r
866 return Status;\r
867}\r
868\r
a3bcde70
HT
869/**\r
870 Create the opened instances based on IPv6.\r
871\r
872 @param[in] This Pointer to EFI_DRIVER_BINDING_PROTOCOL.\r
873 @param[in] ControllerHandle Handle of the child to destroy.\r
874 @param[in] Private Handle Pointer to PXEBC_PRIVATE_DATA.\r
875\r
876 @retval EFI_SUCCESS The instances based on IPv6 were all created successfully.\r
877 @retval Others An unexpected error occurred.\r
878\r
879**/\r
880EFI_STATUS\r
881PxeBcCreateIp6Children (\r
882 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
883 IN EFI_HANDLE ControllerHandle,\r
884 IN PXEBC_PRIVATE_DATA *Private\r
885 )\r
886{\r
d1050b9d
MK
887 EFI_STATUS Status;\r
888 IPv6_DEVICE_PATH Ip6Node;\r
889 EFI_UDP6_CONFIG_DATA *Udp6CfgData;\r
890 EFI_IP6_CONFIG_DATA *Ip6CfgData;\r
891 EFI_IP6_MODE_DATA Ip6ModeData;\r
892 PXEBC_PRIVATE_PROTOCOL *Id;\r
893 EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
894 UINTN Index;\r
a3bcde70
HT
895\r
896 if (Private->Ip6Nic != NULL) {\r
897 //\r
898 // Already created before.\r
899 //\r
900 return EFI_SUCCESS;\r
901 }\r
902\r
903 Private->Ip6Nic = AllocateZeroPool (sizeof (PXEBC_VIRTUAL_NIC));\r
904\r
905 if (Private->Ip6Nic == NULL) {\r
906 return EFI_OUT_OF_RESOURCES;\r
907 }\r
908\r
909 Private->Ip6Nic->Private = Private;\r
910 Private->Ip6Nic->Signature = PXEBC_VIRTUAL_NIC_SIGNATURE;\r
911\r
912 //\r
913 // Create Dhcp6 child and open Dhcp6 protocol for PxeBc->Dhcp.\r
914 //\r
915 Status = NetLibCreateServiceChild (\r
916 ControllerHandle,\r
917 This->DriverBindingHandle,\r
918 &gEfiDhcp6ServiceBindingProtocolGuid,\r
919 &Private->Dhcp6Child\r
920 );\r
921 if (EFI_ERROR (Status)) {\r
922 goto ON_ERROR;\r
923 }\r
924\r
925 Status = gBS->OpenProtocol (\r
926 Private->Dhcp6Child,\r
927 &gEfiDhcp6ProtocolGuid,\r
d1050b9d 928 (VOID **)&Private->Dhcp6,\r
a3bcde70
HT
929 This->DriverBindingHandle,\r
930 ControllerHandle,\r
931 EFI_OPEN_PROTOCOL_BY_DRIVER\r
932 );\r
933 if (EFI_ERROR (Status)) {\r
934 goto ON_ERROR;\r
935 }\r
936\r
75dce340 937 //\r
938 // Generate a random IAID for the Dhcp6 assigned address.\r
939 //\r
940 Private->IaId = NET_RANDOM (NetRandomInitSeed ());\r
941 if (Private->Snp != NULL) {\r
942 for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) {\r
943 Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31));\r
f75a7f56 944 }\r
75dce340 945 }\r
946\r
a3bcde70
HT
947 //\r
948 // Create Mtftp6 child and open Mtftp6 protocol for PxeBc->Mtftp.\r
949 //\r
950 Status = NetLibCreateServiceChild (\r
951 ControllerHandle,\r
952 This->DriverBindingHandle,\r
953 &gEfiMtftp6ServiceBindingProtocolGuid,\r
954 &Private->Mtftp6Child\r
955 );\r
956 if (EFI_ERROR (Status)) {\r
957 goto ON_ERROR;\r
958 }\r
959\r
960 Status = gBS->OpenProtocol (\r
961 Private->Mtftp6Child,\r
962 &gEfiMtftp6ProtocolGuid,\r
d1050b9d 963 (VOID **)&Private->Mtftp6,\r
a3bcde70
HT
964 This->DriverBindingHandle,\r
965 ControllerHandle,\r
966 EFI_OPEN_PROTOCOL_BY_DRIVER\r
967 );\r
968 if (EFI_ERROR (Status)) {\r
969 goto ON_ERROR;\r
970 }\r
971\r
972 //\r
973 // Create Udp6 child and open Udp6 protocol for PxeBc->UdpRead.\r
974 //\r
975 Status = NetLibCreateServiceChild (\r
976 ControllerHandle,\r
977 This->DriverBindingHandle,\r
978 &gEfiUdp6ServiceBindingProtocolGuid,\r
979 &Private->Udp6ReadChild\r
980 );\r
981 if (EFI_ERROR (Status)) {\r
982 goto ON_ERROR;\r
983 }\r
984\r
985 Status = gBS->OpenProtocol (\r
986 Private->Udp6ReadChild,\r
987 &gEfiUdp6ProtocolGuid,\r
d1050b9d 988 (VOID **)&Private->Udp6Read,\r
a3bcde70
HT
989 This->DriverBindingHandle,\r
990 ControllerHandle,\r
991 EFI_OPEN_PROTOCOL_BY_DRIVER\r
992 );\r
993 if (EFI_ERROR (Status)) {\r
994 goto ON_ERROR;\r
995 }\r
996\r
997 //\r
998 // Create Udp6 child and open Udp6 protocol for PxeBc->UdpWrite.\r
999 //\r
1000 Status = NetLibCreateServiceChild (\r
1001 ControllerHandle,\r
1002 This->DriverBindingHandle,\r
1003 &gEfiUdp6ServiceBindingProtocolGuid,\r
1004 &Private->Udp6WriteChild\r
1005 );\r
1006 if (EFI_ERROR (Status)) {\r
1007 goto ON_ERROR;\r
1008 }\r
1009\r
1010 Status = gBS->OpenProtocol (\r
1011 Private->Udp6WriteChild,\r
1012 &gEfiUdp6ProtocolGuid,\r
d1050b9d 1013 (VOID **)&Private->Udp6Write,\r
a3bcde70
HT
1014 This->DriverBindingHandle,\r
1015 ControllerHandle,\r
1016 EFI_OPEN_PROTOCOL_BY_DRIVER\r
1017 );\r
1018 if (EFI_ERROR (Status)) {\r
1019 goto ON_ERROR;\r
1020 }\r
1021\r
1022 //\r
1023 // Create Ip6 child and open Ip6 protocol for background ICMP6 packets.\r
1024 //\r
1025 Status = NetLibCreateServiceChild (\r
1026 ControllerHandle,\r
1027 This->DriverBindingHandle,\r
1028 &gEfiIp6ServiceBindingProtocolGuid,\r
1029 &Private->Ip6Child\r
1030 );\r
1031 if (EFI_ERROR (Status)) {\r
1032 goto ON_ERROR;\r
1033 }\r
1034\r
1035 Status = gBS->OpenProtocol (\r
1036 Private->Ip6Child,\r
1037 &gEfiIp6ProtocolGuid,\r
d1050b9d 1038 (VOID **)&Private->Ip6,\r
a3bcde70
HT
1039 This->DriverBindingHandle,\r
1040 ControllerHandle,\r
1041 EFI_OPEN_PROTOCOL_BY_DRIVER\r
1042 );\r
1043 if (EFI_ERROR (Status)) {\r
1044 goto ON_ERROR;\r
1045 }\r
1046\r
1047 //\r
1048 // Get max packet size from Ip6 to calculate block size for Tftp later.\r
1049 //\r
1050 Status = Private->Ip6->GetModeData (Private->Ip6, &Ip6ModeData, NULL, NULL);\r
1051 if (EFI_ERROR (Status)) {\r
1052 goto ON_ERROR;\r
1053 }\r
1054\r
1055 Private->Ip6MaxPacketSize = Ip6ModeData.MaxPacketSize;\r
1056\r
ce22514e
ZL
1057 if (Ip6ModeData.AddressList != NULL) {\r
1058 FreePool (Ip6ModeData.AddressList);\r
1059 }\r
1060\r
1061 if (Ip6ModeData.GroupTable != NULL) {\r
1062 FreePool (Ip6ModeData.GroupTable);\r
1063 }\r
1064\r
1065 if (Ip6ModeData.RouteTable != NULL) {\r
1066 FreePool (Ip6ModeData.RouteTable);\r
1067 }\r
1068\r
1069 if (Ip6ModeData.NeighborCache != NULL) {\r
1070 FreePool (Ip6ModeData.NeighborCache);\r
1071 }\r
1072\r
1073 if (Ip6ModeData.PrefixTable != NULL) {\r
1074 FreePool (Ip6ModeData.PrefixTable);\r
1075 }\r
1076\r
1077 if (Ip6ModeData.IcmpTypeList != NULL) {\r
1078 FreePool (Ip6ModeData.IcmpTypeList);\r
1079 }\r
1080\r
a3bcde70
HT
1081 //\r
1082 // Locate Ip6->Ip6Config and store it for set IPv6 address.\r
1083 //\r
1084 Status = gBS->HandleProtocol (\r
1085 ControllerHandle,\r
1086 &gEfiIp6ConfigProtocolGuid,\r
d1050b9d 1087 (VOID **)&Private->Ip6Cfg\r
a3bcde70
HT
1088 );\r
1089 if (EFI_ERROR (Status)) {\r
1090 goto ON_ERROR;\r
1091 }\r
1092\r
1093 //\r
1094 // Create a device path node for Ipv6 virtual nic, and append it.\r
1095 //\r
1096 ZeroMem (&Ip6Node, sizeof (IPv6_DEVICE_PATH));\r
d1050b9d
MK
1097 Ip6Node.Header.Type = MESSAGING_DEVICE_PATH;\r
1098 Ip6Node.Header.SubType = MSG_IPv6_DP;\r
1099 Ip6Node.PrefixLength = IP6_PREFIX_LENGTH;\r
a3bcde70
HT
1100\r
1101 SetDevicePathNodeLength (&Ip6Node.Header, sizeof (Ip6Node));\r
1102\r
1103 Private->Ip6Nic->DevicePath = AppendDevicePathNode (Private->DevicePath, &Ip6Node.Header);\r
1104\r
1105 if (Private->Ip6Nic->DevicePath == NULL) {\r
1106 Status = EFI_OUT_OF_RESOURCES;\r
1107 goto ON_ERROR;\r
1108 }\r
1109\r
1110 CopyMem (\r
1111 &Private->Ip6Nic->LoadFile,\r
1112 &gLoadFileProtocolTemplate,\r
1113 sizeof (EFI_LOAD_FILE_PROTOCOL)\r
1114 );\r
1115\r
1116 //\r
1117 // Create a new handle for IPv6 virtual nic,\r
1118 // and install PxeBaseCode, LoadFile and DevicePath protocols.\r
1119 //\r
1120 Status = gBS->InstallMultipleProtocolInterfaces (\r
1121 &Private->Ip6Nic->Controller,\r
1122 &gEfiDevicePathProtocolGuid,\r
1123 Private->Ip6Nic->DevicePath,\r
1124 &gEfiLoadFileProtocolGuid,\r
1125 &Private->Ip6Nic->LoadFile,\r
15f3fc85 1126 &gEfiPxeBaseCodeProtocolGuid,\r
1127 &Private->PxeBc,\r
a3bcde70
HT
1128 NULL\r
1129 );\r
1130 if (EFI_ERROR (Status)) {\r
1131 goto ON_ERROR;\r
1132 }\r
f75a7f56 1133\r
15f3fc85 1134 if (Private->Snp != NULL) {\r
1135 //\r
1136 // Install SNP protocol on purpose is for some OS loader backward\r
1137 // compatibility consideration.\r
1138 //\r
1139 Status = gBS->InstallProtocolInterface (\r
1140 &Private->Ip6Nic->Controller,\r
1141 &gEfiSimpleNetworkProtocolGuid,\r
1142 EFI_NATIVE_INTERFACE,\r
1143 Private->Snp\r
1144 );\r
1145 if (EFI_ERROR (Status)) {\r
1146 goto ON_ERROR;\r
1147 }\r
1148\r
1149 //\r
cde5a72d 1150 // Open SNP on the child handle BY_DRIVER|EXCLUSIVE. It will prevent any additionally\r
15f3fc85 1151 // layering to perform the experiment.\r
1152 //\r
1153 Status = gBS->OpenProtocol (\r
1154 Private->Ip6Nic->Controller,\r
1155 &gEfiSimpleNetworkProtocolGuid,\r
d1050b9d 1156 (VOID **)&Snp,\r
15f3fc85 1157 This->DriverBindingHandle,\r
1158 Private->Ip6Nic->Controller,\r
cde5a72d 1159 EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE\r
15f3fc85 1160 );\r
1161 if (EFI_ERROR (Status)) {\r
1162 goto ON_ERROR;\r
1163 }\r
1164 }\r
a3bcde70
HT
1165\r
1166 //\r
15f3fc85 1167 // Open PxeBaseCodePrivate protocol by child to setup a parent-child relationship between\r
a3bcde70
HT
1168 // real NIC handle and the virtual IPv6 NIC handle.\r
1169 //\r
1170 Status = gBS->OpenProtocol (\r
1171 ControllerHandle,\r
9bdc6592 1172 &gEfiCallerIdGuid,\r
d1050b9d 1173 (VOID **)&Id,\r
a3bcde70
HT
1174 This->DriverBindingHandle,\r
1175 Private->Ip6Nic->Controller,\r
1176 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
1177 );\r
1178 if (EFI_ERROR (Status)) {\r
1179 goto ON_ERROR;\r
1180 }\r
1181\r
1182 //\r
5add2c55 1183 // Set IPv6 available flag and set default configure data for\r
a3bcde70
HT
1184 // Udp6Read and Ip6 instance.\r
1185 //\r
2bbe9553
YT
1186 Status = PxeBcCheckIpv6Support (ControllerHandle, Private, &Private->Mode.Ipv6Available);\r
1187 if (EFI_ERROR (Status)) {\r
1188 //\r
1189 // Fail to get the data whether UNDI supports IPv6. Set default value.\r
1190 //\r
d1050b9d 1191 Private->Mode.Ipv6Available = TRUE;\r
2bbe9553
YT
1192 }\r
1193\r
1194 if (!Private->Mode.Ipv6Available) {\r
1195 goto ON_ERROR;\r
1196 }\r
1197\r
d1050b9d
MK
1198 Udp6CfgData = &Private->Udp6CfgData;\r
1199 Ip6CfgData = &Private->Ip6CfgData;\r
a3bcde70
HT
1200\r
1201 Udp6CfgData->AcceptAnyPort = TRUE;\r
1202 Udp6CfgData->AllowDuplicatePort = TRUE;\r
1203 Udp6CfgData->HopLimit = PXEBC_DEFAULT_HOPLIMIT;\r
1204 Udp6CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
1205 Udp6CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
1206\r
d1050b9d
MK
1207 Ip6CfgData->AcceptIcmpErrors = TRUE;\r
1208 Ip6CfgData->DefaultProtocol = IP6_ICMP;\r
1209 Ip6CfgData->HopLimit = PXEBC_DEFAULT_HOPLIMIT;\r
1210 Ip6CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
1211 Ip6CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
a3bcde70
HT
1212\r
1213 return EFI_SUCCESS;\r
1214\r
1215ON_ERROR:\r
1216 PxeBcDestroyIp6Children (This, Private);\r
1217 return Status;\r
1218}\r
1219\r
a3bcde70
HT
1220/**\r
1221 The entry point for UefiPxeBc driver that installs the driver\r
1222 binding and component name protocol on its image.\r
1223\r
1224 @param[in] ImageHandle The Image handle of the driver.\r
1225 @param[in] SystemTable The system table.\r
1226\r
1227 @return EFI_SUCCESS\r
1228 @return Others\r
1229\r
1230**/\r
1231EFI_STATUS\r
1232EFIAPI\r
1233PxeBcDriverEntryPoint (\r
d1050b9d
MK
1234 IN EFI_HANDLE ImageHandle,\r
1235 IN EFI_SYSTEM_TABLE *SystemTable\r
a3bcde70
HT
1236 )\r
1237{\r
6879581d 1238 EFI_STATUS Status;\r
1239\r
d1050b9d 1240 if ((PcdGet8 (PcdIPv4PXESupport) == PXE_DISABLED) && (PcdGet8 (PcdIPv6PXESupport) == PXE_DISABLED)) {\r
b29e6365
XS
1241 return EFI_UNSUPPORTED;\r
1242 }\r
1243\r
6879581d 1244 Status = EfiLibInstallDriverBindingComponentName2 (\r
1245 ImageHandle,\r
1246 SystemTable,\r
1247 &gPxeBcIp4DriverBinding,\r
1248 ImageHandle,\r
1249 &gPxeBcComponentName,\r
1250 &gPxeBcComponentName2\r
1251 );\r
1252 if (EFI_ERROR (Status)) {\r
1253 return Status;\r
1254 }\r
1255\r
1256 Status = EfiLibInstallDriverBindingComponentName2 (\r
1257 ImageHandle,\r
1258 SystemTable,\r
1259 &gPxeBcIp6DriverBinding,\r
1260 NULL,\r
1261 &gPxeBcComponentName,\r
1262 &gPxeBcComponentName2\r
1263 );\r
1264 if (EFI_ERROR (Status)) {\r
22b35e8b
AS
1265 EfiLibUninstallDriverBindingComponentName2 (\r
1266 &gPxeBcIp4DriverBinding,\r
1267 &gPxeBcComponentName,\r
1268 &gPxeBcComponentName2\r
1269 );\r
6879581d 1270 }\r
a3bcde70 1271\r
6879581d 1272 return Status;\r
1273}\r
a3bcde70
HT
1274\r
1275/**\r
6879581d 1276 Test to see if this driver supports ControllerHandle. This is the worker function for\r
1277 PxeBcIp4(6)DriverBindingSupported.\r
a3bcde70
HT
1278\r
1279 @param[in] This The pointer to the driver binding protocol.\r
1280 @param[in] ControllerHandle The handle of device to be tested.\r
1281 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1282 device to be started.\r
6879581d 1283 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
f75a7f56 1284\r
a3bcde70
HT
1285 @retval EFI_SUCCESS This driver supports this device.\r
1286 @retval EFI_UNSUPPORTED This driver does not support this device.\r
1287\r
1288**/\r
1289EFI_STATUS\r
1290EFIAPI\r
6879581d 1291PxeBcSupported (\r
a3bcde70
HT
1292 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1293 IN EFI_HANDLE ControllerHandle,\r
6879581d 1294 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,\r
1295 IN UINT8 IpVersion\r
a3bcde70
HT
1296 )\r
1297{\r
d1050b9d
MK
1298 EFI_STATUS Status;\r
1299 EFI_GUID *DhcpServiceBindingGuid;\r
1300 EFI_GUID *MtftpServiceBindingGuid;\r
f75a7f56 1301\r
6879581d 1302 if (IpVersion == IP_VERSION_4) {\r
d1050b9d 1303 if (PcdGet8 (PcdIPv4PXESupport) == PXE_DISABLED) {\r
b29e6365
XS
1304 return EFI_UNSUPPORTED;\r
1305 }\r
d1050b9d 1306\r
6879581d 1307 DhcpServiceBindingGuid = &gEfiDhcp4ServiceBindingProtocolGuid;\r
1308 MtftpServiceBindingGuid = &gEfiMtftp4ServiceBindingProtocolGuid;\r
1309 } else {\r
d1050b9d 1310 if (PcdGet8 (PcdIPv6PXESupport) == PXE_DISABLED) {\r
b29e6365
XS
1311 return EFI_UNSUPPORTED;\r
1312 }\r
d1050b9d 1313\r
6879581d 1314 DhcpServiceBindingGuid = &gEfiDhcp6ServiceBindingProtocolGuid;\r
1315 MtftpServiceBindingGuid = &gEfiMtftp6ServiceBindingProtocolGuid;\r
a3bcde70
HT
1316 }\r
1317\r
1318 //\r
6879581d 1319 // Try to open the Mtftp and Dhcp protocol to test whether IP stack is ready.\r
a3bcde70 1320 //\r
6879581d 1321 Status = gBS->OpenProtocol (\r
d1050b9d
MK
1322 ControllerHandle,\r
1323 DhcpServiceBindingGuid,\r
1324 NULL,\r
1325 This->DriverBindingHandle,\r
1326 ControllerHandle,\r
1327 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
1328 );\r
6879581d 1329 if (!EFI_ERROR (Status)) {\r
1330 Status = gBS->OpenProtocol (\r
d1050b9d
MK
1331 ControllerHandle,\r
1332 MtftpServiceBindingGuid,\r
1333 NULL,\r
1334 This->DriverBindingHandle,\r
1335 ControllerHandle,\r
1336 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
1337 );\r
a3bcde70
HT
1338 }\r
1339\r
1340 //\r
6879581d 1341 // It's unsupported case if IP stack are not ready.\r
a3bcde70 1342 //\r
6879581d 1343 if (EFI_ERROR (Status)) {\r
a3bcde70
HT
1344 return EFI_UNSUPPORTED;\r
1345 }\r
1346\r
1347 return EFI_SUCCESS;\r
1348}\r
1349\r
a3bcde70 1350/**\r
6879581d 1351 Start this driver on ControllerHandle. This is the worker function for\r
1352 PxeBcIp4(6)DriverBindingStart.\r
a3bcde70
HT
1353\r
1354 @param[in] This The pointer to the driver binding protocol.\r
1355 @param[in] ControllerHandle The handle of device to be started.\r
1356 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1357 device to be started.\r
6879581d 1358 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
1359\r
a3bcde70
HT
1360\r
1361 @retval EFI_SUCCESS This driver is installed to ControllerHandle.\r
1362 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
1363 @retval other This driver does not support this device.\r
1364\r
1365**/\r
1366EFI_STATUS\r
1367EFIAPI\r
6879581d 1368PxeBcStart (\r
a3bcde70
HT
1369 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1370 IN EFI_HANDLE ControllerHandle,\r
6879581d 1371 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,\r
1372 IN UINT8 IpVersion\r
a3bcde70
HT
1373 )\r
1374{\r
d1050b9d
MK
1375 PXEBC_PRIVATE_DATA *Private;\r
1376 EFI_STATUS Status;\r
1377 PXEBC_PRIVATE_PROTOCOL *Id;\r
1378 BOOLEAN FirstStart;\r
a3bcde70 1379\r
6879581d 1380 FirstStart = FALSE;\r
d1050b9d
MK
1381 Status = gBS->OpenProtocol (\r
1382 ControllerHandle,\r
1383 &gEfiCallerIdGuid,\r
1384 (VOID **)&Id,\r
1385 This->DriverBindingHandle,\r
1386 ControllerHandle,\r
1387 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1388 );\r
a3bcde70
HT
1389 if (!EFI_ERROR (Status)) {\r
1390 //\r
1391 // Skip the initialization if the driver has been started already.\r
1392 //\r
15f3fc85 1393 Private = PXEBC_PRIVATE_DATA_FROM_ID (Id);\r
a3bcde70 1394 } else {\r
6879581d 1395 FirstStart = TRUE;\r
a3bcde70
HT
1396 //\r
1397 // If the driver has not been started yet, it should do initialization.\r
1398 //\r
1399 Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
1400 if (Private == NULL) {\r
1401 return EFI_OUT_OF_RESOURCES;\r
1402 }\r
1403\r
1404 CopyMem (\r
1405 &Private->PxeBc,\r
1406 &gPxeBcProtocolTemplate,\r
1407 sizeof (EFI_PXE_BASE_CODE_PROTOCOL)\r
1408 );\r
1409\r
1410 Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
1411 Private->Controller = ControllerHandle;\r
1412 Private->Image = This->ImageHandle;\r
1413 Private->PxeBc.Mode = &Private->Mode;\r
1414 Private->Mode.Ipv6Supported = TRUE;\r
1415 Private->Mode.AutoArp = TRUE;\r
1416 Private->Mode.TTL = DEFAULT_TTL;\r
1417 Private->Mode.ToS = DEFAULT_ToS;\r
1418\r
1419 //\r
1420 // Open device path to prepare for appending virtual NIC node.\r
1421 //\r
1422 Status = gBS->OpenProtocol (\r
1423 ControllerHandle,\r
1424 &gEfiDevicePathProtocolGuid,\r
d1050b9d 1425 (VOID **)&Private->DevicePath,\r
a3bcde70
HT
1426 This->DriverBindingHandle,\r
1427 ControllerHandle,\r
1428 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1429 );\r
1430\r
1431 if (EFI_ERROR (Status)) {\r
1432 goto ON_ERROR;\r
1433 }\r
1434\r
1435 //\r
1436 // Get the NII interface if it exists, it's not required.\r
1437 //\r
1438 Status = gBS->OpenProtocol (\r
1439 ControllerHandle,\r
1440 &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
d1050b9d 1441 (VOID **)&Private->Nii,\r
a3bcde70
HT
1442 This->DriverBindingHandle,\r
1443 ControllerHandle,\r
1444 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1445 );\r
1446 if (EFI_ERROR (Status)) {\r
1447 Private->Nii = NULL;\r
1448 }\r
1449\r
1450 //\r
15f3fc85 1451 // Install PxeBaseCodePrivate protocol onto the real NIC handler.\r
f75a7f56 1452 // PxeBaseCodePrivate protocol is only used to keep the relationship between\r
9bdc6592
LG
1453 // NIC handle and virtual child handles.\r
1454 // gEfiCallerIdGuid will be used as its protocol guid.\r
a3bcde70
HT
1455 //\r
1456 Status = gBS->InstallProtocolInterface (\r
1457 &ControllerHandle,\r
9bdc6592 1458 &gEfiCallerIdGuid,\r
a3bcde70 1459 EFI_NATIVE_INTERFACE,\r
15f3fc85 1460 &Private->Id\r
a3bcde70
HT
1461 );\r
1462 if (EFI_ERROR (Status)) {\r
1463 goto ON_ERROR;\r
1464 }\r
15f3fc85 1465\r
1466 //\r
1467 // Try to locate SNP protocol.\r
1468 //\r
d1050b9d 1469 NetLibGetSnpHandle (ControllerHandle, &Private->Snp);\r
a3bcde70
HT
1470 }\r
1471\r
6879581d 1472 if (IpVersion == IP_VERSION_4) {\r
1473 //\r
1474 // Try to create virtual NIC handle for IPv4.\r
1475 //\r
1476 Status = PxeBcCreateIp4Children (This, ControllerHandle, Private);\r
1477 } else {\r
1478 //\r
1479 // Try to create virtual NIC handle for IPv6.\r
1480 //\r
1481 Status = PxeBcCreateIp6Children (This, ControllerHandle, Private);\r
1482 }\r
d1050b9d 1483\r
6879581d 1484 if (EFI_ERROR (Status)) {\r
a3bcde70
HT
1485 //\r
1486 // Failed to start PXE driver if IPv4 and IPv6 stack are both not available.\r
1487 //\r
1488 Status = EFI_DEVICE_ERROR;\r
1489 goto ON_ERROR;\r
1490 }\r
1491\r
1492 return EFI_SUCCESS;\r
1493\r
1494ON_ERROR:\r
6879581d 1495 if (FirstStart) {\r
1496 gBS->UninstallProtocolInterface (\r
1497 ControllerHandle,\r
1498 &gEfiCallerIdGuid,\r
1499 &Private->Id\r
1500 );\r
6879581d 1501 }\r
1502\r
1503 if (IpVersion == IP_VERSION_4) {\r
1504 PxeBcDestroyIp4Children (This, Private);\r
1505 } else {\r
1506 PxeBcDestroyIp6Children (This, Private);\r
1507 }\r
a3bcde70 1508\r
d1050b9d 1509 if (FirstStart && (Private != NULL)) {\r
3d2367a2 1510 FreePool (Private);\r
1511 }\r
1512\r
a3bcde70
HT
1513 return Status;\r
1514}\r
1515\r
a3bcde70 1516/**\r
6879581d 1517 Stop this driver on ControllerHandle. This is the worker function for\r
1518 PxeBcIp4(6)DriverBindingStop.\r
a3bcde70
HT
1519\r
1520 @param[in] This Protocol instance pointer.\r
1521 @param[in] ControllerHandle Handle of device to stop driver on.\r
1522 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
1523 children is zero stop the entire bus driver.\r
1524 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
6879581d 1525 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
a3bcde70
HT
1526\r
1527 @retval EFI_SUCCESS This driver was removed ControllerHandle.\r
1528 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1529 @retval Others This driver was not removed from this device\r
1530\r
1531**/\r
1532EFI_STATUS\r
1533EFIAPI\r
6879581d 1534PxeBcStop (\r
a3bcde70
HT
1535 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1536 IN EFI_HANDLE ControllerHandle,\r
1537 IN UINTN NumberOfChildren,\r
6879581d 1538 IN EFI_HANDLE *ChildHandleBuffer,\r
1539 IN UINT8 IpVersion\r
a3bcde70
HT
1540 )\r
1541{\r
d1050b9d
MK
1542 PXEBC_PRIVATE_DATA *Private;\r
1543 PXEBC_VIRTUAL_NIC *VirtualNic;\r
1544 EFI_LOAD_FILE_PROTOCOL *LoadFile;\r
1545 EFI_STATUS Status;\r
1546 EFI_HANDLE NicHandle;\r
1547 PXEBC_PRIVATE_PROTOCOL *Id;\r
a3bcde70
HT
1548\r
1549 Private = NULL;\r
1550 NicHandle = NULL;\r
1551 VirtualNic = NULL;\r
1552 LoadFile = NULL;\r
15f3fc85 1553 Id = NULL;\r
a3bcde70
HT
1554\r
1555 Status = gBS->OpenProtocol (\r
1556 ControllerHandle,\r
1557 &gEfiLoadFileProtocolGuid,\r
d1050b9d 1558 (VOID **)&LoadFile,\r
a3bcde70
HT
1559 This->DriverBindingHandle,\r
1560 ControllerHandle,\r
1561 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1562 );\r
1563 if (EFI_ERROR (Status)) {\r
1564 //\r
1565 // Get the Nic handle by any pass-over service child handle.\r
1566 //\r
6879581d 1567 if (IpVersion == IP_VERSION_4) {\r
1568 NicHandle = PxeBcGetNicByIp4Children (ControllerHandle);\r
1569 } else {\r
a3bcde70 1570 NicHandle = PxeBcGetNicByIp6Children (ControllerHandle);\r
6879581d 1571 }\r
d1050b9d 1572\r
6879581d 1573 if (NicHandle == NULL) {\r
1574 return EFI_SUCCESS;\r
a3bcde70
HT
1575 }\r
1576\r
1577 //\r
15f3fc85 1578 // Try to retrieve the private data by PxeBcPrivate protocol.\r
a3bcde70
HT
1579 //\r
1580 Status = gBS->OpenProtocol (\r
1581 NicHandle,\r
9bdc6592 1582 &gEfiCallerIdGuid,\r
d1050b9d 1583 (VOID **)&Id,\r
a3bcde70
HT
1584 This->DriverBindingHandle,\r
1585 ControllerHandle,\r
1586 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1587 );\r
1588 if (EFI_ERROR (Status)) {\r
1589 return Status;\r
1590 }\r
a3bcde70 1591\r
d1050b9d 1592 Private = PXEBC_PRIVATE_DATA_FROM_ID (Id);\r
a3bcde70
HT
1593 } else {\r
1594 //\r
1595 // It's a virtual handle with LoadFileProtocol.\r
1596 //\r
1597 Status = gBS->OpenProtocol (\r
1598 ControllerHandle,\r
1599 &gEfiLoadFileProtocolGuid,\r
d1050b9d 1600 (VOID **)&LoadFile,\r
a3bcde70
HT
1601 This->DriverBindingHandle,\r
1602 ControllerHandle,\r
1603 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1604 );\r
1605 if (EFI_ERROR (Status)) {\r
1606 return Status;\r
1607 }\r
1608\r
1609 VirtualNic = PXEBC_VIRTUAL_NIC_FROM_LOADFILE (LoadFile);\r
1610 Private = VirtualNic->Private;\r
1611 NicHandle = Private->Controller;\r
a3bcde70
HT
1612 }\r
1613\r
d6d78ac1 1614 //\r
1615 // Stop functionality of PXE Base Code protocol\r
1616 //\r
1617 Status = Private->PxeBc.Stop (&Private->PxeBc);\r
d1050b9d 1618 if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_STARTED)) {\r
d6d78ac1 1619 return Status;\r
1620 }\r
1621\r
d1050b9d 1622 if ((Private->Ip4Nic != NULL) && (IpVersion == IP_VERSION_4)) {\r
a3bcde70
HT
1623 PxeBcDestroyIp4Children (This, Private);\r
1624 }\r
1625\r
d1050b9d 1626 if ((Private->Ip6Nic != NULL) && (IpVersion == IP_VERSION_6)) {\r
a3bcde70
HT
1627 PxeBcDestroyIp6Children (This, Private);\r
1628 }\r
1629\r
d1050b9d 1630 if ((Private->Ip4Nic == NULL) && (Private->Ip6Nic == NULL)) {\r
a3bcde70
HT
1631 gBS->UninstallProtocolInterface (\r
1632 NicHandle,\r
9bdc6592 1633 &gEfiCallerIdGuid,\r
15f3fc85 1634 &Private->Id\r
a3bcde70
HT
1635 );\r
1636 FreePool (Private);\r
1637 }\r
1638\r
1639 return EFI_SUCCESS;\r
1640}\r
6879581d 1641\r
1642/**\r
1643 Test to see if this driver supports ControllerHandle. This service\r
1644 is called by the EFI boot service ConnectController(). In\r
1645 order to make drivers as small as possible, there are a few calling\r
1646 restrictions for this service. ConnectController() must\r
1647 follow these calling restrictions. If any other agent wishes to call\r
1648 Supported() it must also follow these calling restrictions.\r
1649\r
1650 @param[in] This The pointer to the driver binding protocol.\r
1651 @param[in] ControllerHandle The handle of device to be tested.\r
1652 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1653 device to be started.\r
1654\r
1655 @retval EFI_SUCCESS This driver supports this device.\r
1656 @retval EFI_UNSUPPORTED This driver does not support this device.\r
1657\r
1658**/\r
1659EFI_STATUS\r
1660EFIAPI\r
1661PxeBcIp4DriverBindingSupported (\r
1662 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1663 IN EFI_HANDLE ControllerHandle,\r
1664 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1665 )\r
1666{\r
1667 return PxeBcSupported (\r
1668 This,\r
1669 ControllerHandle,\r
1670 RemainingDevicePath,\r
1671 IP_VERSION_4\r
1672 );\r
1673}\r
1674\r
1675/**\r
1676 Start this driver on ControllerHandle. This service is called by the\r
1677 EFI boot service ConnectController(). In order to make\r
1678 drivers as small as possible, there are a few calling restrictions for\r
1679 this service. ConnectController() must follow these\r
1680 calling restrictions. If any other agent wishes to call Start() it\r
1681 must also follow these calling restrictions.\r
1682\r
1683 @param[in] This The pointer to the driver binding protocol.\r
1684 @param[in] ControllerHandle The handle of device to be started.\r
1685 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1686 device to be started.\r
1687\r
1688 @retval EFI_SUCCESS This driver is installed to ControllerHandle.\r
1689 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
1690 @retval other This driver does not support this device.\r
1691\r
1692**/\r
1693EFI_STATUS\r
1694EFIAPI\r
1695PxeBcIp4DriverBindingStart (\r
1696 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1697 IN EFI_HANDLE ControllerHandle,\r
1698 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1699 )\r
1700{\r
1701 return PxeBcStart (\r
1702 This,\r
1703 ControllerHandle,\r
1704 RemainingDevicePath,\r
1705 IP_VERSION_4\r
1706 );\r
1707}\r
1708\r
1709/**\r
1710 Stop this driver on ControllerHandle. This service is called by the\r
1711 EFI boot service DisconnectController(). In order to\r
1712 make drivers as small as possible, there are a few calling\r
1713 restrictions for this service. DisconnectController()\r
1714 must follow these calling restrictions. If any other agent wishes\r
1715 to call Stop() it must also follow these calling restrictions.\r
1716\r
1717 @param[in] This Protocol instance pointer.\r
1718 @param[in] ControllerHandle Handle of device to stop driver on\r
1719 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
1720 children is zero stop the entire bus driver.\r
1721 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
1722\r
1723 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
1724 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1725 @retval Others This driver was not removed from this device.\r
1726\r
1727**/\r
1728EFI_STATUS\r
1729EFIAPI\r
1730PxeBcIp4DriverBindingStop (\r
1731 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1732 IN EFI_HANDLE ControllerHandle,\r
1733 IN UINTN NumberOfChildren,\r
1734 IN EFI_HANDLE *ChildHandleBuffer\r
1735 )\r
1736{\r
1737 return PxeBcStop (\r
1738 This,\r
1739 ControllerHandle,\r
1740 NumberOfChildren,\r
1741 ChildHandleBuffer,\r
1742 IP_VERSION_4\r
1743 );\r
1744}\r
1745\r
1746/**\r
1747 Test to see if this driver supports ControllerHandle. This service\r
1748 is called by the EFI boot service ConnectController(). In\r
1749 order to make drivers as small as possible, there are a few calling\r
1750 restrictions for this service. ConnectController() must\r
1751 follow these calling restrictions. If any other agent wishes to call\r
1752 Supported() it must also follow these calling restrictions.\r
1753\r
1754 @param[in] This The pointer to the driver binding protocol.\r
1755 @param[in] ControllerHandle The handle of device to be tested.\r
1756 @param[in] RemainingDevicePath Optional parameter use to pick a specific child\r
1757 device to be started.\r
1758\r
1759 @retval EFI_SUCCESS This driver supports this device.\r
1760 @retval EFI_UNSUPPORTED This driver does not support this device.\r
1761\r
1762**/\r
1763EFI_STATUS\r
1764EFIAPI\r
1765PxeBcIp6DriverBindingSupported (\r
1766 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1767 IN EFI_HANDLE ControllerHandle,\r
1768 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1769 )\r
1770{\r
1771 return PxeBcSupported (\r
1772 This,\r
1773 ControllerHandle,\r
1774 RemainingDevicePath,\r
1775 IP_VERSION_6\r
1776 );\r
1777}\r
1778\r
1779/**\r
1780 Start this driver on ControllerHandle. This service is called by the\r
1781 EFI boot service ConnectController(). In order to make\r
1782 drivers as small as possible, there are a few calling restrictions for\r
1783 this service. ConnectController() must follow these\r
1784 calling restrictions. If any other agent wishes to call Start() it\r
1785 must also follow these calling restrictions.\r
1786\r
1787 @param[in] This The pointer to the driver binding protocol.\r
1788 @param[in] ControllerHandle The handle of device to be started.\r
1789 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1790 device to be started.\r
1791\r
1792 @retval EFI_SUCCESS This driver is installed to ControllerHandle.\r
1793 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
1794 @retval other This driver does not support this device.\r
1795\r
1796**/\r
1797EFI_STATUS\r
1798EFIAPI\r
1799PxeBcIp6DriverBindingStart (\r
1800 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1801 IN EFI_HANDLE ControllerHandle,\r
1802 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1803 )\r
1804{\r
1805 return PxeBcStart (\r
1806 This,\r
1807 ControllerHandle,\r
1808 RemainingDevicePath,\r
1809 IP_VERSION_6\r
1810 );\r
1811}\r
1812\r
1813/**\r
1814 Stop this driver on ControllerHandle. This service is called by the\r
1815 EFI boot service DisconnectController(). In order to\r
1816 make drivers as small as possible, there are a few calling\r
1817 restrictions for this service. DisconnectController()\r
1818 must follow these calling restrictions. If any other agent wishes\r
1819 to call Stop() it must also follow these calling restrictions.\r
1820\r
1821 @param[in] This Protocol instance pointer.\r
1822 @param[in] ControllerHandle Handle of device to stop driver on\r
1823 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
1824 children is zero stop the entire bus driver.\r
1825 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
1826\r
1827 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
1828 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1829 @retval Others This driver was not removed from this device.\r
1830\r
1831**/\r
1832EFI_STATUS\r
1833EFIAPI\r
1834PxeBcIp6DriverBindingStop (\r
1835 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1836 IN EFI_HANDLE ControllerHandle,\r
1837 IN UINTN NumberOfChildren,\r
1838 IN EFI_HANDLE *ChildHandleBuffer\r
1839 )\r
1840{\r
1841 return PxeBcStop (\r
1842 This,\r
1843 ControllerHandle,\r
1844 NumberOfChildren,\r
1845 ChildHandleBuffer,\r
1846 IP_VERSION_6\r
1847 );\r
1848}\r