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