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