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