1a6d42e7dSPeter Dunlap /* 2a6d42e7dSPeter Dunlap * CDDL HEADER START 3a6d42e7dSPeter Dunlap * 4a6d42e7dSPeter Dunlap * The contents of this file are subject to the terms of the 5a6d42e7dSPeter Dunlap * Common Development and Distribution License (the "License"). 6a6d42e7dSPeter Dunlap * You may not use this file except in compliance with the License. 7a6d42e7dSPeter Dunlap * 8a6d42e7dSPeter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9a6d42e7dSPeter Dunlap * or http://www.opensolaris.org/os/licensing. 10a6d42e7dSPeter Dunlap * See the License for the specific language governing permissions 11a6d42e7dSPeter Dunlap * and limitations under the License. 12a6d42e7dSPeter Dunlap * 13a6d42e7dSPeter Dunlap * When distributing Covered Code, include this CDDL HEADER in each 14a6d42e7dSPeter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15a6d42e7dSPeter Dunlap * If applicable, add the following below this CDDL HEADER, with the 16a6d42e7dSPeter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying 17a6d42e7dSPeter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner] 18a6d42e7dSPeter Dunlap * 19a6d42e7dSPeter Dunlap * CDDL HEADER END 20a6d42e7dSPeter Dunlap */ 21a6d42e7dSPeter Dunlap 22a6d42e7dSPeter Dunlap /* 2330e7468fSPeter Dunlap * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*61dfa509SRick McNeal * Copyright 2017 Nexenta Systems, Inc. All rights reserved. 25a6d42e7dSPeter Dunlap * Use is subject to license terms. 26a6d42e7dSPeter Dunlap */ 27a6d42e7dSPeter Dunlap 28a6d42e7dSPeter Dunlap #ifndef _IDM_H 29a6d42e7dSPeter Dunlap #define _IDM_H 30a6d42e7dSPeter Dunlap 31a6d42e7dSPeter Dunlap #ifdef __cplusplus 32a6d42e7dSPeter Dunlap extern "C" { 33a6d42e7dSPeter Dunlap #endif 34a6d42e7dSPeter Dunlap 35*61dfa509SRick McNeal #include <sys/stmf_defines.h> 36*61dfa509SRick McNeal 37a6d42e7dSPeter Dunlap typedef enum { 38a6d42e7dSPeter Dunlap IDM_STATUS_SUCCESS = 0, 39a6d42e7dSPeter Dunlap IDM_STATUS_FAIL, 40a6d42e7dSPeter Dunlap IDM_STATUS_NORESOURCES, 41a6d42e7dSPeter Dunlap IDM_STATUS_REJECT, 42a6d42e7dSPeter Dunlap IDM_STATUS_IO, 43a6d42e7dSPeter Dunlap IDM_STATUS_ABORTED, 44a6d42e7dSPeter Dunlap IDM_STATUS_SUSPENDED, 45a6d42e7dSPeter Dunlap IDM_STATUS_HEADER_DIGEST, 46a6d42e7dSPeter Dunlap IDM_STATUS_DATA_DIGEST, 4730e7468fSPeter Dunlap IDM_STATUS_PROTOCOL_ERROR, 4830e7468fSPeter Dunlap IDM_STATUS_LOGIN_FAIL 49a6d42e7dSPeter Dunlap } idm_status_t; 50a6d42e7dSPeter Dunlap 51*61dfa509SRick McNeal #define IDM_CLIENT_NOTIFY_LIST() \ 52*61dfa509SRick McNeal item(CN_UNDEFINED) \ 53*61dfa509SRick McNeal item(CN_CONNECT_ACCEPT) /* Target only */ \ 54*61dfa509SRick McNeal item(CN_LOGIN_FAIL) \ 55*61dfa509SRick McNeal item(CN_READY_FOR_LOGIN) /* Initiator only */ \ 56*61dfa509SRick McNeal item(CN_FFP_ENABLED) \ 57*61dfa509SRick McNeal item(CN_FFP_DISABLED) \ 58*61dfa509SRick McNeal item(CN_CONNECT_LOST) \ 59*61dfa509SRick McNeal item(CN_CONNECT_DESTROY) \ 60*61dfa509SRick McNeal item(CN_CONNECT_FAIL) \ 61*61dfa509SRick McNeal item(CN_MAX) 6230e7468fSPeter Dunlap 63a6d42e7dSPeter Dunlap typedef enum { 64*61dfa509SRick McNeal #define item(a) a, 65*61dfa509SRick McNeal IDM_CLIENT_NOTIFY_LIST() 66*61dfa509SRick McNeal #undef item 67a6d42e7dSPeter Dunlap } idm_client_notify_t; 68a6d42e7dSPeter Dunlap 6930e7468fSPeter Dunlap #ifdef IDM_CN_NOTIFY_STRINGS 7030e7468fSPeter Dunlap static const char *idm_cn_strings[CN_MAX + 1] = { 71*61dfa509SRick McNeal #define item(a) #a, 72*61dfa509SRick McNeal IDM_CLIENT_NOTIFY_LIST() 73*61dfa509SRick McNeal #undef item 7430e7468fSPeter Dunlap }; 7530e7468fSPeter Dunlap #endif 7630e7468fSPeter Dunlap 77a6d42e7dSPeter Dunlap typedef enum { 78a6d42e7dSPeter Dunlap FD_CONN_FAIL, 79a6d42e7dSPeter Dunlap FD_CONN_LOGOUT, 80a6d42e7dSPeter Dunlap FD_SESS_LOGOUT 81a6d42e7dSPeter Dunlap } idm_ffp_disable_t; 82a6d42e7dSPeter Dunlap 83a6d42e7dSPeter Dunlap typedef enum { 84a6d42e7dSPeter Dunlap AT_INTERNAL_SUSPEND, 85a6d42e7dSPeter Dunlap AT_INTERNAL_ABORT, 86a6d42e7dSPeter Dunlap AT_TASK_MGMT_ABORT 87a6d42e7dSPeter Dunlap } idm_abort_type_t; 88a6d42e7dSPeter Dunlap 89*61dfa509SRick McNeal #define IDM_TASK_STATE_LIST() \ 90*61dfa509SRick McNeal item(TASK_IDLE) \ 91*61dfa509SRick McNeal item(TASK_ACTIVE) \ 92*61dfa509SRick McNeal item(TASK_SUSPENDING) \ 93*61dfa509SRick McNeal item(TASK_SUSPENDED) \ 94*61dfa509SRick McNeal item(TASK_ABORTING) \ 95*61dfa509SRick McNeal item(TASK_ABORTED) \ 96*61dfa509SRick McNeal item(TASK_COMPLETE) \ 97*61dfa509SRick McNeal item(TASK_MAX_STATE) 98*61dfa509SRick McNeal 99a6d42e7dSPeter Dunlap typedef enum { 100*61dfa509SRick McNeal #define item(a) a, 101*61dfa509SRick McNeal IDM_TASK_STATE_LIST() 102*61dfa509SRick McNeal #undef item 103a6d42e7dSPeter Dunlap } idm_task_state_t; 104a6d42e7dSPeter Dunlap 105bf604c64SPeter Dunlap #ifdef IDM_TASK_SM_STRINGS 106bf604c64SPeter Dunlap static const char *idm_ts_name[TASK_MAX_STATE+1] = { 107*61dfa509SRick McNeal #define item(a) #a, 108*61dfa509SRick McNeal IDM_TASK_STATE_LIST() 109*61dfa509SRick McNeal #undef item 110bf604c64SPeter Dunlap }; 111bf604c64SPeter Dunlap #endif 112bf604c64SPeter Dunlap 113a6d42e7dSPeter Dunlap typedef enum { 114a6d42e7dSPeter Dunlap KV_HANDLED = 0, 115a6d42e7dSPeter Dunlap KV_HANDLED_NO_TRANSIT, 116a6d42e7dSPeter Dunlap KV_UNHANDLED, 117a6d42e7dSPeter Dunlap KV_TARGET_ONLY, 118a6d42e7dSPeter Dunlap KV_NO_RESOURCES, 119a6d42e7dSPeter Dunlap KV_INTERNAL_ERROR, 120a6d42e7dSPeter Dunlap KV_VALUE_ERROR, 121a6d42e7dSPeter Dunlap KV_MISSING_FIELDS, 122a6d42e7dSPeter Dunlap KV_AUTH_FAILED 123a6d42e7dSPeter Dunlap } kv_status_t; 124a6d42e7dSPeter Dunlap 125a6d42e7dSPeter Dunlap /* 126a6d42e7dSPeter Dunlap * Request structures 127a6d42e7dSPeter Dunlap */ 128a6d42e7dSPeter Dunlap 129a6d42e7dSPeter Dunlap /* Defined in idm_impl.h */ 130a6d42e7dSPeter Dunlap struct idm_conn_s; 131a6d42e7dSPeter Dunlap struct idm_svc_s; 132a6d42e7dSPeter Dunlap struct idm_buf_s; 133a6d42e7dSPeter Dunlap struct idm_pdu_s; 134a6d42e7dSPeter Dunlap struct idm_task_s; 135a6d42e7dSPeter Dunlap 136a6d42e7dSPeter Dunlap typedef idm_status_t (idm_client_notify_cb_t)( 137a6d42e7dSPeter Dunlap struct idm_conn_s *ic, idm_client_notify_t cn, uintptr_t data); 138a6d42e7dSPeter Dunlap 139a6d42e7dSPeter Dunlap typedef void (idm_rx_pdu_cb_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu); 140a6d42e7dSPeter Dunlap 141a6d42e7dSPeter Dunlap typedef void (idm_rx_pdu_error_cb_t)(struct idm_conn_s *ic, 142a6d42e7dSPeter Dunlap struct idm_pdu_s *pdu, idm_status_t status); 143a6d42e7dSPeter Dunlap 144a6d42e7dSPeter Dunlap typedef void (idm_buf_cb_t)(struct idm_buf_s *idb, idm_status_t status); 145a6d42e7dSPeter Dunlap 146a6d42e7dSPeter Dunlap typedef void (idm_pdu_cb_t)(struct idm_pdu_s *pdu, idm_status_t status); 147a6d42e7dSPeter Dunlap 148a6d42e7dSPeter Dunlap typedef void (idm_task_cb_t)(struct idm_task_s *task, idm_status_t status); 149a6d42e7dSPeter Dunlap 150a6d42e7dSPeter Dunlap typedef void (idm_build_hdr_cb_t)( 151a6d42e7dSPeter Dunlap struct idm_task_s *task, struct idm_pdu_s *pdu, uint8_t opcode); 152a6d42e7dSPeter Dunlap 15360220f10SPriya Krishnan typedef void (idm_update_statsn_cb_t)( 15460220f10SPriya Krishnan struct idm_task_s *task, struct idm_pdu_s *pdu); 15560220f10SPriya Krishnan 15672cf3143Speter dunlap typedef void (idm_keepalive_cb_t)(struct idm_conn_s *ic); 15772cf3143Speter dunlap 158a6d42e7dSPeter Dunlap typedef union idm_sockaddr { 159a6d42e7dSPeter Dunlap struct sockaddr sin; 160a6d42e7dSPeter Dunlap struct sockaddr_in sin4; 161a6d42e7dSPeter Dunlap struct sockaddr_in6 sin6; 162a6d42e7dSPeter Dunlap } idm_sockaddr_t; 163a6d42e7dSPeter Dunlap 164a6d42e7dSPeter Dunlap #define SIZEOF_SOCKADDR(so) \ 165a6d42e7dSPeter Dunlap ((so)->sa_family == AF_INET ? \ 166a6d42e7dSPeter Dunlap sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6)) 167a6d42e7dSPeter Dunlap 168a6d42e7dSPeter Dunlap typedef struct { 169a6d42e7dSPeter Dunlap idm_rx_pdu_cb_t *icb_rx_scsi_cmd; 170a6d42e7dSPeter Dunlap idm_rx_pdu_cb_t *icb_rx_scsi_rsp; 171a6d42e7dSPeter Dunlap idm_rx_pdu_cb_t *icb_rx_misc; 172a6d42e7dSPeter Dunlap idm_rx_pdu_error_cb_t *icb_rx_error; 173a6d42e7dSPeter Dunlap idm_task_cb_t *icb_task_aborted; 174a6d42e7dSPeter Dunlap idm_client_notify_cb_t *icb_client_notify; 175a6d42e7dSPeter Dunlap idm_build_hdr_cb_t *icb_build_hdr; 17660220f10SPriya Krishnan idm_update_statsn_cb_t *icb_update_statsn; /* advance statsn */ 17772cf3143Speter dunlap idm_keepalive_cb_t *icb_keepalive; 178a6d42e7dSPeter Dunlap } idm_conn_ops_t; 179a6d42e7dSPeter Dunlap 180a6d42e7dSPeter Dunlap typedef struct { 181a6d42e7dSPeter Dunlap int cr_domain; 182a6d42e7dSPeter Dunlap int cr_type; 183a6d42e7dSPeter Dunlap int cr_protocol; 184a6d42e7dSPeter Dunlap boolean_t cr_bound; 185a6d42e7dSPeter Dunlap idm_sockaddr_t cr_bound_addr; 186a6d42e7dSPeter Dunlap idm_sockaddr_t cr_ini_dst_addr; 187a6d42e7dSPeter Dunlap ldi_ident_t cr_li; 188a6d42e7dSPeter Dunlap idm_conn_ops_t icr_conn_ops; 189dedec472SJack Meng boolean_t cr_boot_conn; 190a6d42e7dSPeter Dunlap } idm_conn_req_t; 191a6d42e7dSPeter Dunlap 192a6d42e7dSPeter Dunlap typedef struct { 193a6d42e7dSPeter Dunlap uint16_t sr_port; 194a6d42e7dSPeter Dunlap ldi_ident_t sr_li; 195a6d42e7dSPeter Dunlap idm_conn_ops_t sr_conn_ops; 196a6d42e7dSPeter Dunlap } idm_svc_req_t; 197a6d42e7dSPeter Dunlap 198a6d42e7dSPeter Dunlap 199a6d42e7dSPeter Dunlap /* This is not how other networking code handles this */ 200a6d42e7dSPeter Dunlap typedef struct { 201a6d42e7dSPeter Dunlap union { 202a6d42e7dSPeter Dunlap struct in_addr in4; 203a6d42e7dSPeter Dunlap struct in6_addr in6; 204a6d42e7dSPeter Dunlap } i_addr; 205a6d42e7dSPeter Dunlap /* i_insize determines which is valid in the union above */ 206a6d42e7dSPeter Dunlap int i_insize; 207a6d42e7dSPeter Dunlap } idm_ipaddr_t; 208a6d42e7dSPeter Dunlap 209a6d42e7dSPeter Dunlap typedef struct { 210a6d42e7dSPeter Dunlap idm_ipaddr_t a_addr; 211a6d42e7dSPeter Dunlap uint32_t a_port, 212a6d42e7dSPeter Dunlap a_oid; 213a6d42e7dSPeter Dunlap } idm_addr_t; 214a6d42e7dSPeter Dunlap 215a6d42e7dSPeter Dunlap typedef struct { 216a6d42e7dSPeter Dunlap uint32_t al_vers, /* In */ 217a6d42e7dSPeter Dunlap al_oid; /* In */ 218a6d42e7dSPeter Dunlap uint32_t al_in_cnt; /* In */ 219a6d42e7dSPeter Dunlap uint32_t al_out_cnt; /* Out */ 220a6d42e7dSPeter Dunlap uint32_t al_tpgt; /* Out */ 221a6d42e7dSPeter Dunlap idm_addr_t al_addrs[1]; /* Out */ 222a6d42e7dSPeter Dunlap } idm_addr_list_t; 223a6d42e7dSPeter Dunlap 224a6d42e7dSPeter Dunlap /* 225a6d42e7dSPeter Dunlap * State machine auditing 226a6d42e7dSPeter Dunlap */ 227a6d42e7dSPeter Dunlap 228a6d42e7dSPeter Dunlap #define SM_AUDIT_BUF_MAX_REC 32 229a6d42e7dSPeter Dunlap 230a6d42e7dSPeter Dunlap typedef enum { 231a6d42e7dSPeter Dunlap SAR_UNDEFINED = 0, 232a6d42e7dSPeter Dunlap SAR_STATE_EVENT, 233a6d42e7dSPeter Dunlap SAR_STATE_CHANGE 234a6d42e7dSPeter Dunlap } sm_audit_record_type_t; 235a6d42e7dSPeter Dunlap 236a6d42e7dSPeter Dunlap typedef enum { 237a6d42e7dSPeter Dunlap SAS_UNDEFINED = 0, 238a6d42e7dSPeter Dunlap SAS_IDM_CONN, 239a6d42e7dSPeter Dunlap SAS_IDM_TASK, 240a6d42e7dSPeter Dunlap SAS_ISCSIT_TGT, 241a6d42e7dSPeter Dunlap SAS_ISCSIT_SESS, 24230e7468fSPeter Dunlap SAS_ISCSIT_LOGIN, 24330e7468fSPeter Dunlap SAS_ISCSI_CMD, 24430e7468fSPeter Dunlap SAS_ISCSI_SESS, 24530e7468fSPeter Dunlap SAS_ISCSI_CONN, 24630e7468fSPeter Dunlap SAS_ISCSI_LOGIN 247a6d42e7dSPeter Dunlap } sm_audit_sm_type_t; 248a6d42e7dSPeter Dunlap 249a6d42e7dSPeter Dunlap typedef struct { 250a6d42e7dSPeter Dunlap timespec_t sar_timestamp; 251a6d42e7dSPeter Dunlap sm_audit_sm_type_t sar_sm_type; 252a6d42e7dSPeter Dunlap sm_audit_record_type_t sar_type; 253a6d42e7dSPeter Dunlap int sar_state; 254a6d42e7dSPeter Dunlap int sar_new_state; /* Only for SAR_STATE_CHANGE */ 255a6d42e7dSPeter Dunlap int sar_event; /* Only for SAR_STATE_EVENT */ 256a6d42e7dSPeter Dunlap uintptr_t sar_event_info; /* Only for SAR_STATE_EVENT */ 257a6d42e7dSPeter Dunlap } sm_audit_record_t; 258a6d42e7dSPeter Dunlap 259a6d42e7dSPeter Dunlap typedef struct { 260a6d42e7dSPeter Dunlap int sab_index; 261a6d42e7dSPeter Dunlap int sab_max_index; 262a6d42e7dSPeter Dunlap sm_audit_record_t sab_records[SM_AUDIT_BUF_MAX_REC]; 263a6d42e7dSPeter Dunlap } sm_audit_buf_t; 264a6d42e7dSPeter Dunlap 265a6d42e7dSPeter Dunlap extern boolean_t idm_sm_logging; 266a6d42e7dSPeter Dunlap extern boolean_t idm_conn_logging; 267a6d42e7dSPeter Dunlap extern boolean_t idm_svc_logging; 268a6d42e7dSPeter Dunlap 269a6d42e7dSPeter Dunlap #define IDM_SM_LOG if (idm_sm_logging) cmn_err 270a6d42e7dSPeter Dunlap #define IDM_CONN_LOG if (idm_conn_logging) cmn_err 271a6d42e7dSPeter Dunlap #define IDM_SVC_LOG if (idm_svc_logging) cmn_err 272a6d42e7dSPeter Dunlap 273a6d42e7dSPeter Dunlap void idm_sm_audit_init(sm_audit_buf_t *audit_buf); 274a6d42e7dSPeter Dunlap 275a6d42e7dSPeter Dunlap void idm_sm_audit_event(sm_audit_buf_t *audit_buf, 276a6d42e7dSPeter Dunlap sm_audit_sm_type_t sm_type, 277a6d42e7dSPeter Dunlap int state, int event, uintptr_t event_info); 278a6d42e7dSPeter Dunlap 279a6d42e7dSPeter Dunlap void idm_sm_audit_state_change(sm_audit_buf_t *audit_buf, 280a6d42e7dSPeter Dunlap sm_audit_sm_type_t sm_type, int state, int new_state); 281a6d42e7dSPeter Dunlap 282a6d42e7dSPeter Dunlap 283a6d42e7dSPeter Dunlap #include <sys/iscsi_protocol.h> 284a6d42e7dSPeter Dunlap #include <sys/idm/idm_conn_sm.h> 285a6d42e7dSPeter Dunlap #include <sys/idm/idm_transport.h> 286a6d42e7dSPeter Dunlap #include <sys/idm/idm_impl.h> 287a6d42e7dSPeter Dunlap #include <sys/idm/idm_text.h> 288a6d42e7dSPeter Dunlap #include <sys/idm/idm_so.h> 289a6d42e7dSPeter Dunlap 290a6d42e7dSPeter Dunlap /* 291a6d42e7dSPeter Dunlap * iSCSI Initiator Services 292a6d42e7dSPeter Dunlap */ 293a6d42e7dSPeter Dunlap 294a6d42e7dSPeter Dunlap idm_status_t 295a6d42e7dSPeter Dunlap idm_ini_conn_create(idm_conn_req_t *cr, idm_conn_t **new_con); 296a6d42e7dSPeter Dunlap 297a6d42e7dSPeter Dunlap idm_status_t 298a6d42e7dSPeter Dunlap idm_ini_conn_connect(idm_conn_t *ic); 299a6d42e7dSPeter Dunlap 300a6d42e7dSPeter Dunlap void 301a6d42e7dSPeter Dunlap idm_ini_conn_disconnect(idm_conn_t *ic); 302a6d42e7dSPeter Dunlap 30330e7468fSPeter Dunlap void 30430e7468fSPeter Dunlap idm_ini_conn_disconnect_sync(idm_conn_t *ic); 30530e7468fSPeter Dunlap 306a6d42e7dSPeter Dunlap void 307a6d42e7dSPeter Dunlap idm_ini_conn_destroy(idm_conn_t *ic); 308a6d42e7dSPeter Dunlap 309a6d42e7dSPeter Dunlap /* 310a6d42e7dSPeter Dunlap * iSCSI Target Services 311a6d42e7dSPeter Dunlap */ 312a6d42e7dSPeter Dunlap 313a6d42e7dSPeter Dunlap idm_status_t 314a6d42e7dSPeter Dunlap idm_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t **new_svc); 315a6d42e7dSPeter Dunlap 316a6d42e7dSPeter Dunlap idm_status_t 317a6d42e7dSPeter Dunlap idm_tgt_svc_online(idm_svc_t *is); 318a6d42e7dSPeter Dunlap 319a6d42e7dSPeter Dunlap void 320a6d42e7dSPeter Dunlap idm_tgt_svc_offline(idm_svc_t *is); 321a6d42e7dSPeter Dunlap 322a6d42e7dSPeter Dunlap void 323a6d42e7dSPeter Dunlap idm_tgt_svc_destroy(idm_svc_t *is); 324a6d42e7dSPeter Dunlap 325a6d42e7dSPeter Dunlap void 326a6d42e7dSPeter Dunlap idm_tgt_svc_destroy_if_unref(idm_svc_t *is); 327a6d42e7dSPeter Dunlap 328a6d42e7dSPeter Dunlap idm_svc_t * 329a6d42e7dSPeter Dunlap idm_tgt_svc_lookup(uint16_t port); 330a6d42e7dSPeter Dunlap 331a6d42e7dSPeter Dunlap void 332a6d42e7dSPeter Dunlap idm_tgt_svc_hold(idm_svc_t *is); 333a6d42e7dSPeter Dunlap 334a6d42e7dSPeter Dunlap void 335a6d42e7dSPeter Dunlap idm_tgt_svc_rele_and_destroy(idm_svc_t *is); 336a6d42e7dSPeter Dunlap 337a6d42e7dSPeter Dunlap idm_status_t 338a6d42e7dSPeter Dunlap idm_tgt_conn_accept(idm_conn_t *ic); 339a6d42e7dSPeter Dunlap 340a6d42e7dSPeter Dunlap void 341a6d42e7dSPeter Dunlap idm_tgt_conn_reject(idm_conn_t *ic); 342a6d42e7dSPeter Dunlap 343a6d42e7dSPeter Dunlap void 344a6d42e7dSPeter Dunlap idm_conn_hold(idm_conn_t *ic); 345a6d42e7dSPeter Dunlap 346a6d42e7dSPeter Dunlap void 347a6d42e7dSPeter Dunlap idm_conn_rele(idm_conn_t *ic); 348a6d42e7dSPeter Dunlap 349a668b114SPriya Krishnan void 350a668b114SPriya Krishnan idm_conn_set_target_name(idm_conn_t *ic, char *target_name); 351a668b114SPriya Krishnan 352a668b114SPriya Krishnan void 353a668b114SPriya Krishnan idm_conn_set_initiator_name(idm_conn_t *ic, char *initiator_name); 354a668b114SPriya Krishnan 355a668b114SPriya Krishnan void 356a668b114SPriya Krishnan idm_conn_set_isid(idm_conn_t *ic, uint8_t isid[ISCSI_ISID_LEN]); 357a668b114SPriya Krishnan 358a6d42e7dSPeter Dunlap /* 359a6d42e7dSPeter Dunlap * Target data transfer services 360a6d42e7dSPeter Dunlap */ 361a6d42e7dSPeter Dunlap idm_status_t 362a6d42e7dSPeter Dunlap idm_buf_tx_to_ini(idm_task_t *idt, idm_buf_t *idb, 363a6d42e7dSPeter Dunlap uint32_t offset, uint32_t xfer_length, 364a6d42e7dSPeter Dunlap idm_buf_cb_t idb_buf_cb, void *cb_arg); 365a6d42e7dSPeter Dunlap 366a6d42e7dSPeter Dunlap idm_status_t 367a6d42e7dSPeter Dunlap idm_buf_rx_from_ini(idm_task_t *idt, idm_buf_t *idb, 368a6d42e7dSPeter Dunlap uint32_t offset, uint32_t xfer_length, 369a6d42e7dSPeter Dunlap idm_buf_cb_t idb_buf_cb, void *cb_arg); 370a6d42e7dSPeter Dunlap 371a6d42e7dSPeter Dunlap void 372a6d42e7dSPeter Dunlap idm_buf_tx_to_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status); 373a6d42e7dSPeter Dunlap 374a6d42e7dSPeter Dunlap void 375a6d42e7dSPeter Dunlap idm_buf_rx_from_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status); 376a6d42e7dSPeter Dunlap 377a668b114SPriya Krishnan #define XFER_BUF_TX_TO_INI 0 378a668b114SPriya Krishnan #define XFER_BUF_RX_FROM_INI 1 379a6d42e7dSPeter Dunlap /* 380a6d42e7dSPeter Dunlap * Shared Initiator/Target Services 381a6d42e7dSPeter Dunlap */ 382a6d42e7dSPeter Dunlap kv_status_t 383a6d42e7dSPeter Dunlap idm_negotiate_key_values(idm_conn_t *ic, nvlist_t *request_nvl, 384a6d42e7dSPeter Dunlap nvlist_t *response_nvl, nvlist_t *negotiated_nvl); 385a6d42e7dSPeter Dunlap 38630e7468fSPeter Dunlap void 387a6d42e7dSPeter Dunlap idm_notice_key_values(idm_conn_t *ic, nvlist_t *negotiated_nvl); 388a6d42e7dSPeter Dunlap 38956261083SCharles Ting kv_status_t 39056261083SCharles Ting idm_declare_key_values(idm_conn_t *ic, nvlist_t *config_nvl, 39156261083SCharles Ting nvlist_t *outgoing_nvl); 39256261083SCharles Ting 393a6d42e7dSPeter Dunlap /* 394a6d42e7dSPeter Dunlap * Buffer services 395a6d42e7dSPeter Dunlap */ 396a6d42e7dSPeter Dunlap 397a6d42e7dSPeter Dunlap idm_buf_t * 398a6d42e7dSPeter Dunlap idm_buf_alloc(idm_conn_t *ic, void *bufptr, uint64_t buflen); 399a6d42e7dSPeter Dunlap 400a6d42e7dSPeter Dunlap void 401a6d42e7dSPeter Dunlap idm_buf_free(idm_buf_t *idb); 402a6d42e7dSPeter Dunlap 403a6d42e7dSPeter Dunlap void 404a6d42e7dSPeter Dunlap idm_buf_bind_in(idm_task_t *idt, idm_buf_t *buf); 405a6d42e7dSPeter Dunlap 406a6d42e7dSPeter Dunlap void 407a6d42e7dSPeter Dunlap idm_buf_bind_out(idm_task_t *idt, idm_buf_t *buf); 408a6d42e7dSPeter Dunlap 409a6d42e7dSPeter Dunlap void 410a6d42e7dSPeter Dunlap idm_buf_unbind_in(idm_task_t *idt, idm_buf_t *buf); 411a6d42e7dSPeter Dunlap 412a6d42e7dSPeter Dunlap void 413a6d42e7dSPeter Dunlap idm_buf_unbind_out(idm_task_t *idt, idm_buf_t *buf); 414a6d42e7dSPeter Dunlap 415a6d42e7dSPeter Dunlap idm_buf_t * 416a6d42e7dSPeter Dunlap idm_buf_find(void *lbuf, size_t data_offset); 417a6d42e7dSPeter Dunlap 41830e7468fSPeter Dunlap void 41930e7468fSPeter Dunlap idm_bufpat_set(idm_buf_t *idb); 42030e7468fSPeter Dunlap 42130e7468fSPeter Dunlap boolean_t 42230e7468fSPeter Dunlap idm_bufpat_check(idm_buf_t *idb, int check_len, idm_bufpat_check_type_t type); 42330e7468fSPeter Dunlap 42430e7468fSPeter Dunlap extern boolean_t idm_pattern_checking; 42530e7468fSPeter Dunlap 426*61dfa509SRick McNeal #define IDM_BUFPAT_SET(CHK_BUF) \ 42730e7468fSPeter Dunlap if (idm_pattern_checking && (CHK_BUF)->idb_bufalloc) { \ 42830e7468fSPeter Dunlap idm_bufpat_set(CHK_BUF); \ 42930e7468fSPeter Dunlap } 43030e7468fSPeter Dunlap 431*61dfa509SRick McNeal #define IDM_BUFPAT_CHECK(CHK_BUF, CHK_LEN, CHK_TYPE) \ 43230e7468fSPeter Dunlap if (idm_pattern_checking) { \ 43330e7468fSPeter Dunlap (void) idm_bufpat_check(CHK_BUF, CHK_LEN, CHK_TYPE); \ 43430e7468fSPeter Dunlap } 43530e7468fSPeter Dunlap 436a6d42e7dSPeter Dunlap /* 437a6d42e7dSPeter Dunlap * Task services 438a6d42e7dSPeter Dunlap */ 439a6d42e7dSPeter Dunlap idm_task_t * 440a6d42e7dSPeter Dunlap idm_task_alloc(idm_conn_t *ic); 441a6d42e7dSPeter Dunlap 442a6d42e7dSPeter Dunlap void 443a6d42e7dSPeter Dunlap idm_task_start(idm_task_t *idt, uintptr_t handle); 444a6d42e7dSPeter Dunlap 445*61dfa509SRick McNeal stmf_status_t 446a6d42e7dSPeter Dunlap idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type); 447a6d42e7dSPeter Dunlap 448a6d42e7dSPeter Dunlap void 449a6d42e7dSPeter Dunlap idm_task_cleanup(idm_task_t *idt); 450a6d42e7dSPeter Dunlap 451a6d42e7dSPeter Dunlap void 452a6d42e7dSPeter Dunlap idm_task_done(idm_task_t *idt); 453a6d42e7dSPeter Dunlap 454a6d42e7dSPeter Dunlap void 455a6d42e7dSPeter Dunlap idm_task_free(idm_task_t *idt); 456a6d42e7dSPeter Dunlap 457a6d42e7dSPeter Dunlap idm_task_t * 458a6d42e7dSPeter Dunlap idm_task_find(idm_conn_t *ic, uint32_t itt, uint32_t ttt); 459a6d42e7dSPeter Dunlap 46030e7468fSPeter Dunlap idm_task_t * 46130e7468fSPeter Dunlap idm_task_find_and_complete(idm_conn_t *ic, uint32_t itt, uint32_t ttt); 46230e7468fSPeter Dunlap 463a6d42e7dSPeter Dunlap void * 464a6d42e7dSPeter Dunlap idm_task_find_by_handle(idm_conn_t *ic, uintptr_t handle); 465a6d42e7dSPeter Dunlap 466a6d42e7dSPeter Dunlap void 467a6d42e7dSPeter Dunlap idm_task_hold(idm_task_t *idt); 468a6d42e7dSPeter Dunlap 469a6d42e7dSPeter Dunlap void 470a6d42e7dSPeter Dunlap idm_task_rele(idm_task_t *idt); 471a6d42e7dSPeter Dunlap 472a6d42e7dSPeter Dunlap /* 473a6d42e7dSPeter Dunlap * PDU Services 474a6d42e7dSPeter Dunlap */ 475a6d42e7dSPeter Dunlap 476a6d42e7dSPeter Dunlap idm_pdu_t * 477a6d42e7dSPeter Dunlap idm_pdu_alloc(uint_t hdrlen, uint_t datalen); 478a6d42e7dSPeter Dunlap 47930e7468fSPeter Dunlap idm_pdu_t * 48030e7468fSPeter Dunlap idm_pdu_alloc_nosleep(uint_t hdrlen, uint_t datalen); 48130e7468fSPeter Dunlap 482a6d42e7dSPeter Dunlap void 483a6d42e7dSPeter Dunlap idm_pdu_free(idm_pdu_t *pdu); 484a6d42e7dSPeter Dunlap 485a6d42e7dSPeter Dunlap void 486a6d42e7dSPeter Dunlap idm_pdu_init(idm_pdu_t *pdu, idm_conn_t *ic, void *private, idm_pdu_cb_t *cb); 487a6d42e7dSPeter Dunlap 488a6d42e7dSPeter Dunlap void 489a6d42e7dSPeter Dunlap idm_pdu_init_hdr(idm_pdu_t *pdu, uint8_t *hdr, uint_t hdrlen); 490a6d42e7dSPeter Dunlap 491a6d42e7dSPeter Dunlap void 492a6d42e7dSPeter Dunlap idm_pdu_init_data(idm_pdu_t *pdu, uint8_t *data, uint_t datalen); 493a6d42e7dSPeter Dunlap 494a6d42e7dSPeter Dunlap void 495a6d42e7dSPeter Dunlap idm_pdu_complete(idm_pdu_t *pdu, idm_status_t status); 496a6d42e7dSPeter Dunlap 497a6d42e7dSPeter Dunlap void 498a6d42e7dSPeter Dunlap idm_pdu_tx(idm_pdu_t *pdu); 499a6d42e7dSPeter Dunlap 500a6d42e7dSPeter Dunlap /* 501a6d42e7dSPeter Dunlap * Object reference tracking 502a6d42e7dSPeter Dunlap */ 503a6d42e7dSPeter Dunlap 504a6d42e7dSPeter Dunlap void 505a6d42e7dSPeter Dunlap idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj); 506a6d42e7dSPeter Dunlap 507a6d42e7dSPeter Dunlap void 508a6d42e7dSPeter Dunlap idm_refcnt_destroy(idm_refcnt_t *refcnt); 509a6d42e7dSPeter Dunlap 510a6d42e7dSPeter Dunlap void 511a6d42e7dSPeter Dunlap idm_refcnt_reset(idm_refcnt_t *refcnt); 512a6d42e7dSPeter Dunlap 513a6d42e7dSPeter Dunlap void 514a6d42e7dSPeter Dunlap idm_refcnt_hold(idm_refcnt_t *refcnt); 515a6d42e7dSPeter Dunlap 516a6d42e7dSPeter Dunlap void 517a6d42e7dSPeter Dunlap idm_refcnt_rele(idm_refcnt_t *refcnt); 518a6d42e7dSPeter Dunlap 519a6d42e7dSPeter Dunlap void 520a6d42e7dSPeter Dunlap idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func); 521a6d42e7dSPeter Dunlap 522a6d42e7dSPeter Dunlap void 523a6d42e7dSPeter Dunlap idm_refcnt_wait_ref(idm_refcnt_t *refcnt); 524a6d42e7dSPeter Dunlap 525a6d42e7dSPeter Dunlap void 526a6d42e7dSPeter Dunlap idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func); 527a6d42e7dSPeter Dunlap 528*61dfa509SRick McNeal int 529*61dfa509SRick McNeal idm_refcnt_is_held(idm_refcnt_t *refcnt); 530a6d42e7dSPeter Dunlap 531a6d42e7dSPeter Dunlap #ifdef __cplusplus 532a6d42e7dSPeter Dunlap } 533a6d42e7dSPeter Dunlap #endif 534a6d42e7dSPeter Dunlap 535a6d42e7dSPeter Dunlap #endif /* _IDM_H */ 536