From: tye1 Date: Fri, 27 Aug 2010 07:57:45 +0000 (+0000) Subject: The patch acknowledges the TCP zero window probe message, either the format with... X-Git-Tag: edk2-stable201903~15573 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=ac8cca2a4dd777970811fb727c396e2585c2bba1 The patch acknowledges the TCP zero window probe message, either the format with 1 byte new data, or no new data. It also increases exponentially the interval between successive probes when performing TCP zero window probe. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10831 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c index 549601eefe..f8dcc365e3 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c @@ -1,7 +1,7 @@ /** @file TCP input process routines. -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.
+Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -33,7 +33,7 @@ TcpSeqAcceptable ( ) { return (TCP_SEQ_LEQ (Tcb->RcvWl2, Seg->End) && - TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd)); + TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd)); } @@ -925,6 +925,14 @@ TcpInput ( // Process segment in SYN_RCVD or TCP_CONNECTED states // + // + // Clear probe timer since the RecvWindow is opened. + // + if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) { + TcpClearTimer (Tcb, TCP_TIMER_PROBE); + Tcb->ProbeTimerOn = FALSE; + } + // // First step: Check whether SEG.SEQ is acceptable // @@ -1281,11 +1289,6 @@ StepSix: Tcb->Idle = 0; TcpSetKeepaliveTimer (Tcb); - if (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_PROBE)) { - - TcpClearTimer (Tcb, TCP_TIMER_PROBE); - } - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) && !TCP_FIN_RCVD (Tcb->State)) { diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c index afcaba4ed6..62c8e5b5ac 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c @@ -77,7 +77,9 @@ TcpInitTcbLocal ( // // First window size is never scaled // - Tcb->RcvWndScale = 0; + Tcb->RcvWndScale = 0; + + Tcb->ProbeTimerOn = FALSE; } diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c index 6e08ac9cdb..095030551d 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c @@ -1,7 +1,7 @@ /** @file TCP output process routines. -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.
+Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -267,7 +267,9 @@ SetPersistTimer: Tcb) ); - TcpSetProbeTimer (Tcb); + if (!Tcb->ProbeTimerOn) { + TcpSetProbeTimer (Tcb); + } } return 0; diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h index 5759b6b7dd..01d6034b13 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h @@ -1,7 +1,7 @@ /** @file Tcp Protocol header file. -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.
+Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -206,6 +206,7 @@ struct _TCP_CB { INT32 NextExpire; ///< Count down offset for the nearest timer UINT32 Idle; ///< How long the connection is in idle UINT32 ProbeTime; ///< The time out value for current window prober + BOOLEAN ProbeTimerOn;///< If TRUE, the probe time is on. // // RFC1323 defined variables, about window scale, diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c index 86f47ede98..a8e4a933cf 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c @@ -1,7 +1,7 @@ /** @file TCP timer related functions. -Copyright (c) 2005 - 2007, Intel Corporation. All rights reserved.
+Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -212,6 +212,7 @@ TcpProbeTimeout ( if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) { ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0); + Tcb->ProbeTimerOn = FALSE; return ; } @@ -387,8 +388,9 @@ TcpSetProbeTimer ( IN OUT TCP_CB *Tcb ) { - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_PROBE)) { - Tcb->ProbeTime = Tcb->Rto; + if (!Tcb->ProbeTimerOn) { + Tcb->ProbeTime = Tcb->Rto; + Tcb->ProbeTimerOn = TRUE; } else { Tcb->ProbeTime <<= 1;