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