xref: /csrg-svn/sys/netinet/tcp_var.h (revision 4901)
1*4901Swnj /*	tcp_var.h	4.3	81/11/15	*/
24808Swnj 
34808Swnj /*
44808Swnj  * Kernel variables for tcp.
54808Swnj  */
64808Swnj 
74808Swnj /*
8*4901Swnj  * Tcp+ip header, after ip options removed.
9*4901Swnj  */
10*4901Swnj struct tcpiphdr {
11*4901Swnj 	struct 	ipovly ti_i;		/* overlaid ip structure */
12*4901Swnj 	struct	tcphdr ti_t;		/* tcp header */
13*4901Swnj };
14*4901Swnj #define	ti_next		ti_i.ih_next
15*4901Swnj #define	ti_prev		ti_i.ih_prev
16*4901Swnj #define	ti_x1		ti_i.ih_x1
17*4901Swnj #define	ti_pr		ti_i.ih_pr
18*4901Swnj #define	ti_len		ti_i.ih_len
19*4901Swnj #define	ti_src		ti_i.ih_src
20*4901Swnj #define	ti_dst		ti_i.ih_dst
21*4901Swnj #define	ti_sport	ti_t.th_sport
22*4901Swnj #define	ti_dport	ti_t.th_dport
23*4901Swnj #define	ti_seq		ti_t.th_seq
24*4901Swnj #define	ti_ackno	ti_t.th_ackno
25*4901Swnj #define	ti_x2		ti_t.th_x2
26*4901Swnj #define	ti_off		ti_t.th_off
27*4901Swnj #define	ti_flags	ti_t.th_flags
28*4901Swnj #define	ti_win		ti_t.th_win
29*4901Swnj #define	ti_sum		ti_t.th_sum
30*4901Swnj #define	ti_urp		ti_t.th_urp
31*4901Swnj 
32*4901Swnj /*
334808Swnj  * Tcp control block.
344808Swnj  */
354881Swnj struct tcpcb {
364881Swnj 	struct	tcpiphdr *seg_next,*seg_prev;	/* seq queue */
374881Swnj 	struct	tcpiphdr *t_template;	/* skeletal packet for transmit */
384881Swnj 	struct	inpcb *t_inpcb;
394808Swnj 	seq_t	iss;			/* initial send seq # */
404808Swnj 	seq_t	irs;			/* initial recv seq # */
414808Swnj 	seq_t	rcv_urp;		/* rcv urgent pointer */
424808Swnj 	seq_t	rcv_nxt;		/* next seq # to rcv */
434808Swnj 	seq_t	rcv_end;		/* rcv eol pointer */
444808Swnj 	seq_t	snd_off;		/* seq # of first datum in send buf */
454808Swnj 	seq_t	seq_fin;		/* seq # of FIN sent */
464808Swnj 	seq_t	snd_end;		/* send eol pointer */
474808Swnj 	seq_t	snd_urp;		/* snd urgent pointer */
484808Swnj 	seq_t	snd_lst;		/* seq # of last sent datum */
494808Swnj 	seq_t	snd_nxt;		/* seq # of next datum to send */
504808Swnj 	seq_t	snd_una;		/* seq # of first unacked datum */
514808Swnj 	seq_t	snd_wl;			/* seq # of last sent window */
524808Swnj 	seq_t	snd_hi;			/* highest seq # sent */
534808Swnj 	seq_t	snd_wnd;		/* send window max */
544808Swnj 	seq_t	t_rexmt_val;		/* val saved in rexmt timer */
554808Swnj 	seq_t	t_rtl_val;		/* val saved in rexmt too long timer */
564808Swnj 	seq_t	t_xmt_val;		/* seq # sent when xmt timer started */
574808Swnj 	seq_t	rcv_adv;		/* advertised window */
584881Swnj 	struct	mbuf *seg_unack;	/* unacked message queue */
594881Swnj 	short	seqcnt;
604808Swnj 	u_short	tc_flags;		/* flags and state; see below */
614808Swnj 	u_short	t_options;
624808Swnj #define	TO_EOL		0x01		/* eol mode */
634808Swnj #define	TO_URG		0x02		/* urgent mode */
644808Swnj 	u_char	t_state;		/* state of this connection */
654808Swnj 	u_char	t_xmtime;		/* current rexmt time */
664808Swnj /* timers... must be in order */
674881Swnj 	short	t_init;			/* init */
684808Swnj 	short	t_rexmt;		/* retransmission */
694808Swnj 	short	t_rexmttl;		/* retransmit too long */
704808Swnj 	short	t_persist;		/* retransmit persistance */
714808Swnj 	short	t_finack;		/* fin acknowledged */
724808Swnj 	short	t_xmt;			/* round trip transmission time */
734808Swnj /* end timers */
744808Swnj };
754808Swnj 
764808Swnj /* tc_flags values */
774808Swnj #define	TC_ACK_DUE	0x0001		/* must we send ACK */
784808Swnj #define	TC_CANCELLED	0x0002		/* retransmit timer cancelled */
794881Swnj /* ... */
804808Swnj #define	TC_FIN_RCVD	0x0008		/* FIN received */
814808Swnj #define	TC_FORCE_ONE	0x0010		/* force sending of one byte */
824808Swnj #define	TC_NEW_WINDOW	0x0020		/* received new window size */
834808Swnj #define	TC_REXMT	0x0040		/* this msg is a retransmission */
844808Swnj #define	TC_SND_FIN	0x0080		/* FIN should be sent */
854808Swnj #define	TC_SND_RST	0x0100		/* RST should be sent */
864808Swnj #define	TC_SND_URG	0x0200		/* urgent data to send */
874808Swnj #define	TC_SYN_ACKED	0x0400		/* SYN has been ACKed */
884808Swnj #define	TC_SYN_RCVD	0x0800		/* SYN has been received */
894808Swnj #define	TC_USR_CLOSED	0x1000		/* user has closed connection */
904808Swnj #define	TC_WAITED_2_ML	0x2000		/* wait time for FIN ACK is up */
914808Swnj #define	TC_NET_KEEP	0x4000		/* don't free this net input */
924808Swnj #define	TC_USR_ABORT	0x8000		/* user has closed and does not expect
934808Swnj 					   to receive any more data */
944808Swnj /*
954808Swnj  * TCP timers.
964808Swnj  */
974808Swnj #define	TINIT		0
984808Swnj #define	TREXMT		1
994808Swnj #define	TREXMTTL	2
1004808Swnj #define	TPERSIST	3
1014808Swnj #define	TFINACK		4
1024808Swnj #define	TNTIMERS	5
1034808Swnj 
1044881Swnj #define	intotcpcb(ip)	((struct tcpcb *)(ip)->inp_ppcb)
1054881Swnj #define	sototcpcb(so)	(intotcpcb(sotoinpcb(so)))
1064881Swnj 
1074808Swnj /*
1084808Swnj  * Tcp machine predicates
1094808Swnj  */
1104808Swnj #define	ack_ok(x, y) \
111*4901Swnj     (((y)->ti_flags&TH_ACK)==0 || \
112*4901Swnj       ((x)->iss < (y)->ti_ackno && (y)->ti_ackno <= (x)->snd_hi))
1134808Swnj 
1144808Swnj #define	syn_ok(x, y) \
115*4901Swnj     ((y)->ti_flags&TH_SYN)
1164808Swnj 
1174808Swnj #define	ack_fin(x, y) \
118*4901Swnj     ((x)->seq_fin > (x)->iss && (y)->ti_ackno > (x)->seq_fin)
1194808Swnj 
1204808Swnj #define	rcv_empty(x) \
1214808Swnj     (((x)->tc_flags&TC_USR_ABORT) || \
1224881Swnj       ((x)->t_inpcb->inp_socket->so_rcv.sb_mb == NULL && \
1234881Swnj        (x)->seg_next == (x)->seg_prev))
1244808Swnj 
1254808Swnj #define	ISSINCR		128		/* increment for iss each second */
1264808Swnj #define	TCPSIZE		20		/* size of TCP leader (bytes) */
1274808Swnj 
1284808Swnj /*
1294808Swnj  * THESE NEED TO BE JUSTIFIED!
1304808Swnj  *
1314808Swnj  * *2 here is because slow timeout routine called every 1/2 second.
1324808Swnj  */
1334881Swnj #define	T_INIT		(30*2)
1344808Swnj #define	T_2ML		(10*2)		/* 2*maximum packet lifetime */
1354808Swnj #define	T_PERS		(5*2)		/* persist time */
1364808Swnj #define	T_REXMT		(1*2)		/* base for retransmission time */
1374808Swnj #define	T_REXMTTL	(30*2)		/* retransmit too long timeout */
1384808Swnj #define	T_REMAX		(30*2)		/* maximum retransmission time */
1394808Swnj 
1404808Swnj #ifdef TCPDEBUG
1414808Swnj #define	TDBSIZE		50
1424808Swnj /*
1434808Swnj  * Tcp debugging record.
1444808Swnj  */
1454808Swnj struct tcp_debug {
1464808Swnj 	long	td_tod;			/* time of day */
1474881Swnj 	struct	tcbcb *td_tcb;		/* -> tcb */
1484808Swnj 	char	td_old;			/* old state */
1494808Swnj 	char	td_inp;			/* input */
1504808Swnj 	char	td_tim;			/* timer id */
1514808Swnj 	char	td_new;			/* new state */
1524808Swnj 	seq_t	td_sno;			/* seq_t number */
1534808Swnj 	seq_t	td_ano;			/* acknowledgement */
1544808Swnj 	u_short	td_wno;			/* window */
1554808Swnj 	u_short	td_lno;			/* length */
1564808Swnj 	u_char	td_flg;			/* message flags */
1574808Swnj };
1584808Swnj #endif
1594808Swnj 
1604808Swnj #ifdef KERNEL
1614808Swnj seq_t	tcp_iss;			/* tcp initial send seq # */
1624808Swnj int	tcpconsdebug;			/* set to 1 traces on console */
1634881Swnj struct	inpcb tcb;
1644808Swnj #ifdef TCPDEBUG
1654808Swnj struct	tcp_debug tcp_debug[TDBSIZE];
1664808Swnj #endif
1674808Swnj int	tdbx;			/* rotating index into tcp_debug */
1684881Swnj struct	tcpiphdr *tcp_template();
1694808Swnj #endif
1704808Swnj 
1714808Swnj #define	SEQ_LT(a,b)	((int)((a)-(b)) < 0)
1724808Swnj #define	SEQ_LEQ(a,b)	((int)((a)-(b)) <= 0)
1734808Swnj #define	SEQ_GT(a,b)	((int)((a)-(b)) > 0)
1744808Swnj #define	SEQ_GEQ(a,b)	((int)((a)-(b)) >= 0)
175