Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f73601e authored by Yuchung Cheng's avatar Yuchung Cheng Committed by David S. Miller
Browse files

tcp: add SYN/data info to TCP_INFO



Add a bit TCPI_OPT_SYN_DATA (32) to the socket option TCP_INFO:tcpi_options.
It's set if the data in SYN (sent or received) is acked by SYN-ACK. Server or
client application can use this information to check Fast Open success rate.

Signed-off-by: default avatarYuchung Cheng <ycheng@google.com>
Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e6e71054
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -191,7 +191,8 @@ struct tcp_sock {
	u8	do_early_retrans:1,/* Enable RFC5827 early-retransmit  */
	u8	do_early_retrans:1,/* Enable RFC5827 early-retransmit  */
		early_retrans_delayed:1, /* Delayed ER timer installed */
		early_retrans_delayed:1, /* Delayed ER timer installed */
		syn_data:1,	/* SYN includes data */
		syn_data:1,	/* SYN includes data */
		syn_fastopen:1;	/* SYN includes Fast Open option */
		syn_fastopen:1,	/* SYN includes Fast Open option */
		syn_data_acked:1;/* data in SYN is acked by SYN-ACK */


/* RTT measurement */
/* RTT measurement */
	u32	srtt;		/* smoothed round trip time << 3	*/
	u32	srtt;		/* smoothed round trip time << 3	*/
+1 −0
Original line number Original line Diff line number Diff line
@@ -130,6 +130,7 @@ enum {
#define TCPI_OPT_WSCALE		4
#define TCPI_OPT_WSCALE		4
#define TCPI_OPT_ECN		8 /* ECN was negociated at TCP session init */
#define TCPI_OPT_ECN		8 /* ECN was negociated at TCP session init */
#define TCPI_OPT_ECN_SEEN	16 /* we received at least one packet with ECT */
#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 */


enum tcp_ca_state {
enum tcp_ca_state {
	TCP_CA_Open = 0,
	TCP_CA_Open = 0,
+2 −0
Original line number Original line Diff line number Diff line
@@ -2764,6 +2764,8 @@ void tcp_get_info(const struct sock *sk, struct tcp_info *info)
		info->tcpi_options |= TCPI_OPT_ECN;
		info->tcpi_options |= TCPI_OPT_ECN;
	if (tp->ecn_flags & TCP_ECN_SEEN)
	if (tp->ecn_flags & TCP_ECN_SEEN)
		info->tcpi_options |= TCPI_OPT_ECN_SEEN;
		info->tcpi_options |= TCPI_OPT_ECN_SEEN;
	if (tp->syn_data_acked)
		info->tcpi_options |= TCPI_OPT_SYN_DATA;


	info->tcpi_rto = jiffies_to_usecs(icsk->icsk_rto);
	info->tcpi_rto = jiffies_to_usecs(icsk->icsk_rto);
	info->tcpi_ato = jiffies_to_usecs(icsk->icsk_ack.ato);
	info->tcpi_ato = jiffies_to_usecs(icsk->icsk_ack.ato);
+1 −0
Original line number Original line Diff line number Diff line
@@ -5646,6 +5646,7 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
		tcp_rearm_rto(sk);
		tcp_rearm_rto(sk);
		return true;
		return true;
	}
	}
	tp->syn_data_acked = tp->syn_data;
	return false;
	return false;
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -1461,6 +1461,7 @@ static int tcp_v4_conn_req_fastopen(struct sock *sk,
		skb_set_owner_r(skb, child);
		skb_set_owner_r(skb, child);
		__skb_queue_tail(&child->sk_receive_queue, skb);
		__skb_queue_tail(&child->sk_receive_queue, skb);
		tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq;
		tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq;
		tp->syn_data_acked = 1;
	}
	}
	sk->sk_data_ready(sk, 0);
	sk->sk_data_ready(sk, 0);
	bh_unlock_sock(child);
	bh_unlock_sock(child);
Loading