Blame view

include/net/tcp.h 47.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
  /*
   * 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 module.
   *
   * Version:	@(#)tcp.h	1.0.5	05/23/93
   *
02c30a84e   Jesper Juhl   [PATCH] update Ro...
10
   * Authors:	Ross Biro
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
17
18
19
   *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
   *
   *		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 _TCP_H
  #define _TCP_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  #define FASTRETRANS_DEBUG 1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
25
  #include <linux/list.h>
  #include <linux/tcp.h>
  #include <linux/slab.h>
  #include <linux/cache.h>
  #include <linux/percpu.h>
fb286bb29   Herbert Xu   [NET]: Detect har...
26
  #include <linux/skbuff.h>
97fc2f084   Chris Leech   [I/OAT]: Structur...
27
  #include <linux/dmaengine.h>
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
28
  #include <linux/crypto.h>
c6aefafb7   Glenn Griffin   [TCP]: Add IPv6 s...
29
  #include <linux/cryptohash.h>
435cf559f   William Allen Simpson   TCPCT part 1d: de...
30
  #include <linux/kref.h>
3f421baa4   Arnaldo Carvalho de Melo   [NET]: Just move ...
31
32
  
  #include <net/inet_connection_sock.h>
295ff7edb   Arnaldo Carvalho de Melo   [TIMEWAIT]: Intro...
33
  #include <net/inet_timewait_sock.h>
77d8bf9c6   Arnaldo Carvalho de Melo   [INET]: Move the ...
34
  #include <net/inet_hashtables.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  #include <net/checksum.h>
2e6599cb8   Arnaldo Carvalho de Melo   [NET] Generalise ...
36
  #include <net/request_sock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  #include <net/sock.h>
  #include <net/snmp.h>
  #include <net/ip.h>
c752f0739   Arnaldo Carvalho de Melo   [TCP]: Move the t...
40
  #include <net/tcp_states.h>
bdf1ee5d3   Ilpo Järvinen   [TCP]: Move code ...
41
  #include <net/inet_ecn.h>
0c266898b   Satoru SATOH   tcp: Fix tcp_preq...
42
  #include <net/dst.h>
c752f0739   Arnaldo Carvalho de Melo   [TCP]: Move the t...
43

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  #include <linux/seq_file.h>
180d8cd94   Glauber Costa   foundations of pe...
45
  #include <linux/memcontrol.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

6e04e0216   Arnaldo Carvalho de Melo   [INET]: Move tcp_...
47
  extern struct inet_hashinfo tcp_hashinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48

dd24c0019   Eric Dumazet   net: Use a percpu...
49
  extern struct percpu_counter tcp_orphan_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  extern void tcp_time_wait(struct sock *sk, int state, int timeo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  #define MAX_TCP_HEADER	(128 + MAX_HEADER)
33ad798c9   Adam Langley   tcp: options clea...
53
  #define MAX_TCP_OPTION_SPACE 40
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
  
  /* 
   * Never offer a window over 32767 without using window scaling. Some
   * poor stacks do signed 16bit maths! 
   */
  #define MAX_TCP_WINDOW		32767U
356f03982   Nandita Dukkipati   TCP: increase def...
60
61
  /* Offer an initial receive window of 10 mss. */
  #define TCP_DEFAULT_INIT_RCVWND	10
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
  /* Minimal accepted MSS. It is (60+60+8) - (20+20). */
  #define TCP_MIN_MSS		88U
5d424d5a6   John Heffner   [TCP]: MTU probing
64
65
  /* The least MTU to use for probing */
  #define TCP_BASE_MSS		512
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  /* After receiving this amount of duplicate ACKs fast retransmit starts. */
  #define TCP_FASTRETRANS_THRESH 3
  
  /* Maximal reordering. */
  #define TCP_MAX_REORDERING	127
  
  /* Maximal number of ACKs sent quickly to accelerate slow-start. */
  #define TCP_MAX_QUICKACKS	16U
  
  /* urg_data states */
  #define TCP_URG_VALID	0x0100
  #define TCP_URG_NOTYET	0x0200
  #define TCP_URG_READ	0x0400
  
  #define TCP_RETR1	3	/*
  				 * This is how many retries it does before it
  				 * tries to figure out if the gateway is
  				 * down. Minimal RFC value is 3; it corresponds
  				 * to ~3sec-8min depending on RTO.
  				 */
  
  #define TCP_RETR2	15	/*
  				 * This should take at least
  				 * 90 minutes to time out.
  				 * RFC1122 says that the limit is 100 sec.
  				 * 15 is ~13-30min depending on RTO.
  				 */
  
  #define TCP_SYN_RETRIES	 5	/* number of times to retry active opening a
caa20d9ab   Stephen Hemminger   [TCP]: spelling f...
95
  				 * connection: ~180sec is RFC minimum	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
  
  #define TCP_SYNACK_RETRIES 5	/* number of times to retry passive opening a
caa20d9ab   Stephen Hemminger   [TCP]: spelling f...
98
  				 * connection: ~180sec is RFC minimum	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
  				  * state, about 60 seconds	*/
  #define TCP_FIN_TIMEOUT	TCP_TIMEWAIT_LEN
                                   /* BSD style FIN_WAIT2 deadlock breaker.
  				  * It used to be 3min, new value is 60sec,
  				  * to combine FIN-WAIT-2 timeout with
  				  * TIME-WAIT timer.
  				  */
  
  #define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */
  #if HZ >= 100
  #define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */
  #define TCP_ATO_MIN	((unsigned)(HZ/25))
  #else
  #define TCP_DELACK_MIN	4U
  #define TCP_ATO_MIN	4U
  #endif
  #define TCP_RTO_MAX	((unsigned)(120*HZ))
  #define TCP_RTO_MIN	((unsigned)(HZ/5))
9ad7c049f   Jerry Chu   tcp: RFC2988bis +...
119
120
121
122
123
124
125
  #define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC2988bis initial RTO value	*/
  #define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
  						 * used as a fallback RTO for the
  						 * initial data transmission if no
  						 * valid RTT sample has been acquired,
  						 * most likely due to retrans in 3WHS.
  						 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  
  #define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
  					                 * for local resources.
  					                 */
  
  #define TCP_KEEPALIVE_TIME	(120*60*HZ)	/* two hours */
  #define TCP_KEEPALIVE_PROBES	9		/* Max of 9 keepalive probes	*/
  #define TCP_KEEPALIVE_INTVL	(75*HZ)
  
  #define MAX_TCP_KEEPIDLE	32767
  #define MAX_TCP_KEEPINTVL	32767
  #define MAX_TCP_KEEPCNT		127
  #define MAX_TCP_SYNCNT		127
  
  #define TCP_SYNQ_INTERVAL	(HZ/5)	/* Period of SYNACK timer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
144
145
146
147
148
149
150
151
152
  
  #define TCP_PAWS_24DAYS	(60 * 60 * 24 * 24)
  #define TCP_PAWS_MSL	60		/* Per-host timestamps are invalidated
  					 * after this time. It should be equal
  					 * (or greater than) TCP_TIMEWAIT_LEN
  					 * to provide reliability equal to one
  					 * provided by timewait state.
  					 */
  #define TCP_PAWS_WINDOW	1		/* Replay window for per-host
  					 * timestamps. It must be less than
  					 * minimal timewait lifetime.
  					 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
157
158
159
160
161
162
163
  /*
   *	TCP option
   */
   
  #define TCPOPT_NOP		1	/* Padding */
  #define TCPOPT_EOL		0	/* End of options */
  #define TCPOPT_MSS		2	/* Segment size negotiating */
  #define TCPOPT_WINDOW		3	/* Window scaling */
  #define TCPOPT_SACK_PERM        4       /* SACK Permitted */
  #define TCPOPT_SACK             5       /* SACK Block */
  #define TCPOPT_TIMESTAMP	8	/* Better RTT estimations/PAWS */
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
164
  #define TCPOPT_MD5SIG		19	/* MD5 Signature (RFC2385) */
435cf559f   William Allen Simpson   TCPCT part 1d: de...
165
  #define TCPOPT_COOKIE		253	/* Cookie extension (experimental) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
167
168
169
170
171
172
173
174
  
  /*
   *     TCP option lengths
   */
  
  #define TCPOLEN_MSS            4
  #define TCPOLEN_WINDOW         3
  #define TCPOLEN_SACK_PERM      2
  #define TCPOLEN_TIMESTAMP      10
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
175
  #define TCPOLEN_MD5SIG         18
435cf559f   William Allen Simpson   TCPCT part 1d: de...
176
177
178
179
  #define TCPOLEN_COOKIE_BASE    2	/* Cookie-less header extension */
  #define TCPOLEN_COOKIE_PAIR    3	/* Cookie pair header extension */
  #define TCPOLEN_COOKIE_MIN     (TCPOLEN_COOKIE_BASE+TCP_COOKIE_MIN)
  #define TCPOLEN_COOKIE_MAX     (TCPOLEN_COOKIE_BASE+TCP_COOKIE_MAX)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
181
182
183
184
185
186
187
  
  /* But this is what stacks really send out. */
  #define TCPOLEN_TSTAMP_ALIGNED		12
  #define TCPOLEN_WSCALE_ALIGNED		4
  #define TCPOLEN_SACKPERM_ALIGNED	4
  #define TCPOLEN_SACK_BASE		2
  #define TCPOLEN_SACK_BASE_ALIGNED	4
  #define TCPOLEN_SACK_PERBLOCK		8
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
188
  #define TCPOLEN_MD5SIG_ALIGNED		20
33ad798c9   Adam Langley   tcp: options clea...
189
  #define TCPOLEN_MSS_ALIGNED		4
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
190

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
  /* Flags in tp->nonagle */
  #define TCP_NAGLE_OFF		1	/* Nagle's algo is disabled */
  #define TCP_NAGLE_CORK		2	/* Socket is corked	    */
caa20d9ab   Stephen Hemminger   [TCP]: spelling f...
194
  #define TCP_NAGLE_PUSH		4	/* Cork is overridden for already queued data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195

36e31b0af   Andreas Petlund   net: TCP thin lin...
196
197
  /* TCP thin-stream limits */
  #define TCP_THIN_LINEAR_RETRIES 6       /* After 6 linear retries, do exp. backoff */
7eb38527c   David S. Miller   tcp: Add referenc...
198
  /* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
442b9635c   David S. Miller   tcp: Increase the...
199
  #define TCP_INIT_CWND		10
295ff7edb   Arnaldo Carvalho de Melo   [TIMEWAIT]: Intro...
200
  extern struct inet_timewait_death_row tcp_death_row;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
  /* sysctl variables for tcp */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
