diff options
| -rw-r--r-- | net/ipv4/tcp_vegas.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c index a453aac91bd3..c6743eec9b7d 100644 --- a/net/ipv4/tcp_vegas.c +++ b/net/ipv4/tcp_vegas.c | |||
| @@ -158,6 +158,11 @@ void tcp_vegas_cwnd_event(struct sock *sk, enum tcp_ca_event event) | |||
| 158 | } | 158 | } |
| 159 | EXPORT_SYMBOL_GPL(tcp_vegas_cwnd_event); | 159 | EXPORT_SYMBOL_GPL(tcp_vegas_cwnd_event); |
| 160 | 160 | ||
| 161 | static inline u32 tcp_vegas_ssthresh(struct tcp_sock *tp) | ||
| 162 | { | ||
| 163 | return min(tp->snd_ssthresh, tp->snd_cwnd-1); | ||
| 164 | } | ||
| 165 | |||
| 161 | static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | 166 | static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) |
| 162 | { | 167 | { |
| 163 | struct tcp_sock *tp = tcp_sk(sk); | 168 | struct tcp_sock *tp = tcp_sk(sk); |
| @@ -221,11 +226,10 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 221 | */ | 226 | */ |
| 222 | diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; | 227 | diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; |
| 223 | 228 | ||
| 224 | if (diff > gamma && tp->snd_ssthresh > 2 ) { | 229 | if (diff > gamma && tp->snd_cwnd <= tp->snd_ssthresh) { |
| 225 | /* Going too fast. Time to slow down | 230 | /* Going too fast. Time to slow down |
| 226 | * and switch to congestion avoidance. | 231 | * and switch to congestion avoidance. |
| 227 | */ | 232 | */ |
| 228 | tp->snd_ssthresh = 2; | ||
| 229 | 233 | ||
| 230 | /* Set cwnd to match the actual rate | 234 | /* Set cwnd to match the actual rate |
| 231 | * exactly: | 235 | * exactly: |
| @@ -235,6 +239,7 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 235 | * utilization. | 239 | * utilization. |
| 236 | */ | 240 | */ |
| 237 | tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1); | 241 | tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1); |
| 242 | tp->snd_ssthresh = tcp_vegas_ssthresh(tp); | ||
| 238 | 243 | ||
| 239 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { | 244 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { |
| 240 | /* Slow start. */ | 245 | /* Slow start. */ |
| @@ -250,6 +255,8 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 250 | * we slow down. | 255 | * we slow down. |
| 251 | */ | 256 | */ |
| 252 | tp->snd_cwnd--; | 257 | tp->snd_cwnd--; |
| 258 | tp->snd_ssthresh | ||
| 259 | = tcp_vegas_ssthresh(tp); | ||
| 253 | } else if (diff < alpha) { | 260 | } else if (diff < alpha) { |
| 254 | /* We don't have enough extra packets | 261 | /* We don't have enough extra packets |
| 255 | * in the network, so speed up. | 262 | * in the network, so speed up. |
