This source file includes following definitions.
- before
- after
- between
- min
- max
- tcp_init_seq
- tcp_raise_window
- tcp_select_window
- tcp_connected
- tcp_check
- tcp_set_state
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #ifndef _TCP_H
19 #define _TCP_H
20
21 #include <linux/tcp.h>
22 #include <net/checksum.h>
23
24 #define MAX_SYN_SIZE 44 + MAX_HEADER + 15
25 #define MAX_FIN_SIZE 40 + MAX_HEADER + 15
26 #define MAX_ACK_SIZE 40 + MAX_HEADER + 15
27 #define MAX_RESET_SIZE 40 + MAX_HEADER + 15
28 #define MAX_WINDOW 32767
29
30
31 #define MIN_WINDOW 2048
32 #define MAX_ACK_BACKLOG 2
33 #define MIN_WRITE_SPACE 2048
34 #define TCP_WINDOW_DIFF 2048
35
36
37 #define URG_VALID 0x0100
38 #define URG_NOTYET 0x0200
39 #define URG_READ 0x0400
40
41 #define TCP_RETR1 7
42
43
44
45
46
47 #define TCP_RETR2 15
48
49
50
51
52 #define TCP_TIMEOUT_LEN (15*60*HZ)
53 #define TCP_TIMEWAIT_LEN (60*HZ)
54
55 #define TCP_FIN_TIMEOUT (3*60*HZ)
56 #define TCP_ACK_TIME (3*HZ)
57 #define TCP_DONE_TIME (5*HZ/2)
58
59 #define TCP_WRITE_TIME (30*HZ)
60
61 #define TCP_TIMEOUT_INIT (3*HZ)
62 #define TCP_SYN_RETRIES 10
63
64 #define TCP_PROBEWAIT_LEN (1*HZ)
65
66
67
68 #define TCP_NO_CHECK 0
69
70
71
72
73
74
75
76 #define TCPOPT_NOP 1
77 #define TCPOPT_EOL 0
78 #define TCPOPT_MSS 2
79
80
81
82 #define TCPOPT_WINDOW 3
83 #define TCPOPT_TIMESTAMP 8
84
85
86
87
88
89
90
91 extern __inline int before(__u32 seq1, __u32 seq2)
92 {
93 return (__s32)(seq1-seq2) < 0;
94 }
95
96 extern __inline int after(__u32 seq1, __u32 seq2)
97 {
98 return (__s32)(seq2-seq1) < 0;
99 }
100
101
102
103 extern __inline int between(__u32 seq1, __u32 seq2, __u32 seq3)
104 {
105 return (after(seq1+1, seq2) && before(seq1, seq3+1));
106 }
107
108 static __inline__ int min(unsigned int a, unsigned int b)
109 {
110 if (a > b)
111 a = b;
112 return a;
113 }
114
115 static __inline__ int max(unsigned int a, unsigned int b)
116 {
117 if (a < b)
118 a = b;
119 return a;
120 }
121
122 extern struct proto tcp_prot;
123 extern struct tcp_mib tcp_statistics;
124 extern struct wait_queue *master_select_wakeup;
125
126 extern void tcp_err(int type, int code, unsigned char *header, __u32 daddr,
127 __u32, struct inet_protocol *protocol);
128 extern void tcp_shutdown (struct sock *sk, int how);
129 extern int tcp_rcv(struct sk_buff *skb, struct device *dev,
130 struct options *opt, __u32 daddr,
131 unsigned short len, __u32 saddr, int redo,
132 struct inet_protocol *protocol);
133
134 extern int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);
135
136 extern void tcp_read_wakeup(struct sock *);
137 extern void tcp_write_xmit(struct sock *);
138 extern void tcp_time_wait(struct sock *);
139 extern void tcp_retransmit(struct sock *, int);
140 extern void tcp_do_retransmit(struct sock *, int);
141 extern void tcp_send_check(struct tcphdr *th, unsigned long saddr,
142 unsigned long daddr, int len, struct sk_buff *skb);
143
144
145
146 extern void tcp_send_probe0(struct sock *);
147 extern void tcp_send_partial(struct sock *);
148 extern void tcp_write_wakeup(struct sock *);
149 extern void tcp_send_fin(struct sock *sk);
150 extern void tcp_send_synack(struct sock *, struct sock *, struct sk_buff *);
151 extern void tcp_send_skb(struct sock *, struct sk_buff *);
152 extern void tcp_send_ack(u32, u32, struct sock *sk, struct tcphdr *th, u32);
153 extern void tcp_send_reset(unsigned long saddr, unsigned long daddr, struct tcphdr *th,
154 struct proto *prot, struct options *opt, struct device *dev, int tos, int ttl);
155
156 extern void tcp_enqueue_partial(struct sk_buff *, struct sock *);
157 extern struct sk_buff * tcp_dequeue_partial(struct sock *);
158
159
160 extern void tcp_cache_zap(void);
161
162
163 #define tcp_reset_msl_timer(x,y,z) reset_timer(x,y,z)
164 extern void tcp_reset_xmit_timer(struct sock *, int, unsigned long);
165 extern void tcp_retransmit_timer(unsigned long);
166
167
168
169
170
171
172
173
174
175
176 static inline u32 tcp_init_seq(void)
177 {
178 struct timeval tv;
179 do_gettimeofday(&tv);
180 return tv.tv_usec+tv.tv_sec*1000000;
181 }
182
183
184
185
186
187
188
189
190
191
192
193 static __inline__ unsigned short tcp_raise_window(struct sock *sk)
194 {
195 long free_space;
196 long window;
197
198
199
200
201
202
203
204
205
206 window = sk->window - (sk->acked_seq - sk->lastwin_seq);
207 if (window >= MAX_WINDOW/2)
208 return 0;
209
210 free_space = sock_rspace(sk);
211 if (free_space > 1024)
212 free_space &= ~0x3FF;
213
214 if(sk->window_clamp)
215 free_space = min(sk->window_clamp, free_space);
216
217 if (sk->mss == 0)
218 sk->mss = sk->mtu;
219
220 if ( window < 0 ) {
221 window = 0;
222 printk(KERN_DEBUG "TRW: win < 0 w=%d 1=%u 2=%u\n",
223 sk->window, sk->acked_seq, sk->lastwin_seq);
224 }
225
226 if ( (free_space - window) >= min(sk->mss, MAX_WINDOW/2) )
227 return ((free_space - window) / sk->mss) * sk->mss;
228
229 return 0;
230 }
231
232 static __inline__ unsigned short tcp_select_window(struct sock *sk)
233 {
234 long free_space = sock_rspace(sk);
235 long window;
236
237 if (free_space > 1024)
238 free_space &= ~0x3FF;
239
240 if (sk->window_clamp)
241 free_space = min(sk->window_clamp, free_space);
242
243
244
245
246
247
248 if (sk->mss == 0)
249 sk->mss = sk->mtu;
250
251 window = sk->window - (sk->acked_seq - sk->lastwin_seq);
252
253 if ( window < 0 ) {
254 window = 0;
255 printk(KERN_DEBUG "TSW: win < 0 w=%d 1=%u 2=%u\n",
256 sk->window, sk->acked_seq, sk->lastwin_seq);
257 }
258
259
260
261
262
263
264
265
266
267
268
269 if ( (free_space - window) >= min(sk->mss, MAX_WINDOW/2) )
270 window += ((free_space - window) / sk->mss) * sk->mss;
271
272 sk->window = window;
273 sk->lastwin_seq = sk->acked_seq;
274
275 return sk->window;
276 }
277
278
279
280
281
282
283
284
285 extern __inline const int tcp_connected(const int state)
286 {
287 return(state == TCP_ESTABLISHED || state == TCP_CLOSE_WAIT ||
288 state == TCP_FIN_WAIT1 || state == TCP_FIN_WAIT2 ||
289 state == TCP_SYN_RECV);
290 }
291
292
293
294
295 static __inline__ u16 tcp_check(struct tcphdr *th, int len,
296 unsigned long saddr, unsigned long daddr, unsigned long base)
297 {
298 return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
299 }
300
301 #undef STATE_TRACE
302
303 #ifdef STATE_TRACE
304 static char *statename[]={
305 "Unused","Established","Syn Sent","Syn Recv",
306 "Fin Wait 1","Fin Wait 2","Time Wait", "Close",
307 "Close Wait","Last ACK","Listen","Closing"
308 };
309 #endif
310
311 static __inline__ void tcp_set_state(struct sock *sk, int state)
312 {
313 int oldstate = sk->state;
314
315 sk->state = state;
316
317 #ifdef STATE_TRACE
318 if(sk->debug)
319 printk("TCP sk=%p, State %s -> %s\n",sk, statename[oldstate],statename[state]);
320 #endif
321
322 switch (state) {
323 case TCP_ESTABLISHED:
324 if (oldstate != TCP_ESTABLISHED) {
325 tcp_statistics.TcpCurrEstab++;
326
327
328 if (oldstate == TCP_SYN_RECV)
329 wake_up_interruptible(&master_select_wakeup);
330 }
331 break;
332
333 case TCP_CLOSE:
334 tcp_cache_zap();
335
336 reset_timer(sk, TIME_DONE, min(sk->rtt * 2, TCP_DONE_TIME));
337
338 default:
339 if (oldstate==TCP_ESTABLISHED)
340 tcp_statistics.TcpCurrEstab--;
341 }
342 }
343
344 #endif