BSD 4_3_Reno release
[unix-history] / usr / src / sys / netinet / tcp_fsm.h
index c6b85a0..2b205b1 100644 (file)
@@ -1,52 +1,72 @@
-/*     tcp_fsm.h       4.5     81/11/15        */
-
 /*
 /*
- * TCP FSM definitions.
- *
- * The TCP is conceptually a finite state machine with 13 states
- * and 9 inputs.  The states and inputs are defined here, as well
- * as an array which is used in network profiling to keep event
- * counters on the state transitions.  The actual state transitions
- * occur on input to the tcp machine (tcp_input.c) and when user
- * requests are made (tcp_states.c).
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.
  *
  *
- * This TCP machine has two more states than suggested in RFC 793,
- * the extra states being L_SYN_RCVD and RCV_WAIT.
+ * Redistribution is only permitted until one year after the first shipment
+ * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
+ * binary forms are permitted provided that: (1) source distributions retain
+ * this entire copyright notice and comment, and (2) distributions including
+ * binaries display the following acknowledgement:  This product includes
+ * software developed by the University of California, Berkeley and its
+ * contributors'' in the documentation or other materials provided with the
+ * distribution and in all advertising materials mentioning features or use
+ * of this software.  Neither the name of the University nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  *
- * EXPLAIN THE EXTRA STATES!!!
+ *     @(#)tcp_fsm.h   7.4 (Berkeley) 6/28/90
  */
 
 /*
  */
 
 /*
- * States
+ * TCP FSM state definitions.
+ * Per RFC793, September, 1981.
  */
  */
-#define        TCP_NSTATES     14
 
 
-#define        EFAILEC         -1              /* new state for failure, internally */
-#define        SAME            0               /* no state change, internally */
-#define        LISTEN          1               /* listening for connection */
-#define        SYN_SENT        2               /* active, have sent syn */
-#define        SYN_RCVD        3
-#define        L_SYN_RCVD      4
-#define        ESTAB           5               /* established */
-#define        FIN_W1          6               /* have closed and sent fin */
-#define        FIN_W2          7               /* have closed and rcvd ack of fin */
-#define        TIME_WAIT       8               /* in 2*msl quiet wait after close */
-#define        CLOSE_WAIT      9               /* rcvd fin, waiting for UCLOSE */
-#define        CLOSING         10              /* closed xchd FIN; await FIN ACK */
-#define        LAST_ACK        11              /* had fin and UCLOSE; await FIN ACK */
-#define        RCV_WAIT        12              /* waiting for user to drain data */
-#define        CLOSED          13              /* closed */
+#define        TCP_NSTATES     11
+
+#define        TCPS_CLOSED             0       /* closed */
+#define        TCPS_LISTEN             1       /* listening for connection */
+#define        TCPS_SYN_SENT           2       /* active, have sent syn */
+#define        TCPS_SYN_RECEIVED       3       /* have send and received syn */
+/* states < TCPS_ESTABLISHED are those where connections not established */
+#define        TCPS_ESTABLISHED        4       /* established */
+#define        TCPS_CLOSE_WAIT         5       /* rcvd fin, waiting for close */
+/* states > TCPS_CLOSE_WAIT are those where user has closed */
+#define        TCPS_FIN_WAIT_1         6       /* have closed, sent fin */
+#define        TCPS_CLOSING            7       /* closed xchd FIN; await FIN ACK */
+#define        TCPS_LAST_ACK           8       /* had fin and close; await FIN ACK */
+/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */
+#define        TCPS_FIN_WAIT_2         9       /* have closed, fin is acked */
+#define        TCPS_TIME_WAIT          10      /* in 2*msl quiet wait after close */
+
+#define        TCPS_HAVERCVDSYN(s)     ((s) >= TCPS_SYN_RECEIVED)
+#define        TCPS_HAVERCVDFIN(s)     ((s) >= TCPS_TIME_WAIT)
+
+#ifdef TCPOUTFLAGS
+/*
+ * Flags used when sending segments in tcp_output.
+ * Basic flags (TH_RST,TH_ACK,TH_SYN,TH_FIN) are totally
+ * determined by state, with the proviso that TH_FIN is sent only
+ * if all data queued for output is included in the segment.
+ */
+u_char tcp_outflags[TCP_NSTATES] = {
+    TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK,
+    TH_ACK, TH_ACK,
+    TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_ACK, TH_ACK,
+};
+#endif
 
 #ifdef KPROF
 int    tcp_acounts[TCP_NSTATES][PRU_NREQ];
 #endif
 
 
 #ifdef KPROF
 int    tcp_acounts[TCP_NSTATES][PRU_NREQ];
 #endif
 
-#ifdef TCPSTATES
+#ifdef TCPSTATES
 char *tcpstates[] = {
 char *tcpstates[] = {
-       "SAME",         "LISTEN",       "SYN_SENT",     "SYN_RCVD",
-       "L_SYN_RCVD",   "ESTAB",        "FIN_W1",       "FIN_W2",
-       "TIME_WAIT",    "CLOSE_WAIT",   "CLOSING",      "LAST_ACK",
-       "RCV_WAIT",     "CLOSED"
+       "CLOSED",       "LISTEN",       "SYN_SENT",     "SYN_RCVD",
+       "ESTABLISHED",  "CLOSE_WAIT",   "FIN_WAIT_1",   "CLOSING",
+       "LAST_ACK",     "FIN_WAIT_2",   "TIME_WAIT",
 };
 };
-char *tcptimers[] = { "INIT", "REXMT", "REXMTTL", "PERSIST", "FINACK" };
 #endif
 #endif