xref: /csrg-svn/sys/netinet/tcp_fsm.h (revision 4730)
1*4730Swnj /* tcp_fsm.h 4.2 81/11/03 */
24725Swnj 
34725Swnj /*
44725Swnj  * TCP FSM definitions.
5*4730Swnj  *
6*4730Swnj  * The TCP is conceptually a finite state machine with 13 states
7*4730Swnj  * and 9 inputs.  The states and inputs are defined here, as well
8*4730Swnj  * as an array which is used in network profiling to keep event
9*4730Swnj  * counters on the state transitions.  The actual state transitions
10*4730Swnj  * occur on input to the tcp machine (tcp_input.c) and when user
11*4730Swnj  * requests are made (tcp_states.c).
12*4730Swnj  *
13*4730Swnj  * This TCP machine has two more states than suggested in RFC 793,
14*4730Swnj  * the extra states being L_SYN_RCVD and RCV_WAIT.
15*4730Swnj  *
16*4730Swnj  * EXPLAIN THE EXTRA STATES!!!
174725Swnj  */
184725Swnj 
194725Swnj /*
204725Swnj  * States
214725Swnj  */
224725Swnj #define	TCP_NSTATES	14
234725Swnj 
24*4730Swnj #define	EFAILEC		-1		/* new state for failure, internally */
25*4730Swnj #define	SAME		0		/* no state change, internally */
26*4730Swnj #define	LISTEN		1		/* listening for connection */
27*4730Swnj #define	SYN_SENT	2		/* active, have sent syn */
284725Swnj #define	SYN_RCVD	3
294725Swnj #define	L_SYN_RCVD	4
30*4730Swnj #define	ESTAB		5		/* established */
31*4730Swnj #define	FIN_W1		6		/* have closed and sent fin */
32*4730Swnj #define	FIN_W2		7		/* have closed and rcvd ack of fin */
33*4730Swnj #define	TIME_WAIT	8		/* in 2*msl quiet wait after close */
34*4730Swnj #define	CLOSE_WAIT	9		/* rcvd fin, waiting for UCLOSE */
35*4730Swnj #define	CLOSING		10		/* closed xchd FIN; await FIN ACK */
36*4730Swnj #define	LAST_ACK	11		/* had fin and UCLOSE; await FIN ACK */
37*4730Swnj #define	RCV_WAIT	12		/* waiting for user to drain data */
38*4730Swnj #define	CLOSED		13		/* closed */
394725Swnj 
404725Swnj /*
414725Swnj  * Inputs to fsm.
424725Swnj  */
434725Swnj #define	TCP_NINPUTS	10
444725Swnj 
45*4730Swnj #define	IUOPENA 	0		/* active open by user */
46*4730Swnj #define	INRECV		1		/* segment received from net */
47*4730Swnj #define	IUOPENR		2		/* passive open by user */
48*4730Swnj #define	IUCLOSE		3		/* close by user */
49*4730Swnj #define	ISTIMER		4		/* tcp timer expired */
50*4730Swnj #define	IURECV		5		/* user read data; adjust window */
51*4730Swnj #define	IUSEND		6		/* user sending data */
52*4730Swnj #define	IUABORT		7		/* user aborts connection */
53*4730Swnj #define	INCLEAR		8		/* network clear */
54*4730Swnj #define	INSEND		9		/* send by tcp to remote peer */
554725Swnj 
56*4730Swnj #ifdef KPROF
574725Swnj int	acounts[TCP_NSTATES][TCP_NINPUTS];
584725Swnj #endif
594725Swnj 
604725Swnj #ifdef TCPSTATES
614725Swnj char *tcpstates[] = {
62*4730Swnj 	"SAME",		"LISTEN",	"SYN_SENT",	"SYN_RCVD",
634725Swnj 	"L_SYN_RCVD",	"ESTAB",	"FIN_W1",	"FIN_W2",
64*4730Swnj 	"TIME_WAIT",	"CLOSE_WAIT",	"CLOSING",	"LAST_ACK",
654725Swnj 	"RCV_WAIT",	"CLOSED"
664725Swnj };
674725Swnj char *tcpinputs[] = {
684725Swnj 	"BAD",		"UOPENA",	"NRECV",	"UOPENR",
694725Swnj 	"UCLOSE",	"STIMER",	"URECV",	"USEND",
70*4730Swnj 	"UABORT",	"NCLEAR",	"NSEND",
714725Swnj };
72*4730Swnj char *tcptimers[] = { "INIT", "REXMT", "REXMTTL", "PERSIST", "FINACK" };
734725Swnj #endif
74