summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJohn Levon <john.levon@joyent.com>2020-04-22 11:08:29 +0000
committerJohn Levon <john.levon@joyent.com>2020-04-22 11:49:40 +0000
commit01e7a6517c683a2bfc6ebd0af767ad4457a4e9f6 (patch)
tree29adbcefffda65934fc93dcf21562b418a7faf74 /usr/src
parentfbc0ddb953a7d9b82226743cc9873150a118a37f (diff)
downloadillumos-joyent-OS-8159.tar.gz
OS-8159 race between write() and shutdown() for unix socketsOS-8159
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/tl.c198
-rw-r--r--usr/src/uts/common/os/space.c48
-rw-r--r--usr/src/uts/common/sys/tihdr.h39
3 files changed, 134 insertions, 151 deletions
diff --git a/usr/src/uts/common/io/tl.c b/usr/src/uts/common/io/tl.c
index e6b3d41625..08a207f915 100644
--- a/usr/src/uts/common/io/tl.c
+++ b/usr/src/uts/common/io/tl.c
@@ -376,8 +376,6 @@
/*
* Local declarations
*/
-#define NEXTSTATE(EV, ST) ti_statetbl[EV][ST]
-
#define BADSEQNUM (-1) /* initial seq number used by T_DISCON_IND */
#define TL_BUFWAIT (10000) /* usecs to wait for allocb buffer timeout */
#define TL_TIDUSZ (64*1024) /* tidu size when "strmsgz" is unlimited (0) */
@@ -417,15 +415,6 @@
#define T_ALIGN(p) P2ROUNDUP((p), sizeof (t_scalar_t))
/*
- * EXTERNAL VARIABLE DECLARATIONS
- * -----------------------------
- */
-/*
- * state table defined in the OS space.c
- */
-extern char ti_statetbl[TE_NOEVENTS][TS_NOSTATES];
-
-/*
* STREAMS DRIVER ENTRY POINTS PROTOTYPES
*/
static int tl_open(queue_t *, dev_t *, int, int, cred_t *);
@@ -823,6 +812,82 @@ static int tl_client_closing_when_accepting;
static int tl_serializer_noswitch;
+#define nr 127 /* not reachable */
+
+#define TE_NOEVENTS 28
+
+static char nextstate[TE_NOEVENTS][TS_NOSTATES] = {
+ /* STATES */
+ /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */
+
+/* Initialization events */
+
+#define TE_BIND_REQ 0 /* bind request */
+ { 1, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_UNBIND_REQ 1 /* unbind request */
+ {nr, nr, nr, 2, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_OPTMGMT_REQ 2 /* manage options req */
+ {nr, nr, nr, 4, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_BIND_ACK 3 /* bind acknowledment */
+ {nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_OPTMGMT_ACK 4 /* manage options ack */
+ {nr, nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_ERROR_ACK 5 /* error acknowledgment */
+ {nr, 0, 3, nr, 3, 3, nr, nr, 7, nr, nr, nr, 6, 7, 9, 10, 11},
+#define TE_OK_ACK1 6 /* ok ack seqcnt == 0 */
+ {nr, nr, 0, nr, nr, 6, nr, nr, nr, nr, nr, nr, 3, nr, 3, 3, 3},
+#define TE_OK_ACK2 7 /* ok ack seqcnt == 1, q == resq */
+ {nr, nr, nr, nr, nr, nr, nr, nr, 9, nr, nr, nr, nr, 3, nr, nr, nr},
+#define TE_OK_ACK3 8 /* ok ack seqcnt == 1, q != resq */
+ {nr, nr, nr, nr, nr, nr, nr, nr, 3, nr, nr, nr, nr, 3, nr, nr, nr},
+#define TE_OK_ACK4 9 /* ok ack seqcnt > 1 */
+ {nr, nr, nr, nr, nr, nr, nr, nr, 7, nr, nr, nr, nr, 7, nr, nr, nr},
+
+/* Connection oriented events */
+#define TE_CONN_REQ 10 /* connection request */
+ {nr, nr, nr, 5, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_CONN_RES 11 /* connection response */
+ {nr, nr, nr, nr, nr, nr, nr, 8, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_DISCON_REQ 12 /* disconnect request */
+ {nr, nr, nr, nr, nr, nr, 12, 13, nr, 14, 15, 16, nr, nr, nr, nr, nr},
+#define TE_DATA_REQ 13 /* data request */
+ {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, nr, 11, nr, nr, nr, nr, nr},
+#define TE_EXDATA_REQ 14 /* expedited data request */
+ {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, nr, 11, nr, nr, nr, nr, nr},
+#define TE_ORDREL_REQ 15 /* orderly release req */
+ {nr, nr, nr, nr, nr, nr, nr, nr, nr, 10, nr, 3, nr, nr, nr, nr, nr},
+#define TE_CONN_IND 16 /* connection indication */
+ {nr, nr, nr, 7, nr, nr, nr, 7, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_CONN_CON 17 /* connection confirmation */
+ {nr, nr, nr, nr, nr, nr, 9, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_DATA_IND 18 /* data indication */
+ {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, 10, nr, nr, nr, nr, nr, nr},
+#define TE_EXDATA_IND 19 /* expedited data indication */
+ {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, 10, nr, nr, nr, nr, nr, nr},
+#define TE_ORDREL_IND 20 /* orderly release ind */
+ {nr, nr, nr, nr, nr, nr, nr, nr, nr, 11, 3, nr, nr, nr, nr, nr, nr},
+#define TE_DISCON_IND1 21 /* disconnect indication seq == 0 */
+ {nr, nr, nr, nr, nr, nr, 3, nr, nr, 3, 3, 3, nr, nr, nr, nr, nr},
+#define TE_DISCON_IND2 22 /* disconnect indication seq == 1 */
+ {nr, nr, nr, nr, nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_DISCON_IND3 23 /* disconnect indication seq > 1 */
+ {nr, nr, nr, nr, nr, nr, nr, 7, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_PASS_CONN 24 /* pass connection */
+ {nr, nr, nr, 9, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+
+
+/* Unit data events */
+
+#define TE_UNITDATA_REQ 25 /* unitdata request */
+ {nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_UDERROR_IND 27 /* unitdata error indication */
+ {nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+#define TE_UNITDATA_IND 26 /* unitdata indication */
+ {nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
+};
+
+
+
/*
* LOCAL FUNCTION PROTOTYPES
* -------------------------
@@ -1963,6 +2028,7 @@ tl_wput_data_ser(mblk_t *mp, tl_endpt_t *tep)
(tep->te_wq != NULL) &&
(tep->te_wq->q_first == NULL) &&
((peer_tep->te_state == TS_DATA_XFER) ||
+ (peer_tep->te_state == TS_WIND_ORDREL) ||
(peer_tep->te_state == TS_WREQ_ORDREL)) &&
((peer_rq = peer_tep->te_rq) != NULL) &&
(canputnext(peer_rq) || tep->te_closing)) {
@@ -2389,7 +2455,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
goto error;
}
- tep->te_state = NEXTSTATE(TE_BIND_REQ, tep->te_state);
+ tep->te_state = nextstate[TE_BIND_REQ][tep->te_state];
ASSERT((bind->PRIM_type == O_T_BIND_REQ) ||
(bind->PRIM_type == T_BIND_REQ));
@@ -2429,7 +2495,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor,
1, SL_TRACE | SL_ERROR,
"tl_bind: invalid socket addr"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tli_err = TSYSERR;
unix_err = EINVAL;
goto error;
@@ -2444,7 +2510,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor,
1, SL_TRACE | SL_ERROR,
"tl_bind: invalid socket magic"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tli_err = TSYSERR;
unix_err = EINVAL;
goto error;
@@ -2454,7 +2520,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor,
1, SL_TRACE | SL_ERROR,
"tl_bind: implicit addr non-empty"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tli_err = TSYSERR;
unix_err = EINVAL;
goto error;
@@ -2464,7 +2530,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor,
1, SL_TRACE | SL_ERROR,
"tl_bind: explicit addr empty"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tli_err = TSYSERR;
unix_err = EINVAL;
goto error;
@@ -2476,7 +2542,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor,
1, SL_TRACE | SL_ERROR,
"tl_bind: invalid message"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tli_err = TSYSERR;
unix_err = EINVAL;
goto error;
@@ -2485,7 +2551,7 @@ tl_bind(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor,
1, SL_TRACE | SL_ERROR,
"tl_bind: bad addr in message"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tli_err = TBADADDR;
goto error;
}
@@ -2651,7 +2717,7 @@ skip_addr_bind:
tep->te_flag |= TL_LISTENER;
}
- tep->te_state = NEXTSTATE(TE_BIND_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_BIND_ACK][tep->te_state];
/*
* send T_BIND_ACK message
*/
@@ -2668,7 +2734,7 @@ error:
tl_memrecover(wq, mp, sizeof (struct T_error_ack));
return;
}
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, tli_err, unix_err, save_prim_type);
}
@@ -2714,7 +2780,7 @@ tl_unbind(mblk_t *mp, tl_endpt_t *tep)
tl_error_ack(wq, ackmp, TOUTSTATE, 0, T_UNBIND_REQ);
return;
}
- tep->te_state = NEXTSTATE(TE_UNBIND_REQ, tep->te_state);
+ tep->te_state = nextstate[TE_UNBIND_REQ][tep->te_state];
/*
* TPI says on T_UNBIND_REQ:
@@ -2734,7 +2800,7 @@ tl_unbind(mblk_t *mp, tl_endpt_t *tep)
tl_addr_unbind(tep);
}
- tep->te_state = NEXTSTATE(TE_OK_ACK1, tep->te_state);
+ tep->te_state = nextstate[TE_OK_ACK1][tep->te_state];
/*
* send T_OK_ACK
*/
@@ -2972,7 +3038,7 @@ tl_conn_req(queue_t *wq, mblk_t *mp)
return;
}
- tep->te_state = NEXTSTATE(TE_CONN_REQ, tep->te_state);
+ tep->te_state = nextstate[TE_CONN_REQ][tep->te_state];
/*
* get endpoint to connect to
* check that peer with DEST addr is bound to addr
@@ -3010,7 +3076,7 @@ tl_conn_req(queue_t *wq, mblk_t *mp)
if (peer_tep != NULL)
tl_refrele(peer_tep);
/* We are still expected to send T_OK_ACK */
- tep->te_state = NEXTSTATE(TE_OK_ACK1, tep->te_state);
+ tep->te_state = nextstate[TE_OK_ACK1][tep->te_state];
tl_ok_ack(tep->te_wq, ackmp, T_CONN_REQ);
tl_closeok(tep);
dimp = tpi_ack_alloc(mp, sizeof (struct T_discon_ind),
@@ -3231,7 +3297,7 @@ tl_conn_req_ser(mblk_t *mp, tl_endpt_t *tep)
/*
* ack validity of request and send the peer credential in the ACK.
*/
- tep->te_state = NEXTSTATE(TE_OK_ACK1, tep->te_state);
+ tep->te_state = nextstate[TE_OK_ACK1][tep->te_state];
if (peer_tep != NULL && peer_tep->te_credp != NULL &&
confmp != NULL) {
@@ -3305,7 +3371,7 @@ tl_conn_req_ser(mblk_t *mp, tl_endpt_t *tep)
list_insert_tail(&peer_tep->te_iconp, tip);
peer_tep->te_nicon++;
- peer_tep->te_state = NEXTSTATE(TE_CONN_IND, peer_tep->te_state);
+ peer_tep->te_state = nextstate[TE_CONN_IND][peer_tep->te_state];
/*
* send the T_CONN_IND message
*/
@@ -3316,7 +3382,7 @@ tl_conn_req_ser(mblk_t *mp, tl_endpt_t *tep)
* Disable the queues until we have reached the correct state!
*/
if (confmp != NULL) {
- tep->te_state = NEXTSTATE(TE_CONN_CON, tep->te_state);
+ tep->te_state = nextstate[TE_CONN_CON][tep->te_state];
noenable(wq);
putnext(tep->te_rq, confmp);
}
@@ -3436,14 +3502,14 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
return;
}
- tep->te_state = NEXTSTATE(TE_CONN_RES, tep->te_state);
+ tep->te_state = nextstate[TE_CONN_RES][tep->te_state];
ASSERT(tep->te_state == TS_WACK_CRES);
if (cres->SEQ_number < TL_MINOR_START &&
cres->SEQ_number >= BADSEQNUM) {
(void) (STRLOG(TL_ID, tep->te_minor, 2, SL_TRACE | SL_ERROR,
"tl_conn_res:remote endpoint sequence number bad"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, TBADSEQ, 0, prim);
freemsg(mp);
return;
@@ -3457,7 +3523,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
(mod_hash_val_t *)&acc_ep, tl_find_callback) != 0) {
(void) (STRLOG(TL_ID, tep->te_minor, 2, SL_TRACE | SL_ERROR,
"tl_conn_res:bad accepting endpoint"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, TBADF, 0, prim);
freemsg(mp);
return;
@@ -3469,7 +3535,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
if (!tl_noclose(acc_ep)) {
(void) (STRLOG(TL_ID, tep->te_minor, 2, SL_TRACE | SL_ERROR,
"tl_conn_res:bad accepting endpoint"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, TBADF, 0, prim);
tl_refrele(acc_ep);
freemsg(mp);
@@ -3487,7 +3553,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor, 2, SL_TRACE | SL_ERROR,
"tl_conn_res:accepting endpoint has no address bound,"
"state=%d", acc_ep->te_state));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, TOUTSTATE, 0, prim);
freemsg(mp);
tl_closeok(acc_ep);
@@ -3503,7 +3569,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
if ((tep == acc_ep) && (tep->te_nicon > 1)) {
(void) (STRLOG(TL_ID, tep->te_minor, 3, SL_TRACE | SL_ERROR,
"tl_conn_res: > 1 conn_ind on listener-acceptor"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, TBADF, 0, prim);
freemsg(mp);
tl_closeok(acc_ep);
@@ -3521,7 +3587,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
if (tip == NULL) {
(void) (STRLOG(TL_ID, tep->te_minor, 2, SL_TRACE | SL_ERROR,
"tl_conn_res:no client in listener list"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, tep->te_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][tep->te_state];
tl_error_ack(wq, ackmp, TBADSEQ, 0, prim);
freemsg(mp);
tl_closeok(acc_ep);
@@ -3639,11 +3705,11 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
*/
if (tep->te_nicon == 1) {
if (tep == acc_ep)
- tep->te_state = NEXTSTATE(TE_OK_ACK2, tep->te_state);
+ tep->te_state = nextstate[TE_OK_ACK2][tep->te_state];
else
- tep->te_state = NEXTSTATE(TE_OK_ACK3, tep->te_state);
+ tep->te_state = nextstate[TE_OK_ACK3][tep->te_state];
} else {
- tep->te_state = NEXTSTATE(TE_OK_ACK4, tep->te_state);
+ tep->te_state = nextstate[TE_OK_ACK4][tep->te_state];
}
/*
@@ -3696,7 +3762,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
* now start connecting the accepting endpoint
*/
if (tep != acc_ep)
- acc_ep->te_state = NEXTSTATE(TE_PASS_CONN, acc_ep->te_state);
+ acc_ep->te_state = nextstate[TE_PASS_CONN][acc_ep->te_state];
if (cl_ep == NULL) {
/*
@@ -3857,7 +3923,7 @@ tl_conn_res(mblk_t *mp, tl_endpt_t *tep)
/*
* change client state on TE_CONN_CON event
*/
- cl_ep->te_state = NEXTSTATE(TE_CONN_CON, cl_ep->te_state);
+ cl_ep->te_state = nextstate[TE_CONN_CON][cl_ep->te_state];
putnext(cl_ep->te_rq, ccmp);
}
@@ -3943,13 +4009,13 @@ tl_discon_req(mblk_t *mp, tl_endpt_t *tep)
* Defer committing the state change until it is determined if
* the message will be queued with the tl_icon or not.
*/
- new_state = NEXTSTATE(TE_DISCON_REQ, tep->te_state);
+ new_state = nextstate[TE_DISCON_REQ][tep->te_state];
/* validate the message */
if (msz < sizeof (struct T_discon_req)) {
(void) (STRLOG(TL_ID, tep->te_minor, 1, SL_TRACE | SL_ERROR,
"tl_discon_req:invalid message"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, new_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][new_state];
tl_error_ack(wq, ackmp, TSYSERR, EINVAL, T_DISCON_REQ);
freemsg(mp);
return;
@@ -3969,7 +4035,7 @@ tl_discon_req(mblk_t *mp, tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor, 2,
SL_TRACE | SL_ERROR,
"tl_discon_req:no disconnect endpoint"));
- tep->te_state = NEXTSTATE(TE_ERROR_ACK, new_state);
+ tep->te_state = nextstate[TE_ERROR_ACK][new_state];
tl_error_ack(wq, ackmp, TBADSEQ, 0, T_DISCON_REQ);
freemsg(mp);
return;
@@ -3999,12 +4065,12 @@ tl_discon_req(mblk_t *mp, tl_endpt_t *tep)
* prepare message to ack validity of request
*/
if (tep->te_nicon == 0) {
- new_state = NEXTSTATE(TE_OK_ACK1, new_state);
+ new_state = nextstate[TE_OK_ACK1][new_state];
} else {
if (tep->te_nicon == 1)
- new_state = NEXTSTATE(TE_OK_ACK2, new_state);
+ new_state = nextstate[TE_OK_ACK2][new_state];
else
- new_state = NEXTSTATE(TE_OK_ACK4, new_state);
+ new_state = nextstate[TE_OK_ACK4][new_state];
}
/*
@@ -4104,12 +4170,12 @@ tl_discon_req(mblk_t *mp, tl_endpt_t *tep)
save_state = peer_tep->te_state;
if (peer_tep->te_nicon == 1)
peer_tep->te_state =
- NEXTSTATE(TE_DISCON_IND2,
- peer_tep->te_state);
+ nextstate[TE_DISCON_IND2]
+ [peer_tep->te_state];
else
peer_tep->te_state =
- NEXTSTATE(TE_DISCON_IND3,
- peer_tep->te_state);
+ nextstate[TE_DISCON_IND3]
+ [peer_tep->te_state];
tl_freetip(peer_tep, tip);
}
ASSERT(tep->te_oconp != NULL);
@@ -4572,7 +4638,7 @@ tl_data(mblk_t *mp, tl_endpt_t *tep)
return;
}
/*
- * tep->te_state = NEXTSTATE(TE_DATA_REQ, tep->te_state);
+ * tep->te_state = nextstate[TE_DATA_REQ][tep->te_state];
* (State stays same on this event)
*/
@@ -4622,7 +4688,7 @@ tl_data(mblk_t *mp, tl_endpt_t *tep)
prim->type = T_OPTDATA_IND;
}
/*
- * peer_tep->te_state = NEXTSTATE(TE_DATA_IND, peer_tep->te_state);
+ * peer_tep->te_state = nextstate[TE_DATA_IND][peer_tep->te_state];
* (peer state stays same on this event)
*/
/*
@@ -4739,7 +4805,7 @@ tl_exdata(mblk_t *mp, tl_endpt_t *tep)
return;
}
/*
- * tep->te_state = NEXTSTATE(TE_EXDATA_REQ, tep->te_state);
+ * tep->te_state = nextstate[TE_EXDATA_REQ][tep->te_state];
* (state stays same on this event)
*/
@@ -4781,7 +4847,7 @@ tl_exdata(mblk_t *mp, tl_endpt_t *tep)
return;
}
/*
- * peer_tep->te_state = NEXTSTATE(TE_DATA_IND, peer_tep->te_state);
+ * peer_tep->te_state = nextstate[TE_DATA_IND][peer_tep->te_state];
* (peer state stays same on this event)
*/
/*
@@ -4865,7 +4931,7 @@ tl_ordrel(mblk_t *mp, tl_endpt_t *tep)
}
return;
}
- tep->te_state = NEXTSTATE(TE_ORDREL_REQ, tep->te_state);
+ tep->te_state = nextstate[TE_ORDREL_REQ][tep->te_state];
/*
* get connected endpoint
@@ -4904,7 +4970,7 @@ tl_ordrel(mblk_t *mp, tl_endpt_t *tep)
tl_merror(peer_tep->te_wq, mp, EPROTO);
return;
}
- peer_tep->te_state = NEXTSTATE(TE_ORDREL_IND, peer_tep->te_state);
+ peer_tep->te_state = nextstate[TE_ORDREL_IND][peer_tep->te_state];
/*
* reuse message block
@@ -4989,7 +5055,7 @@ tl_uderr(queue_t *wq, mblk_t *mp, t_scalar_t err)
/*
* send indication message
*/
- tep->te_state = NEXTSTATE(TE_UDERROR_IND, tep->te_state);
+ tep->te_state = nextstate[TE_UDERROR_IND][tep->te_state];
qreply(wq, err_mp);
}
@@ -5047,7 +5113,7 @@ tl_unitdata(mblk_t *mp, tl_endpt_t *tep)
return;
}
/*
- * tep->te_state = NEXTSTATE(TE_UNITDATA_REQ, tep->te_state);
+ * tep->te_state = nextstate[TE_UNITDATA_REQ][tep->te_state];
* (state does not change on this event)
*/
@@ -5346,7 +5412,7 @@ tl_unitdata(mblk_t *mp, tl_endpt_t *tep)
/*
* send indication message
*/
- peer_tep->te_state = NEXTSTATE(TE_UNITDATA_IND, peer_tep->te_state);
+ peer_tep->te_state = nextstate[TE_UNITDATA_IND][peer_tep->te_state];
putnext(peer_tep->te_rq, mp);
}
@@ -5668,12 +5734,12 @@ tl_co_unconnect(tl_endpt_t *tep)
*/
if (srv_tep->te_nicon == 1) {
srv_tep->te_state =
- NEXTSTATE(TE_DISCON_IND2,
- srv_tep->te_state);
+ nextstate[TE_DISCON_IND2]
+ [srv_tep->te_state];
} else {
srv_tep->te_state =
- NEXTSTATE(TE_DISCON_IND3,
- srv_tep->te_state);
+ nextstate[TE_DISCON_IND3]
+ [srv_tep->te_state];
}
ASSERT(*(uint32_t *)(d_mp->b_rptr) ==
T_DISCON_IND);
@@ -5701,7 +5767,7 @@ tl_co_unconnect(tl_endpt_t *tep)
(void) (STRLOG(TL_ID, tep->te_minor, 3, SL_TRACE,
"tl_co_unconnect:connected: ordrel_ind state %d->%d",
peer_tep->te_state,
- NEXTSTATE(TE_ORDREL_IND, peer_tep->te_state)));
+ nextstate[TE_ORDREL_IND][peer_tep->te_state]));
d_mp = tl_ordrel_ind_alloc();
if (d_mp == NULL) {
(void) (STRLOG(TL_ID, tep->te_minor, 3,
@@ -5716,7 +5782,7 @@ tl_co_unconnect(tl_endpt_t *tep)
goto discon_peer;
}
peer_tep->te_state =
- NEXTSTATE(TE_ORDREL_IND, peer_tep->te_state);
+ nextstate[TE_ORDREL_IND][peer_tep->te_state];
putnext(peer_tep->te_rq, d_mp);
/*
@@ -5960,8 +6026,8 @@ tl_icon_sendmsgs(tl_endpt_t *tep, mblk_t **mpp)
putnext(tep->te_rq, mp);
break;
case T_ORDREL_IND:
- tep->te_state = NEXTSTATE(TE_ORDREL_IND,
- tep->te_state);
+ tep->te_state = nextstate[TE_ORDREL_IND]
+ [tep->te_state];
putnext(tep->te_rq, mp);
break;
case T_DISCON_IND:
diff --git a/usr/src/uts/common/os/space.c b/usr/src/uts/common/os/space.c
index 3fd8275df0..eb9f031bbc 100644
--- a/usr/src/uts/common/os/space.c
+++ b/usr/src/uts/common/os/space.c
@@ -23,6 +23,7 @@
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2016 Nexenta Systems, Inc.
+ * Copyright 2020 Joyent, Inc.
*/
/*
@@ -142,53 +143,6 @@ char dhcifname[IFNAMSIZ];
ether_addr_t etherbroadcastaddr = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-
-/*
- * Data from timod that must be resident
- */
-
-/*
- * state transition table for TI interface
- */
-#include <sys/tihdr.h>
-
-#define nr 127 /* not reachable */
-
-char ti_statetbl[TE_NOEVENTS][TS_NOSTATES] = {
- /* STATES */
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */
-
- { 1, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, 2, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, 4, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, 0, 3, nr, 3, 3, nr, nr, 7, nr, nr, nr, 6, 7, 9, 10, 11},
- {nr, nr, 0, nr, nr, 6, nr, nr, nr, nr, nr, nr, 3, nr, 3, 3, 3},
- {nr, nr, nr, nr, nr, nr, nr, nr, 9, nr, nr, nr, nr, 3, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, 3, nr, nr, nr, nr, 3, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, 7, nr, nr, nr, nr, 7, nr, nr, nr},
- {nr, nr, nr, 5, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, 8, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, 12, 13, nr, 14, 15, 16, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, nr, 11, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, nr, 11, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, nr, 10, nr, 3, nr, nr, nr, nr, nr},
- {nr, nr, nr, 7, nr, nr, nr, 7, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, 9, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, 10, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, nr, 9, 10, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, nr, nr, 11, 3, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, 3, nr, nr, 3, 3, 3, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, nr, nr, nr, nr, 7, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, 9, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
- {nr, nr, nr, 3, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr, nr},
-};
-
-
#include <sys/tty.h>
#include <sys/ptyvar.h>
diff --git a/usr/src/uts/common/sys/tihdr.h b/usr/src/uts/common/sys/tihdr.h
index 8332ec71bd..1870218806 100644
--- a/usr/src/uts/common/sys/tihdr.h
+++ b/usr/src/uts/common/sys/tihdr.h
@@ -24,6 +24,7 @@
/*
* Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2020 Joyent, Inc.
*/
#ifndef _SYS_TIHDR_H
@@ -180,44 +181,6 @@ extern "C" {
#endif /* _KERNEL */
/*
- * The following are the events that drive the state machine
- */
-/* Initialization events */
-#define TE_BIND_REQ 0 /* bind request */
-#define TE_UNBIND_REQ 1 /* unbind request */
-#define TE_OPTMGMT_REQ 2 /* manage options req */
-#define TE_BIND_ACK 3 /* bind acknowledment */
-#define TE_OPTMGMT_ACK 4 /* manage options ack */
-#define TE_ERROR_ACK 5 /* error acknowledgment */
-#define TE_OK_ACK1 6 /* ok ack seqcnt == 0 */
-#define TE_OK_ACK2 7 /* ok ack seqcnt == 1, q == resq */
-#define TE_OK_ACK3 8 /* ok ack seqcnt == 1, q != resq */
-#define TE_OK_ACK4 9 /* ok ack seqcnt > 1 */
-
-/* Connection oriented events */
-#define TE_CONN_REQ 10 /* connection request */
-#define TE_CONN_RES 11 /* connection response */
-#define TE_DISCON_REQ 12 /* disconnect request */
-#define TE_DATA_REQ 13 /* data request */
-#define TE_EXDATA_REQ 14 /* expedited data request */
-#define TE_ORDREL_REQ 15 /* orderly release req */
-#define TE_CONN_IND 16 /* connection indication */
-#define TE_CONN_CON 17 /* connection confirmation */
-#define TE_DATA_IND 18 /* data indication */
-#define TE_EXDATA_IND 19 /* expedited data indication */
-#define TE_ORDREL_IND 20 /* orderly release ind */
-#define TE_DISCON_IND1 21 /* disconnect indication seq == 0 */
-#define TE_DISCON_IND2 22 /* disconnect indication seq == 1 */
-#define TE_DISCON_IND3 23 /* disconnect indication seq > 1 */
-#define TE_PASS_CONN 24 /* pass connection */
-
-/* Unit data events */
-#define TE_UNITDATA_REQ 25 /* unitdata request */
-#define TE_UNITDATA_IND 26 /* unitdata indication */
-#define TE_UDERROR_IND 27 /* unitdata error indication */
-
-#define TE_NOEVENTS 28
-/*
* The following are the possible states of the Transport
* Service Interface
*/