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

Commit 738980ff authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller
Browse files

[TCP]: Limited slow start for Highspeed TCP



Implementation of RFC3742 limited slow start. Added as part
of the TCP highspeed congestion control module.

Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a42e9d6c
Loading
Loading
Loading
Loading
+21 −3
Original line number Original line Diff line number Diff line
@@ -98,6 +98,10 @@ struct hstcp {
	u32	ai;
	u32	ai;
};
};


static int max_ssthresh = 100;
module_param(max_ssthresh, int, 0644);
MODULE_PARM_DESC(max_ssthresh, "limited slow start threshold (RFC3742)");

static void hstcp_init(struct sock *sk)
static void hstcp_init(struct sock *sk)
{
{
	struct tcp_sock *tp = tcp_sk(sk);
	struct tcp_sock *tp = tcp_sk(sk);
@@ -119,9 +123,23 @@ static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt,
	if (!tcp_is_cwnd_limited(sk, in_flight))
	if (!tcp_is_cwnd_limited(sk, in_flight))
		return;
		return;


	if (tp->snd_cwnd <= tp->snd_ssthresh)
	if (tp->snd_cwnd <= tp->snd_ssthresh) {
		tcp_slow_start(tp);
		/* RFC3742: limited slow start
	else {
		 * the window is increased by 1/K MSS for each arriving ACK,
		 * for K = int(cwnd/(0.5 max_ssthresh))
		 */
		if (max_ssthresh > 0 && tp->snd_cwnd > max_ssthresh) {
			u32 k = max(tp->snd_cwnd / (max_ssthresh >> 1), 1U);
			if (++tp->snd_cwnd_cnt >= k) {
				if (tp->snd_cwnd < tp->snd_cwnd_clamp)
					tp->snd_cwnd++;
				tp->snd_cwnd_cnt = 0;
			}
		} else {
			if (tp->snd_cwnd < tp->snd_cwnd_clamp)
				tp->snd_cwnd++;
		}
	} else {
		/* Update AIMD parameters */
		/* Update AIMD parameters */
		if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
		if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
			while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
			while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&