xref: /illumos-gate/usr/src/uts/common/sys/idm/idm.h (revision a6d42e7d)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _IDM_H
28 #define	_IDM_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 typedef enum {
35 	IDM_STATUS_SUCCESS = 0,
36 	IDM_STATUS_FAIL,
37 	IDM_STATUS_NORESOURCES,
38 	IDM_STATUS_REJECT,
39 	IDM_STATUS_IO,
40 	IDM_STATUS_ABORTED,
41 	IDM_STATUS_SUSPENDED,
42 	IDM_STATUS_HEADER_DIGEST,
43 	IDM_STATUS_DATA_DIGEST,
44 	IDM_STATUS_PROTOCOL_ERROR
45 } idm_status_t;
46 
47 typedef enum {
48 	CN_CONNECT_ACCEPT = 1,	/* Target only */
49 	CN_LOGIN_FAIL,		/* Target only */
50 	CN_READY_FOR_LOGIN,	/* Initiator only */
51 	CN_FFP_ENABLED,
52 	CN_FFP_DISABLED,
53 	CN_CONNECT_LOST,
54 	CN_CONNECT_DESTROY
55 } idm_client_notify_t;
56 
57 typedef enum {
58 	FD_CONN_FAIL,
59 	FD_CONN_LOGOUT,
60 	FD_SESS_LOGOUT
61 } idm_ffp_disable_t;
62 
63 typedef enum {
64 	AT_INTERNAL_SUSPEND,
65 	AT_INTERNAL_ABORT,
66 	AT_TASK_MGMT_ABORT
67 } idm_abort_type_t;
68 
69 typedef enum {
70 	TASK_IDLE,
71 	TASK_ACTIVE,
72 	TASK_SUSPENDING,
73 	TASK_SUSPENDED,
74 	TASK_ABORTING,
75 	TASK_ABORTED,
76 	TASK_COMPLETE
77 } idm_task_state_t;
78 
79 typedef enum {
80 	KV_HANDLED = 0,
81 	KV_HANDLED_NO_TRANSIT,
82 	KV_UNHANDLED,
83 	KV_TARGET_ONLY,
84 	KV_NO_RESOURCES,
85 	KV_INTERNAL_ERROR,
86 	KV_VALUE_ERROR,
87 	KV_MISSING_FIELDS,
88 	KV_AUTH_FAILED
89 } kv_status_t;
90 
91 /*
92  * Request structures
93  */
94 
95 /* Defined in idm_impl.h */
96 struct idm_conn_s;
97 struct idm_svc_s;
98 struct idm_buf_s;
99 struct idm_pdu_s;
100 struct idm_task_s;
101 
102 typedef idm_status_t (idm_client_notify_cb_t)(
103     struct idm_conn_s *ic, idm_client_notify_t cn, uintptr_t data);
104 
105 typedef void (idm_rx_pdu_cb_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu);
106 
107 typedef void (idm_rx_pdu_error_cb_t)(struct idm_conn_s *ic,
108     struct idm_pdu_s *pdu, idm_status_t status);
109 
110 typedef void (idm_buf_cb_t)(struct idm_buf_s *idb, idm_status_t status);
111 
112 typedef void (idm_pdu_cb_t)(struct idm_pdu_s *pdu, idm_status_t status);
113 
114 typedef void (idm_task_cb_t)(struct idm_task_s *task, idm_status_t status);
115 
116 typedef void (idm_build_hdr_cb_t)(
117     struct idm_task_s *task, struct idm_pdu_s *pdu, uint8_t opcode);
118 
119 typedef union idm_sockaddr {
120 	struct sockaddr		sin;
121 	struct sockaddr_in	sin4;
122 	struct sockaddr_in6	sin6;
123 } idm_sockaddr_t;
124 
125 #define	SIZEOF_SOCKADDR(so)		\
126 	((so)->sa_family == AF_INET ?	\
127 	sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6))
128 
129 typedef struct {
130 	idm_rx_pdu_cb_t		*icb_rx_scsi_cmd;
131 	idm_rx_pdu_cb_t		*icb_rx_scsi_rsp;
132 	idm_rx_pdu_cb_t		*icb_rx_misc;
133 	idm_rx_pdu_error_cb_t	*icb_rx_error;
134 	idm_task_cb_t		*icb_task_aborted;
135 	idm_client_notify_cb_t	*icb_client_notify;
136 	idm_build_hdr_cb_t	*icb_build_hdr;
137 } idm_conn_ops_t;
138 
139 typedef struct {
140 	int			cr_domain;
141 	int			cr_type;
142 	int			cr_protocol;
143 	boolean_t		cr_bound;
144 	idm_sockaddr_t		cr_bound_addr;
145 	idm_sockaddr_t		cr_ini_dst_addr;
146 	ldi_ident_t		cr_li;
147 	idm_conn_ops_t		icr_conn_ops;
148 } idm_conn_req_t;
149 
150 typedef struct {
151 	uint16_t		sr_port;
152 	ldi_ident_t		sr_li;
153 	idm_conn_ops_t		sr_conn_ops;
154 } idm_svc_req_t;
155 
156 
157 /* This is not how other networking code handles this */
158 typedef struct {
159 	union {
160 		struct in_addr	in4;
161 		struct in6_addr	in6;
162 	} i_addr;
163 	/* i_insize determines which is valid in the union above */
164 	int			i_insize;
165 } idm_ipaddr_t;
166 
167 typedef struct {
168 	idm_ipaddr_t		a_addr;
169 	uint32_t		a_port,
170 				a_oid;
171 } idm_addr_t;
172 
173 typedef struct {
174 	uint32_t		al_vers,			/* In */
175 				al_oid;				/* In */
176 	uint32_t		al_in_cnt;			/* In */
177 	uint32_t		al_out_cnt;			/* Out */
178 	uint32_t		al_tpgt;			/* Out */
179 	idm_addr_t		al_addrs[1];			/* Out */
180 } idm_addr_list_t;
181 
182 /*
183  * State machine auditing
184  */
185 
186 #define	SM_AUDIT_BUF_MAX_REC	32
187 
188 typedef enum {
189 	SAR_UNDEFINED = 0,
190 	SAR_STATE_EVENT,
191 	SAR_STATE_CHANGE
192 } sm_audit_record_type_t;
193 
194 typedef enum {
195 	SAS_UNDEFINED = 0,
196 	SAS_IDM_CONN,
197 	SAS_IDM_TASK,
198 	SAS_ISCSIT_TGT,
199 	SAS_ISCSIT_SESS,
200 	SAS_ISCSIT_LOGIN
201 } sm_audit_sm_type_t;
202 
203 typedef struct {
204 	timespec_t		sar_timestamp;
205 	sm_audit_sm_type_t	sar_sm_type;
206 	sm_audit_record_type_t	sar_type;
207 	int			sar_state;
208 	int			sar_new_state;	/* Only for SAR_STATE_CHANGE */
209 	int			sar_event;	/* Only for SAR_STATE_EVENT */
210 	uintptr_t		sar_event_info;	/* Only for SAR_STATE_EVENT */
211 } sm_audit_record_t;
212 
213 typedef struct {
214 	int			sab_index;
215 	int			sab_max_index;
216 	sm_audit_record_t	sab_records[SM_AUDIT_BUF_MAX_REC];
217 } sm_audit_buf_t;
218 
219 extern boolean_t idm_sm_logging;
220 extern boolean_t idm_conn_logging;
221 extern boolean_t idm_svc_logging;
222 
223 #define	IDM_SM_LOG if (idm_sm_logging) cmn_err
224 #define	IDM_CONN_LOG if (idm_conn_logging) cmn_err
225 #define	IDM_SVC_LOG if (idm_svc_logging) cmn_err
226 
227 void idm_sm_audit_init(sm_audit_buf_t *audit_buf);
228 
229 void idm_sm_audit_event(sm_audit_buf_t *audit_buf,
230     sm_audit_sm_type_t sm_type,
231     int state, int event, uintptr_t event_info);
232 
233 void idm_sm_audit_state_change(sm_audit_buf_t *audit_buf,
234     sm_audit_sm_type_t sm_type, int state, int new_state);
235 
236 
237 #include <sys/iscsi_protocol.h>
238 #include <sys/idm/idm_conn_sm.h>
239 #include <sys/idm/idm_transport.h>
240 #include <sys/idm/idm_impl.h>
241 #include <sys/idm/idm_text.h>
242 #include <sys/idm/idm_so.h>
243 
244 /*
245  * iSCSI Initiator Services
246  */
247 
248 idm_status_t
249 idm_ini_conn_create(idm_conn_req_t *cr, idm_conn_t **new_con);
250 
251 idm_status_t
252 idm_ini_conn_connect(idm_conn_t *ic);
253 
254 void
255 idm_ini_conn_disconnect(idm_conn_t *ic);
256 
257 void
258 idm_ini_conn_destroy(idm_conn_t *ic);
259 
260 /*
261  * iSCSI Target Services
262  */
263 
264 idm_status_t
265 idm_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t **new_svc);
266 
267 idm_status_t
268 idm_tgt_svc_online(idm_svc_t *is);
269 
270 void
271 idm_tgt_svc_offline(idm_svc_t *is);
272 
273 void
274 idm_tgt_svc_destroy(idm_svc_t *is);
275 
276 void
277 idm_tgt_svc_destroy_if_unref(idm_svc_t *is);
278 
279 idm_svc_t *
280 idm_tgt_svc_lookup(uint16_t port);
281 
282 void
283 idm_tgt_svc_hold(idm_svc_t *is);
284 
285 void
286 idm_tgt_svc_rele_and_destroy(idm_svc_t *is);
287 
288 idm_status_t
289 idm_tgt_conn_accept(idm_conn_t *ic);
290 
291 void
292 idm_tgt_conn_reject(idm_conn_t *ic);
293 
294 void
295 idm_conn_hold(idm_conn_t *ic);
296 
297 void
298 idm_conn_rele(idm_conn_t *ic);
299 
300 /*
301  * Target data transfer services
302  */
303 idm_status_t
304 idm_buf_tx_to_ini(idm_task_t *idt, idm_buf_t *idb,
305     uint32_t offset, uint32_t xfer_length,
306     idm_buf_cb_t idb_buf_cb, void *cb_arg);
307 
308 idm_status_t
309 idm_buf_rx_from_ini(idm_task_t *idt, idm_buf_t *idb,
310     uint32_t offset, uint32_t xfer_length,
311     idm_buf_cb_t idb_buf_cb, void *cb_arg);
312 
313 void
314 idm_buf_tx_to_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status);
315 
316 void
317 idm_buf_rx_from_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status);
318 
319 /*
320  * Shared Initiator/Target Services
321  */
322 kv_status_t
323 idm_negotiate_key_values(idm_conn_t *ic, nvlist_t *request_nvl,
324     nvlist_t *response_nvl, nvlist_t *negotiated_nvl);
325 
326 idm_status_t
327 idm_notice_key_values(idm_conn_t *ic, nvlist_t *negotiated_nvl);
328 
329 /*
330  * Buffer services
331  */
332 
333 idm_buf_t *
334 idm_buf_alloc(idm_conn_t *ic, void *bufptr, uint64_t buflen);
335 
336 void
337 idm_buf_free(idm_buf_t *idb);
338 
339 void
340 idm_buf_bind_in(idm_task_t *idt, idm_buf_t *buf);
341 
342 void
343 idm_buf_bind_out(idm_task_t *idt, idm_buf_t *buf);
344 
345 void
346 idm_buf_unbind_in(idm_task_t *idt, idm_buf_t *buf);
347 
348 void
349 idm_buf_unbind_out(idm_task_t *idt, idm_buf_t *buf);
350 
351 idm_buf_t *
352 idm_buf_find(void *lbuf, size_t data_offset);
353 
354 /*
355  * Task services
356  */
357 idm_task_t *
358 idm_task_alloc(idm_conn_t *ic);
359 
360 void
361 idm_task_start(idm_task_t *idt, uintptr_t handle);
362 
363 void
364 idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type);
365 
366 void
367 idm_task_cleanup(idm_task_t *idt);
368 
369 void
370 idm_task_done(idm_task_t *idt);
371 
372 void
373 idm_task_free(idm_task_t *idt);
374 
375 idm_task_t *
376 idm_task_find(idm_conn_t *ic, uint32_t itt, uint32_t ttt);
377 
378 void *
379 idm_task_find_by_handle(idm_conn_t *ic, uintptr_t handle);
380 
381 void
382 idm_task_hold(idm_task_t *idt);
383 
384 void
385 idm_task_rele(idm_task_t *idt);
386 
387 /*
388  * PDU Services
389  */
390 
391 idm_pdu_t *
392 idm_pdu_alloc(uint_t hdrlen, uint_t datalen);
393 
394 void
395 idm_pdu_free(idm_pdu_t *pdu);
396 
397 void
398 idm_pdu_init(idm_pdu_t *pdu, idm_conn_t *ic, void *private, idm_pdu_cb_t *cb);
399 
400 void
401 idm_pdu_init_hdr(idm_pdu_t *pdu, uint8_t *hdr, uint_t hdrlen);
402 
403 void
404 idm_pdu_init_data(idm_pdu_t *pdu, uint8_t *data, uint_t datalen);
405 
406 void
407 idm_pdu_complete(idm_pdu_t *pdu, idm_status_t status);
408 
409 void
410 idm_pdu_tx(idm_pdu_t *pdu);
411 
412 /*
413  * Object reference tracking
414  */
415 
416 void
417 idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj);
418 
419 void
420 idm_refcnt_destroy(idm_refcnt_t *refcnt);
421 
422 void
423 idm_refcnt_reset(idm_refcnt_t *refcnt);
424 
425 void
426 idm_refcnt_hold(idm_refcnt_t *refcnt);
427 
428 void
429 idm_refcnt_rele(idm_refcnt_t *refcnt);
430 
431 void
432 idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
433 
434 void
435 idm_refcnt_wait_ref(idm_refcnt_t *refcnt);
436 
437 void
438 idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
439 
440 
441 #ifdef	__cplusplus
442 }
443 #endif
444 
445 #endif /* _IDM_H */
446