\r
#include "Tcp4Main.h"\r
\r
-NET_LIST_ENTRY mTcpRunQue = {\r
+#include <Library/DevicePathLib.h>\r
+\r
+LIST_ENTRY mTcpRunQue = {\r
&mTcpRunQue,\r
&mTcpRunQue\r
};\r
\r
-NET_LIST_ENTRY mTcpListenQue = {\r
+LIST_ENTRY mTcpListenQue = {\r
&mTcpListenQue,\r
&mTcpListenQue\r
};\r
\r
TCP_SEQNO mTcpGlobalIss = 0x4d7e980b;\r
\r
-STATIC CHAR16 *mTcpStateName[] = {\r
+CHAR16 *mTcpStateName[] = {\r
L"TCP_CLOSED",\r
L"TCP_LISTEN",\r
L"TCP_SYN_SENT",\r
}\r
\r
if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) {\r
- Tcb->SndMss = (UINT16) NET_MAX (64, Opt->Mss);\r
+ Tcb->SndMss = (UINT16) MAX (64, Opt->Mss);\r
\r
RcvMss = TcpGetRcvMss (Tcb->Sk);\r
if (Tcb->SndMss > RcvMss) {\r
IN TCP_PEER *Remote\r
)\r
{\r
- NET_LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Entry;\r
TCP_CB *Node;\r
TCP_CB *Match;\r
INTN Last;\r
)\r
{\r
TCP_PORTNO LocalPort;\r
- NET_LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Entry;\r
TCP_CB *Tcb;\r
\r
ASSERT ((Addr != NULL) && (Port != 0));\r
NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {\r
Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
\r
- if (EFI_IP4_EQUAL (*Addr, Tcb->LocalEnd.Ip) &&\r
+ if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&\r
(LocalPort == Tcb->LocalEnd.Port)) {\r
\r
return TRUE;\r
NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {\r
Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
\r
- if (EFI_IP4_EQUAL (*Addr, Tcb->LocalEnd.Ip) &&\r
+ if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&\r
(LocalPort == Tcb->LocalEnd.Port)) {\r
\r
return TRUE;\r
{\r
TCP_PEER Local;\r
TCP_PEER Remote;\r
- NET_LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Entry;\r
TCP_CB *Tcb;\r
\r
Local.Port = LocalPort;\r
if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) &&\r
TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) {\r
\r
- NetListRemoveEntry (&Tcb->List);\r
- NetListInsertHead (&mTcpRunQue, &Tcb->List);\r
+ RemoveEntryList (&Tcb->List);\r
+ InsertHeadList (&mTcpRunQue, &Tcb->List);\r
\r
return Tcb;\r
}\r
IN TCP_CB *Tcb\r
)\r
{\r
- NET_LIST_ENTRY *Entry;\r
- NET_LIST_ENTRY *Head;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Head;\r
TCP_CB *Node;\r
TCP4_PROTO_DATA *TcpProto;\r
\r
}\r
}\r
\r
- NetListInsertHead (Head, &Tcb->List);\r
+ InsertHeadList (Head, &Tcb->List);\r
\r
TcpProto = (TCP4_PROTO_DATA *) Tcb->Sk->ProtoReserved;\r
TcpSetVariableData (TcpProto->TcpService);\r
{\r
TCP_CB *Clone;\r
\r
- Clone = NetAllocatePool (sizeof (TCP_CB));\r
+ Clone = AllocatePool (sizeof (TCP_CB));\r
\r
if (Clone == NULL) {\r
return NULL;\r
\r
}\r
\r
- NetCopyMem (Clone, Tcb, sizeof (TCP_CB));\r
+ CopyMem (Clone, Tcb, sizeof (TCP_CB));\r
\r
//\r
// Increate the reference count of the shared IpInfo.\r
//\r
NET_GET_REF (Tcb->IpInfo);\r
\r
- NetListInit (&Clone->List);\r
- NetListInit (&Clone->SndQue);\r
- NetListInit (&Clone->RcvQue);\r
+ InitializeListHead (&Clone->List);\r
+ InitializeListHead (&Clone->SndQue);\r
+ InitializeListHead (&Clone->RcvQue);\r
\r
Clone->Sk = SockClone (Tcb->Sk);\r
if (Clone->Sk == NULL) {\r
- TCP4_DEBUG_ERROR (("TcpCloneTcb: failed to clone a sock\n"));\r
- NetFreePool (Clone);\r
+ DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n"));\r
+ gBS->FreePool (Clone);\r
return NULL;\r
}\r
\r
IN UINT8 State\r
)\r
{\r
- TCP4_DEBUG_TRACE (\r
- ("Tcb (%x) state %s --> %s\n",\r
+ DEBUG (\r
+ (EFI_D_INFO,\r
+ "Tcb (%x) state %s --> %s\n",\r
Tcb,\r
mTcpStateName[Tcb->State],\r
mTcpStateName[State])\r
case TCP_ESTABLISHED:\r
\r
SockConnEstablished (Tcb->Sk);\r
+\r
+ if (Tcb->Parent != NULL) {\r
+ //\r
+ // A new connection is accepted by a listening socket, install\r
+ // the device path.\r
+ //\r
+ TcpInstallDevicePath (Tcb->Sk);\r
+ }\r
+\r
break;\r
\r
case TCP_CLOSED:\r
{\r
ASSERT (Tcb);\r
\r
- if (!NetListIsEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk)) {\r
+ if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk)) {\r
\r
- TCP4_DEBUG_WARN (("TcpOnAppClose: connection reset "\r
+ DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset "\r
"because data is lost for TCB %x\n", Tcb));\r
\r
TcpResetConnection (Tcb);\r
\r
if (TcpOld < Tcb->RcvMss) {\r
\r
- TCP4_DEBUG_TRACE (("TcpOnAppConsume: send a window"\r
+ DEBUG ((EFI_D_INFO, "TcpOnAppConsume: send a window"\r
" update for a window closed Tcb(%x)\n", Tcb));\r
\r
TcpSendAck (Tcb);\r
} else if (Tcb->DelayedAck == 0) {\r
\r
- TCP4_DEBUG_TRACE (("TcpOnAppConsume: scheduled a delayed"\r
+ DEBUG ((EFI_D_INFO, "TcpOnAppConsume: scheduled a delayed"\r
" ACK to update window for Tcb(%x)\n", Tcb));\r
\r
Tcb->DelayedAck = 1;\r
IN TCP_CB *Tcb\r
)\r
{\r
- TCP4_DEBUG_WARN (("TcpOnAppAbort: connection reset "\r
+ DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset "\r
"issued by application for TCB %x\n", Tcb));\r
\r
switch (Tcb->State) {\r
)\r
{\r
UINT32 NumConfiguredInstance;\r
- NET_LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Entry;\r
TCP_CB *TcpPcb;\r
TCP4_PROTO_DATA *TcpProto;\r
UINTN VariableDataSize;\r
VariableDataSize += sizeof (EFI_TCP4_SERVICE_POINT) * (NumConfiguredInstance - 1);\r
}\r
\r
- Tcp4VariableData = NetAllocatePool (VariableDataSize);\r
+ Tcp4VariableData = AllocatePool (VariableDataSize);\r
if (Tcp4VariableData == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
// This tcp instance belongs to the Tcp4Service.\r
//\r
Tcp4ServicePoint->InstanceHandle = TcpPcb->Sk->SockHandle;\r
- NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->LocalPort = NTOHS (TcpPcb->LocalEnd.Port);\r
- NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->RemotePort = NTOHS (TcpPcb->RemoteEnd.Port);\r
\r
Tcp4ServicePoint++;\r
// This tcp instance belongs to the Tcp4Service.\r
//\r
Tcp4ServicePoint->InstanceHandle = TcpPcb->Sk->SockHandle;\r
- NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->LocalPort = NTOHS (TcpPcb->LocalEnd.Port);\r
- NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->RemotePort = NTOHS (TcpPcb->RemoteEnd.Port);\r
\r
Tcp4ServicePoint++;\r
);\r
}\r
\r
- NetFreePool (Tcp4Service->MacString);\r
+ gBS->FreePool (Tcp4Service->MacString);\r
}\r
\r
Tcp4Service->MacString = NewMacString;\r
\r
ON_ERROR:\r
\r
- NetFreePool (Tcp4VariableData);\r
+ gBS->FreePool (Tcp4VariableData);\r
\r
return Status;\r
}\r
NULL\r
);\r
\r
- NetFreePool (Tcp4Service->MacString);\r
+ gBS->FreePool (Tcp4Service->MacString);\r
Tcp4Service->MacString = NULL;\r
}\r
\r
+EFI_STATUS\r
+TcpInstallDevicePath (\r
+ IN SOCKET *Sock\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Install the device path protocol on the TCP instance.\r
+\r
+Arguments:\r
+\r
+ Sock - Pointer to the socket representing the TCP instance.\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - The device path protocol is installed.\r
+ other - Failed to install the device path protocol.\r
+\r
+--*/\r
+{\r
+ TCP4_PROTO_DATA *TcpProto;\r
+ TCP4_SERVICE_DATA *TcpService;\r
+ TCP_CB *Tcb;\r
+ IPv4_DEVICE_PATH Ip4DPathNode;\r
+ EFI_STATUS Status;\r
+\r
+ TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
+ TcpService = TcpProto->TcpService;\r
+ Tcb = TcpProto->TcpPcb;\r
+\r
+ NetLibCreateIPv4DPathNode (\r
+ &Ip4DPathNode,\r
+ TcpService->ControllerHandle,\r
+ Tcb->LocalEnd.Ip,\r
+ NTOHS (Tcb->LocalEnd.Port),\r
+ Tcb->RemoteEnd.Ip,\r
+ NTOHS (Tcb->RemoteEnd.Port),\r
+ EFI_IP_PROTO_TCP,\r
+ Tcb->UseDefaultAddr\r
+ );\r
+\r
+ Sock->DevicePath = AppendDevicePathNode (\r
+ Sock->ParentDevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode\r
+ );\r
+ if (Sock->DevicePath == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Status = gBS->InstallProtocolInterface (\r
+ &Sock->SockHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ Sock->DevicePath\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ gBS->FreePool (Sock->DevicePath);\r
+ }\r
+\r
+ return Status;\r
+}\r