]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
Refine soma code to make code run safely.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Misc.c
index 1c269929e34d5fa376bacd3c0397b2b0a5dc5ff1..2ed3c254f3ce8783a79e6da59cd2c62852b2baa3 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   Misc support routines for tcp.\r
 \r
-Copyright (c) 2005 - 2006, Intel Corporation<BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2005 - 2010, 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<BR>\r
@@ -52,7 +52,7 @@ CHAR16   *mTcpStateName[] = {
 **/\r
 VOID\r
 TcpInitTcbLocal (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   //\r
@@ -77,7 +77,9 @@ TcpInitTcbLocal (
   //\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
@@ -92,14 +94,14 @@ TcpInitTcbLocal (
 **/\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
@@ -171,7 +173,7 @@ TcpInitTcbPeer (
   @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
@@ -432,7 +434,7 @@ TcpCloneTcb (
   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
@@ -471,19 +473,19 @@ TcpGetRcvMss (
   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
@@ -496,10 +498,13 @@ TcpGetRcvMss (
 **/\r
 VOID\r
 TcpSetState (\r
-  IN TCP_CB      *Tcb,\r
-  IN TCP_STATES  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
@@ -508,7 +513,7 @@ TcpSetState (
     mTcpStateName[State])\r
     );\r
 \r
-  Tcb->State = (TCP_STATES)State;\r
+  Tcb->State = State;\r
 \r
   switch (State) {\r
   case TCP_ESTABLISHED:\r
@@ -530,7 +535,7 @@ TcpSetState (
     SockConnClosed (Tcb->Sk);\r
 \r
     break;\r
-  case default:\r
+  default:\r
     break;\r
   }\r
 }\r
@@ -578,8 +583,8 @@ TcpChecksum (
 **/\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
@@ -652,7 +657,7 @@ TcpResetConnection (
   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
@@ -674,7 +679,7 @@ TcpResetConnection (
 **/\r
 VOID\r
 TcpOnAppConnect (\r
-  IN TCP_CB  *Tcb\r
+  IN OUT TCP_CB  *Tcb\r
   )\r
 {\r
   TcpInitTcbLocal (Tcb);\r
@@ -694,7 +699,7 @@ TcpOnAppConnect (
 **/\r
 VOID\r
 TcpOnAppClose (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   ASSERT (Tcb != NULL);\r
@@ -724,7 +729,7 @@ TcpOnAppClose (
   case TCP_CLOSE_WAIT:\r
     TcpSetState (Tcb, TCP_LAST_ACK);\r
     break;\r
-  case default:\r
+  default:\r
     break;\r
   }\r
 \r
@@ -745,29 +750,25 @@ TcpOnAppClose (
 **/\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
@@ -775,8 +776,8 @@ TcpOnAppSend (
   case TCP_LAST_ACK:\r
   case TCP_TIME_WAIT:\r
     return -1;\r
-    break;\r
-  case default:\r
+\r
+  default:\r
     break;\r
   }\r
 \r
@@ -791,7 +792,7 @@ TcpOnAppSend (
   @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
@@ -800,17 +801,14 @@ TcpOnAppConsume (
 \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
@@ -834,19 +832,18 @@ TcpOnAppConsume (
     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
@@ -873,6 +870,8 @@ TcpOnAppAbort (
   case TCP_CLOSE_WAIT:\r
     TcpResetConnection (Tcb);\r
     break;\r
+  default:\r
+    break;\r
   }\r
 \r
   TcpSetState (Tcb, TCP_CLOSED);\r
@@ -1031,7 +1030,7 @@ TcpSetVariableData (
              );\r
     }\r
 \r
-    gBS->FreePool (Tcp4Service->MacString);\r
+    FreePool (Tcp4Service->MacString);\r
   }\r
 \r
   Tcp4Service->MacString = NewMacString;\r
@@ -1046,7 +1045,7 @@ TcpSetVariableData (
 \r
 ON_ERROR:\r
 \r
-  gBS->FreePool (Tcp4VariableData);\r
+  FreePool (Tcp4VariableData);\r
 \r
   return Status;\r
 }\r
@@ -1073,7 +1072,7 @@ TcpClearVariableData (
          NULL\r
          );\r
 \r
-  gBS->FreePool (Tcp4Service->MacString);\r
+  FreePool (Tcp4Service->MacString);\r
   Tcp4Service->MacString = NULL;\r
 }\r
 \r
@@ -1096,18 +1095,22 @@ TcpInstallDevicePath (
   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
@@ -1127,7 +1130,7 @@ TcpInstallDevicePath (
                   Sock->DevicePath\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (Sock->DevicePath);\r
+    FreePool (Sock->DevicePath);\r
   }\r
 \r
   return Status;\r