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 /* 2212372SPriya.Krishnan@Sun.COM * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 237978SPeter.Dunlap@Sun.COM */ 247978SPeter.Dunlap@Sun.COM #ifndef _ISCSIT_H_ 257978SPeter.Dunlap@Sun.COM #define _ISCSIT_H_ 267978SPeter.Dunlap@Sun.COM 277978SPeter.Dunlap@Sun.COM #include <sys/iscsit/iscsi_if.h> 287978SPeter.Dunlap@Sun.COM #include <sys/iscsit/iscsit_common.h> 297978SPeter.Dunlap@Sun.COM 3012571SViswanathan.Kannappan@Sun.COM #include "iscsit_authclient.h" 3112571SViswanathan.Kannappan@Sun.COM 327978SPeter.Dunlap@Sun.COM /* 337978SPeter.Dunlap@Sun.COM * For some reason iscsi_protocol.h lists the max version as "0x02" and the 347978SPeter.Dunlap@Sun.COM * min version as "0x00". RFC3720 clearly states that the current version 357978SPeter.Dunlap@Sun.COM * number is 0x00 so that is what we will use. 367978SPeter.Dunlap@Sun.COM */ 377978SPeter.Dunlap@Sun.COM #define ISCSIT_MIN_VERSION 0x00 387978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_VERSION 0x00 3912372SPriya.Krishnan@Sun.COM #define ISCSIT_MAX_CONNECTIONS 32 /* MC/S support */ 407978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_RECV_DATA_SEGMENT_LENGTH (32*1024) 41*12935SPeter.Gill@Sun.COM #define ISCSIT_MAX_BURST_LENGTH (1024*1024) 427978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_FIRST_BURST_LENGTH ISCSI_DEFAULT_FIRST_BURST_LENGTH 43*12935SPeter.Gill@Sun.COM #define ISCSIT_MAX_TIME2WAIT ISCSI_MAX_TIME2WAIT 447978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_TIME2RETAIN ISCSI_DEFAULT_TIME_TO_RETAIN 457978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_OUTSTANDING_R2T ISCSI_DEFAULT_MAX_OUT_R2T 467978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_ERROR_RECOVERY_LEVEL 0 4710261SCharles.Ting@Sun.COM #define ISCSIT_MAX_OUTSTANDING_UNEXPECTED_PDUS 0 487978SPeter.Dunlap@Sun.COM 497978SPeter.Dunlap@Sun.COM #define ISCSIT_DEFAULT_TPG "iscsit-default-tpg" 507978SPeter.Dunlap@Sun.COM #define ISCSIT_DEFAULT_TPGT 1 517978SPeter.Dunlap@Sun.COM 527978SPeter.Dunlap@Sun.COM #define ISCSI_MAX_TSIH 0xffff 537978SPeter.Dunlap@Sun.COM #define ISCSI_UNSPEC_TSIH 0 547978SPeter.Dunlap@Sun.COM 557978SPeter.Dunlap@Sun.COM /* Max targets per system */ 567978SPeter.Dunlap@Sun.COM #define ISCSIT_MAX_TARGETS 1024 577978SPeter.Dunlap@Sun.COM 5812372SPriya.Krishnan@Sun.COM #define ISCSIT_MAX_WINDOW 1024 5912372SPriya.Krishnan@Sun.COM #define ISCSIT_RXPDU_QUEUE_LEN 2048 6012372SPriya.Krishnan@Sun.COM 6112372SPriya.Krishnan@Sun.COM #define ISCSIT_CMDSN_LT_EXPCMDSN -1 6212372SPriya.Krishnan@Sun.COM #define ISCSIT_CMDSN_EQ_EXPCMDSN 1 6312372SPriya.Krishnan@Sun.COM #define ISCSIT_CMDSN_GT_EXPCMDSN 0 6412372SPriya.Krishnan@Sun.COM /* 6512372SPriya.Krishnan@Sun.COM * MC/S: A timeout is maintained to recover from lost CmdSN (holes in the 6612372SPriya.Krishnan@Sun.COM * CmdSN ordering). When the timeout is reached, the ExpCmdSN is advanced 6712372SPriya.Krishnan@Sun.COM * past the hole to continue processing the queued commands. This value is 6812372SPriya.Krishnan@Sun.COM * system-tunable (volatile rxpdu_queue_threshold) and should be in the 6912372SPriya.Krishnan@Sun.COM * range from 5 to 30 seconds. 7012372SPriya.Krishnan@Sun.COM */ 7112372SPriya.Krishnan@Sun.COM #define ISCSIT_RXPDU_QUEUE_THRESHOLD 5 /* 5 seconds */ 7212372SPriya.Krishnan@Sun.COM #define ISCSIT_RXPDU_QUEUE_MONITOR_INTERVAL 5 /* 5 seconds */ 7312372SPriya.Krishnan@Sun.COM 747978SPeter.Dunlap@Sun.COM /* Time in seconds to wait between calls to stmf_deregister_local_port */ 757978SPeter.Dunlap@Sun.COM #define TGT_DEREG_RETRY_SECONDS 1 767978SPeter.Dunlap@Sun.COM 777978SPeter.Dunlap@Sun.COM #define ISCSIT_GLOBAL_LOCK(rw) rw_enter(&iscsit_global.global_rwlock, (rw)) 787978SPeter.Dunlap@Sun.COM #define ISCSIT_GLOBAL_UNLOCK() rw_exit(&iscsit_global.global_rwlock) 797978SPeter.Dunlap@Sun.COM 8012372SPriya.Krishnan@Sun.COM /* Circular buffer to hold the out-of-order PDUs in MC/S */ 8112372SPriya.Krishnan@Sun.COM typedef struct { 8212372SPriya.Krishnan@Sun.COM idm_pdu_t *cb_buffer[ISCSIT_RXPDU_QUEUE_LEN]; 8312372SPriya.Krishnan@Sun.COM int cb_num_elems; 8412372SPriya.Krishnan@Sun.COM } iscsit_cbuf_t; 8512372SPriya.Krishnan@Sun.COM 867978SPeter.Dunlap@Sun.COM /* 877978SPeter.Dunlap@Sun.COM * Used for serial number arithmetic (RFC 1982) 887978SPeter.Dunlap@Sun.COM */ 897978SPeter.Dunlap@Sun.COM #define ISCSIT_SNA32_CHECK 0x80000000 907978SPeter.Dunlap@Sun.COM 917978SPeter.Dunlap@Sun.COM typedef struct { 927978SPeter.Dunlap@Sun.COM char tpg_name[MAX_TPG_NAMELEN]; 937978SPeter.Dunlap@Sun.COM kmutex_t tpg_mutex; 947978SPeter.Dunlap@Sun.COM idm_refcnt_t tpg_refcnt; 957978SPeter.Dunlap@Sun.COM int tpg_online; 967978SPeter.Dunlap@Sun.COM avl_tree_t tpg_portal_list; 977978SPeter.Dunlap@Sun.COM avl_node_t tpg_global_ln; 987978SPeter.Dunlap@Sun.COM list_node_t tpg_delete_ln; 997978SPeter.Dunlap@Sun.COM } iscsit_tpg_t; 1007978SPeter.Dunlap@Sun.COM 1017978SPeter.Dunlap@Sun.COM #define IS_DEFAULT_TPGT(TPGT) \ 1027978SPeter.Dunlap@Sun.COM (((TPGT) != NULL) && \ 1037978SPeter.Dunlap@Sun.COM ((TPGT)->tpgt_tpg == iscsit_global.global_default_tpg)) 1047978SPeter.Dunlap@Sun.COM 1057978SPeter.Dunlap@Sun.COM typedef struct { 1067978SPeter.Dunlap@Sun.COM iscsit_tpg_t *tpgt_tpg; 1077978SPeter.Dunlap@Sun.COM idm_refcnt_t tpgt_refcnt; 1087978SPeter.Dunlap@Sun.COM avl_node_t tpgt_tgt_ln; 1097978SPeter.Dunlap@Sun.COM list_node_t tpgt_delete_ln; 1107978SPeter.Dunlap@Sun.COM uint16_t tpgt_tag; 1117978SPeter.Dunlap@Sun.COM boolean_t tpgt_needs_tpg_offline; 1127978SPeter.Dunlap@Sun.COM } iscsit_tpgt_t; 1137978SPeter.Dunlap@Sun.COM 1147978SPeter.Dunlap@Sun.COM typedef struct { 1157978SPeter.Dunlap@Sun.COM struct sockaddr_storage portal_addr; 1167978SPeter.Dunlap@Sun.COM int portal_online; 1177978SPeter.Dunlap@Sun.COM idm_refcnt_t portal_refcnt; 1187978SPeter.Dunlap@Sun.COM avl_node_t portal_tpg_ln; 1197978SPeter.Dunlap@Sun.COM iscsit_tpg_t *portal_tpg; 1207978SPeter.Dunlap@Sun.COM idm_svc_t *portal_svc; 1219373SPeter.Dunlap@Sun.COM boolean_t portal_default; 1229373SPeter.Dunlap@Sun.COM void *portal_isns; 1237978SPeter.Dunlap@Sun.COM } iscsit_portal_t; 1247978SPeter.Dunlap@Sun.COM 1257978SPeter.Dunlap@Sun.COM 1267978SPeter.Dunlap@Sun.COM /* Target states and events, update iscsit_ts_name table whenever modified */ 1277978SPeter.Dunlap@Sun.COM typedef enum { 1287978SPeter.Dunlap@Sun.COM TS_UNDEFINED = 0, 1297978SPeter.Dunlap@Sun.COM TS_CREATED, 1307978SPeter.Dunlap@Sun.COM TS_ONLINING, 1317978SPeter.Dunlap@Sun.COM TS_ONLINE, 1327978SPeter.Dunlap@Sun.COM TS_STMF_ONLINE, 1337978SPeter.Dunlap@Sun.COM TS_DELETING_NEED_OFFLINE, 1347978SPeter.Dunlap@Sun.COM TS_OFFLINING, 1357978SPeter.Dunlap@Sun.COM TS_OFFLINE, 1367978SPeter.Dunlap@Sun.COM TS_STMF_OFFLINE, 1377978SPeter.Dunlap@Sun.COM TS_DELETING_STMF_DEREG, 1387978SPeter.Dunlap@Sun.COM TS_DELETING_STMF_DEREG_FAIL, 1397978SPeter.Dunlap@Sun.COM TS_DELETING, 1407978SPeter.Dunlap@Sun.COM TS_MAX_STATE 1417978SPeter.Dunlap@Sun.COM } iscsit_tgt_state_t; 1427978SPeter.Dunlap@Sun.COM 1437978SPeter.Dunlap@Sun.COM #ifdef ISCSIT_TGT_SM_STRINGS 1447978SPeter.Dunlap@Sun.COM static const char *iscsit_ts_name[TS_MAX_STATE+1] = { 1457978SPeter.Dunlap@Sun.COM "TS_UNDEFINED", 1467978SPeter.Dunlap@Sun.COM "TS_CREATED", 1477978SPeter.Dunlap@Sun.COM "TS_ONLINING", 1487978SPeter.Dunlap@Sun.COM "TS_ONLINE", 1497978SPeter.Dunlap@Sun.COM "TS_STMF_ONLINE", 1507978SPeter.Dunlap@Sun.COM "TS_DELETING_NEED_OFFLINE", 1517978SPeter.Dunlap@Sun.COM "TS_OFFLINING", 1527978SPeter.Dunlap@Sun.COM "TS_OFFLINE", 1537978SPeter.Dunlap@Sun.COM "TS_STMF_OFFLINE", 1547978SPeter.Dunlap@Sun.COM "TS_DELETING_STMF_DEREG", 1557978SPeter.Dunlap@Sun.COM "TS_DELETING_STMF_DEREG_FAIL", 1567978SPeter.Dunlap@Sun.COM "TS_DELETING", 1577978SPeter.Dunlap@Sun.COM "TS_MAX_STATE" 1587978SPeter.Dunlap@Sun.COM }; 1597978SPeter.Dunlap@Sun.COM #endif 1607978SPeter.Dunlap@Sun.COM 1617978SPeter.Dunlap@Sun.COM typedef enum { 1627978SPeter.Dunlap@Sun.COM TE_UNDEFINED = 0, 1637978SPeter.Dunlap@Sun.COM TE_STMF_ONLINE_REQ, 1647978SPeter.Dunlap@Sun.COM TE_ONLINE_SUCCESS, 1657978SPeter.Dunlap@Sun.COM TE_ONLINE_FAIL, 1667978SPeter.Dunlap@Sun.COM TE_STMF_ONLINE_COMPLETE_ACK, 1677978SPeter.Dunlap@Sun.COM TE_STMF_OFFLINE_REQ, 1687978SPeter.Dunlap@Sun.COM TE_OFFLINE_COMPLETE, 1697978SPeter.Dunlap@Sun.COM TE_STMF_OFFLINE_COMPLETE_ACK, 1707978SPeter.Dunlap@Sun.COM TE_DELETE, 1717978SPeter.Dunlap@Sun.COM TE_STMF_DEREG_SUCCESS, 1727978SPeter.Dunlap@Sun.COM TE_STMF_DEREG_FAIL, 1737978SPeter.Dunlap@Sun.COM TE_STMF_DEREG_RETRY, 1747978SPeter.Dunlap@Sun.COM TE_WAIT_REF_COMPLETE, 1757978SPeter.Dunlap@Sun.COM TE_MAX_EVENT 1767978SPeter.Dunlap@Sun.COM } iscsit_tgt_event_t; 1777978SPeter.Dunlap@Sun.COM 1787978SPeter.Dunlap@Sun.COM #ifdef ISCSIT_TGT_SM_STRINGS 1797978SPeter.Dunlap@Sun.COM static const char *iscsit_te_name[TE_MAX_EVENT+1] = { 1807978SPeter.Dunlap@Sun.COM "TE_UNDEFINED", 1817978SPeter.Dunlap@Sun.COM "TE_STMF_ONLINE_REQ", 1827978SPeter.Dunlap@Sun.COM "TE_ONLINE_SUCCESS", 1837978SPeter.Dunlap@Sun.COM "TE_ONLINE_FAIL", 1847978SPeter.Dunlap@Sun.COM "TE_STMF_ONLINE_COMPLETE_ACK", 1857978SPeter.Dunlap@Sun.COM "TE_STMF_OFFLINE_REQ", 1867978SPeter.Dunlap@Sun.COM "TE_OFFLINE_COMPLETE", 1877978SPeter.Dunlap@Sun.COM "TE_STMF_OFFLINE_COMPLETE_ACK", 1887978SPeter.Dunlap@Sun.COM "TE_DELETE", 1897978SPeter.Dunlap@Sun.COM "TE_STMF_DEREG_SUCCESS", 1907978SPeter.Dunlap@Sun.COM "TE_STMF_DEREG_FAIL", 1917978SPeter.Dunlap@Sun.COM "TE_STMF_DEREG_RETRY", 1927978SPeter.Dunlap@Sun.COM "TE_WAIT_REF_COMPLETE", 1937978SPeter.Dunlap@Sun.COM "TE_MAX_EVENT" 1947978SPeter.Dunlap@Sun.COM }; 1957978SPeter.Dunlap@Sun.COM #endif 1967978SPeter.Dunlap@Sun.COM 1977978SPeter.Dunlap@Sun.COM typedef struct { 1987978SPeter.Dunlap@Sun.COM char *target_name; 1997978SPeter.Dunlap@Sun.COM nvlist_t *target_props; 2007978SPeter.Dunlap@Sun.COM kmutex_t target_mutex; 2017978SPeter.Dunlap@Sun.COM idm_refcnt_t target_refcnt; 2027978SPeter.Dunlap@Sun.COM idm_refcnt_t target_sess_refcnt; 2037978SPeter.Dunlap@Sun.COM avl_tree_t target_tpgt_list; 2047978SPeter.Dunlap@Sun.COM avl_tree_t target_sess_list; 2057978SPeter.Dunlap@Sun.COM avl_node_t target_global_ln; 2067978SPeter.Dunlap@Sun.COM avl_node_t target_global_deleted_ln; 2077978SPeter.Dunlap@Sun.COM /* STMF lport == iSCSI target */ 2087978SPeter.Dunlap@Sun.COM scsi_devid_desc_t *target_devid; 2097978SPeter.Dunlap@Sun.COM stmf_local_port_t *target_stmf_lport; 2107978SPeter.Dunlap@Sun.COM uint8_t target_stmf_lport_registered; 2117978SPeter.Dunlap@Sun.COM 2127978SPeter.Dunlap@Sun.COM /* Target state */ 2137978SPeter.Dunlap@Sun.COM boolean_t target_sm_busy; 2147978SPeter.Dunlap@Sun.COM boolean_t target_deleting; 2157978SPeter.Dunlap@Sun.COM iscsit_tgt_state_t target_state; 2167978SPeter.Dunlap@Sun.COM iscsit_tgt_state_t target_last_state; 2177978SPeter.Dunlap@Sun.COM sm_audit_buf_t target_state_audit; 2187978SPeter.Dunlap@Sun.COM list_t target_events; 2197978SPeter.Dunlap@Sun.COM uint64_t target_generation; 2207978SPeter.Dunlap@Sun.COM } iscsit_tgt_t; 2217978SPeter.Dunlap@Sun.COM 2227978SPeter.Dunlap@Sun.COM typedef struct { 2237978SPeter.Dunlap@Sun.COM char ini_name[MAX_ISCSI_NODENAMELEN]; 2247978SPeter.Dunlap@Sun.COM nvlist_t *ini_props; 2257978SPeter.Dunlap@Sun.COM avl_node_t ini_global_ln; 2267978SPeter.Dunlap@Sun.COM } iscsit_ini_t; 2277978SPeter.Dunlap@Sun.COM 2287978SPeter.Dunlap@Sun.COM /* 2297978SPeter.Dunlap@Sun.COM * iSCSI Auth Information 2307978SPeter.Dunlap@Sun.COM */ 2317978SPeter.Dunlap@Sun.COM typedef struct conn_auth { 2329162SPeter.Dunlap@Sun.COM char ca_tgt_chapuser[iscsitAuthStringMaxLength]; 2339162SPeter.Dunlap@Sun.COM uint8_t ca_tgt_chapsecret[iscsitAuthStringMaxLength]; 2347978SPeter.Dunlap@Sun.COM int ca_tgt_chapsecretlen; 2357978SPeter.Dunlap@Sun.COM 2369162SPeter.Dunlap@Sun.COM char ca_ini_chapuser[iscsitAuthStringMaxLength]; 2379162SPeter.Dunlap@Sun.COM uint8_t ca_ini_chapsecret[iscsitAuthStringMaxLength]; 2387978SPeter.Dunlap@Sun.COM int ca_ini_chapsecretlen; 2397978SPeter.Dunlap@Sun.COM 2407978SPeter.Dunlap@Sun.COM /* RADIUS authentication information */ 2417978SPeter.Dunlap@Sun.COM boolean_t ca_use_radius; 2427978SPeter.Dunlap@Sun.COM struct sockaddr_storage ca_radius_server; 2439162SPeter.Dunlap@Sun.COM uint8_t ca_radius_secret[iscsitAuthStringMaxLength]; 2447978SPeter.Dunlap@Sun.COM int ca_radius_secretlen; 2457978SPeter.Dunlap@Sun.COM 2467978SPeter.Dunlap@Sun.COM /* authentication method list */ 2479162SPeter.Dunlap@Sun.COM iscsit_auth_method_t ca_method_valid_list[iscsitAuthMethodMaxCount]; 2487978SPeter.Dunlap@Sun.COM 2497978SPeter.Dunlap@Sun.COM /* Target alias */ 2507978SPeter.Dunlap@Sun.COM char ca_tgt_alias[MAX_ISCSI_NODENAMELEN]; 2517978SPeter.Dunlap@Sun.COM } conn_auth_t; 2527978SPeter.Dunlap@Sun.COM 2537978SPeter.Dunlap@Sun.COM /* 2547978SPeter.Dunlap@Sun.COM * We have three state machines (so far) between the IDM connection state 2557978SPeter.Dunlap@Sun.COM * machine, the session state machine, and the login state machine. All 2567978SPeter.Dunlap@Sun.COM * of these states have some concept of "full feature mode". It's going 2577978SPeter.Dunlap@Sun.COM * to be obnoxious if we use a mixture of these "ffp" representations 2587978SPeter.Dunlap@Sun.COM * since it will be difficult to ensure the three state machines 2597978SPeter.Dunlap@Sun.COM * transition at exactly the same time. We should drive decisions that 2607978SPeter.Dunlap@Sun.COM * depend on FFP from the IDM state machine which is actually snooping 2617978SPeter.Dunlap@Sun.COM * the iSCSI PDU's and will always transition at the correct time. 2627978SPeter.Dunlap@Sun.COM * 2637978SPeter.Dunlap@Sun.COM * A consequence of this approach is that there is a window just after 2647978SPeter.Dunlap@Sun.COM * login completes where we may get a SCSI request but the session 2657978SPeter.Dunlap@Sun.COM * or login state machine has not quite transitioned to "FFP". Whether 2667978SPeter.Dunlap@Sun.COM * this is a problem depends on how we use those state machines. This 2677978SPeter.Dunlap@Sun.COM * is what we should use them for: 2687978SPeter.Dunlap@Sun.COM * 2697978SPeter.Dunlap@Sun.COM * IDM Connection state machine - Decisions related to command processing 2707978SPeter.Dunlap@Sun.COM * including whether a connection is in FFP 2717978SPeter.Dunlap@Sun.COM * 2727978SPeter.Dunlap@Sun.COM * Session state machine - Summarize the state of all available connections 2737978SPeter.Dunlap@Sun.COM * for the purposes of ERL1, ERL2 and MC/S. A session in LOGGED_IN state 2747978SPeter.Dunlap@Sun.COM * should always have at least one FFP connection but there may be a brief 2757978SPeter.Dunlap@Sun.COM * window where a session in ACTIVE might have one or more FFP connections 2767978SPeter.Dunlap@Sun.COM * even though ACTIVE is not strictly an FFP state according to the RFC. 2777978SPeter.Dunlap@Sun.COM * 2787978SPeter.Dunlap@Sun.COM * Login state machine -- drive the login process, collect negotiated 2797978SPeter.Dunlap@Sun.COM * parameters. Another side effect of this approach is that we may get 2807978SPeter.Dunlap@Sun.COM * the "notify ffp" callback from the IDM connection state machine before 2817978SPeter.Dunlap@Sun.COM * the login state machine has actually transitioned to FFP state. 2827978SPeter.Dunlap@Sun.COM */ 2837978SPeter.Dunlap@Sun.COM 2847978SPeter.Dunlap@Sun.COM struct iscsit_conn_s; 2857978SPeter.Dunlap@Sun.COM 2867978SPeter.Dunlap@Sun.COM /* Update iscsit_ss_name table whenever session states are modified */ 2877978SPeter.Dunlap@Sun.COM typedef enum { 2887978SPeter.Dunlap@Sun.COM SS_UNDEFINED = 0, 2897978SPeter.Dunlap@Sun.COM SS_Q1_FREE, 2907978SPeter.Dunlap@Sun.COM SS_Q2_ACTIVE, 2917978SPeter.Dunlap@Sun.COM SS_Q3_LOGGED_IN, 2927978SPeter.Dunlap@Sun.COM SS_Q4_FAILED, 2937978SPeter.Dunlap@Sun.COM SS_Q5_CONTINUE, 2947978SPeter.Dunlap@Sun.COM SS_Q6_DONE, 2957978SPeter.Dunlap@Sun.COM SS_Q7_ERROR, 2967978SPeter.Dunlap@Sun.COM /* Add new session states above SS_MAX_STATE */ 2977978SPeter.Dunlap@Sun.COM SS_MAX_STATE 2987978SPeter.Dunlap@Sun.COM } iscsit_session_state_t; 2997978SPeter.Dunlap@Sun.COM 3007978SPeter.Dunlap@Sun.COM #ifdef ISCSIT_SESS_SM_STRINGS 3017978SPeter.Dunlap@Sun.COM /* An array of state text values, for use in logging state transitions */ 3027978SPeter.Dunlap@Sun.COM static const char *iscsit_ss_name[SS_MAX_STATE+1] = { 3037978SPeter.Dunlap@Sun.COM "SS_UNDEFINED", 3047978SPeter.Dunlap@Sun.COM "SS_Q1_FREE", 3057978SPeter.Dunlap@Sun.COM "SS_Q2_ACTIVE", 3067978SPeter.Dunlap@Sun.COM "SS_Q3_LOGGED_IN", 3077978SPeter.Dunlap@Sun.COM "SS_Q4_FAILED", 3087978SPeter.Dunlap@Sun.COM "SS_Q5_CONTINUE", 3097978SPeter.Dunlap@Sun.COM "SS_Q6_DONE", 3107978SPeter.Dunlap@Sun.COM "SS_Q7_ERROR", 3117978SPeter.Dunlap@Sun.COM "SS_MAX_STATE" 3127978SPeter.Dunlap@Sun.COM }; 3137978SPeter.Dunlap@Sun.COM #endif 3147978SPeter.Dunlap@Sun.COM 3157978SPeter.Dunlap@Sun.COM /* Update iscsit_se_name table whenever session events are modified */ 3167978SPeter.Dunlap@Sun.COM typedef enum { 3177978SPeter.Dunlap@Sun.COM SE_UNDEFINED = 0, 3187978SPeter.Dunlap@Sun.COM SE_CONN_IN_LOGIN, /* From login state machine */ 3197978SPeter.Dunlap@Sun.COM SE_CONN_LOGGED_IN, /* FFP enabled client notification */ 3207978SPeter.Dunlap@Sun.COM SE_CONN_FFP_FAIL, /* FFP disabled client notification */ 3217978SPeter.Dunlap@Sun.COM SE_CONN_FFP_DISABLE, /* FFP disabled client notification */ 3227978SPeter.Dunlap@Sun.COM SE_CONN_FAIL, /* Conn destroy client notification */ 3237978SPeter.Dunlap@Sun.COM SE_SESSION_CLOSE, /* FFP disabled client notification */ 3247978SPeter.Dunlap@Sun.COM SE_SESSION_REINSTATE, /* From login state machine */ 3257978SPeter.Dunlap@Sun.COM SE_SESSION_TIMEOUT, /* Internal */ 3267978SPeter.Dunlap@Sun.COM SE_SESSION_CONTINUE, /* From login state machine */ 3277978SPeter.Dunlap@Sun.COM SE_SESSION_CONTINUE_FAIL, /* From login state machine? */ 3287978SPeter.Dunlap@Sun.COM /* Add new events above SE_MAX_EVENT */ 3297978SPeter.Dunlap@Sun.COM SE_MAX_EVENT 3307978SPeter.Dunlap@Sun.COM } iscsit_session_event_t; 3317978SPeter.Dunlap@Sun.COM 3327978SPeter.Dunlap@Sun.COM #ifdef ISCSIT_SESS_SM_STRINGS 3337978SPeter.Dunlap@Sun.COM /* An array of event text values, for use in logging events */ 3347978SPeter.Dunlap@Sun.COM static const char *iscsit_se_name[SE_MAX_EVENT+1] = { 3357978SPeter.Dunlap@Sun.COM "SE_UNDEFINED", 3367978SPeter.Dunlap@Sun.COM "SE_CONN_IN_LOGIN", 3377978SPeter.Dunlap@Sun.COM "SE_CONN_LOGGED_IN", 3387978SPeter.Dunlap@Sun.COM "SE_CONN_FFP_FAIL", 3397978SPeter.Dunlap@Sun.COM "SE_CONN_FFP_DISABLE", 3407978SPeter.Dunlap@Sun.COM "SE_CONN_FAIL", 3417978SPeter.Dunlap@Sun.COM "SE_SESSION_CLOSE", 3427978SPeter.Dunlap@Sun.COM "SE_SESSION_REINSTATE", 3437978SPeter.Dunlap@Sun.COM "SE_SESSION_TIMEOUT", 3447978SPeter.Dunlap@Sun.COM "SE_SESSION_CONTINUE", 3457978SPeter.Dunlap@Sun.COM "SE_SESSION_CONTINUE_FAIL", 3467978SPeter.Dunlap@Sun.COM "SE_MAX_EVENT" 3477978SPeter.Dunlap@Sun.COM }; 3487978SPeter.Dunlap@Sun.COM #endif 3497978SPeter.Dunlap@Sun.COM 3507978SPeter.Dunlap@Sun.COM /* 3517978SPeter.Dunlap@Sun.COM * Set in ist_tgt after iscsit_tgt_unbind_sess to differentiate an unbound 3527978SPeter.Dunlap@Sun.COM * session from a discovery session. 3537978SPeter.Dunlap@Sun.COM */ 3547978SPeter.Dunlap@Sun.COM #define SESS_UNBOUND_FROM_TGT -1 3557978SPeter.Dunlap@Sun.COM 3567978SPeter.Dunlap@Sun.COM typedef struct { 3577978SPeter.Dunlap@Sun.COM stmf_scsi_session_t *ist_stmf_sess; 3587978SPeter.Dunlap@Sun.COM stmf_local_port_t *ist_lport; 3597978SPeter.Dunlap@Sun.COM iscsit_tgt_t *ist_tgt; 3607978SPeter.Dunlap@Sun.COM idm_refcnt_t ist_refcnt; 3617978SPeter.Dunlap@Sun.COM kmem_cache_t *ist_task_cache; 36212372SPriya.Krishnan@Sun.COM kmutex_t ist_sn_mutex; 3637978SPeter.Dunlap@Sun.COM kmutex_t ist_mutex; 3647978SPeter.Dunlap@Sun.COM kcondvar_t ist_cv; 3657978SPeter.Dunlap@Sun.COM iscsit_session_state_t ist_state; 3667978SPeter.Dunlap@Sun.COM iscsit_session_state_t ist_last_state; 3677978SPeter.Dunlap@Sun.COM sm_audit_buf_t ist_state_audit; 3687978SPeter.Dunlap@Sun.COM boolean_t ist_sm_busy; 3697978SPeter.Dunlap@Sun.COM boolean_t ist_sm_complete; 3707978SPeter.Dunlap@Sun.COM boolean_t ist_admin_close; 3717978SPeter.Dunlap@Sun.COM list_t ist_events; 3727978SPeter.Dunlap@Sun.COM int ist_conn_count; 3737978SPeter.Dunlap@Sun.COM int ist_ffp_conn_count; 3747978SPeter.Dunlap@Sun.COM struct iscsit_conn_s *ist_failed_conn; 3757978SPeter.Dunlap@Sun.COM timeout_id_t ist_state_timeout; 3767978SPeter.Dunlap@Sun.COM list_t ist_conn_list; 3777978SPeter.Dunlap@Sun.COM avl_node_t ist_tgt_ln; 3787978SPeter.Dunlap@Sun.COM char *ist_initiator_name; 3797978SPeter.Dunlap@Sun.COM char *ist_initiator_alias; 3807978SPeter.Dunlap@Sun.COM char *ist_target_name; 3817978SPeter.Dunlap@Sun.COM char *ist_target_alias; 3827978SPeter.Dunlap@Sun.COM uint8_t ist_isid[ISCSI_ISID_LEN]; 3837978SPeter.Dunlap@Sun.COM uint16_t ist_tsih; 3847978SPeter.Dunlap@Sun.COM uint16_t ist_tpgt_tag; 3857978SPeter.Dunlap@Sun.COM uint32_t ist_expcmdsn; 3867978SPeter.Dunlap@Sun.COM uint32_t ist_maxcmdsn; 3879586SPeter.Dunlap@Sun.COM avl_tree_t ist_task_list; 38812372SPriya.Krishnan@Sun.COM iscsit_cbuf_t *ist_rxpdu_queue; 3897978SPeter.Dunlap@Sun.COM } iscsit_sess_t; 3907978SPeter.Dunlap@Sun.COM 3917978SPeter.Dunlap@Sun.COM /* Update iscsit_ils_name table whenever login states are modified */ 3927978SPeter.Dunlap@Sun.COM typedef enum { 3937978SPeter.Dunlap@Sun.COM ILS_UNDEFINED = 0, 3947978SPeter.Dunlap@Sun.COM ILS_LOGIN_INIT, 3957978SPeter.Dunlap@Sun.COM ILS_LOGIN_WAITING, /* Waiting for more login PDU's */ 3967978SPeter.Dunlap@Sun.COM ILS_LOGIN_PROCESSING, /* Processing login request */ 3977978SPeter.Dunlap@Sun.COM ILS_LOGIN_RESPONDING, /* Sending login response */ 3987978SPeter.Dunlap@Sun.COM ILS_LOGIN_RESPONDED, /* Sent login response (no trans. to FFP) */ 3997978SPeter.Dunlap@Sun.COM ILS_LOGIN_FFP, /* Sending last login PDU for final response */ 4007978SPeter.Dunlap@Sun.COM ILS_LOGIN_DONE, /* Last login PDU sent (so we can free it) */ 4017978SPeter.Dunlap@Sun.COM ILS_LOGIN_ERROR, /* Login error, login failed */ 4027978SPeter.Dunlap@Sun.COM /* Add new login states above ILS_MAX_STATE */ 4037978SPeter.Dunlap@Sun.COM ILS_MAX_STATE 4047978SPeter.Dunlap@Sun.COM } iscsit_login_state_t; 4057978SPeter.Dunlap@Sun.COM 4067978SPeter.Dunlap@Sun.COM #ifdef ISCSIT_LOGIN_SM_STRINGS 4077978SPeter.Dunlap@Sun.COM /* An array of login state text values, for use in logging login progress */ 4087978SPeter.Dunlap@Sun.COM static const char *iscsit_ils_name[ILS_MAX_STATE+1] = { 4097978SPeter.Dunlap@Sun.COM "ILS_UNDEFINED", 4107978SPeter.Dunlap@Sun.COM "ILS_LOGIN_INIT", 4117978SPeter.Dunlap@Sun.COM "ILS_LOGIN_WAITING", 4127978SPeter.Dunlap@Sun.COM "ILS_LOGIN_PROCESSING", 4137978SPeter.Dunlap@Sun.COM "ILS_LOGIN_RESPONDING", 4147978SPeter.Dunlap@Sun.COM "ILS_LOGIN_RESPONDED", 4157978SPeter.Dunlap@Sun.COM "ILS_LOGIN_FFP", 4167978SPeter.Dunlap@Sun.COM "ILS_LOGIN_DONE", 4177978SPeter.Dunlap@Sun.COM "ILS_LOGIN_ERROR", 4187978SPeter.Dunlap@Sun.COM "ILS_MAX_STATE" 4197978SPeter.Dunlap@Sun.COM }; 4207978SPeter.Dunlap@Sun.COM #endif 4217978SPeter.Dunlap@Sun.COM 4227978SPeter.Dunlap@Sun.COM /* Update iscsit_ile_name table whenever login events are modified */ 4237978SPeter.Dunlap@Sun.COM typedef enum { 4247978SPeter.Dunlap@Sun.COM ILE_UNDEFINED = 0, 4257978SPeter.Dunlap@Sun.COM ILE_LOGIN_RCV, 4267978SPeter.Dunlap@Sun.COM ILE_LOGIN_RESP_READY, 4277978SPeter.Dunlap@Sun.COM ILE_LOGIN_FFP, 4287978SPeter.Dunlap@Sun.COM ILE_LOGIN_RESP_COMPLETE, 4297978SPeter.Dunlap@Sun.COM ILE_LOGIN_ERROR, 4307978SPeter.Dunlap@Sun.COM ILE_LOGIN_CONN_ERROR, 4317978SPeter.Dunlap@Sun.COM /* Add new login events above ILE_MAX_EVENT */ 4327978SPeter.Dunlap@Sun.COM ILE_MAX_EVENT 4337978SPeter.Dunlap@Sun.COM } iscsit_login_event_t; 4347978SPeter.Dunlap@Sun.COM 4357978SPeter.Dunlap@Sun.COM #ifdef ISCSIT_LOGIN_SM_STRINGS 4367978SPeter.Dunlap@Sun.COM /* An array of login event text values, for use in logging login events */ 4377978SPeter.Dunlap@Sun.COM static const char *iscsit_ile_name[ILE_MAX_EVENT+1] = { 4387978SPeter.Dunlap@Sun.COM "ILE_UNDEFINED", 4397978SPeter.Dunlap@Sun.COM "ILE_LOGIN_RCV", 4407978SPeter.Dunlap@Sun.COM "ILE_LOGIN_RESP_READY", 4417978SPeter.Dunlap@Sun.COM "ILE_LOGIN_FFP", 4427978SPeter.Dunlap@Sun.COM "ILE_LOGIN_RESP_COMPLETE", 4437978SPeter.Dunlap@Sun.COM "ILE_LOGIN_ERROR", 4447978SPeter.Dunlap@Sun.COM "ILE_LOGIN_CONN_ERROR", 4457978SPeter.Dunlap@Sun.COM "ILE_MAX_EVENT" 4467978SPeter.Dunlap@Sun.COM }; 4477978SPeter.Dunlap@Sun.COM #endif 4487978SPeter.Dunlap@Sun.COM 4497978SPeter.Dunlap@Sun.COM typedef struct { 4507978SPeter.Dunlap@Sun.COM uint32_t op_initial_params_set:1, 4517978SPeter.Dunlap@Sun.COM op_discovery_session:1, 4527978SPeter.Dunlap@Sun.COM op_initial_r2t:1, 4537978SPeter.Dunlap@Sun.COM op_immed_data:1, 4547978SPeter.Dunlap@Sun.COM op_data_pdu_in_order:1, 45510362SCharles.Ting@Sun.COM op_data_sequence_in_order:1, 45610362SCharles.Ting@Sun.COM op_declarative_params_set:1; 4577978SPeter.Dunlap@Sun.COM uint64_t op_max_connections; 4587978SPeter.Dunlap@Sun.COM uint64_t op_max_recv_data_segment_length; 4597978SPeter.Dunlap@Sun.COM uint64_t op_max_burst_length; 4607978SPeter.Dunlap@Sun.COM uint64_t op_first_burst_length; 4617978SPeter.Dunlap@Sun.COM uint64_t op_default_time_2_wait; 4627978SPeter.Dunlap@Sun.COM uint64_t op_default_time_2_retain; 4637978SPeter.Dunlap@Sun.COM uint64_t op_max_outstanding_r2t; 4647978SPeter.Dunlap@Sun.COM uint64_t op_error_recovery_level; 4657978SPeter.Dunlap@Sun.COM } iscsit_op_params_t; 4667978SPeter.Dunlap@Sun.COM 4677978SPeter.Dunlap@Sun.COM typedef struct { 4687978SPeter.Dunlap@Sun.COM iscsit_login_state_t icl_login_state; 4697978SPeter.Dunlap@Sun.COM iscsit_login_state_t icl_login_last_state; 4707978SPeter.Dunlap@Sun.COM sm_audit_buf_t icl_state_audit; 4717978SPeter.Dunlap@Sun.COM boolean_t icl_busy; 4727978SPeter.Dunlap@Sun.COM boolean_t icl_login_complete; 4737978SPeter.Dunlap@Sun.COM kmutex_t icl_mutex; 4747978SPeter.Dunlap@Sun.COM uint32_t icl_login_itt; 4757978SPeter.Dunlap@Sun.COM uint8_t icl_login_csg; 4767978SPeter.Dunlap@Sun.COM uint8_t icl_login_nsg; 4777978SPeter.Dunlap@Sun.COM boolean_t icl_login_transit; 4787978SPeter.Dunlap@Sun.COM conn_auth_t icl_auth; 4797978SPeter.Dunlap@Sun.COM iscsit_auth_client_t icl_auth_client; 4807978SPeter.Dunlap@Sun.COM int icl_auth_pass; 4817978SPeter.Dunlap@Sun.COM list_t icl_login_events; 4827978SPeter.Dunlap@Sun.COM list_t icl_pdu_list; 4837978SPeter.Dunlap@Sun.COM uint16_t icl_tsih; 4847978SPeter.Dunlap@Sun.COM uint8_t icl_isid[ISCSI_ISID_LEN]; 4857978SPeter.Dunlap@Sun.COM uint32_t icl_cmdsn; 4867978SPeter.Dunlap@Sun.COM uint16_t icl_tpgt_tag; 4877978SPeter.Dunlap@Sun.COM char *icl_target_name; 4887978SPeter.Dunlap@Sun.COM char *icl_target_alias; 4897978SPeter.Dunlap@Sun.COM char *icl_initiator_name; 4907978SPeter.Dunlap@Sun.COM char *icl_login_resp_buf; 4917978SPeter.Dunlap@Sun.COM void *icl_login_resp_itb; /* mult-pdu idm buf */ 4927978SPeter.Dunlap@Sun.COM int icl_login_resp_len; /* For kmem_free */ 4937978SPeter.Dunlap@Sun.COM int icl_login_resp_valid_len; 4947978SPeter.Dunlap@Sun.COM uint8_t icl_login_resp_err_class; 4957978SPeter.Dunlap@Sun.COM uint8_t icl_login_resp_err_detail; 4967978SPeter.Dunlap@Sun.COM iscsi_login_rsp_hdr_t *icl_login_resp_tmpl; 4977978SPeter.Dunlap@Sun.COM nvlist_t *icl_request_nvlist; 4987978SPeter.Dunlap@Sun.COM nvlist_t *icl_response_nvlist; 4997978SPeter.Dunlap@Sun.COM nvlist_t *icl_negotiated_values; 5007978SPeter.Dunlap@Sun.COM } iscsit_conn_login_t; 5017978SPeter.Dunlap@Sun.COM 5027978SPeter.Dunlap@Sun.COM #define SET_LOGIN_ERROR(SLE_ICT, SLE_CLASS, SLE_DETAIL) \ 5037978SPeter.Dunlap@Sun.COM (SLE_ICT)->ict_login_sm.icl_login_resp_err_class = (SLE_CLASS); \ 5047978SPeter.Dunlap@Sun.COM (SLE_ICT)->ict_login_sm.icl_login_resp_err_detail = (SLE_DETAIL); 5057978SPeter.Dunlap@Sun.COM 5067978SPeter.Dunlap@Sun.COM typedef struct iscsit_conn_s { 5077978SPeter.Dunlap@Sun.COM idm_conn_t *ict_ic; 5087978SPeter.Dunlap@Sun.COM iscsit_sess_t *ict_sess; 5097978SPeter.Dunlap@Sun.COM kmutex_t ict_mutex; 5107978SPeter.Dunlap@Sun.COM idm_refcnt_t ict_refcnt; 5117978SPeter.Dunlap@Sun.COM idm_refcnt_t ict_dispatch_refcnt; 5127978SPeter.Dunlap@Sun.COM list_node_t ict_sess_ln; 5137978SPeter.Dunlap@Sun.COM iscsit_conn_login_t ict_login_sm; 5147978SPeter.Dunlap@Sun.COM iscsit_op_params_t ict_op; 5157978SPeter.Dunlap@Sun.COM uint16_t ict_cid; 5167978SPeter.Dunlap@Sun.COM uint32_t ict_statsn; 51711081SPriya.Krishnan@Sun.COM kmutex_t ict_statsn_mutex; 5189586SPeter.Dunlap@Sun.COM uint32_t ict_keepalive_ttt; 5197978SPeter.Dunlap@Sun.COM struct iscsit_conn_s *ict_reinstate_conn; 5207978SPeter.Dunlap@Sun.COM uint32_t ict_reinstating:1, 5217978SPeter.Dunlap@Sun.COM ict_lost:1, 5227978SPeter.Dunlap@Sun.COM ict_destroyed:1; 5239601SJames.Moore@Sun.COM /* 5249601SJames.Moore@Sun.COM * Parameters for processing text commands 5259601SJames.Moore@Sun.COM */ 5269601SJames.Moore@Sun.COM char *ict_text_rsp_buf; 5279601SJames.Moore@Sun.COM uint32_t ict_text_rsp_len; 5289601SJames.Moore@Sun.COM uint32_t ict_text_rsp_valid_len; 5299601SJames.Moore@Sun.COM uint32_t ict_text_rsp_off; 5309601SJames.Moore@Sun.COM uint32_t ict_text_req_itt; /* from initiator */ 5319601SJames.Moore@Sun.COM uint32_t ict_text_rsp_ttt; 5327978SPeter.Dunlap@Sun.COM } iscsit_conn_t; 5337978SPeter.Dunlap@Sun.COM 5347978SPeter.Dunlap@Sun.COM #define ICT_FLAGS_DISCOVERY 0x00000001 5357978SPeter.Dunlap@Sun.COM 5367978SPeter.Dunlap@Sun.COM typedef struct { 5377978SPeter.Dunlap@Sun.COM idm_buf_t *ibuf_idm_buf; 5387978SPeter.Dunlap@Sun.COM stmf_data_buf_t *ibuf_stmf_buf; 5397978SPeter.Dunlap@Sun.COM idm_pdu_t *ibuf_immed_data_pdu; 5407978SPeter.Dunlap@Sun.COM boolean_t ibuf_is_immed; 5417978SPeter.Dunlap@Sun.COM } iscsit_buf_t; 5427978SPeter.Dunlap@Sun.COM 5437978SPeter.Dunlap@Sun.COM typedef struct { 5447978SPeter.Dunlap@Sun.COM scsi_task_t *it_stmf_task; 5457978SPeter.Dunlap@Sun.COM idm_task_t *it_idm_task; 5467978SPeter.Dunlap@Sun.COM iscsit_buf_t *it_immed_data; 5477978SPeter.Dunlap@Sun.COM iscsit_conn_t *it_ict; 5487978SPeter.Dunlap@Sun.COM kmutex_t it_mutex; 5497978SPeter.Dunlap@Sun.COM idm_pdu_t *it_tm_pdu; 5507978SPeter.Dunlap@Sun.COM uint32_t it_stmf_abort:1, 5517978SPeter.Dunlap@Sun.COM it_aborted:1, 5529586SPeter.Dunlap@Sun.COM it_active:1, 5537978SPeter.Dunlap@Sun.COM it_tm_task:1, 5547978SPeter.Dunlap@Sun.COM it_tm_responded:1; 5557978SPeter.Dunlap@Sun.COM uint32_t it_cmdsn; 5567978SPeter.Dunlap@Sun.COM uint32_t it_itt; 5577978SPeter.Dunlap@Sun.COM uint32_t it_ttt; 5589586SPeter.Dunlap@Sun.COM avl_node_t it_sess_ln; 5597978SPeter.Dunlap@Sun.COM } iscsit_task_t; 5607978SPeter.Dunlap@Sun.COM 5617978SPeter.Dunlap@Sun.COM typedef struct iscsit_isns_cfg { 5627978SPeter.Dunlap@Sun.COM kmutex_t isns_mutex; 5637978SPeter.Dunlap@Sun.COM boolean_t isns_state; 5647978SPeter.Dunlap@Sun.COM list_t isns_svrs; 5657978SPeter.Dunlap@Sun.COM } iscsit_isns_cfg_t; 5667978SPeter.Dunlap@Sun.COM 5677978SPeter.Dunlap@Sun.COM /* 5687978SPeter.Dunlap@Sun.COM * State values for the iscsit service 5697978SPeter.Dunlap@Sun.COM */ 5707978SPeter.Dunlap@Sun.COM typedef enum { 5717978SPeter.Dunlap@Sun.COM ISE_UNDEFINED = 0, 5727978SPeter.Dunlap@Sun.COM ISE_DETACHED, 5737978SPeter.Dunlap@Sun.COM ISE_DISABLED, 5747978SPeter.Dunlap@Sun.COM ISE_ENABLING, 5757978SPeter.Dunlap@Sun.COM ISE_ENABLED, 5767978SPeter.Dunlap@Sun.COM ISE_BUSY, 5777978SPeter.Dunlap@Sun.COM ISE_DISABLING 5787978SPeter.Dunlap@Sun.COM } iscsit_service_enabled_t; 5797978SPeter.Dunlap@Sun.COM 5807978SPeter.Dunlap@Sun.COM 5817978SPeter.Dunlap@Sun.COM typedef struct { 5827978SPeter.Dunlap@Sun.COM iscsit_service_enabled_t global_svc_state; 5837978SPeter.Dunlap@Sun.COM dev_info_t *global_dip; 5847978SPeter.Dunlap@Sun.COM ldi_ident_t global_li; 5857978SPeter.Dunlap@Sun.COM nvlist_t *global_props; 5867978SPeter.Dunlap@Sun.COM stmf_port_provider_t *global_pp; 5877978SPeter.Dunlap@Sun.COM stmf_dbuf_store_t *global_dbuf_store; 5887978SPeter.Dunlap@Sun.COM taskq_t *global_dispatch_taskq; 5897978SPeter.Dunlap@Sun.COM idm_refcnt_t global_refcnt; 5907978SPeter.Dunlap@Sun.COM avl_tree_t global_discovery_sessions; 5917978SPeter.Dunlap@Sun.COM avl_tree_t global_target_list; 5927978SPeter.Dunlap@Sun.COM list_t global_deleted_target_list; 5937978SPeter.Dunlap@Sun.COM avl_tree_t global_tpg_list; 5947978SPeter.Dunlap@Sun.COM avl_tree_t global_ini_list; 5957978SPeter.Dunlap@Sun.COM iscsit_tpg_t *global_default_tpg; 5967978SPeter.Dunlap@Sun.COM vmem_t *global_tsih_pool; 5977978SPeter.Dunlap@Sun.COM iscsit_isns_cfg_t global_isns_cfg; 5987978SPeter.Dunlap@Sun.COM iscsi_radius_props_t global_radius_server; 5997978SPeter.Dunlap@Sun.COM krwlock_t global_rwlock; 60011431SPeter.Cudhea@Sun.COM kmutex_t global_state_mutex; 6017978SPeter.Dunlap@Sun.COM } iscsit_global_t; 6027978SPeter.Dunlap@Sun.COM 6037978SPeter.Dunlap@Sun.COM extern iscsit_global_t iscsit_global; 6047978SPeter.Dunlap@Sun.COM 6057978SPeter.Dunlap@Sun.COM void 6067978SPeter.Dunlap@Sun.COM iscsit_global_hold(); 6077978SPeter.Dunlap@Sun.COM 6087978SPeter.Dunlap@Sun.COM void 6097978SPeter.Dunlap@Sun.COM iscsit_global_rele(); 6107978SPeter.Dunlap@Sun.COM 6117978SPeter.Dunlap@Sun.COM void 6127978SPeter.Dunlap@Sun.COM iscsit_global_wait_ref(); 6137978SPeter.Dunlap@Sun.COM 6147978SPeter.Dunlap@Sun.COM idm_status_t 6157978SPeter.Dunlap@Sun.COM iscsit_login_sm_init(iscsit_conn_t *ict); 6167978SPeter.Dunlap@Sun.COM 6177978SPeter.Dunlap@Sun.COM void 6187978SPeter.Dunlap@Sun.COM iscsit_login_sm_fini(iscsit_conn_t *ict); 6197978SPeter.Dunlap@Sun.COM 6207978SPeter.Dunlap@Sun.COM void 6217978SPeter.Dunlap@Sun.COM iscsit_login_sm_event(iscsit_conn_t *ic, iscsit_login_event_t event, 6227978SPeter.Dunlap@Sun.COM idm_pdu_t *pdu); 6237978SPeter.Dunlap@Sun.COM 6247978SPeter.Dunlap@Sun.COM void 6257978SPeter.Dunlap@Sun.COM iscsit_login_sm_event_locked(iscsit_conn_t *ic, iscsit_login_event_t event, 6267978SPeter.Dunlap@Sun.COM idm_pdu_t *pdu); 6277978SPeter.Dunlap@Sun.COM 6287978SPeter.Dunlap@Sun.COM void 6297978SPeter.Dunlap@Sun.COM iscsit_send_async_event(iscsit_conn_t *ict, uint8_t async_event); 6307978SPeter.Dunlap@Sun.COM 6317978SPeter.Dunlap@Sun.COM void 6327978SPeter.Dunlap@Sun.COM iscsit_pdu_tx(idm_pdu_t *pdu); 6337978SPeter.Dunlap@Sun.COM 6349601SJames.Moore@Sun.COM void 6359601SJames.Moore@Sun.COM iscsit_send_reject(iscsit_conn_t *ict, idm_pdu_t *rejected_pdu, uint8_t reason); 6369601SJames.Moore@Sun.COM 6379601SJames.Moore@Sun.COM void 6389601SJames.Moore@Sun.COM iscsit_text_cmd_fini(iscsit_conn_t *ict); 6399601SJames.Moore@Sun.COM 6407978SPeter.Dunlap@Sun.COM /* 6417978SPeter.Dunlap@Sun.COM * IDM conn ops 6427978SPeter.Dunlap@Sun.COM */ 6437978SPeter.Dunlap@Sun.COM 6447978SPeter.Dunlap@Sun.COM idm_rx_pdu_cb_t iscsit_op_scsi_cmd; 6457978SPeter.Dunlap@Sun.COM idm_rx_pdu_cb_t iscsit_rx_pdu; 6467978SPeter.Dunlap@Sun.COM idm_rx_pdu_error_cb_t iscsit_rx_pdu_error; 6477978SPeter.Dunlap@Sun.COM idm_task_cb_t iscsit_task_aborted; 6487978SPeter.Dunlap@Sun.COM idm_client_notify_cb_t iscsit_client_notify; 6497978SPeter.Dunlap@Sun.COM idm_build_hdr_cb_t iscsit_build_hdr; 65011081SPriya.Krishnan@Sun.COM idm_update_statsn_cb_t iscsit_update_statsn; 6519586SPeter.Dunlap@Sun.COM idm_keepalive_cb_t iscsit_keepalive; 6527978SPeter.Dunlap@Sun.COM 6537978SPeter.Dunlap@Sun.COM /* 6547978SPeter.Dunlap@Sun.COM * lport entry points 6557978SPeter.Dunlap@Sun.COM */ 6567978SPeter.Dunlap@Sun.COM stmf_status_t 6577978SPeter.Dunlap@Sun.COM iscsit_xfer_scsi_data(scsi_task_t *task, stmf_data_buf_t *dbuf, 6587978SPeter.Dunlap@Sun.COM uint32_t ioflags); 6597978SPeter.Dunlap@Sun.COM 6607978SPeter.Dunlap@Sun.COM stmf_status_t 6617978SPeter.Dunlap@Sun.COM iscsit_send_scsi_status(scsi_task_t *task, uint32_t ioflags); 6627978SPeter.Dunlap@Sun.COM 6637978SPeter.Dunlap@Sun.COM void 6647978SPeter.Dunlap@Sun.COM iscsit_lport_task_free(scsi_task_t *task); 6657978SPeter.Dunlap@Sun.COM 6667978SPeter.Dunlap@Sun.COM stmf_status_t 6677978SPeter.Dunlap@Sun.COM iscsit_abort(stmf_local_port_t *lport, int abort_cmd, void *arg, 6687978SPeter.Dunlap@Sun.COM uint32_t flags); 6697978SPeter.Dunlap@Sun.COM 6707978SPeter.Dunlap@Sun.COM void 6717978SPeter.Dunlap@Sun.COM iscsit_ctl(stmf_local_port_t *lport, int cmd, void *arg); 6727978SPeter.Dunlap@Sun.COM 6737978SPeter.Dunlap@Sun.COM /* 6747978SPeter.Dunlap@Sun.COM * Connection functions 6757978SPeter.Dunlap@Sun.COM */ 6767978SPeter.Dunlap@Sun.COM idm_status_t 6777978SPeter.Dunlap@Sun.COM iscsit_conn_reinstate(iscsit_conn_t *existing_ict, iscsit_conn_t *ict); 6787978SPeter.Dunlap@Sun.COM 6797978SPeter.Dunlap@Sun.COM void 6807978SPeter.Dunlap@Sun.COM iscsit_conn_destroy_done(iscsit_conn_t *ict); 6817978SPeter.Dunlap@Sun.COM 6827978SPeter.Dunlap@Sun.COM void 6837978SPeter.Dunlap@Sun.COM iscsit_conn_set_auth(iscsit_conn_t *ict); 6847978SPeter.Dunlap@Sun.COM 6857978SPeter.Dunlap@Sun.COM void 6867978SPeter.Dunlap@Sun.COM iscsit_conn_hold(iscsit_conn_t *ict); 6877978SPeter.Dunlap@Sun.COM 6887978SPeter.Dunlap@Sun.COM void 6897978SPeter.Dunlap@Sun.COM iscsit_conn_rele(iscsit_conn_t *ict); 6907978SPeter.Dunlap@Sun.COM 69112579SPriya.Krishnan@Sun.COM void 69212579SPriya.Krishnan@Sun.COM iscsit_conn_logout(iscsit_conn_t *ict); 69312579SPriya.Krishnan@Sun.COM 6947978SPeter.Dunlap@Sun.COM /* 6957978SPeter.Dunlap@Sun.COM * Session functions 6967978SPeter.Dunlap@Sun.COM */ 6977978SPeter.Dunlap@Sun.COM int 6987978SPeter.Dunlap@Sun.COM iscsit_sess_avl_compare(const void *void_sess1, const void *void_sess2); 6997978SPeter.Dunlap@Sun.COM 7007978SPeter.Dunlap@Sun.COM iscsit_sess_t * 7017978SPeter.Dunlap@Sun.COM iscsit_sess_create(iscsit_tgt_t *tgt, iscsit_conn_t *ict, 7027978SPeter.Dunlap@Sun.COM uint32_t cmdsn, uint8_t *isid, uint16_t tag, 7037978SPeter.Dunlap@Sun.COM char *initiator_name, char *target_name, 7047978SPeter.Dunlap@Sun.COM uint8_t *error_class, uint8_t *error_detail); 7057978SPeter.Dunlap@Sun.COM 7067978SPeter.Dunlap@Sun.COM void 7077978SPeter.Dunlap@Sun.COM iscsit_sess_destroy(iscsit_sess_t *ist); 7087978SPeter.Dunlap@Sun.COM 7097978SPeter.Dunlap@Sun.COM void 7107978SPeter.Dunlap@Sun.COM iscsit_sess_hold(iscsit_sess_t *ist); 7117978SPeter.Dunlap@Sun.COM 71212579SPriya.Krishnan@Sun.COM idm_status_t 71312579SPriya.Krishnan@Sun.COM iscsit_sess_check_hold(iscsit_sess_t *ist); 71412579SPriya.Krishnan@Sun.COM 7157978SPeter.Dunlap@Sun.COM void 7167978SPeter.Dunlap@Sun.COM iscsit_sess_rele(iscsit_sess_t *ist); 7177978SPeter.Dunlap@Sun.COM 7187978SPeter.Dunlap@Sun.COM iscsit_conn_t * 7197978SPeter.Dunlap@Sun.COM iscsit_sess_lookup_conn(iscsit_sess_t *ist, uint16_t cid); 7207978SPeter.Dunlap@Sun.COM 7217978SPeter.Dunlap@Sun.COM void 7227978SPeter.Dunlap@Sun.COM iscsit_sess_bind_conn(iscsit_sess_t *ist, iscsit_conn_t *ict); 7237978SPeter.Dunlap@Sun.COM 7247978SPeter.Dunlap@Sun.COM void 7257978SPeter.Dunlap@Sun.COM iscsit_sess_unbind_conn(iscsit_sess_t *ist, iscsit_conn_t *ict); 7267978SPeter.Dunlap@Sun.COM 7277978SPeter.Dunlap@Sun.COM void 7287978SPeter.Dunlap@Sun.COM iscsit_sess_close(iscsit_sess_t *ist); 7297978SPeter.Dunlap@Sun.COM 7307978SPeter.Dunlap@Sun.COM iscsit_sess_t * 7317978SPeter.Dunlap@Sun.COM iscsit_sess_reinstate(iscsit_tgt_t *tgt, iscsit_sess_t *ist, iscsit_conn_t *ict, 7327978SPeter.Dunlap@Sun.COM uint8_t *error_class, uint8_t *error_detail); 7337978SPeter.Dunlap@Sun.COM 7347978SPeter.Dunlap@Sun.COM void 7357978SPeter.Dunlap@Sun.COM iscsit_sess_sm_event(iscsit_sess_t *ist, iscsit_session_event_t event, 7367978SPeter.Dunlap@Sun.COM iscsit_conn_t *ict); 7377978SPeter.Dunlap@Sun.COM 7387978SPeter.Dunlap@Sun.COM /* 7397978SPeter.Dunlap@Sun.COM * Target, TPGT, TPGT and portal functions 7407978SPeter.Dunlap@Sun.COM */ 7417978SPeter.Dunlap@Sun.COM 7427978SPeter.Dunlap@Sun.COM void 7437978SPeter.Dunlap@Sun.COM iscsit_tgt_sm_event(iscsit_tgt_t *tgt, iscsit_tgt_event_t event); 7447978SPeter.Dunlap@Sun.COM 7457978SPeter.Dunlap@Sun.COM void 7467978SPeter.Dunlap@Sun.COM tgt_sm_event_locked(iscsit_tgt_t *tgt, iscsit_tgt_event_t event); 7477978SPeter.Dunlap@Sun.COM 7487978SPeter.Dunlap@Sun.COM it_cfg_status_t 7497978SPeter.Dunlap@Sun.COM iscsit_config_merge_tgt(it_config_t *cfg); 7507978SPeter.Dunlap@Sun.COM 7517978SPeter.Dunlap@Sun.COM void 7527978SPeter.Dunlap@Sun.COM iscsit_config_destroy_tgts(list_t *tgt_del_list); 7537978SPeter.Dunlap@Sun.COM 7547978SPeter.Dunlap@Sun.COM void 7557978SPeter.Dunlap@Sun.COM iscsit_config_destroy_tpgts(list_t *tpgt_del_list); 7567978SPeter.Dunlap@Sun.COM 7577978SPeter.Dunlap@Sun.COM iscsit_tgt_t * 7587978SPeter.Dunlap@Sun.COM iscsit_tgt_lookup(char *target_name); 7597978SPeter.Dunlap@Sun.COM 7607978SPeter.Dunlap@Sun.COM iscsit_tgt_t * 7617978SPeter.Dunlap@Sun.COM iscsit_tgt_lookup_locked(char *target_name); 7627978SPeter.Dunlap@Sun.COM 7637978SPeter.Dunlap@Sun.COM int 7647978SPeter.Dunlap@Sun.COM iscsit_tgt_avl_compare(const void *void_tgt1, const void *void_tgt2); 7657978SPeter.Dunlap@Sun.COM 7667978SPeter.Dunlap@Sun.COM int 7677978SPeter.Dunlap@Sun.COM iscsit_tpgt_avl_compare(const void *void_tpgt1, const void *void_tpgt2); 7687978SPeter.Dunlap@Sun.COM 7697978SPeter.Dunlap@Sun.COM void 7707978SPeter.Dunlap@Sun.COM iscsit_tgt_hold(iscsit_tgt_t *tgt); 7717978SPeter.Dunlap@Sun.COM 7727978SPeter.Dunlap@Sun.COM void 7737978SPeter.Dunlap@Sun.COM iscsit_tgt_rele(iscsit_tgt_t *tgt); 7747978SPeter.Dunlap@Sun.COM 7757978SPeter.Dunlap@Sun.COM iscsit_tpgt_t * 7767978SPeter.Dunlap@Sun.COM iscsit_tgt_lookup_tpgt(iscsit_tgt_t *tgt, uint16_t tag); 7777978SPeter.Dunlap@Sun.COM 7787978SPeter.Dunlap@Sun.COM void 7797978SPeter.Dunlap@Sun.COM iscsit_tpgt_hold(iscsit_tpgt_t *tpgt); 7807978SPeter.Dunlap@Sun.COM 7817978SPeter.Dunlap@Sun.COM void 7827978SPeter.Dunlap@Sun.COM iscsit_tpgt_rele(iscsit_tpgt_t *tpgt); 7837978SPeter.Dunlap@Sun.COM 7847978SPeter.Dunlap@Sun.COM iscsit_portal_t * 7857978SPeter.Dunlap@Sun.COM iscsit_tgt_lookup_portal(iscsit_tgt_t *tgt, struct sockaddr_storage *sa, 7867978SPeter.Dunlap@Sun.COM iscsit_tpgt_t **output_tpgt); 7877978SPeter.Dunlap@Sun.COM 7887978SPeter.Dunlap@Sun.COM iscsit_sess_t * 7897978SPeter.Dunlap@Sun.COM iscsit_tgt_lookup_sess(iscsit_tgt_t *tgt, char *initiator_name, 7907978SPeter.Dunlap@Sun.COM uint8_t *isid, uint16_t tsih, uint16_t tag); 7917978SPeter.Dunlap@Sun.COM 7927978SPeter.Dunlap@Sun.COM void 7937978SPeter.Dunlap@Sun.COM iscsit_tgt_bind_sess(iscsit_tgt_t *tgt, iscsit_sess_t *sess); 7947978SPeter.Dunlap@Sun.COM 7957978SPeter.Dunlap@Sun.COM void 7967978SPeter.Dunlap@Sun.COM iscsit_tgt_unbind_sess(iscsit_tgt_t *tgt, iscsit_sess_t *sess); 7977978SPeter.Dunlap@Sun.COM 7987978SPeter.Dunlap@Sun.COM it_cfg_status_t 7997978SPeter.Dunlap@Sun.COM iscsit_config_merge_tpg(it_config_t *cfg, list_t *tpg_del_list); 8007978SPeter.Dunlap@Sun.COM 8017978SPeter.Dunlap@Sun.COM void 8027978SPeter.Dunlap@Sun.COM iscsit_config_destroy_tpgs(list_t *tpg_del_list); 8037978SPeter.Dunlap@Sun.COM 8047978SPeter.Dunlap@Sun.COM iscsit_tpg_t * 8057978SPeter.Dunlap@Sun.COM iscsit_tpg_lookup(char *tpg_name); 8067978SPeter.Dunlap@Sun.COM 8077978SPeter.Dunlap@Sun.COM int 8087978SPeter.Dunlap@Sun.COM iscsit_tpg_avl_compare(const void *void_tpg1, const void *void_tpg2); 8097978SPeter.Dunlap@Sun.COM 8107978SPeter.Dunlap@Sun.COM void 8117978SPeter.Dunlap@Sun.COM iscsit_tpg_hold(iscsit_tpg_t *tpg); 8127978SPeter.Dunlap@Sun.COM 8137978SPeter.Dunlap@Sun.COM void 8147978SPeter.Dunlap@Sun.COM iscsit_tpg_rele(iscsit_tpg_t *tpg); 8157978SPeter.Dunlap@Sun.COM 8167978SPeter.Dunlap@Sun.COM iscsit_tpg_t * 8177978SPeter.Dunlap@Sun.COM iscsit_tpg_createdefault(); 8187978SPeter.Dunlap@Sun.COM 8197978SPeter.Dunlap@Sun.COM void 8207978SPeter.Dunlap@Sun.COM iscsit_tpg_destroydefault(iscsit_tpg_t *tpg); 8217978SPeter.Dunlap@Sun.COM 8227978SPeter.Dunlap@Sun.COM idm_status_t 8237978SPeter.Dunlap@Sun.COM iscsit_tpg_online(iscsit_tpg_t *tpg); 8247978SPeter.Dunlap@Sun.COM 8257978SPeter.Dunlap@Sun.COM void 8267978SPeter.Dunlap@Sun.COM iscsit_tpg_offline(iscsit_tpg_t *tpg); 8277978SPeter.Dunlap@Sun.COM 8287978SPeter.Dunlap@Sun.COM iscsit_portal_t * 8297978SPeter.Dunlap@Sun.COM iscsit_tpg_portal_lookup(iscsit_tpg_t *tpg, struct sockaddr_storage *sa); 8307978SPeter.Dunlap@Sun.COM 8317978SPeter.Dunlap@Sun.COM void 8327978SPeter.Dunlap@Sun.COM iscsit_portal_hold(iscsit_portal_t *portal); 8337978SPeter.Dunlap@Sun.COM 8347978SPeter.Dunlap@Sun.COM void 8357978SPeter.Dunlap@Sun.COM iscsit_portal_rele(iscsit_portal_t *portal); 8367978SPeter.Dunlap@Sun.COM 8377978SPeter.Dunlap@Sun.COM it_cfg_status_t 8387978SPeter.Dunlap@Sun.COM iscsit_config_merge_ini(it_config_t *cfg); 8397978SPeter.Dunlap@Sun.COM 8407978SPeter.Dunlap@Sun.COM int 8417978SPeter.Dunlap@Sun.COM iscsit_ini_avl_compare(const void *void_ini1, const void *void_ini2); 8427978SPeter.Dunlap@Sun.COM 8437978SPeter.Dunlap@Sun.COM iscsit_ini_t * 8447978SPeter.Dunlap@Sun.COM iscsit_ini_lookup_locked(char *ini_name); 8457978SPeter.Dunlap@Sun.COM 8467978SPeter.Dunlap@Sun.COM int 8477978SPeter.Dunlap@Sun.COM iscsit_portal_avl_compare(const void *void_portal1, const void *void_portal2); 8487978SPeter.Dunlap@Sun.COM 8497978SPeter.Dunlap@Sun.COM int 8507978SPeter.Dunlap@Sun.COM iscsit_verify_chap_resp(iscsit_conn_login_t *lsm, 8517978SPeter.Dunlap@Sun.COM unsigned int chap_i, uchar_t *chap_c, unsigned int challenge_len, 8527978SPeter.Dunlap@Sun.COM uchar_t *chap_r, unsigned int resp_len); 8537978SPeter.Dunlap@Sun.COM 85412372SPriya.Krishnan@Sun.COM void 85512372SPriya.Krishnan@Sun.COM iscsit_rxpdu_queue_monitor_start(void); 85612372SPriya.Krishnan@Sun.COM 85712372SPriya.Krishnan@Sun.COM void 85812372SPriya.Krishnan@Sun.COM iscsit_rxpdu_queue_monitor_stop(void); 85912372SPriya.Krishnan@Sun.COM 8607978SPeter.Dunlap@Sun.COM #endif /* _ISCSIT_H_ */ 861