1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 #ifndef _IDM_CONN_SM_H_ 27 #define _IDM_CONN_SM_H_ 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 34 /* 35 * IDM connection state machine events. Most events get generated internally 36 * either by the state machine or by the IDM TX/RX code. For example when IDM 37 * receives a login request for a target connectionit will generate a 38 * CE_LOGIN_RCV event. Similarly when the target sends a successful login 39 * response IDM generate a "CE_LOGIN_SUCCESS_SND" event. The following 40 * events are not detected on the TX/RX path and must be generated explicitly 41 * by the client when appropriate: 42 * 43 * CE_LOGOUT_OTHER_CONN_RCV 44 * CE_ASYNC_DROP_CONN_RCV (Only because the message may be received on 45 * a different connection from the connection being dropped) 46 * CE_ASYNC_DROP_ALL_CONN_RCV 47 * CE_LOGOUT_OTHER_CONN_SND 48 * CE_ASYNC_DROP_ALL_CONN_SND 49 * 50 * The following events might occur in any state since they are driven 51 * by the PDU's that IDM receives: 52 * 53 * CE_LOGIN_RCV 54 * CE_LOGIN_SUCCESS_RCV 55 * CE_LOGIN_FAIL_RCV 56 * CE_LOGOUT_SUCCESS_RCV 57 * CE_LOGOUT_FAIL_RCV 58 * CE_ASYNC_LOGOUT_RCV 59 * CE_MISC_RCV 60 * CE_RX_PROTOCOL_ERROR 61 */ 62 63 #define IDM_LOGIN_SECONDS 20 64 #define IDM_LOGOUT_SECONDS 20 65 #define IDM_CLEANUP_SECONDS 0 66 67 /* Update idm_ce_name table whenever connection events are modified */ 68 typedef enum { 69 CE_UNDEFINED = 0, 70 71 /* Initiator events */ 72 CE_CONNECT_REQ, 73 CE_CONNECT_FAIL, 74 CE_CONNECT_SUCCESS, 75 CE_LOGIN_SND, 76 CE_LOGIN_SUCCESS_RCV, 77 CE_LOGIN_FAIL_RCV, 78 CE_LOGOUT_THIS_CONN_SND, 79 CE_LOGOUT_OTHER_CONN_SND, 80 CE_LOGOUT_SESSION_SND, 81 CE_LOGOUT_SUCCESS_RCV, 82 CE_LOGOUT_FAIL_RCV, 83 CE_ASYNC_LOGOUT_RCV, 84 CE_ASYNC_DROP_CONN_RCV, 85 CE_ASYNC_DROP_ALL_CONN_RCV, 86 87 /* Target events */ 88 CE_CONNECT_ACCEPT, 89 CE_CONNECT_REJECT, 90 CE_LOGIN_RCV, 91 CE_LOGIN_TIMEOUT, 92 CE_LOGIN_SUCCESS_SND, 93 CE_LOGIN_FAIL_SND, 94 CE_LOGIN_FAIL_SND_DONE, 95 CE_LOGOUT_THIS_CONN_RCV, 96 CE_LOGOUT_OTHER_CONN_RCV, 97 CE_LOGOUT_SESSION_RCV, 98 CE_LOGOUT_SUCCESS_SND, 99 CE_LOGOUT_SUCCESS_SND_DONE, 100 CE_LOGOUT_FAIL_SND, 101 CE_LOGOUT_FAIL_SND_DONE, 102 CE_CLEANUP_TIMEOUT, 103 CE_ASYNC_LOGOUT_SND, 104 CE_ASYNC_DROP_CONN_SND, 105 CE_ASYNC_DROP_ALL_CONN_SND, 106 CE_LOGOUT_TIMEOUT, 107 108 /* Common events */ 109 CE_TRANSPORT_FAIL, 110 CE_MISC_TX, 111 CE_TX_PROTOCOL_ERROR, 112 CE_MISC_RX, 113 CE_RX_PROTOCOL_ERROR, 114 CE_LOGOUT_SESSION_SUCCESS, 115 CE_CONN_REINSTATE, 116 CE_CONN_REINSTATE_SUCCESS, 117 CE_CONN_REINSTATE_FAIL, 118 CE_ENABLE_DM_SUCCESS, 119 CE_ENABLE_DM_FAIL, 120 121 /* Add new events above CE_MAX_EVENT */ 122 CE_MAX_EVENT 123 } idm_conn_event_t; 124 125 #ifdef IDM_CONN_SM_STRINGS 126 /* An array of event text values, for use in logging events */ 127 static const char *idm_ce_name[CE_MAX_EVENT+1] = { 128 "CE_UNDEFINED", 129 "CE_CONNECT_REQ", 130 "CE_CONNECT_FAIL", 131 "CE_CONNECT_SUCCESS", 132 "CE_LOGIN_SND", 133 "CE_LOGIN_SUCCESS_RCV", 134 "CE_LOGIN_FAIL_RCV", 135 "CE_LOGOUT_THIS_CONN_SND", 136 "CE_LOGOUT_OTHER_CONN_SND", 137 "CE_LOGOUT_SESSION_SND", 138 "CE_LOGOUT_SUCCESS_RCV", 139 "CE_LOGOUT_FAIL_RCV", 140 "CE_ASYNC_LOGOUT_RCV", 141 "CE_ASYNC_DROP_CONN_RCV", 142 "CE_ASYNC_DROP_ALL_CONN_RCV", 143 "CE_CONNECT_ACCEPT", 144 "CE_CONNECT_REJECT", 145 "CE_LOGIN_RCV", 146 "CE_LOGIN_TIMEOUT", 147 "CE_LOGIN_SUCCESS_SND", 148 "CE_LOGIN_FAIL_SND", 149 "CE_LOGIN_FAIL_SND_DONE", 150 "CE_LOGOUT_THIS_CONN_RCV", 151 "CE_LOGOUT_OTHER_CONN_RCV", 152 "CE_LOGOUT_SESSION_RCV", 153 "CE_LOGOUT_SUCCESS_SND", 154 "CE_LOGOUT_SUCCESS_SND_DONE", 155 "CE_LOGOUT_FAIL_SND", 156 "CE_LOGOUT_FAIL_SND_DONE", 157 "CE_CLEANUP_TIMEOUT", 158 "CE_ASYNC_LOGOUT_SND", 159 "CE_ASYNC_DROP_CONN_SND", 160 "CE_ASYNC_DROP_ALL_CONN_SND", 161 "CE_LOGOUT_TIMEOUT", 162 "CE_TRANSPORT_FAIL", 163 "CE_MISC_TX", 164 "CE_TX_PROTOCOL_ERROR", 165 "CE_MISC_RX", 166 "CE_RX_PROTOCOL_ERROR", 167 "CE_LOGOUT_SESSION_SUCCESS", 168 "CE_CONN_REINSTATE", 169 "CE_CONN_REINSTATE_SUCCESS", 170 "CE_CONN_REINSTATE_FAIL", 171 "CE_ENABLE_DM_SUCCESS", 172 "CE_ENABLE_DM_FAIL", 173 "CE_MAX_EVENT" 174 }; 175 #endif 176 177 /* Update idm_cs_name table whenever connection states are modified */ 178 typedef enum { 179 CS_S0_UNDEFINED = 0, 180 181 CS_S1_FREE, 182 CS_S2_XPT_WAIT, 183 CS_S3_XPT_UP, 184 CS_S4_IN_LOGIN, 185 CS_S5_LOGGED_IN, 186 CS_S6_IN_LOGOUT, 187 CS_S7_LOGOUT_REQ, 188 CS_S8_CLEANUP, 189 CS_S9_INIT_ERROR, 190 CS_S10_IN_CLEANUP, 191 CS_S11_COMPLETE, 192 CS_S12_ENABLE_DM, 193 CS_S9A_REJECTED, 194 CS_S9B_WAIT_SND_DONE, 195 196 /* Add new connection states above CS_MAX_STATE */ 197 CS_MAX_STATE 198 } idm_conn_state_t; 199 200 #ifdef IDM_CONN_SM_STRINGS 201 /* An array of state text values, for use in logging state transitions */ 202 static const char *idm_cs_name[CS_MAX_STATE+1] = { 203 "CS_S0_UNDEFINED", 204 "CS_S1_FREE", 205 "CS_S2_XPT_WAIT", 206 "CS_S3_XPT_UP", 207 "CS_S4_IN_LOGIN", 208 "CS_S5_LOGGED_IN", 209 "CS_S6_IN_LOGOUT", 210 "CS_S7_LOGOUT_REQ", 211 "CS_S8_CLEANUP", 212 "CS_S9_INIT_ERROR", 213 "CS_S10_IN_CLEANUP", 214 "CS_S11_COMPLETE", 215 "CS_S12_ENABLE_DM", 216 "CS_S9A_REJECTED", 217 "CS_S9B_WAIT_SND_DONE", 218 "CS_MAX_STATE" 219 }; 220 #endif 221 222 typedef enum { 223 CT_NONE = 0, 224 CT_RX_PDU, 225 CT_TX_PDU 226 } idm_pdu_event_type_t; 227 228 typedef enum { 229 CA_TX_PROTOCOL_ERROR, /* Send "protocol error" to state machine */ 230 CA_RX_PROTOCOL_ERROR, /* Send "protocol error" to state machine */ 231 CA_FORWARD, /* State machine event and forward to client */ 232 CA_DROP /* Drop PDU */ 233 } idm_pdu_event_action_t; 234 235 typedef struct { 236 struct idm_conn_s *iec_ic; 237 idm_conn_event_t iec_event; 238 uintptr_t iec_info; 239 idm_pdu_event_type_t iec_pdu_event_type; 240 boolean_t iec_pdu_forwarded; 241 } idm_conn_event_ctx_t; 242 243 idm_status_t 244 idm_conn_sm_init(struct idm_conn_s *ic); 245 246 void 247 idm_conn_sm_fini(struct idm_conn_s *ic); 248 249 idm_status_t 250 idm_notify_client(struct idm_conn_s *ic, idm_client_notify_t cn, 251 uintptr_t data); 252 253 void 254 idm_conn_event(struct idm_conn_s *ic, idm_conn_event_t event, uintptr_t data); 255 256 void 257 idm_conn_event(struct idm_conn_s *ic, idm_conn_event_t event, uintptr_t data); 258 259 void 260 idm_conn_event_locked(struct idm_conn_s *ic, idm_conn_event_t event, 261 uintptr_t event_info, idm_pdu_event_type_t pdu_event_type); 262 263 idm_status_t 264 idm_conn_reinstate_event(struct idm_conn_s *old_ic, struct idm_conn_s *new_ic); 265 266 void 267 idm_conn_tx_pdu_event(struct idm_conn_s *ic, idm_conn_event_t event, 268 uintptr_t data); 269 270 void 271 idm_conn_rx_pdu_event(struct idm_conn_s *ic, idm_conn_event_t event, 272 uintptr_t data); 273 274 char * 275 idm_conn_state_str(struct idm_conn_s *ic); 276 277 #ifdef __cplusplus 278 } 279 #endif 280 281 #endif /* _IDM_CONN_SM_H_ */ 282