xref: /illumos-gate/usr/src/uts/common/sys/idm/idm.h (revision dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9)
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 2009 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_LOGIN_FAIL
46 } idm_status_t;
47 
48 
49 typedef enum {
50 	CN_CONNECT_ACCEPT = 1,	/* Target only */
51 	CN_LOGIN_FAIL,
52 	CN_READY_FOR_LOGIN,	/* Initiator only */
53 	CN_FFP_ENABLED,
54 	CN_FFP_DISABLED,
55 	CN_CONNECT_LOST,
56 	CN_CONNECT_DESTROY,
57 	CN_CONNECT_FAIL,
58 	CN_MAX
59 } idm_client_notify_t;
60 
61 #ifdef IDM_CN_NOTIFY_STRINGS
62 static const char *idm_cn_strings[CN_MAX + 1] = {
63 	"CN_UNDEFINED",
64 	"CN_CONNECT_ACCEPT",
65 	"CN_LOGIN_FAIL",
66 	"CN_READY_FOR_LOGIN",
67 	"CN_FFP_ENABLED",
68 	"CN_FFP_DISABLED",
69 	"CN_CONNECT_LOST",
70 	"CN_CONNECT_DESTROY",
71 	"CN_CONNECT_FAIL",
72 	"CN_MAX"
73 };
74 #endif
75 
76 typedef enum {
77 	FD_CONN_FAIL,
78 	FD_CONN_LOGOUT,
79 	FD_SESS_LOGOUT
80 } idm_ffp_disable_t;
81 
82 typedef enum {
83 	AT_INTERNAL_SUSPEND,
84 	AT_INTERNAL_ABORT,
85 	AT_TASK_MGMT_ABORT
86 } idm_abort_type_t;
87 
88 typedef enum {
89 	TASK_IDLE,
90 	TASK_ACTIVE,
91 	TASK_SUSPENDING,
92 	TASK_SUSPENDED,
93 	TASK_ABORTING,
94 	TASK_ABORTED,
95 	TASK_COMPLETE,
96 	TASK_MAX_STATE
97 } idm_task_state_t;
98 
99 #ifdef IDM_TASK_SM_STRINGS
100 static const char *idm_ts_name[TASK_MAX_STATE+1] = {
101 	"TASK_IDLE",
102 	"TASK_ACTIVE",
103 	"TASK_SUSPENDING",
104 	"TASK_SUSPENDED",
105 	"TASK_ABORTING",
106 	"TASK_ABORTED",
107 	"TASK_COMPLETE",
108 	"TASK_MAX_STATE"
109 };
110 #endif
111 
112 typedef enum {
113 	KV_HANDLED = 0,
114 	KV_HANDLED_NO_TRANSIT,
115 	KV_UNHANDLED,
116 	KV_TARGET_ONLY,
117 	KV_NO_RESOURCES,
118 	KV_INTERNAL_ERROR,
119 	KV_VALUE_ERROR,
120 	KV_MISSING_FIELDS,
121 	KV_AUTH_FAILED
122 } kv_status_t;
123 
124 /*
125  * Request structures
126  */
127 
128 /* Defined in idm_impl.h */
129 struct idm_conn_s;
130 struct idm_svc_s;
131 struct idm_buf_s;
132 struct idm_pdu_s;
133 struct idm_task_s;
134 
135 typedef idm_status_t (idm_client_notify_cb_t)(
136     struct idm_conn_s *ic, idm_client_notify_t cn, uintptr_t data);
137 
138 typedef void (idm_rx_pdu_cb_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu);
139 
140 typedef void (idm_rx_pdu_error_cb_t)(struct idm_conn_s *ic,
141     struct idm_pdu_s *pdu, idm_status_t status);
142 
143 typedef void (idm_buf_cb_t)(struct idm_buf_s *idb, idm_status_t status);
144 
145 typedef void (idm_pdu_cb_t)(struct idm_pdu_s *pdu, idm_status_t status);
146 
147 typedef void (idm_task_cb_t)(struct idm_task_s *task, idm_status_t status);
148 
149 typedef void (idm_build_hdr_cb_t)(
150     struct idm_task_s *task, struct idm_pdu_s *pdu, uint8_t opcode);
151 
152 typedef void (idm_keepalive_cb_t)(struct idm_conn_s *ic);
153 
154 typedef union idm_sockaddr {
155 	struct sockaddr		sin;
156 	struct sockaddr_in	sin4;
157 	struct sockaddr_in6	sin6;
158 } idm_sockaddr_t;
159 
160 #define	SIZEOF_SOCKADDR(so)		\
161 	((so)->sa_family == AF_INET ?	\
162 	sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6))
163 
164 typedef struct {
165 	idm_rx_pdu_cb_t		*icb_rx_scsi_cmd;
166 	idm_rx_pdu_cb_t		*icb_rx_scsi_rsp;
167 	idm_rx_pdu_cb_t		*icb_rx_misc;
168 	idm_rx_pdu_error_cb_t	*icb_rx_error;
169 	idm_task_cb_t		*icb_task_aborted;
170 	idm_client_notify_cb_t	*icb_client_notify;
171 	idm_build_hdr_cb_t	*icb_build_hdr;
172 	idm_keepalive_cb_t	*icb_keepalive;
173 } idm_conn_ops_t;
174 
175 typedef struct {
176 	int			cr_domain;
177 	int			cr_type;
178 	int			cr_protocol;
179 	boolean_t		cr_bound;
180 	idm_sockaddr_t		cr_bound_addr;
181 	idm_sockaddr_t		cr_ini_dst_addr;
182 	ldi_ident_t		cr_li;
183 	idm_conn_ops_t		icr_conn_ops;
184 	boolean_t		cr_boot_conn;
185 } idm_conn_req_t;
186 
187 typedef struct {
188 	uint16_t		sr_port;
189 	ldi_ident_t		sr_li;
190 	idm_conn_ops_t		sr_conn_ops;
191 } idm_svc_req_t;
192 
193 
194 /* This is not how other networking code handles this */
195 typedef struct {
196 	union {
197 		struct in_addr	in4;
198 		struct in6_addr	in6;
199 	} i_addr;
200 	/* i_insize determines which is valid in the union above */
201 	int			i_insize;
202 } idm_ipaddr_t;
203 
204 typedef struct {
205 	idm_ipaddr_t		a_addr;
206 	uint32_t		a_port,
207 				a_oid;
208 } idm_addr_t;
209 
210 typedef struct {
211 	uint32_t		al_vers,			/* In */
212 				al_oid;				/* In */
213 	uint32_t		al_in_cnt;			/* In */
214 	uint32_t		al_out_cnt;			/* Out */
215 	uint32_t		al_tpgt;			/* Out */
216 	idm_addr_t		al_addrs[1];			/* Out */
217 } idm_addr_list_t;
218 
219 /*
220  * State machine auditing
221  */
222 
223 #define	SM_AUDIT_BUF_MAX_REC	32
224 
225 typedef enum {
226 	SAR_UNDEFINED = 0,
227 	SAR_STATE_EVENT,
228 	SAR_STATE_CHANGE
229 } sm_audit_record_type_t;
230 
231 typedef enum {
232 	SAS_UNDEFINED = 0,
233 	SAS_IDM_CONN,
234 	SAS_IDM_TASK,
235 	SAS_ISCSIT_TGT,
236 	SAS_ISCSIT_SESS,
237 	SAS_ISCSIT_LOGIN,
238 	SAS_ISCSI_CMD,
239 	SAS_ISCSI_SESS,
240 	SAS_ISCSI_CONN,
241 	SAS_ISCSI_LOGIN
242 } sm_audit_sm_type_t;
243 
244 typedef struct {
245 	timespec_t		sar_timestamp;
246 	sm_audit_sm_type_t	sar_sm_type;
247 	sm_audit_record_type_t	sar_type;
248 	int			sar_state;
249 	int			sar_new_state;	/* Only for SAR_STATE_CHANGE */
250 	int			sar_event;	/* Only for SAR_STATE_EVENT */
251 	uintptr_t		sar_event_info;	/* Only for SAR_STATE_EVENT */
252 } sm_audit_record_t;
253 
254 typedef struct {
255 	int			sab_index;
256 	int			sab_max_index;
257 	sm_audit_record_t	sab_records[SM_AUDIT_BUF_MAX_REC];
258 } sm_audit_buf_t;
259 
260 extern boolean_t idm_sm_logging;
261 extern boolean_t idm_conn_logging;
262 extern boolean_t idm_svc_logging;
263 
264 #define	IDM_SM_LOG if (idm_sm_logging) cmn_err
265 #define	IDM_CONN_LOG if (idm_conn_logging) cmn_err
266 #define	IDM_SVC_LOG if (idm_svc_logging) cmn_err
267 
268 void idm_sm_audit_init(sm_audit_buf_t *audit_buf);
269 
270 void idm_sm_audit_event(sm_audit_buf_t *audit_buf,
271     sm_audit_sm_type_t sm_type,
272     int state, int event, uintptr_t event_info);
273 
274 void idm_sm_audit_state_change(sm_audit_buf_t *audit_buf,
275     sm_audit_sm_type_t sm_type, int state, int new_state);
276 
277 
278 #include <sys/iscsi_protocol.h>
279 #include <sys/idm/idm_conn_sm.h>
280 #include <sys/idm/idm_transport.h>
281 #include <sys/idm/idm_impl.h>
282 #include <sys/idm/idm_text.h>
283 #include <sys/idm/idm_so.h>
284 
285 /*
286  * iSCSI Initiator Services
287  */
288 
289 idm_status_t
290 idm_ini_conn_create(idm_conn_req_t *cr, idm_conn_t **new_con);
291 
292 idm_status_t
293 idm_ini_conn_connect(idm_conn_t *ic);
294 
295 void
296 idm_ini_conn_disconnect(idm_conn_t *ic);
297 
298 void
299 idm_ini_conn_disconnect_sync(idm_conn_t *ic);
300 
301 void
302 idm_ini_conn_destroy(idm_conn_t *ic);
303 
304 /*
305  * iSCSI Target Services
306  */
307 
308 idm_status_t
309 idm_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t **new_svc);
310 
311 idm_status_t
312 idm_tgt_svc_online(idm_svc_t *is);
313 
314 void
315 idm_tgt_svc_offline(idm_svc_t *is);
316 
317 void
318 idm_tgt_svc_destroy(idm_svc_t *is);
319 
320 void
321 idm_tgt_svc_destroy_if_unref(idm_svc_t *is);
322 
323 idm_svc_t *
324 idm_tgt_svc_lookup(uint16_t port);
325 
326 void
327 idm_tgt_svc_hold(idm_svc_t *is);
328 
329 void
330 idm_tgt_svc_rele_and_destroy(idm_svc_t *is);
331 
332 idm_status_t
333 idm_tgt_conn_accept(idm_conn_t *ic);
334 
335 void
336 idm_tgt_conn_reject(idm_conn_t *ic);
337 
338 void
339 idm_conn_hold(idm_conn_t *ic);
340 
341 void
342 idm_conn_rele(idm_conn_t *ic);
343 
344 void
345 idm_conn_set_target_name(idm_conn_t *ic, char *target_name);
346 
347 void
348 idm_conn_set_initiator_name(idm_conn_t *ic, char *initiator_name);
349 
350 void
351 idm_conn_set_isid(idm_conn_t *ic, uint8_t isid[ISCSI_ISID_LEN]);
352 
353 /*
354  * Target data transfer services
355  */
356 idm_status_t
357 idm_buf_tx_to_ini(idm_task_t *idt, idm_buf_t *idb,
358     uint32_t offset, uint32_t xfer_length,
359     idm_buf_cb_t idb_buf_cb, void *cb_arg);
360 
361 idm_status_t
362 idm_buf_rx_from_ini(idm_task_t *idt, idm_buf_t *idb,
363     uint32_t offset, uint32_t xfer_length,
364     idm_buf_cb_t idb_buf_cb, void *cb_arg);
365 
366 void
367 idm_buf_tx_to_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status);
368 
369 void
370 idm_buf_rx_from_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status);
371 
372 #define	XFER_BUF_TX_TO_INI	0
373 #define	XFER_BUF_RX_FROM_INI	1
374 /*
375  * Shared Initiator/Target Services
376  */
377 kv_status_t
378 idm_negotiate_key_values(idm_conn_t *ic, nvlist_t *request_nvl,
379     nvlist_t *response_nvl, nvlist_t *negotiated_nvl);
380 
381 void
382 idm_notice_key_values(idm_conn_t *ic, nvlist_t *negotiated_nvl);
383 
384 kv_status_t
385 idm_declare_key_values(idm_conn_t *ic, nvlist_t *config_nvl,
386     nvlist_t *outgoing_nvl);
387 
388 /*
389  * Buffer services
390  */
391 
392 idm_buf_t *
393 idm_buf_alloc(idm_conn_t *ic, void *bufptr, uint64_t buflen);
394 
395 void
396 idm_buf_free(idm_buf_t *idb);
397 
398 void
399 idm_buf_bind_in(idm_task_t *idt, idm_buf_t *buf);
400 
401 void
402 idm_buf_bind_out(idm_task_t *idt, idm_buf_t *buf);
403 
404 void
405 idm_buf_unbind_in(idm_task_t *idt, idm_buf_t *buf);
406 
407 void
408 idm_buf_unbind_out(idm_task_t *idt, idm_buf_t *buf);
409 
410 idm_buf_t *
411 idm_buf_find(void *lbuf, size_t data_offset);
412 
413 void
414 idm_bufpat_set(idm_buf_t *idb);
415 
416 boolean_t
417 idm_bufpat_check(idm_buf_t *idb, int check_len, idm_bufpat_check_type_t type);
418 
419 extern boolean_t idm_pattern_checking;
420 
421 #define	IDM_BUFPAT_SET(CHK_BUF) 				\
422 	if (idm_pattern_checking && (CHK_BUF)->idb_bufalloc) {	\
423 		idm_bufpat_set(CHK_BUF);			\
424 	}
425 
426 #define	IDM_BUFPAT_CHECK(CHK_BUF, CHK_LEN, CHK_TYPE) 		\
427 	if (idm_pattern_checking) {				\
428 		(void) idm_bufpat_check(CHK_BUF, CHK_LEN, CHK_TYPE);	\
429 	}
430 
431 /*
432  * Task services
433  */
434 idm_task_t *
435 idm_task_alloc(idm_conn_t *ic);
436 
437 void
438 idm_task_start(idm_task_t *idt, uintptr_t handle);
439 
440 void
441 idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type);
442 
443 void
444 idm_task_cleanup(idm_task_t *idt);
445 
446 void
447 idm_task_done(idm_task_t *idt);
448 
449 void
450 idm_task_free(idm_task_t *idt);
451 
452 idm_task_t *
453 idm_task_find(idm_conn_t *ic, uint32_t itt, uint32_t ttt);
454 
455 idm_task_t *
456 idm_task_find_and_complete(idm_conn_t *ic, uint32_t itt, uint32_t ttt);
457 
458 void *
459 idm_task_find_by_handle(idm_conn_t *ic, uintptr_t handle);
460 
461 void
462 idm_task_hold(idm_task_t *idt);
463 
464 void
465 idm_task_rele(idm_task_t *idt);
466 
467 /*
468  * PDU Services
469  */
470 
471 idm_pdu_t *
472 idm_pdu_alloc(uint_t hdrlen, uint_t datalen);
473 
474 idm_pdu_t *
475 idm_pdu_alloc_nosleep(uint_t hdrlen, uint_t datalen);
476 
477 void
478 idm_pdu_free(idm_pdu_t *pdu);
479 
480 void
481 idm_pdu_init(idm_pdu_t *pdu, idm_conn_t *ic, void *private, idm_pdu_cb_t *cb);
482 
483 void
484 idm_pdu_init_hdr(idm_pdu_t *pdu, uint8_t *hdr, uint_t hdrlen);
485 
486 void
487 idm_pdu_init_data(idm_pdu_t *pdu, uint8_t *data, uint_t datalen);
488 
489 void
490 idm_pdu_complete(idm_pdu_t *pdu, idm_status_t status);
491 
492 void
493 idm_pdu_tx(idm_pdu_t *pdu);
494 
495 /*
496  * Object reference tracking
497  */
498 
499 void
500 idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj);
501 
502 void
503 idm_refcnt_destroy(idm_refcnt_t *refcnt);
504 
505 void
506 idm_refcnt_reset(idm_refcnt_t *refcnt);
507 
508 void
509 idm_refcnt_hold(idm_refcnt_t *refcnt);
510 
511 void
512 idm_refcnt_rele(idm_refcnt_t *refcnt);
513 
514 void
515 idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
516 
517 void
518 idm_refcnt_wait_ref(idm_refcnt_t *refcnt);
519 
520 void
521 idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
522 
523 
524 #ifdef	__cplusplus
525 }
526 #endif
527 
528 #endif /* _IDM_H */
529