diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 23 | 
1 files changed, 15 insertions, 8 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index e886e2f7fa8..257b61789ee 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -85,7 +85,7 @@ int sysctl_tcp_ecn __read_mostly = 2;  EXPORT_SYMBOL(sysctl_tcp_ecn);  int sysctl_tcp_dsack __read_mostly = 1;  int sysctl_tcp_app_win __read_mostly = 31; -int sysctl_tcp_adv_win_scale __read_mostly = 2; +int sysctl_tcp_adv_win_scale __read_mostly = 1;  EXPORT_SYMBOL(sysctl_tcp_adv_win_scale);  int sysctl_tcp_stdurg __read_mostly; @@ -335,6 +335,7 @@ static void tcp_grow_window(struct sock *sk, const struct sk_buff *skb)  			incr = __tcp_grow_window(sk, skb);  		if (incr) { +			incr = max_t(int, incr, 2 * skb->len);  			tp->rcv_ssthresh = min(tp->rcv_ssthresh + incr,  					       tp->window_clamp);  			inet_csk(sk)->icsk_ack.quick |= 1; @@ -474,8 +475,11 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)  		if (!win_dep) {  			m -= (new_sample >> 3);  			new_sample += m; -		} else if (m < new_sample) -			new_sample = m << 3; +		} else { +			m <<= 3; +			if (m < new_sample) +				new_sample = m; +		}  	} else {  		/* No previous measure. */  		new_sample = m << 3; @@ -491,7 +495,7 @@ static inline void tcp_rcv_rtt_measure(struct tcp_sock *tp)  		goto new_measure;  	if (before(tp->rcv_nxt, tp->rcv_rtt_est.seq))  		return; -	tcp_rcv_rtt_update(tp, jiffies - tp->rcv_rtt_est.time, 1); +	tcp_rcv_rtt_update(tp, tcp_time_stamp - tp->rcv_rtt_est.time, 1);  new_measure:  	tp->rcv_rtt_est.seq = tp->rcv_nxt + tp->rcv_wnd; @@ -2864,11 +2868,14 @@ static inline void tcp_complete_cwr(struct sock *sk)  	/* Do not moderate cwnd if it's already undone in cwr or recovery. */  	if (tp->undo_marker) { -		if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) +		if (inet_csk(sk)->icsk_ca_state == TCP_CA_CWR) {  			tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); -		else /* PRR */ +			tp->snd_cwnd_stamp = tcp_time_stamp; +		} else if (tp->snd_ssthresh < TCP_INFINITE_SSTHRESH) { +			/* PRR algorithm. */  			tp->snd_cwnd = tp->snd_ssthresh; -		tp->snd_cwnd_stamp = tcp_time_stamp; +			tp->snd_cwnd_stamp = tcp_time_stamp; +		}  	}  	tcp_ca_event(sk, CA_EVENT_COMPLETE_CWR);  } @@ -5225,7 +5232,7 @@ static int tcp_dma_try_early_copy(struct sock *sk, struct sk_buff *skb,  		return 0;  	if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list) -		tp->ucopy.dma_chan = dma_find_channel(DMA_MEMCPY); +		tp->ucopy.dma_chan = net_dma_find_channel();  	if (tp->ucopy.dma_chan && skb_csum_unnecessary(skb)) {  |