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