]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c
MdeModulePkg/Ip4Dxe: Sync the direct route entry setting.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Timer.c
index 0b151795abcfb1b58ae2fd615f2b423d9f1fa218..4cb0ee7b5e6f9fe3797fbda90cea62b1ed6e7b59 100644 (file)
@@ -1,57 +1,85 @@
 /** @file\r
+  TCP timer related functions.\r
 \r
-Copyright (c) 2005 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2005 - 2018, 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
-  Tcp4Timer.c\r
-\r
-Abstract:\r
-\r
-  TCP timer related functions.\r
-\r
-\r
 **/\r
 \r
 #include "Tcp4Main.h"\r
 \r
 UINT32    mTcpTick = 1000;\r
 \r
+/**\r
+  Connect timeout handler.\r
+\r
+  @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
+\r
+**/\r
 VOID\r
 TcpConnectTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   );\r
 \r
+/**\r
+  Timeout handler for TCP retransmission timer.\r
+\r
+  @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
+\r
+**/\r
 VOID\r
 TcpRexmitTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   );\r
 \r
+/**\r
+  Timeout handler for window probe timer.\r
+\r
+  @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
+\r
+**/\r
 VOID\r
 TcpProbeTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   );\r
 \r
+/**\r
+  Timeout handler for keepalive timer.\r
+\r
+  @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
+\r
+**/\r
 VOID\r
 TcpKeepaliveTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   );\r
 \r
+/**\r
+  Timeout handler for FIN_WAIT_2 timer.\r
+\r
+  @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
+\r
+**/\r
 VOID\r
 TcpFinwait2Timeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   );\r
 \r
