Print this page
NEX-3177 enums and string arrays required to be in sync.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Steve Peng <steve.peng@nexenta.com>
SUP-930 Freed and reused idm_conn_t buffer leads to system panic.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Steve Ping <steve.ping@nexenta.com>


  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__, \