xref: /csrg-svn/sys/netinet/tcp.h (revision 4663)
1 /* tcp.h 1.9 81/10/29 */
2 
3 /*
4  * Tcp header.  Fits over the ip header after option removed.
5  *
6  * SHOULD MAKE A CLEAN HEADER FOR USE BY USERS.
7  */
8 struct th {
9 	struct	th *t_next;		/* -> next tcp on rcv chain */
10 	struct	th *t_prev;		/* -> prev tcp on rcv chain */
11 	u_char	t_x1;			/* (unused) */
12 	u_char	t_pr;			/* protocol */
13 /* by rights, t_len should be a u_short, but this makes operations */
14 /* on it very dangerous as comparisons become unsigned and comparing */
15 /* against negative numbers then fails... we don't expect any > 32767 */
16 /* byte segments, so pragmatically delcare it to be a short */
17 	short	t_len;			/* seg length */
18 	struct	socket t_s;		/* source internet address */
19 	struct	socket t_d;		/* destination internet address */
20 	u_short	t_src;			/* source port */
21 	u_short	t_dst;			/* destination port */
22 	seq_t	t_seq;			/* sequence number */
23 	seq_t	t_ackno;		/* acknowledgement number */
24 #define	t_end(x) (x->t_seq + x->t_len - 1)
25 	u_char
26 		t_x2:4,			/* (unused) */
27 		t_off:4;		/* data offset */
28 	u_char	th_flags;
29 #define	TH_FIN	001
30 #define	TH_SYN	002
31 #define	TH_RST	004
32 #define	TH_EOL	010
33 #define	TH_ACK	020
34 #define	TH_URG	040
35 	u_short	t_win;			/* window */
36 	u_short	t_sum;			/* checksum */
37 	u_short	t_urp;			/* urgent pointer */
38 };
39 
40 /*
41  * Tcp control block.
42  */
43 struct tcb {
44 	struct	th *t_rcv_next;		/* first el on rcv queue */
45 	struct	th *t_rcv_prev;		/* last el on rcv queue */
46 	struct	tcb *t_tcb_next;	/* next tcb */
47 	struct	tcb *t_tcb_prev;	/* next tcb */
48 	struct	ucb *t_ucb;		/* ucb */
49 	struct	mbuf *t_rcv_unack;	/* unacked message queue */
50 	short	seqcnt;
51 	short	xxx;
52 	seq_t	iss;			/* initial send seq # */
53 	seq_t	irs;			/* initial recv seq # */
54 	seq_t	rcv_urp;		/* rcv urgent pointer */
55 	seq_t	rcv_nxt;		/* next seq # to rcv */
56 	seq_t	rcv_end;		/* rcv eol pointer */
57 	seq_t	snd_off;		/* seq # of first datum in send buf */
58 	seq_t	seq_fin;		/* seq # of FIN sent */
59 	seq_t	snd_end;		/* send eol pointer */
60 	seq_t	snd_urp;		/* snd urgent pointer */
61 	seq_t	snd_lst;		/* seq # of last sent datum */
62 	seq_t	snd_nxt;		/* seq # of next datum to send */
63 	seq_t	snd_una;		/* seq # of first unacked datum */
64 	seq_t	snd_wl;			/* seq # of last sent window */
65 	seq_t	snd_hi;			/* highest seq # sent */
66 	seq_t	snd_wnd;		/* send window max */
67 	seq_t	t_rexmt_val;		/* val saved in rexmt timer */
68 	seq_t	t_rtl_val;		/* val saved in rexmt too long timer */
69 	seq_t	t_xmt_val;		/* seq # sent when xmt timer started */
70 
71 	/* various flags and state variables */
72 
73 	u_short	tc_flags;
74 #define	TC_ACK_DUE	0x0001		/* must we send ACK */
75 #define	TC_CANCELLED	0x0002		/* retransmit timer cancelled */
76 #define	TC_DROPPED_TXT	0x0004		/* dropped incoming data */
77 #define	TC_FIN_RCVD	0x0008		/* FIN received */
78 #define	TC_FORCE_ONE	0x0010		/* force sending of one byte */
79 #define	TC_NEW_WINDOW	0x0020		/* received new window size */
80 #define	TC_REXMT	0x0040		/* this msg is a retransmission */
81 #define	TC_SND_FIN	0x0080		/* FIN should be sent */
82 #define	TC_SND_RST	0x0100		/* RST should be sent */
83 #define	TC_SND_URG	0x0200		/* urgent data to send */
84 #define	TC_SYN_ACKED	0x0400		/* SYN has been ACKed */
85 #define	TC_SYN_RCVD	0x0800		/* SYN has been received */
86 #define	TC_USR_CLOSED	0x1000		/* user has closed connection */
87 #define	TC_WAITED_2_ML	0x2000		/* wait time for FIN ACK is up */
88 #define	TC_NET_KEEP	0x4000		/* don't free this net input */
89 #define	TC_USR_ABORT	0x8000		/* user has closed and does not expect
90 					   to receive any more data */
91 
92 	u_short	t_lport;		/* local port */
93 	u_short	t_fport;		/* foreign port */
94 	u_char	t_state;		/* state of this connection */
95 	u_char	t_xmtime;		/* current rexmt time */
96 
97 	/* timers */
98 
99 	u_char	t_init;			/* initialization too long */
100 	u_char	t_rexmt;		/* retransmission */
101 	u_char	t_rexmttl;		/* retransmit too long */
102 	u_char	t_persist;		/* retransmit persistance */
103 	u_char	t_finack;		/* fin acknowledged */
104 	u_char	t_xmt;			/* round trip transmission time */
105 };
106 
107 /*
108  * TCP timers.
109  */
110 #define	TINIT		1
111 #define	TREXMT		2
112 #define	TREXMTTL	3
113 #define	TPERSIST	4
114 #define	TFINACK		5
115 
116 /*
117  * Tcp machine predicates
118  */
119 #define	ack_ok(x, y) \
120     (((y)->th_flags&TH_ACK)==0 || \
121       ((x)->iss < (y)->t_ackno && (y)->t_ackno <= (x)->snd_hi))
122 
123 #define	syn_ok(x, y) \
124     ((y)->th_flags&TH_SYN)
125 
126 #define	ack_fin(x, y) \
127     ((x)->seq_fin > (x)->iss && (y)->t_ackno > (x)->seq_fin)
128 
129 #define	rcv_empty(x) \
130     (((x)->tc_flags&TC_USR_ABORT) || \
131       ((x)->t_ucb->uc_rbuf == NULL && (x)->t_rcv_next == (x)->t_rcv_prev))
132 
133 /*
134  * THESE NEED TO BE JUSTIFIED!
135  */
136 #define	ISSINCR		128		/* increment for iss each second */
137 #define	TCPROTO		6		/* TCP-4 protocol number */
138 #define	TCPSIZE		20		/* size of TCP leader (bytes) */
139 #define	T_2ML		10		/* 2*maximum packet lifetime */
140 #define	T_PERS		5		/* persist time */
141 #define	T_INIT		30		/* init too long timeout */
142 #define	T_REXMT		1		/* base for retransmission time */
143 #define	T_REXMTTL	30		/* retransmit too long timeout */
144 #define	T_REMAX		30		/* maximum retransmission time */
145 #define	ACTIVE		1		/* active open */
146 #define	PASSIVE		0		/* passive open */
147 
148 #ifdef TCPDEBUG
149 #define	TDBSIZE		50
150 /*
151  * Tcp debugging record.
152  */
153 struct tcp_debug {
154 	long	td_tod;			/* time of day */
155 	struct	tcb *td_tcb;		/* -> tcb */
156 	char	td_old;			/* old state */
157 	char	td_inp;			/* input */
158 	char	td_tim;			/* timer id */
159 	char	td_new;			/* new state */
160 	seq_t	td_sno;			/* seq_t number */
161 	seq_t	td_ano;			/* acknowledgement */
162 	u_short	td_wno;			/* window */
163 	u_short	td_lno;			/* length */
164 	u_char	td_flg;			/* message flags */
165 };
166 #endif
167 
168 #ifdef KERNEL
169 struct	tcb *tcb_head, *tcb_tail;	/* tcp tcb list */
170 seq_t	tcp_iss;			/* tcp initial send seq # */
171 int	tcpconsdebug;			/* set to 1 traces on console */
172 #ifdef TCPDEBUG
173 struct	tcp_debug tcp_debug[TDBSIZE];
174 #endif
175 int	tdbx;			/* rotating index into tcp_debug */
176 struct	th *tcp_template();
177 #endif
178 
179 #define	SEQ_LT(a,b)	((int)((a)-(b)) < 0)
180 #define	SEQ_LEQ(a,b)	((int)((a)-(b)) <= 0)
181 #define	SEQ_GT(a,b)	((int)((a)-(b)) > 0)
182 #define	SEQ_GEQ(a,b)	((int)((a)-(b)) >= 0)
183