|
@@ -220,32 +220,35 @@ static u32 tcp_westwood_bw_rttmin(const struct sock *sk)
|
|
return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2);
|
|
return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void tcp_westwood_ack(struct sock *sk, u32 ack_flags)
|
|
|
|
+{
|
|
|
|
+ if (ack_flags & CA_ACK_SLOWPATH) {
|
|
|
|
+ struct westwood *w = inet_csk_ca(sk);
|
|
|
|
+
|
|
|
|
+ westwood_update_window(sk);
|
|
|
|
+ w->bk += westwood_acked_count(sk);
|
|
|
|
+
|
|
|
|
+ update_rtt_min(w);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ westwood_fast_bw(sk);
|
|
|
|
+}
|
|
|
|
+
|
|
static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event)
|
|
static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event)
|
|
{
|
|
{
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
struct westwood *w = inet_csk_ca(sk);
|
|
struct westwood *w = inet_csk_ca(sk);
|
|
|
|
|
|
switch (event) {
|
|
switch (event) {
|
|
- case CA_EVENT_FAST_ACK:
|
|
|
|
- westwood_fast_bw(sk);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
case CA_EVENT_COMPLETE_CWR:
|
|
case CA_EVENT_COMPLETE_CWR:
|
|
tp->snd_cwnd = tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);
|
|
tp->snd_cwnd = tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
case CA_EVENT_LOSS:
|
|
case CA_EVENT_LOSS:
|
|
tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);
|
|
tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);
|
|
/* Update RTT_min when next ack arrives */
|
|
/* Update RTT_min when next ack arrives */
|
|
w->reset_rtt_min = 1;
|
|
w->reset_rtt_min = 1;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
- case CA_EVENT_SLOW_ACK:
|
|
|
|
- westwood_update_window(sk);
|
|
|
|
- w->bk += westwood_acked_count(sk);
|
|
|
|
- update_rtt_min(w);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
default:
|
|
default:
|
|
/* don't care */
|
|
/* don't care */
|
|
break;
|
|
break;
|
|
@@ -274,6 +277,7 @@ static struct tcp_congestion_ops tcp_westwood __read_mostly = {
|
|
.ssthresh = tcp_reno_ssthresh,
|
|
.ssthresh = tcp_reno_ssthresh,
|
|
.cong_avoid = tcp_reno_cong_avoid,
|
|
.cong_avoid = tcp_reno_cong_avoid,
|
|
.cwnd_event = tcp_westwood_event,
|
|
.cwnd_event = tcp_westwood_event,
|
|
|
|
+ .in_ack_event = tcp_westwood_ack,
|
|
.get_info = tcp_westwood_info,
|
|
.get_info = tcp_westwood_info,
|
|
.pkts_acked = tcp_westwood_pkts_acked,
|
|
.pkts_acked = tcp_westwood_pkts_acked,
|
|
|
|
|