/** @file\r
The implementation of a dispatch routine for processing TCP requests.\r
\r
- Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
NetbufFreeList (&Tcb->SndQue);\r
NetbufFreeList (&Tcb->RcvQue);\r
Tcb->State = TCP_CLOSED;\r
+ Tcb->RemoteIpZero = FALSE;\r
}\r
\r
/**\r
TCP_CB *Tcb;\r
TCP_PROTO_DATA *ProtoData;\r
IP_IO *IpIo;\r
+ EFI_STATUS Status;\r
+ VOID *Ip;\r
+ EFI_GUID *IpProtocolGuid;\r
\r
+ if (Sk->IpVersion == IP_VERSION_4) {\r
+ IpProtocolGuid = &gEfiIp4ProtocolGuid;\r
+ } else {\r
+ IpProtocolGuid = &gEfiIp6ProtocolGuid;\r
+ }\r
+ \r
Tcb = AllocateZeroPool (sizeof (TCP_CB));\r
\r
if (Tcb == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
+ //\r
+ // Open the new created IP instance BY_CHILD.\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ Tcb->IpInfo->ChildHandle,\r
+ IpProtocolGuid,\r
+ &Ip,\r
+ IpIo->Image,\r
+ Sk->SockHandle,\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ IpIoRemoveIp (IpIo, Tcb->IpInfo);\r
+ return Status;\r
+ }\r
+ \r
InitializeListHead (&Tcb->List);\r
InitializeListHead (&Tcb->SndQue);\r
InitializeListHead (&Tcb->RcvQue);\r
{\r
TCP_PROTO_DATA *ProtoData;\r
TCP_CB *Tcb;\r
+ EFI_GUID *IpProtocolGuid;\r
\r
+ if (Sk->IpVersion == IP_VERSION_4) {\r
+ IpProtocolGuid = &gEfiIp4ProtocolGuid;\r
+ } else {\r
+ IpProtocolGuid = &gEfiIp6ProtocolGuid;\r
+ }\r
+ \r
ProtoData = (TCP_PROTO_DATA *) Sk->ProtoReserved;\r
Tcb = ProtoData->TcpPcb;\r
\r
\r
TcpFlushPcb (Tcb);\r
\r
+ //\r
+ // Close the IP protocol.\r
+ //\r
+ gBS->CloseProtocol (\r
+ Tcb->IpInfo->ChildHandle,\r
+ IpProtocolGuid,\r
+ ProtoData->TcpService->IpIo->Image,\r
+ Sk->SockHandle\r
+ );\r
+ \r
IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);\r
\r
FreePool (Tcb);\r
\r
if (Sk->IpVersion == IP_VERSION_6) {\r
Tcb->Tick = TCP6_REFRESH_NEIGHBOR_TICK;\r
+\r
+ if (NetIp6IsUnspecifiedAddr (&Tcb->RemoteEnd.Ip.v6)) {\r
+ Tcb->RemoteIpZero = TRUE;\r
+ }\r
}\r
\r
TcpInsertTcb (Tcb);\r