1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _LINUX_TCP_H
18#define _LINUX_TCP_H
19
20#include <linux/types.h>
21#include <asm/byteorder.h>
22#include <linux/socket.h>
23
24struct 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
61
62
63
64union 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
71enum {
72 TCP_FLAG_CWR = __cpu_to_be32(0x00800000),
73 TCP_FLAG_ECE = __cpu_to_be32(0x00400000),
74 TCP_FLAG_URG = __cpu_to_be32(0x00200000),
75 TCP_FLAG_ACK = __cpu_to_be32(0x00100000),
76 TCP_FLAG_PSH = __cpu_to_be32(0x00080000),
77 TCP_FLAG_RST = __cpu_to_be32(0x00040000),
78 TCP_FLAG_SYN = __cpu_to_be32(0x00020000),
79 TCP_FLAG_FIN = __cpu_to_be32(0x00010000),
80 TCP_RESERVED_BITS = __cpu_to_be32(0x0F000000),
81 TCP_DATA_OFFSET = __cpu_to_be32(0xF0000000)
82};
83
84
85#define TCP_NODELAY 1
86#define TCP_MAXSEG 2
87#define TCP_CORK 3
88#define TCP_KEEPIDLE 4
89#define TCP_KEEPINTVL 5
90#define TCP_KEEPCNT 6
91#define TCP_SYNCNT 7
92#define TCP_LINGER2 8
93#define TCP_DEFER_ACCEPT 9
94#define TCP_WINDOW_CLAMP 10
95#define TCP_INFO 11
96#define TCP_QUICKACK 12
97#define TCP_CONGESTION 13
98#define TCP_MD5SIG 14
99
100#define TCPI_OPT_TIMESTAMPS 1
101#define TCPI_OPT_SACK 2
102#define TCPI_OPT_WSCALE 4
103#define TCPI_OPT_ECN 8
104
105enum tcp_ca_state
106{
107 TCP_CA_Open = 0,
108#define TCPF_CA_Open (1<<TCP_CA_Open)
109 TCP_CA_Disorder = 1,
110#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
111 TCP_CA_CWR = 2,
112#define TCPF_CA_CWR (1<<TCP_CA_CWR)
113 TCP_CA_Recovery = 3,
114#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
115 TCP_CA_Loss = 4
116#define TCPF_CA_Loss (1<<TCP_CA_Loss)
117};
118
119struct tcp_info
120{
121 __u8 tcpi_state;
122 __u8 tcpi_ca_state;
123 __u8 tcpi_retransmits;
124 __u8 tcpi_probes;
125 __u8 tcpi_backoff;
126 __u8 tcpi_options;
127 __u8 tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
128
129 __u32 tcpi_rto;
130 __u32 tcpi_ato;
131 __u32 tcpi_snd_mss;
132 __u32 tcpi_rcv_mss;
133
134 __u32 tcpi_unacked;
135 __u32 tcpi_sacked;
136 __u32 tcpi_lost;
137 __u32 tcpi_retrans;
138 __u32 tcpi_fackets;
139
140
141 __u32 tcpi_last_data_sent;
142 __u32 tcpi_last_ack_sent;
143 __u32 tcpi_last_data_recv;
144 __u32 tcpi_last_ack_recv;
145
146
147 __u32 tcpi_pmtu;
148 __u32 tcpi_rcv_ssthresh;
149 __u32 tcpi_rtt;
150 __u32 tcpi_rttvar;
151 __u32 tcpi_snd_ssthresh;
152 __u32 tcpi_snd_cwnd;
153 __u32 tcpi_advmss;
154 __u32 tcpi_reordering;
155
156 __u32 tcpi_rcv_rtt;
157 __u32 tcpi_rcv_space;
158
159 __u32 tcpi_total_retrans;
160};
161
162
163#define TCP_MD5SIG_MAXKEYLEN 80
164
165struct tcp_md5sig {
166 struct __kernel_sockaddr_storage tcpm_addr;
167 __u16 __tcpm_pad1;
168 __u16 tcpm_keylen;
169 __u32 __tcpm_pad2;
170 __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN];
171};
172
173#ifdef __KERNEL__
174
175#include <linux/skbuff.h>
176#include <linux/dmaengine.h>
177#include <net/sock.h>
178#include <net/inet_connection_sock.h>
179#include <net/inet_timewait_sock.h>
180
181static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb)
182{
183 return (struct tcphdr *)skb_transport_header(skb);
184}
185
186static inline unsigned int tcp_hdrlen(const struct sk_buff *skb)
187{
188 return tcp_hdr(skb)->doff * 4;
189}
190
191static inline unsigned int tcp_optlen(const struct sk_buff *skb)
192{
193 return (tcp_hdr(skb)->doff - 5) * 4;
194}
195
196
197struct tcp_sack_block_wire {
198 __be32 start_seq;
199 __be32 end_seq;
200};
201
202struct tcp_sack_block {
203 u32 start_seq;
204 u32 end_seq;
205};
206
207struct tcp_options_received {
208
209 long ts_recent_stamp;
210 u32 ts_recent;
211 u32 rcv_tsval;
212 u32 rcv_tsecr;
213 u16 saw_tstamp : 1,
214 tstamp_ok : 1,
215 dsack : 1,
216 wscale_ok : 1,
217 sack_ok : 4,
218 snd_wscale : 4,
219 rcv_wscale : 4;
220
221 u8 num_sacks;
222 u16 user_mss;
223 u16 mss_clamp;
224};
225
226
227
228
229
230#define TCP_NUM_SACKS 4
231
232struct tcp_request_sock {
233 struct inet_request_sock req;
234#ifdef CONFIG_TCP_MD5SIG
235
236 const struct tcp_request_sock_ops *af_specific;
237#endif
238 u32 rcv_isn;
239 u32 snt_isn;
240};
241
242static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req)
243{
244 return (struct tcp_request_sock *)req;
245}
246
247struct tcp_sock {
248
249 struct inet_connection_sock inet_conn;
250 u16 tcp_header_len;
251 u16 xmit_size_goal_segs;
252
253
254
255
256
257 __be32 pred_flags;
258
259
260
261
262
263
264 u32 rcv_nxt;
265 u32 copied_seq;
266 u32 rcv_wup;
267 u32 snd_nxt;
268
269 u32 snd_una;
270 u32 snd_sml;
271 u32 rcv_tstamp;
272 u32 lsndtime;
273
274
275 struct {
276 struct sk_buff_head prequeue;
277 struct task_struct *task;
278 struct iovec *iov;
279 int memory;
280 int len;
281#ifdef CONFIG_NET_DMA
282
283 struct dma_chan *dma_chan;
284 int wakeup;
285 struct dma_pinned_list *pinned_list;
286 dma_cookie_t dma_cookie;
287#endif
288 } ucopy;
289
290 u32 snd_wl1;
291 u32 snd_wnd;
292 u32 max_window;
293 u32 mss_cache;
294
295 u32 window_clamp;
296 u32 rcv_ssthresh;
297
298 u32 frto_highmark;
299 u16 advmss;
300 u8 frto_counter;
301 u8 nonagle;
302
303
304 u32 srtt;
305 u32 mdev;
306 u32 mdev_max;
307 u32 rttvar;
308 u32 rtt_seq;
309
310 u32 packets_out;
311 u32 retrans_out;
312
313 u16 urg_data;
314 u8 ecn_flags;
315 u8 reordering;
316 u32 snd_up;
317
318 u8 keepalive_probes;
319
320
321
322 struct tcp_options_received rx_opt;
323
324
325
326
327 u32 snd_ssthresh;
328 u32 snd_cwnd;
329 u32 snd_cwnd_cnt;
330 u32 snd_cwnd_clamp;
331 u32 snd_cwnd_used;
332 u32 snd_cwnd_stamp;
333
334 u32 rcv_wnd;
335 u32 write_seq;
336 u32 pushed_seq;
337 u32 lost_out;
338 u32 sacked_out;
339 u32 fackets_out;
340 u32 tso_deferred;
341 u32 bytes_acked;
342
343
344 struct sk_buff* lost_skb_hint;
345 struct sk_buff *scoreboard_skb_hint;
346 struct sk_buff *retransmit_skb_hint;
347
348 struct sk_buff_head out_of_order_queue;
349
350
351 struct tcp_sack_block duplicate_sack[1];
352 struct tcp_sack_block selective_acks[4];
353
354 struct tcp_sack_block recv_sack_cache[4];
355
356 struct sk_buff *highest_sack;
357
358
359
360
361 int lost_cnt_hint;
362 u32 retransmit_high;
363
364 u32 lost_retrans_low;
365
366 u32 prior_ssthresh;
367 u32 high_seq;
368
369 u32 retrans_stamp;
370
371
372 u32 undo_marker;
373 int undo_retrans;
374 u32 total_retrans;
375
376 u32 urg_seq;
377 unsigned int keepalive_time;
378 unsigned int keepalive_intvl;
379
380 int linger2;
381
382
383 struct {
384 u32 rtt;
385 u32 seq;
386 u32 time;
387 } rcv_rtt_est;
388
389
390 struct {
391 int space;
392 u32 seq;
393 u32 time;
394 } rcvq_space;
395
396
397 struct {
398 u32 probe_seq_start;
399 u32 probe_seq_end;
400 } mtu_probe;
401
402#ifdef CONFIG_TCP_MD5SIG
403
404 const struct tcp_sock_af_ops *af_specific;
405
406
407 struct tcp_md5sig_info *md5sig_info;
408#endif
409};
410
411static inline struct tcp_sock *tcp_sk(const struct sock *sk)
412{
413 return (struct tcp_sock *)sk;
414}
415
416struct tcp_timewait_sock {
417 struct inet_timewait_sock tw_sk;
418 u32 tw_rcv_nxt;
419 u32 tw_snd_nxt;
420 u32 tw_rcv_wnd;
421 u32 tw_ts_recent;
422 long tw_ts_recent_stamp;
423#ifdef CONFIG_TCP_MD5SIG
424 u16 tw_md5_keylen;
425 u8 tw_md5_key[TCP_MD5SIG_MAXKEYLEN];
426#endif
427};
428
429static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk)
430{
431 return (struct tcp_timewait_sock *)sk;
432}
433
434#endif
435
436#endif
437