48 * CE_LOGOUT_OTHER_CONN_SND
49 * CE_ASYNC_DROP_ALL_CONN_SND
50 *
51 * The following events might occur in any state since they are driven
52 * by the PDU's that IDM receives:
53 *
54 * CE_LOGIN_RCV
55 * CE_LOGIN_SUCCESS_RCV
56 * CE_LOGIN_FAIL_RCV
57 * CE_LOGOUT_SUCCESS_RCV
58 * CE_LOGOUT_FAIL_RCV
59 * CE_ASYNC_LOGOUT_RCV
60 * CE_MISC_RCV
61 * CE_RX_PROTOCOL_ERROR
62 */
63
64 #define IDM_LOGIN_SECONDS 20
65 #define IDM_LOGOUT_SECONDS 20
66 #define IDM_CLEANUP_SECONDS 0
67
68 /* Update idm_ce_name table whenever connection events are modified */
69 typedef enum {
70 CE_UNDEFINED = 0,
71
72 /* Initiator events */
73 CE_CONNECT_REQ,
74 CE_CONNECT_FAIL,
75 CE_CONNECT_SUCCESS,
76 CE_LOGIN_SND,
77 CE_LOGIN_SUCCESS_RCV,
78 CE_LOGIN_FAIL_RCV,
79 CE_LOGOUT_THIS_CONN_SND,
80 CE_LOGOUT_OTHER_CONN_SND,
81 CE_LOGOUT_SESSION_SND,
82 CE_LOGOUT_SUCCESS_RCV,
83 CE_LOGOUT_FAIL_RCV,
84 CE_ASYNC_LOGOUT_RCV,
85 CE_ASYNC_DROP_CONN_RCV,
86 CE_ASYNC_DROP_ALL_CONN_RCV,
87
88 /* Target events */
89 CE_CONNECT_ACCEPT,
90 CE_CONNECT_REJECT,
91 CE_LOGIN_RCV,
92 CE_LOGIN_TIMEOUT,
93 CE_LOGIN_SUCCESS_SND,
94 CE_LOGIN_FAIL_SND,
95 CE_LOGIN_FAIL_SND_DONE,
96 CE_LOGOUT_THIS_CONN_RCV,
97 CE_LOGOUT_OTHER_CONN_RCV,
98 CE_LOGOUT_SESSION_RCV,
99 CE_LOGOUT_SUCCESS_SND,
100 CE_LOGOUT_SUCCESS_SND_DONE,
101 CE_LOGOUT_FAIL_SND,
102 CE_LOGOUT_FAIL_SND_DONE,
103 CE_CLEANUP_TIMEOUT,
104 CE_ASYNC_LOGOUT_SND,
105 CE_ASYNC_DROP_CONN_SND,
106 CE_ASYNC_DROP_ALL_CONN_SND,
107 CE_LOGOUT_TIMEOUT,
108
109 /* Common events */
110 CE_TRANSPORT_FAIL,
111 CE_MISC_TX,
112 CE_TX_PROTOCOL_ERROR,
113 CE_MISC_RX,
114 CE_RX_PROTOCOL_ERROR,
115 CE_LOGOUT_SESSION_SUCCESS,
116 CE_CONN_REINSTATE,
117 CE_CONN_REINSTATE_SUCCESS,
118 CE_CONN_REINSTATE_FAIL,
119 CE_ENABLE_DM_SUCCESS,
120 CE_ENABLE_DM_FAIL,
121
122 /* Add new events above CE_MAX_EVENT */
123 CE_MAX_EVENT
124 } idm_conn_event_t;
125
126 #ifdef IDM_CONN_SM_STRINGS
127 /* An array of event text values, for use in logging events */
128 static const char *idm_ce_name[CE_MAX_EVENT+1] = {
129 "CE_UNDEFINED",
130 "CE_CONNECT_REQ",
131 "CE_CONNECT_FAIL",
132 "CE_CONNECT_SUCCESS",
133 "CE_LOGIN_SND",
134 "CE_LOGIN_SUCCESS_RCV",
135 "CE_LOGIN_FAIL_RCV",
136 "CE_LOGOUT_THIS_CONN_SND",
137 "CE_LOGOUT_OTHER_CONN_SND",
138 "CE_LOGOUT_SESSION_SND",
139 "CE_LOGOUT_SUCCESS_RCV",
140 "CE_LOGOUT_FAIL_RCV",
141 "CE_ASYNC_LOGOUT_RCV",
142 "CE_ASYNC_DROP_CONN_RCV",
143 "CE_ASYNC_DROP_ALL_CONN_RCV",
144 "CE_CONNECT_ACCEPT",
145 "CE_CONNECT_REJECT",
146 "CE_LOGIN_RCV",
147 "CE_LOGIN_TIMEOUT",
148 "CE_LOGIN_SUCCESS_SND",
149 "CE_LOGIN_FAIL_SND",
150 "CE_LOGIN_FAIL_SND_DONE",
151 "CE_LOGOUT_THIS_CONN_RCV",
152 "CE_LOGOUT_OTHER_CONN_RCV",
153 "CE_LOGOUT_SESSION_RCV",
154 "CE_LOGOUT_SUCCESS_SND",
155 "CE_LOGOUT_SUCCESS_SND_DONE",
156 "CE_LOGOUT_FAIL_SND",
157 "CE_LOGOUT_FAIL_SND_DONE",
158 "CE_CLEANUP_TIMEOUT",
159 "CE_ASYNC_LOGOUT_SND",
160 "CE_ASYNC_DROP_CONN_SND",
161 "CE_ASYNC_DROP_ALL_CONN_SND",
162 "CE_LOGOUT_TIMEOUT",
163 "CE_TRANSPORT_FAIL",
164 "CE_MISC_TX",
165 "CE_TX_PROTOCOL_ERROR",
166 "CE_MISC_RX",
167 "CE_RX_PROTOCOL_ERROR",
168 "CE_LOGOUT_SESSION_SUCCESS",
169 "CE_CONN_REINSTATE",
170 "CE_CONN_REINSTATE_SUCCESS",
171 "CE_CONN_REINSTATE_FAIL",
172 "CE_ENABLE_DM_SUCCESS",
173 "CE_ENABLE_DM_FAIL",
174 "CE_MAX_EVENT"
175 };
176 #endif
177
178 /* Update idm_cs_name table whenever connection states are modified */
179 typedef enum {
180 CS_S0_UNDEFINED = 0,
181
182 CS_S1_FREE,
183 CS_S2_XPT_WAIT,
184 CS_S3_XPT_UP,
185 CS_S4_IN_LOGIN,
186 CS_S5_LOGGED_IN,
187 CS_S6_IN_LOGOUT,
188 CS_S7_LOGOUT_REQ,
189 CS_S8_CLEANUP,
190 CS_S9_INIT_ERROR,
191 CS_S10_IN_CLEANUP,
192 CS_S11_COMPLETE,
193 CS_S12_ENABLE_DM,
194 CS_S9A_REJECTED,
195 CS_S9B_WAIT_SND_DONE,
196
197 /* Add new connection states above CS_MAX_STATE */
198 CS_MAX_STATE
199 } idm_conn_state_t;
200
201 #ifdef IDM_CONN_SM_STRINGS
202 /* An array of state text values, for use in logging state transitions */
203 static const char *idm_cs_name[CS_MAX_STATE+1] = {
204 "CS_S0_UNDEFINED",
205 "CS_S1_FREE",
206 "CS_S2_XPT_WAIT",
207 "CS_S3_XPT_UP",
208 "CS_S4_IN_LOGIN",
209 "CS_S5_LOGGED_IN",
210 "CS_S6_IN_LOGOUT",
211 "CS_S7_LOGOUT_REQ",
212 "CS_S8_CLEANUP",
213 "CS_S9_INIT_ERROR",
214 "CS_S10_IN_CLEANUP",
215 "CS_S11_COMPLETE",
216 "CS_S12_ENABLE_DM",
217 "CS_S9A_REJECTED",
218 "CS_S9B_WAIT_SND_DONE",
219 "CS_MAX_STATE"
220 };
221 #endif
222
223 /*
224 * Currently the state machine has a condition where idm_login_timeout() is
225 * left active after the connection has been closed. This causes the system
226 * to panic when idm_login_timeout() modifies the freed memory. In an attempt
227 * to isolate and find this issue special attention is being placed on
228 * the ic_state_timeout value. After each untimeout call the value will now
229 * be cleared. Just before the value is set the code will check for 0 and
230 * display an error. One final change is being done in idm_conn_sm_fini() which
231 * if ic_state_machine is not 0, an error message will be displayed and
232 * untimeout() called. That should prevent customer sites from seeing the
233 * panic. The code also calls ASSERT(0) which should cause a panic during
234 * system test.
235 */
236 #define IDM_SM_TIMER_CHECK(ic) \
237 if (ic->ic_state_timeout) { \
238 cmn_err(CE_WARN, "%s: existing timeout still set. " \
239 "state: %s, last: %s\n", __func__, \
|
48 * CE_LOGOUT_OTHER_CONN_SND
49 * CE_ASYNC_DROP_ALL_CONN_SND
50 *
51 * The following events might occur in any state since they are driven
52 * by the PDU's that IDM receives:
53 *
54 * CE_LOGIN_RCV
55 * CE_LOGIN_SUCCESS_RCV
56 * CE_LOGIN_FAIL_RCV
57 * CE_LOGOUT_SUCCESS_RCV
58 * CE_LOGOUT_FAIL_RCV
59 * CE_ASYNC_LOGOUT_RCV
60 * CE_MISC_RCV
61 * CE_RX_PROTOCOL_ERROR
62 */
63
64 #define IDM_LOGIN_SECONDS 20
65 #define IDM_LOGOUT_SECONDS 20
66 #define IDM_CLEANUP_SECONDS 0
67
68 #define IDM_CONN_EVENT_LIST() \
69 item(CE_UNDEFINED) \
70 /* Initiator events */ \
71 item(CE_CONNECT_REQ) \
72 item(CE_CONNECT_FAIL) \
73 item(CE_CONNECT_SUCCESS) \
74 item(CE_LOGIN_SND) \
75 item(CE_LOGIN_SUCCESS_RCV) \
76 item(CE_LOGIN_FAIL_RCV) \
77 item(CE_LOGOUT_THIS_CONN_SND) \
78 item(CE_LOGOUT_OTHER_CONN_SND) \
79 item(CE_LOGOUT_SESSION_SND) \
80 item(CE_LOGOUT_SUCCESS_RCV) \
81 item(CE_LOGOUT_FAIL_RCV) \
82 item(CE_ASYNC_LOGOUT_RCV) \
83 item(CE_ASYNC_DROP_CONN_RCV) \
84 item(CE_ASYNC_DROP_ALL_CONN_RCV) \
85 /* Target events */ \
86 item(CE_CONNECT_ACCEPT) \
87 item(CE_CONNECT_REJECT) \
88 item(CE_LOGIN_RCV) \
89 item(CE_LOGIN_TIMEOUT) \
90 item(CE_LOGIN_SUCCESS_SND) \
91 item(CE_LOGIN_FAIL_SND) \
92 item(CE_LOGIN_FAIL_SND_DONE) \
93 item(CE_LOGOUT_THIS_CONN_RCV) \
94 item(CE_LOGOUT_OTHER_CONN_RCV) \
95 item(CE_LOGOUT_SESSION_RCV) \
96 item(CE_LOGOUT_SUCCESS_SND) \
97 item(CE_LOGOUT_SUCCESS_SND_DONE) \
98 item(CE_LOGOUT_FAIL_SND) \
99 item(CE_LOGOUT_FAIL_SND_DONE) \
100 item(CE_CLEANUP_TIMEOUT) \
101 item(CE_ASYNC_LOGOUT_SND) \
102 item(CE_ASYNC_DROP_CONN_SND) \
103 item(CE_ASYNC_DROP_ALL_CONN_SND) \
104 item(CE_LOGOUT_TIMEOUT) \
105 /* Common events */ \
106 item(CE_TRANSPORT_FAIL) \
107 item(CE_MISC_TX) \
108 item(CE_TX_PROTOCOL_ERROR) \
109 item(CE_MISC_RX) \
110 item(CE_RX_PROTOCOL_ERROR) \
111 item(CE_LOGOUT_SESSION_SUCCESS) \
112 item(CE_CONN_REINSTATE) \
113 item(CE_CONN_REINSTATE_SUCCESS) \
114 item(CE_CONN_REINSTATE_FAIL) \
115 item(CE_ENABLE_DM_SUCCESS) \
116 item(CE_ENABLE_DM_FAIL) \
117 /* Add new events above CE_MAX_EVENT */ \
118 item(CE_MAX_EVENT)
119
120 /* Update idm_ce_name table whenever connection events are modified */
121 typedef enum {
122 #define item(a) a,
123 IDM_CONN_EVENT_LIST()
124 #undef item
125 } idm_conn_event_t;
126
127 #ifdef IDM_CONN_SM_STRINGS
128 /* An array of event text values, for use in logging events */
129 static const char *idm_ce_name[CE_MAX_EVENT+1] = {
130 #define item(a) #a,
131 IDM_CONN_EVENT_LIST()
132 #undef item
133 };
134 #endif
135
136 #define CONN_STATE_LIST() \
137 item(CS_S0_UNDEFINED) \
138 item(CS_S1_FREE) \
139 item(CS_S2_XPT_WAIT) \
140 item(CS_S3_XPT_UP) \
141 item(CS_S4_IN_LOGIN) \
142 item(CS_S5_LOGGED_IN) \
143 item(CS_S6_IN_LOGOUT) \
144 item(CS_S7_LOGOUT_REQ) \
145 item(CS_S8_CLEANUP) \
146 item(CS_S9_INIT_ERROR) \
147 item(CS_S10_IN_CLEANUP) \
148 item(CS_S11_COMPLETE) \
149 item(CS_S12_ENABLE_DM) \
150 item(CS_S9A_REJECTED) \
151 item(CS_S9B_WAIT_SND_DONE) \
152 /* Add new connection states above CS_MAX_STATE */ \
153 item(CS_MAX_STATE)
154
155 /* Update idm_cs_name table whenever connection states are modified */
156 typedef enum {
157 #define item(a) a,
158 CONN_STATE_LIST()
159 #undef item
160 } idm_conn_state_t;
161
162 #ifdef IDM_CONN_SM_STRINGS
163 /* An array of state text values, for use in logging state transitions */
164 static const char *idm_cs_name[CS_MAX_STATE+1] = {
165 #define item(a) #a,
166 CONN_STATE_LIST()
167 #undef item
168 };
169 #endif
170
171 /*
172 * Currently the state machine has a condition where idm_login_timeout() is
173 * left active after the connection has been closed. This causes the system
174 * to panic when idm_login_timeout() modifies the freed memory. In an attempt
175 * to isolate and find this issue special attention is being placed on
176 * the ic_state_timeout value. After each untimeout call the value will now
177 * be cleared. Just before the value is set the code will check for 0 and
178 * display an error. One final change is being done in idm_conn_sm_fini() which
179 * if ic_state_machine is not 0, an error message will be displayed and
180 * untimeout() called. That should prevent customer sites from seeing the
181 * panic. The code also calls ASSERT(0) which should cause a panic during
182 * system test.
183 */
184 #define IDM_SM_TIMER_CHECK(ic) \
185 if (ic->ic_state_timeout) { \
186 cmn_err(CE_WARN, "%s: existing timeout still set. " \
187 "state: %s, last: %s\n", __func__, \
|