Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tcp: snmp stats for Fast Open, SYN rtx, and data pkts

Add the following snmp stats:

TCPFastOpenActiveFail: Fast Open attempts (SYN/data) failed beacuse
the remote does not accept it or the attempts timed out.

TCPSynRetrans: number of SYN and SYN/ACK retransmits to break down
retransmissions into SYN, fast-retransmits, timeout retransmits, etc.

TCPOrigDataSent: number of outgoing packets with original data (excluding
retransmission but including data-in-SYN). This counter is different from
TcpOutSegs because TcpOutSegs also tracks pure ACKs. TCPOrigDataSent is
more useful to track the TCP retransmission rate.

Change TCPFastOpenActive to track only successful Fast Opens to be symmetric to
TCPFastOpenPassive.

Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Nandita Dukkipati <nanditad@google.com>
Signed-off-by: Lawrence Brakmo <brakmo@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Yuchung Cheng and committed by
David S. Miller
f19c29e3 a135e598

+24 -4
+3
include/uapi/linux/snmp.h
··· 252 252 LINUX_MIB_TCPCHALLENGEACK, /* TCPChallengeACK */ 253 253 LINUX_MIB_TCPSYNCHALLENGE, /* TCPSYNChallenge */ 254 254 LINUX_MIB_TCPFASTOPENACTIVE, /* TCPFastOpenActive */ 255 + LINUX_MIB_TCPFASTOPENACTIVEFAIL, /* TCPFastOpenActiveFail */ 255 256 LINUX_MIB_TCPFASTOPENPASSIVE, /* TCPFastOpenPassive*/ 256 257 LINUX_MIB_TCPFASTOPENPASSIVEFAIL, /* TCPFastOpenPassiveFail */ 257 258 LINUX_MIB_TCPFASTOPENLISTENOVERFLOW, /* TCPFastOpenListenOverflow */ ··· 263 262 LINUX_MIB_TCPFROMZEROWINDOWADV, /* TCPFromZeroWindowAdv */ 264 263 LINUX_MIB_TCPTOZEROWINDOWADV, /* TCPToZeroWindowAdv */ 265 264 LINUX_MIB_TCPWANTZEROWINDOWADV, /* TCPWantZeroWindowAdv */ 265 + LINUX_MIB_TCPSYNRETRANS, /* TCPSynRetrans */ 266 + LINUX_MIB_TCPORIGDATASENT, /* TCPOrigDataSent */ 266 267 __LINUX_MIB_MAX 267 268 }; 268 269
+3
net/ipv4/proc.c
··· 273 273 SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK), 274 274 SNMP_MIB_ITEM("TCPSYNChallenge", LINUX_MIB_TCPSYNCHALLENGE), 275 275 SNMP_MIB_ITEM("TCPFastOpenActive", LINUX_MIB_TCPFASTOPENACTIVE), 276 + SNMP_MIB_ITEM("TCPFastOpenActiveFail", LINUX_MIB_TCPFASTOPENACTIVEFAIL), 276 277 SNMP_MIB_ITEM("TCPFastOpenPassive", LINUX_MIB_TCPFASTOPENPASSIVE), 277 278 SNMP_MIB_ITEM("TCPFastOpenPassiveFail", LINUX_MIB_TCPFASTOPENPASSIVEFAIL), 278 279 SNMP_MIB_ITEM("TCPFastOpenListenOverflow", LINUX_MIB_TCPFASTOPENLISTENOVERFLOW), ··· 284 283 SNMP_MIB_ITEM("TCPFromZeroWindowAdv", LINUX_MIB_TCPFROMZEROWINDOWADV), 285 284 SNMP_MIB_ITEM("TCPToZeroWindowAdv", LINUX_MIB_TCPTOZEROWINDOWADV), 286 285 SNMP_MIB_ITEM("TCPWantZeroWindowAdv", LINUX_MIB_TCPWANTZEROWINDOWADV), 286 + SNMP_MIB_ITEM("TCPSynRetrans", LINUX_MIB_TCPSYNRETRANS), 287 + SNMP_MIB_ITEM("TCPOrigDataSent", LINUX_MIB_TCPORIGDATASENT), 287 288 SNMP_MIB_SENTINEL 288 289 }; 289 290
+3
net/ipv4/tcp_input.c
··· 5393 5393 break; 5394 5394 } 5395 5395 tcp_rearm_rto(sk); 5396 + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPFASTOPENACTIVEFAIL); 5396 5397 return true; 5397 5398 } 5398 5399 tp->syn_data_acked = tp->syn_data; 5400 + if (tp->syn_data_acked) 5401 + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPFASTOPENACTIVE); 5399 5402 return false; 5400 5403 } 5401 5404
+3 -1
net/ipv4/tcp_ipv4.c
··· 854 854 { 855 855 int res = tcp_v4_send_synack(sk, NULL, req, 0); 856 856 857 - if (!res) 857 + if (!res) { 858 858 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); 859 + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS); 860 + } 859 861 return res; 860 862 } 861 863
+6 -2
net/ipv4/tcp_output.c
··· 86 86 icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) { 87 87 tcp_rearm_rto(sk); 88 88 } 89 + 90 + NET_ADD_STATS_BH(sock_net(sk), LINUX_MIB_TCPORIGDATASENT, 91 + tcp_skb_pcount(skb)); 89 92 } 90 93 91 94 /* SND.NXT, if window was not shrunk. ··· 2436 2433 if (err == 0) { 2437 2434 /* Update global TCP statistics. */ 2438 2435 TCP_INC_STATS(sock_net(sk), TCP_MIB_RETRANSSEGS); 2439 - 2436 + if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN) 2437 + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS); 2440 2438 tp->total_retrans++; 2441 2439 2442 2440 #if FASTRETRANS_DEBUG > 0 ··· 2962 2958 2963 2959 if (tcp_transmit_skb(sk, syn_data, 0, sk->sk_allocation) == 0) { 2964 2960 tp->syn_data = (fo->copied > 0); 2965 - NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPFASTOPENACTIVE); 2961 + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT); 2966 2962 goto done; 2967 2963 } 2968 2964 syn_data = NULL;
+3
net/ipv4/tcp_timer.c
··· 165 165 dst_negative_advice(sk); 166 166 if (tp->syn_fastopen || tp->syn_data) 167 167 tcp_fastopen_cache_set(sk, 0, NULL, true); 168 + if (tp->syn_data) 169 + NET_INC_STATS_BH(sock_net(sk), 170 + LINUX_MIB_TCPFASTOPENACTIVEFAIL); 168 171 } 169 172 retry_until = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries; 170 173 syn_set = true;
+3 -1
net/ipv6/tcp_ipv6.c
··· 501 501 int res; 502 502 503 503 res = tcp_v6_send_synack(sk, NULL, &fl6, req, 0); 504 - if (!res) 504 + if (!res) { 505 505 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); 506 + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS); 507 + } 506 508 return res; 507 509 } 508 510