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(struct sock *sk);
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 window = sk->window - (sk->acked_seq - sk->lastwin_seq);
204
205 free_space = sock_rspace(sk);
206 if (free_space > 1024)
207 free_space &= ~0x3FF;
208
209 if(sk->window_clamp)
210 free_space = min(sk->window_clamp, free_space);
211
212 if (sk->mss == 0)
213 sk->mss = sk->mtu;
214
215 if ( window < 0 ) {
216 window = 0;
217 printk(KERN_DEBUG "TRW: win < 0 w=%d 1=%u 2=%u\n",
218 sk->window, sk->acked_seq, sk->lastwin_seq);
219 }
220
221 if ( (free_space - window) >= min(sk->mss, MAX_WINDOW/2) )
222 return ((free_space - window) / sk->mss) * sk->mss;
223
224 return 0;
225 }
226
227 static __inline__ unsigned short tcp_select_window(struct sock *sk)
228 {
229 long free_space = sock_rspace(sk);
230 long window;
231
232 if (free_space > 1024)
233 free_space &= ~0x3FF;
234
235 if (sk->window_clamp)
236 free_space = min(sk->window_clamp, free_space);
237
238
239
240
241
242
243 if (sk->mss == 0)
244 sk->mss = sk->mtu;
245
246 window = sk->window - (sk->acked_seq - sk->lastwin_seq);
247
248 if ( window < 0 ) {
249 window = 0;
250 printk(KERN_DEBUG "TSW: win < 0 w=%d 1=%u 2=%u\n",
251 sk->window, sk->acked_seq, sk->lastwin_seq);
252 }
253
254
255
256
257
258
259
260
261
262
263
264 if ( (free_space - window) >= min(sk->mss, MAX_WINDOW/2) )
265 window += ((free_space - window) / sk->mss) * sk->mss;
266
267 sk->window = window;
268 sk->lastwin_seq = sk->acked_seq;
269
270 return sk->window;
271 }
272
273
274
275
276
277
278
279
280 extern __inline const int tcp_connected(const int state)
281 {
282 return(state == TCP_ESTABLISHED || state == TCP_CLOSE_WAIT ||
283 state == TCP_FIN_WAIT1 || state == TCP_FIN_WAIT2 ||
284 state == TCP_SYN_RECV);
285 }
286
287
288
289
290 static __inline__ u16 tcp_check(struct tcphdr *th, int len,
291 unsigned long saddr, unsigned long daddr, unsigned long base)
292 {
293 return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
294 }
295
296 #undef STATE_TRACE
297
298 #ifdef STATE_TRACE
299 static char *statename[]={
300 "Unused","Established","Syn Sent","Syn Recv",
301 "Fin Wait 1","Fin Wait 2","Time Wait", "Close",
302 "Close Wait","Last ACK","Listen","Closing"
303 };
304 #endif
305
306 static __inline__ void tcp_set_state(struct sock *sk, int state)
307 {
308 int oldstate = sk->state;
309
310 sk->state = state;
311
312 #ifdef STATE_TRACE
313 if(sk->debug)
314 printk("TCP sk=%p, State %s -> %s\n",sk, statename[oldstate],statename[state]);
315 #endif
316
317 switch (state) {
318 case TCP_ESTABLISHED:
319 if (oldstate != TCP_ESTABLISHED) {
320 tcp_statistics.TcpCurrEstab++;
321
322
323 if (oldstate == TCP_SYN_RECV)
324 wake_up_interruptible(&master_select_wakeup);
325 }
326 break;
327
328 case TCP_CLOSE:
329 tcp_cache_zap();
330
331 reset_timer(sk, TIME_DONE, min(sk->rtt * 2, TCP_DONE_TIME));
332
333 default:
334 if (oldstate==TCP_ESTABLISHED)
335 tcp_statistics.TcpCurrEstab--;
336 }
337 }
338
339 #endif