diff options
| author | Stephen Hemminger <shemminger@osdl.org> | 2005-11-10 17:09:53 -0800 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2005-11-10 17:09:53 -0800 | 
| commit | 9772efb970780aeed488c19d8b4afd46c3b484af (patch) | |
| tree | de016aaa29c8a95e98c7abaa70c8b590160e2886 /net/ipv4/tcp_cong.c | |
| parent | 7faffa1c7fb9b8e8917e3225d4e2638270c0a48b (diff) | |
| download | olio-linux-3.10-9772efb970780aeed488c19d8b4afd46c3b484af.tar.xz olio-linux-3.10-9772efb970780aeed488c19d8b4afd46c3b484af.zip  | |
[TCP]: Appropriate Byte Count support
This is an updated version of the RFC3465 ABC patch originally
for Linux 2.6.11-rc4 by Yee-Ting Li. ABC is a way of counting
bytes ack'd rather than packets when updating congestion control.
The orignal ABC described in the RFC applied to a Reno style
algorithm. For advanced congestion control there is little
change after leaving slow start.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_cong.c')
| -rw-r--r-- | net/ipv4/tcp_cong.c | 31 | 
1 files changed, 20 insertions, 11 deletions
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 6d3e883b48f..c7cc62c8dc1 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c @@ -192,17 +192,26 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight,  	/* In "safe" area, increase. */          if (tp->snd_cwnd <= tp->snd_ssthresh)  		tcp_slow_start(tp); -	else { -		/* In dangerous area, increase slowly. -		 * In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd -		 */ -		if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { -			if (tp->snd_cwnd < tp->snd_cwnd_clamp) -				tp->snd_cwnd++; -			tp->snd_cwnd_cnt = 0; -		} else -			tp->snd_cwnd_cnt++; -	} + + 	/* In dangerous area, increase slowly. */ +	else if (sysctl_tcp_abc) { + 		/* RFC3465: Apppriate Byte Count + 		 * increase once for each full cwnd acked + 		 */ + 		if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) { + 			tp->bytes_acked -= tp->snd_cwnd*tp->mss_cache; + 			if (tp->snd_cwnd < tp->snd_cwnd_clamp) + 				tp->snd_cwnd++; + 		} + 	} else { + 		/* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd */ + 		if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { + 			if (tp->snd_cwnd < tp->snd_cwnd_clamp) + 				tp->snd_cwnd++; + 			tp->snd_cwnd_cnt = 0; + 		} else + 			tp->snd_cwnd_cnt++; + 	}  }  EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid);  |