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