/** @file\r
+ Misc support routines for tcp.\r
\r
-Copyright (c) 2005 - 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
+http://opensource.org/licenses/bsd-license.php<BR>\r
\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
-Module Name:\r
-\r
- Tcp4Misc.c\r
-\r
-Abstract:\r
-\r
- Misc support routines for tcp.\r
-\r
-\r
**/\r
\r
\r
**/\r
VOID\r
TcpInitTcbLocal (\r
- IN TCP_CB *Tcb\r
+ IN OUT TCP_CB *Tcb\r
)\r
{\r
//\r
//\r
// First window size is never scaled\r
//\r
- Tcb->RcvWndScale = 0;\r
+ Tcb->RcvWndScale = 0;\r
+\r
+ Tcb->ProbeTimerOn = FALSE;\r
}\r
\r
\r
**/\r
VOID\r
TcpInitTcbPeer (\r
- IN TCP_CB *Tcb,\r
- IN TCP_SEG *Seg,\r
- IN TCP_OPTION *Opt\r
+ IN OUT TCP_CB *Tcb,\r
+ IN TCP_SEG *Seg,\r
+ IN TCP_OPTION *Opt\r
)\r
{\r
UINT16 RcvMss;\r
\r
- ASSERT (Tcb && Seg && Opt);\r
+ ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL));\r
ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN));\r
\r
Tcb->SndWnd = Seg->Wnd;\r
@param Local Pointer to the local (IP, Port).\r
@param Remote Pointer to the remote (IP, Port).\r
\r
- @return Pointer to the TCP_CB with the least number of wildcard, \r
+ @return Pointer to the TCP_CB with the least number of wildcard,\r
if NULL no match is found.\r
\r
**/\r
\r
\r
/**\r
- Clone a TCP_CB from Tcb.\r
+ Clone a TCB_CB from Tcb.\r
\r
@param Tcb Pointer to the TCP_CB to be cloned.\r
\r
Clone->Sk = SockClone (Tcb->Sk);\r
if (Clone->Sk == NULL) {\r
DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n"));\r
- gBS->FreePool (Clone);\r
+ FreePool (Clone);\r
return NULL;\r
}\r
\r
IN SOCKET *Sock\r
)\r
{\r
- EFI_SIMPLE_NETWORK_MODE SnpMode;\r
+ EFI_IP4_MODE_DATA Ip4Mode;\r
TCP4_PROTO_DATA *TcpProto;\r
EFI_IP4_PROTOCOL *Ip;\r
\r
ASSERT (Sock != NULL);\r
\r
TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
- Ip = TcpProto->TcpService->IpIo->Ip;\r
+ Ip = TcpProto->TcpService->IpIo->Ip.Ip4;\r
ASSERT (Ip != NULL);\r
\r
- Ip->GetModeData (Ip, NULL, NULL, &SnpMode);\r
+ Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL);\r
\r
- return (UINT16) (SnpMode.MaxPacketSize - 40);\r
+ return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD));\r
}\r
\r
\r
**/\r
VOID\r
TcpSetState (\r
- IN TCP_CB *Tcb,\r
- IN UINT8 State\r
+ IN OUT TCP_CB *Tcb,\r
+ IN UINT8 State\r
)\r
{\r
+ ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));\r
+ ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));\r
+\r
DEBUG (\r
(EFI_D_INFO,\r
"Tcb (%p) state %s --> %s\n",\r
\r
SockConnClosed (Tcb->Sk);\r
\r
+ break;\r
+ default:\r
break;\r
}\r
}\r
return (UINT16) ~Checksum;\r
}\r
\r
-\r
/**\r
Translate the information from the head of the received TCP\r
segment Nbuf contains and fill it into a TCP_SEG structure.\r
**/\r
TCP_SEG *\r
TcpFormatNetbuf (\r
- IN TCP_CB *Tcb,\r
- IN NET_BUF *Nbuf\r
+ IN TCP_CB *Tcb,\r
+ IN OUT NET_BUF *Nbuf\r
)\r
{\r
TCP_SEG *Seg;\r
\r
Seg = TCPSEG_NETBUF (Nbuf);\r
Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);\r
+ ASSERT (Head != NULL);\r
Nbuf->Tcp = Head;\r
\r
Seg->Seq = NTOHL (Head->Seq);\r
Nhead->Ack = HTONL (Tcb->RcvNxt);\r
Nhead->SrcPort = Tcb->LocalEnd.Port;\r
Nhead->DstPort = Tcb->RemoteEnd.Port;\r
- Nhead->HeadLen = (sizeof (TCP_HEAD) >> 2);\r
+ Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2);\r
Nhead->Res = 0;\r
Nhead->Wnd = HTONS (0xFFFF);\r
Nhead->Checksum = 0;\r
**/\r
VOID\r
TcpOnAppConnect (\r
- IN TCP_CB *Tcb\r
+ IN OUT TCP_CB *Tcb\r
)\r
{\r
TcpInitTcbLocal (Tcb);\r
**/\r
VOID\r
TcpOnAppClose (\r
- IN TCP_CB *Tcb\r
+ IN OUT TCP_CB *Tcb\r
)\r
{\r
ASSERT (Tcb != NULL);\r
case TCP_CLOSE_WAIT:\r
TcpSetState (Tcb, TCP_LAST_ACK);\r
break;\r
+ default:\r
+ break;\r
}\r
\r
TcpToSendData (Tcb, 1);\r
**/\r
INTN\r
TcpOnAppSend (\r
- IN TCP_CB *Tcb\r
+ IN OUT TCP_CB *Tcb\r
)\r
{\r
\r
switch (Tcb->State) {\r
case TCP_CLOSED:\r
return -1;\r
- break;\r
\r
case TCP_LISTEN:\r
return -1;\r
- break;\r
\r
case TCP_SYN_SENT:\r
case TCP_SYN_RCVD:\r
return 0;\r
- break;\r
\r
case TCP_ESTABLISHED:\r
case TCP_CLOSE_WAIT:\r
TcpToSendData (Tcb, 0);\r
return 0;\r
- break;\r
\r
case TCP_FIN_WAIT_1:\r
case TCP_FIN_WAIT_2:\r
case TCP_LAST_ACK:\r
case TCP_TIME_WAIT:\r
return -1;\r
+\r
+ default:\r
break;\r
}\r
\r
@param Tcb Pointer to the TCP_CB of this TCP instance.\r
\r
**/\r
-INTN\r
+VOID\r
TcpOnAppConsume (\r
IN TCP_CB *Tcb\r
)\r
\r
switch (Tcb->State) {\r
case TCP_CLOSED:\r
- return -1;\r
- break;\r
+ return;\r
\r
case TCP_LISTEN:\r
- return -1;\r
- break;\r
+ return;\r
\r
case TCP_SYN_SENT:\r
case TCP_SYN_RCVD:\r
- return 0;\r
- break;\r
+ return;\r
\r
case TCP_ESTABLISHED:\r
TcpOld = TcpRcvWinOld (Tcb);\r
if (TcpOld < Tcb->RcvMss) {\r
\r
DEBUG ((EFI_D_INFO, "TcpOnAppConsume: send a window"\r
- " update for a window closed Tcb(%p)\n", Tcb));\r
+ " update for a window closed Tcb %p\n", Tcb));\r
\r
TcpSendAck (Tcb);\r
} else if (Tcb->DelayedAck == 0) {\r
\r
DEBUG ((EFI_D_INFO, "TcpOnAppConsume: scheduled a delayed"\r
- " ACK to update window for Tcb(%p)\n", Tcb));\r
+ " ACK to update window for Tcb %p\n", Tcb));\r
\r
Tcb->DelayedAck = 1;\r
}\r
break;\r
\r
case TCP_CLOSE_WAIT:\r
- return 0;\r
- break;\r
+ return;\r
\r
case TCP_FIN_WAIT_1:\r
case TCP_FIN_WAIT_2:\r
case TCP_CLOSING:\r
case TCP_LAST_ACK:\r
case TCP_TIME_WAIT:\r
- return -1;\r
+ return;\r
+\r
+ default:\r
break;\r
}\r
-\r
- return -1;\r
}\r
\r
\r
case TCP_CLOSE_WAIT:\r
TcpResetConnection (Tcb);\r
break;\r
+ default:\r
+ break;\r
}\r
\r
TcpSetState (Tcb, TCP_CLOSED);\r
);\r
}\r
\r
- gBS->FreePool (Tcp4Service->MacString);\r
+ FreePool (Tcp4Service->MacString);\r
}\r
\r
Tcp4Service->MacString = NewMacString;\r
\r
ON_ERROR:\r
\r
- gBS->FreePool (Tcp4VariableData);\r
+ FreePool (Tcp4VariableData);\r
\r
return Status;\r
}\r
NULL\r
);\r
\r
- gBS->FreePool (Tcp4Service->MacString);\r
+ FreePool (Tcp4Service->MacString);\r
Tcp4Service->MacString = NULL;\r
}\r
\r
TCP_CB *Tcb;\r
IPv4_DEVICE_PATH Ip4DPathNode;\r
EFI_STATUS Status;\r
+ TCP_PORTNO LocalPort;\r
+ TCP_PORTNO RemotePort;\r
\r
TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
TcpService = TcpProto->TcpService;\r
Tcb = TcpProto->TcpPcb;\r
\r
+ LocalPort = NTOHS (Tcb->LocalEnd.Port);\r
+ RemotePort = NTOHS (Tcb->RemoteEnd.Port);\r
NetLibCreateIPv4DPathNode (\r
&Ip4DPathNode,\r
TcpService->ControllerHandle,\r
Tcb->LocalEnd.Ip,\r
- NTOHS (Tcb->LocalEnd.Port),\r
+ LocalPort,\r
Tcb->RemoteEnd.Ip,\r
- NTOHS (Tcb->RemoteEnd.Port),\r
+ RemotePort,\r
EFI_IP_PROTO_TCP,\r
Tcb->UseDefaultAddr\r
);\r
\r
+ IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask);\r
+\r
Sock->DevicePath = AppendDevicePathNode (\r
Sock->ParentDevicePath,\r
(EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode\r
Sock->DevicePath\r
);\r
if (EFI_ERROR (Status)) {\r
- gBS->FreePool (Sock->DevicePath);\r
+ FreePool (Sock->DevicePath);\r
}\r
\r
return Status;\r