diff options
Diffstat (limited to 'include/linux/tcp.h')
-rw-r--r-- | include/linux/tcp.h | 253 |
1 files changed, 45 insertions, 208 deletions
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index eb125a4c30b3..8a7fc4be2d75 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -17,216 +17,13 @@ | |||
17 | #ifndef _LINUX_TCP_H | 17 | #ifndef _LINUX_TCP_H |
18 | #define _LINUX_TCP_H | 18 | #define _LINUX_TCP_H |
19 | 19 | ||
20 | #include <linux/types.h> | ||
21 | #include <asm/byteorder.h> | ||
22 | #include <linux/socket.h> | ||
23 | |||
24 | struct tcphdr { | ||
25 | __be16 source; | ||
26 | __be16 dest; | ||
27 | __be32 seq; | ||
28 | __be32 ack_seq; | ||
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 | ||
54 | __be16 window; | ||
55 | __sum16 check; | ||
56 | __be16 urg_ptr; | ||
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; | ||
66 | __be32 words[5]; | ||
67 | }; | ||
68 | |||
69 | #define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) | ||
70 | |||
71 | enum { | ||
72 | TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000), | ||
73 | TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000), | ||
74 | TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000), | ||
75 | TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000), | ||
76 | TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000), | ||
77 | TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000), | ||
78 | TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000), | ||
79 | TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000), | ||
80 | TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000), | ||
81 | TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000) | ||
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 | |||
114 | struct tcp_repair_opt { | ||
115 | __u32 opt_code; | ||
116 | __u32 opt_val; | ||
117 | }; | ||
118 | |||
119 | enum { | ||
120 | TCP_NO_QUEUE, | ||
121 | TCP_RECV_QUEUE, | ||
122 | TCP_SEND_QUEUE, | ||
123 | TCP_QUEUES_NR, | ||
124 | }; | ||
125 | |||
126 | /* for TCP_INFO socket option */ | ||
127 | #define TCPI_OPT_TIMESTAMPS 1 | ||
128 | #define TCPI_OPT_SACK 2 | ||
129 | #define TCPI_OPT_WSCALE 4 | ||
130 | #define TCPI_OPT_ECN 8 /* ECN was negociated at TCP session init */ | ||
131 | #define TCPI_OPT_ECN_SEEN 16 /* we received at least one packet with ECT */ | ||
132 | |||
133 | enum tcp_ca_state { | ||
134 | TCP_CA_Open = 0, | ||
135 | #define TCPF_CA_Open (1<<TCP_CA_Open) | ||
136 | TCP_CA_Disorder = 1, | ||
137 | #define TCPF_CA_Disorder (1<<TCP_CA_Disorder) | ||
138 | TCP_CA_CWR = 2, | ||
139 | #define TCPF_CA_CWR (1<<TCP_CA_CWR) | ||
140 | TCP_CA_Recovery = 3, | ||
141 | #define TCPF_CA_Recovery (1<<TCP_CA_Recovery) | ||
142 | TCP_CA_Loss = 4 | ||
143 | #define TCPF_CA_Loss (1<<TCP_CA_Loss) | ||
144 | }; | ||
145 | |||
146 | struct tcp_info { | ||
147 | __u8 tcpi_state; | ||
148 | __u8 tcpi_ca_state; | ||
149 | __u8 tcpi_retransmits; | ||
150 | __u8 tcpi_probes; | ||
151 | __u8 tcpi_backoff; | ||
152 | __u8 tcpi_options; | ||
153 | __u8 tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4; | ||
154 | |||
155 | __u32 tcpi_rto; | ||
156 | __u32 tcpi_ato; | ||
157 | __u32 tcpi_snd_mss; | ||
158 | __u32 tcpi_rcv_mss; | ||
159 | |||
160 | __u32 tcpi_unacked; | ||
161 | __u32 tcpi_sacked; | ||
162 | __u32 tcpi_lost; | ||
163 | __u32 tcpi_retrans; | ||
164 | __u32 tcpi_fackets; | ||
165 | |||
166 | /* Times. */ | ||
167 | __u32 tcpi_last_data_sent; | ||
168 | __u32 tcpi_last_ack_sent; /* Not remembered, sorry. */ | ||
169 | __u32 tcpi_last_data_recv; | ||
170 | __u32 tcpi_last_ack_recv; | ||
171 | |||
172 | /* Metrics. */ | ||
173 | __u32 tcpi_pmtu; | ||
174 | __u32 tcpi_rcv_ssthresh; | ||
175 | __u32 tcpi_rtt; | ||
176 | __u32 tcpi_rttvar; | ||
177 | __u32 tcpi_snd_ssthresh; | ||
178 | __u32 tcpi_snd_cwnd; | ||
179 | __u32 tcpi_advmss; | ||
180 | __u32 tcpi_reordering; | ||
181 | |||
182 | __u32 tcpi_rcv_rtt; | ||
183 | __u32 tcpi_rcv_space; | ||
184 | |||
185 | __u32 tcpi_total_retrans; | ||
186 | }; | ||
187 | |||
188 | /* for TCP_MD5SIG socket option */ | ||
189 | #define TCP_MD5SIG_MAXKEYLEN 80 | ||
190 | |||
191 | struct tcp_md5sig { | ||
192 | struct __kernel_sockaddr_storage tcpm_addr; /* address associated */ | ||
193 | __u16 __tcpm_pad1; /* zero */ | ||
194 | __u16 tcpm_keylen; /* key length */ | ||
195 | __u32 __tcpm_pad2; /* zero */ | ||
196 | __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* key (binary) */ | ||
197 | }; | ||
198 | |||
199 | /* for TCP_COOKIE_TRANSACTIONS (TCPCT) socket option */ | ||
200 | #define TCP_COOKIE_MIN 8 /* 64-bits */ | ||
201 | #define TCP_COOKIE_MAX 16 /* 128-bits */ | ||
202 | #define TCP_COOKIE_PAIR_SIZE (2*TCP_COOKIE_MAX) | ||
203 | |||
204 | /* Flags for both getsockopt and setsockopt */ | ||
205 | #define TCP_COOKIE_IN_ALWAYS (1 << 0) /* Discard SYN without cookie */ | ||
206 | #define TCP_COOKIE_OUT_NEVER (1 << 1) /* Prohibit outgoing cookies, | ||
207 | * supercedes everything. */ | ||
208 | |||
209 | /* Flags for getsockopt */ | ||
210 | #define TCP_S_DATA_IN (1 << 2) /* Was data received? */ | ||
211 | #define TCP_S_DATA_OUT (1 << 3) /* Was data sent? */ | ||
212 | |||
213 | /* TCP_COOKIE_TRANSACTIONS data */ | ||
214 | struct tcp_cookie_transactions { | ||
215 | __u16 tcpct_flags; /* see above */ | ||
216 | __u8 __tcpct_pad1; /* zero */ | ||
217 | __u8 tcpct_cookie_desired; /* bytes */ | ||
218 | __u16 tcpct_s_data_desired; /* bytes of variable data */ | ||
219 | __u16 tcpct_used; /* bytes in value */ | ||
220 | __u8 tcpct_value[TCP_MSS_DEFAULT]; | ||
221 | }; | ||
222 | |||
223 | #ifdef __KERNEL__ | ||
224 | 20 | ||
225 | #include <linux/skbuff.h> | 21 | #include <linux/skbuff.h> |
226 | #include <linux/dmaengine.h> | 22 | #include <linux/dmaengine.h> |
227 | #include <net/sock.h> | 23 | #include <net/sock.h> |
228 | #include <net/inet_connection_sock.h> | 24 | #include <net/inet_connection_sock.h> |
229 | #include <net/inet_timewait_sock.h> | 25 | #include <net/inet_timewait_sock.h> |
26 | #include <uapi/linux/tcp.h> | ||
230 | 27 | ||
231 | static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) | 28 | static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) |
232 | { | 29 | { |
@@ -246,6 +43,7 @@ static inline unsigned int tcp_optlen(const struct sk_buff *skb) | |||
246 | /* TCP Fast Open */ | 43 | /* TCP Fast Open */ |
247 | #define TCP_FASTOPEN_COOKIE_MIN 4 /* Min Fast Open Cookie size in bytes */ | 44 | #define TCP_FASTOPEN_COOKIE_MIN 4 /* Min Fast Open Cookie size in bytes */ |
248 | #define TCP_FASTOPEN_COOKIE_MAX 16 /* Max Fast Open Cookie size in bytes */ | 45 | #define TCP_FASTOPEN_COOKIE_MAX 16 /* Max Fast Open Cookie size in bytes */ |
46 | #define TCP_FASTOPEN_COOKIE_SIZE 8 /* the size employed by this impl. */ | ||
249 | 47 | ||
250 | /* TCP Fast Open Cookie as stored in memory */ | 48 | /* TCP Fast Open Cookie as stored in memory */ |
251 | struct tcp_fastopen_cookie { | 49 | struct tcp_fastopen_cookie { |
@@ -312,9 +110,14 @@ struct tcp_request_sock { | |||
312 | /* Only used by TCP MD5 Signature so far. */ | 110 | /* Only used by TCP MD5 Signature so far. */ |
313 | const struct tcp_request_sock_ops *af_specific; | 111 | const struct tcp_request_sock_ops *af_specific; |
314 | #endif | 112 | #endif |
113 | struct sock *listener; /* needed for TFO */ | ||
315 | u32 rcv_isn; | 114 | u32 rcv_isn; |
316 | u32 snt_isn; | 115 | u32 snt_isn; |
317 | u32 snt_synack; /* synack sent time */ | 116 | u32 snt_synack; /* synack sent time */ |
117 | u32 rcv_nxt; /* the ack # by SYNACK. For | ||
118 | * FastOpen it's the seq# | ||
119 | * after data-in-SYN. | ||
120 | */ | ||
318 | }; | 121 | }; |
319 | 122 | ||
320 | static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req) | 123 | static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req) |
@@ -505,14 +308,18 @@ struct tcp_sock { | |||
505 | struct tcp_md5sig_info __rcu *md5sig_info; | 308 | struct tcp_md5sig_info __rcu *md5sig_info; |
506 | #endif | 309 | #endif |
507 | 310 | ||
508 | /* TCP fastopen related information */ | ||
509 | struct tcp_fastopen_request *fastopen_req; | ||
510 | |||
511 | /* When the cookie options are generated and exchanged, then this | 311 | /* When the cookie options are generated and exchanged, then this |
512 | * object holds a reference to them (cookie_values->kref). Also | 312 | * object holds a reference to them (cookie_values->kref). Also |
513 | * contains related tcp_cookie_transactions fields. | 313 | * contains related tcp_cookie_transactions fields. |
514 | */ | 314 | */ |
515 | struct tcp_cookie_values *cookie_values; | 315 | struct tcp_cookie_values *cookie_values; |
316 | |||
317 | /* TCP fastopen related information */ | ||
318 | struct tcp_fastopen_request *fastopen_req; | ||
319 | /* fastopen_rsk points to request_sock that resulted in this big | ||
320 | * socket. Used to retransmit SYNACKs etc. | ||
321 | */ | ||
322 | struct request_sock *fastopen_rsk; | ||
516 | }; | 323 | }; |
517 | 324 | ||
518 | enum tsq_flags { | 325 | enum tsq_flags { |
@@ -552,6 +359,36 @@ static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk) | |||
552 | return (struct tcp_timewait_sock *)sk; | 359 | return (struct tcp_timewait_sock *)sk; |
553 | } | 360 | } |
554 | 361 | ||
555 | #endif /* __KERNEL__ */ | 362 | static inline bool tcp_passive_fastopen(const struct sock *sk) |
363 | { | ||
364 | return (sk->sk_state == TCP_SYN_RECV && | ||
365 | tcp_sk(sk)->fastopen_rsk != NULL); | ||
366 | } | ||
367 | |||
368 | static inline bool fastopen_cookie_present(struct tcp_fastopen_cookie *foc) | ||
369 | { | ||
370 | return foc->len != -1; | ||
371 | } | ||
372 | |||
373 | extern void tcp_sock_destruct(struct sock *sk); | ||
374 | |||
375 | static inline int fastopen_init_queue(struct sock *sk, int backlog) | ||
376 | { | ||
377 | struct request_sock_queue *queue = | ||
378 | &inet_csk(sk)->icsk_accept_queue; | ||
379 | |||
380 | if (queue->fastopenq == NULL) { | ||
381 | queue->fastopenq = kzalloc( | ||
382 | sizeof(struct fastopen_queue), | ||
383 | sk->sk_allocation); | ||
384 | if (queue->fastopenq == NULL) | ||
385 | return -ENOMEM; | ||
386 | |||
387 | sk->sk_destruct = tcp_sock_destruct; | ||
388 | spin_lock_init(&queue->fastopenq->lock); | ||
389 | } | ||
390 | queue->fastopenq->max_qlen = backlog; | ||
391 | return 0; | ||
392 | } | ||
556 | 393 | ||
557 | #endif /* _LINUX_TCP_H */ | 394 | #endif /* _LINUX_TCP_H */ |