From 8363c46f4c64943e6c54b53e6ba18628d3c171ed Mon Sep 17 00:00:00 2001 From: vanjeff Date: Wed, 17 Nov 2010 03:28:28 +0000 Subject: sync patch r10831 from main trunk. 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/branches/UDK2008@11070 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c | 17 ++++++++++------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | 4 +++- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c | 6 ++++-- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h | 3 ++- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c | 8 +++++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c index 882a6b70cf..66ee1e9e1f 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 - 2007, Intel Corporation
+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 f5638cd990..9e24b13744 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 956385a914..360e9c7284 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
+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 78d2eb3799..9b8c37f4ec 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 - 2006, Intel Corporation
+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 @@ 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 91e763c486..baf1a3ba91 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
+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; -- cgit v1.2.3