diff options
Diffstat (limited to 'net/ipv4/tcp_westwood.c')
-rw-r--r-- | net/ipv4/tcp_westwood.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/net/ipv4/tcp_westwood.c b/net/ipv4/tcp_westwood.c index 81911a92356c..bb63fba47d47 100644 --- a/net/ipv4/tcp_westwood.c +++ b/net/ipv4/tcp_westwood.c | |||
@@ -220,32 +220,35 @@ static u32 tcp_westwood_bw_rttmin(const struct sock *sk) | |||
220 | return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2); | 220 | return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2); |
221 | } | 221 | } |
222 | 222 | ||
223 | static void tcp_westwood_ack(struct sock *sk, u32 ack_flags) | ||
224 | { | ||
225 | if (ack_flags & CA_ACK_SLOWPATH) { | ||
226 | struct westwood *w = inet_csk_ca(sk); | ||
227 | |||
228 | westwood_update_window(sk); | ||
229 | w->bk += westwood_acked_count(sk); | ||
230 | |||
231 | update_rtt_min(w); | ||
232 | return; | ||
233 | } | ||
234 | |||
235 | westwood_fast_bw(sk); | ||
236 | } | ||
237 | |||
223 | static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event) | 238 | static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event) |
224 | { | 239 | { |
225 | struct tcp_sock *tp = tcp_sk(sk); | 240 | struct tcp_sock *tp = tcp_sk(sk); |
226 | struct westwood *w = inet_csk_ca(sk); | 241 | struct westwood *w = inet_csk_ca(sk); |
227 | 242 | ||
228 | switch (event) { | 243 | switch (event) { |
229 | case CA_EVENT_FAST_ACK: | ||
230 | westwood_fast_bw(sk); | ||
231 | break; | ||
232 | |||
233 | case CA_EVENT_COMPLETE_CWR: | 244 | case CA_EVENT_COMPLETE_CWR: |
234 | tp->snd_cwnd = tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk); | 245 | tp->snd_cwnd = tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk); |
235 | break; | 246 | break; |
236 | |||
237 | case CA_EVENT_LOSS: | 247 | case CA_EVENT_LOSS: |
238 | tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk); | 248 | tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk); |
239 | /* Update RTT_min when next ack arrives */ | 249 | /* Update RTT_min when next ack arrives */ |
240 | w->reset_rtt_min = 1; | 250 | w->reset_rtt_min = 1; |
241 | break; | 251 | break; |
242 | |||
243 | case CA_EVENT_SLOW_ACK: | ||
244 | westwood_update_window(sk); | ||
245 | w->bk += westwood_acked_count(sk); | ||
246 | update_rtt_min(w); | ||
247 | break; | ||
248 | |||
249 | default: | 252 | default: |
250 | /* don't care */ | 253 | /* don't care */ |
251 | break; | 254 | break; |
@@ -274,6 +277,7 @@ static struct tcp_congestion_ops tcp_westwood __read_mostly = { | |||
274 | .ssthresh = tcp_reno_ssthresh, | 277 | .ssthresh = tcp_reno_ssthresh, |
275 | .cong_avoid = tcp_reno_cong_avoid, | 278 | .cong_avoid = tcp_reno_cong_avoid, |
276 | .cwnd_event = tcp_westwood_event, | 279 | .cwnd_event = tcp_westwood_event, |
280 | .in_ack_event = tcp_westwood_ack, | ||
277 | .get_info = tcp_westwood_info, | 281 | .get_info = tcp_westwood_info, |
278 | .pkts_acked = tcp_westwood_pkts_acked, | 282 | .pkts_acked = tcp_westwood_pkts_acked, |
279 | 283 | ||