xref: /illumos-gate/usr/src/uts/common/sys/idm/idm_transport.h (revision bbe725837bc5e084e6762c7984672bc05d76baf1)
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 /*
23*bbe72583SJack Meng  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24a6d42e7dSPeter Dunlap  * Use is subject to license terms.
25a6d42e7dSPeter Dunlap  */
26a6d42e7dSPeter Dunlap 
27a6d42e7dSPeter Dunlap #ifndef	_IDM_TRANSPORT_H_
28a6d42e7dSPeter Dunlap #define	_IDM_TRANSPORT_H_
29a6d42e7dSPeter Dunlap 
30a6d42e7dSPeter Dunlap #ifdef	__cplusplus
31a6d42e7dSPeter Dunlap extern "C" {
32a6d42e7dSPeter Dunlap #endif
33a6d42e7dSPeter Dunlap 
34a6d42e7dSPeter Dunlap #include <sys/nvpair.h>
35a6d42e7dSPeter Dunlap #include <sys/sunldi.h>
36a6d42e7dSPeter Dunlap 
37a6d42e7dSPeter Dunlap #define	IDM_TRANSPORT_PATHLEN	0x40
38a6d42e7dSPeter Dunlap 
39a6d42e7dSPeter Dunlap /* Note, this is tied to iSER currently */
40a6d42e7dSPeter Dunlap #define	IDM_TRANSPORT_HEADER_LENGTH	0x20
41a6d42e7dSPeter Dunlap 
42a6d42e7dSPeter Dunlap /*
43a6d42e7dSPeter Dunlap  * idm_transport_type_t
44a6d42e7dSPeter Dunlap  * An enumerated list of the transports available to iSER.
45a6d42e7dSPeter Dunlap  * Note that new transports should be added to the enum prior to NUM_TYPES.
46a6d42e7dSPeter Dunlap  */
47a6d42e7dSPeter Dunlap typedef enum {
48a6d42e7dSPeter Dunlap 	IDM_TRANSPORT_TYPE_ISER	= 0,
49a6d42e7dSPeter Dunlap 	IDM_TRANSPORT_TYPE_SOCKETS,
50a6d42e7dSPeter Dunlap 	IDM_TRANSPORT_NUM_TYPES,
51a6d42e7dSPeter Dunlap 	IDM_TRANSPORT_TYPE_UNDEFINED
52a6d42e7dSPeter Dunlap } idm_transport_type_t;
53a6d42e7dSPeter Dunlap 
54a6d42e7dSPeter Dunlap /*
55a6d42e7dSPeter Dunlap  * idm_transport_caps_t
56a6d42e7dSPeter Dunlap  * Encodes a set of attributes describing an IDM transport's capabilities.
57a6d42e7dSPeter Dunlap  *	JB - do we need this?
58a6d42e7dSPeter Dunlap  */
59a6d42e7dSPeter Dunlap typedef struct idm_transport_caps_s {
60a6d42e7dSPeter Dunlap 	uint32_t	flags;
61a6d42e7dSPeter Dunlap } idm_transport_caps_t;
62a6d42e7dSPeter Dunlap 
63a6d42e7dSPeter Dunlap /*
64a6d42e7dSPeter Dunlap  * Transport routine definitions for idm_transport_ops_t below
65a6d42e7dSPeter Dunlap  */
66a6d42e7dSPeter Dunlap 
67a6d42e7dSPeter Dunlap /* Send_Control - transmit a Control-type PDU */
68a6d42e7dSPeter Dunlap typedef void (transport_tx_op_t)(struct idm_conn_s *ic, struct idm_pdu_s *pdu);
69a6d42e7dSPeter Dunlap 
70a6d42e7dSPeter Dunlap /*
71a6d42e7dSPeter Dunlap  * Target transport data primitives, caller (IDM) holds idt->idt_mutex,
72a6d42e7dSPeter Dunlap  * and the transport should release the mutex before returning.
73a6d42e7dSPeter Dunlap  */
74a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_tx_to_ini_op_t)(struct idm_task_s *idt,
75a6d42e7dSPeter Dunlap     struct idm_buf_s *idb);
76a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_rx_from_ini_op_t)(struct idm_task_s *idt,
77a6d42e7dSPeter Dunlap     struct idm_buf_s *idb);
78a6d42e7dSPeter Dunlap 
79a6d42e7dSPeter Dunlap /* Initiator transport data handlers */
80a6d42e7dSPeter Dunlap typedef void (transport_rx_datain_op_t)(struct idm_conn_s *ic,
81a6d42e7dSPeter Dunlap     struct idm_pdu_s *pdu);
82a6d42e7dSPeter Dunlap typedef void (transport_rx_rtt_op_t)(struct idm_conn_s *ic,
83a6d42e7dSPeter Dunlap     struct idm_pdu_s *pdu);
84a6d42e7dSPeter Dunlap 
85a6d42e7dSPeter Dunlap /* Target transport Data-out handler */
86a6d42e7dSPeter Dunlap typedef void (transport_rx_dataout_op_t)(struct idm_conn_s *ic,
87a6d42e7dSPeter Dunlap     struct idm_pdu_s *pdu);
88a6d42e7dSPeter Dunlap 
89a6d42e7dSPeter Dunlap /* Transport-specific resource allocation and free */
90a6d42e7dSPeter Dunlap typedef idm_status_t (transport_alloc_conn_rsrc_op_t)(struct idm_conn_s *ic);
91a6d42e7dSPeter Dunlap typedef idm_status_t (transport_free_conn_rsrc_op_t)(struct idm_conn_s *ic);
92a6d42e7dSPeter Dunlap 
93a6d42e7dSPeter Dunlap /* Transport driver operations enable/disable */
94a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_enable_datamover_op_t)(struct
95a6d42e7dSPeter Dunlap     idm_conn_s *ic);
96a6d42e7dSPeter Dunlap typedef idm_status_t (transport_ini_enable_datamover_op_t)(struct
97a6d42e7dSPeter Dunlap     idm_conn_s *ic);
98a6d42e7dSPeter Dunlap typedef idm_status_t (transport_conn_terminate_op_t)(struct idm_conn_s *ic);
99a6d42e7dSPeter Dunlap 
100a6d42e7dSPeter Dunlap /* Task resource cleanup */
101a6d42e7dSPeter Dunlap typedef idm_status_t (transport_free_task_rsrcs_op_t)(struct idm_task_s *it);
102a6d42e7dSPeter Dunlap 
103a6d42e7dSPeter Dunlap /* Negotiate key value pairs */
104a6d42e7dSPeter Dunlap typedef kv_status_t (transport_negotiate_key_values_op_t)(struct
105a6d42e7dSPeter Dunlap     idm_conn_s *ic, nvlist_t *request_nvl, nvlist_t *response_nvl,
106a6d42e7dSPeter Dunlap     nvlist_t *negotiated_nvl);
107a6d42e7dSPeter Dunlap 
108a6d42e7dSPeter Dunlap /* Activate the negotiated key value pairs */
10930e7468fSPeter Dunlap typedef void (transport_notice_key_values_op_t)(struct idm_conn_s *ic,
110a6d42e7dSPeter Dunlap     nvlist_t *negotiated_nvl);
111a6d42e7dSPeter Dunlap 
11256261083SCharles Ting /* Declare the declarative key value pairs */
11356261083SCharles Ting typedef kv_status_t (transport_declare_key_values_op_t)(struct idm_conn_s *ic,
11456261083SCharles Ting     nvlist_t *config_nvl, nvlist_t *outgoing_nvl);
11556261083SCharles Ting 
116a6d42e7dSPeter Dunlap /* Transport capability probe */
117a6d42e7dSPeter Dunlap typedef boolean_t (transport_conn_is_capable_op_t)(idm_conn_req_t *ic,
118a6d42e7dSPeter Dunlap     struct idm_transport_caps_s *caps);
119a6d42e7dSPeter Dunlap 
120a6d42e7dSPeter Dunlap /* Transport buffer services */
121a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_alloc_op_t)(struct idm_buf_s *idb,
122a6d42e7dSPeter Dunlap     uint64_t buflen);
123a6d42e7dSPeter Dunlap typedef idm_status_t (transport_buf_setup_op_t)(struct idm_buf_s *idb);
124a6d42e7dSPeter Dunlap typedef void (transport_buf_teardown_op_t)(struct idm_buf_s *idb);
125a6d42e7dSPeter Dunlap typedef void (transport_buf_free_op_t)(struct idm_buf_s *idb);
126a6d42e7dSPeter Dunlap 
127a6d42e7dSPeter Dunlap /* Transport target context and service management services */
128a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_svc_create_op_t)(idm_svc_req_t *sr,
129a6d42e7dSPeter Dunlap     struct idm_svc_s *is);
130a6d42e7dSPeter Dunlap typedef void (transport_tgt_svc_destroy_op_t)(struct idm_svc_s *is);
131a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_svc_online_op_t)(struct idm_svc_s *is);
132a6d42e7dSPeter Dunlap typedef void (transport_tgt_svc_offline_op_t)(struct idm_svc_s *is);
133a6d42e7dSPeter Dunlap 
134a6d42e7dSPeter Dunlap /* Transport target connection establishment */
135a6d42e7dSPeter Dunlap typedef void (transport_tgt_conn_destroy_op_t)(struct idm_conn_s *ic);
136a6d42e7dSPeter Dunlap typedef idm_status_t (transport_tgt_conn_connect_op_t)(struct idm_conn_s *ic);
137a6d42e7dSPeter Dunlap typedef void (transport_tgt_conn_disconnect_op_t)(struct idm_conn_s *ic);
138a6d42e7dSPeter Dunlap 
139a6d42e7dSPeter Dunlap /* Transport initiator context and connection management services */
140a6d42e7dSPeter Dunlap typedef idm_status_t (transport_ini_conn_create_op_t)(idm_conn_req_t *cr,
141a6d42e7dSPeter Dunlap     struct idm_conn_s *ic);
142a6d42e7dSPeter Dunlap typedef void (transport_ini_conn_destroy_op_t)(struct idm_conn_s *ic);
143a6d42e7dSPeter Dunlap typedef idm_status_t (transport_ini_conn_connect_op_t)(struct idm_conn_s *ic);
144a6d42e7dSPeter Dunlap typedef void (transport_ini_conn_disconnect_op_t)(struct idm_conn_s *ic);
145a6d42e7dSPeter Dunlap 
146a6d42e7dSPeter Dunlap 
147a6d42e7dSPeter Dunlap /*
148a6d42e7dSPeter Dunlap  * idm_transport_ops_t
149a6d42e7dSPeter Dunlap  * Encodes a set of vectors into an IDM transport driver that implement the
150a6d42e7dSPeter Dunlap  * transport-specific Datamover operations for IDM usage. These routines are
151a6d42e7dSPeter Dunlap  * invoked by the IDM layer to execute the transport-specific implementations
152a6d42e7dSPeter Dunlap  * of the DataMover primitives and supporting routines.
153a6d42e7dSPeter Dunlap  */
154a6d42e7dSPeter Dunlap typedef struct idm_transport_ops_s {
155a6d42e7dSPeter Dunlap 	transport_tx_op_t			*it_tx_pdu;
156a6d42e7dSPeter Dunlap 	transport_buf_tx_to_ini_op_t		*it_buf_tx_to_ini;
157a6d42e7dSPeter Dunlap 	transport_buf_rx_from_ini_op_t		*it_buf_rx_from_ini;
158a6d42e7dSPeter Dunlap 	transport_rx_datain_op_t		*it_rx_datain;
159a6d42e7dSPeter Dunlap 	transport_rx_rtt_op_t			*it_rx_rtt;
160a6d42e7dSPeter Dunlap 	transport_rx_dataout_op_t		*it_rx_dataout;
161a6d42e7dSPeter Dunlap 	transport_alloc_conn_rsrc_op_t		*it_alloc_conn_rsrc;
162a6d42e7dSPeter Dunlap 	transport_free_conn_rsrc_op_t		*it_free_conn_rsrc;
163a6d42e7dSPeter Dunlap 	transport_tgt_enable_datamover_op_t	*it_tgt_enable_datamover;
164a6d42e7dSPeter Dunlap 	transport_ini_enable_datamover_op_t	*it_ini_enable_datamover;
165a6d42e7dSPeter Dunlap 	transport_conn_terminate_op_t		*it_conn_terminate;
166a6d42e7dSPeter Dunlap 	transport_free_task_rsrcs_op_t		*it_free_task_rsrc;
167a6d42e7dSPeter Dunlap 	transport_negotiate_key_values_op_t	*it_negotiate_key_values;
168a6d42e7dSPeter Dunlap 	transport_notice_key_values_op_t	*it_notice_key_values;
169a6d42e7dSPeter Dunlap 	transport_conn_is_capable_op_t		*it_conn_is_capable;
170a6d42e7dSPeter Dunlap 	transport_buf_alloc_op_t		*it_buf_alloc;
171a6d42e7dSPeter Dunlap 	transport_buf_free_op_t			*it_buf_free;
172a6d42e7dSPeter Dunlap 	transport_buf_setup_op_t		*it_buf_setup;
173a6d42e7dSPeter Dunlap 	transport_buf_teardown_op_t		*it_buf_teardown;
174a6d42e7dSPeter Dunlap 	transport_tgt_svc_create_op_t		*it_tgt_svc_create;
175a6d42e7dSPeter Dunlap 	transport_tgt_svc_destroy_op_t		*it_tgt_svc_destroy;
176a6d42e7dSPeter Dunlap 	transport_tgt_svc_online_op_t		*it_tgt_svc_online;
177a6d42e7dSPeter Dunlap 	transport_tgt_svc_offline_op_t		*it_tgt_svc_offline;
178a6d42e7dSPeter Dunlap 	transport_tgt_conn_destroy_op_t		*it_tgt_conn_destroy;
179a6d42e7dSPeter Dunlap 	transport_tgt_conn_connect_op_t		*it_tgt_conn_connect;
180a6d42e7dSPeter Dunlap 	transport_tgt_conn_disconnect_op_t	*it_tgt_conn_disconnect;
181a6d42e7dSPeter Dunlap 	transport_ini_conn_create_op_t		*it_ini_conn_create;
182a6d42e7dSPeter Dunlap 	transport_ini_conn_destroy_op_t		*it_ini_conn_destroy;
183a6d42e7dSPeter Dunlap 	transport_ini_conn_connect_op_t		*it_ini_conn_connect;
184a6d42e7dSPeter Dunlap 	transport_ini_conn_disconnect_op_t	*it_ini_conn_disconnect;
18556261083SCharles Ting 	transport_declare_key_values_op_t	*it_declare_key_values;
186a6d42e7dSPeter Dunlap } idm_transport_ops_t;
187a6d42e7dSPeter Dunlap 
188a6d42e7dSPeter Dunlap /*
189a6d42e7dSPeter Dunlap  * idm_transport_t encodes all of the data related to an IDM transport
190a6d42e7dSPeter Dunlap  * type. In addition to type and capabilities, it also stores a pointer
191a6d42e7dSPeter Dunlap  * to the connection and transport operation implementations, and also
192a6d42e7dSPeter Dunlap  * it stores the LDI handle.
193a6d42e7dSPeter Dunlap  */
194a6d42e7dSPeter Dunlap typedef struct idm_transport_s {
195a6d42e7dSPeter Dunlap 	idm_transport_type_t	it_type;
196a6d42e7dSPeter Dunlap 	char			*it_device_path;
197a6d42e7dSPeter Dunlap 	ldi_handle_t		it_ldi_hdl;
198a6d42e7dSPeter Dunlap 	idm_transport_ops_t	*it_ops;
199a6d42e7dSPeter Dunlap 	idm_transport_caps_t	*it_caps;
200a6d42e7dSPeter Dunlap } idm_transport_t;
201a6d42e7dSPeter Dunlap 
202a6d42e7dSPeter Dunlap /*
203a6d42e7dSPeter Dunlap  * idm_transport_attr_t encodes details of a transport driver seeking
204a6d42e7dSPeter Dunlap  * registration with the IDM kernel module.
205a6d42e7dSPeter Dunlap  */
206a6d42e7dSPeter Dunlap typedef struct idm_transport_attr_s {
207a6d42e7dSPeter Dunlap 	idm_transport_type_t	type;
208a6d42e7dSPeter Dunlap 	idm_transport_ops_t	*it_ops;
209a6d42e7dSPeter Dunlap 	idm_transport_caps_t	*it_caps;
210a6d42e7dSPeter Dunlap } idm_transport_attr_t;
211a6d42e7dSPeter Dunlap 
212a6d42e7dSPeter Dunlap /* IDM transport API */
213a6d42e7dSPeter Dunlap idm_status_t
214a6d42e7dSPeter Dunlap idm_transport_register(idm_transport_attr_t *attr);
215a6d42e7dSPeter Dunlap 
216a6d42e7dSPeter Dunlap idm_transport_t *
217a6d42e7dSPeter Dunlap idm_transport_lookup(idm_conn_req_t *cr);
218a6d42e7dSPeter Dunlap 
219a6d42e7dSPeter Dunlap void
220*bbe72583SJack Meng idm_transport_setup(ldi_ident_t li, boolean_t boot_conn);
221a6d42e7dSPeter Dunlap 
22230e7468fSPeter Dunlap void
22330e7468fSPeter Dunlap idm_transport_teardown();
22430e7468fSPeter Dunlap 
225a6d42e7dSPeter Dunlap #ifdef	__cplusplus
226a6d42e7dSPeter Dunlap }
227a6d42e7dSPeter Dunlap #endif
228a6d42e7dSPeter Dunlap 
229a6d42e7dSPeter Dunlap #endif /* _IDM_TRANSPORT_H_ */
230