From 9cb1eccf6910209673a7e9fc135708420db683d4 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Fri, 3 May 2013 20:48:00 -0700 Subject: [PATCH] ss: add fastopen support ss -i can output "fastopen" attribute if socket used Fast Open Signed-off-by: Eric Dumazet Signed-off-by: Stephen Hemminger --- include/linux/tcp.h | 201 ++++++++++++++++++++++++++++++++++++++++++++ misc/ss.c | 48 ++++++----- 2 files changed, 226 insertions(+), 23 deletions(-) create mode 100644 include/linux/tcp.h diff --git a/include/linux/tcp.h b/include/linux/tcp.h new file mode 100644 index 00000000..1eb04d35 --- /dev/null +++ b/include/linux/tcp.h @@ -0,0 +1,201 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions for the TCP protocol. + * + * Version: @(#)tcp.h 1.0.2 04/28/93 + * + * Author: Fred N. van Kempen, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#ifndef _LINUX_TCP_H +#define _LINUX_TCP_H + +#include +#include +#include + +struct tcphdr { + __be16 source; + __be16 dest; + __be32 seq; + __be32 ack_seq; +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u16 res1:4, + doff:4, + fin:1, + syn:1, + rst:1, + psh:1, + ack:1, + urg:1, + ece:1, + cwr:1; +#elif defined(__BIG_ENDIAN_BITFIELD) + __u16 doff:4, + res1:4, + cwr:1, + ece:1, + urg:1, + ack:1, + psh:1, + rst:1, + syn:1, + fin:1; +#else +#error "Adjust your defines" +#endif + __be16 window; + __sum16 check; + __be16 urg_ptr; +}; + +/* + * The union cast uses a gcc extension to avoid aliasing problems + * (union is compatible to any of its members) + * This means this part of the code is -fstrict-aliasing safe now. + */ +union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +}; + +#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) + +enum { + TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000), + TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000), + TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000), + TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000), + TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000), + TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000), + TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000), + TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000), + TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000), + TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000) +}; + +/* + * TCP general constants + */ +#define TCP_MSS_DEFAULT 536U /* IPv4 (RFC1122, RFC2581) */ +#define TCP_MSS_DESIRED 1220U /* IPv6 (tunneled), EDNS0 (RFC3226) */ + +/* TCP socket options */ +#define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */ +#define TCP_MAXSEG 2 /* Limit MSS */ +#define TCP_CORK 3 /* Never send partially complete segments */ +#define TCP_KEEPIDLE 4 /* Start keeplives after this period */ +#define TCP_KEEPINTVL 5 /* Interval between keepalives */ +#define TCP_KEEPCNT 6 /* Number of keepalives before death */ +#define TCP_SYNCNT 7 /* Number of SYN retransmits */ +#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */ +#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */ +#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */ +#define TCP_INFO 11 /* Information about this connection. */ +#define TCP_QUICKACK 12 /* Block/reenable quick acks */ +#define TCP_CONGESTION 13 /* Congestion control algorithm */ +#define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ +#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ +#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ +#define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ +#define TCP_REPAIR 19 /* TCP sock is under repair right now */ +#define TCP_REPAIR_QUEUE 20 +#define TCP_QUEUE_SEQ 21 +#define TCP_REPAIR_OPTIONS 22 +#define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */ +#define TCP_TIMESTAMP 24 + +struct tcp_repair_opt { + __u32 opt_code; + __u32 opt_val; +}; + +enum { + TCP_NO_QUEUE, + TCP_RECV_QUEUE, + TCP_SEND_QUEUE, + TCP_QUEUES_NR, +}; + +/* for TCP_INFO socket option */ +#define TCPI_OPT_TIMESTAMPS 1 +#define TCPI_OPT_SACK 2 +#define TCPI_OPT_WSCALE 4 +#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_SYN_DATA 32 /* SYN-ACK acked data in SYN sent or rcvd */ + +enum tcp_ca_state { + TCP_CA_Open = 0, +#define TCPF_CA_Open (1< +#include #include #include #include @@ -399,32 +399,32 @@ static int get_slabstat(struct slabstat *s) static const char *sstate_name[] = { "UNKNOWN", - [TCP_ESTABLISHED] = "ESTAB", - [TCP_SYN_SENT] = "SYN-SENT", - [TCP_SYN_RECV] = "SYN-RECV", - [TCP_FIN_WAIT1] = "FIN-WAIT-1", - [TCP_FIN_WAIT2] = "FIN-WAIT-2", - [TCP_TIME_WAIT] = "TIME-WAIT", - [TCP_CLOSE] = "UNCONN", - [TCP_CLOSE_WAIT] = "CLOSE-WAIT", - [TCP_LAST_ACK] = "LAST-ACK", - [TCP_LISTEN] = "LISTEN", - [TCP_CLOSING] = "CLOSING", + [SS_ESTABLISHED] = "ESTAB", + [SS_SYN_SENT] = "SYN-SENT", + [SS_SYN_RECV] = "SYN-RECV", + [SS_FIN_WAIT1] = "FIN-WAIT-1", + [SS_FIN_WAIT2] = "FIN-WAIT-2", + [SS_TIME_WAIT] = "TIME-WAIT", + [SS_CLOSE] = "UNCONN", + [SS_CLOSE_WAIT] = "CLOSE-WAIT", + [SS_LAST_ACK] = "LAST-ACK", + [SS_LISTEN] = "LISTEN", + [SS_CLOSING] = "CLOSING", }; static const char *sstate_namel[] = { "UNKNOWN", - [TCP_ESTABLISHED] = "established", - [TCP_SYN_SENT] = "syn-sent", - [TCP_SYN_RECV] = "syn-recv", - [TCP_FIN_WAIT1] = "fin-wait-1", - [TCP_FIN_WAIT2] = "fin-wait-2", - [TCP_TIME_WAIT] = "time-wait", - [TCP_CLOSE] = "unconnected", - [TCP_CLOSE_WAIT] = "close-wait", - [TCP_LAST_ACK] = "last-ack", - [TCP_LISTEN] = "listening", - [TCP_CLOSING] = "closing", + [SS_ESTABLISHED] = "established", + [SS_SYN_SENT] = "syn-sent", + [SS_SYN_RECV] = "syn-recv", + [SS_FIN_WAIT1] = "fin-wait-1", + [SS_FIN_WAIT2] = "fin-wait-2", + [SS_TIME_WAIT] = "time-wait", + [SS_CLOSE] = "unconnected", + [SS_CLOSE_WAIT] = "close-wait", + [SS_LAST_ACK] = "last-ack", + [SS_LISTEN] = "listening", + [SS_CLOSING] = "closing", }; struct tcpstat @@ -1392,6 +1392,8 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r) printf(" ecn"); if (info->tcpi_options & TCPI_OPT_ECN_SEEN) printf(" ecnseen"); + if (info->tcpi_options & TCPI_OPT_SYN_DATA) + printf(" fastopen"); } if (tb[INET_DIAG_CONG]) -- 2.39.5