diff options
| author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2010-10-14 01:52:09 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-10-17 13:46:33 -0700 | 
| commit | c60ce4e265404ca42ba860401f4b0f1e97332a67 (patch) | |
| tree | 7a71a183c1512e32257f9ec66d74e8544c772bec /net/ipv4/tcp_timer.c | |
| parent | 1fdb936101637c91819efea47e921bb592e07e34 (diff) | |
| download | olio-linux-3.10-c60ce4e265404ca42ba860401f4b0f1e97332a67.tar.xz olio-linux-3.10-c60ce4e265404ca42ba860401f4b0f1e97332a67.zip  | |
tcp: use correct counters in CA_CWR state too
As CWR is stronger than CA_Disorder state, we can miscount
SACK/Reno failure into other timeouts. Not a bad problem as
it can happen only due to ECN, FRTO detecting spurious RTO
or xmit error which are the only callers of tcp_enter_cwr.
And even then losses and RTO must still follow thereafter
to actually end up into the relevant code paths.
Compile tested.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_timer.c')
| -rw-r--r-- | net/ipv4/tcp_timer.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index f3c8c6c019a..74a6aa00365 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -367,18 +367,19 @@ void tcp_retransmit_timer(struct sock *sk)  	if (icsk->icsk_retransmits == 0) {  		int mib_idx; -		if (icsk->icsk_ca_state == TCP_CA_Disorder) { -			if (tcp_is_sack(tp)) -				mib_idx = LINUX_MIB_TCPSACKFAILURES; -			else -				mib_idx = LINUX_MIB_TCPRENOFAILURES; -		} else if (icsk->icsk_ca_state == TCP_CA_Recovery) { +		if (icsk->icsk_ca_state == TCP_CA_Recovery) {  			if (tcp_is_sack(tp))  				mib_idx = LINUX_MIB_TCPSACKRECOVERYFAIL;  			else  				mib_idx = LINUX_MIB_TCPRENORECOVERYFAIL;  		} else if (icsk->icsk_ca_state == TCP_CA_Loss) {  			mib_idx = LINUX_MIB_TCPLOSSFAILURES; +		} else if ((icsk->icsk_ca_state == TCP_CA_Disorder) || +			   tp->sacked_out) { +			if (tcp_is_sack(tp)) +				mib_idx = LINUX_MIB_TCPSACKFAILURES; +			else +				mib_idx = LINUX_MIB_TCPRENOFAILURES;  		} else {  			mib_idx = LINUX_MIB_TCPTIMEOUTS;  		}  |