203
204
205
  extern int sysctl_tcp_timestamps;
  extern int sysctl_tcp_window_scaling;
  extern int sysctl_tcp_sack;
  extern int sysctl_tcp_fin_timeout;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
210
211
212
213
214
215
216
217
218
219
  extern int sysctl_tcp_keepalive_time;
  extern int sysctl_tcp_keepalive_probes;
  extern int sysctl_tcp_keepalive_intvl;
  extern int sysctl_tcp_syn_retries;
  extern int sysctl_tcp_synack_retries;
  extern int sysctl_tcp_retries1;
  extern int sysctl_tcp_retries2;
  extern int sysctl_tcp_orphan_retries;
  extern int sysctl_tcp_syncookies;
  extern int sysctl_tcp_retrans_collapse;
  extern int sysctl_tcp_stdurg;
  extern int sysctl_tcp_rfc1337;
  extern int sysctl_tcp_abort_on_overflow;
  extern int sysctl_tcp_max_orphans;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
221
222
223
  extern int sysctl_tcp_fack;
  extern int sysctl_tcp_reordering;
  extern int sysctl_tcp_ecn;
  extern int sysctl_tcp_dsack;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
225
226
227
228
229
  extern int sysctl_tcp_wmem[3];
  extern int sysctl_tcp_rmem[3];
  extern int sysctl_tcp_app_win;
  extern int sysctl_tcp_adv_win_scale;
  extern int sysctl_tcp_tw_reuse;
  extern int sysctl_tcp_frto;
3cfe3baaf   Ilpo Järvinen   [TCP]: Add two ne...
230
  extern int sysctl_tcp_frto_response;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
  extern int sysctl_tcp_low_latency;
959378258   Chris Leech   [I/OAT]: Add a sy...
232
  extern int sysctl_tcp_dma_copybreak;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
  extern int sysctl_tcp_nometrics_save;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
235
  extern int sysctl_tcp_moderate_rcvbuf;
  extern int sysctl_tcp_tso_win_divisor;
9772efb97   Stephen Hemminger   [TCP]: Appropriat...
236
  extern int sysctl_tcp_abc;
5d424d5a6   John Heffner   [TCP]: MTU probing
237
238
  extern int sysctl_tcp_mtu_probing;
  extern int sysctl_tcp_base_mss;
15d99e02b   Rick Jones   [TCP]: sysctl to ...
239
  extern int sysctl_tcp_workaround_signed_windows;
35089bb20   David S. Miller   [TCP]: Add tcp_sl...
240
  extern int sysctl_tcp_slow_start_after_idle;
886236c12   John Heffner   [TCP]: Add RFC374...
241
  extern int sysctl_tcp_max_ssthresh;
519855c50   William Allen Simpson   TCPCT part 1c: sy...
242
  extern int sysctl_tcp_cookie_size;
36e31b0af   Andreas Petlund   net: TCP thin lin...
243
  extern int sysctl_tcp_thin_linear_timeouts;
7e3801755   Andreas Petlund   net: TCP thin dupack
244
  extern int sysctl_tcp_thin_dupack;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245

8d987e5c7   Eric Dumazet   net: avoid limits...
246
  extern atomic_long_t tcp_memory_allocated;
1748376b6   Eric Dumazet   net: Use a percpu...
247
  extern struct percpu_counter tcp_sockets_allocated;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
  extern int tcp_memory_pressure;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
253
254
255
   * The next routines deal with comparing 32 bit unsigned ints
   * and worry about wraparound (automatic with unsigned arithmetic).
   */
  
  static inline int before(__u32 seq1, __u32 seq2)
  {
0d630cc0a   Gerrit Renker   [TCP]: Use old de...
256
          return (__s32)(seq1-seq2) < 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
  }
9a036b9c3   Gerrit Renker   [TCP]: Fix ambigu...
258
  #define after(seq2, seq1) 	before(seq1, seq2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
260
261
262
263
264
  
  /* is s2<=s1<=s3 ? */
  static inline int between(__u32 seq1, __u32 seq2, __u32 seq3)
  {
  	return seq3 - seq2 >= seq1 - seq2;
  }
ad1af0fed   David S. Miller   tcp: Combat per-c...
265
  static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
e4fd5da39   Pavel Emelianov   [TCP]: Consolidat...
266
  {
ad1af0fed   David S. Miller   tcp: Combat per-c...
267
268
269
270
271
272
273
274
275
276
  	struct percpu_counter *ocp = sk->sk_prot->orphan_count;
  	int orphans = percpu_counter_read_positive(ocp);
  
  	if (orphans << shift > sysctl_tcp_max_orphans) {
  		orphans = percpu_counter_sum_positive(ocp);
  		if (orphans << shift > sysctl_tcp_max_orphans)
  			return true;
  	}
  
  	if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
180d8cd94   Glauber Costa   foundations of pe...
277
  	    sk_memory_allocated(sk) > sk_prot_mem_limits(sk, 2))
ad1af0fed   David S. Miller   tcp: Combat per-c...
278
279
  		return true;
  	return false;
e4fd5da39   Pavel Emelianov   [TCP]: Consolidat...
280
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281

a0f82f64e   Florian Westphal   syncookies: remov...
282
283
284
285
286
287
288
289
290
291
  /* syncookies: remember time of last synqueue overflow */
  static inline void tcp_synq_overflow(struct sock *sk)
  {
  	tcp_sk(sk)->rx_opt.ts_recent_stamp = jiffies;
  }
  
  /* syncookies: no recent synqueue overflow on this listening socket? */
  static inline int tcp_synq_no_recent_overflow(const struct sock *sk)
  {
  	unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
9ad7c049f   Jerry Chu   tcp: RFC2988bis +...
292
  	return time_after(jiffies, last_overflow + TCP_TIMEOUT_FALLBACK);
a0f82f64e   Florian Westphal   syncookies: remov...
293
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
  extern struct proto tcp_prot;
57ef42d59   Pavel Emelyanov   mib: put tcp stat...
295
296
297
298
  #define TCP_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.tcp_statistics, field)
  #define TCP_INC_STATS_BH(net, field)	SNMP_INC_STATS_BH((net)->mib.tcp_statistics, field)
  #define TCP_DEC_STATS(net, field)	SNMP_DEC_STATS((net)->mib.tcp_statistics, field)
  #define TCP_ADD_STATS_USER(net, field, val) SNMP_ADD_STATS_USER((net)->mib.tcp_statistics, field, val)
aa2ea0586   Tom Herbert   tcp: fix outsegs ...
299
  #define TCP_ADD_STATS(net, field, val)	SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300

53d3176b2   Changli Gao   net: cleanups
301
302
303
304
305
  extern void tcp_v4_err(struct sk_buff *skb, u32);
  
  extern void tcp_shutdown (struct sock *sk, int how);
  
  extern int tcp_v4_rcv(struct sk_buff *skb);
3f419d2d4   David S. Miller   inet: Turn ->reme...
306
  extern struct inet_peer *tcp_v4_get_peer(struct sock *sk, bool *release_it);
ccb7c410d   David S. Miller   timewait_sock: Cr...
307
  extern void *tcp_v4_tw_get_peer(struct sock *sk);
53d3176b2   Changli Gao   net: cleanups
308
  extern int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);
7ba429100   Changli Gao   inet, inet6: make...
309
310
311
312
  extern int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
  		       size_t size);
  extern int tcp_sendpage(struct sock *sk, struct page *page, int offset,
  			size_t size, int flags);
53d3176b2   Changli Gao   net: cleanups
313
314
  extern int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);
  extern int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
cf533ea53   Eric Dumazet   tcp: add const qu...
315
  				 const struct tcphdr *th, unsigned int len);
53d3176b2   Changli Gao   net: cleanups
316
  extern int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
cf533ea53   Eric Dumazet   tcp: add const qu...
317
  			       const struct tcphdr *th, unsigned int len);
53d3176b2   Changli Gao   net: cleanups
318
319
320
321
322
323
324
  extern void tcp_rcv_space_adjust(struct sock *sk);
  extern void tcp_cleanup_rbuf(struct sock *sk, int copied);
  extern int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);
  extern void tcp_twsk_destructor(struct sock *sk);
  extern ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
  			       struct pipe_inode_info *pipe, size_t len,
  			       unsigned int flags);
9c55e01c0   Jens Axboe   [TCP]: Splice rec...
325

463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
326
327
  static inline void tcp_dec_quickack_mode(struct sock *sk,
  					 const unsigned int pkts)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328
  {
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
329
  	struct inet_connection_sock *icsk = inet_csk(sk);
fc6415bcb   David S. Miller   [TCP]: Fix quick-...
330

463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
331
332
333
  	if (icsk->icsk_ack.quick) {
  		if (pkts >= icsk->icsk_ack.quick) {
  			icsk->icsk_ack.quick = 0;
fc6415bcb   David S. Miller   [TCP]: Fix quick-...
334
  			/* Leaving quickack mode we deflate ATO. */
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
335
  			icsk->icsk_ack.ato   = TCP_ATO_MIN;
fc6415bcb   David S. Miller   [TCP]: Fix quick-...
336
  		} else
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
337
  			icsk->icsk_ack.quick -= pkts;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
  	}
  }
bdf1ee5d3   Ilpo Järvinen   [TCP]: Move code ...
340
341
342
  #define	TCP_ECN_OK		1
  #define	TCP_ECN_QUEUE_CWR	2
  #define	TCP_ECN_DEMAND_CWR	4
7a269ffad   Eric Dumazet   tcp: ECN blackhol...
343
  #define	TCP_ECN_SEEN		8
bdf1ee5d3   Ilpo Järvinen   [TCP]: Move code ...
344
345
346
347
348
349
350
  
  static __inline__ void
  TCP_ECN_create_request(struct request_sock *req, struct tcphdr *th)
  {
  	if (sysctl_tcp_ecn && th->ece && th->cwr)
  		inet_rsk(req)->ecn_ok = 1;
  }
fd2c3ef76   Eric Dumazet   net: cleanup incl...
351
  enum tcp_tw_status {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
354
355
356
  	TCP_TW_SUCCESS = 0,
  	TCP_TW_RST = 1,
  	TCP_TW_ACK = 2,
  	TCP_TW_SYN = 3
  };
