17978SPeter.Dunlap@Sun.COM /* 27978SPeter.Dunlap@Sun.COM * CDDL HEADER START 37978SPeter.Dunlap@Sun.COM * 47978SPeter.Dunlap@Sun.COM * The contents of this file are subject to the terms of the 57978SPeter.Dunlap@Sun.COM * Common Development and Distribution License (the "License"). 67978SPeter.Dunlap@Sun.COM * You may not use this file except in compliance with the License. 77978SPeter.Dunlap@Sun.COM * 87978SPeter.Dunlap@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97978SPeter.Dunlap@Sun.COM * or http://www.opensolaris.org/os/licensing. 107978SPeter.Dunlap@Sun.COM * See the License for the specific language governing permissions 117978SPeter.Dunlap@Sun.COM * and limitations under the License. 127978SPeter.Dunlap@Sun.COM * 137978SPeter.Dunlap@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 147978SPeter.Dunlap@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157978SPeter.Dunlap@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 167978SPeter.Dunlap@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 177978SPeter.Dunlap@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 187978SPeter.Dunlap@Sun.COM * 197978SPeter.Dunlap@Sun.COM * CDDL HEADER END 207978SPeter.Dunlap@Sun.COM */ 217978SPeter.Dunlap@Sun.COM 227978SPeter.Dunlap@Sun.COM /* 239162SPeter.Dunlap@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 247978SPeter.Dunlap@Sun.COM * Use is subject to license terms. 257978SPeter.Dunlap@Sun.COM */ 267978SPeter.Dunlap@Sun.COM 277978SPeter.Dunlap@Sun.COM #ifndef _IDM_H 287978SPeter.Dunlap@Sun.COM #define _IDM_H 297978SPeter.Dunlap@Sun.COM 307978SPeter.Dunlap@Sun.COM #ifdef __cplusplus 317978SPeter.Dunlap@Sun.COM extern "C" { 327978SPeter.Dunlap@Sun.COM #endif 337978SPeter.Dunlap@Sun.COM 347978SPeter.Dunlap@Sun.COM typedef enum { 357978SPeter.Dunlap@Sun.COM IDM_STATUS_SUCCESS = 0, 367978SPeter.Dunlap@Sun.COM IDM_STATUS_FAIL, 377978SPeter.Dunlap@Sun.COM IDM_STATUS_NORESOURCES, 387978SPeter.Dunlap@Sun.COM IDM_STATUS_REJECT, 397978SPeter.Dunlap@Sun.COM IDM_STATUS_IO, 407978SPeter.Dunlap@Sun.COM IDM_STATUS_ABORTED, 417978SPeter.Dunlap@Sun.COM IDM_STATUS_SUSPENDED, 427978SPeter.Dunlap@Sun.COM IDM_STATUS_HEADER_DIGEST, 437978SPeter.Dunlap@Sun.COM IDM_STATUS_DATA_DIGEST, 449162SPeter.Dunlap@Sun.COM IDM_STATUS_PROTOCOL_ERROR, 459162SPeter.Dunlap@Sun.COM IDM_STATUS_LOGIN_FAIL 467978SPeter.Dunlap@Sun.COM } idm_status_t; 477978SPeter.Dunlap@Sun.COM 489162SPeter.Dunlap@Sun.COM 497978SPeter.Dunlap@Sun.COM typedef enum { 507978SPeter.Dunlap@Sun.COM CN_CONNECT_ACCEPT = 1, /* Target only */ 519162SPeter.Dunlap@Sun.COM CN_LOGIN_FAIL, 527978SPeter.Dunlap@Sun.COM CN_READY_FOR_LOGIN, /* Initiator only */ 537978SPeter.Dunlap@Sun.COM CN_FFP_ENABLED, 547978SPeter.Dunlap@Sun.COM CN_FFP_DISABLED, 557978SPeter.Dunlap@Sun.COM CN_CONNECT_LOST, 569162SPeter.Dunlap@Sun.COM CN_CONNECT_DESTROY, 579162SPeter.Dunlap@Sun.COM CN_CONNECT_FAIL, 589162SPeter.Dunlap@Sun.COM CN_MAX 597978SPeter.Dunlap@Sun.COM } idm_client_notify_t; 607978SPeter.Dunlap@Sun.COM 619162SPeter.Dunlap@Sun.COM #ifdef IDM_CN_NOTIFY_STRINGS 629162SPeter.Dunlap@Sun.COM static const char *idm_cn_strings[CN_MAX + 1] = { 639162SPeter.Dunlap@Sun.COM "CN_UNDEFINED", 649162SPeter.Dunlap@Sun.COM "CN_CONNECT_ACCEPT", 659162SPeter.Dunlap@Sun.COM "CN_LOGIN_FAIL", 669162SPeter.Dunlap@Sun.COM "CN_READY_FOR_LOGIN", 679162SPeter.Dunlap@Sun.COM "CN_FFP_ENABLED", 689162SPeter.Dunlap@Sun.COM "CN_FFP_DISABLED", 699162SPeter.Dunlap@Sun.COM "CN_CONNECT_LOST", 709162SPeter.Dunlap@Sun.COM "CN_CONNECT_DESTROY", 719162SPeter.Dunlap@Sun.COM "CN_CONNECT_FAIL", 729162SPeter.Dunlap@Sun.COM "CN_MAX" 739162SPeter.Dunlap@Sun.COM }; 749162SPeter.Dunlap@Sun.COM #endif 759162SPeter.Dunlap@Sun.COM 767978SPeter.Dunlap@Sun.COM typedef enum { 777978SPeter.Dunlap@Sun.COM FD_CONN_FAIL, 787978SPeter.Dunlap@Sun.COM FD_CONN_LOGOUT, 797978SPeter.Dunlap@Sun.COM FD_SESS_LOGOUT 807978SPeter.Dunlap@Sun.COM } idm_ffp_disable_t; 817978SPeter.Dunlap@Sun.COM 827978SPeter.Dunlap@Sun.COM typedef enum { 837978SPeter.Dunlap@Sun.COM AT_INTERNAL_SUSPEND, 847978SPeter.Dunlap@Sun.COM AT_INTERNAL_ABORT, 857978SPeter.Dunlap@Sun.COM AT_TASK_MGMT_ABORT 867978SPeter.Dunlap@Sun.COM } idm_abort_type_t; 877978SPeter.Dunlap@Sun.COM 887978SPeter.Dunlap@Sun.COM typedef enum { 897978SPeter.Dunlap@Sun.COM TASK_IDLE, 907978SPeter.Dunlap@Sun.COM TASK_ACTIVE, 917978SPeter.Dunlap@Sun.COM TASK_SUSPENDING, 927978SPeter.Dunlap@Sun.COM TASK_SUSPENDED, 937978SPeter.Dunlap@Sun.COM TASK_ABORTING, 947978SPeter.Dunlap@Sun.COM TASK_ABORTED, 958062SPeter.Dunlap@Sun.COM TASK_COMPLETE, 968062SPeter.Dunlap@Sun.COM TASK_MAX_STATE 977978SPeter.Dunlap@Sun.COM } idm_task_state_t; 987978SPeter.Dunlap@Sun.COM 998062SPeter.Dunlap@Sun.COM #ifdef IDM_TASK_SM_STRINGS 1008062SPeter.Dunlap@Sun.COM static const char *idm_ts_name[TASK_MAX_STATE+1] = { 1018062SPeter.Dunlap@Sun.COM "TASK_IDLE", 1028062SPeter.Dunlap@Sun.COM "TASK_ACTIVE", 1038062SPeter.Dunlap@Sun.COM "TASK_SUSPENDING", 1048062SPeter.Dunlap@Sun.COM "TASK_SUSPENDED", 1058062SPeter.Dunlap@Sun.COM "TASK_ABORTING", 1068062SPeter.Dunlap@Sun.COM "TASK_ABORTED", 1078062SPeter.Dunlap@Sun.COM "TASK_COMPLETE", 1088062SPeter.Dunlap@Sun.COM "TASK_MAX_STATE" 1098062SPeter.Dunlap@Sun.COM }; 1108062SPeter.Dunlap@Sun.COM #endif 1118062SPeter.Dunlap@Sun.COM 1127978SPeter.Dunlap@Sun.COM typedef enum { 1137978SPeter.Dunlap@Sun.COM KV_HANDLED = 0, 1147978SPeter.Dunlap@Sun.COM KV_HANDLED_NO_TRANSIT, 1157978SPeter.Dunlap@Sun.COM KV_UNHANDLED, 1167978SPeter.Dunlap@Sun.COM KV_TARGET_ONLY, 1177978SPeter.Dunlap@Sun.COM KV_NO_RESOURCES, 1187978SPeter.Dunlap@Sun.COM KV_INTERNAL_ERROR, 1197978SPeter.Dunlap@Sun.COM KV_VALUE_ERROR, 1207978SPeter.Dunlap@Sun.COM KV_MISSING_FIELDS, 1217978SPeter.Dunlap@Sun.COM KV_AUTH_FAILED 1227978SPeter.Dunlap@Sun.COM } kv_status_t; 1237978SPeter.Dunlap@Sun.COM 1247978SPeter.Dunlap@Sun.COM /* 1257978SPeter.Dunlap@Sun.COM * Request structures 1267978SPeter.Dunlap@Sun.COM */ 1277978SPeter.Dunlap@Sun.COM 1287978SPeter.Dunlap@Sun.COM /* Defined in idm_impl.h */ 1297978SPeter.Dunlap@Sun.COM struct idm_conn_s; 1307978SPeter.Dunlap@Sun.COM struct idm_svc_s; 1317978SPeter.Dunlap@Sun.COM struct idm_buf_s; 1327978SPeter.Dunlap@Sun.COM struct idm_pdu_s; 1337978SPeter.Dunlap@Sun.COM struct idm_task_s; 1347978SPeter.Dunlap@Sun.COM 1357978SPeter.Dunlap@Sun.COM typedef idm_status_t (idm_client_notify_cb_t)( 1367978SPeter.Dunlap@Sun.COM struct idm_conn_s *ic, idm_client_notify_t cn, uintptr_t data); 1377978SPeter.Dunlap@Sun.COM 1387978SPeter.Dunlap@Sun.COM typedef void (idm_rx_pdu_cb_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu); 1397978SPeter.Dunlap@Sun.COM 1407978SPeter.Dunlap@Sun.COM typedef void (idm_rx_pdu_error_cb_t)(struct idm_conn_s *ic, 1417978SPeter.Dunlap@Sun.COM struct idm_pdu_s *pdu, idm_status_t status); 1427978SPeter.Dunlap@Sun.COM 1437978SPeter.Dunlap@Sun.COM typedef void (idm_buf_cb_t)(struct idm_buf_s *idb, idm_status_t status); 1447978SPeter.Dunlap@Sun.COM 1457978SPeter.Dunlap@Sun.COM typedef void (idm_pdu_cb_t)(struct idm_pdu_s *pdu, idm_status_t status); 1467978SPeter.Dunlap@Sun.COM 1477978SPeter.Dunlap@Sun.COM typedef void (idm_task_cb_t)(struct idm_task_s *task, idm_status_t status); 1487978SPeter.Dunlap@Sun.COM 1497978SPeter.Dunlap@Sun.COM typedef void (idm_build_hdr_cb_t)( 1507978SPeter.Dunlap@Sun.COM struct idm_task_s *task, struct idm_pdu_s *pdu, uint8_t opcode); 1517978SPeter.Dunlap@Sun.COM 152*11081SPriya.Krishnan@Sun.COM typedef void (idm_update_statsn_cb_t)( 153*11081SPriya.Krishnan@Sun.COM struct idm_task_s *task, struct idm_pdu_s *pdu); 154*11081SPriya.Krishnan@Sun.COM 1559586SPeter.Dunlap@Sun.COM typedef void (idm_keepalive_cb_t)(struct idm_conn_s *ic); 1569586SPeter.Dunlap@Sun.COM 1577978SPeter.Dunlap@Sun.COM typedef union idm_sockaddr { 1587978SPeter.Dunlap@Sun.COM struct sockaddr sin; 1597978SPeter.Dunlap@Sun.COM struct sockaddr_in sin4; 1607978SPeter.Dunlap@Sun.COM struct sockaddr_in6 sin6; 1617978SPeter.Dunlap@Sun.COM } idm_sockaddr_t; 1627978SPeter.Dunlap@Sun.COM 1637978SPeter.Dunlap@Sun.COM #define SIZEOF_SOCKADDR(so) \ 1647978SPeter.Dunlap@Sun.COM ((so)->sa_family == AF_INET ? \ 1657978SPeter.Dunlap@Sun.COM sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6)) 1667978SPeter.Dunlap@Sun.COM 1677978SPeter.Dunlap@Sun.COM typedef struct { 1687978SPeter.Dunlap@Sun.COM idm_rx_pdu_cb_t *icb_rx_scsi_cmd; 1697978SPeter.Dunlap@Sun.COM idm_rx_pdu_cb_t *icb_rx_scsi_rsp; 1707978SPeter.Dunlap@Sun.COM idm_rx_pdu_cb_t *icb_rx_misc; 1717978SPeter.Dunlap@Sun.COM idm_rx_pdu_error_cb_t *icb_rx_error; 1727978SPeter.Dunlap@Sun.COM idm_task_cb_t *icb_task_aborted; 1737978SPeter.Dunlap@Sun.COM idm_client_notify_cb_t *icb_client_notify; 1747978SPeter.Dunlap@Sun.COM idm_build_hdr_cb_t *icb_build_hdr; 175*11081SPriya.Krishnan@Sun.COM idm_update_statsn_cb_t *icb_update_statsn; /* advance statsn */ 1769586SPeter.Dunlap@Sun.COM idm_keepalive_cb_t *icb_keepalive; 1777978SPeter.Dunlap@Sun.COM } idm_conn_ops_t; 1787978SPeter.Dunlap@Sun.COM 1797978SPeter.Dunlap@Sun.COM typedef struct { 1807978SPeter.Dunlap@Sun.COM int cr_domain; 1817978SPeter.Dunlap@Sun.COM int cr_type; 1827978SPeter.Dunlap@Sun.COM int cr_protocol; 1837978SPeter.Dunlap@Sun.COM boolean_t cr_bound; 1847978SPeter.Dunlap@Sun.COM idm_sockaddr_t cr_bound_addr; 1857978SPeter.Dunlap@Sun.COM idm_sockaddr_t cr_ini_dst_addr; 1867978SPeter.Dunlap@Sun.COM ldi_ident_t cr_li; 1877978SPeter.Dunlap@Sun.COM idm_conn_ops_t icr_conn_ops; 18810822SJack.Meng@Sun.COM boolean_t cr_boot_conn; 1897978SPeter.Dunlap@Sun.COM } idm_conn_req_t; 1907978SPeter.Dunlap@Sun.COM 1917978SPeter.Dunlap@Sun.COM typedef struct { 1927978SPeter.Dunlap@Sun.COM uint16_t sr_port; 1937978SPeter.Dunlap@Sun.COM ldi_ident_t sr_li; 1947978SPeter.Dunlap@Sun.COM idm_conn_ops_t sr_conn_ops; 1957978SPeter.Dunlap@Sun.COM } idm_svc_req_t; 1967978SPeter.Dunlap@Sun.COM 1977978SPeter.Dunlap@Sun.COM 1987978SPeter.Dunlap@Sun.COM /* This is not how other networking code handles this */ 1997978SPeter.Dunlap@Sun.COM typedef struct { 2007978SPeter.Dunlap@Sun.COM union { 2017978SPeter.Dunlap@Sun.COM struct in_addr in4; 2027978SPeter.Dunlap@Sun.COM struct in6_addr in6; 2037978SPeter.Dunlap@Sun.COM } i_addr; 2047978SPeter.Dunlap@Sun.COM /* i_insize determines which is valid in the union above */ 2057978SPeter.Dunlap@Sun.COM int i_insize; 2067978SPeter.Dunlap@Sun.COM } idm_ipaddr_t; 2077978SPeter.Dunlap@Sun.COM 2087978SPeter.Dunlap@Sun.COM typedef struct { 2097978SPeter.Dunlap@Sun.COM idm_ipaddr_t a_addr; 2107978SPeter.Dunlap@Sun.COM uint32_t a_port, 2117978SPeter.Dunlap@Sun.COM a_oid; 2127978SPeter.Dunlap@Sun.COM } idm_addr_t; 2137978SPeter.Dunlap@Sun.COM 2147978SPeter.Dunlap@Sun.COM typedef struct { 2157978SPeter.Dunlap@Sun.COM uint32_t al_vers, /* In */ 2167978SPeter.Dunlap@Sun.COM al_oid; /* In */ 2177978SPeter.Dunlap@Sun.COM uint32_t al_in_cnt; /* In */ 2187978SPeter.Dunlap@Sun.COM uint32_t al_out_cnt; /* Out */ 2197978SPeter.Dunlap@Sun.COM uint32_t al_tpgt; /* Out */ 2207978SPeter.Dunlap@Sun.COM idm_addr_t al_addrs[1]; /* Out */ 2217978SPeter.Dunlap@Sun.COM } idm_addr_list_t; 2227978SPeter.Dunlap@Sun.COM 2237978SPeter.Dunlap@Sun.COM /* 2247978SPeter.Dunlap@Sun.COM * State machine auditing 2257978SPeter.Dunlap@Sun.COM */ 2267978SPeter.Dunlap@Sun.COM 2277978SPeter.Dunlap@Sun.COM #define SM_AUDIT_BUF_MAX_REC 32 2287978SPeter.Dunlap@Sun.COM 2297978SPeter.Dunlap@Sun.COM typedef enum { 2307978SPeter.Dunlap@Sun.COM SAR_UNDEFINED = 0, 2317978SPeter.Dunlap@Sun.COM SAR_STATE_EVENT, 2327978SPeter.Dunlap@Sun.COM SAR_STATE_CHANGE 2337978SPeter.Dunlap@Sun.COM } sm_audit_record_type_t; 2347978SPeter.Dunlap@Sun.COM 2357978SPeter.Dunlap@Sun.COM typedef enum { 2367978SPeter.Dunlap@Sun.COM SAS_UNDEFINED = 0, 2377978SPeter.Dunlap@Sun.COM SAS_IDM_CONN, 2387978SPeter.Dunlap@Sun.COM SAS_IDM_TASK, 2397978SPeter.Dunlap@Sun.COM SAS_ISCSIT_TGT, 2407978SPeter.Dunlap@Sun.COM SAS_ISCSIT_SESS, 2419162SPeter.Dunlap@Sun.COM SAS_ISCSIT_LOGIN, 2429162SPeter.Dunlap@Sun.COM SAS_ISCSI_CMD, 2439162SPeter.Dunlap@Sun.COM SAS_ISCSI_SESS, 2449162SPeter.Dunlap@Sun.COM SAS_ISCSI_CONN, 2459162SPeter.Dunlap@Sun.COM SAS_ISCSI_LOGIN 2467978SPeter.Dunlap@Sun.COM } sm_audit_sm_type_t; 2477978SPeter.Dunlap@Sun.COM 2487978SPeter.Dunlap@Sun.COM typedef struct { 2497978SPeter.Dunlap@Sun.COM timespec_t sar_timestamp; 2507978SPeter.Dunlap@Sun.COM sm_audit_sm_type_t sar_sm_type; 2517978SPeter.Dunlap@Sun.COM sm_audit_record_type_t sar_type; 2527978SPeter.Dunlap@Sun.COM int sar_state; 2537978SPeter.Dunlap@Sun.COM int sar_new_state; /* Only for SAR_STATE_CHANGE */ 2547978SPeter.Dunlap@Sun.COM int sar_event; /* Only for SAR_STATE_EVENT */ 2557978SPeter.Dunlap@Sun.COM uintptr_t sar_event_info; /* Only for SAR_STATE_EVENT */ 2567978SPeter.Dunlap@Sun.COM } sm_audit_record_t; 2577978SPeter.Dunlap@Sun.COM 2587978SPeter.Dunlap@Sun.COM typedef struct { 2597978SPeter.Dunlap@Sun.COM int sab_index; 2607978SPeter.Dunlap@Sun.COM int sab_max_index; 2617978SPeter.Dunlap@Sun.COM sm_audit_record_t sab_records[SM_AUDIT_BUF_MAX_REC]; 2627978SPeter.Dunlap@Sun.COM } sm_audit_buf_t; 2637978SPeter.Dunlap@Sun.COM 2647978SPeter.Dunlap@Sun.COM extern boolean_t idm_sm_logging; 2657978SPeter.Dunlap@Sun.COM extern boolean_t idm_conn_logging; 2667978SPeter.Dunlap@Sun.COM extern boolean_t idm_svc_logging; 2677978SPeter.Dunlap@Sun.COM 2687978SPeter.Dunlap@Sun.COM #define IDM_SM_LOG if (idm_sm_logging) cmn_err 2697978SPeter.Dunlap@Sun.COM #define IDM_CONN_LOG if (idm_conn_logging) cmn_err 2707978SPeter.Dunlap@Sun.COM #define IDM_SVC_LOG if (idm_svc_logging) cmn_err 2717978SPeter.Dunlap@Sun.COM 2727978SPeter.Dunlap@Sun.COM void idm_sm_audit_init(sm_audit_buf_t *audit_buf); 2737978SPeter.Dunlap@Sun.COM 2747978SPeter.Dunlap@Sun.COM void idm_sm_audit_event(sm_audit_buf_t *audit_buf, 2757978SPeter.Dunlap@Sun.COM sm_audit_sm_type_t sm_type, 2767978SPeter.Dunlap@Sun.COM int state, int event, uintptr_t event_info); 2777978SPeter.Dunlap@Sun.COM 2787978SPeter.Dunlap@Sun.COM void idm_sm_audit_state_change(sm_audit_buf_t *audit_buf, 2797978SPeter.Dunlap@Sun.COM sm_audit_sm_type_t sm_type, int state, int new_state); 2807978SPeter.Dunlap@Sun.COM 2817978SPeter.Dunlap@Sun.COM 2827978SPeter.Dunlap@Sun.COM #include <sys/iscsi_protocol.h> 2837978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_conn_sm.h> 2847978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_transport.h> 2857978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_impl.h> 2867978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_text.h> 2877978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_so.h> 2887978SPeter.Dunlap@Sun.COM 2897978SPeter.Dunlap@Sun.COM /* 2907978SPeter.Dunlap@Sun.COM * iSCSI Initiator Services 2917978SPeter.Dunlap@Sun.COM */ 2927978SPeter.Dunlap@Sun.COM 2937978SPeter.Dunlap@Sun.COM idm_status_t 2947978SPeter.Dunlap@Sun.COM idm_ini_conn_create(idm_conn_req_t *cr, idm_conn_t **new_con); 2957978SPeter.Dunlap@Sun.COM 2967978SPeter.Dunlap@Sun.COM idm_status_t 2977978SPeter.Dunlap@Sun.COM idm_ini_conn_connect(idm_conn_t *ic); 2987978SPeter.Dunlap@Sun.COM 2997978SPeter.Dunlap@Sun.COM void 3007978SPeter.Dunlap@Sun.COM idm_ini_conn_disconnect(idm_conn_t *ic); 3017978SPeter.Dunlap@Sun.COM 3027978SPeter.Dunlap@Sun.COM void 3039162SPeter.Dunlap@Sun.COM idm_ini_conn_disconnect_sync(idm_conn_t *ic); 3049162SPeter.Dunlap@Sun.COM 3059162SPeter.Dunlap@Sun.COM void 3067978SPeter.Dunlap@Sun.COM idm_ini_conn_destroy(idm_conn_t *ic); 3077978SPeter.Dunlap@Sun.COM 3087978SPeter.Dunlap@Sun.COM /* 3097978SPeter.Dunlap@Sun.COM * iSCSI Target Services 3107978SPeter.Dunlap@Sun.COM */ 3117978SPeter.Dunlap@Sun.COM 3127978SPeter.Dunlap@Sun.COM idm_status_t 3137978SPeter.Dunlap@Sun.COM idm_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t **new_svc); 3147978SPeter.Dunlap@Sun.COM 3157978SPeter.Dunlap@Sun.COM idm_status_t 3167978SPeter.Dunlap@Sun.COM idm_tgt_svc_online(idm_svc_t *is); 3177978SPeter.Dunlap@Sun.COM 3187978SPeter.Dunlap@Sun.COM void 3197978SPeter.Dunlap@Sun.COM idm_tgt_svc_offline(idm_svc_t *is); 3207978SPeter.Dunlap@Sun.COM 3217978SPeter.Dunlap@Sun.COM void 3227978SPeter.Dunlap@Sun.COM idm_tgt_svc_destroy(idm_svc_t *is); 3237978SPeter.Dunlap@Sun.COM 3247978SPeter.Dunlap@Sun.COM void 3257978SPeter.Dunlap@Sun.COM idm_tgt_svc_destroy_if_unref(idm_svc_t *is); 3267978SPeter.Dunlap@Sun.COM 3277978SPeter.Dunlap@Sun.COM idm_svc_t * 3287978SPeter.Dunlap@Sun.COM idm_tgt_svc_lookup(uint16_t port); 3297978SPeter.Dunlap@Sun.COM 3307978SPeter.Dunlap@Sun.COM void 3317978SPeter.Dunlap@Sun.COM idm_tgt_svc_hold(idm_svc_t *is); 3327978SPeter.Dunlap@Sun.COM 3337978SPeter.Dunlap@Sun.COM void 3347978SPeter.Dunlap@Sun.COM idm_tgt_svc_rele_and_destroy(idm_svc_t *is); 3357978SPeter.Dunlap@Sun.COM 3367978SPeter.Dunlap@Sun.COM idm_status_t 3377978SPeter.Dunlap@Sun.COM idm_tgt_conn_accept(idm_conn_t *ic); 3387978SPeter.Dunlap@Sun.COM 3397978SPeter.Dunlap@Sun.COM void 3407978SPeter.Dunlap@Sun.COM idm_tgt_conn_reject(idm_conn_t *ic); 3417978SPeter.Dunlap@Sun.COM 3427978SPeter.Dunlap@Sun.COM void 3437978SPeter.Dunlap@Sun.COM idm_conn_hold(idm_conn_t *ic); 3447978SPeter.Dunlap@Sun.COM 3457978SPeter.Dunlap@Sun.COM void 3467978SPeter.Dunlap@Sun.COM idm_conn_rele(idm_conn_t *ic); 3477978SPeter.Dunlap@Sun.COM 3489721SPriya.Krishnan@Sun.COM void 3499721SPriya.Krishnan@Sun.COM idm_conn_set_target_name(idm_conn_t *ic, char *target_name); 3509721SPriya.Krishnan@Sun.COM 3519721SPriya.Krishnan@Sun.COM void 3529721SPriya.Krishnan@Sun.COM idm_conn_set_initiator_name(idm_conn_t *ic, char *initiator_name); 3539721SPriya.Krishnan@Sun.COM 3549721SPriya.Krishnan@Sun.COM void 3559721SPriya.Krishnan@Sun.COM idm_conn_set_isid(idm_conn_t *ic, uint8_t isid[ISCSI_ISID_LEN]); 3569721SPriya.Krishnan@Sun.COM 3577978SPeter.Dunlap@Sun.COM /* 3587978SPeter.Dunlap@Sun.COM * Target data transfer services 3597978SPeter.Dunlap@Sun.COM */ 3607978SPeter.Dunlap@Sun.COM idm_status_t 3617978SPeter.Dunlap@Sun.COM idm_buf_tx_to_ini(idm_task_t *idt, idm_buf_t *idb, 3627978SPeter.Dunlap@Sun.COM uint32_t offset, uint32_t xfer_length, 3637978SPeter.Dunlap@Sun.COM idm_buf_cb_t idb_buf_cb, void *cb_arg); 3647978SPeter.Dunlap@Sun.COM 3657978SPeter.Dunlap@Sun.COM idm_status_t 3667978SPeter.Dunlap@Sun.COM idm_buf_rx_from_ini(idm_task_t *idt, idm_buf_t *idb, 3677978SPeter.Dunlap@Sun.COM uint32_t offset, uint32_t xfer_length, 3687978SPeter.Dunlap@Sun.COM idm_buf_cb_t idb_buf_cb, void *cb_arg); 3697978SPeter.Dunlap@Sun.COM 3707978SPeter.Dunlap@Sun.COM void 3717978SPeter.Dunlap@Sun.COM idm_buf_tx_to_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status); 3727978SPeter.Dunlap@Sun.COM 3737978SPeter.Dunlap@Sun.COM void 3747978SPeter.Dunlap@Sun.COM idm_buf_rx_from_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status); 3757978SPeter.Dunlap@Sun.COM 3769721SPriya.Krishnan@Sun.COM #define XFER_BUF_TX_TO_INI 0 3779721SPriya.Krishnan@Sun.COM #define XFER_BUF_RX_FROM_INI 1 3787978SPeter.Dunlap@Sun.COM /* 3797978SPeter.Dunlap@Sun.COM * Shared Initiator/Target Services 3807978SPeter.Dunlap@Sun.COM */ 3817978SPeter.Dunlap@Sun.COM kv_status_t 3827978SPeter.Dunlap@Sun.COM idm_negotiate_key_values(idm_conn_t *ic, nvlist_t *request_nvl, 3837978SPeter.Dunlap@Sun.COM nvlist_t *response_nvl, nvlist_t *negotiated_nvl); 3847978SPeter.Dunlap@Sun.COM 3859162SPeter.Dunlap@Sun.COM void 3867978SPeter.Dunlap@Sun.COM idm_notice_key_values(idm_conn_t *ic, nvlist_t *negotiated_nvl); 3877978SPeter.Dunlap@Sun.COM 38810261SCharles.Ting@Sun.COM kv_status_t 38910261SCharles.Ting@Sun.COM idm_declare_key_values(idm_conn_t *ic, nvlist_t *config_nvl, 39010261SCharles.Ting@Sun.COM nvlist_t *outgoing_nvl); 39110261SCharles.Ting@Sun.COM 3927978SPeter.Dunlap@Sun.COM /* 3937978SPeter.Dunlap@Sun.COM * Buffer services 3947978SPeter.Dunlap@Sun.COM */ 3957978SPeter.Dunlap@Sun.COM 3967978SPeter.Dunlap@Sun.COM idm_buf_t * 3977978SPeter.Dunlap@Sun.COM idm_buf_alloc(idm_conn_t *ic, void *bufptr, uint64_t buflen); 3987978SPeter.Dunlap@Sun.COM 3997978SPeter.Dunlap@Sun.COM void 4007978SPeter.Dunlap@Sun.COM idm_buf_free(idm_buf_t *idb); 4017978SPeter.Dunlap@Sun.COM 4027978SPeter.Dunlap@Sun.COM void 4037978SPeter.Dunlap@Sun.COM idm_buf_bind_in(idm_task_t *idt, idm_buf_t *buf); 4047978SPeter.Dunlap@Sun.COM 4057978SPeter.Dunlap@Sun.COM void 4067978SPeter.Dunlap@Sun.COM idm_buf_bind_out(idm_task_t *idt, idm_buf_t *buf); 4077978SPeter.Dunlap@Sun.COM 4087978SPeter.Dunlap@Sun.COM void 4097978SPeter.Dunlap@Sun.COM idm_buf_unbind_in(idm_task_t *idt, idm_buf_t *buf); 4107978SPeter.Dunlap@Sun.COM 4117978SPeter.Dunlap@Sun.COM void 4127978SPeter.Dunlap@Sun.COM idm_buf_unbind_out(idm_task_t *idt, idm_buf_t *buf); 4137978SPeter.Dunlap@Sun.COM 4147978SPeter.Dunlap@Sun.COM idm_buf_t * 4157978SPeter.Dunlap@Sun.COM idm_buf_find(void *lbuf, size_t data_offset); 4167978SPeter.Dunlap@Sun.COM 4179162SPeter.Dunlap@Sun.COM void 4189162SPeter.Dunlap@Sun.COM idm_bufpat_set(idm_buf_t *idb); 4199162SPeter.Dunlap@Sun.COM 4209162SPeter.Dunlap@Sun.COM boolean_t 4219162SPeter.Dunlap@Sun.COM idm_bufpat_check(idm_buf_t *idb, int check_len, idm_bufpat_check_type_t type); 4229162SPeter.Dunlap@Sun.COM 4239162SPeter.Dunlap@Sun.COM extern boolean_t idm_pattern_checking; 4249162SPeter.Dunlap@Sun.COM 4259162SPeter.Dunlap@Sun.COM #define IDM_BUFPAT_SET(CHK_BUF) \ 4269162SPeter.Dunlap@Sun.COM if (idm_pattern_checking && (CHK_BUF)->idb_bufalloc) { \ 4279162SPeter.Dunlap@Sun.COM idm_bufpat_set(CHK_BUF); \ 4289162SPeter.Dunlap@Sun.COM } 4299162SPeter.Dunlap@Sun.COM 4309162SPeter.Dunlap@Sun.COM #define IDM_BUFPAT_CHECK(CHK_BUF, CHK_LEN, CHK_TYPE) \ 4319162SPeter.Dunlap@Sun.COM if (idm_pattern_checking) { \ 4329162SPeter.Dunlap@Sun.COM (void) idm_bufpat_check(CHK_BUF, CHK_LEN, CHK_TYPE); \ 4339162SPeter.Dunlap@Sun.COM } 4349162SPeter.Dunlap@Sun.COM 4357978SPeter.Dunlap@Sun.COM /* 4367978SPeter.Dunlap@Sun.COM * Task services 4377978SPeter.Dunlap@Sun.COM */ 4387978SPeter.Dunlap@Sun.COM idm_task_t * 4397978SPeter.Dunlap@Sun.COM idm_task_alloc(idm_conn_t *ic); 4407978SPeter.Dunlap@Sun.COM 4417978SPeter.Dunlap@Sun.COM void 4427978SPeter.Dunlap@Sun.COM idm_task_start(idm_task_t *idt, uintptr_t handle); 4437978SPeter.Dunlap@Sun.COM 4447978SPeter.Dunlap@Sun.COM void 4457978SPeter.Dunlap@Sun.COM idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type); 4467978SPeter.Dunlap@Sun.COM 4477978SPeter.Dunlap@Sun.COM void 4487978SPeter.Dunlap@Sun.COM idm_task_cleanup(idm_task_t *idt); 4497978SPeter.Dunlap@Sun.COM 4507978SPeter.Dunlap@Sun.COM void 4517978SPeter.Dunlap@Sun.COM idm_task_done(idm_task_t *idt); 4527978SPeter.Dunlap@Sun.COM 4537978SPeter.Dunlap@Sun.COM void 4547978SPeter.Dunlap@Sun.COM idm_task_free(idm_task_t *idt); 4557978SPeter.Dunlap@Sun.COM 4567978SPeter.Dunlap@Sun.COM idm_task_t * 4577978SPeter.Dunlap@Sun.COM idm_task_find(idm_conn_t *ic, uint32_t itt, uint32_t ttt); 4587978SPeter.Dunlap@Sun.COM 4599162SPeter.Dunlap@Sun.COM idm_task_t * 4609162SPeter.Dunlap@Sun.COM idm_task_find_and_complete(idm_conn_t *ic, uint32_t itt, uint32_t ttt); 4619162SPeter.Dunlap@Sun.COM 4627978SPeter.Dunlap@Sun.COM void * 4637978SPeter.Dunlap@Sun.COM idm_task_find_by_handle(idm_conn_t *ic, uintptr_t handle); 4647978SPeter.Dunlap@Sun.COM 4657978SPeter.Dunlap@Sun.COM void 4667978SPeter.Dunlap@Sun.COM idm_task_hold(idm_task_t *idt); 4677978SPeter.Dunlap@Sun.COM 4687978SPeter.Dunlap@Sun.COM void 4697978SPeter.Dunlap@Sun.COM idm_task_rele(idm_task_t *idt); 4707978SPeter.Dunlap@Sun.COM 4717978SPeter.Dunlap@Sun.COM /* 4727978SPeter.Dunlap@Sun.COM * PDU Services 4737978SPeter.Dunlap@Sun.COM */ 4747978SPeter.Dunlap@Sun.COM 4757978SPeter.Dunlap@Sun.COM idm_pdu_t * 4767978SPeter.Dunlap@Sun.COM idm_pdu_alloc(uint_t hdrlen, uint_t datalen); 4777978SPeter.Dunlap@Sun.COM 4789162SPeter.Dunlap@Sun.COM idm_pdu_t * 4799162SPeter.Dunlap@Sun.COM idm_pdu_alloc_nosleep(uint_t hdrlen, uint_t datalen); 4809162SPeter.Dunlap@Sun.COM 4817978SPeter.Dunlap@Sun.COM void 4827978SPeter.Dunlap@Sun.COM idm_pdu_free(idm_pdu_t *pdu); 4837978SPeter.Dunlap@Sun.COM 4847978SPeter.Dunlap@Sun.COM void 4857978SPeter.Dunlap@Sun.COM idm_pdu_init(idm_pdu_t *pdu, idm_conn_t *ic, void *private, idm_pdu_cb_t *cb); 4867978SPeter.Dunlap@Sun.COM 4877978SPeter.Dunlap@Sun.COM void 4887978SPeter.Dunlap@Sun.COM idm_pdu_init_hdr(idm_pdu_t *pdu, uint8_t *hdr, uint_t hdrlen); 4897978SPeter.Dunlap@Sun.COM 4907978SPeter.Dunlap@Sun.COM void 4917978SPeter.Dunlap@Sun.COM idm_pdu_init_data(idm_pdu_t *pdu, uint8_t *data, uint_t datalen); 4927978SPeter.Dunlap@Sun.COM 4937978SPeter.Dunlap@Sun.COM void 4947978SPeter.Dunlap@Sun.COM idm_pdu_complete(idm_pdu_t *pdu, idm_status_t status); 4957978SPeter.Dunlap@Sun.COM 4967978SPeter.Dunlap@Sun.COM void 4977978SPeter.Dunlap@Sun.COM idm_pdu_tx(idm_pdu_t *pdu); 4987978SPeter.Dunlap@Sun.COM 4997978SPeter.Dunlap@Sun.COM /* 5007978SPeter.Dunlap@Sun.COM * Object reference tracking 5017978SPeter.Dunlap@Sun.COM */ 5027978SPeter.Dunlap@Sun.COM 5037978SPeter.Dunlap@Sun.COM void 5047978SPeter.Dunlap@Sun.COM idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj); 5057978SPeter.Dunlap@Sun.COM 5067978SPeter.Dunlap@Sun.COM void 5077978SPeter.Dunlap@Sun.COM idm_refcnt_destroy(idm_refcnt_t *refcnt); 5087978SPeter.Dunlap@Sun.COM 5097978SPeter.Dunlap@Sun.COM void 5107978SPeter.Dunlap@Sun.COM idm_refcnt_reset(idm_refcnt_t *refcnt); 5117978SPeter.Dunlap@Sun.COM 5127978SPeter.Dunlap@Sun.COM void 5137978SPeter.Dunlap@Sun.COM idm_refcnt_hold(idm_refcnt_t *refcnt); 5147978SPeter.Dunlap@Sun.COM 5157978SPeter.Dunlap@Sun.COM void 5167978SPeter.Dunlap@Sun.COM idm_refcnt_rele(idm_refcnt_t *refcnt); 5177978SPeter.Dunlap@Sun.COM 5187978SPeter.Dunlap@Sun.COM void 5197978SPeter.Dunlap@Sun.COM idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func); 5207978SPeter.Dunlap@Sun.COM 5217978SPeter.Dunlap@Sun.COM void 5227978SPeter.Dunlap@Sun.COM idm_refcnt_wait_ref(idm_refcnt_t *refcnt); 5237978SPeter.Dunlap@Sun.COM 5247978SPeter.Dunlap@Sun.COM void 5257978SPeter.Dunlap@Sun.COM idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func); 5267978SPeter.Dunlap@Sun.COM 5277978SPeter.Dunlap@Sun.COM 5287978SPeter.Dunlap@Sun.COM #ifdef __cplusplus 5297978SPeter.Dunlap@Sun.COM } 5307978SPeter.Dunlap@Sun.COM #endif 5317978SPeter.Dunlap@Sun.COM 5327978SPeter.Dunlap@Sun.COM #endif /* _IDM_H */ 533