xref: /illumos-gate/usr/src/uts/common/sys/idm/idm.h (revision 61dfa509)
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