53d3176b2   Changli Gao   net: cleanups
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
  extern enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
  						     struct sk_buff *skb,
  						     const struct tcphdr *th);
  extern struct sock * tcp_check_req(struct sock *sk,struct sk_buff *skb,
  				   struct request_sock *req,
  				   struct request_sock **prev);
  extern int tcp_child_process(struct sock *parent, struct sock *child,
  			     struct sk_buff *skb);
  extern int tcp_use_frto(struct sock *sk);
  extern void tcp_enter_frto(struct sock *sk);
  extern void tcp_enter_loss(struct sock *sk, int how);
  extern void tcp_clear_retrans(struct tcp_sock *tp);
  extern void tcp_update_metrics(struct sock *sk);
  extern void tcp_close(struct sock *sk, long timeout);
  extern unsigned int tcp_poll(struct file * file, struct socket *sock,
  			     struct poll_table_struct *wait);
  extern int tcp_getsockopt(struct sock *sk, int level, int optname,
  			  char __user *optval, int __user *optlen);
  extern int tcp_setsockopt(struct sock *sk, int level, int optname,
  			  char __user *optval, unsigned int optlen);
  extern int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
  				 char __user *optval, int __user *optlen);
  extern int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
  				 char __user *optval, unsigned int optlen);
  extern void tcp_set_keepalive(struct sock *sk, int val);
  extern void tcp_syn_ack_timeout(struct sock *sk, struct request_sock *req);
  extern int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
  		       size_t len, int nonblock, int flags, int *addr_len);
cf533ea53   Eric Dumazet   tcp: add const qu...
385
386
  extern void tcp_parse_options(const struct sk_buff *skb,
  			      struct tcp_options_received *opt_rx, const u8 **hvpp,
53d3176b2   Changli Gao   net: cleanups
387
  			      int estab);
cf533ea53   Eric Dumazet   tcp: add const qu...
388
  extern const u8 *tcp_parse_md5sig_option(const struct tcphdr *th);
7d5d5525b   YOSHIFUJI Hideaki   tcp md5sig: Share...
389

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
392
  /*
   *	TCP v4 functions exported for the inet6 API
   */
53d3176b2   Changli Gao   net: cleanups
393
394
395
396
  extern void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);
  extern int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb);
  extern struct sock * tcp_create_openreq_child(struct sock *sk,
  					      struct request_sock *req,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
  					      struct sk_buff *skb);
53d3176b2   Changli Gao   net: cleanups
398
399
400
401
402
403
404
405
406
407
408
  extern struct sock * tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
  					  struct request_sock *req,
  					  struct dst_entry *dst);
  extern int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb);
  extern int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
  			  int addr_len);
  extern int tcp_connect(struct sock *sk);
  extern struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
  					struct request_sock *req,
  					struct request_values *rvp);
  extern int tcp_disconnect(struct sock *sk, int flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
410

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
  /* From syncookies.c */
2051f11fb   Florian Westphal   [TCP]: Shrink syn...
412
  extern __u32 syncookie_secret[2][16-4+SHA_DIGEST_WORDS];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
414
  extern struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, 
  				    struct ip_options *opt);
e05c82d36   Eric Dumazet   tcp: fix build er...
415
  #ifdef CONFIG_SYN_COOKIES
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
417
  extern __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, 
  				     __u16 *mss);
e05c82d36   Eric Dumazet   tcp: fix build er...
418
419
420
421
422
423
424
425
  #else
  static inline __u32 cookie_v4_init_sequence(struct sock *sk,
  					    struct sk_buff *skb,
  					    __u16 *mss)
  {
  	return 0;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426

4dfc28170   Florian Westphal   [Syncookies]: Add...
427
  extern __u32 cookie_init_timestamp(struct request_sock *req);
172d69e63   Florian Westphal   syncookies: add s...
428
  extern bool cookie_check_timestamp(struct tcp_options_received *opt, bool *);
4dfc28170   Florian Westphal   [Syncookies]: Add...
429

c6aefafb7   Glenn Griffin   [TCP]: Add IPv6 s...
430
431
  /* From net/ipv6/syncookies.c */
  extern struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb);
e05c82d36   Eric Dumazet   tcp: fix build er...
432
  #ifdef CONFIG_SYN_COOKIES
cf533ea53   Eric Dumazet   tcp: add const qu...
433
  extern __u32 cookie_v6_init_sequence(struct sock *sk, const struct sk_buff *skb,
c6aefafb7   Glenn Griffin   [TCP]: Add IPv6 s...
434
  				     __u16 *mss);
