diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 9 | 
1 files changed, 7 insertions, 2 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 25a89eaa669d..a16b01b537ba 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -1284,7 +1284,10 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,  		tp->lost_cnt_hint -= tcp_skb_pcount(prev);  	} -	TCP_SKB_CB(skb)->tcp_flags |= TCP_SKB_CB(prev)->tcp_flags; +	TCP_SKB_CB(prev)->tcp_flags |= TCP_SKB_CB(skb)->tcp_flags; +	if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) +		TCP_SKB_CB(prev)->end_seq++; +  	if (skb == tcp_highest_sack(sk))  		tcp_advance_highest_sack(sk, skb); @@ -3288,7 +3291,7 @@ static void tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag)  			tcp_init_cwnd_reduction(sk, true);  			tcp_set_ca_state(sk, TCP_CA_CWR);  			tcp_end_cwnd_reduction(sk); -			tcp_set_ca_state(sk, TCP_CA_Open); +			tcp_try_keep_open(sk);  			NET_INC_STATS_BH(sock_net(sk),  					 LINUX_MIB_TCPLOSSPROBERECOVERY);  		} @@ -5709,6 +5712,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,  		} else  			tcp_init_metrics(sk); +		tcp_update_pacing_rate(sk); +  		/* Prevent spurious tcp_cwnd_restart() on first data packet */  		tp->lsndtime = tcp_time_stamp; |