mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	tcp: fix tcpi_segs_in after connection establishment
If final packet (ACK) of 3WHS is lost, it appears we do not properly
account the following incoming segment into tcpi_segs_in
While we are at it, starts segs_in with one, to count the SYN packet.
We do not yet count number of SYN we received for a request sock, we
might add this someday.
packetdrill script showing proper behavior after fix :
// Tests tcpi_segs_in when 3rd packet (ACK) of 3WHS is lost
0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
   +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
   +0 bind(3, ..., ...) = 0
   +0 listen(3, 1) = 0
   +0 < S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop>
   +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK>
+.020 < P. 1:1001(1000) ack 1 win 32792
   +0 accept(3, ..., ...) = 4
+.000 %{ assert tcpi_segs_in == 2, 'tcpi_segs_in=%d' % tcpi_segs_in }%
Fixes: 2efd055c53 ("tcp: add tcpi_segs_in and tcpi_segs_out to tcp_info")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									68c222a6bc
								
							
						
					
					
						commit
						a9d99ce28e
					
				
					 1 changed files with 2 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -455,7 +455,7 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,
 | 
			
		|||
 | 
			
		||||
		newtp->rcv_wup = newtp->copied_seq =
 | 
			
		||||
		newtp->rcv_nxt = treq->rcv_isn + 1;
 | 
			
		||||
		newtp->segs_in = 0;
 | 
			
		||||
		newtp->segs_in = 1;
 | 
			
		||||
 | 
			
		||||
		newtp->snd_sml = newtp->snd_una =
 | 
			
		||||
		newtp->snd_nxt = newtp->snd_up = treq->snt_isn + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -815,6 +815,7 @@ int tcp_child_process(struct sock *parent, struct sock *child,
 | 
			
		|||
	int ret = 0;
 | 
			
		||||
	int state = child->sk_state;
 | 
			
		||||
 | 
			
		||||
	tcp_sk(child)->segs_in += max_t(u16, 1, skb_shinfo(skb)->gso_segs);
 | 
			
		||||
	if (!sock_owned_by_user(child)) {
 | 
			
		||||
		ret = tcp_rcv_state_process(child, skb);
 | 
			
		||||
		/* Wakeup parent, send SIGIO */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue