[TCP] vegas: Fix a bug in disabling slow start by gamma parameter.
TCP Vegas implementation has a bug in the process of disabling slow-start with gamma parameter. The bug may lead to extreme unfairness in the presence of early packet loss. See details in: http://www.cs.caltech.edu/~weixl/technical/ns2linux/known_linux/index.html#vegas Switch the order of "if (tp->snd_cwnd <= tp->snd_ssthresh)" statement and "if (diff > gamma)" statement to eliminate the problem. Signed-off-by: Xiaoliang (David) Wei <davidwei79@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5c81833c2f
commit
c940587bf6
|
@ -266,26 +266,25 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
|
|||
*/
|
||||
diff = (old_wnd << V_PARAM_SHIFT) - target_cwnd;
|
||||
|
||||
if (tp->snd_cwnd <= tp->snd_ssthresh) {
|
||||
if (diff > gamma && tp->snd_ssthresh > 2 ) {
|
||||
/* Going too fast. Time to slow down
|
||||
* and switch to congestion avoidance.
|
||||
*/
|
||||
tp->snd_ssthresh = 2;
|
||||
|
||||
/* Set cwnd to match the actual rate
|
||||
* exactly:
|
||||
* cwnd = (actual rate) * baseRTT
|
||||
* Then we add 1 because the integer
|
||||
* truncation robs us of full link
|
||||
* utilization.
|
||||
*/
|
||||
tp->snd_cwnd = min(tp->snd_cwnd,
|
||||
(target_cwnd >>
|
||||
V_PARAM_SHIFT)+1);
|
||||
|
||||
} else if (tp->snd_cwnd <= tp->snd_ssthresh) {
|
||||
/* Slow start. */
|
||||
if (diff > gamma) {
|
||||
/* Going too fast. Time to slow down
|
||||
* and switch to congestion avoidance.
|
||||
*/
|
||||
tp->snd_ssthresh = 2;
|
||||
|
||||
/* Set cwnd to match the actual rate
|
||||
* exactly:
|
||||
* cwnd = (actual rate) * baseRTT
|
||||
* Then we add 1 because the integer
|
||||
* truncation robs us of full link
|
||||
* utilization.
|
||||
*/
|
||||
tp->snd_cwnd = min(tp->snd_cwnd,
|
||||
(target_cwnd >>
|
||||
V_PARAM_SHIFT)+1);
|
||||
|
||||
}
|
||||
tcp_slow_start(tp);
|
||||
} else {
|
||||
/* Congestion avoidance. */
|
||||
|
|
Loading…
Reference in New Issue
Block a user