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
This commit is contained in:
tye1 2010-08-27 07:57:45 +00:00
parent 8730386e6d
commit ac8cca2a4d
5 changed files with 24 additions and 14 deletions

View File

@ -1,7 +1,7 @@
/** @file
TCP input process routines.
Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
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)) {

View File

@ -77,7 +77,9 @@ TcpInitTcbLocal (
//
// First window size is never scaled
//
Tcb->RcvWndScale = 0;
Tcb->RcvWndScale = 0;
Tcb->ProbeTimerOn = FALSE;
}

View File

@ -1,7 +1,7 @@
/** @file
TCP output process routines.
Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
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;

View File

@ -1,7 +1,7 @@
/** @file
Tcp Protocol header file.
Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
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,

View File

@ -1,7 +1,7 @@
/** @file
TCP timer related functions.
Copyright (c) 2005 - 2007, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
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;