17978SPeter.Dunlap@Sun.COM /* 27978SPeter.Dunlap@Sun.COM * CDDL HEADER START 37978SPeter.Dunlap@Sun.COM * 47978SPeter.Dunlap@Sun.COM * The contents of this file are subject to the terms of the 57978SPeter.Dunlap@Sun.COM * Common Development and Distribution License (the "License"). 67978SPeter.Dunlap@Sun.COM * You may not use this file except in compliance with the License. 77978SPeter.Dunlap@Sun.COM * 87978SPeter.Dunlap@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97978SPeter.Dunlap@Sun.COM * or http://www.opensolaris.org/os/licensing. 107978SPeter.Dunlap@Sun.COM * See the License for the specific language governing permissions 117978SPeter.Dunlap@Sun.COM * and limitations under the License. 127978SPeter.Dunlap@Sun.COM * 137978SPeter.Dunlap@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 147978SPeter.Dunlap@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157978SPeter.Dunlap@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 167978SPeter.Dunlap@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 177978SPeter.Dunlap@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 187978SPeter.Dunlap@Sun.COM * 197978SPeter.Dunlap@Sun.COM * CDDL HEADER END 207978SPeter.Dunlap@Sun.COM */ 217978SPeter.Dunlap@Sun.COM 227978SPeter.Dunlap@Sun.COM /* 23*11552SPeter.Cudhea@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 247978SPeter.Dunlap@Sun.COM * Use is subject to license terms. 257978SPeter.Dunlap@Sun.COM */ 267978SPeter.Dunlap@Sun.COM #ifndef _IDM_CONN_SM_H_ 277978SPeter.Dunlap@Sun.COM #define _IDM_CONN_SM_H_ 287978SPeter.Dunlap@Sun.COM 297978SPeter.Dunlap@Sun.COM #ifdef __cplusplus 307978SPeter.Dunlap@Sun.COM extern "C" { 317978SPeter.Dunlap@Sun.COM #endif 327978SPeter.Dunlap@Sun.COM 337978SPeter.Dunlap@Sun.COM 347978SPeter.Dunlap@Sun.COM /* 357978SPeter.Dunlap@Sun.COM * IDM connection state machine events. Most events get generated internally 367978SPeter.Dunlap@Sun.COM * either by the state machine or by the IDM TX/RX code. For example when IDM 377978SPeter.Dunlap@Sun.COM * receives a login request for a target connectionit will generate a 387978SPeter.Dunlap@Sun.COM * CE_LOGIN_RCV event. Similarly when the target sends a successful login 397978SPeter.Dunlap@Sun.COM * response IDM generate a "CE_LOGIN_SUCCESS_SND" event. The following 407978SPeter.Dunlap@Sun.COM * events are not detected on the TX/RX path and must be generated explicitly 417978SPeter.Dunlap@Sun.COM * by the client when appropriate: 427978SPeter.Dunlap@Sun.COM * 437978SPeter.Dunlap@Sun.COM * CE_LOGOUT_OTHER_CONN_RCV 447978SPeter.Dunlap@Sun.COM * CE_ASYNC_DROP_CONN_RCV (Only because the message may be received on 457978SPeter.Dunlap@Sun.COM * a different connection from the connection being dropped) 467978SPeter.Dunlap@Sun.COM * CE_ASYNC_DROP_ALL_CONN_RCV 477978SPeter.Dunlap@Sun.COM * CE_LOGOUT_OTHER_CONN_SND 487978SPeter.Dunlap@Sun.COM * CE_ASYNC_DROP_ALL_CONN_SND 497978SPeter.Dunlap@Sun.COM * 507978SPeter.Dunlap@Sun.COM * The following events might occur in any state since they are driven 517978SPeter.Dunlap@Sun.COM * by the PDU's that IDM receives: 527978SPeter.Dunlap@Sun.COM * 537978SPeter.Dunlap@Sun.COM * CE_LOGIN_RCV 547978SPeter.Dunlap@Sun.COM * CE_LOGIN_SUCCESS_RCV 557978SPeter.Dunlap@Sun.COM * CE_LOGIN_FAIL_RCV 567978SPeter.Dunlap@Sun.COM * CE_LOGOUT_SUCCESS_RCV 577978SPeter.Dunlap@Sun.COM * CE_LOGOUT_FAIL_RCV 587978SPeter.Dunlap@Sun.COM * CE_ASYNC_LOGOUT_RCV 597978SPeter.Dunlap@Sun.COM * CE_MISC_RCV 607978SPeter.Dunlap@Sun.COM * CE_RX_PROTOCOL_ERROR 617978SPeter.Dunlap@Sun.COM */ 627978SPeter.Dunlap@Sun.COM 637978SPeter.Dunlap@Sun.COM #define IDM_LOGIN_SECONDS 20 647978SPeter.Dunlap@Sun.COM #define IDM_LOGOUT_SECONDS 20 657978SPeter.Dunlap@Sun.COM #define IDM_CLEANUP_SECONDS 0 667978SPeter.Dunlap@Sun.COM 677978SPeter.Dunlap@Sun.COM /* Update idm_ce_name table whenever connection events are modified */ 687978SPeter.Dunlap@Sun.COM typedef enum { 697978SPeter.Dunlap@Sun.COM CE_UNDEFINED = 0, 707978SPeter.Dunlap@Sun.COM 717978SPeter.Dunlap@Sun.COM /* Initiator events */ 727978SPeter.Dunlap@Sun.COM CE_CONNECT_REQ, 737978SPeter.Dunlap@Sun.COM CE_CONNECT_FAIL, 747978SPeter.Dunlap@Sun.COM CE_CONNECT_SUCCESS, 757978SPeter.Dunlap@Sun.COM CE_LOGIN_SND, 767978SPeter.Dunlap@Sun.COM CE_LOGIN_SUCCESS_RCV, 777978SPeter.Dunlap@Sun.COM CE_LOGIN_FAIL_RCV, 787978SPeter.Dunlap@Sun.COM CE_LOGOUT_THIS_CONN_SND, 797978SPeter.Dunlap@Sun.COM CE_LOGOUT_OTHER_CONN_SND, 807978SPeter.Dunlap@Sun.COM CE_LOGOUT_SESSION_SND, 817978SPeter.Dunlap@Sun.COM CE_LOGOUT_SUCCESS_RCV, 827978SPeter.Dunlap@Sun.COM CE_LOGOUT_FAIL_RCV, 837978SPeter.Dunlap@Sun.COM CE_ASYNC_LOGOUT_RCV, 847978SPeter.Dunlap@Sun.COM CE_ASYNC_DROP_CONN_RCV, 857978SPeter.Dunlap@Sun.COM CE_ASYNC_DROP_ALL_CONN_RCV, 867978SPeter.Dunlap@Sun.COM 877978SPeter.Dunlap@Sun.COM /* Target events */ 887978SPeter.Dunlap@Sun.COM CE_CONNECT_ACCEPT, 897978SPeter.Dunlap@Sun.COM CE_CONNECT_REJECT, 907978SPeter.Dunlap@Sun.COM CE_LOGIN_RCV, 917978SPeter.Dunlap@Sun.COM CE_LOGIN_TIMEOUT, 927978SPeter.Dunlap@Sun.COM CE_LOGIN_SUCCESS_SND, 937978SPeter.Dunlap@Sun.COM CE_LOGIN_FAIL_SND, 947978SPeter.Dunlap@Sun.COM CE_LOGIN_FAIL_SND_DONE, 957978SPeter.Dunlap@Sun.COM CE_LOGOUT_THIS_CONN_RCV, 967978SPeter.Dunlap@Sun.COM CE_LOGOUT_OTHER_CONN_RCV, 977978SPeter.Dunlap@Sun.COM CE_LOGOUT_SESSION_RCV, 987978SPeter.Dunlap@Sun.COM CE_LOGOUT_SUCCESS_SND, 997978SPeter.Dunlap@Sun.COM CE_LOGOUT_SUCCESS_SND_DONE, 1007978SPeter.Dunlap@Sun.COM CE_LOGOUT_FAIL_SND, 1017978SPeter.Dunlap@Sun.COM CE_LOGOUT_FAIL_SND_DONE, 1027978SPeter.Dunlap@Sun.COM CE_CLEANUP_TIMEOUT, 1037978SPeter.Dunlap@Sun.COM CE_ASYNC_LOGOUT_SND, 1047978SPeter.Dunlap@Sun.COM CE_ASYNC_DROP_CONN_SND, 1057978SPeter.Dunlap@Sun.COM CE_ASYNC_DROP_ALL_CONN_SND, 1067978SPeter.Dunlap@Sun.COM CE_LOGOUT_TIMEOUT, 1077978SPeter.Dunlap@Sun.COM 1087978SPeter.Dunlap@Sun.COM /* Common events */ 1097978SPeter.Dunlap@Sun.COM CE_TRANSPORT_FAIL, 1107978SPeter.Dunlap@Sun.COM CE_MISC_TX, 1117978SPeter.Dunlap@Sun.COM CE_TX_PROTOCOL_ERROR, 1127978SPeter.Dunlap@Sun.COM CE_MISC_RX, 1137978SPeter.Dunlap@Sun.COM CE_RX_PROTOCOL_ERROR, 1147978SPeter.Dunlap@Sun.COM CE_LOGOUT_SESSION_SUCCESS, 1157978SPeter.Dunlap@Sun.COM CE_CONN_REINSTATE, 1167978SPeter.Dunlap@Sun.COM CE_CONN_REINSTATE_SUCCESS, 1177978SPeter.Dunlap@Sun.COM CE_CONN_REINSTATE_FAIL, 1187978SPeter.Dunlap@Sun.COM CE_ENABLE_DM_SUCCESS, 1197978SPeter.Dunlap@Sun.COM CE_ENABLE_DM_FAIL, 1207978SPeter.Dunlap@Sun.COM 1217978SPeter.Dunlap@Sun.COM /* Add new events above CE_MAX_EVENT */ 1227978SPeter.Dunlap@Sun.COM CE_MAX_EVENT 1237978SPeter.Dunlap@Sun.COM } idm_conn_event_t; 1247978SPeter.Dunlap@Sun.COM 1257978SPeter.Dunlap@Sun.COM #ifdef IDM_CONN_SM_STRINGS 1267978SPeter.Dunlap@Sun.COM /* An array of event text values, for use in logging events */ 1277978SPeter.Dunlap@Sun.COM static const char *idm_ce_name[CE_MAX_EVENT+1] = { 1287978SPeter.Dunlap@Sun.COM "CE_UNDEFINED", 1297978SPeter.Dunlap@Sun.COM "CE_CONNECT_REQ", 1307978SPeter.Dunlap@Sun.COM "CE_CONNECT_FAIL", 1317978SPeter.Dunlap@Sun.COM "CE_CONNECT_SUCCESS", 1327978SPeter.Dunlap@Sun.COM "CE_LOGIN_SND", 1337978SPeter.Dunlap@Sun.COM "CE_LOGIN_SUCCESS_RCV", 1347978SPeter.Dunlap@Sun.COM "CE_LOGIN_FAIL_RCV", 1357978SPeter.Dunlap@Sun.COM "CE_LOGOUT_THIS_CONN_SND", 1367978SPeter.Dunlap@Sun.COM "CE_LOGOUT_OTHER_CONN_SND", 1377978SPeter.Dunlap@Sun.COM "CE_LOGOUT_SESSION_SND", 1387978SPeter.Dunlap@Sun.COM "CE_LOGOUT_SUCCESS_RCV", 1397978SPeter.Dunlap@Sun.COM "CE_LOGOUT_FAIL_RCV", 1407978SPeter.Dunlap@Sun.COM "CE_ASYNC_LOGOUT_RCV", 1417978SPeter.Dunlap@Sun.COM "CE_ASYNC_DROP_CONN_RCV", 1427978SPeter.Dunlap@Sun.COM "CE_ASYNC_DROP_ALL_CONN_RCV", 1437978SPeter.Dunlap@Sun.COM "CE_CONNECT_ACCEPT", 1447978SPeter.Dunlap@Sun.COM "CE_CONNECT_REJECT", 1457978SPeter.Dunlap@Sun.COM "CE_LOGIN_RCV", 1467978SPeter.Dunlap@Sun.COM "CE_LOGIN_TIMEOUT", 1477978SPeter.Dunlap@Sun.COM "CE_LOGIN_SUCCESS_SND", 1487978SPeter.Dunlap@Sun.COM "CE_LOGIN_FAIL_SND", 1497978SPeter.Dunlap@Sun.COM "CE_LOGIN_FAIL_SND_DONE", 1507978SPeter.Dunlap@Sun.COM "CE_LOGOUT_THIS_CONN_RCV", 1517978SPeter.Dunlap@Sun.COM "CE_LOGOUT_OTHER_CONN_RCV", 1527978SPeter.Dunlap@Sun.COM "CE_LOGOUT_SESSION_RCV", 1537978SPeter.Dunlap@Sun.COM "CE_LOGOUT_SUCCESS_SND", 1547978SPeter.Dunlap@Sun.COM "CE_LOGOUT_SUCCESS_SND_DONE", 1557978SPeter.Dunlap@Sun.COM "CE_LOGOUT_FAIL_SND", 1567978SPeter.Dunlap@Sun.COM "CE_LOGOUT_FAIL_SND_DONE", 1577978SPeter.Dunlap@Sun.COM "CE_CLEANUP_TIMEOUT", 1587978SPeter.Dunlap@Sun.COM "CE_ASYNC_LOGOUT_SND", 1597978SPeter.Dunlap@Sun.COM "CE_ASYNC_DROP_CONN_SND", 1607978SPeter.Dunlap@Sun.COM "CE_ASYNC_DROP_ALL_CONN_SND", 1617978SPeter.Dunlap@Sun.COM "CE_LOGOUT_TIMEOUT", 1627978SPeter.Dunlap@Sun.COM "CE_TRANSPORT_FAIL", 1637978SPeter.Dunlap@Sun.COM "CE_MISC_TX", 1647978SPeter.Dunlap@Sun.COM "CE_TX_PROTOCOL_ERROR", 1657978SPeter.Dunlap@Sun.COM "CE_MISC_RX", 1667978SPeter.Dunlap@Sun.COM "CE_RX_PROTOCOL_ERROR", 1677978SPeter.Dunlap@Sun.COM "CE_LOGOUT_SESSION_SUCCESS", 1687978SPeter.Dunlap@Sun.COM "CE_CONN_REINSTATE", 1697978SPeter.Dunlap@Sun.COM "CE_CONN_REINSTATE_SUCCESS", 1707978SPeter.Dunlap@Sun.COM "CE_CONN_REINSTATE_FAIL", 1717978SPeter.Dunlap@Sun.COM "CE_ENABLE_DM_SUCCESS", 1727978SPeter.Dunlap@Sun.COM "CE_ENABLE_DM_FAIL", 1737978SPeter.Dunlap@Sun.COM "CE_MAX_EVENT" 1747978SPeter.Dunlap@Sun.COM }; 1757978SPeter.Dunlap@Sun.COM #endif 1767978SPeter.Dunlap@Sun.COM 1777978SPeter.Dunlap@Sun.COM /* Update idm_cs_name table whenever connection states are modified */ 1787978SPeter.Dunlap@Sun.COM typedef enum { 1797978SPeter.Dunlap@Sun.COM CS_S0_UNDEFINED = 0, 1807978SPeter.Dunlap@Sun.COM 1817978SPeter.Dunlap@Sun.COM CS_S1_FREE, 1827978SPeter.Dunlap@Sun.COM CS_S2_XPT_WAIT, 1837978SPeter.Dunlap@Sun.COM CS_S3_XPT_UP, 1847978SPeter.Dunlap@Sun.COM CS_S4_IN_LOGIN, 1857978SPeter.Dunlap@Sun.COM CS_S5_LOGGED_IN, 1867978SPeter.Dunlap@Sun.COM CS_S6_IN_LOGOUT, 1877978SPeter.Dunlap@Sun.COM CS_S7_LOGOUT_REQ, 1887978SPeter.Dunlap@Sun.COM CS_S8_CLEANUP, 1897978SPeter.Dunlap@Sun.COM CS_S9_INIT_ERROR, 1907978SPeter.Dunlap@Sun.COM CS_S10_IN_CLEANUP, 1917978SPeter.Dunlap@Sun.COM CS_S11_COMPLETE, 1927978SPeter.Dunlap@Sun.COM CS_S12_ENABLE_DM, 193*11552SPeter.Cudhea@Sun.COM CS_S9A_REJECTED, 194*11552SPeter.Cudhea@Sun.COM CS_S9B_WAIT_SND_DONE, 1957978SPeter.Dunlap@Sun.COM 1967978SPeter.Dunlap@Sun.COM /* Add new connection states above CS_MAX_STATE */ 1977978SPeter.Dunlap@Sun.COM CS_MAX_STATE 1987978SPeter.Dunlap@Sun.COM } idm_conn_state_t; 1997978SPeter.Dunlap@Sun.COM 2007978SPeter.Dunlap@Sun.COM #ifdef IDM_CONN_SM_STRINGS 2017978SPeter.Dunlap@Sun.COM /* An array of state text values, for use in logging state transitions */ 2027978SPeter.Dunlap@Sun.COM static const char *idm_cs_name[CS_MAX_STATE+1] = { 2037978SPeter.Dunlap@Sun.COM "CS_S0_UNDEFINED", 2047978SPeter.Dunlap@Sun.COM "CS_S1_FREE", 2057978SPeter.Dunlap@Sun.COM "CS_S2_XPT_WAIT", 2067978SPeter.Dunlap@Sun.COM "CS_S3_XPT_UP", 2077978SPeter.Dunlap@Sun.COM "CS_S4_IN_LOGIN", 2087978SPeter.Dunlap@Sun.COM "CS_S5_LOGGED_IN", 2097978SPeter.Dunlap@Sun.COM "CS_S6_IN_LOGOUT", 2107978SPeter.Dunlap@Sun.COM "CS_S7_LOGOUT_REQ", 2117978SPeter.Dunlap@Sun.COM "CS_S8_CLEANUP", 2127978SPeter.Dunlap@Sun.COM "CS_S9_INIT_ERROR", 2137978SPeter.Dunlap@Sun.COM "CS_S10_IN_CLEANUP", 2147978SPeter.Dunlap@Sun.COM "CS_S11_COMPLETE", 2157978SPeter.Dunlap@Sun.COM "CS_S12_ENABLE_DM", 216*11552SPeter.Cudhea@Sun.COM "CS_S9A_REJECTED", 217*11552SPeter.Cudhea@Sun.COM "CS_S9B_WAIT_SND_DONE", 2187978SPeter.Dunlap@Sun.COM "CS_MAX_STATE" 2197978SPeter.Dunlap@Sun.COM }; 2207978SPeter.Dunlap@Sun.COM #endif 2217978SPeter.Dunlap@Sun.COM 2227978SPeter.Dunlap@Sun.COM typedef enum { 2237978SPeter.Dunlap@Sun.COM CT_NONE = 0, 2247978SPeter.Dunlap@Sun.COM CT_RX_PDU, 2257978SPeter.Dunlap@Sun.COM CT_TX_PDU 2267978SPeter.Dunlap@Sun.COM } idm_pdu_event_type_t; 2277978SPeter.Dunlap@Sun.COM 2287978SPeter.Dunlap@Sun.COM typedef enum { 2297978SPeter.Dunlap@Sun.COM CA_TX_PROTOCOL_ERROR, /* Send "protocol error" to state machine */ 2307978SPeter.Dunlap@Sun.COM CA_RX_PROTOCOL_ERROR, /* Send "protocol error" to state machine */ 2319162SPeter.Dunlap@Sun.COM CA_FORWARD, /* State machine event and forward to client */ 2327978SPeter.Dunlap@Sun.COM CA_DROP /* Drop PDU */ 2337978SPeter.Dunlap@Sun.COM } idm_pdu_event_action_t; 2347978SPeter.Dunlap@Sun.COM 2357978SPeter.Dunlap@Sun.COM typedef struct { 2367978SPeter.Dunlap@Sun.COM struct idm_conn_s *iec_ic; 2377978SPeter.Dunlap@Sun.COM idm_conn_event_t iec_event; 2387978SPeter.Dunlap@Sun.COM uintptr_t iec_info; 2397978SPeter.Dunlap@Sun.COM idm_pdu_event_type_t iec_pdu_event_type; 2409162SPeter.Dunlap@Sun.COM boolean_t iec_pdu_forwarded; 2417978SPeter.Dunlap@Sun.COM } idm_conn_event_ctx_t; 2427978SPeter.Dunlap@Sun.COM 2437978SPeter.Dunlap@Sun.COM idm_status_t 2447978SPeter.Dunlap@Sun.COM idm_conn_sm_init(struct idm_conn_s *ic); 2457978SPeter.Dunlap@Sun.COM 2467978SPeter.Dunlap@Sun.COM void 2477978SPeter.Dunlap@Sun.COM idm_conn_sm_fini(struct idm_conn_s *ic); 2487978SPeter.Dunlap@Sun.COM 2497978SPeter.Dunlap@Sun.COM idm_status_t 2507978SPeter.Dunlap@Sun.COM idm_notify_client(struct idm_conn_s *ic, idm_client_notify_t cn, 2517978SPeter.Dunlap@Sun.COM uintptr_t data); 2527978SPeter.Dunlap@Sun.COM 2537978SPeter.Dunlap@Sun.COM void 2547978SPeter.Dunlap@Sun.COM idm_conn_event(struct idm_conn_s *ic, idm_conn_event_t event, uintptr_t data); 2557978SPeter.Dunlap@Sun.COM 2569162SPeter.Dunlap@Sun.COM void 2579162SPeter.Dunlap@Sun.COM idm_conn_event(struct idm_conn_s *ic, idm_conn_event_t event, uintptr_t data); 2589162SPeter.Dunlap@Sun.COM 2599162SPeter.Dunlap@Sun.COM void 2609162SPeter.Dunlap@Sun.COM idm_conn_event_locked(struct idm_conn_s *ic, idm_conn_event_t event, 2619162SPeter.Dunlap@Sun.COM uintptr_t event_info, idm_pdu_event_type_t pdu_event_type); 2629162SPeter.Dunlap@Sun.COM 2637978SPeter.Dunlap@Sun.COM idm_status_t 2647978SPeter.Dunlap@Sun.COM idm_conn_reinstate_event(struct idm_conn_s *old_ic, struct idm_conn_s *new_ic); 2657978SPeter.Dunlap@Sun.COM 2667978SPeter.Dunlap@Sun.COM void 2677978SPeter.Dunlap@Sun.COM idm_conn_tx_pdu_event(struct idm_conn_s *ic, idm_conn_event_t event, 2687978SPeter.Dunlap@Sun.COM uintptr_t data); 2697978SPeter.Dunlap@Sun.COM 2707978SPeter.Dunlap@Sun.COM void 2717978SPeter.Dunlap@Sun.COM idm_conn_rx_pdu_event(struct idm_conn_s *ic, idm_conn_event_t event, 2727978SPeter.Dunlap@Sun.COM uintptr_t data); 2737978SPeter.Dunlap@Sun.COM 2747978SPeter.Dunlap@Sun.COM char * 2757978SPeter.Dunlap@Sun.COM idm_conn_state_str(struct idm_conn_s *ic); 2767978SPeter.Dunlap@Sun.COM 2777978SPeter.Dunlap@Sun.COM #ifdef __cplusplus 2787978SPeter.Dunlap@Sun.COM } 2797978SPeter.Dunlap@Sun.COM #endif 2807978SPeter.Dunlap@Sun.COM 2817978SPeter.Dunlap@Sun.COM #endif /* _IDM_CONN_SM_H_ */ 282