\r
#include "Tcp4Main.h"\r
\r
+#include <Library/DevicePathLib.h>\r
+\r
NET_LIST_ENTRY mTcpRunQue = {\r
&mTcpRunQue,\r
&mTcpRunQue\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 = 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
NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {\r
Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
\r
- if ((EFI_IP4 (*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 (*Addr) == Tcb->LocalEnd.Ip)) &&\r
+ if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&\r
(LocalPort == Tcb->LocalEnd.Port)) {\r
\r
return TRUE;\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
HTONS ((UINT16) Nbuf->TotalSize)\r
);\r
\r
- return ~Checksum;\r
+ return (UINT16) ~Checksum;\r
}\r
\r
\r
IN TCP_CB *Tcb\r
)\r
{\r
+ UINT32 TcpOld;\r
\r
switch (Tcb->State) {\r
case TCP_CLOSED:\r
break;\r
\r
case TCP_ESTABLISHED:\r
- if (TcpRcvWinNow (Tcb) > TcpRcvWinOld (Tcb)) {\r
+ TcpOld = TcpRcvWinOld (Tcb);\r
+ if (TcpRcvWinNow (Tcb) > TcpOld) {\r
\r
- if (TcpRcvWinOld (Tcb) < Tcb->RcvMss) {\r
+ if (TcpOld < Tcb->RcvMss) {\r
\r
TCP4_DEBUG_TRACE (("TcpOnAppConsume: send a window"\r
" update for a window closed Tcb(%x)\n", Tcb));\r
// This tcp instance belongs to the Tcp4Service.\r
//\r
Tcp4ServicePoint->InstanceHandle = TcpPcb->Sk->SockHandle;\r
- EFI_IP4 (Tcp4ServicePoint->LocalAddress) = TcpPcb->LocalEnd.Ip;\r
+ NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->LocalPort = NTOHS (TcpPcb->LocalEnd.Port);\r
- EFI_IP4 (Tcp4ServicePoint->RemoteAddress) = TcpPcb->RemoteEnd.Ip;\r
+ NetCopyMem (&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
- EFI_IP4 (Tcp4ServicePoint->LocalAddress) = TcpPcb->LocalEnd.Ip;\r
+ NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->LocalPort = NTOHS (TcpPcb->LocalEnd.Port);\r
- EFI_IP4 (Tcp4ServicePoint->RemoteAddress) = TcpPcb->RemoteEnd.Ip;\r
+ NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
Tcp4ServicePoint->RemotePort = NTOHS (TcpPcb->RemoteEnd.Port);\r
\r
Tcp4ServicePoint++;\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
+ NetFreePool (Sock->DevicePath);\r
+ }\r
+\r
+ return Status;\r
+}\r