|
@@ -304,16 +304,19 @@ u32 tcp_slow_start(struct tcp_sock *tp, u32 acked)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(tcp_slow_start);
|
|
|
|
|
|
-/* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w) */
|
|
|
+/* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w),
|
|
|
+ * for every packet that was ACKed.
|
|
|
+ */
|
|
|
void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked)
|
|
|
{
|
|
|
+ tp->snd_cwnd_cnt += acked;
|
|
|
if (tp->snd_cwnd_cnt >= w) {
|
|
|
- if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
|
|
- tp->snd_cwnd++;
|
|
|
- tp->snd_cwnd_cnt = 0;
|
|
|
- } else {
|
|
|
- tp->snd_cwnd_cnt += acked;
|
|
|
+ u32 delta = tp->snd_cwnd_cnt / w;
|
|
|
+
|
|
|
+ tp->snd_cwnd_cnt -= delta * w;
|
|
|
+ tp->snd_cwnd += delta;
|
|
|
}
|
|
|
+ tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_cwnd_clamp);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(tcp_cong_avoid_ai);
|
|
|
|