1 /* 2 * INET An implementation of the TCP/IP protocol suite for the LINUX 3 * operating system. INET is implemented using the BSD Socket 4 * interface as the means of communication with the user level. 5 * 6 * Definitions for the TCP module. 7 * 8 * Version: @(#)tcp.h 1.0.5 05/23/93 9 * 10 * Authors: Ross Biro, <bir7@leland.Stanford.Edu> 11 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 12 * 13 * This program is free software; you can redistribute it and/or 14 * modify it under the terms of the GNU General Public License 15 * as published by the Free Software Foundation; either version 16 * 2 of the License, or (at your option) any later version. 17 */ 18 #ifndef_TCP_H 19 #define_TCP_H 20
21 #include <linux/tcp.h>
22
23 #defineMAX_SYN_SIZE 44 + sizeof (structsk_buff) + MAX_HEADER 24 #defineMAX_FIN_SIZE 40 + sizeof (structsk_buff) + MAX_HEADER 25 #defineMAX_ACK_SIZE 40 + sizeof (structsk_buff) + MAX_HEADER 26 #defineMAX_RESET_SIZE 40 + sizeof (structsk_buff) + MAX_HEADER 27 #defineMAX_WINDOW 4096
28 #defineMIN_WINDOW 2048
29 #define MAX_ACK_BACKLOG 2
30 #defineMIN_WRITE_SPACE 2048
31 #defineTCP_WINDOW_DIFF 2048
32
33 #defineTCP_RETR1 7 /* 34 * This is howmany retries it does before it 35 * tries to figure out if the gateway is 36 * down. 37 */ 38
39 #defineTCP_RETR2 15 /* 40 * This should take at least 41 * 90 minutes to time out. 42 */ 43
44 #defineTCP_TIMEOUT_LEN 5000 /* should be about 5 mins */ 45 #defineTCP_TIMEWAIT_LEN 1000 /* how long to wait to sucessfully 46 * close the socket, about 60 seconds */ 47 #defineTCP_ACK_TIME 3000 /* time to delay before sending an ACK */ 48 #defineTCP_DONE_TIME 250 /* maximum time to wait before actually 49 * destroying a socket */ 50 #defineTCP_WRITE_TIME 3000 /* initial time to wait for an ACK, 51 * after last transmit */ 52 #defineTCP_CONNECT_TIME 2000 /* time to retransmit first SYN */ 53 #defineTCP_SYN_RETRIES 5 /* number of times to retry openning a 54 * connection */ 55 #define TCP_PROBEWAIT_LEN 100 /* time to wait between probes when 56 * I've got something to write and 57 * there is no window */ 58
59 #defineTCP_NO_CHECK 0 /* turn to one if you want the default 60 * to be no checksum */ 61
62 #defineTCP_WRITE_QUEUE_MAGIC 0xa5f23477
63
64 /* 65 * TCP option 66 */ 67
68 #defineTCPOPT_NOP 1
69 #defineTCPOPT_EOL 0
70 #defineTCPOPT_MSS 2
71
72 /* 73 * The next routines deal with comparing 32 bit unsigned ints 74 * and worry about wraparound. The general strategy is to do a 75 * normal compare so long as neither of the numbers is within 76 * 4K of wrapping. Otherwise we must check for the wrap. 77 */ 78 staticinlineint 79 before (unsignedlongseq1, unsignedlongseq2)
/* */ 80 { 81 /* this inequality is strict. */ 82 if (seq1 == seq2) return(0);
83
84 if (seq1 < seq2) { 85 if ((unsignedlong)seq2-(unsignedlong)seq1 < 65536UL) { 86 return(1);
87 }else{ 88 return(0);
89 } 90 } 91
92 /* 93 * Now we know seq1 > seq2. So all we need to do is check 94 * to see if seq1 has wrapped. 95 */ 96 if (seq2 < 8192UL && seq1 > (0xffffffffUL - 8192UL)) { 97 return(1);
98 } 99 return(0);
100 } 101
102
103 staticinlineint 104 after(unsignedlongseq1, unsignedlongseq2)
/* */ 105 { 106 return(before(seq2, seq1));
107 } 108
109
110 /* is s2<=s1<=s3 ? */ 111 staticinlineint 112 between(unsignedlongseq1, unsignedlongseq2, unsignedlongseq3)
/* */ 113 { 114 return(after(seq1+1, seq2) && before(seq1, seq3+1));
115 } 116
117
118 /* 119 * List all states of a TCP socket that can be viewed as a "connected" 120 * state. This now includes TCP_SYN_RECV, although I am not yet fully 121 * convinced that this is the solution for the 'getpeername(2)' 122 * problem. Thanks to Stephen A. Wood <saw@cebaf.gov> -FvK 123 */ 124 staticinlineconstint 125 tcp_connected(constintstate)
/* */ 126 { 127 return(state == TCP_ESTABLISHED || state == TCP_CLOSE_WAIT ||
128 state == TCP_FIN_WAIT1 || state == TCP_FIN_WAIT2 ||
129 state == TCP_SYN_RECV);
130 } 131
132
133 externstructprototcp_prot;
134
135
136 externvoidprint_th(structtcphdr *);
137 externvoidtcp_err(interr, unsignedchar *header, unsignedlongdaddr,
138 unsignedlongsaddr, structinet_protocol *protocol);
139 externvoidtcp_shutdown (structsock *sk, inthow);
140 externinttcp_rcv(structsk_buff *skb, structdevice *dev,
141 structoptions *opt, unsignedlongdaddr,
142 unsignedshortlen, unsignedlongsaddr, intredo,
143 structinet_protocol *protocol);
144
145 externinttcp_ioctl(structsock *sk, intcmd, unsignedlongarg);
146
147
148 #endif/* _TCP_H */