e05c82d36   Eric Dumazet   tcp: fix build er...
435
436
437
438
439
440
441
442
  #else
  static inline __u32 cookie_v6_init_sequence(struct sock *sk,
  					    struct sk_buff *skb,
  					    __u16 *mss)
  {
  	return 0;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
  /* tcp_output.c */
9e412ba76   Ilpo Järvinen   [TCP]: Sed magic ...
444
445
446
  extern void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
  				      int nonagle);
  extern int tcp_may_send_now(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
447
  extern int tcp_retransmit_skb(struct sock *, struct sk_buff *);
f1ecd5d9e   Damian Lukowski   Revert Backoff [v...
448
  extern void tcp_retransmit_timer(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
451
  extern void tcp_xmit_retransmit_queue(struct sock *);
  extern void tcp_simple_retransmit(struct sock *);
  extern int tcp_trim_head(struct sock *, struct sk_buff *, u32);
6475be16f   David S. Miller   [TCP]: Keep TSO e...
452
  extern int tcp_fragment(struct sock *, struct sk_buff *, u32, unsigned int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453
454
455
  
  extern void tcp_send_probe0(struct sock *);
  extern void tcp_send_partial(struct sock *);
53d3176b2   Changli Gao   net: cleanups
456
  extern int tcp_write_wakeup(struct sock *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
  extern void tcp_send_fin(struct sock *sk);
dd0fc66fb   Al Viro   [PATCH] gfp flags...
458
  extern void tcp_send_active_reset(struct sock *sk, gfp_t priority);
53d3176b2   Changli Gao   net: cleanups
459
  extern int tcp_send_synack(struct sock *);
946cedccb   Eric Dumazet   tcp: Change possi...
460
461
462
  extern int tcp_syn_flood_action(struct sock *sk,
  				const struct sk_buff *skb,
  				const char *proto);
c1b4a7e69   David S. Miller   [TCP]: Move to ne...
463
  extern void tcp_push_one(struct sock *, unsigned int mss_now);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
465
  extern void tcp_send_ack(struct sock *sk);
  extern void tcp_send_delayed_ack(struct sock *sk);
a762a9800   David S. Miller   [TCP]: Kill extra...
466
467
  /* tcp_input.c */
  extern void tcp_cwnd_application_limited(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
468
469
  /* tcp_timer.c */
  extern void tcp_init_xmit_timers(struct sock *);
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
470
471
472
473
  static inline void tcp_clear_xmit_timers(struct sock *sk)
  {
  	inet_csk_clear_xmit_timers(sk);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
  extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu);
0c54b85f2   Ilpo Järvinen   tcp: simplify tcp...
476
477
478
479
480
  extern unsigned int tcp_current_mss(struct sock *sk);
  
  /* Bound MSS / TSO packet size with the half of the window */
  static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize)
  {
01f83d698   Alexey Kuznetsov   tcp: Prevent over...
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
  	int cutoff;
  
  	/* When peer uses tiny windows, there is no use in packetizing
  	 * to sub-MSS pieces for the sake of SWS or making sure there
  	 * are enough packets in the pipe for fast recovery.
  	 *
  	 * On the other hand, for extremely large MSS devices, handling
  	 * smaller than MSS windows in this way does make sense.
  	 */
  	if (tp->max_window >= 512)
  		cutoff = (tp->max_window >> 1);
  	else
  		cutoff = tp->max_window;
  
  	if (cutoff && pktsize > cutoff)
  		return max_t(int, cutoff, 68U - tp->tcp_header_len);
0c54b85f2   Ilpo Järvinen   tcp: simplify tcp...
497
498
499
  	else
  		return pktsize;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500

17b085eac   Arnaldo Carvalho de Melo   [INET_DIAG]: Move...
501
  /* tcp.c */
cf533ea53   Eric Dumazet   tcp: add const qu...
502
  extern void tcp_get_info(const struct sock *, struct tcp_info *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
505
506
507
508
  
  /* Read 'sendfile()'-style from a TCP socket */
  typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
  				unsigned int, size_t);
  extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
  			 sk_read_actor_t recv_actor);
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
509
  extern void tcp_initialize_rcv_mss(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510

cf533ea53   Eric Dumazet   tcp: add const qu...
511
512
  extern int tcp_mtu_to_mss(const struct sock *sk, int pmtu);
  extern int tcp_mss_to_mtu(const struct sock *sk, int mss);
5d424d5a6   John Heffner   [TCP]: MTU probing
513
  extern void tcp_mtup_init(struct sock *sk);
9ad7c049f   Jerry Chu   tcp: RFC2988bis +...
514
  extern void tcp_valid_rtt_meas(struct sock *sk, u32 seq_rtt);
5d424d5a6   John Heffner   [TCP]: MTU probing
515

f1ecd5d9e   Damian Lukowski   Revert Backoff [v...
516
517
518
519
520
521
522
523
524
525
  static inline void tcp_bound_rto(const struct sock *sk)
  {
  	if (inet_csk(sk)->icsk_rto > TCP_RTO_MAX)
  		inet_csk(sk)->icsk_rto = TCP_RTO_MAX;
  }
  
  static inline u32 __tcp_set_rto(const struct tcp_sock *tp)
  {
  	return (tp->srtt >> 3) + tp->rttvar;
  }
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
526
  static inline void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527
528
529
530
531
  {
  	tp->pred_flags = htonl((tp->tcp_header_len << 26) |
  			       ntohl(TCP_FLAG_ACK) |
  			       snd_wnd);
  }
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
532
  static inline void tcp_fast_path_on(struct tcp_sock *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
535
  {
  	__tcp_fast_path_on(tp, tp->snd_wnd >> tp->rx_opt.snd_wscale);
  }
9e412ba76   Ilpo Järvinen   [TCP]: Sed magic ...
536
  static inline void tcp_fast_path_check(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
  {
9e412ba76   Ilpo Järvinen   [TCP]: Sed magic ...
538
  	struct tcp_sock *tp = tcp_sk(sk);
b03efcfb2   David S. Miller   [NET]: Transform ...
539
  	if (skb_queue_empty(&tp->out_of_order_queue) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
540
541
542
543
544
  	    tp->rcv_wnd &&
  	    atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf &&
  	    !tp->urg_data)
  		tcp_fast_path_on(tp);
  }
0c266898b   Satoru SATOH   tcp: Fix tcp_preq...
545
546
547
  /* Compute the actual rto_min value */
  static inline u32 tcp_rto_min(struct sock *sk)
  {
cf533ea53   Eric Dumazet   tcp: add const qu...
548
  	const struct dst_entry *dst = __sk_dst_get(sk);
0c266898b   Satoru SATOH   tcp: Fix tcp_preq...
549
550
551
552
553
554
  	u32 rto_min = TCP_RTO_MIN;
  
  	if (dst && dst_metric_locked(dst, RTAX_RTO_MIN))
  		rto_min = dst_metric_rtt(dst, RTAX_RTO_MIN);
  	return rto_min;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
556
557
558
  /* Compute the actual receive window we are currently advertising.
   * Rcv_nxt can be after the window if our peer push more data
   * than the offered window.
   */
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
559
  static inline u32 tcp_receive_window(const struct tcp_sock *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
560
561
562
563
564
565
566
567
568
569
570
571
  {
  	s32 win = tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt;
  
  	if (win < 0)
  		win = 0;
  	return (u32) win;
  }
  
  /* Choose a new window, without checks for shrinking, and without
   * scaling applied to the result.  The caller does these things
   * if necessary.  This is a "raw" window selection.
   */
53d3176b2   Changli Gao   net: cleanups
572
  extern u32 __tcp_select_window(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
574
575
  
  /* TCP timestamps are only 32-bits, this causes a slight
   * complication on 64-bit systems since we store a snapshot
31f342690   Stephen Hemminger   [TCP]: More spell...
576
577
   * of jiffies in the buffer control blocks below.  We decided
   * to use only the low 32-bits of jiffies and hide the ugly
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578
579
580
   * casts with the following macro.
   */
  #define tcp_time_stamp		((__u32)(jiffies))
a3433f35a   Changli Gao   tcp: unify tcp fl...
581
582
583
584
585
586
587
588
589
590
  #define tcp_flag_byte(th) (((u_int8_t *)th)[13])
  
  #define TCPHDR_FIN 0x01
  #define TCPHDR_SYN 0x02
  #define TCPHDR_RST 0x04
  #define TCPHDR_PSH 0x08
  #define TCPHDR_ACK 0x10
  #define TCPHDR_URG 0x20
  #define TCPHDR_ECE 0x40
  #define TCPHDR_CWR 0x80
caa20d9ab   Stephen Hemminger   [TCP]: spelling f...
591
  /* This is what the send packet queuing engine uses to pass
f86586fa4   Eric Dumazet   tcp: sizeof struc...
592
593
594
595
   * TCP per-packet control information to the transmission code.
   * We also store the host-order sequence numbers in here too.
   * This is 44 bytes if IPV6 is enabled.
   * If this grows please adjust skbuff.h:skbuff->cb[xxx] size appropriately.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
597
598
599
   */
  struct tcp_skb_cb {
  	union {
  		struct inet_skb_parm	h4;
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
600
  #if IS_ENABLED(CONFIG_IPV6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
601
602
603
604
605
606
  		struct inet6_skb_parm	h6;
  #endif
  	} header;	/* For incoming frames		*/
  	__u32		seq;		/* Starting sequence number	*/
  	__u32		end_seq;	/* SEQ + FIN + SYN + datalen	*/
  	__u32		when;		/* used to compute rtt's	*/
4de075e04   Eric Dumazet   tcp: rename tcp_s...
607
  	__u8		tcp_flags;	/* TCP header flags. (tcp[13])	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
609
610
611
612
  	__u8		sacked;		/* State flags for SACK/FACK.	*/
  #define TCPCB_SACKED_ACKED	0x01	/* SKB ACK'd by a SACK block	*/
  #define TCPCB_SACKED_RETRANS	0x02	/* SKB retransmitted		*/
  #define TCPCB_LOST		0x04	/* SKB is lost			*/
  #define TCPCB_TAGBITS		0x07	/* All tag bits			*/
b82d1bb4f   Eric Dumazet   tcp: unalias tcp_...
613
614
  	__u8		ip_dsfield;	/* IPv4 tos or IPv6 dsfield	*/
  	/* 1 byte hole */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
615
616
  #define TCPCB_EVER_RETRANS	0x80	/* Ever retransmitted frame	*/
  #define TCPCB_RETRANS		(TCPCB_SACKED_RETRANS|TCPCB_EVER_RETRANS)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
617
618
619
620
  	__u32		ack_seq;	/* Sequence number ACK'd	*/
  };
  
  #define TCP_SKB_CB(__skb)	((struct tcp_skb_cb *)&((__skb)->cb[0]))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621
622
623
624
625
  /* Due to TSO, an SKB can be composed of multiple actual
   * packets.  To keep these tracked properly, we use this.
   */
  static inline int tcp_skb_pcount(const struct sk_buff *skb)
  {
7967168ce   Herbert Xu   [NET]: Merge TSO/...
626
  	return skb_shinfo(skb)->gso_segs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627
628
629
630
631
  }
  
  /* This is valid iff tcp_skb_pcount() > 1. */
  static inline int tcp_skb_mss(const struct sk_buff *skb)
  {
7967168ce   Herbert Xu   [NET]: Merge TSO/...
632
  	return skb_shinfo(skb)->gso_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
  }
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
  /* Events passed to congestion control interface */
  enum tcp_ca_event {
  	CA_EVENT_TX_START,	/* first transmit when no packets in flight */
  	CA_EVENT_CWND_RESTART,	/* congestion window restart */
  	CA_EVENT_COMPLETE_CWR,	/* end of congestion recovery */
  	CA_EVENT_FRTO,		/* fast recovery timeout */
  	CA_EVENT_LOSS,		/* loss timeout */
  	CA_EVENT_FAST_ACK,	/* in sequence ack */
  	CA_EVENT_SLOW_ACK,	/* other ack */
  };
  
  /*
   * Interface for adding new TCP congestion control handlers
   */
  #define TCP_CA_NAME_MAX	16
3ff825b28   Stephen Hemminger   [TCP]: Add tcp_av...
649
650
  #define TCP_CA_MAX	128
  #define TCP_CA_BUF_MAX	(TCP_CA_NAME_MAX*TCP_CA_MAX)
164891aad   Stephen Hemminger   [TCP]: Congestion...
651
652
  #define TCP_CONG_NON_RESTRICTED 0x1
  #define TCP_CONG_RTT_STAMP	0x2
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
653
654
  struct tcp_congestion_ops {
  	struct list_head	list;
164891aad   Stephen Hemminger   [TCP]: Congestion...
655
  	unsigned long flags;
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
656
657
  
  	/* initialize private data (optional) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
658
  	void (*init)(struct sock *sk);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
659
  	/* cleanup private data  (optional) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
660
  	void (*release)(struct sock *sk);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
661
662
  
  	/* return slow start threshold (required) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
663
  	u32 (*ssthresh)(struct sock *sk);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
664
  	/* lower bound for congestion window (optional) */
72dc5b922   Stephen Hemminger   [TCP]: Minimum co...
665
  	u32 (*min_cwnd)(const struct sock *sk);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
666
  	/* do new cwnd calculation (required) */
c3a05c605   Ilpo Järvinen   [TCP]: Cong.ctrl ...
667
  	void (*cong_avoid)(struct sock *sk, u32 ack, u32 in_flight);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
668
  	/* call before changing ca_state (optional) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
669
  	void (*set_state)(struct sock *sk, u8 new_state);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
670
  	/* call when cwnd event occurs (optional) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
671
  	void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
672
  	/* new value of cwnd after loss (optional) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
673
  	u32  (*undo_cwnd)(struct sock *sk);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
674
  	/* hook for packet ack accounting (optional) */
30cfd0baf   Stephen Hemminger   [TCP]: congestion...
675
  	void (*pkts_acked)(struct sock *sk, u32 num_acked, s32 rtt_us);
73c1f4a03   Arnaldo Carvalho de Melo   [TCPDIAG]: Just r...
676
  	/* get info for inet_diag (optional) */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
677
  	void (*get_info)(struct sock *sk, u32 ext, struct sk_buff *skb);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
678
679
680
681
682
683
684
  
  	char 		name[TCP_CA_NAME_MAX];
  	struct module 	*owner;
  };
  
  extern int tcp_register_congestion_control(struct tcp_congestion_ops *type);
  extern void tcp_unregister_congestion_control(struct tcp_congestion_ops *type);
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
685
686
  extern void tcp_init_congestion_control(struct sock *sk);
  extern void tcp_cleanup_congestion_control(struct sock *sk);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
687
688
  extern int tcp_set_default_congestion_control(const char *name);
  extern void tcp_get_default_congestion_control(char *name);
3ff825b28   Stephen Hemminger   [TCP]: Add tcp_av...
689
  extern void tcp_get_available_congestion_control(char *buf, size_t len);
ce7bc3bf1   Stephen Hemminger   [TCP]: Restrict c...
690
691
  extern void tcp_get_allowed_congestion_control(char *buf, size_t len);
  extern int tcp_set_allowed_congestion_control(char *allowed);
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
692
  extern int tcp_set_congestion_control(struct sock *sk, const char *name);
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
693
  extern void tcp_slow_start(struct tcp_sock *tp);
758ce5c8d   Ilpo Järvinen   tcp: add helper f...
694
  extern void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
695

5f8ef48d2   Stephen Hemminger   [TCP]: Allow choo...
696
  extern struct tcp_congestion_ops tcp_init_congestion_ops;
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
697
  extern u32 tcp_reno_ssthresh(struct sock *sk);
c3a05c605   Ilpo Järvinen   [TCP]: Cong.ctrl ...
698
  extern void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 in_flight);
72dc5b922   Stephen Hemminger   [TCP]: Minimum co...
699
  extern u32 tcp_reno_min_cwnd(const struct sock *sk);
a8acfbac7   David S. Miller   [TCP]: Need to de...
700
  extern struct tcp_congestion_ops tcp_reno;
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
701

6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
702
  static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state)
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
703
  {
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
704
705
706
707
708
  	struct inet_connection_sock *icsk = inet_csk(sk);
  
  	if (icsk->icsk_ca_ops->set_state)
  		icsk->icsk_ca_ops->set_state(sk, ca_state);
  	icsk->icsk_ca_state = ca_state;
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
709
  }
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
710
  static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
711
  {
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
712
713
714
715
  	const struct inet_connection_sock *icsk = inet_csk(sk);
  
  	if (icsk->icsk_ca_ops->cwnd_event)
  		icsk->icsk_ca_ops->cwnd_event(sk, event);
317a76f9a   Stephen Hemminger   [TCP]: Add plugga...
716
  }
e60402d0a   Ilpo Järvinen   [TCP]: Move sack_...
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
  /* These functions determine how the current flow behaves in respect of SACK
   * handling. SACK is negotiated with the peer, and therefore it can vary
   * between different flows.
   *
   * tcp_is_sack - SACK enabled
   * tcp_is_reno - No SACK
   * tcp_is_fack - FACK enabled, implies SACK enabled
   */
  static inline int tcp_is_sack(const struct tcp_sock *tp)
  {
  	return tp->rx_opt.sack_ok;
  }
  
  static inline int tcp_is_reno(const struct tcp_sock *tp)
  {
  	return !tcp_is_sack(tp);
  }
  
  static inline int tcp_is_fack(const struct tcp_sock *tp)
  {
ab56222a3   Vijay Subramanian   tcp: Replace cons...
737
  	return tp->rx_opt.sack_ok & TCP_FACK_ENABLED;
e60402d0a   Ilpo Järvinen   [TCP]: Move sack_...
738
739
740
741
  }
  
  static inline void tcp_enable_fack(struct tcp_sock *tp)
  {
ab56222a3   Vijay Subramanian   tcp: Replace cons...
742
  	tp->rx_opt.sack_ok |= TCP_FACK_ENABLED;
e60402d0a   Ilpo Järvinen   [TCP]: Move sack_...
743
  }
83ae40885   Ilpo Järvinen   [TCP]: Add tcp_le...
744
745
746
747
  static inline unsigned int tcp_left_out(const struct tcp_sock *tp)
  {
  	return tp->sacked_out + tp->lost_out;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
749
750
751
752
753
754
755
756
757
758
759
760
761
  /* This determines how many packets are "in the network" to the best
   * of our knowledge.  In many cases it is conservative, but where
   * detailed information is available from the receiver (via SACK
   * blocks etc.) we can make more aggressive calculations.
   *
   * Use this for decisions involving congestion control, use just
   * tp->packets_out to determine if the send queue is empty or not.
   *
   * Read this equation as:
   *
   *	"Packets sent once on transmission queue" MINUS
   *	"Packets left network, but not honestly ACKed yet" PLUS
   *	"Packets fast retransmitted"
   */
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
762
  static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
763
  {
83ae40885   Ilpo Järvinen   [TCP]: Add tcp_le...
764
  	return tp->packets_out - tcp_left_out(tp) + tp->retrans_out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
765
  }
0b6a05c1d   Ilpo Järvinen   tcp: fix ssthresh...
766
767
768
769
770
771
  #define TCP_INFINITE_SSTHRESH	0x7fffffff
  
  static inline bool tcp_in_initial_slowstart(const struct tcp_sock *tp)
  {
  	return tp->snd_ssthresh >= TCP_INFINITE_SSTHRESH;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
774
775
  /* If cwnd > ssthresh, we may raise ssthresh to be half-way to cwnd.
   * The exception is rate halving phase, when cwnd is decreasing towards
   * ssthresh.
   */
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
776
  static inline __u32 tcp_current_ssthresh(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
  {
6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
778
  	const struct tcp_sock *tp = tcp_sk(sk);
cf533ea53   Eric Dumazet   tcp: add const qu...
779

6687e988d   Arnaldo Carvalho de Melo   [ICSK]: Move TCP ...
780
  	if ((1 << inet_csk(sk)->icsk_ca_state) & (TCPF_CA_CWR | TCPF_CA_Recovery))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
781
782
783
784
785
786
  		return tp->snd_ssthresh;
  	else
  		return max(tp->snd_ssthresh,
  			   ((tp->snd_cwnd >> 1) +
  			    (tp->snd_cwnd >> 2)));
  }
b9c4595bc   Ilpo Järvinen   [TCP]: Don't pani...
787
788
  /* Use define here intentionally to get WARN_ON location shown at the caller */
  #define tcp_verify_left_out(tp)	WARN_ON(tcp_left_out(tp) > tp->packets_out)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789

3cfe3baaf   Ilpo Järvinen   [TCP]: Add two ne...
790
  extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh);
cf533ea53   Eric Dumazet   tcp: add const qu...
791
  extern __u32 tcp_init_cwnd(const struct tcp_sock *tp, const struct dst_entry *dst);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792

6b5a5c0db   Neal Cardwell   tcp: do not scale...
793
794
795
796
797
798
799
  /* The maximum number of MSS of available cwnd for which TSO defers
   * sending if not using sysctl_tcp_tso_win_divisor.
   */
  static inline __u32 tcp_max_tso_deferred_mss(const struct tcp_sock *tp)
  {
  	return 3;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
800
  /* Slow start with delack produces 3 packets of burst, so that
dd9e0dda6   John Heffner   [TCP]: Increase t...
801
802
803
804
   * it is safe "de facto".  This will be the default - same as
   * the default reordering threshold - but if reordering increases,
   * we must be able to allow cwnd to burst at least this much in order
   * to not pull it back when holes are filled.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
805
806
807
   */
  static __inline__ __u32 tcp_max_burst(const struct tcp_sock *tp)
  {
dd9e0dda6   John Heffner   [TCP]: Increase t...
808
  	return tp->reordering;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
809
  }
90840defa   Ilpo Järvinen   [TCP]: Introduce ...
810
811
812
813
814
  /* Returns end sequence number of the receiver's advertised window */
  static inline u32 tcp_wnd_end(const struct tcp_sock *tp)
  {
  	return tp->snd_una + tp->snd_wnd;
  }
cea14e0ed   Ilpo Järvinen   [TCP]: Uninline t...
815
  extern int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight);
f4805eded   Stephen Hemminger   [TCP]: fix conges...
816

c1bd24b76   Chuck Lever   [TCP]: Remove unn...
817
  static inline void tcp_minshall_update(struct tcp_sock *tp, unsigned int mss,
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
818
  				       const struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
819
820
821
822
  {
  	if (skb->len < mss)
  		tp->snd_sml = TCP_SKB_CB(skb)->end_seq;
  }
9e412ba76   Ilpo Järvinen   [TCP]: Sed magic ...
823
  static inline void tcp_check_probe_timer(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824
  {
cf533ea53   Eric Dumazet   tcp: add const qu...
825
  	const struct tcp_sock *tp = tcp_sk(sk);
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
826
  	const struct inet_connection_sock *icsk = inet_csk(sk);
9e412ba76   Ilpo Järvinen   [TCP]: Sed magic ...
827

463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
828
  	if (!tp->packets_out && !icsk->icsk_pending)
3f421baa4   Arnaldo Carvalho de Melo   [NET]: Just move ...
829
830
  		inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
  					  icsk->icsk_rto, TCP_RTO_MAX);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
831
  }
ee7537b63   Hantzis Fotis   tcp: tcp_init_wl ...
832
  static inline void tcp_init_wl(struct tcp_sock *tp, u32 seq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
833
834
835
  {
  	tp->snd_wl1 = seq;
  }
ee7537b63   Hantzis Fotis   tcp: tcp_init_wl ...
836
  static inline void tcp_update_wl(struct tcp_sock *tp, u32 seq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
837
838
839
  {
  	tp->snd_wl1 = seq;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
840
841
842
  /*
   * Calculate(/check) TCP checksum
   */
ba7808eac   Frederik Deweerdt   [TCP]: remove tcp...
843
844
  static inline __sum16 tcp_v4_check(int len, __be32 saddr,
  				   __be32 daddr, __wsum base)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
846
847
  {
  	return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
  }
b51655b95   Al Viro   [NET]: Annotate _...
848
  static inline __sum16 __tcp_checksum_complete(struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849
  {
fb286bb29   Herbert Xu   [NET]: Detect har...
850
  	return __skb_checksum_complete(skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
851
  }
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
852
  static inline int tcp_checksum_complete(struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853
  {
604763722   Herbert Xu   [NET]: Treat CHEC...
854
  	return !skb_csum_unnecessary(skb) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
855
856
857
858
  		__tcp_checksum_complete(skb);
  }
  
  /* Prequeue for VJ style copy to user, combined with checksumming. */
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
859
  static inline void tcp_prequeue_init(struct tcp_sock *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
860
861
862
863
864
  {
  	tp->ucopy.task = NULL;
  	tp->ucopy.len = 0;
  	tp->ucopy.memory = 0;
  	skb_queue_head_init(&tp->ucopy.prequeue);
97fc2f084   Chris Leech   [I/OAT]: Structur...
865
866
867
868
869
870
  #ifdef CONFIG_NET_DMA
  	tp->ucopy.dma_chan = NULL;
  	tp->ucopy.wakeup = 0;
  	tp->ucopy.pinned_list = NULL;
  	tp->ucopy.dma_cookie = 0;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871
872
873
874
875
876
877
878
879
880
  }
  
  /* Packet is added to VJ-style prequeue for processing in process
   * context, if a reader task is waiting. Apparently, this exciting
   * idea (VJ's mail "Re: query about TCP header on tcp-ip" of 07 Sep 93)
   * failed somewhere. Latency? Burstiness? Well, at least now we will
   * see, why it failed. 8)8)				  --ANK
   *
   * NOTE: is this not too big to inline?
   */
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
881
  static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
883
  {
  	struct tcp_sock *tp = tcp_sk(sk);
f5f8d86b2   Eric Dumazet   tcp: tcp_prequeue...
884
885
886
887
888
889
890
891
892
893
894
895
896
897
  	if (sysctl_tcp_low_latency || !tp->ucopy.task)
  		return 0;
  
  	__skb_queue_tail(&tp->ucopy.prequeue, skb);
  	tp->ucopy.memory += skb->truesize;
  	if (tp->ucopy.memory > sk->sk_rcvbuf) {
  		struct sk_buff *skb1;
  
  		BUG_ON(sock_owned_by_user(sk));
  
  		while ((skb1 = __skb_dequeue(&tp->ucopy.prequeue)) != NULL) {
  			sk_backlog_rcv(sk, skb1);
  			NET_INC_STATS_BH(sock_net(sk),
  					 LINUX_MIB_TCPPREQUEUEDROPPED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
898
  		}
f5f8d86b2   Eric Dumazet   tcp: tcp_prequeue...
899
900
901
  
  		tp->ucopy.memory = 0;
  	} else if (skb_queue_len(&tp->ucopy.prequeue) == 1) {
aa3951451   Eric Dumazet   net: sk_sleep() h...
902
  		wake_up_interruptible_sync_poll(sk_sleep(sk),
7aedec2ad   Eric Dumazet   tcp: tcp_prequeue...
903
  					   POLLIN | POLLRDNORM | POLLRDBAND);
f5f8d86b2   Eric Dumazet   tcp: tcp_prequeue...
904
905
  		if (!inet_csk_ack_scheduled(sk))
  			inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK,
22f6dacdf   David S. Miller   Merge branch 'mas...
906
  						  (3 * tcp_rto_min(sk)) / 4,
f5f8d86b2   Eric Dumazet   tcp: tcp_prequeue...
907
  						  TCP_RTO_MAX);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
  	}
f5f8d86b2   Eric Dumazet   tcp: tcp_prequeue...
909
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
910
911
912
913
914
915
916
917
918
919
920
921
  }
  
  
  #undef STATE_TRACE
  
  #ifdef STATE_TRACE
  static const char *statename[]={
  	"Unused","Established","Syn Sent","Syn Recv",
  	"Fin Wait 1","Fin Wait 2","Time Wait", "Close",
  	"Close Wait","Last ACK","Listen","Closing"
  };
  #endif
490d50469   Ilpo Järvinen   [TCP]: Uninline t...
922
  extern void tcp_set_state(struct sock *sk, int state);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923

4ac02bab7   Andi Kleen   [TCP]: Uninline t...
924
  extern void tcp_done(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925

40efc6fa1   Stephen Hemminger   [TCP]: less inline's
926
  static inline void tcp_sack_reset(struct tcp_options_received *rx_opt)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927
928
  {
  	rx_opt->dsack = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
930
  	rx_opt->num_sacks = 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
931
932
933
  /* Determine a window scaling and initial window to offer. */
  extern void tcp_select_initial_window(int __space, __u32 mss,
  				      __u32 *rcv_wnd, __u32 *window_clamp,
31d12926e   laurent chavey   net: Add rtnetlin...
934
935
  				      int wscale_ok, __u8 *rcv_wscale,
  				      __u32 init_rcv_wnd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
  
  static inline int tcp_win_from_space(int space)
  {
  	return sysctl_tcp_adv_win_scale<=0 ?
  		(space>>(-sysctl_tcp_adv_win_scale)) :
  		space - (space>>sysctl_tcp_adv_win_scale);
  }
  
  /* Note: caller must be prepared to deal with negative returns */ 
  static inline int tcp_space(const struct sock *sk)
  {
  	return tcp_win_from_space(sk->sk_rcvbuf -
  				  atomic_read(&sk->sk_rmem_alloc));
  } 
  
  static inline int tcp_full_space(const struct sock *sk)
  {
  	return tcp_win_from_space(sk->sk_rcvbuf); 
  }
40efc6fa1   Stephen Hemminger   [TCP]: less inline's
955
956
957
  static inline void tcp_openreq_init(struct request_sock *req,
  				    struct tcp_options_received *rx_opt,
  				    struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
  {
2e6599cb8   Arnaldo Carvalho de Melo   [NET] Generalise ...
959
  	struct inet_request_sock *ireq = inet_rsk(req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
  	req->rcv_wnd = 0;		/* So that tcp_send_synack() knows! */
4dfc28170   Florian Westphal   [Syncookies]: Add...
961
  	req->cookie_ts = 0;
2e6599cb8   Arnaldo Carvalho de Melo   [NET] Generalise ...
962
  	tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
964
  	req->mss = rx_opt->mss_clamp;
  	req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0;
2e6599cb8   Arnaldo Carvalho de Melo   [NET] Generalise ...
965
966
967
968
969
970
  	ireq->tstamp_ok = rx_opt->tstamp_ok;
  	ireq->sack_ok = rx_opt->sack_ok;
  	ireq->snd_wscale = rx_opt->snd_wscale;
  	ireq->wscale_ok = rx_opt->wscale_ok;
  	ireq->acked = 0;
  	ireq->ecn_ok = 0;
aa8223c7b   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
971
  	ireq->rmt_port = tcp_hdr(skb)->source;
a3116ac5c   KOVACS Krisztian   tcp: Port redirec...
972
  	ireq->loc_port = tcp_hdr(skb)->dest;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
  }
5c52ba170   Pavel Emelyanov   sock: add net to ...
974
  extern void tcp_enter_memory_pressure(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
976
977
978
979
980
981
982
983
984
  static inline int keepalive_intvl_when(const struct tcp_sock *tp)
  {
  	return tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl;
  }
  
  static inline int keepalive_time_when(const struct tcp_sock *tp)
  {
  	return tp->keepalive_time ? : sysctl_tcp_keepalive_time;
  }
df19a6267   Eric Dumazet   tcp: keepalive cl...
985
986
987
988
  static inline int keepalive_probes(const struct tcp_sock *tp)
  {
  	return tp->keepalive_probes ? : sysctl_tcp_keepalive_probes;
  }
6c37e5de4   Flavio Leitner   TCP: avoid to sen...
989
990
991
992
993
994
995
  static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp)
  {
  	const struct inet_connection_sock *icsk = &tp->inet_conn;
  
  	return min_t(u32, tcp_time_stamp - icsk->icsk_ack.lrcvtime,
  			  tcp_time_stamp - tp->rcv_tstamp);
  }
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
996
  static inline int tcp_fin_time(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
997
  {
463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
998
999
  	int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout;
  	const int rto = inet_csk(sk)->icsk_rto;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000

463c84b97   Arnaldo Carvalho de Melo   [NET]: Introduce ...
1001
1002
  	if (fin_timeout < (rto << 2) - (rto >> 1))
  		fin_timeout = (rto << 2) - (rto >> 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1003
1004
1005
  
  	return fin_timeout;
  }
c887e6d2d   Ilpo Järvinen   tcp: consolidate ...
1006
1007
  static inline int tcp_paws_check(const struct tcp_options_received *rx_opt,
  				 int paws_win)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1008
  {
c887e6d2d   Ilpo Järvinen   tcp: consolidate ...
1009
1010
1011
1012
  	if ((s32)(rx_opt->ts_recent - rx_opt->rcv_tsval) <= paws_win)
  		return 1;
  	if (unlikely(get_seconds() >= rx_opt->ts_recent_stamp + TCP_PAWS_24DAYS))
  		return 1;
bc2ce894e   Eric Dumazet   tcp: relax tcp_pa...
1013
1014
1015
1016
1017
1018
1019
  	/*
  	 * Some OSes send SYN and SYNACK messages with tsval=0 tsecr=0,
  	 * then following tcp messages have valid values. Ignore 0 value,
  	 * or else 'negative' tsval might forbid us to accept their packets.
  	 */
  	if (!rx_opt->ts_recent)
  		return 1;
c887e6d2d   Ilpo Järvinen   tcp: consolidate ...
1020
1021
1022
1023
1024
1025
1026
  	return 0;
  }
  
  static inline int tcp_paws_reject(const struct tcp_options_received *rx_opt,
  				  int rst)
  {
  	if (tcp_paws_check(rx_opt, 0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
  		return 0;
  
  	/* RST segments are not recommended to carry timestamp,
  	   and, if they do, it is recommended to ignore PAWS because
  	   "their cleanup function should take precedence over timestamps."
  	   Certainly, it is mistake. It is necessary to understand the reasons
  	   of this constraint to relax it: if peer reboots, clock may go
  	   out-of-sync and half-open connections will not be reset.
  	   Actually, the problem would be not existing if all
  	   the implementations followed draft about maintaining clock
  	   via reboots. Linux-2.2 DOES NOT!
  
  	   However, we can relax time bounds for RST segments to MSL.
  	 */
9d729f72d   James Morris   [NET]: Convert xt...
1041
  	if (rst && get_seconds() >= rx_opt->ts_recent_stamp + TCP_PAWS_MSL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1042
1043
1044
  		return 0;
  	return 1;
  }
a9c19329e   Pavel Emelyanov   tcp: add net to t...
1045
  static inline void tcp_mib_init(struct net *net)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1046
1047
  {
  	/* See RFC 2012 */
cf1100a7a   Pavel Emelyanov   mib: add net to T...
1048
1049
1050
1051
  	TCP_ADD_STATS_USER(net, TCP_MIB_RTOALGORITHM, 1);
  	TCP_ADD_STATS_USER(net, TCP_MIB_RTOMIN, TCP_RTO_MIN*1000/HZ);
  	TCP_ADD_STATS_USER(net, TCP_MIB_RTOMAX, TCP_RTO_MAX*1000/HZ);
  	TCP_ADD_STATS_USER(net, TCP_MIB_MAXCONN, -1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052
  }
5af4ec236   Ilpo Järvinen   [TCP]: clear_all_...
1053
  /* from STCP */
ef9da47c7   Ilpo Järvinen   tcp: don't clear ...
1054
  static inline void tcp_clear_retrans_hints_partial(struct tcp_sock *tp)
0800f1702   David S. Miller   [TCP]: Minor codi...
1055
  {
6a438bbe6   Stephen Hemminger   [TCP]: speed up S...
1056
1057
  	tp->lost_skb_hint = NULL;
  	tp->scoreboard_skb_hint = NULL;
ef9da47c7   Ilpo Järvinen   tcp: don't clear ...
1058
1059
1060
1061
1062
  }
  
  static inline void tcp_clear_all_retrans_hints(struct tcp_sock *tp)
  {
  	tcp_clear_retrans_hints_partial(tp);
6a438bbe6   Stephen Hemminger   [TCP]: speed up S...
1063
  	tp->retransmit_skb_hint = NULL;
b76892051   Ilpo Järvinen   [TCP]: Avoid clea...
1064
  }
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
  /* MD5 Signature */
  struct crypto_hash;
  
  /* - key database */
  struct tcp_md5sig_key {
  	u8			*key;
  	u8			keylen;
  };
  
  struct tcp4_md5sig_key {
f8ab18d2d   David S. Miller   [TCP]: Fix MD5 si...
1075
  	struct tcp_md5sig_key	base;
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1076
1077
1078
1079
  	__be32			addr;
  };
  
  struct tcp6_md5sig_key {
f8ab18d2d   David S. Miller   [TCP]: Fix MD5 si...
1080
  	struct tcp_md5sig_key	base;
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1081
1082
1083
1084
1085
1086
1087
1088
1089
  #if 0
  	u32			scope_id;	/* XXX */
  #endif
  	struct in6_addr		addr;
  };
  
  /* - sock block */
  struct tcp_md5sig_info {
  	struct tcp4_md5sig_key	*keys4;
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
1090
  #if IS_ENABLED(CONFIG_IPV6)
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  	struct tcp6_md5sig_key	*keys6;
  	u32			entries6;
  	u32			alloced6;
  #endif
  	u32			entries4;
  	u32			alloced4;
  };
  
  /* - pseudo header */
  struct tcp4_pseudohdr {
  	__be32		saddr;
  	__be32		daddr;
  	__u8		pad;
  	__u8		protocol;
  	__be16		len;
  };
  
  struct tcp6_pseudohdr {
  	struct in6_addr	saddr;
  	struct in6_addr daddr;
  	__be32		len;
  	__be32		protocol;	/* including padding */
  };
  
  union tcp_md5sum_block {
  	struct tcp4_pseudohdr ip4;
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
1117
  #if IS_ENABLED(CONFIG_IPV6)
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1118
1119
1120
1121
1122
1123
1124
1125
1126
  	struct tcp6_pseudohdr ip6;
  #endif
  };
  
  /* - pool: digest algorithm, hash description and scratch buffer */
  struct tcp_md5sig_pool {
  	struct hash_desc	md5_desc;
  	union tcp_md5sum_block	md5_blk;
  };
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1127
  /* - functions */
53d3176b2   Changli Gao   net: cleanups
1128
  extern int tcp_v4_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
318cf7aaa   Eric Dumazet   tcp: md5: add mor...
1129
1130
1131
  			       const struct sock *sk,
  			       const struct request_sock *req,
  			       const struct sk_buff *skb);
53d3176b2   Changli Gao   net: cleanups
1132
1133
1134
1135
1136
  extern struct tcp_md5sig_key * tcp_v4_md5_lookup(struct sock *sk,
  						 struct sock *addr_sk);
  extern int tcp_v4_md5_do_add(struct sock *sk, __be32 addr, u8 *newkey,
  			     u8 newkeylen);
  extern int tcp_v4_md5_do_del(struct sock *sk, __be32 addr);
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1137

9501f9722   YOSHIFUJI Hideaki   tcp md5sig: Let t...
1138
1139
1140
1141
1142
1143
1144
1145
1146
  #ifdef CONFIG_TCP_MD5SIG
  #define tcp_twsk_md5_key(twsk)	((twsk)->tw_md5_keylen ? 		 \
  				 &(struct tcp_md5sig_key) {		 \
  					.key = (twsk)->tw_md5_key,	 \
  					.keylen = (twsk)->tw_md5_keylen, \
  				} : NULL)
  #else
  #define tcp_twsk_md5_key(twsk)	NULL
  #endif
765cf9976   Eric Dumazet   tcp: md5: remove ...
1147
  extern struct tcp_md5sig_pool __percpu *tcp_alloc_md5sig_pool(struct sock *);
53d3176b2   Changli Gao   net: cleanups
1148
  extern void tcp_free_md5sig_pool(void);
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1149

35790c042   Eric Dumazet   tcp: fix MD5 (RFC...
1150
  extern struct tcp_md5sig_pool	*tcp_get_md5sig_pool(void);
53d3176b2   Changli Gao   net: cleanups
1151
  extern void tcp_put_md5sig_pool(void);
35790c042   Eric Dumazet   tcp: fix MD5 (RFC...
1152

ca35a0ef8   Eric Dumazet   tcp: md5: dont wr...
1153
  extern int tcp_md5_hash_header(struct tcp_md5sig_pool *, const struct tcphdr *);
cf533ea53   Eric Dumazet   tcp: add const qu...
1154
  extern int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *, const struct sk_buff *,
49a72dfb8   Adam Langley   tcp: Fix MD5 sign...
1155
1156
  				 unsigned header_len);
  extern int tcp_md5_hash_key(struct tcp_md5sig_pool *hp,
cf533ea53   Eric Dumazet   tcp: add const qu...
1157
  			    const struct tcp_md5sig_key *key);
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1158

fe067e8ab   David S. Miller   [TCP]: Abstract o...
1159
1160
1161
1162
1163
1164
  /* write queue abstraction */
  static inline void tcp_write_queue_purge(struct sock *sk)
  {
  	struct sk_buff *skb;
  
  	while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL)
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1165
1166
  		sk_wmem_free_skb(sk, skb);
  	sk_mem_reclaim(sk);
8818a9d88   Ilpo Järvinen   tcp: clear hints ...
1167
  	tcp_clear_all_retrans_hints(tcp_sk(sk));
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1168
  }
cf533ea53   Eric Dumazet   tcp: add const qu...
1169
  static inline struct sk_buff *tcp_write_queue_head(const struct sock *sk)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1170
  {
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1171
  	return skb_peek(&sk->sk_write_queue);
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1172
  }
cf533ea53   Eric Dumazet   tcp: add const qu...
1173
  static inline struct sk_buff *tcp_write_queue_tail(const struct sock *sk)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1174
  {
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1175
  	return skb_peek_tail(&sk->sk_write_queue);
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1176
  }
cf533ea53   Eric Dumazet   tcp: add const qu...
1177
1178
  static inline struct sk_buff *tcp_write_queue_next(const struct sock *sk,
  						   const struct sk_buff *skb)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1179
  {
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1180
  	return skb_queue_next(&sk->sk_write_queue, skb);
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1181
  }
cf533ea53   Eric Dumazet   tcp: add const qu...
1182
1183
  static inline struct sk_buff *tcp_write_queue_prev(const struct sock *sk,
  						   const struct sk_buff *skb)
832d11c5c   Ilpo Järvinen   tcp: Try to resto...
1184
1185
1186
  {
  	return skb_queue_prev(&sk->sk_write_queue, skb);
  }
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1187
  #define tcp_for_write_queue(skb, sk)					\
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1188
  	skb_queue_walk(&(sk)->sk_write_queue, skb)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1189
1190
  
  #define tcp_for_write_queue_from(skb, sk)				\
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1191
  	skb_queue_walk_from(&(sk)->sk_write_queue, skb)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1192

234b68607   Ilpo Järvinen   [TCP]: Add tcp_fo...
1193
  #define tcp_for_write_queue_from_safe(skb, tmp, sk)			\
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1194
  	skb_queue_walk_from_safe(&(sk)->sk_write_queue, skb, tmp)
234b68607   Ilpo Järvinen   [TCP]: Add tcp_fo...
1195

cf533ea53   Eric Dumazet   tcp: add const qu...
1196
  static inline struct sk_buff *tcp_send_head(const struct sock *sk)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1197
1198
1199
  {
  	return sk->sk_send_head;
  }
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1200
1201
1202
1203
1204
  static inline bool tcp_skb_is_last(const struct sock *sk,
  				   const struct sk_buff *skb)
  {
  	return skb_queue_is_last(&sk->sk_write_queue, skb);
  }
cf533ea53   Eric Dumazet   tcp: add const qu...
1205
  static inline void tcp_advance_send_head(struct sock *sk, const struct sk_buff *skb)
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1206
  {
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1207
  	if (tcp_skb_is_last(sk, skb))
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1208
  		sk->sk_send_head = NULL;
cd07a8ea0   David S. Miller   tcp: Use SKB queu...
1209
1210
  	else
  		sk->sk_send_head = tcp_write_queue_next(sk, skb);
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
  }
  
  static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unlinked)
  {
  	if (sk->sk_send_head == skb_unlinked)
  		sk->sk_send_head = NULL;
  }
  
  static inline void tcp_init_send_head(struct sock *sk)
  {
  	sk->sk_send_head = NULL;
  }
  
  static inline void __tcp_add_write_queue_tail(struct sock *sk, struct sk_buff *skb)
  {
  	__skb_queue_tail(&sk->sk_write_queue, skb);
  }
  
  static inline void tcp_add_write_queue_tail(struct sock *sk, struct sk_buff *skb)
  {
  	__tcp_add_write_queue_tail(sk, skb);
  
  	/* Queue it, remembering where we must start sending. */
6859d4947   Ilpo Järvinen   [TCP]: Abstract t...
1234
  	if (sk->sk_send_head == NULL) {
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1235
  		sk->sk_send_head = skb;
6859d4947   Ilpo Järvinen   [TCP]: Abstract t...
1236
1237
1238
1239
  
  		if (tcp_sk(sk)->highest_sack == NULL)
  			tcp_sk(sk)->highest_sack = skb;
  	}
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
  }
  
  static inline void __tcp_add_write_queue_head(struct sock *sk, struct sk_buff *skb)
  {
  	__skb_queue_head(&sk->sk_write_queue, skb);
  }
  
  /* Insert buff after skb on the write queue of sk.  */
  static inline void tcp_insert_write_queue_after(struct sk_buff *skb,
  						struct sk_buff *buff,
  						struct sock *sk)
  {
7de6c0333   Gerrit Renker   [SKB]: __skb_appe...
1252
  	__skb_queue_after(&sk->sk_write_queue, skb, buff);
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1253
  }
43f59c893   David S. Miller   net: Remove __skb...
1254
  /* Insert new before skb on the write queue of sk.  */
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1255
1256
1257
1258
  static inline void tcp_insert_write_queue_before(struct sk_buff *new,
  						  struct sk_buff *skb,
  						  struct sock *sk)
  {
43f59c893   David S. Miller   net: Remove __skb...
1259
  	__skb_queue_before(&sk->sk_write_queue, skb, new);
6e4214100   Ilpo Järvinen   [TCP] MTUprobe: f...
1260
1261
1262
  
  	if (sk->sk_send_head == skb)
  		sk->sk_send_head = new;
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1263
1264
1265
1266
1267
1268
  }
  
  static inline void tcp_unlink_write_queue(struct sk_buff *skb, struct sock *sk)
  {
  	__skb_unlink(skb, &sk->sk_write_queue);
  }
fe067e8ab   David S. Miller   [TCP]: Abstract o...
1269
1270
1271
1272
  static inline int tcp_write_queue_empty(struct sock *sk)
  {
  	return skb_queue_empty(&sk->sk_write_queue);
  }
12d50c46d   Krishna Kumar   tcp: Remove check...
1273
1274
1275
1276
1277
1278
1279
1280
  static inline void tcp_push_pending_frames(struct sock *sk)
  {
  	if (tcp_send_head(sk)) {
  		struct tcp_sock *tp = tcp_sk(sk);
  
  		__tcp_push_pending_frames(sk, tcp_current_mss(sk), tp->nonagle);
  	}
  }
a47e5a988   Ilpo Järvinen   [TCP]: Convert hi...
1281
1282
1283
1284
1285
1286
1287
  /* Start sequence of the highest skb with SACKed bit, valid only if
   * sacked > 0 or when the caller has ensured validity by itself.
   */
  static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp)
  {
  	if (!tp->sacked_out)
  		return tp->snd_una;
6859d4947   Ilpo Järvinen   [TCP]: Abstract t...
1288
1289
1290
  
  	if (tp->highest_sack == NULL)
  		return tp->snd_nxt;
a47e5a988   Ilpo Järvinen   [TCP]: Convert hi...
1291
1292
  	return TCP_SKB_CB(tp->highest_sack)->seq;
  }
6859d4947   Ilpo Järvinen   [TCP]: Abstract t...
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
  static inline void tcp_advance_highest_sack(struct sock *sk, struct sk_buff *skb)
  {
  	tcp_sk(sk)->highest_sack = tcp_skb_is_last(sk, skb) ? NULL :
  						tcp_write_queue_next(sk, skb);
  }
  
  static inline struct sk_buff *tcp_highest_sack(struct sock *sk)
  {
  	return tcp_sk(sk)->highest_sack;
  }
  
  static inline void tcp_highest_sack_reset(struct sock *sk)
  {
  	tcp_sk(sk)->highest_sack = tcp_write_queue_head(sk);
  }
  
  /* Called when old skb is about to be deleted (to be combined with new skb) */
  static inline void tcp_highest_sack_combine(struct sock *sk,
  					    struct sk_buff *old,
  					    struct sk_buff *new)
  {
  	if (tcp_sk(sk)->sacked_out && (old == tcp_sk(sk)->highest_sack))
  		tcp_sk(sk)->highest_sack = new;
  }
5aa4b32fc   Andreas Petlund   net: TCP thin-str...
1317
1318
1319
1320
1321
1322
1323
  /* Determines whether this is a thin stream (which may suffer from
   * increased latency). Used to trigger latency-reducing mechanisms.
   */
  static inline unsigned int tcp_stream_is_thin(struct tcp_sock *tp)
  {
  	return tp->packets_out < 4 && !tcp_in_initial_slowstart(tp);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1324
1325
1326
1327
1328
1329
1330
  /* /proc */
  enum tcp_seq_states {
  	TCP_SEQ_STATE_LISTENING,
  	TCP_SEQ_STATE_OPENREQ,
  	TCP_SEQ_STATE_ESTABLISHED,
  	TCP_SEQ_STATE_TIME_WAIT,
  };
73cb88ecb   Arjan van de Ven   net: make the tcp...
1331
  int tcp_seq_open(struct inode *inode, struct file *file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
  struct tcp_seq_afinfo {
73cb88ecb   Arjan van de Ven   net: make the tcp...
1333
1334
1335
1336
  	char				*name;
  	sa_family_t			family;
  	const struct file_operations	*seq_fops;
  	struct seq_operations		seq_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1337
1338
1339
  };
  
  struct tcp_iter_state {
a4146b1b2   Denis V. Lunev   [TCP]: Replace st...
1340
  	struct seq_net_private	p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1341
1342
1343
  	sa_family_t		family;
  	enum tcp_seq_states	state;
  	struct sock		*syn_wait_sk;
a8b690f98   Tom Herbert   tcp: Fix slowness...
1344
1345
  	int			bucket, offset, sbucket, num, uid;
  	loff_t			last_pos;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1346
  };
6f8b13bcb   Daniel Lezcano   [NETNS][IPV6] tcp...
1347
1348
  extern int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo);
  extern void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1349

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1350
  extern struct request_sock_ops tcp_request_sock_ops;
c6aefafb7   Glenn Griffin   [TCP]: Add IPv6 s...
1351
  extern struct request_sock_ops tcp6_request_sock_ops;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1352

7d06b2e05   Brian Haley   net: change proto...
1353
  extern void tcp_v4_destroy_sock(struct sock *sk);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1354

a430a43d0   Herbert Xu   [NET] gso: Fix up...
1355
  extern int tcp_v4_gso_send_check(struct sk_buff *skb);
c8f44affb   Michał Mirosław   net: introduce an...
1356
1357
  extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
  				       netdev_features_t features);
bf296b125   Herbert Xu   tcp: Add GRO support
1358
1359
1360
1361
1362
1363
  extern struct sk_buff **tcp_gro_receive(struct sk_buff **head,
  					struct sk_buff *skb);
  extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head,
  					 struct sk_buff *skb);
  extern int tcp_gro_complete(struct sk_buff *skb);
  extern int tcp4_gro_complete(struct sk_buff *skb);
f4c50d990   Herbert Xu   [NET]: Add softwa...
1364

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1365
  #ifdef CONFIG_PROC_FS
53d3176b2   Changli Gao   net: cleanups
1366
  extern int tcp4_proc_init(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1367
1368
  extern void tcp4_proc_exit(void);
  #endif
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1369
1370
1371
1372
1373
1374
1375
  /* TCP af-specific functions */
  struct tcp_sock_af_ops {
  #ifdef CONFIG_TCP_MD5SIG
  	struct tcp_md5sig_key	*(*md5_lookup) (struct sock *sk,
  						struct sock *addr_sk);
  	int			(*calc_md5_hash) (char *location,
  						  struct tcp_md5sig_key *md5,
318cf7aaa   Eric Dumazet   tcp: md5: add mor...
1376
1377
1378
  						  const struct sock *sk,
  						  const struct request_sock *req,
  						  const struct sk_buff *skb);
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
  	int			(*md5_add) (struct sock *sk,
  					    struct sock *addr_sk,
  					    u8 *newkey,
  					    u8 len);
  	int			(*md5_parse) (struct sock *sk,
  					      char __user *optval,
  					      int optlen);
  #endif
  };
  
  struct tcp_request_sock_ops {
  #ifdef CONFIG_TCP_MD5SIG
  	struct tcp_md5sig_key	*(*md5_lookup) (struct sock *sk,
  						struct request_sock *req);
e3afe7b75   John Dykstra   tcp: Fix MD5 sign...
1393
1394
  	int			(*calc_md5_hash) (char *location,
  						  struct tcp_md5sig_key *md5,
318cf7aaa   Eric Dumazet   tcp: md5: add mor...
1395
1396
1397
  						  const struct sock *sk,
  						  const struct request_sock *req,
  						  const struct sk_buff *skb);
cfb6eeb4c   YOSHIFUJI Hideaki   [TCP]: MD5 Signat...
1398
1399
  #endif
  };
da5c78c82   William Allen Simpson   TCPCT part 1b: ge...
1400
1401
1402
1403
1404
1405
1406
  /* Using SHA1 for now, define some constants.
   */
  #define COOKIE_DIGEST_WORDS (SHA_DIGEST_WORDS)
  #define COOKIE_MESSAGE_WORDS (SHA_MESSAGE_BYTES / 4)
  #define COOKIE_WORKSPACE_WORDS (COOKIE_DIGEST_WORDS + COOKIE_MESSAGE_WORDS)
  
  extern int tcp_cookie_generator(u32 *bakery);
435cf559f   William Allen Simpson   TCPCT part 1d: de...
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
  /**
   *	struct tcp_cookie_values - each socket needs extra space for the
   *	cookies, together with (optional) space for any SYN data.
   *
   *	A tcp_sock contains a pointer to the current value, and this is
   *	cloned to the tcp_timewait_sock.
   *
   * @cookie_pair:	variable data from the option exchange.
   *
   * @cookie_desired:	user specified tcpct_cookie_desired.  Zero
   *			indicates default (sysctl_tcp_cookie_size).
   *			After cookie sent, remembers size of cookie.
   *			Range 0, TCP_COOKIE_MIN to TCP_COOKIE_MAX.
   *
   * @s_data_desired:	user specified tcpct_s_data_desired.  When the
   *			constant payload is specified (@s_data_constant),
   *			holds its length instead.
   *			Range 0 to TCP_MSS_DESIRED.
   *
   * @s_data_payload:	constant data that is to be included in the
   *			payload of SYN or SYNACK segments when the
   *			cookie option is present.
   */
  struct tcp_cookie_values {
  	struct kref	kref;
  	u8		cookie_pair[TCP_COOKIE_PAIR_SIZE];
  	u8		cookie_pair_size;
  	u8		cookie_desired;
  	u16		s_data_desired:11,
  			s_data_constant:1,
  			s_data_in:1,
  			s_data_out:1,
  			s_data_unused:2;
  	u8		s_data_payload[0];
  };
  
  static inline void tcp_cookie_values_release(struct kref *kref)
  {
  	kfree(container_of(kref, struct tcp_cookie_values, kref));
  }
  
  /* The length of constant payload data.  Note that s_data_desired is
   * overloaded, depending on s_data_constant: either the length of constant
   * data (returned here) or the limit on variable data.
   */
  static inline int tcp_s_data_size(const struct tcp_sock *tp)
  {
  	return (tp->cookie_values != NULL && tp->cookie_values->s_data_constant)
  		? tp->cookie_values->s_data_desired
  		: 0;
  }
  
  /**
   *	struct tcp_extend_values - tcp_ipv?.c to tcp_output.c workspace.
   *
   *	As tcp_request_sock has already been extended in other places, the
   *	only remaining method is to pass stack values along as function
   *	parameters.  These parameters are not needed after sending SYNACK.
   *
   * @cookie_bakery:	cryptographic secret and message workspace.
   *
   * @cookie_plus:	bytes in authenticator/cookie option, copied from
   *			struct tcp_options_received (above).
   */
  struct tcp_extend_values {
  	struct request_values		rv;
  	u32				cookie_bakery[COOKIE_WORKSPACE_WORDS];
  	u8				cookie_plus:6,
  					cookie_out_never:1,
  					cookie_in_always:1;
  };
  
  static inline struct tcp_extend_values *tcp_xv(struct request_values *rvp)
  {
  	return (struct tcp_extend_values *)rvp;
  }
9b0f976f2   Denis V. Lunev   [INET]: Remove st...
1483
  extern void tcp_v4_init(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1484
  extern void tcp_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1485
  #endif	/* _TCP_H */