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.
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.
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]
23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _IDM_TRANSPORT_H_
28 #define _IDM_TRANSPORT_H_
34 #include <sys/nvpair.h>
35 #include <sys/sunldi.h>
37 #define IDM_TRANSPORT_PATHLEN 0x40
39 /* Note, this is tied to iSER currently */
40 #define IDM_TRANSPORT_HEADER_LENGTH 0x20
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.
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
;
55 * idm_transport_caps_t
56 * Encodes a set of attributes describing an IDM transport's capabilities.
57 * JB - do we need this?
59 typedef struct idm_transport_caps_s
{
61 } idm_transport_caps_t
;
64 * Transport routine definitions for idm_transport_ops_t below
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
);
71 * Target transport data primitives, caller (IDM) holds idt->idt_mutex,
72 * and the transport should release the mutex before returning.
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
);
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
);
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
);
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
);
93 /* Transport driver operations enable/disable */
94 typedef idm_status_t (transport_tgt_enable_datamover_op_t
)(struct
96 typedef idm_status_t (transport_ini_enable_datamover_op_t
)(struct
98 typedef idm_status_t (transport_conn_terminate_op_t
)(struct idm_conn_s
*ic
);
100 /* Task resource cleanup */
101 typedef idm_status_t (transport_free_task_rsrcs_op_t
)(struct idm_task_s
*it
);
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
);
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
);
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
);
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
);
120 /* Transport buffer services */
121 typedef idm_status_t (transport_buf_alloc_op_t
)(struct idm_buf_s
*idb
,
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
);
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
);
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
);
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
);
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.
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
;
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.
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
;
203 * idm_transport_attr_t encodes details of a transport driver seeking
204 * registration with the IDM kernel module.
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
;
212 /* IDM transport API */
214 idm_transport_register(idm_transport_attr_t
*attr
);
217 idm_transport_lookup(idm_conn_req_t
*cr
);
220 idm_transport_setup(ldi_ident_t li
, boolean_t boot_conn
);
223 idm_transport_teardown();
229 #endif /* _IDM_TRANSPORT_H_ */