Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d2c27e1 authored by Daniele Lacamera's avatar Daniele Lacamera Committed by David S. Miller
Browse files

tcp: Fix tcp_hybla zero congestion window growth with small rho and large cwnd.



Because of rounding, in certain conditions, i.e. when in congestion
avoidance state rho is smaller than 1/128 of the current cwnd, TCP
Hybla congestion control starves and the cwnd is kept constant
forever.

This patch forces an increment by one segment after #send_cwnd calls
without increments(newreno behavior).

Signed-off-by: default avatarDaniele Lacamera <root@danielinux.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 58ec3b4d
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -150,7 +150,11 @@ static void hybla_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
		ca->snd_cwnd_cents -= 128;
		ca->snd_cwnd_cents -= 128;
		tp->snd_cwnd_cnt = 0;
		tp->snd_cwnd_cnt = 0;
	}
	}

	/* check when cwnd has not been incremented for a while */
	if (increment == 0 && odd == 0 && tp->snd_cwnd_cnt >= tp->snd_cwnd) {
		tp->snd_cwnd++;
		tp->snd_cwnd_cnt = 0;
	}
	/* clamp down slowstart cwnd to ssthresh value. */
	/* clamp down slowstart cwnd to ssthresh value. */
	if (is_slowstart)
	if (is_slowstart)
		tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh);
		tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh);