]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
1. sync PXE boot trackers for Windows 2008 server.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcDriver.c
CommitLineData
dc361cc5 1/** @file\r
d59b8b55 2 The driver binding for UEFI PXEBC protocol.\r
f737cfb9 3 \r
4Copyright (c) 2007 - 2008, Intel Corporation.<BR>\r
dc361cc5 5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
dc361cc5 13**/\r
14\r
15\r
16#include "PxeBcImpl.h"\r
17\r
f737cfb9 18EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {\r
19 PxeBcDriverBindingSupported,\r
20 PxeBcDriverBindingStart,\r
21 PxeBcDriverBindingStop,\r
22 0xa,\r
23 NULL,\r
24 NULL\r
25};\r
dc361cc5 26\r
27/**\r
f737cfb9 28 This is the declaration of an EFI image entry point. This entry point is\r
29 the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including\r
30 both device drivers and bus drivers.\r
dc361cc5 31\r
f737cfb9 32 @param ImageHandle The firmware allocated handle for the UEFI image.\r
33 @param SystemTable A pointer to the EFI System Table.\r
dc361cc5 34\r
f737cfb9 35 @retval EFI_SUCCESS The operation completed successfully.\r
36 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
dc361cc5 37\r
38**/\r
39EFI_STATUS\r
40PxeBcDriverEntryPoint (\r
41 IN EFI_HANDLE ImageHandle,\r
42 IN EFI_SYSTEM_TABLE *SystemTable\r
43 )\r
44{\r
45 return EfiLibInstallDriverBindingComponentName2 (\r
46 ImageHandle,\r
47 SystemTable,\r
48 &gPxeBcDriverBinding,\r
49 ImageHandle,\r
50 &gPxeBcComponentName,\r
51 &gPxeBcComponentName2\r
52 );\r
53}\r
54\r
55\r
56/**\r
f737cfb9 57 Test to see if this driver supports ControllerHandle. This service\r
58 is called by the EFI boot service ConnectController(). In\r
59 order to make drivers as small as possible, there are a few calling\r
60 restrictions for this service. ConnectController() must\r
61 follow these calling restrictions. If any other agent wishes to call\r
62 Supported() it must also follow these calling restrictions. \r
63 PxeBc requires DHCP4 and MTFTP4 protocols.\r
64\r
65 @param This Protocol instance pointer.\r
66 @param ControllerHandle Handle of device to test\r
67 @param RemainingDevicePath Optional parameter use to pick a specific child\r
68 device to start.\r
69\r
70 @retval EFI_SUCCESS This driver supports this device\r
71 @retval EFI_ALREADY_STARTED This driver is already running on this device\r
72 @retval other This driver does not support this device\r
dc361cc5 73\r
74**/\r
75EFI_STATUS\r
76EFIAPI\r
77PxeBcDriverBindingSupported (\r
78 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
79 IN EFI_HANDLE ControllerHandle,\r
80 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
81 )\r
82{\r
83 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
84 EFI_STATUS Status;\r
85\r
86 Status = gBS->OpenProtocol (\r
87 ControllerHandle,\r
88 &gEfiPxeBaseCodeProtocolGuid,\r
89 (VOID **) &PxeBc,\r
90 This->DriverBindingHandle,\r
91 ControllerHandle,\r
92 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
93 );\r
94\r
95 if (!EFI_ERROR (Status)) {\r
96 return EFI_ALREADY_STARTED;\r
97 }\r
98\r
99 Status = gBS->OpenProtocol (\r
100 ControllerHandle,\r
101 &gEfiDhcp4ServiceBindingProtocolGuid,\r
102 NULL,\r
103 This->DriverBindingHandle,\r
104 ControllerHandle,\r
105 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
106 );\r
107\r
108 if (!EFI_ERROR (Status)) {\r
109\r
110 Status = gBS->OpenProtocol (\r
111 ControllerHandle,\r
112 &gEfiMtftp4ServiceBindingProtocolGuid,\r
113 NULL,\r
114 This->DriverBindingHandle,\r
115 ControllerHandle,\r
116 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
117 );\r
118\r
119 }\r
120\r
121 return Status;\r
122}\r
123\r
124\r
125/**\r
f737cfb9 126 Start this driver on ControllerHandle. This service is called by the\r
127 EFI boot service ConnectController(). In order to make\r
128 drivers as small as possible, there are a few calling restrictions for\r
129 this service. ConnectController() must follow these\r
130 calling restrictions. If any other agent wishes to call Start() it\r
131 must also follow these calling restrictions.\r
dc361cc5 132\r
133 @param This Protocol instance pointer.\r
134 @param ControllerHandle Handle of device to bind driver to\r
135 @param RemainingDevicePath Optional parameter use to pick a specific child\r
136 device to start.\r
137\r
f737cfb9 138 @retval EFI_SUCCESS This driver is added to ControllerHandle\r
139 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
140 @retval other This driver does not support this device\r
dc361cc5 141\r
142**/\r
143EFI_STATUS\r
144EFIAPI\r
145PxeBcDriverBindingStart (\r
146 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
147 IN EFI_HANDLE ControllerHandle,\r
148 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
149 )\r
150{\r
151 PXEBC_PRIVATE_DATA *Private;\r
152 UINTN Index;\r
153 EFI_STATUS Status;\r
154\r
e48e37fc 155 Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
dc361cc5 156 if (Private == NULL) {\r
157 return EFI_OUT_OF_RESOURCES;\r
158 }\r
159\r
160 Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
161 Private->Controller = ControllerHandle;\r
162 Private->Image = This->DriverBindingHandle;\r
163 CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));\r
164 Private->PxeBc.Mode = &Private->Mode;\r
165 CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));\r
166\r
167 Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
168 Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
169 Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
170\r
171 for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {\r
172 Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
173 }\r
174\r
175 //\r
176 // Get the NII interface\r
177 //\r
178 Status = gBS->OpenProtocol (\r
179 ControllerHandle,\r
180 &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
181 (VOID **) &Private->Nii,\r
182 This->DriverBindingHandle,\r
183 ControllerHandle,\r
184 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
185 );\r
186 if (EFI_ERROR (Status)) {\r
187 goto ON_ERROR;\r
188 }\r
189\r
8d285ec0 190 Status = NetLibCreateServiceChild (\r
191 ControllerHandle,\r
192 This->DriverBindingHandle,\r
193 &gEfiArpServiceBindingProtocolGuid,\r
194 &Private->ArpChild\r
195 );\r
196 if (EFI_ERROR (Status)) {\r
197 goto ON_ERROR;\r
198 }\r
199\r
200 Status = gBS->OpenProtocol (\r
201 Private->ArpChild,\r
202 &gEfiArpProtocolGuid,\r
203 (VOID **) &Private->Arp,\r
204 This->DriverBindingHandle,\r
205 ControllerHandle,\r
206 EFI_OPEN_PROTOCOL_BY_DRIVER\r
207 );\r
208 if (EFI_ERROR (Status)) {\r
209 goto ON_ERROR;\r
210 }\r
211\r
dc361cc5 212 Status = NetLibCreateServiceChild (\r
213 ControllerHandle,\r
214 This->DriverBindingHandle,\r
215 &gEfiDhcp4ServiceBindingProtocolGuid,\r
216 &Private->Dhcp4Child\r
217 );\r
218 if (EFI_ERROR (Status)) {\r
219 goto ON_ERROR;\r
220 }\r
221\r
222 Status = gBS->OpenProtocol (\r
223 Private->Dhcp4Child,\r
224 &gEfiDhcp4ProtocolGuid,\r
225 (VOID **) &Private->Dhcp4,\r
226 This->DriverBindingHandle,\r
227 ControllerHandle,\r
228 EFI_OPEN_PROTOCOL_BY_DRIVER\r
229 );\r
230 if (EFI_ERROR (Status)) {\r
231 goto ON_ERROR;\r
232 }\r
233\r
982a9eae 234 Status = NetLibCreateServiceChild (\r
235 ControllerHandle,\r
236 This->DriverBindingHandle,\r
237 &gEfiIp4ServiceBindingProtocolGuid,\r
238 &Private->Ip4Child\r
239 );\r
240 if (EFI_ERROR (Status)) {\r
241 goto ON_ERROR;\r
242 }\r
243\r
244 Status = gBS->OpenProtocol (\r
245 Private->Ip4Child,\r
246 &gEfiIp4ProtocolGuid,\r
247 (VOID **) &Private->Ip4,\r
248 This->DriverBindingHandle,\r
249 ControllerHandle,\r
250 EFI_OPEN_PROTOCOL_BY_DRIVER\r
251 );\r
252 if (EFI_ERROR (Status)) {\r
253 goto ON_ERROR;\r
254 }\r
255\r
dc361cc5 256 Status = NetLibCreateServiceChild (\r
257 ControllerHandle,\r
258 This->DriverBindingHandle,\r
259 &gEfiMtftp4ServiceBindingProtocolGuid,\r
260 &Private->Mtftp4Child\r
261 );\r
262\r
263 if (EFI_ERROR (Status)) {\r
264 goto ON_ERROR;\r
265 }\r
266\r
267 Status = gBS->OpenProtocol (\r
268 Private->Mtftp4Child,\r
269 &gEfiMtftp4ProtocolGuid,\r
270 (VOID **) &Private->Mtftp4,\r
271 This->DriverBindingHandle,\r
272 ControllerHandle,\r
273 EFI_OPEN_PROTOCOL_BY_DRIVER\r
274 );\r
275\r
276 if (EFI_ERROR (Status)) {\r
277 goto ON_ERROR;\r
278 }\r
279\r
280 Status = NetLibCreateServiceChild (\r
281 ControllerHandle,\r
282 This->DriverBindingHandle,\r
283 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 284 &Private->Udp4ReadChild\r
dc361cc5 285 );\r
286\r
287 if (EFI_ERROR (Status)) {\r
288 goto ON_ERROR;\r
289 }\r
290\r
8792362f 291 //\r
292 // The UDP instance for EfiPxeBcUdpRead\r
293 //\r
dc361cc5 294 Status = gBS->OpenProtocol (\r
8792362f 295 Private->Udp4ReadChild,\r
dc361cc5 296 &gEfiUdp4ProtocolGuid,\r
8792362f 297 (VOID **) &Private->Udp4Read,\r
dc361cc5 298 This->DriverBindingHandle,\r
299 ControllerHandle,\r
300 EFI_OPEN_PROTOCOL_BY_DRIVER\r
301 );\r
302\r
303 if (EFI_ERROR (Status)) {\r
304 goto ON_ERROR;\r
305 }\r
306\r
8792362f 307 //\r
308 // The UDP instance for EfiPxeBcUdpWrite\r
309 //\r
310 Status = NetLibCreateServiceChild (\r
311 ControllerHandle, \r
312 This->DriverBindingHandle,\r
313 &gEfiUdp4ServiceBindingProtocolGuid,\r
314 &Private->Udp4WriteChild\r
315 );\r
316 if (EFI_ERROR (Status)) {\r
317 goto ON_ERROR;\r
318 }\r
319\r
320 Status = gBS->OpenProtocol (\r
321 Private->Udp4WriteChild,\r
322 &gEfiUdp4ProtocolGuid,\r
323 (VOID **) &Private->Udp4Write,\r
324 This->DriverBindingHandle,\r
325 ControllerHandle,\r
326 EFI_OPEN_PROTOCOL_BY_DRIVER\r
327 );\r
328 if (EFI_ERROR (Status)) {\r
329 goto ON_ERROR;\r
330 }\r
e48e37fc 331 ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
48bd50c5 332 Private->Udp4CfgData.AcceptBroadcast = TRUE;\r
dc361cc5 333 Private->Udp4CfgData.AcceptPromiscuous = FALSE;\r
8792362f 334 Private->Udp4CfgData.AcceptAnyPort = TRUE;\r
dc361cc5 335 Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
336 Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;\r
337 Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;\r
338 Private->Udp4CfgData.DoNotFragment = FALSE;\r
319075ff 339 Private->Udp4CfgData.ReceiveTimeout = 50000; // 50 milliseconds\r
dc361cc5 340 Private->Udp4CfgData.UseDefaultAddress = FALSE;\r
341\r
8792362f 342 PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read);\r
982a9eae 343 Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;\r
344 CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);\r
345\r
346\r
347 ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));\r
348 Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;\r
349 Private->Ip4ConfigData.AcceptIcmpErrors = TRUE;\r
350 Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS;\r
351 Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL;\r
352 Private->Ip4ConfigData.DoNotFragment = FALSE;\r
353 Private->Ip4ConfigData.RawData = FALSE;\r
dc361cc5 354\r
355 Status = gBS->InstallMultipleProtocolInterfaces (\r
356 &ControllerHandle,\r
357 &gEfiPxeBaseCodeProtocolGuid,\r
358 &Private->PxeBc,\r
359 &gEfiLoadFileProtocolGuid,\r
360 &Private->LoadFile,\r
361 NULL\r
362 );\r
363 if (EFI_ERROR (Status)) {\r
364 goto ON_ERROR;\r
365 }\r
366\r
367 return EFI_SUCCESS;\r
368\r
369ON_ERROR:\r
370\r
8792362f 371 if (Private->Udp4WriteChild != NULL) {\r
372 gBS->CloseProtocol (\r
373 Private->Udp4WriteChild,\r
374 &gEfiUdp4ProtocolGuid,\r
375 This->DriverBindingHandle,\r
376 ControllerHandle\r
377 );\r
378 NetLibDestroyServiceChild (\r
379 ControllerHandle,\r
380 This->DriverBindingHandle,\r
381 &gEfiUdp4ServiceBindingProtocolGuid,\r
382 Private->Udp4WriteChild\r
383 );\r
384 }\r
385\r
386 if (Private->Udp4ReadChild != NULL) {\r
dc361cc5 387 gBS->CloseProtocol (\r
8792362f 388 Private->Udp4ReadChild,\r
dc361cc5 389 &gEfiUdp4ProtocolGuid,\r
390 This->DriverBindingHandle,\r
391 ControllerHandle\r
392 );\r
393 NetLibDestroyServiceChild (\r
394 ControllerHandle,\r
395 This->DriverBindingHandle,\r
51dc1f65 396 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 397 Private->Udp4ReadChild\r
dc361cc5 398 );\r
399 }\r
400\r
401 if (Private->Mtftp4Child != NULL) {\r
402 gBS->CloseProtocol (\r
403 Private->Mtftp4Child,\r
404 &gEfiMtftp4ProtocolGuid,\r
405 This->DriverBindingHandle,\r
406 ControllerHandle\r
407 );\r
408\r
409 NetLibDestroyServiceChild (\r
410 ControllerHandle,\r
411 This->DriverBindingHandle,\r
51dc1f65 412 &gEfiMtftp4ServiceBindingProtocolGuid,\r
dc361cc5 413 Private->Mtftp4Child\r
414 );\r
415 }\r
416\r
982a9eae 417 if (Private->Ip4Child != NULL) {\r
418 gBS->CloseProtocol (\r
419 Private->Ip4Child,\r
420 &gEfiIp4ProtocolGuid,\r
421 This->DriverBindingHandle,\r
422 ControllerHandle\r
423 );\r
424\r
425 NetLibDestroyServiceChild (\r
426 ControllerHandle,\r
427 This->DriverBindingHandle,\r
428 &gEfiIp4ServiceBindingProtocolGuid,\r
429 Private->Ip4Child\r
430 );\r
431 }\r
432\r
dc361cc5 433 if (Private->Dhcp4Child != NULL) {\r
434 gBS->CloseProtocol (\r
435 Private->Dhcp4Child,\r
436 &gEfiDhcp4ProtocolGuid,\r
437 This->DriverBindingHandle,\r
438 ControllerHandle\r
439 );\r
440\r
441 NetLibDestroyServiceChild (\r
442 ControllerHandle,\r
443 This->DriverBindingHandle,\r
51dc1f65 444 &gEfiDhcp4ServiceBindingProtocolGuid,\r
dc361cc5 445 Private->Dhcp4Child\r
446 );\r
447 }\r
448\r
8d285ec0 449 if (Private->ArpChild != NULL) {\r
450 gBS->CloseProtocol (\r
451 Private->ArpChild,\r
452 &gEfiArpProtocolGuid,\r
453 This->DriverBindingHandle,\r
454 ControllerHandle\r
455 );\r
456\r
457 NetLibDestroyServiceChild (\r
458 ControllerHandle,\r
459 This->DriverBindingHandle,\r
460 &gEfiArpServiceBindingProtocolGuid,\r
461 Private->ArpChild\r
462 );\r
463 }\r
464\r
e48e37fc 465 gBS->FreePool (Private);\r
dc361cc5 466\r
467 return Status;\r
468}\r
469\r
470\r
471/**\r
f737cfb9 472 Stop this driver on ControllerHandle. This service is called by the\r
473 EFI boot service DisconnectController(). In order to\r
474 make drivers as small as possible, there are a few calling\r
475 restrictions for this service. DisconnectController()\r
476 must follow these calling restrictions. If any other agent wishes\r
477 to call Stop() it must also follow these calling restrictions.\r
478 \r
479 @param This Protocol instance pointer.\r
480 @param ControllerHandle Handle of device to stop driver on\r
481 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
482 children is zero stop the entire bus driver.\r
483 @param ChildHandleBuffer List of Child Handles to Stop.\r
484\r
485 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
486 @retval other This driver was not removed from this device\r
dc361cc5 487\r
488**/\r
489EFI_STATUS\r
490EFIAPI\r
491PxeBcDriverBindingStop (\r
492 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
493 IN EFI_HANDLE ControllerHandle,\r
494 IN UINTN NumberOfChildren,\r
495 IN EFI_HANDLE *ChildHandleBuffer\r
496 )\r
497{\r
498 PXEBC_PRIVATE_DATA *Private;\r
499 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
500 EFI_HANDLE NicHandle;\r
501 EFI_STATUS Status;\r
502\r
7d7a8ea2 503 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
dc361cc5 504 if (NicHandle == NULL) {\r
7d7a8ea2 505 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
dc361cc5 506\r
507 if (NicHandle == NULL) {\r
aa6c4e3c 508 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
7d7a8ea2 509\r
510 if (NicHandle == NULL) {\r
aa6c4e3c 511 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
7d7a8ea2 512\r
aa6c4e3c 513 if (NicHandle == NULL) {\r
514 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
7d7a8ea2 515\r
aa6c4e3c 516 if (NicHandle == NULL) {\r
517 return EFI_DEVICE_ERROR;\r
518 }\r
519 }\r
7d7a8ea2 520 }\r
dc361cc5 521 }\r
522 }\r
523\r
524 Status = gBS->OpenProtocol (\r
525 NicHandle,\r
526 &gEfiPxeBaseCodeProtocolGuid,\r
527 (VOID **) &PxeBc,\r
528 This->DriverBindingHandle,\r
529 ControllerHandle,\r
530 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
531 );\r
532\r
533 if (EFI_ERROR (Status)) {\r
534 return Status;\r
535 }\r
536\r
537 Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);\r
538\r
539 Status = gBS->UninstallMultipleProtocolInterfaces (\r
540 NicHandle,\r
541 &gEfiPxeBaseCodeProtocolGuid,\r
542 &Private->PxeBc,\r
543 &gEfiLoadFileProtocolGuid,\r
544 &Private->LoadFile,\r
545 NULL\r
546 );\r
547\r
548 if (!EFI_ERROR (Status)) {\r
549\r
550 gBS->CloseProtocol (\r
8792362f 551 Private->Udp4WriteChild,\r
552 &gEfiUdp4ProtocolGuid,\r
553 This->DriverBindingHandle,\r
554 NicHandle\r
555 );\r
556 NetLibDestroyServiceChild (\r
557 ControllerHandle,\r
558 This->DriverBindingHandle,\r
559 &gEfiUdp4ServiceBindingProtocolGuid,\r
560 Private->Udp4WriteChild\r
561 );\r
562\r
563 gBS->CloseProtocol (\r
564 Private->Udp4ReadChild,\r
dc361cc5 565 &gEfiUdp4ProtocolGuid,\r
566 This->DriverBindingHandle,\r
51dc1f65 567 NicHandle\r
dc361cc5 568 );\r
569 NetLibDestroyServiceChild (\r
51dc1f65 570 NicHandle,\r
dc361cc5 571 This->DriverBindingHandle,\r
572 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 573 Private->Udp4ReadChild\r
dc361cc5 574 );\r
575\r
576 gBS->CloseProtocol (\r
577 Private->Dhcp4Child,\r
578 &gEfiDhcp4ProtocolGuid,\r
579 This->DriverBindingHandle,\r
51dc1f65 580 NicHandle\r
dc361cc5 581 );\r
582 NetLibDestroyServiceChild (\r
51dc1f65 583 NicHandle,\r
dc361cc5 584 This->DriverBindingHandle,\r
585 &gEfiDhcp4ServiceBindingProtocolGuid,\r
586 Private->Dhcp4Child\r
587 );\r
588\r
589 gBS->CloseProtocol (\r
590 Private->Mtftp4Child,\r
591 &gEfiMtftp4ProtocolGuid,\r
592 This->DriverBindingHandle,\r
51dc1f65 593 NicHandle\r
dc361cc5 594 );\r
595 NetLibDestroyServiceChild (\r
51dc1f65 596 NicHandle,\r
dc361cc5 597 This->DriverBindingHandle,\r
598 &gEfiMtftp4ServiceBindingProtocolGuid,\r
599 Private->Mtftp4Child\r
600 );\r
601\r
aa6c4e3c 602 gBS->CloseProtocol (\r
603 Private->Ip4Child,\r
604 &gEfiIp4ProtocolGuid,\r
605 This->DriverBindingHandle,\r
606 NicHandle\r
607 );\r
608 NetLibDestroyServiceChild (\r
609 NicHandle,\r
610 This->DriverBindingHandle,\r
611 &gEfiIp4ServiceBindingProtocolGuid,\r
612 Private->Ip4Child\r
613 );\r
614\r
8d285ec0 615 gBS->CloseProtocol (\r
616 Private->ArpChild,\r
617 &gEfiArpProtocolGuid,\r
618 This->DriverBindingHandle,\r
619 NicHandle\r
620 );\r
621 NetLibDestroyServiceChild (\r
622 NicHandle,\r
623 This->DriverBindingHandle,\r
624 &gEfiArpServiceBindingProtocolGuid,\r
625 Private->ArpChild\r
626 );\r
627\r
e48e37fc 628 gBS->FreePool (Private);\r
dc361cc5 629 }\r
630\r
631 return Status;\r
632}\r
633\r
dc361cc5 634\r