Commit a764e811 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'tcp-fastopen-observability'

Jeremy Harris says:

====================
tcp: fastopen: observability

Whether TCP Fast Open was used for a connection is not reliably
observable by an accepting application when the SYN passed no data.

Fix this by noting during SYN receive processing that an acceptable Fast
Open option was used, and provide this to userland via getsockopt TCP_INFO.
====================

Link: https://patch.msgid.link/20250423124334.4916-1-jgh@exim.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 4134bb72 2b13042d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -385,7 +385,8 @@ struct tcp_sock {
		syn_fastopen:1,	/* SYN includes Fast Open option */
		syn_fastopen_exp:1,/* SYN includes Fast Open exp. option */
		syn_fastopen_ch:1, /* Active TFO re-enabling probe */
		syn_data_acked:1;/* data in SYN is acked by SYN-ACK */
		syn_data_acked:1,/* data in SYN is acked by SYN-ACK */
		syn_fastopen_child:1; /* created TFO passive child socket */

	u8	keepalive_probes; /* num of allowed keep alive probes	*/
	u32	tcp_tx_delay;	/* delay (in usec) added to TX packets */
+1 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ enum tcp_fastopen_client_fail {
#define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
#define TCPI_OPT_SYN_DATA	32 /* SYN-ACK acked data in SYN sent or rcvd */
#define TCPI_OPT_USEC_TS	64 /* usec timestamps */
#define TCPI_OPT_TFO_CHILD	128 /* child from a Fast Open option on SYN */

/*
 * Sender's congestion state indicating normal or abnormal situations
+3 −0
Original line number Diff line number Diff line
@@ -3409,6 +3409,7 @@ int tcp_disconnect(struct sock *sk, int flags)
	tp->rack.reo_wnd_persist = 0;
	tp->rack.dsack_seen = 0;
	tp->syn_data_acked = 0;
	tp->syn_fastopen_child = 0;
	tp->rx_opt.saw_tstamp = 0;
	tp->rx_opt.dsack = 0;
	tp->rx_opt.num_sacks = 0;
@@ -4164,6 +4165,8 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
		info->tcpi_options |= TCPI_OPT_SYN_DATA;
	if (tp->tcp_usec_ts)
		info->tcpi_options |= TCPI_OPT_USEC_TS;
	if (tp->syn_fastopen_child)
		info->tcpi_options |= TCPI_OPT_TFO_CHILD;

	info->tcpi_rto = jiffies_to_usecs(icsk->icsk_rto);
	info->tcpi_ato = jiffies_to_usecs(min_t(u32, icsk->icsk_ack.ato,
+1 −0
Original line number Diff line number Diff line
@@ -401,6 +401,7 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
				}
				NET_INC_STATS(sock_net(sk),
					      LINUX_MIB_TCPFASTOPENPASSIVE);
				tcp_sk(child)->syn_fastopen_child = 1;
				return child;
			}
			NET_INC_STATS(sock_net(sk),