forked from mirrors/linux
		
	tcp: timestamp SYN+DATA messages
All skb in socket write queue should be properly timestamped.
In case of FastOpen, we special case the SYN+DATA 'message' as we
queue in socket wrote queue the two fallback skbs:
1) SYN message by itself.
2) DATA segment by itself.
We should make sure these skbs have proper timestamps.
Add a WARN_ON_ONCE() to eventually catch future violations.
Fixes: 740b0f1841 ("tcp: switch rtt estimations to usec resolution")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Acked-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									99d3016de4
								
							
						
					
					
						commit
						431a91242d
					
				
					 2 changed files with 7 additions and 0 deletions
				
			
		| 
						 | 
					@ -3067,6 +3067,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
 | 
				
			||||||
			flag |= FLAG_RETRANS_DATA_ACKED;
 | 
								flag |= FLAG_RETRANS_DATA_ACKED;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			last_ackt = skb->skb_mstamp;
 | 
								last_ackt = skb->skb_mstamp;
 | 
				
			||||||
 | 
								WARN_ON_ONCE(last_ackt.v64 == 0);
 | 
				
			||||||
			if (!first_ackt.v64)
 | 
								if (!first_ackt.v64)
 | 
				
			||||||
				first_ackt = last_ackt;
 | 
									first_ackt = last_ackt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2972,6 +2972,12 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
 | 
				
			||||||
	tcp_connect_queue_skb(sk, data);
 | 
						tcp_connect_queue_skb(sk, data);
 | 
				
			||||||
	fo->copied = data->len;
 | 
						fo->copied = data->len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* syn_data is about to be sent, we need to take current time stamps
 | 
				
			||||||
 | 
						 * for the packets that are in write queue : SYN packet and DATA
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						skb_mstamp_get(&syn->skb_mstamp);
 | 
				
			||||||
 | 
						data->skb_mstamp = syn->skb_mstamp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (tcp_transmit_skb(sk, syn_data, 0, sk->sk_allocation) == 0) {
 | 
						if (tcp_transmit_skb(sk, syn_data, 0, sk->sk_allocation) == 0) {
 | 
				
			||||||
		tp->syn_data = (fo->copied > 0);
 | 
							tp->syn_data = (fo->copied > 0);
 | 
				
			||||||
		NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT);
 | 
							NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue