|
@@ -151,6 +151,21 @@ static void bictcp_init(struct sock *sk)
|
|
|
tcp_sk(sk)->snd_ssthresh = initial_ssthresh;
|
|
|
}
|
|
|
|
|
|
+static void bictcp_cwnd_event(struct sock *sk, enum tcp_ca_event event)
|
|
|
+{
|
|
|
+ if (event == CA_EVENT_TX_START) {
|
|
|
+ s32 delta = tcp_time_stamp - tcp_sk(sk)->lsndtime;
|
|
|
+ struct bictcp *ca = inet_csk_ca(sk);
|
|
|
+
|
|
|
+ /* We were application limited (idle) for a while.
|
|
|
+ * Shift epoch_start to keep cwnd growth to cubic curve.
|
|
|
+ */
|
|
|
+ if (ca->epoch_start && delta > 0)
|
|
|
+ ca->epoch_start += delta;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* calculate the cubic root of x using a table lookup followed by one
|
|
|
* Newton-Raphson iteration.
|
|
|
* Avg err ~= 0.195%
|
|
@@ -450,6 +465,7 @@ static struct tcp_congestion_ops cubictcp __read_mostly = {
|
|
|
.cong_avoid = bictcp_cong_avoid,
|
|
|
.set_state = bictcp_state,
|
|
|
.undo_cwnd = bictcp_undo_cwnd,
|
|
|
+ .cwnd_event = bictcp_cwnd_event,
|
|
|
.pkts_acked = bictcp_acked,
|
|
|
.owner = THIS_MODULE,
|
|
|
.name = "cubic",
|