]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
Add comments for functions and fix some coding style issue.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Driver.c
CommitLineData
8a67d61d 1/** @file\r
2\r
3Copyright (c) 2005 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 Tcp4Driver.c\r
15\r
16Abstract:\r
17\r
18\r
19**/\r
20\r
21#include "Tcp4Main.h"\r
22\r
23\r
120db52c 24UINT16 mTcp4RandomPort;\r
83cbd279 25extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName;\r
26extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2;\r
8a67d61d 27\r
28TCP4_HEARTBEAT_TIMER mTcp4Timer = {\r
29 NULL,\r
30 0\r
31};\r
32\r
33EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = {\r
34 Tcp4GetModeData,\r
35 Tcp4Configure,\r
36 Tcp4Routes,\r
37 Tcp4Connect,\r
38 Tcp4Accept,\r
39 Tcp4Transmit,\r
40 Tcp4Receive,\r
41 Tcp4Close,\r
42 Tcp4Cancel,\r
43 Tcp4Poll\r
44};\r
45\r
46SOCK_INIT_DATA mTcp4DefaultSockData = {\r
47 SOCK_STREAM,\r
4eb65aff 48 (SOCK_STATE) 0,\r
8a67d61d 49 NULL,\r
50 TCP_BACKLOG,\r
51 TCP_SND_BUF_SIZE,\r
52 TCP_RCV_BUF_SIZE,\r
53 &mTcp4ProtocolTemplate,\r
4f6e31e4 54 Tcp4CreateSocketCallback,\r
55 Tcp4DestroySocketCallback,\r
56 NULL,\r
57 NULL,\r
58 0,\r
8a67d61d 59 Tcp4Dispatcher,\r
60 NULL,\r
61};\r
62\r
63EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = {\r
64 Tcp4DriverBindingSupported,\r
65 Tcp4DriverBindingStart,\r
66 Tcp4DriverBindingStop,\r
67 0xa,\r
68 NULL,\r
69 NULL\r
70};\r
71\r
72EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = {\r
73 Tcp4ServiceBindingCreateChild,\r
74 Tcp4ServiceBindingDestroyChild\r
75};\r
76\r
77\r
78/**\r
79 Create and start the heartbeat timer for TCP driver.\r
80\r
8a67d61d 81 @retval EFI_SUCCESS The timer is successfully created and started.\r
82 @retval other The timer is not created.\r
83\r
84**/\r
8a67d61d 85EFI_STATUS\r
86Tcp4CreateTimer (\r
87 VOID\r
88 )\r
89{\r
90 EFI_STATUS Status;\r
91\r
92 Status = EFI_SUCCESS;\r
93\r
94 if (mTcp4Timer.RefCnt == 0) {\r
95\r
96 Status = gBS->CreateEvent (\r
97 EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
e48e37fc 98 TPL_NOTIFY,\r
8a67d61d 99 TcpTicking,\r
100 NULL,\r
101 &mTcp4Timer.TimerEvent\r
102 );\r
103 if (!EFI_ERROR (Status)) {\r
104\r
105 Status = gBS->SetTimer (\r
106 mTcp4Timer.TimerEvent,\r
107 TimerPeriodic,\r
108 (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ)\r
109 );\r
110 }\r
111 }\r
112\r
113 if (!EFI_ERROR (Status)) {\r
114\r
115 mTcp4Timer.RefCnt++;\r
116 }\r
117\r
118 return Status;\r
119}\r
120\r
121\r
122/**\r
123 Stop and destroy the heartbeat timer for TCP driver.\r
85511ddf 124 \r
8a67d61d 125**/\r
8a67d61d 126VOID\r
120db52c 127Tcp4DestroyTimer (\r
128 VOID\r
129 )\r
8a67d61d 130{\r
131 ASSERT (mTcp4Timer.RefCnt > 0);\r
132\r
133 mTcp4Timer.RefCnt--;\r
134\r
135 if (mTcp4Timer.RefCnt > 0) {\r
136 return;\r
137 }\r
138\r
139 gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0);\r
140 gBS->CloseEvent (mTcp4Timer.TimerEvent);\r
141 mTcp4Timer.TimerEvent = NULL;\r
142}\r
143\r
85511ddf 144/**\r
120db52c 145 The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle.\r
85511ddf 146\r
147 @param ImageHandle The firmware allocated handle for this\r
148 driver image.\r
149 @param SystemTable Pointer to the EFI system table.\r
150\r
151 @retval EFI_SUCCESS Driver loaded.\r
152 @retval other Driver not loaded.\r
8a67d61d 153\r
85511ddf 154**/\r
8a67d61d 155EFI_STATUS\r
156EFIAPI\r
157Tcp4DriverEntryPoint (\r
158 IN EFI_HANDLE ImageHandle,\r
159 IN EFI_SYSTEM_TABLE *SystemTable\r
160 )\r
8a67d61d 161{\r
162 EFI_STATUS Status;\r
163 UINT32 Seed;\r
164\r
165 //\r
166 // Install the TCP4 Driver Binding Protocol\r
167 //\r
83cbd279 168 Status = EfiLibInstallDriverBindingComponentName2 (\r
8a67d61d 169 ImageHandle,\r
170 SystemTable,\r
171 &mTcp4DriverBinding,\r
172 ImageHandle,\r
173 &gTcp4ComponentName,\r
83cbd279 174 &gTcp4ComponentName2\r
8a67d61d 175 );\r
da1d0201 176 ASSERT_EFI_ERROR (Status);\r
8a67d61d 177 //\r
178 // Initialize ISS and random port.\r
179 //\r
180 Seed = NetRandomInitSeed ();\r
181 mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss;\r
120db52c 182 mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN +\r
4eb65aff 183 (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN));\r
8a67d61d 184\r
185 return Status;\r
186}\r
187\r
188\r
189/**\r
190 Test to see if this driver supports ControllerHandle.\r
191\r
192 @param This Protocol instance pointer.\r
193 @param ControllerHandle Handle of device to test.\r
194 @param RemainingDevicePath Optional parameter use to pick a specific child\r
195 device to start.\r
196\r
197 @retval EFI_SUCCESS This driver supports this device.\r
198 @retval EFI_ALREADY_STARTED This driver is already running on this device.\r
199 @retval other This driver does not support this device.\r
200\r
201**/\r
202EFI_STATUS\r
203EFIAPI\r
204Tcp4DriverBindingSupported (\r
120db52c 205 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
8a67d61d 206 IN EFI_HANDLE ControllerHandle,\r
120db52c 207 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
8a67d61d 208 )\r
209{\r
210 EFI_STATUS Status;\r
211\r
212 //\r
213 // Test for the Tcp4ServiceBinding Protocol\r
214 //\r
215 Status = gBS->OpenProtocol (\r
216 ControllerHandle,\r
217 &gEfiTcp4ServiceBindingProtocolGuid,\r
218 NULL,\r
219 This->DriverBindingHandle,\r
220 ControllerHandle,\r
221 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
222 );\r
223 if (!EFI_ERROR (Status)) {\r
224 return EFI_ALREADY_STARTED;\r
225 }\r
226\r
227 //\r
228 // Test for the Ip4 Protocol\r
229 //\r
230 Status = gBS->OpenProtocol (\r
231 ControllerHandle,\r
232 &gEfiIp4ServiceBindingProtocolGuid,\r
233 NULL,\r
234 This->DriverBindingHandle,\r
235 ControllerHandle,\r
236 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
237 );\r
238\r
239 return Status;\r
240}\r
241\r
242\r
243/**\r
244 Start this driver on ControllerHandle.\r
245\r
246 @param This Protocol instance pointer.\r
247 @param ControllerHandle Handle of device to bind driver to.\r
248 @param RemainingDevicePath Optional parameter use to pick a specific child\r
249 device to start.\r
250\r
251 @retval EFI_SUCCESS The driver is added to ControllerHandle.\r
252 @retval EFI_OUT_OF_RESOURCES There are not enough resources to start the\r
253 driver.\r
254 @retval other The driver cannot be added to ControllerHandle.\r
255\r
256**/\r
257EFI_STATUS\r
258EFIAPI\r
259Tcp4DriverBindingStart (\r
120db52c 260 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
8a67d61d 261 IN EFI_HANDLE ControllerHandle,\r
120db52c 262 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
8a67d61d 263 )\r
264{\r
265 EFI_STATUS Status;\r
266 TCP4_SERVICE_DATA *TcpServiceData;\r
267 IP_IO_OPEN_DATA OpenData;\r
268\r
e48e37fc 269 TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA));\r
8a67d61d 270\r
271 if (NULL == TcpServiceData) {\r
e48e37fc 272 DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"\r
8a67d61d 273 " resource to create a Tcp Servcie Data!\n"));\r
274\r
275 return EFI_OUT_OF_RESOURCES;\r
276 }\r
277\r
278 //\r
279 // Create a new IP IO to Consume it\r
280 //\r
281 TcpServiceData->IpIo = IpIoCreate (This->DriverBindingHandle, ControllerHandle);\r
282 if (NULL == TcpServiceData->IpIo) {\r
283\r
e48e37fc 284 DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"\r
8a67d61d 285 " resource to create an Ip Io!\n"));\r
286\r
287 Status = EFI_OUT_OF_RESOURCES;\r
c4a62a12 288 goto ON_ERROR;\r
8a67d61d 289 }\r
290\r
291 //\r
292 // Configure and start IpIo.\r
293 //\r
e48e37fc 294 ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA));\r
8a67d61d 295\r
687a2e5f 296 CopyMem (&OpenData.IpConfigData, &mIpIoDefaultIpConfigData, sizeof (OpenData.IpConfigData));\r
8a67d61d 297 OpenData.IpConfigData.DefaultProtocol = EFI_IP_PROTO_TCP;\r
298\r
299 OpenData.PktRcvdNotify = Tcp4RxCallback;\r
300 Status = IpIoOpen (TcpServiceData->IpIo, &OpenData);\r
301\r
302 if (EFI_ERROR (Status)) {\r
c4a62a12 303 goto ON_ERROR;\r
8a67d61d 304 }\r
305\r
306 //\r
307 // Create the timer event used by TCP driver\r
308 //\r
309 Status = Tcp4CreateTimer ();\r
310 if (EFI_ERROR (Status)) {\r
311\r
e48e37fc 312 DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer"\r
8a67d61d 313 " Event failed with %r\n", Status));\r
314\r
c4a62a12 315 goto ON_ERROR;\r
8a67d61d 316 }\r
317\r
318 //\r
319 // Install the Tcp4ServiceBinding Protocol on the\r
320 // controller handle\r
321 //\r
322 TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding;\r
323\r
324 Status = gBS->InstallMultipleProtocolInterfaces (\r
325 &ControllerHandle,\r
326 &gEfiTcp4ServiceBindingProtocolGuid,\r
327 &TcpServiceData->Tcp4ServiceBinding,\r
328 NULL\r
329 );\r
330 if (EFI_ERROR (Status)) {\r
331\r
e48e37fc 332 DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service Binding"\r
8a67d61d 333 " Protocol failed for %r\n", Status));\r
334\r
c4a62a12 335 Tcp4DestroyTimer ();\r
336 goto ON_ERROR;\r
8a67d61d 337 }\r
338\r
339 //\r
340 // Initialize member in TcpServiceData\r
341 //\r
342 TcpServiceData->ControllerHandle = ControllerHandle;\r
343 TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE;\r
344 TcpServiceData->DriverBindingHandle = This->DriverBindingHandle;\r
345\r
e48e37fc 346 InitializeListHead (&TcpServiceData->SocketList);\r
c4a62a12 347\r
8a67d61d 348 TcpSetVariableData (TcpServiceData);\r
349\r
350 return EFI_SUCCESS;\r
351\r
c4a62a12 352ON_ERROR:\r
8a67d61d 353\r
c4a62a12 354 if (TcpServiceData->IpIo != NULL) {\r
355 IpIoDestroy (TcpServiceData->IpIo);\r
356 }\r
8a67d61d 357\r
e48e37fc 358 gBS->FreePool (TcpServiceData);\r
8a67d61d 359\r
360 return Status;\r
361}\r
362\r
363\r
364/**\r
365 Stop this driver on ControllerHandle.\r
366\r
367 @param This Protocol instance pointer.\r
368 @param ControllerHandle Handle of device to stop driver on.\r
369 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number\r
370 of children is zero stop the entire bus driver.\r
371 @param ChildHandleBuffer List of Child Handles to Stop.\r
372\r
373 @retval EFI_SUCCESS This driver is removed from ControllerHandle.\r
374 @retval other This driver is not removed from ControllerHandle.\r
375\r
376**/\r
377EFI_STATUS\r
378EFIAPI\r
379Tcp4DriverBindingStop (\r
380 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
381 IN EFI_HANDLE ControllerHandle,\r
382 IN UINTN NumberOfChildren,\r
383 IN EFI_HANDLE *ChildHandleBuffer\r
384 )\r
385{\r
386 EFI_STATUS Status;\r
387 EFI_HANDLE NicHandle;\r
c4a62a12 388 EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;\r
8a67d61d 389 TCP4_SERVICE_DATA *TcpServiceData;\r
8a67d61d 390 SOCKET *Sock;\r
8a67d61d 391\r
392 // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed.\r
393 //\r
394 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
395 if (NicHandle == NULL) {\r
c4a62a12 396 return EFI_DEVICE_ERROR;\r
8a67d61d 397 }\r
398\r
399 //\r
400 // Retrieve the TCP driver Data Structure\r
401 //\r
402 Status = gBS->OpenProtocol (\r
403 NicHandle,\r
404 &gEfiTcp4ServiceBindingProtocolGuid,\r
c4a62a12 405 (VOID **) &ServiceBinding,\r
8a67d61d 406 This->DriverBindingHandle,\r
407 ControllerHandle,\r
408 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
409 );\r
410 if (EFI_ERROR (Status)) {\r
411\r
e48e37fc 412 DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service "\r
8a67d61d 413 " Binding Protocol failed with %r\n", Status));\r
414\r
c4a62a12 415 return EFI_DEVICE_ERROR;\r
8a67d61d 416 }\r
417\r
c4a62a12 418 TcpServiceData = TCP4_FROM_THIS (ServiceBinding);\r
8a67d61d 419\r
c4a62a12 420 if (NumberOfChildren == 0) {\r
8a67d61d 421 //\r
c4a62a12 422 // Uninstall TCP servicebinding protocol\r
8a67d61d 423 //\r
c4a62a12 424 gBS->UninstallMultipleProtocolInterfaces (\r
425 NicHandle,\r
426 &gEfiTcp4ServiceBindingProtocolGuid,\r
427 ServiceBinding,\r
428 NULL\r
429 );\r
8a67d61d 430\r
c4a62a12 431 //\r
432 // Destroy the IpIO consumed by TCP driver\r
433 //\r
434 IpIoDestroy (TcpServiceData->IpIo);\r
8a67d61d 435\r
c4a62a12 436 //\r
437 // Destroy the heartbeat timer.\r
438 //\r
439 Tcp4DestroyTimer ();\r
8a67d61d 440\r
c4a62a12 441 //\r
442 // Clear the variable.\r
443 //\r
444 TcpClearVariableData (TcpServiceData);\r
8a67d61d 445\r
446 //\r
c4a62a12 447 // Release the TCP service data\r
8a67d61d 448 //\r
e48e37fc 449 gBS->FreePool (TcpServiceData);\r
c4a62a12 450 } else {\r
8a67d61d 451\r
e48e37fc 452 while (!IsListEmpty (&TcpServiceData->SocketList)) {\r
c4a62a12 453 Sock = NET_LIST_HEAD (&TcpServiceData->SocketList, SOCKET, Link);\r
8a67d61d 454\r
c4a62a12 455 ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle);\r
8a67d61d 456 }\r
457 }\r
458\r
8a67d61d 459 return Status;\r
460}\r
461\r
120db52c 462/**\r
463 Open Ip4 and device path protocols for a created socket, and insert it in \r
464 socket list.\r
465 \r
466 @param This Pointer to the socket just created\r
467 @param Context Context of the socket\r
468 \r
469 @retval EFI_SUCCESS This protocol is installed successfully.\r
470 @retval other Some error occured.\r
471 \r
472**/\r
4f6e31e4 473EFI_STATUS\r
474Tcp4CreateSocketCallback (\r
475 IN SOCKET *This,\r
476 IN VOID *Context\r
477 )\r
478{\r
479 EFI_STATUS Status;\r
480 TCP4_SERVICE_DATA *TcpServiceData;\r
481 EFI_IP4_PROTOCOL *Ip4;\r
482\r
483 TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;\r
484\r
485 //\r
486 // Open the default Ip4 protocol of IP_IO BY_DRIVER.\r
487 //\r
488 Status = gBS->OpenProtocol (\r
489 TcpServiceData->IpIo->ChildHandle,\r
490 &gEfiIp4ProtocolGuid,\r
491 (VOID **) &Ip4,\r
492 TcpServiceData->DriverBindingHandle,\r
493 This->SockHandle,\r
494 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
495 );\r
496 if (EFI_ERROR (Status)) {\r
497 return Status;\r
498 }\r
499\r
500 //\r
501 // Open the device path on the handle where service binding resides on.\r
502 //\r
503 Status = gBS->OpenProtocol (\r
504 TcpServiceData->ControllerHandle,\r
505 &gEfiDevicePathProtocolGuid,\r
506 (VOID **) &This->ParentDevicePath,\r
507 TcpServiceData->DriverBindingHandle,\r
508 This->SockHandle,\r
509 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
510 );\r
511 if (EFI_ERROR (Status)) {\r
512 gBS->CloseProtocol (\r
513 TcpServiceData->IpIo->ChildHandle,\r
514 &gEfiIp4ProtocolGuid,\r
515 TcpServiceData->DriverBindingHandle,\r
516 This->SockHandle\r
517 );\r
518 } else {\r
519 //\r
520 // Insert this socket into the SocketList.\r
521 //\r
e48e37fc 522 InsertTailList (&TcpServiceData->SocketList, &This->Link);\r
4f6e31e4 523 }\r
524\r
525 return Status;\r
526}\r
527\r
120db52c 528/**\r
529 Close Ip4 and device path protocols for a socket, and remove it from socket list. \r
530 \r
531 @param This Pointer to the socket to be removed\r
532 @param Context Context of the socket\r
533 \r
534**/\r
4f6e31e4 535VOID\r
536Tcp4DestroySocketCallback (\r
537 IN SOCKET *This,\r
538 IN VOID *Context\r
539 )\r
540{\r
541 TCP4_SERVICE_DATA *TcpServiceData;\r
542\r
543 TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;\r
544\r
545 //\r
546 // Remove this node from the list.\r
547 //\r
e48e37fc 548 RemoveEntryList (&This->Link);\r
4f6e31e4 549\r
550 //\r
551 // Close the device path protocol\r
552 //\r
553 gBS->CloseProtocol (\r
554 TcpServiceData->ControllerHandle,\r
555 &gEfiDevicePathProtocolGuid,\r
556 TcpServiceData->DriverBindingHandle,\r
557 This->SockHandle\r
558 );\r
559\r
560 //\r
561 // Close the Ip4 protocol.\r
562 //\r
563 gBS->CloseProtocol (\r
564 TcpServiceData->IpIo->ChildHandle,\r
565 &gEfiIp4ProtocolGuid,\r
566 TcpServiceData->DriverBindingHandle,\r
567 This->SockHandle\r
568 );\r
569}\r
570\r
8a67d61d 571/**\r
572 Creates a child handle with a set of TCP4 services.\r
573\r
574 @param This Protocol instance pointer.\r
575 @param ChildHandle Pointer to the handle of the child to create. If\r
576 it is NULL, then a new handle is created. If it is\r
577 not NULL, then the I/O services are added to the\r
578 existing child handle.\r
579\r
580 @retval EFI_SUCCESS The child handle is created.\r
581 @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
582 @retval EFI_OUT_OF_RESOURCES There are not enough resources to create the\r
583 child.\r
584\r
585**/\r
586EFI_STATUS\r
587EFIAPI\r
588Tcp4ServiceBindingCreateChild (\r
589 IN EFI_SERVICE_BINDING_PROTOCOL *This,\r
590 IN EFI_HANDLE *ChildHandle\r
591 )\r
592{\r
593 SOCKET *Sock;\r
594 TCP4_SERVICE_DATA *TcpServiceData;\r
595 TCP4_PROTO_DATA TcpProto;\r
596 EFI_STATUS Status;\r
8a67d61d 597 EFI_TPL OldTpl;\r
598\r
599 if (NULL == This || NULL == ChildHandle) {\r
600 return EFI_INVALID_PARAMETER;\r
601 }\r
602\r
e48e37fc 603 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
4f6e31e4 604 Status = EFI_SUCCESS;\r
8a67d61d 605 TcpServiceData = TCP4_FROM_THIS (This);\r
606 TcpProto.TcpService = TcpServiceData;\r
607 TcpProto.TcpPcb = NULL;\r
608\r
609 //\r
610 // Create a tcp instance with defualt Tcp default\r
611 // sock init data and TcpProto\r
612 //\r
4f6e31e4 613 mTcp4DefaultSockData.ProtoData = &TcpProto;\r
614 mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA);\r
8a67d61d 615 mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle;\r
e48e37fc 616\r
4f6e31e4 617 Sock = SockCreateChild (&mTcp4DefaultSockData);\r
8a67d61d 618 if (NULL == Sock) {\r
e48e37fc 619 DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: "\r
8a67d61d 620 "No resource to create a Tcp Child\n"));\r
621\r
622 Status = EFI_OUT_OF_RESOURCES;\r
c4a62a12 623 } else {\r
4f6e31e4 624 *ChildHandle = Sock->SockHandle;\r
8a67d61d 625 }\r
626\r
e48e37fc 627 gBS->RestoreTPL (OldTpl);\r
8a67d61d 628 return Status;\r
629}\r
630\r
631\r
632/**\r
633 Destroys a child handle with a set of UDP4 services.\r
634\r
635 @param This Protocol instance pointer.\r
636 @param ChildHandle Handle of the child to be destroyed.\r
637\r
638 @retval EFI_SUCCESS The TCP4 services are removed from the child\r
639 handle.\r
640 @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
641 @retval other The child handle is not destroyed.\r
642\r
643**/\r
644EFI_STATUS\r
645EFIAPI\r
646Tcp4ServiceBindingDestroyChild (\r
647 IN EFI_SERVICE_BINDING_PROTOCOL *This,\r
648 IN EFI_HANDLE ChildHandle\r
649 )\r
650{\r
651 EFI_STATUS Status;\r
652 EFI_TCP4_PROTOCOL *Tcp4;\r
653 SOCKET *Sock;\r
8a67d61d 654 EFI_TPL OldTpl;\r
655\r
656 if (NULL == This || NULL == ChildHandle) {\r
657 return EFI_INVALID_PARAMETER;\r
658 }\r
659\r
e48e37fc 660 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
8a67d61d 661\r
662 //\r
663 // retrieve the Tcp4 protocol from ChildHandle\r
664 //\r
665 Status = gBS->OpenProtocol (\r
666 ChildHandle,\r
667 &gEfiTcp4ProtocolGuid,\r
668 (VOID **) &Tcp4,\r
669 mTcp4DriverBinding.DriverBindingHandle,\r
670 ChildHandle,\r
671 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
672 );\r
673 if (EFI_ERROR (Status)) {\r
674 Status = EFI_UNSUPPORTED;\r
4f6e31e4 675 } else {\r
676 //\r
677 // destroy this sock and related Tcp protocol control\r
678 // block\r
679 //\r
680 Sock = SOCK_FROM_THIS (Tcp4);\r
e5e12de7 681\r
4f6e31e4 682 SockDestroyChild (Sock);\r
683 }\r
8a67d61d 684\r
e48e37fc 685 gBS->RestoreTPL (OldTpl);\r
8a67d61d 686 return Status;\r
687}\r
4f6e31e4 688\r