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