xref: /titanic_44/usr/src/uts/common/sys/idm/idm.h (revision 60220f10412f6a7c5b45f950f6f6aa364658a179)
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