diff options
Diffstat (limited to 'net/ipv4/tcp_cong.c')
| -rw-r--r-- | net/ipv4/tcp_cong.c | 42 | 
1 files changed, 10 insertions, 32 deletions
| diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 291f2ed7cc31..019c2389a341 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c @@ -310,35 +310,24 @@ void tcp_slow_start(struct tcp_sock *tp)  {  	int cnt; /* increase in packets */  	unsigned int delta = 0; +	u32 snd_cwnd = tp->snd_cwnd; -	/* RFC3465: ABC Slow start -	 * Increase only after a full MSS of bytes is acked -	 * -	 * TCP sender SHOULD increase cwnd by the number of -	 * previously unacknowledged bytes ACKed by each incoming -	 * acknowledgment, provided the increase is not more than L -	 */ -	if (sysctl_tcp_abc && tp->bytes_acked < tp->mss_cache) -		return; +	if (unlikely(!snd_cwnd)) { +		pr_err_once("snd_cwnd is nul, please report this bug.\n"); +		snd_cwnd = 1U; +	}  	if (sysctl_tcp_max_ssthresh > 0 && tp->snd_cwnd > sysctl_tcp_max_ssthresh)  		cnt = sysctl_tcp_max_ssthresh >> 1;	/* limited slow start */  	else -		cnt = tp->snd_cwnd;			/* exponential increase */ - -	/* RFC3465: ABC -	 * We MAY increase by 2 if discovered delayed ack -	 */ -	if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) -		cnt <<= 1; -	tp->bytes_acked = 0; +		cnt = snd_cwnd;				/* exponential increase */  	tp->snd_cwnd_cnt += cnt; -	while (tp->snd_cwnd_cnt >= tp->snd_cwnd) { -		tp->snd_cwnd_cnt -= tp->snd_cwnd; +	while (tp->snd_cwnd_cnt >= snd_cwnd) { +		tp->snd_cwnd_cnt -= snd_cwnd;  		delta++;  	} -	tp->snd_cwnd = min(tp->snd_cwnd + delta, tp->snd_cwnd_clamp); +	tp->snd_cwnd = min(snd_cwnd + delta, tp->snd_cwnd_clamp);  }  EXPORT_SYMBOL_GPL(tcp_slow_start); @@ -372,20 +361,9 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)  	/* In "safe" area, increase. */  	if (tp->snd_cwnd <= tp->snd_ssthresh)  		tcp_slow_start(tp); -  	/* In dangerous area, increase slowly. */ -	else if (sysctl_tcp_abc) { -		/* RFC3465: Appropriate Byte Count -		 * increase once for each full cwnd acked -		 */ -		if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) { -			tp->bytes_acked -= tp->snd_cwnd*tp->mss_cache; -			if (tp->snd_cwnd < tp->snd_cwnd_clamp) -				tp->snd_cwnd++; -		} -	} else { +	else  		tcp_cong_avoid_ai(tp, tp->snd_cwnd); -	}  }  EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); |