Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tcp.h
Go to the documentation of this file.
1 /*
2  * INET An implementation of the TCP/IP protocol suite for the LINUX
3  * operating system. INET is implemented using the BSD Socket
4  * interface as the means of communication with the user level.
5  *
6  * Definitions for the TCP protocol.
7  *
8  * Version: @(#)tcp.h 1.0.2 04/28/93
9  *
10  * Author: Fred N. van Kempen, <[email protected]>
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version
15  * 2 of the License, or (at your option) any later version.
16  */
17 #ifndef _UAPI_LINUX_TCP_H
18 #define _UAPI_LINUX_TCP_H
19 
20 #include <linux/types.h>
21 #include <asm/byteorder.h>
22 #include <linux/socket.h>
23 
24 struct tcphdr {
29 #if defined(__LITTLE_ENDIAN_BITFIELD)
30  __u16 res1:4,
31  doff:4,
32  fin:1,
33  syn:1,
34  rst:1,
35  psh:1,
36  ack:1,
37  urg:1,
38  ece:1,
39  cwr:1;
40 #elif defined(__BIG_ENDIAN_BITFIELD)
41  __u16 doff:4,
42  res1:4,
43  cwr:1,
44  ece:1,
45  urg:1,
46  ack:1,
47  psh:1,
48  rst:1,
49  syn:1,
50  fin:1;
51 #else
52 #error "Adjust your <asm/byteorder.h> defines"
53 #endif
57 };
58 
59 /*
60  * The union cast uses a gcc extension to avoid aliasing problems
61  * (union is compatible to any of its members)
62  * This means this part of the code is -fstrict-aliasing safe now.
63  */
64 union tcp_word_hdr {
65  struct tcphdr hdr;
67 };
68 
69 #define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])
70 
71 enum {
82 };
83 
84 /*
85  * TCP general constants
86  */
87 #define TCP_MSS_DEFAULT 536U /* IPv4 (RFC1122, RFC2581) */
88 #define TCP_MSS_DESIRED 1220U /* IPv6 (tunneled), EDNS0 (RFC3226) */
89 
90 /* TCP socket options */
91 #define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */
92 #define TCP_MAXSEG 2 /* Limit MSS */
93 #define TCP_CORK 3 /* Never send partially complete segments */
94 #define TCP_KEEPIDLE 4 /* Start keeplives after this period */
95 #define TCP_KEEPINTVL 5 /* Interval between keepalives */
96 #define TCP_KEEPCNT 6 /* Number of keepalives before death */
97 #define TCP_SYNCNT 7 /* Number of SYN retransmits */
98 #define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */
99 #define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */
100 #define TCP_WINDOW_CLAMP 10 /* Bound advertised window */
101 #define TCP_INFO 11 /* Information about this connection. */
102 #define TCP_QUICKACK 12 /* Block/reenable quick acks */
103 #define TCP_CONGESTION 13 /* Congestion control algorithm */
104 #define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */
105 #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */
106 #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/
107 #define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */
108 #define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */
109 #define TCP_REPAIR 19 /* TCP sock is under repair right now */
110 #define TCP_REPAIR_QUEUE 20
111 #define TCP_QUEUE_SEQ 21
112 #define TCP_REPAIR_OPTIONS 22
113 #define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */
114 
118 };
119 
120 enum {
125 };
126 
127 /* for TCP_INFO socket option */
128 #define TCPI_OPT_TIMESTAMPS 1
129 #define TCPI_OPT_SACK 2
130 #define TCPI_OPT_WSCALE 4
131 #define TCPI_OPT_ECN 8 /* ECN was negociated at TCP session init */
132 #define TCPI_OPT_ECN_SEEN 16 /* we received at least one packet with ECT */
133 #define TCPI_OPT_SYN_DATA 32 /* SYN-ACK acked data in SYN sent or rcvd */
134 
137 #define TCPF_CA_Open (1<<TCP_CA_Open)
139 #define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
141 #define TCPF_CA_CWR (1<<TCP_CA_CWR)
143 #define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
145 #define TCPF_CA_Loss (1<<TCP_CA_Loss)
146 };
147 
148 struct tcp_info {
156 
161 
167 
168  /* Times. */
170  __u32 tcpi_last_ack_sent; /* Not remembered, sorry. */
173 
174  /* Metrics. */
183 
186 
188 };
189 
190 /* for TCP_MD5SIG socket option */
191 #define TCP_MD5SIG_MAXKEYLEN 80
192 
193 struct tcp_md5sig {
194  struct __kernel_sockaddr_storage tcpm_addr; /* address associated */
195  __u16 __tcpm_pad1; /* zero */
196  __u16 tcpm_keylen; /* key length */
197  __u32 __tcpm_pad2; /* zero */
198  __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* key (binary) */
199 };
200 
201 /* for TCP_COOKIE_TRANSACTIONS (TCPCT) socket option */
202 #define TCP_COOKIE_MIN 8 /* 64-bits */
203 #define TCP_COOKIE_MAX 16 /* 128-bits */
204 #define TCP_COOKIE_PAIR_SIZE (2*TCP_COOKIE_MAX)
205 
206 /* Flags for both getsockopt and setsockopt */
207 #define TCP_COOKIE_IN_ALWAYS (1 << 0) /* Discard SYN without cookie */
208 #define TCP_COOKIE_OUT_NEVER (1 << 1) /* Prohibit outgoing cookies,
209  * supercedes everything. */
210 
211 /* Flags for getsockopt */
212 #define TCP_S_DATA_IN (1 << 2) /* Was data received? */
213 #define TCP_S_DATA_OUT (1 << 3) /* Was data sent? */
214 
215 /* TCP_COOKIE_TRANSACTIONS data */
217  __u16 tcpct_flags; /* see above */
218  __u8 __tcpct_pad1; /* zero */
220  __u16 tcpct_s_data_desired; /* bytes of variable data */
221  __u16 tcpct_used; /* bytes in value */
223 };
224 
225 
226 #endif /* _UAPI_LINUX_TCP_H */