+/**\r
+  Timeout handler for 2MSL timer.\r
+\r
+  @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
+\r
+**/\r
 VOID\r
 Tcp2MSLTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   );\r
 \r
 TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = {\r
@@ -63,18 +91,15 @@ TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = {
   Tcp2MSLTimeout,\r
 };\r
 \r
-\r
 /**\r
   Close the TCP connection.\r
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpClose (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   NetbufFreeList (&Tcb->SndQue);\r
@@ -89,12 +114,10 @@ TcpClose (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpConnectTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   if (!TCP_CONNECTED (Tcb->State)) {\r
@@ -123,12 +146,10 @@ TcpConnectTimeout (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpRexmitTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   UINT32  FlightSize;\r
@@ -148,7 +169,7 @@ TcpRexmitTimeout (
   Tcb->LossRecover  = Tcb->SndNxt;\r
 \r
   Tcb->LossTimes++;\r
-  if (Tcb->LossTimes > Tcb->MaxRexmit &&\r
+  if ((Tcb->LossTimes > Tcb->MaxRexmit) &&\r
       !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) {\r
 \r
     DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed "\r
@@ -167,7 +188,6 @@ TcpRexmitTimeout (
   TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);\r
 \r
   Tcb->CongestState = TCP_CONGEST_LOSS;\r
-\r
   TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);\r
 }\r
 \r
@@ -177,12 +197,10 @@ TcpRexmitTimeout (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpProbeTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   //\r
@@ -193,7 +211,8 @@ TcpProbeTimeout (
   //\r
   if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) {\r
 \r
-    ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT));\r
+    ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0);\r
+    Tcb->ProbeTimerOn = FALSE;\r
     return ;\r
   }\r
 \r
@@ -207,12 +226,10 @@ TcpProbeTimeout (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpKeepaliveTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   Tcb->KeepAliveProbes++;\r
@@ -240,12 +257,10 @@ TcpKeepaliveTimeout (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpFinwait2Timeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed "\r
@@ -260,12 +275,10 @@ TcpFinwait2Timeout (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 Tcp2MSLTimeout (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed "\r
@@ -276,18 +289,15 @@ Tcp2MSLTimeout (
 \r
 \r
 /**\r
-  Update the timer status and the next expire time\r
-  according to the timers to expire in a specific\r
-  future time slot.\r
+  Update the timer status and the next expire time according to the timers\r
+  to expire in a specific future time slot.\r
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpUpdateTimer (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   UINT16  Index;\r
@@ -318,14 +328,12 @@ TcpUpdateTimer (
   @param  Timer    The index of the timer to be enabled.\r
   @param  TimeOut  The timeout value of this timer.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpSetTimer (\r
-  IN TCP_CB *Tcb,\r
-  IN UINT16 Timer,\r
-  IN UINT32 TimeOut\r
+  IN OUT TCP_CB *Tcb,\r
+  IN     UINT16 Timer,\r
+  IN     UINT32 TimeOut\r
   )\r
 {\r
   TCP_SET_TIMER (Tcb->EnabledTimer, Timer);\r
@@ -341,13 +349,11 @@ TcpSetTimer (
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
   @param  Timer    The index of the timer to be cleared.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpClearTimer (\r
-  IN TCP_CB *Tcb,\r
-  IN UINT16 Timer\r
+  IN OUT TCP_CB *Tcb,\r
+  IN     UINT16 Timer\r
   )\r
 {\r
   TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer);\r
@@ -360,12 +366,10 @@ TcpClearTimer (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpClearAllTimer (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   Tcb->EnabledTimer = 0;\r
@@ -378,16 +382,15 @@ TcpClearAllTimer (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpSetProbeTimer (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
-  if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_PROBE)) {\r
-    Tcb->ProbeTime = Tcb->Rto;\r
+  if (!Tcb->ProbeTimerOn) {\r
+    Tcb->ProbeTime    = Tcb->Rto;\r
+    Tcb->ProbeTimerOn = TRUE;\r
 \r
   } else {\r
     Tcb->ProbeTime <<= 1;\r
@@ -410,12 +413,10 @@ TcpSetProbeTimer (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpSetKeepaliveTimer (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) {\r
@@ -448,12 +449,10 @@ TcpSetKeepaliveTimer (
 \r
   @param  Tcb      Pointer to the TCP_CB of this TCP instance.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 TcpBackoffRto (\r
-  IN TCP_CB *Tcb\r
+  IN OUT TCP_CB *Tcb\r
   )\r
 {\r
   //\r
@@ -461,7 +460,7 @@ TcpBackoffRto (
   // may be wrong, fold it. So the next time a valid\r
   // measurement is sampled, we can start fresh.\r
   //\r
-  if ((Tcb->LossTimes >= TCP_FOLD_RTT) && Tcb->SRtt) {\r
+  if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) {\r
     Tcb->RttVar += Tcb->SRtt >> 2;\r
     Tcb->SRtt = 0;\r
   }\r
@@ -481,9 +480,7 @@ TcpBackoffRto (
 /**\r
   Heart beat timer handler.\r
 \r
-  @param  Context  Context of the timer event, ignored.\r
-\r
-  @return None.\r
+  @param  Context        Context of the timer event, ignored.\r
 \r
 **/\r
 VOID\r
@@ -521,7 +518,7 @@ TcpTickingDpc (
 \r
     Tcb->Idle++;\r
 \r
-    if (Tcb->DelayedAck) {\r
+    if (Tcb->DelayedAck != 0) {\r
       TcpSendAck (Tcb);\r
     }\r
 \r
@@ -554,15 +551,17 @@ TcpTickingDpc (
         //\r
         if ((Next->BackLink != Entry) ||\r
             (Tcb->EnabledTimer == 0)) {\r
-\r
-          goto NextConnection;\r
+          break;\r
         }\r
       }\r
     }\r
 \r
-    TcpUpdateTimer (Tcb);\r
-NextConnection:\r
-    ;\r
+    //\r
+    // If the Tcb still exist or some timer is set, update the timer\r
+    //\r
+    if (Index == TCP_TIMER_NUMBER) {\r
+      TcpUpdateTimer (Tcb);\r
+    }\r
   }\r
 }\r
 \r
@@ -572,8 +571,6 @@ NextConnection:
   @param  Event    Timer event signaled, ignored.\r
   @param  Context  Context of the timer event, ignored.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -582,6 +579,6 @@ TcpTicking (
   IN VOID      *Context\r
   )\r
 {\r
-  NetLibQueueDpc (TPL_CALLBACK, TcpTickingDpc, Context);\r
+  QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context);\r
 }\r
 \r