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