[TCP]: Add RFC3742 Limited Slow-Start, controlled by variable sysctl_tcp_max_ssthresh.
Signed-off-by: John Heffner <jheffner@psc.edu> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									5ef814753e
								
							
						
					
					
						commit
						886236c124
					
				| @ -438,6 +438,7 @@ enum | ||||
| 	NET_CIPSOV4_RBM_STRICTVALID=121, | ||||
| 	NET_TCP_AVAIL_CONG_CONTROL=122, | ||||
| 	NET_TCP_ALLOWED_CONG_CONTROL=123, | ||||
| 	NET_TCP_MAX_SSTHRESH=124, | ||||
| }; | ||||
| 
 | ||||
| enum { | ||||
|  | ||||
| @ -230,6 +230,7 @@ extern int sysctl_tcp_mtu_probing; | ||||
| extern int sysctl_tcp_base_mss; | ||||
| extern int sysctl_tcp_workaround_signed_windows; | ||||
| extern int sysctl_tcp_slow_start_after_idle; | ||||
| extern int sysctl_tcp_max_ssthresh; | ||||
| 
 | ||||
| extern atomic_t tcp_memory_allocated; | ||||
| extern atomic_t tcp_sockets_allocated; | ||||
|  | ||||
| @ -803,6 +803,14 @@ ctl_table ipv4_table[] = { | ||||
| 		.proc_handler   = &proc_allowed_congestion_control, | ||||
| 		.strategy	= &strategy_allowed_congestion_control, | ||||
| 	}, | ||||
| 	{ | ||||
| 		.ctl_name	= NET_TCP_MAX_SSTHRESH, | ||||
| 		.procname	= "tcp_max_ssthresh", | ||||
| 		.data		= &sysctl_tcp_max_ssthresh, | ||||
| 		.maxlen		= sizeof(int), | ||||
| 		.mode		= 0644, | ||||
| 		.proc_handler	= &proc_dointvec, | ||||
| 	}, | ||||
| 	{ .ctl_name = 0 } | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -12,6 +12,8 @@ | ||||
| #include <linux/list.h> | ||||
| #include <net/tcp.h> | ||||
| 
 | ||||
| int sysctl_tcp_max_ssthresh = 0; | ||||
| 
 | ||||
| static DEFINE_SPINLOCK(tcp_cong_list_lock); | ||||
| static LIST_HEAD(tcp_cong_list); | ||||
| 
 | ||||
| @ -274,10 +276,13 @@ int tcp_set_congestion_control(struct sock *sk, const char *name) | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Linear increase during slow start | ||||
|  * Slow start (exponential increase) with | ||||
|  * RFC3742 Limited Slow Start (fast linear increase) support. | ||||
|  */ | ||||
| void tcp_slow_start(struct tcp_sock *tp) | ||||
| { | ||||
| 	int cnt = 0; | ||||
| 
 | ||||
| 	if (sysctl_tcp_abc) { | ||||
| 		/* RFC3465: Slow Start
 | ||||
| 		 * TCP sender SHOULD increase cwnd by the number of | ||||
| @ -286,17 +291,25 @@ void tcp_slow_start(struct tcp_sock *tp) | ||||
| 		 */ | ||||
| 		if (tp->bytes_acked < tp->mss_cache) | ||||
| 			return; | ||||
| 
 | ||||
| 		/* We MAY increase by 2 if discovered delayed ack */ | ||||
| 		if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) { | ||||
| 			if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||||
| 				tp->snd_cwnd++; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (sysctl_tcp_max_ssthresh > 0 && | ||||
| 	    tp->snd_cwnd > sysctl_tcp_max_ssthresh) | ||||
| 		cnt += sysctl_tcp_max_ssthresh>>1; | ||||
| 	else | ||||
| 		cnt += tp->snd_cwnd; | ||||
| 
 | ||||
| 	/* RFC3465: 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; | ||||
| 
 | ||||
| 	if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||||
| 		tp->snd_cwnd++; | ||||
| 	tp->snd_cwnd_cnt += cnt; | ||||
| 	while (tp->snd_cwnd_cnt >= tp->snd_cwnd) { | ||||
| 		tp->snd_cwnd_cnt -= tp->snd_cwnd; | ||||
| 		if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||||
| 			tp->snd_cwnd++; | ||||
| 	} | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(tcp_slow_start); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user