xref: /onnv-gate/usr/src/uts/common/sys/idm/idm.h (revision 10261:f3fec2334981)
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 
1529586SPeter.Dunlap@Sun.COM typedef void (idm_keepalive_cb_t)(struct idm_conn_s *ic);
1539586SPeter.Dunlap@Sun.COM 
1547978SPeter.Dunlap@Sun.COM typedef union idm_sockaddr {
1557978SPeter.Dunlap@Sun.COM 	struct sockaddr		sin;
1567978SPeter.Dunlap@Sun.COM 	struct sockaddr_in	sin4;
1577978SPeter.Dunlap@Sun.COM 	struct sockaddr_in6	sin6;
1587978SPeter.Dunlap@Sun.COM } idm_sockaddr_t;
1597978SPeter.Dunlap@Sun.COM 
1607978SPeter.Dunlap@Sun.COM #define	SIZEOF_SOCKADDR(so)		\
1617978SPeter.Dunlap@Sun.COM 	((so)->sa_family == AF_INET ?	\
1627978SPeter.Dunlap@Sun.COM 	sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6))
1637978SPeter.Dunlap@Sun.COM 
1647978SPeter.Dunlap@Sun.COM typedef struct {
1657978SPeter.Dunlap@Sun.COM 	idm_rx_pdu_cb_t		*icb_rx_scsi_cmd;
1667978SPeter.Dunlap@Sun.COM 	idm_rx_pdu_cb_t		*icb_rx_scsi_rsp;
1677978SPeter.Dunlap@Sun.COM 	idm_rx_pdu_cb_t		*icb_rx_misc;
1687978SPeter.Dunlap@Sun.COM 	idm_rx_pdu_error_cb_t	*icb_rx_error;
1697978SPeter.Dunlap@Sun.COM 	idm_task_cb_t		*icb_task_aborted;
1707978SPeter.Dunlap@Sun.COM 	idm_client_notify_cb_t	*icb_client_notify;
1717978SPeter.Dunlap@Sun.COM 	idm_build_hdr_cb_t	*icb_build_hdr;
1729586SPeter.Dunlap@Sun.COM 	idm_keepalive_cb_t	*icb_keepalive;
1737978SPeter.Dunlap@Sun.COM } idm_conn_ops_t;
1747978SPeter.Dunlap@Sun.COM 
1757978SPeter.Dunlap@Sun.COM typedef struct {
1767978SPeter.Dunlap@Sun.COM 	int			cr_domain;
1777978SPeter.Dunlap@Sun.COM 	int			cr_type;
1787978SPeter.Dunlap@Sun.COM 	int			cr_protocol;
1797978SPeter.Dunlap@Sun.COM 	boolean_t		cr_bound;
1807978SPeter.Dunlap@Sun.COM 	idm_sockaddr_t		cr_bound_addr;
1817978SPeter.Dunlap@Sun.COM 	idm_sockaddr_t		cr_ini_dst_addr;
1827978SPeter.Dunlap@Sun.COM 	ldi_ident_t		cr_li;
1837978SPeter.Dunlap@Sun.COM 	idm_conn_ops_t		icr_conn_ops;
1847978SPeter.Dunlap@Sun.COM } idm_conn_req_t;
1857978SPeter.Dunlap@Sun.COM 
1867978SPeter.Dunlap@Sun.COM typedef struct {
1877978SPeter.Dunlap@Sun.COM 	uint16_t		sr_port;
1887978SPeter.Dunlap@Sun.COM 	ldi_ident_t		sr_li;
1897978SPeter.Dunlap@Sun.COM 	idm_conn_ops_t		sr_conn_ops;
1907978SPeter.Dunlap@Sun.COM } idm_svc_req_t;
1917978SPeter.Dunlap@Sun.COM 
1927978SPeter.Dunlap@Sun.COM 
1937978SPeter.Dunlap@Sun.COM /* This is not how other networking code handles this */
1947978SPeter.Dunlap@Sun.COM typedef struct {
1957978SPeter.Dunlap@Sun.COM 	union {
1967978SPeter.Dunlap@Sun.COM 		struct in_addr	in4;
1977978SPeter.Dunlap@Sun.COM 		struct in6_addr	in6;
1987978SPeter.Dunlap@Sun.COM 	} i_addr;
1997978SPeter.Dunlap@Sun.COM 	/* i_insize determines which is valid in the union above */
2007978SPeter.Dunlap@Sun.COM 	int			i_insize;
2017978SPeter.Dunlap@Sun.COM } idm_ipaddr_t;
2027978SPeter.Dunlap@Sun.COM 
2037978SPeter.Dunlap@Sun.COM typedef struct {
2047978SPeter.Dunlap@Sun.COM 	idm_ipaddr_t		a_addr;
2057978SPeter.Dunlap@Sun.COM 	uint32_t		a_port,
2067978SPeter.Dunlap@Sun.COM 				a_oid;
2077978SPeter.Dunlap@Sun.COM } idm_addr_t;
2087978SPeter.Dunlap@Sun.COM 
2097978SPeter.Dunlap@Sun.COM typedef struct {
2107978SPeter.Dunlap@Sun.COM 	uint32_t		al_vers,			/* In */
2117978SPeter.Dunlap@Sun.COM 				al_oid;				/* In */
2127978SPeter.Dunlap@Sun.COM 	uint32_t		al_in_cnt;			/* In */
2137978SPeter.Dunlap@Sun.COM 	uint32_t		al_out_cnt;			/* Out */
2147978SPeter.Dunlap@Sun.COM 	uint32_t		al_tpgt;			/* Out */
2157978SPeter.Dunlap@Sun.COM 	idm_addr_t		al_addrs[1];			/* Out */
2167978SPeter.Dunlap@Sun.COM } idm_addr_list_t;
2177978SPeter.Dunlap@Sun.COM 
2187978SPeter.Dunlap@Sun.COM /*
2197978SPeter.Dunlap@Sun.COM  * State machine auditing
2207978SPeter.Dunlap@Sun.COM  */
2217978SPeter.Dunlap@Sun.COM 
2227978SPeter.Dunlap@Sun.COM #define	SM_AUDIT_BUF_MAX_REC	32
2237978SPeter.Dunlap@Sun.COM 
2247978SPeter.Dunlap@Sun.COM typedef enum {
2257978SPeter.Dunlap@Sun.COM 	SAR_UNDEFINED = 0,
2267978SPeter.Dunlap@Sun.COM 	SAR_STATE_EVENT,
2277978SPeter.Dunlap@Sun.COM 	SAR_STATE_CHANGE
2287978SPeter.Dunlap@Sun.COM } sm_audit_record_type_t;
2297978SPeter.Dunlap@Sun.COM 
2307978SPeter.Dunlap@Sun.COM typedef enum {
2317978SPeter.Dunlap@Sun.COM 	SAS_UNDEFINED = 0,
2327978SPeter.Dunlap@Sun.COM 	SAS_IDM_CONN,
2337978SPeter.Dunlap@Sun.COM 	SAS_IDM_TASK,
2347978SPeter.Dunlap@Sun.COM 	SAS_ISCSIT_TGT,
2357978SPeter.Dunlap@Sun.COM 	SAS_ISCSIT_SESS,
2369162SPeter.Dunlap@Sun.COM 	SAS_ISCSIT_LOGIN,
2379162SPeter.Dunlap@Sun.COM 	SAS_ISCSI_CMD,
2389162SPeter.Dunlap@Sun.COM 	SAS_ISCSI_SESS,
2399162SPeter.Dunlap@Sun.COM 	SAS_ISCSI_CONN,
2409162SPeter.Dunlap@Sun.COM 	SAS_ISCSI_LOGIN
2417978SPeter.Dunlap@Sun.COM } sm_audit_sm_type_t;
2427978SPeter.Dunlap@Sun.COM 
2437978SPeter.Dunlap@Sun.COM typedef struct {
2447978SPeter.Dunlap@Sun.COM 	timespec_t		sar_timestamp;
2457978SPeter.Dunlap@Sun.COM 	sm_audit_sm_type_t	sar_sm_type;
2467978SPeter.Dunlap@Sun.COM 	sm_audit_record_type_t	sar_type;
2477978SPeter.Dunlap@Sun.COM 	int			sar_state;
2487978SPeter.Dunlap@Sun.COM 	int			sar_new_state;	/* Only for SAR_STATE_CHANGE */
2497978SPeter.Dunlap@Sun.COM 	int			sar_event;	/* Only for SAR_STATE_EVENT */
2507978SPeter.Dunlap@Sun.COM 	uintptr_t		sar_event_info;	/* Only for SAR_STATE_EVENT */
2517978SPeter.Dunlap@Sun.COM } sm_audit_record_t;
2527978SPeter.Dunlap@Sun.COM 
2537978SPeter.Dunlap@Sun.COM typedef struct {
2547978SPeter.Dunlap@Sun.COM 	int			sab_index;
2557978SPeter.Dunlap@Sun.COM 	int			sab_max_index;
2567978SPeter.Dunlap@Sun.COM 	sm_audit_record_t	sab_records[SM_AUDIT_BUF_MAX_REC];
2577978SPeter.Dunlap@Sun.COM } sm_audit_buf_t;
2587978SPeter.Dunlap@Sun.COM 
2597978SPeter.Dunlap@Sun.COM extern boolean_t idm_sm_logging;
2607978SPeter.Dunlap@Sun.COM extern boolean_t idm_conn_logging;
2617978SPeter.Dunlap@Sun.COM extern boolean_t idm_svc_logging;
2627978SPeter.Dunlap@Sun.COM 
2637978SPeter.Dunlap@Sun.COM #define	IDM_SM_LOG if (idm_sm_logging) cmn_err
2647978SPeter.Dunlap@Sun.COM #define	IDM_CONN_LOG if (idm_conn_logging) cmn_err
2657978SPeter.Dunlap@Sun.COM #define	IDM_SVC_LOG if (idm_svc_logging) cmn_err
2667978SPeter.Dunlap@Sun.COM 
2677978SPeter.Dunlap@Sun.COM void idm_sm_audit_init(sm_audit_buf_t *audit_buf);
2687978SPeter.Dunlap@Sun.COM 
2697978SPeter.Dunlap@Sun.COM void idm_sm_audit_event(sm_audit_buf_t *audit_buf,
2707978SPeter.Dunlap@Sun.COM     sm_audit_sm_type_t sm_type,
2717978SPeter.Dunlap@Sun.COM     int state, int event, uintptr_t event_info);
2727978SPeter.Dunlap@Sun.COM 
2737978SPeter.Dunlap@Sun.COM void idm_sm_audit_state_change(sm_audit_buf_t *audit_buf,
2747978SPeter.Dunlap@Sun.COM     sm_audit_sm_type_t sm_type, int state, int new_state);
2757978SPeter.Dunlap@Sun.COM 
2767978SPeter.Dunlap@Sun.COM 
2777978SPeter.Dunlap@Sun.COM #include <sys/iscsi_protocol.h>
2787978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_conn_sm.h>
2797978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_transport.h>
2807978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_impl.h>
2817978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_text.h>
2827978SPeter.Dunlap@Sun.COM #include <sys/idm/idm_so.h>
2837978SPeter.Dunlap@Sun.COM 
2847978SPeter.Dunlap@Sun.COM /*
2857978SPeter.Dunlap@Sun.COM  * iSCSI Initiator Services
2867978SPeter.Dunlap@Sun.COM  */
2877978SPeter.Dunlap@Sun.COM 
2887978SPeter.Dunlap@Sun.COM idm_status_t
2897978SPeter.Dunlap@Sun.COM idm_ini_conn_create(idm_conn_req_t *cr, idm_conn_t **new_con);
2907978SPeter.Dunlap@Sun.COM 
2917978SPeter.Dunlap@Sun.COM idm_status_t
2927978SPeter.Dunlap@Sun.COM idm_ini_conn_connect(idm_conn_t *ic);
2937978SPeter.Dunlap@Sun.COM 
2947978SPeter.Dunlap@Sun.COM void
2957978SPeter.Dunlap@Sun.COM idm_ini_conn_disconnect(idm_conn_t *ic);
2967978SPeter.Dunlap@Sun.COM 
2977978SPeter.Dunlap@Sun.COM void
2989162SPeter.Dunlap@Sun.COM idm_ini_conn_disconnect_sync(idm_conn_t *ic);
2999162SPeter.Dunlap@Sun.COM 
3009162SPeter.Dunlap@Sun.COM void
3017978SPeter.Dunlap@Sun.COM idm_ini_conn_destroy(idm_conn_t *ic);
3027978SPeter.Dunlap@Sun.COM 
3037978SPeter.Dunlap@Sun.COM /*
3047978SPeter.Dunlap@Sun.COM  * iSCSI Target Services
3057978SPeter.Dunlap@Sun.COM  */
3067978SPeter.Dunlap@Sun.COM 
3077978SPeter.Dunlap@Sun.COM idm_status_t
3087978SPeter.Dunlap@Sun.COM idm_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t **new_svc);
3097978SPeter.Dunlap@Sun.COM 
3107978SPeter.Dunlap@Sun.COM idm_status_t
3117978SPeter.Dunlap@Sun.COM idm_tgt_svc_online(idm_svc_t *is);
3127978SPeter.Dunlap@Sun.COM 
3137978SPeter.Dunlap@Sun.COM void
3147978SPeter.Dunlap@Sun.COM idm_tgt_svc_offline(idm_svc_t *is);
3157978SPeter.Dunlap@Sun.COM 
3167978SPeter.Dunlap@Sun.COM void
3177978SPeter.Dunlap@Sun.COM idm_tgt_svc_destroy(idm_svc_t *is);
3187978SPeter.Dunlap@Sun.COM 
3197978SPeter.Dunlap@Sun.COM void
3207978SPeter.Dunlap@Sun.COM idm_tgt_svc_destroy_if_unref(idm_svc_t *is);
3217978SPeter.Dunlap@Sun.COM 
3227978SPeter.Dunlap@Sun.COM idm_svc_t *
3237978SPeter.Dunlap@Sun.COM idm_tgt_svc_lookup(uint16_t port);
3247978SPeter.Dunlap@Sun.COM 
3257978SPeter.Dunlap@Sun.COM void
3267978SPeter.Dunlap@Sun.COM idm_tgt_svc_hold(idm_svc_t *is);
3277978SPeter.Dunlap@Sun.COM 
3287978SPeter.Dunlap@Sun.COM void
3297978SPeter.Dunlap@Sun.COM idm_tgt_svc_rele_and_destroy(idm_svc_t *is);
3307978SPeter.Dunlap@Sun.COM 
3317978SPeter.Dunlap@Sun.COM idm_status_t
3327978SPeter.Dunlap@Sun.COM idm_tgt_conn_accept(idm_conn_t *ic);
3337978SPeter.Dunlap@Sun.COM 
3347978SPeter.Dunlap@Sun.COM void
3357978SPeter.Dunlap@Sun.COM idm_tgt_conn_reject(idm_conn_t *ic);
3367978SPeter.Dunlap@Sun.COM 
3377978SPeter.Dunlap@Sun.COM void
3387978SPeter.Dunlap@Sun.COM idm_conn_hold(idm_conn_t *ic);
3397978SPeter.Dunlap@Sun.COM 
3407978SPeter.Dunlap@Sun.COM void
3417978SPeter.Dunlap@Sun.COM idm_conn_rele(idm_conn_t *ic);
3427978SPeter.Dunlap@Sun.COM 
3439721SPriya.Krishnan@Sun.COM void
3449721SPriya.Krishnan@Sun.COM idm_conn_set_target_name(idm_conn_t *ic, char *target_name);
3459721SPriya.Krishnan@Sun.COM 
3469721SPriya.Krishnan@Sun.COM void
3479721SPriya.Krishnan@Sun.COM idm_conn_set_initiator_name(idm_conn_t *ic, char *initiator_name);
3489721SPriya.Krishnan@Sun.COM 
3499721SPriya.Krishnan@Sun.COM void
3509721SPriya.Krishnan@Sun.COM idm_conn_set_isid(idm_conn_t *ic, uint8_t isid[ISCSI_ISID_LEN]);
3519721SPriya.Krishnan@Sun.COM 
3527978SPeter.Dunlap@Sun.COM /*
3537978SPeter.Dunlap@Sun.COM  * Target data transfer services
3547978SPeter.Dunlap@Sun.COM  */
3557978SPeter.Dunlap@Sun.COM idm_status_t
3567978SPeter.Dunlap@Sun.COM idm_buf_tx_to_ini(idm_task_t *idt, idm_buf_t *idb,
3577978SPeter.Dunlap@Sun.COM     uint32_t offset, uint32_t xfer_length,
3587978SPeter.Dunlap@Sun.COM     idm_buf_cb_t idb_buf_cb, void *cb_arg);
3597978SPeter.Dunlap@Sun.COM 
3607978SPeter.Dunlap@Sun.COM idm_status_t
3617978SPeter.Dunlap@Sun.COM idm_buf_rx_from_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 void
3667978SPeter.Dunlap@Sun.COM idm_buf_tx_to_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status);
3677978SPeter.Dunlap@Sun.COM 
3687978SPeter.Dunlap@Sun.COM void
3697978SPeter.Dunlap@Sun.COM idm_buf_rx_from_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status);
3707978SPeter.Dunlap@Sun.COM 
3719721SPriya.Krishnan@Sun.COM #define	XFER_BUF_TX_TO_INI	0
3729721SPriya.Krishnan@Sun.COM #define	XFER_BUF_RX_FROM_INI	1
3737978SPeter.Dunlap@Sun.COM /*
3747978SPeter.Dunlap@Sun.COM  * Shared Initiator/Target Services
3757978SPeter.Dunlap@Sun.COM  */
3767978SPeter.Dunlap@Sun.COM kv_status_t
3777978SPeter.Dunlap@Sun.COM idm_negotiate_key_values(idm_conn_t *ic, nvlist_t *request_nvl,
3787978SPeter.Dunlap@Sun.COM     nvlist_t *response_nvl, nvlist_t *negotiated_nvl);
3797978SPeter.Dunlap@Sun.COM 
3809162SPeter.Dunlap@Sun.COM void
3817978SPeter.Dunlap@Sun.COM idm_notice_key_values(idm_conn_t *ic, nvlist_t *negotiated_nvl);
3827978SPeter.Dunlap@Sun.COM 
383*10261SCharles.Ting@Sun.COM kv_status_t
384*10261SCharles.Ting@Sun.COM idm_declare_key_values(idm_conn_t *ic, nvlist_t *config_nvl,
385*10261SCharles.Ting@Sun.COM     nvlist_t *outgoing_nvl);
386*10261SCharles.Ting@Sun.COM 
3877978SPeter.Dunlap@Sun.COM /*
3887978SPeter.Dunlap@Sun.COM  * Buffer services
3897978SPeter.Dunlap@Sun.COM  */
3907978SPeter.Dunlap@Sun.COM 
3917978SPeter.Dunlap@Sun.COM idm_buf_t *
3927978SPeter.Dunlap@Sun.COM idm_buf_alloc(idm_conn_t *ic, void *bufptr, uint64_t buflen);
3937978SPeter.Dunlap@Sun.COM 
3947978SPeter.Dunlap@Sun.COM void
3957978SPeter.Dunlap@Sun.COM idm_buf_free(idm_buf_t *idb);
3967978SPeter.Dunlap@Sun.COM 
3977978SPeter.Dunlap@Sun.COM void
3987978SPeter.Dunlap@Sun.COM idm_buf_bind_in(idm_task_t *idt, idm_buf_t *buf);
3997978SPeter.Dunlap@Sun.COM 
4007978SPeter.Dunlap@Sun.COM void
4017978SPeter.Dunlap@Sun.COM idm_buf_bind_out(idm_task_t *idt, idm_buf_t *buf);
4027978SPeter.Dunlap@Sun.COM 
4037978SPeter.Dunlap@Sun.COM void
4047978SPeter.Dunlap@Sun.COM idm_buf_unbind_in(idm_task_t *idt, idm_buf_t *buf);
4057978SPeter.Dunlap@Sun.COM 
4067978SPeter.Dunlap@Sun.COM void
4077978SPeter.Dunlap@Sun.COM idm_buf_unbind_out(idm_task_t *idt, idm_buf_t *buf);
4087978SPeter.Dunlap@Sun.COM 
4097978SPeter.Dunlap@Sun.COM idm_buf_t *
4107978SPeter.Dunlap@Sun.COM idm_buf_find(void *lbuf, size_t data_offset);
4117978SPeter.Dunlap@Sun.COM 
4129162SPeter.Dunlap@Sun.COM void
4139162SPeter.Dunlap@Sun.COM idm_bufpat_set(idm_buf_t *idb);
4149162SPeter.Dunlap@Sun.COM 
4159162SPeter.Dunlap@Sun.COM boolean_t
4169162SPeter.Dunlap@Sun.COM idm_bufpat_check(idm_buf_t *idb, int check_len, idm_bufpat_check_type_t type);
4179162SPeter.Dunlap@Sun.COM 
4189162SPeter.Dunlap@Sun.COM extern boolean_t idm_pattern_checking;
4199162SPeter.Dunlap@Sun.COM 
4209162SPeter.Dunlap@Sun.COM #define	IDM_BUFPAT_SET(CHK_BUF) 				\
4219162SPeter.Dunlap@Sun.COM 	if (idm_pattern_checking && (CHK_BUF)->idb_bufalloc) {	\
4229162SPeter.Dunlap@Sun.COM 		idm_bufpat_set(CHK_BUF);			\
4239162SPeter.Dunlap@Sun.COM 	}
4249162SPeter.Dunlap@Sun.COM 
4259162SPeter.Dunlap@Sun.COM #define	IDM_BUFPAT_CHECK(CHK_BUF, CHK_LEN, CHK_TYPE) 		\
4269162SPeter.Dunlap@Sun.COM 	if (idm_pattern_checking) {				\
4279162SPeter.Dunlap@Sun.COM 		(void) idm_bufpat_check(CHK_BUF, CHK_LEN, CHK_TYPE);	\
4289162SPeter.Dunlap@Sun.COM 	}
4299162SPeter.Dunlap@Sun.COM 
4307978SPeter.Dunlap@Sun.COM /*
4317978SPeter.Dunlap@Sun.COM  * Task services
4327978SPeter.Dunlap@Sun.COM  */
4337978SPeter.Dunlap@Sun.COM idm_task_t *
4347978SPeter.Dunlap@Sun.COM idm_task_alloc(idm_conn_t *ic);
4357978SPeter.Dunlap@Sun.COM 
4367978SPeter.Dunlap@Sun.COM void
4377978SPeter.Dunlap@Sun.COM idm_task_start(idm_task_t *idt, uintptr_t handle);
4387978SPeter.Dunlap@Sun.COM 
4397978SPeter.Dunlap@Sun.COM void
4407978SPeter.Dunlap@Sun.COM idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type);
4417978SPeter.Dunlap@Sun.COM 
4427978SPeter.Dunlap@Sun.COM void
4437978SPeter.Dunlap@Sun.COM idm_task_cleanup(idm_task_t *idt);
4447978SPeter.Dunlap@Sun.COM 
4457978SPeter.Dunlap@Sun.COM void
4467978SPeter.Dunlap@Sun.COM idm_task_done(idm_task_t *idt);
4477978SPeter.Dunlap@Sun.COM 
4487978SPeter.Dunlap@Sun.COM void
4497978SPeter.Dunlap@Sun.COM idm_task_free(idm_task_t *idt);
4507978SPeter.Dunlap@Sun.COM 
4517978SPeter.Dunlap@Sun.COM idm_task_t *
4527978SPeter.Dunlap@Sun.COM idm_task_find(idm_conn_t *ic, uint32_t itt, uint32_t ttt);
4537978SPeter.Dunlap@Sun.COM 
4549162SPeter.Dunlap@Sun.COM idm_task_t *
4559162SPeter.Dunlap@Sun.COM idm_task_find_and_complete(idm_conn_t *ic, uint32_t itt, uint32_t ttt);
4569162SPeter.Dunlap@Sun.COM 
4577978SPeter.Dunlap@Sun.COM void *
4587978SPeter.Dunlap@Sun.COM idm_task_find_by_handle(idm_conn_t *ic, uintptr_t handle);
4597978SPeter.Dunlap@Sun.COM 
4607978SPeter.Dunlap@Sun.COM void
4617978SPeter.Dunlap@Sun.COM idm_task_hold(idm_task_t *idt);
4627978SPeter.Dunlap@Sun.COM 
4637978SPeter.Dunlap@Sun.COM void
4647978SPeter.Dunlap@Sun.COM idm_task_rele(idm_task_t *idt);
4657978SPeter.Dunlap@Sun.COM 
4667978SPeter.Dunlap@Sun.COM /*
4677978SPeter.Dunlap@Sun.COM  * PDU Services
4687978SPeter.Dunlap@Sun.COM  */
4697978SPeter.Dunlap@Sun.COM 
4707978SPeter.Dunlap@Sun.COM idm_pdu_t *
4717978SPeter.Dunlap@Sun.COM idm_pdu_alloc(uint_t hdrlen, uint_t datalen);
4727978SPeter.Dunlap@Sun.COM 
4739162SPeter.Dunlap@Sun.COM idm_pdu_t *
4749162SPeter.Dunlap@Sun.COM idm_pdu_alloc_nosleep(uint_t hdrlen, uint_t datalen);
4759162SPeter.Dunlap@Sun.COM 
4767978SPeter.Dunlap@Sun.COM void
4777978SPeter.Dunlap@Sun.COM idm_pdu_free(idm_pdu_t *pdu);
4787978SPeter.Dunlap@Sun.COM 
4797978SPeter.Dunlap@Sun.COM void
4807978SPeter.Dunlap@Sun.COM idm_pdu_init(idm_pdu_t *pdu, idm_conn_t *ic, void *private, idm_pdu_cb_t *cb);
4817978SPeter.Dunlap@Sun.COM 
4827978SPeter.Dunlap@Sun.COM void
4837978SPeter.Dunlap@Sun.COM idm_pdu_init_hdr(idm_pdu_t *pdu, uint8_t *hdr, uint_t hdrlen);
4847978SPeter.Dunlap@Sun.COM 
4857978SPeter.Dunlap@Sun.COM void
4867978SPeter.Dunlap@Sun.COM idm_pdu_init_data(idm_pdu_t *pdu, uint8_t *data, uint_t datalen);
4877978SPeter.Dunlap@Sun.COM 
4887978SPeter.Dunlap@Sun.COM void
4897978SPeter.Dunlap@Sun.COM idm_pdu_complete(idm_pdu_t *pdu, idm_status_t status);
4907978SPeter.Dunlap@Sun.COM 
4917978SPeter.Dunlap@Sun.COM void
4927978SPeter.Dunlap@Sun.COM idm_pdu_tx(idm_pdu_t *pdu);
4937978SPeter.Dunlap@Sun.COM 
4947978SPeter.Dunlap@Sun.COM /*
4957978SPeter.Dunlap@Sun.COM  * Object reference tracking
4967978SPeter.Dunlap@Sun.COM  */
4977978SPeter.Dunlap@Sun.COM 
4987978SPeter.Dunlap@Sun.COM void
4997978SPeter.Dunlap@Sun.COM idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj);
5007978SPeter.Dunlap@Sun.COM 
5017978SPeter.Dunlap@Sun.COM void
5027978SPeter.Dunlap@Sun.COM idm_refcnt_destroy(idm_refcnt_t *refcnt);
5037978SPeter.Dunlap@Sun.COM 
5047978SPeter.Dunlap@Sun.COM void
5057978SPeter.Dunlap@Sun.COM idm_refcnt_reset(idm_refcnt_t *refcnt);
5067978SPeter.Dunlap@Sun.COM 
5077978SPeter.Dunlap@Sun.COM void
5087978SPeter.Dunlap@Sun.COM idm_refcnt_hold(idm_refcnt_t *refcnt);
5097978SPeter.Dunlap@Sun.COM 
5107978SPeter.Dunlap@Sun.COM void
5117978SPeter.Dunlap@Sun.COM idm_refcnt_rele(idm_refcnt_t *refcnt);
5127978SPeter.Dunlap@Sun.COM 
5137978SPeter.Dunlap@Sun.COM void
5147978SPeter.Dunlap@Sun.COM idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
5157978SPeter.Dunlap@Sun.COM 
5167978SPeter.Dunlap@Sun.COM void
5177978SPeter.Dunlap@Sun.COM idm_refcnt_wait_ref(idm_refcnt_t *refcnt);
5187978SPeter.Dunlap@Sun.COM 
5197978SPeter.Dunlap@Sun.COM void
5207978SPeter.Dunlap@Sun.COM idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
5217978SPeter.Dunlap@Sun.COM 
5227978SPeter.Dunlap@Sun.COM 
5237978SPeter.Dunlap@Sun.COM #ifdef	__cplusplus
5247978SPeter.Dunlap@Sun.COM }
5257978SPeter.Dunlap@Sun.COM #endif
5267978SPeter.Dunlap@Sun.COM 
5277978SPeter.Dunlap@Sun.COM #endif /* _IDM_H */
528