]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
NetworkPkg: Add URI configuration form to HTTP boot driver.
[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
ce22514e 5 Copyright (c) 2007 - 2016, 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
ac99793b
ZL
745 //\r
746 // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.\r
747 //\r
748 Status = gBS->HandleProtocol (\r
749 ControllerHandle,\r
750 &gEfiIp4Config2ProtocolGuid,\r
751 (VOID **) &Private->Ip4Config2\r
752 );\r
753 if (EFI_ERROR (Status)) {\r
754 goto ON_ERROR;\r
755 }\r
756\r
a3bcde70
HT
757 //\r
758 // Create a device path node for Ipv4 virtual nic, and append it.\r
759 //\r
760 ZeroMem (&Ip4Node, sizeof (IPv4_DEVICE_PATH));\r
761 Ip4Node.Header.Type = MESSAGING_DEVICE_PATH;\r
762 Ip4Node.Header.SubType = MSG_IPv4_DP;\r
763 Ip4Node.StaticIpAddress = FALSE;\r
764\r
765 SetDevicePathNodeLength (&Ip4Node.Header, sizeof (Ip4Node));\r
766\r
767 Private->Ip4Nic->DevicePath = AppendDevicePathNode (Private->DevicePath, &Ip4Node.Header);\r
768\r
769 if (Private->Ip4Nic->DevicePath == NULL) {\r
770 Status = EFI_OUT_OF_RESOURCES;\r
771 goto ON_ERROR;\r
772 }\r
773\r
774 CopyMem (\r
775 &Private->Ip4Nic->LoadFile,\r
776 &gLoadFileProtocolTemplate,\r
777 sizeof (EFI_LOAD_FILE_PROTOCOL)\r
778 );\r
779\r
780 //\r
781 // Create a new handle for IPv4 virtual nic,\r
782 // and install PxeBaseCode, LoadFile and DevicePath protocols.\r
783 //\r
784 Status = gBS->InstallMultipleProtocolInterfaces (\r
785 &Private->Ip4Nic->Controller,\r
786 &gEfiDevicePathProtocolGuid,\r
787 Private->Ip4Nic->DevicePath,\r
788 &gEfiLoadFileProtocolGuid,\r
789 &Private->Ip4Nic->LoadFile,\r
15f3fc85 790 &gEfiPxeBaseCodeProtocolGuid,\r
791 &Private->PxeBc,\r
a3bcde70
HT
792 NULL\r
793 );\r
794 if (EFI_ERROR (Status)) {\r
795 goto ON_ERROR;\r
796 }\r
797\r
15f3fc85 798 if (Private->Snp != NULL) {\r
799 //\r
800 // Install SNP protocol on purpose is for some OS loader backward\r
801 // compatibility consideration.\r
802 //\r
803 Status = gBS->InstallProtocolInterface (\r
804 &Private->Ip4Nic->Controller,\r
805 &gEfiSimpleNetworkProtocolGuid,\r
806 EFI_NATIVE_INTERFACE,\r
807 Private->Snp\r
808 );\r
809 if (EFI_ERROR (Status)) {\r
810 goto ON_ERROR;\r
811 }\r
812\r
813 //\r
814 // Open SNP on the child handle BY_DRIVER. It will prevent any additionally \r
815 // layering to perform the experiment.\r
816 //\r
817 Status = gBS->OpenProtocol (\r
818 Private->Ip4Nic->Controller,\r
819 &gEfiSimpleNetworkProtocolGuid,\r
820 (VOID **) &Snp,\r
821 This->DriverBindingHandle,\r
822 Private->Ip4Nic->Controller,\r
823 EFI_OPEN_PROTOCOL_BY_DRIVER\r
824 );\r
825 if (EFI_ERROR (Status)) {\r
826 goto ON_ERROR;\r
827 }\r
828 }\r
829\r
a3bcde70 830 //\r
15f3fc85 831 // Open PxeBaseCodePrivate protocol by child to setup a parent-child relationship between\r
a3bcde70
HT
832 // real NIC handle and the virtual IPv4 NIC handle.\r
833 //\r
834 Status = gBS->OpenProtocol (\r
835 ControllerHandle,\r
9bdc6592 836 &gEfiCallerIdGuid,\r
15f3fc85 837 (VOID **) &Id,\r
a3bcde70
HT
838 This->DriverBindingHandle,\r
839 Private->Ip4Nic->Controller,\r
840 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
841 );\r
842 if (EFI_ERROR (Status)) {\r
843 goto ON_ERROR;\r
844 }\r
845\r
846 //\r
847 // Set default configure data for Udp4Read and Ip4 instance.\r
848 //\r
15f3fc85 849 Mode = Private->PxeBc.Mode;\r
a3bcde70
HT
850 Udp4CfgData = &Private->Udp4CfgData;\r
851 Ip4CfgData = &Private->Ip4CfgData;\r
852\r
18127352 853 Udp4CfgData->AcceptBroadcast = FALSE;\r
a3bcde70
HT
854 Udp4CfgData->AcceptAnyPort = TRUE;\r
855 Udp4CfgData->AllowDuplicatePort = TRUE;\r
856 Udp4CfgData->TypeOfService = Mode->ToS;\r
857 Udp4CfgData->TimeToLive = Mode->TTL;\r
858 Udp4CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
859 Udp4CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
860\r
861 Ip4CfgData->AcceptIcmpErrors = TRUE;\r
862 Ip4CfgData->DefaultProtocol = EFI_IP_PROTO_ICMP;\r
863 Ip4CfgData->TypeOfService = Mode->ToS;\r
864 Ip4CfgData->TimeToLive = Mode->TTL;\r
865 Ip4CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
866 Ip4CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
867\r
868 return EFI_SUCCESS;\r
869\r
870ON_ERROR:\r
871 PxeBcDestroyIp4Children (This, Private);\r
872 return Status;\r
873}\r
874\r
875\r
876/**\r
877 Create the opened instances based on IPv6.\r
878\r
879 @param[in] This Pointer to EFI_DRIVER_BINDING_PROTOCOL.\r
880 @param[in] ControllerHandle Handle of the child to destroy.\r
881 @param[in] Private Handle Pointer to PXEBC_PRIVATE_DATA.\r
882\r
883 @retval EFI_SUCCESS The instances based on IPv6 were all created successfully.\r
884 @retval Others An unexpected error occurred.\r
885\r
886**/\r
887EFI_STATUS\r
888PxeBcCreateIp6Children (\r
889 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
890 IN EFI_HANDLE ControllerHandle,\r
891 IN PXEBC_PRIVATE_DATA *Private\r
892 )\r
893{\r
894 EFI_STATUS Status;\r
895 IPv6_DEVICE_PATH Ip6Node;\r
a3bcde70
HT
896 EFI_UDP6_CONFIG_DATA *Udp6CfgData;\r
897 EFI_IP6_CONFIG_DATA *Ip6CfgData;\r
898 EFI_IP6_MODE_DATA Ip6ModeData;\r
15f3fc85 899 PXEBC_PRIVATE_PROTOCOL *Id;\r
900 EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
75dce340 901 UINTN Index;\r
a3bcde70
HT
902\r
903 if (Private->Ip6Nic != NULL) {\r
904 //\r
905 // Already created before.\r
906 //\r
907 return EFI_SUCCESS;\r
908 }\r
909\r
910 Private->Ip6Nic = AllocateZeroPool (sizeof (PXEBC_VIRTUAL_NIC));\r
911\r
912 if (Private->Ip6Nic == NULL) {\r
913 return EFI_OUT_OF_RESOURCES;\r
914 }\r
915\r
916 Private->Ip6Nic->Private = Private;\r
917 Private->Ip6Nic->Signature = PXEBC_VIRTUAL_NIC_SIGNATURE;\r
918\r
919 //\r
920 // Create Dhcp6 child and open Dhcp6 protocol for PxeBc->Dhcp.\r
921 //\r
922 Status = NetLibCreateServiceChild (\r
923 ControllerHandle,\r
924 This->DriverBindingHandle,\r
925 &gEfiDhcp6ServiceBindingProtocolGuid,\r
926 &Private->Dhcp6Child\r
927 );\r
928 if (EFI_ERROR (Status)) {\r
929 goto ON_ERROR;\r
930 }\r
931\r
932 Status = gBS->OpenProtocol (\r
933 Private->Dhcp6Child,\r
934 &gEfiDhcp6ProtocolGuid,\r
935 (VOID **) &Private->Dhcp6,\r
936 This->DriverBindingHandle,\r
937 ControllerHandle,\r
938 EFI_OPEN_PROTOCOL_BY_DRIVER\r
939 );\r
940 if (EFI_ERROR (Status)) {\r
941 goto ON_ERROR;\r
942 }\r
943\r
75dce340 944 //\r
945 // Generate a random IAID for the Dhcp6 assigned address.\r
946 //\r
947 Private->IaId = NET_RANDOM (NetRandomInitSeed ());\r
948 if (Private->Snp != NULL) {\r
949 for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) {\r
950 Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31));\r
951 } \r
952 }\r
953\r
a3bcde70
HT
954 //\r
955 // Create Mtftp6 child and open Mtftp6 protocol for PxeBc->Mtftp.\r
956 //\r
957 Status = NetLibCreateServiceChild (\r
958 ControllerHandle,\r
959 This->DriverBindingHandle,\r
960 &gEfiMtftp6ServiceBindingProtocolGuid,\r
961 &Private->Mtftp6Child\r
962 );\r
963 if (EFI_ERROR (Status)) {\r
964 goto ON_ERROR;\r
965 }\r
966\r
967 Status = gBS->OpenProtocol (\r
968 Private->Mtftp6Child,\r
969 &gEfiMtftp6ProtocolGuid,\r
970 (VOID **) &Private->Mtftp6,\r
971 This->DriverBindingHandle,\r
972 ControllerHandle,\r
973 EFI_OPEN_PROTOCOL_BY_DRIVER\r
974 );\r
975 if (EFI_ERROR (Status)) {\r
976 goto ON_ERROR;\r
977 }\r
978\r
979 //\r
980 // Create Udp6 child and open Udp6 protocol for PxeBc->UdpRead.\r
981 //\r
982 Status = NetLibCreateServiceChild (\r
983 ControllerHandle,\r
984 This->DriverBindingHandle,\r
985 &gEfiUdp6ServiceBindingProtocolGuid,\r
986 &Private->Udp6ReadChild\r
987 );\r
988 if (EFI_ERROR (Status)) {\r
989 goto ON_ERROR;\r
990 }\r
991\r
992 Status = gBS->OpenProtocol (\r
993 Private->Udp6ReadChild,\r
994 &gEfiUdp6ProtocolGuid,\r
995 (VOID **) &Private->Udp6Read,\r
996 This->DriverBindingHandle,\r
997 ControllerHandle,\r
998 EFI_OPEN_PROTOCOL_BY_DRIVER\r
999 );\r
1000 if (EFI_ERROR (Status)) {\r
1001 goto ON_ERROR;\r
1002 }\r
1003\r
1004 //\r
1005 // Create Udp6 child and open Udp6 protocol for PxeBc->UdpWrite.\r
1006 //\r
1007 Status = NetLibCreateServiceChild (\r
1008 ControllerHandle,\r
1009 This->DriverBindingHandle,\r
1010 &gEfiUdp6ServiceBindingProtocolGuid,\r
1011 &Private->Udp6WriteChild\r
1012 );\r
1013 if (EFI_ERROR (Status)) {\r
1014 goto ON_ERROR;\r
1015 }\r
1016\r
1017 Status = gBS->OpenProtocol (\r
1018 Private->Udp6WriteChild,\r
1019 &gEfiUdp6ProtocolGuid,\r
1020 (VOID **) &Private->Udp6Write,\r
1021 This->DriverBindingHandle,\r
1022 ControllerHandle,\r
1023 EFI_OPEN_PROTOCOL_BY_DRIVER\r
1024 );\r
1025 if (EFI_ERROR (Status)) {\r
1026 goto ON_ERROR;\r
1027 }\r
1028\r
1029 //\r
1030 // Create Ip6 child and open Ip6 protocol for background ICMP6 packets.\r
1031 //\r
1032 Status = NetLibCreateServiceChild (\r
1033 ControllerHandle,\r
1034 This->DriverBindingHandle,\r
1035 &gEfiIp6ServiceBindingProtocolGuid,\r
1036 &Private->Ip6Child\r
1037 );\r
1038 if (EFI_ERROR (Status)) {\r
1039 goto ON_ERROR;\r
1040 }\r
1041\r
1042 Status = gBS->OpenProtocol (\r
1043 Private->Ip6Child,\r
1044 &gEfiIp6ProtocolGuid,\r
1045 (VOID **) &Private->Ip6,\r
1046 This->DriverBindingHandle,\r
1047 ControllerHandle,\r
1048 EFI_OPEN_PROTOCOL_BY_DRIVER\r
1049 );\r
1050 if (EFI_ERROR (Status)) {\r
1051 goto ON_ERROR;\r
1052 }\r
1053\r
1054 //\r
1055 // Get max packet size from Ip6 to calculate block size for Tftp later.\r
1056 //\r
1057 Status = Private->Ip6->GetModeData (Private->Ip6, &Ip6ModeData, NULL, NULL);\r
1058 if (EFI_ERROR (Status)) {\r
1059 goto ON_ERROR;\r
1060 }\r
1061\r
1062 Private->Ip6MaxPacketSize = Ip6ModeData.MaxPacketSize;\r
1063\r
ce22514e
ZL
1064 if (Ip6ModeData.AddressList != NULL) {\r
1065 FreePool (Ip6ModeData.AddressList);\r
1066 }\r
1067\r
1068 if (Ip6ModeData.GroupTable != NULL) {\r
1069 FreePool (Ip6ModeData.GroupTable);\r
1070 }\r
1071\r
1072 if (Ip6ModeData.RouteTable != NULL) {\r
1073 FreePool (Ip6ModeData.RouteTable);\r
1074 }\r
1075\r
1076 if (Ip6ModeData.NeighborCache != NULL) {\r
1077 FreePool (Ip6ModeData.NeighborCache);\r
1078 }\r
1079\r
1080 if (Ip6ModeData.PrefixTable != NULL) {\r
1081 FreePool (Ip6ModeData.PrefixTable);\r
1082 }\r
1083\r
1084 if (Ip6ModeData.IcmpTypeList != NULL) {\r
1085 FreePool (Ip6ModeData.IcmpTypeList);\r
1086 }\r
1087\r
a3bcde70
HT
1088 //\r
1089 // Locate Ip6->Ip6Config and store it for set IPv6 address.\r
1090 //\r
1091 Status = gBS->HandleProtocol (\r
1092 ControllerHandle,\r
1093 &gEfiIp6ConfigProtocolGuid,\r
1094 (VOID **) &Private->Ip6Cfg\r
1095 );\r
1096 if (EFI_ERROR (Status)) {\r
1097 goto ON_ERROR;\r
1098 }\r
1099\r
1100 //\r
1101 // Create a device path node for Ipv6 virtual nic, and append it.\r
1102 //\r
1103 ZeroMem (&Ip6Node, sizeof (IPv6_DEVICE_PATH));\r
1104 Ip6Node.Header.Type = MESSAGING_DEVICE_PATH;\r
1105 Ip6Node.Header.SubType = MSG_IPv6_DP;\r
501793fa 1106 Ip6Node.PrefixLength = IP6_PREFIX_LENGTH;\r
a3bcde70
HT
1107\r
1108 SetDevicePathNodeLength (&Ip6Node.Header, sizeof (Ip6Node));\r
1109\r
1110 Private->Ip6Nic->DevicePath = AppendDevicePathNode (Private->DevicePath, &Ip6Node.Header);\r
1111\r
1112 if (Private->Ip6Nic->DevicePath == NULL) {\r
1113 Status = EFI_OUT_OF_RESOURCES;\r
1114 goto ON_ERROR;\r
1115 }\r
1116\r
1117 CopyMem (\r
1118 &Private->Ip6Nic->LoadFile,\r
1119 &gLoadFileProtocolTemplate,\r
1120 sizeof (EFI_LOAD_FILE_PROTOCOL)\r
1121 );\r
1122\r
1123 //\r
1124 // Create a new handle for IPv6 virtual nic,\r
1125 // and install PxeBaseCode, LoadFile and DevicePath protocols.\r
1126 //\r
1127 Status = gBS->InstallMultipleProtocolInterfaces (\r
1128 &Private->Ip6Nic->Controller,\r
1129 &gEfiDevicePathProtocolGuid,\r
1130 Private->Ip6Nic->DevicePath,\r
1131 &gEfiLoadFileProtocolGuid,\r
1132 &Private->Ip6Nic->LoadFile,\r
15f3fc85 1133 &gEfiPxeBaseCodeProtocolGuid,\r
1134 &Private->PxeBc,\r
a3bcde70
HT
1135 NULL\r
1136 );\r
1137 if (EFI_ERROR (Status)) {\r
1138 goto ON_ERROR;\r
1139 }\r
15f3fc85 1140 \r
1141 if (Private->Snp != NULL) {\r
1142 //\r
1143 // Install SNP protocol on purpose is for some OS loader backward\r
1144 // compatibility consideration.\r
1145 //\r
1146 Status = gBS->InstallProtocolInterface (\r
1147 &Private->Ip6Nic->Controller,\r
1148 &gEfiSimpleNetworkProtocolGuid,\r
1149 EFI_NATIVE_INTERFACE,\r
1150 Private->Snp\r
1151 );\r
1152 if (EFI_ERROR (Status)) {\r
1153 goto ON_ERROR;\r
1154 }\r
1155\r
1156 //\r
1157 // Open SNP on the child handle BY_DRIVER. It will prevent any additionally \r
1158 // layering to perform the experiment.\r
1159 //\r
1160 Status = gBS->OpenProtocol (\r
1161 Private->Ip6Nic->Controller,\r
1162 &gEfiSimpleNetworkProtocolGuid,\r
1163 (VOID **) &Snp,\r
1164 This->DriverBindingHandle,\r
1165 Private->Ip6Nic->Controller,\r
1166 EFI_OPEN_PROTOCOL_BY_DRIVER\r
1167 );\r
1168 if (EFI_ERROR (Status)) {\r
1169 goto ON_ERROR;\r
1170 }\r
1171 }\r
a3bcde70
HT
1172\r
1173 //\r
15f3fc85 1174 // Open PxeBaseCodePrivate protocol by child to setup a parent-child relationship between\r
a3bcde70
HT
1175 // real NIC handle and the virtual IPv6 NIC handle.\r
1176 //\r
1177 Status = gBS->OpenProtocol (\r
1178 ControllerHandle,\r
9bdc6592 1179 &gEfiCallerIdGuid,\r
15f3fc85 1180 (VOID **) &Id,\r
a3bcde70
HT
1181 This->DriverBindingHandle,\r
1182 Private->Ip6Nic->Controller,\r
1183 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
1184 );\r
1185 if (EFI_ERROR (Status)) {\r
1186 goto ON_ERROR;\r
1187 }\r
1188\r
1189 //\r
1190 // Set IPv6 avaiable flag and set default configure data for\r
1191 // Udp6Read and Ip6 instance.\r
1192 //\r
2bbe9553
YT
1193 Status = PxeBcCheckIpv6Support (ControllerHandle, Private, &Private->Mode.Ipv6Available);\r
1194 if (EFI_ERROR (Status)) {\r
1195 //\r
1196 // Fail to get the data whether UNDI supports IPv6. Set default value.\r
1197 //\r
1198 Private->Mode.Ipv6Available = TRUE;\r
1199 }\r
1200\r
1201 if (!Private->Mode.Ipv6Available) {\r
1202 goto ON_ERROR;\r
1203 }\r
1204\r
a3bcde70
HT
1205 Udp6CfgData = &Private->Udp6CfgData;\r
1206 Ip6CfgData = &Private->Ip6CfgData;\r
1207\r
1208 Udp6CfgData->AcceptAnyPort = TRUE;\r
1209 Udp6CfgData->AllowDuplicatePort = TRUE;\r
1210 Udp6CfgData->HopLimit = PXEBC_DEFAULT_HOPLIMIT;\r
1211 Udp6CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
1212 Udp6CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
1213\r
1214 Ip6CfgData->AcceptIcmpErrors = TRUE;\r
1215 Ip6CfgData->DefaultProtocol = IP6_ICMP;\r
1216 Ip6CfgData->HopLimit = PXEBC_DEFAULT_HOPLIMIT;\r
1217 Ip6CfgData->ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
1218 Ip6CfgData->TransmitTimeout = PXEBC_DEFAULT_LIFETIME;\r
1219\r
1220 return EFI_SUCCESS;\r
1221\r
1222ON_ERROR:\r
1223 PxeBcDestroyIp6Children (This, Private);\r
1224 return Status;\r
1225}\r
1226\r
1227\r
1228/**\r
1229 The entry point for UefiPxeBc driver that installs the driver\r
1230 binding and component name protocol on its image.\r
1231\r
1232 @param[in] ImageHandle The Image handle of the driver.\r
1233 @param[in] SystemTable The system table.\r
1234\r
1235 @return EFI_SUCCESS\r
1236 @return Others\r
1237\r
1238**/\r
1239EFI_STATUS\r
1240EFIAPI\r
1241PxeBcDriverEntryPoint (\r
1242 IN EFI_HANDLE ImageHandle,\r
1243 IN EFI_SYSTEM_TABLE *SystemTable\r
1244 )\r
1245{\r
6879581d 1246 EFI_STATUS Status;\r
1247\r
1248 Status = EfiLibInstallDriverBindingComponentName2 (\r
1249 ImageHandle,\r
1250 SystemTable,\r
1251 &gPxeBcIp4DriverBinding,\r
1252 ImageHandle,\r
1253 &gPxeBcComponentName,\r
1254 &gPxeBcComponentName2\r
1255 );\r
1256 if (EFI_ERROR (Status)) {\r
1257 return Status;\r
1258 }\r
1259\r
1260 Status = EfiLibInstallDriverBindingComponentName2 (\r
1261 ImageHandle,\r
1262 SystemTable,\r
1263 &gPxeBcIp6DriverBinding,\r
1264 NULL,\r
1265 &gPxeBcComponentName,\r
1266 &gPxeBcComponentName2\r
1267 );\r
1268 if (EFI_ERROR (Status)) {\r
1269 gBS->UninstallMultipleProtocolInterfaces (\r
a3bcde70 1270 ImageHandle,\r
6879581d 1271 &gEfiDriverBindingProtocolGuid,\r
1272 &gPxeBcIp4DriverBinding,\r
1273 &gEfiComponentName2ProtocolGuid,\r
1274 &gPxeBcComponentName2,\r
1275 &gEfiComponentNameProtocolGuid,\r
a3bcde70 1276 &gPxeBcComponentName,\r
6879581d 1277 NULL\r
a3bcde70 1278 );\r
6879581d 1279 }\r
a3bcde70 1280\r
6879581d 1281 return Status;\r
1282}\r
a3bcde70
HT
1283\r
1284/**\r
6879581d 1285 Test to see if this driver supports ControllerHandle. This is the worker function for\r
1286 PxeBcIp4(6)DriverBindingSupported.\r
a3bcde70
HT
1287\r
1288 @param[in] This The pointer to the driver binding protocol.\r
1289 @param[in] ControllerHandle The handle of device to be tested.\r
1290 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1291 device to be started.\r
6879581d 1292 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
1293 \r
a3bcde70
HT
1294 @retval EFI_SUCCESS This driver supports this device.\r
1295 @retval EFI_UNSUPPORTED This driver does not support this device.\r
1296\r
1297**/\r
1298EFI_STATUS\r
1299EFIAPI\r
6879581d 1300PxeBcSupported (\r
a3bcde70
HT
1301 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1302 IN EFI_HANDLE ControllerHandle,\r
6879581d 1303 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,\r
1304 IN UINT8 IpVersion\r
a3bcde70
HT
1305 )\r
1306{\r
6879581d 1307 EFI_STATUS Status;\r
1308 EFI_GUID *DhcpServiceBindingGuid;\r
1309 EFI_GUID *MtftpServiceBindingGuid;\r
1310 \r
1311 if (IpVersion == IP_VERSION_4) {\r
1312 DhcpServiceBindingGuid = &gEfiDhcp4ServiceBindingProtocolGuid;\r
1313 MtftpServiceBindingGuid = &gEfiMtftp4ServiceBindingProtocolGuid;\r
1314 } else {\r
1315 DhcpServiceBindingGuid = &gEfiDhcp6ServiceBindingProtocolGuid;\r
1316 MtftpServiceBindingGuid = &gEfiMtftp6ServiceBindingProtocolGuid;\r
a3bcde70
HT
1317 }\r
1318\r
1319 //\r
6879581d 1320 // Try to open the Mtftp and Dhcp protocol to test whether IP stack is ready.\r
a3bcde70 1321 //\r
6879581d 1322 Status = gBS->OpenProtocol (\r
a3bcde70 1323 ControllerHandle,\r
6879581d 1324 DhcpServiceBindingGuid,\r
a3bcde70
HT
1325 NULL,\r
1326 This->DriverBindingHandle,\r
1327 ControllerHandle,\r
1328 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
1329 );\r
6879581d 1330 if (!EFI_ERROR (Status)) {\r
1331 Status = gBS->OpenProtocol (\r
a3bcde70 1332 ControllerHandle,\r
6879581d 1333 MtftpServiceBindingGuid,\r
a3bcde70
HT
1334 NULL,\r
1335 This->DriverBindingHandle,\r
1336 ControllerHandle,\r
1337 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
1338 );\r
1339 }\r
1340\r
1341 //\r
6879581d 1342 // It's unsupported case if IP stack are not ready.\r
a3bcde70 1343 //\r
6879581d 1344 if (EFI_ERROR (Status)) {\r
a3bcde70
HT
1345 return EFI_UNSUPPORTED;\r
1346 }\r
1347\r
1348 return EFI_SUCCESS;\r
1349}\r
1350\r
a3bcde70 1351/**\r
6879581d 1352 Start this driver on ControllerHandle. This is the worker function for\r
1353 PxeBcIp4(6)DriverBindingStart.\r
a3bcde70
HT
1354\r
1355 @param[in] This The pointer to the driver binding protocol.\r
1356 @param[in] ControllerHandle The handle of device to be started.\r
1357 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1358 device to be started.\r
6879581d 1359 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
1360\r
a3bcde70
HT
1361\r
1362 @retval EFI_SUCCESS This driver is installed to ControllerHandle.\r
1363 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
1364 @retval other This driver does not support this device.\r
1365\r
1366**/\r
1367EFI_STATUS\r
1368EFIAPI\r
6879581d 1369PxeBcStart (\r
a3bcde70
HT
1370 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1371 IN EFI_HANDLE ControllerHandle,\r
6879581d 1372 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,\r
1373 IN UINT8 IpVersion\r
a3bcde70
HT
1374 )\r
1375{\r
1376 PXEBC_PRIVATE_DATA *Private;\r
a3bcde70 1377 EFI_STATUS Status;\r
15f3fc85 1378 PXEBC_PRIVATE_PROTOCOL *Id;\r
6879581d 1379 BOOLEAN FirstStart;\r
a3bcde70 1380\r
6879581d 1381 FirstStart = FALSE;\r
a3bcde70
HT
1382 Status = gBS->OpenProtocol (\r
1383 ControllerHandle,\r
9bdc6592 1384 &gEfiCallerIdGuid,\r
15f3fc85 1385 (VOID **) &Id,\r
a3bcde70
HT
1386 This->DriverBindingHandle,\r
1387 ControllerHandle,\r
1388 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1389 );\r
1390 if (!EFI_ERROR (Status)) {\r
1391 //\r
1392 // Skip the initialization if the driver has been started already.\r
1393 //\r
15f3fc85 1394 Private = PXEBC_PRIVATE_DATA_FROM_ID (Id);\r
a3bcde70 1395 } else {\r
6879581d 1396 FirstStart = TRUE;\r
a3bcde70
HT
1397 //\r
1398 // If the driver has not been started yet, it should do initialization.\r
1399 //\r
1400 Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
1401 if (Private == NULL) {\r
1402 return EFI_OUT_OF_RESOURCES;\r
1403 }\r
1404\r
1405 CopyMem (\r
1406 &Private->PxeBc,\r
1407 &gPxeBcProtocolTemplate,\r
1408 sizeof (EFI_PXE_BASE_CODE_PROTOCOL)\r
1409 );\r
1410\r
1411 Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
1412 Private->Controller = ControllerHandle;\r
1413 Private->Image = This->ImageHandle;\r
1414 Private->PxeBc.Mode = &Private->Mode;\r
1415 Private->Mode.Ipv6Supported = TRUE;\r
1416 Private->Mode.AutoArp = TRUE;\r
1417 Private->Mode.TTL = DEFAULT_TTL;\r
1418 Private->Mode.ToS = DEFAULT_ToS;\r
1419\r
1420 //\r
1421 // Open device path to prepare for appending virtual NIC node.\r
1422 //\r
1423 Status = gBS->OpenProtocol (\r
1424 ControllerHandle,\r
1425 &gEfiDevicePathProtocolGuid,\r
1426 (VOID **) &Private->DevicePath,\r
1427 This->DriverBindingHandle,\r
1428 ControllerHandle,\r
1429 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1430 );\r
1431\r
1432 if (EFI_ERROR (Status)) {\r
1433 goto ON_ERROR;\r
1434 }\r
1435\r
1436 //\r
1437 // Get the NII interface if it exists, it's not required.\r
1438 //\r
1439 Status = gBS->OpenProtocol (\r
1440 ControllerHandle,\r
1441 &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
1442 (VOID **) &Private->Nii,\r
1443 This->DriverBindingHandle,\r
1444 ControllerHandle,\r
1445 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1446 );\r
1447 if (EFI_ERROR (Status)) {\r
1448 Private->Nii = NULL;\r
1449 }\r
1450\r
1451 //\r
15f3fc85 1452 // Install PxeBaseCodePrivate protocol onto the real NIC handler.\r
9bdc6592
LG
1453 // PxeBaseCodePrivate protocol is only used to keep the relationship between \r
1454 // NIC handle and virtual child handles.\r
1455 // gEfiCallerIdGuid will be used as its protocol guid.\r
a3bcde70
HT
1456 //\r
1457 Status = gBS->InstallProtocolInterface (\r
1458 &ControllerHandle,\r
9bdc6592 1459 &gEfiCallerIdGuid,\r
a3bcde70 1460 EFI_NATIVE_INTERFACE,\r
15f3fc85 1461 &Private->Id\r
a3bcde70
HT
1462 );\r
1463 if (EFI_ERROR (Status)) {\r
1464 goto ON_ERROR;\r
1465 }\r
15f3fc85 1466\r
1467 //\r
1468 // Try to locate SNP protocol.\r
1469 //\r
1470 NetLibGetSnpHandle(ControllerHandle, &Private->Snp); \r
a3bcde70
HT
1471 }\r
1472\r
6879581d 1473 if (IpVersion == IP_VERSION_4) {\r
1474 //\r
1475 // Try to create virtual NIC handle for IPv4.\r
1476 //\r
1477 Status = PxeBcCreateIp4Children (This, ControllerHandle, Private);\r
1478 } else {\r
1479 //\r
1480 // Try to create virtual NIC handle for IPv6.\r
1481 //\r
1482 Status = PxeBcCreateIp6Children (This, ControllerHandle, Private);\r
1483 }\r
1484 if (EFI_ERROR (Status)) {\r
a3bcde70
HT
1485 //\r
1486 // Failed to start PXE driver if IPv4 and IPv6 stack are both not available.\r
1487 //\r
1488 Status = EFI_DEVICE_ERROR;\r
1489 goto ON_ERROR;\r
1490 }\r
1491\r
1492 return EFI_SUCCESS;\r
1493\r
1494ON_ERROR:\r
6879581d 1495 if (FirstStart) {\r
1496 gBS->UninstallProtocolInterface (\r
1497 ControllerHandle,\r
1498 &gEfiCallerIdGuid,\r
1499 &Private->Id\r
1500 );\r
6879581d 1501 }\r
1502\r
1503 if (IpVersion == IP_VERSION_4) {\r
1504 PxeBcDestroyIp4Children (This, Private);\r
1505 } else {\r
1506 PxeBcDestroyIp6Children (This, Private);\r
1507 }\r
a3bcde70 1508\r
3d2367a2 1509 if (FirstStart && Private != NULL) {\r
1510 FreePool (Private);\r
1511 }\r
1512\r
a3bcde70
HT
1513 return Status;\r
1514}\r
1515\r
1516\r
1517/**\r
6879581d 1518 Stop this driver on ControllerHandle. This is the worker function for\r
1519 PxeBcIp4(6)DriverBindingStop.\r
a3bcde70
HT
1520\r
1521 @param[in] This Protocol instance pointer.\r
1522 @param[in] ControllerHandle Handle of device to stop driver on.\r
1523 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
1524 children is zero stop the entire bus driver.\r
1525 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
6879581d 1526 @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
a3bcde70
HT
1527\r
1528 @retval EFI_SUCCESS This driver was removed ControllerHandle.\r
1529 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1530 @retval Others This driver was not removed from this device\r
1531\r
1532**/\r
1533EFI_STATUS\r
1534EFIAPI\r
6879581d 1535PxeBcStop (\r
a3bcde70
HT
1536 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1537 IN EFI_HANDLE ControllerHandle,\r
1538 IN UINTN NumberOfChildren,\r
6879581d 1539 IN EFI_HANDLE *ChildHandleBuffer,\r
1540 IN UINT8 IpVersion\r
a3bcde70
HT
1541 )\r
1542{\r
1543 PXEBC_PRIVATE_DATA *Private;\r
1544 PXEBC_VIRTUAL_NIC *VirtualNic;\r
a3bcde70
HT
1545 EFI_LOAD_FILE_PROTOCOL *LoadFile;\r
1546 EFI_STATUS Status;\r
1547 EFI_HANDLE NicHandle;\r
15f3fc85 1548 PXEBC_PRIVATE_PROTOCOL *Id;\r
a3bcde70
HT
1549\r
1550 Private = NULL;\r
1551 NicHandle = NULL;\r
1552 VirtualNic = NULL;\r
1553 LoadFile = NULL;\r
15f3fc85 1554 Id = NULL;\r
a3bcde70
HT
1555\r
1556 Status = gBS->OpenProtocol (\r
1557 ControllerHandle,\r
1558 &gEfiLoadFileProtocolGuid,\r
1559 (VOID **) &LoadFile,\r
1560 This->DriverBindingHandle,\r
1561 ControllerHandle,\r
1562 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1563 );\r
1564 if (EFI_ERROR (Status)) {\r
1565 //\r
1566 // Get the Nic handle by any pass-over service child handle.\r
1567 //\r
6879581d 1568 if (IpVersion == IP_VERSION_4) {\r
1569 NicHandle = PxeBcGetNicByIp4Children (ControllerHandle);\r
1570 } else {\r
a3bcde70 1571 NicHandle = PxeBcGetNicByIp6Children (ControllerHandle);\r
6879581d 1572 }\r
1573 if (NicHandle == NULL) {\r
1574 return EFI_SUCCESS;\r
a3bcde70
HT
1575 }\r
1576\r
1577 //\r
15f3fc85 1578 // Try to retrieve the private data by PxeBcPrivate protocol.\r
a3bcde70
HT
1579 //\r
1580 Status = gBS->OpenProtocol (\r
1581 NicHandle,\r
9bdc6592 1582 &gEfiCallerIdGuid,\r
15f3fc85 1583 (VOID **) &Id,\r
a3bcde70
HT
1584 This->DriverBindingHandle,\r
1585 ControllerHandle,\r
1586 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1587 );\r
1588 if (EFI_ERROR (Status)) {\r
1589 return Status;\r
1590 }\r
15f3fc85 1591 Private = PXEBC_PRIVATE_DATA_FROM_ID (Id);\r
a3bcde70
HT
1592\r
1593 } else {\r
1594 //\r
1595 // It's a virtual handle with LoadFileProtocol.\r
1596 //\r
1597 Status = gBS->OpenProtocol (\r
1598 ControllerHandle,\r
1599 &gEfiLoadFileProtocolGuid,\r
1600 (VOID **) &LoadFile,\r
1601 This->DriverBindingHandle,\r
1602 ControllerHandle,\r
1603 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1604 );\r
1605 if (EFI_ERROR (Status)) {\r
1606 return Status;\r
1607 }\r
1608\r
1609 VirtualNic = PXEBC_VIRTUAL_NIC_FROM_LOADFILE (LoadFile);\r
1610 Private = VirtualNic->Private;\r
1611 NicHandle = Private->Controller;\r
a3bcde70
HT
1612 }\r
1613\r
d6d78ac1 1614 //\r
1615 // Stop functionality of PXE Base Code protocol\r
1616 //\r
1617 Status = Private->PxeBc.Stop (&Private->PxeBc);\r
1618 if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {\r
1619 return Status;\r
1620 }\r
1621\r
1622\r
6879581d 1623 if (Private->Ip4Nic != NULL && IpVersion == IP_VERSION_4) {\r
a3bcde70
HT
1624 PxeBcDestroyIp4Children (This, Private);\r
1625 }\r
1626\r
6879581d 1627 if (Private->Ip6Nic != NULL && IpVersion == IP_VERSION_6) {\r
a3bcde70
HT
1628 PxeBcDestroyIp6Children (This, Private);\r
1629 }\r
1630\r
1631 if (Private->Ip4Nic == NULL && Private->Ip6Nic == NULL) {\r
1632 gBS->UninstallProtocolInterface (\r
1633 NicHandle,\r
9bdc6592 1634 &gEfiCallerIdGuid,\r
15f3fc85 1635 &Private->Id\r
a3bcde70
HT
1636 );\r
1637 FreePool (Private);\r
1638 }\r
1639\r
1640 return EFI_SUCCESS;\r
1641}\r
6879581d 1642\r
1643/**\r
1644 Test to see if this driver supports ControllerHandle. This service\r
1645 is called by the EFI boot service ConnectController(). In\r
1646 order to make drivers as small as possible, there are a few calling\r
1647 restrictions for this service. ConnectController() must\r
1648 follow these calling restrictions. If any other agent wishes to call\r
1649 Supported() it must also follow these calling restrictions.\r
1650\r
1651 @param[in] This The pointer to the driver binding protocol.\r
1652 @param[in] ControllerHandle The handle of device to be tested.\r
1653 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1654 device to be started.\r
1655\r
1656 @retval EFI_SUCCESS This driver supports this device.\r
1657 @retval EFI_UNSUPPORTED This driver does not support this device.\r
1658\r
1659**/\r
1660EFI_STATUS\r
1661EFIAPI\r
1662PxeBcIp4DriverBindingSupported (\r
1663 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1664 IN EFI_HANDLE ControllerHandle,\r
1665 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1666 )\r
1667{\r
1668 return PxeBcSupported (\r
1669 This,\r
1670 ControllerHandle,\r
1671 RemainingDevicePath,\r
1672 IP_VERSION_4\r
1673 );\r
1674}\r
1675\r
1676/**\r
1677 Start this driver on ControllerHandle. This service is called by the\r
1678 EFI boot service ConnectController(). In order to make\r
1679 drivers as small as possible, there are a few calling restrictions for\r
1680 this service. ConnectController() must follow these\r
1681 calling restrictions. If any other agent wishes to call Start() it\r
1682 must also follow these calling restrictions.\r
1683\r
1684 @param[in] This The pointer to the driver binding protocol.\r
1685 @param[in] ControllerHandle The handle of device to be started.\r
1686 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1687 device to be started.\r
1688\r
1689 @retval EFI_SUCCESS This driver is installed to ControllerHandle.\r
1690 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
1691 @retval other This driver does not support this device.\r
1692\r
1693**/\r
1694EFI_STATUS\r
1695EFIAPI\r
1696PxeBcIp4DriverBindingStart (\r
1697 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1698 IN EFI_HANDLE ControllerHandle,\r
1699 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1700 )\r
1701{\r
1702 return PxeBcStart (\r
1703 This,\r
1704 ControllerHandle,\r
1705 RemainingDevicePath,\r
1706 IP_VERSION_4\r
1707 );\r
1708}\r
1709\r
1710/**\r
1711 Stop this driver on ControllerHandle. This service is called by the\r
1712 EFI boot service DisconnectController(). In order to\r
1713 make drivers as small as possible, there are a few calling\r
1714 restrictions for this service. DisconnectController()\r
1715 must follow these calling restrictions. If any other agent wishes\r
1716 to call Stop() it must also follow these calling restrictions.\r
1717\r
1718 @param[in] This Protocol instance pointer.\r
1719 @param[in] ControllerHandle Handle of device to stop driver on\r
1720 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
1721 children is zero stop the entire bus driver.\r
1722 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
1723\r
1724 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
1725 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1726 @retval Others This driver was not removed from this device.\r
1727\r
1728**/\r
1729EFI_STATUS\r
1730EFIAPI\r
1731PxeBcIp4DriverBindingStop (\r
1732 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1733 IN EFI_HANDLE ControllerHandle,\r
1734 IN UINTN NumberOfChildren,\r
1735 IN EFI_HANDLE *ChildHandleBuffer\r
1736 )\r
1737{\r
1738 return PxeBcStop (\r
1739 This,\r
1740 ControllerHandle,\r
1741 NumberOfChildren,\r
1742 ChildHandleBuffer,\r
1743 IP_VERSION_4\r
1744 );\r
1745}\r
1746\r
1747/**\r
1748 Test to see if this driver supports ControllerHandle. This service\r
1749 is called by the EFI boot service ConnectController(). In\r
1750 order to make drivers as small as possible, there are a few calling\r
1751 restrictions for this service. ConnectController() must\r
1752 follow these calling restrictions. If any other agent wishes to call\r
1753 Supported() it must also follow these calling restrictions.\r
1754\r
1755 @param[in] This The pointer to the driver binding protocol.\r
1756 @param[in] ControllerHandle The handle of device to be tested.\r
1757 @param[in] RemainingDevicePath Optional parameter use to pick a specific child\r
1758 device to be started.\r
1759\r
1760 @retval EFI_SUCCESS This driver supports this device.\r
1761 @retval EFI_UNSUPPORTED This driver does not support this device.\r
1762\r
1763**/\r
1764EFI_STATUS\r
1765EFIAPI\r
1766PxeBcIp6DriverBindingSupported (\r
1767 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1768 IN EFI_HANDLE ControllerHandle,\r
1769 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1770 )\r
1771{\r
1772 return PxeBcSupported (\r
1773 This,\r
1774 ControllerHandle,\r
1775 RemainingDevicePath,\r
1776 IP_VERSION_6\r
1777 );\r
1778}\r
1779\r
1780/**\r
1781 Start this driver on ControllerHandle. This service is called by the\r
1782 EFI boot service ConnectController(). In order to make\r
1783 drivers as small as possible, there are a few calling restrictions for\r
1784 this service. ConnectController() must follow these\r
1785 calling restrictions. If any other agent wishes to call Start() it\r
1786 must also follow these calling restrictions.\r
1787\r
1788 @param[in] This The pointer to the driver binding protocol.\r
1789 @param[in] ControllerHandle The handle of device to be started.\r
1790 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
1791 device to be started.\r
1792\r
1793 @retval EFI_SUCCESS This driver is installed to ControllerHandle.\r
1794 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle.\r
1795 @retval other This driver does not support this device.\r
1796\r
1797**/\r
1798EFI_STATUS\r
1799EFIAPI\r
1800PxeBcIp6DriverBindingStart (\r
1801 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1802 IN EFI_HANDLE ControllerHandle,\r
1803 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
1804 )\r
1805{\r
1806 return PxeBcStart (\r
1807 This,\r
1808 ControllerHandle,\r
1809 RemainingDevicePath,\r
1810 IP_VERSION_6\r
1811 );\r
1812}\r
1813\r
1814/**\r
1815 Stop this driver on ControllerHandle. This service is called by the\r
1816 EFI boot service DisconnectController(). In order to\r
1817 make drivers as small as possible, there are a few calling\r
1818 restrictions for this service. DisconnectController()\r
1819 must follow these calling restrictions. If any other agent wishes\r
1820 to call Stop() it must also follow these calling restrictions.\r
1821\r
1822 @param[in] This Protocol instance pointer.\r
1823 @param[in] ControllerHandle Handle of device to stop driver on\r
1824 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
1825 children is zero stop the entire bus driver.\r
1826 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
1827\r
1828 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
1829 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1830 @retval Others This driver was not removed from this device.\r
1831\r
1832**/\r
1833EFI_STATUS\r
1834EFIAPI\r
1835PxeBcIp6DriverBindingStop (\r
1836 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
1837 IN EFI_HANDLE ControllerHandle,\r
1838 IN UINTN NumberOfChildren,\r
1839 IN EFI_HANDLE *ChildHandleBuffer\r
1840 )\r
1841{\r
1842 return PxeBcStop (\r
1843 This,\r
1844 ControllerHandle,\r
1845 NumberOfChildren,\r
1846 ChildHandleBuffer,\r
1847 IP_VERSION_6\r
1848 );\r
1849}\r