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_ */