xref: /onnv-gate/usr/src/uts/common/sys/ib/clients/iser/iser.h (revision 9162:b011b0287065)
1*9162SPeter.Dunlap@Sun.COM /*
2*9162SPeter.Dunlap@Sun.COM  * CDDL HEADER START
3*9162SPeter.Dunlap@Sun.COM  *
4*9162SPeter.Dunlap@Sun.COM  * The contents of this file are subject to the terms of the
5*9162SPeter.Dunlap@Sun.COM  * Common Development and Distribution License (the "License").
6*9162SPeter.Dunlap@Sun.COM  * You may not use this file except in compliance with the License.
7*9162SPeter.Dunlap@Sun.COM  *
8*9162SPeter.Dunlap@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9162SPeter.Dunlap@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*9162SPeter.Dunlap@Sun.COM  * See the License for the specific language governing permissions
11*9162SPeter.Dunlap@Sun.COM  * and limitations under the License.
12*9162SPeter.Dunlap@Sun.COM  *
13*9162SPeter.Dunlap@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*9162SPeter.Dunlap@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9162SPeter.Dunlap@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*9162SPeter.Dunlap@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*9162SPeter.Dunlap@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9162SPeter.Dunlap@Sun.COM  *
19*9162SPeter.Dunlap@Sun.COM  * CDDL HEADER END
20*9162SPeter.Dunlap@Sun.COM  */
21*9162SPeter.Dunlap@Sun.COM /*
22*9162SPeter.Dunlap@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*9162SPeter.Dunlap@Sun.COM  * Use is subject to license terms.
24*9162SPeter.Dunlap@Sun.COM  */
25*9162SPeter.Dunlap@Sun.COM 
26*9162SPeter.Dunlap@Sun.COM #ifndef _ISER_H
27*9162SPeter.Dunlap@Sun.COM #define	_ISER_H
28*9162SPeter.Dunlap@Sun.COM 
29*9162SPeter.Dunlap@Sun.COM #ifdef	__cplusplus
30*9162SPeter.Dunlap@Sun.COM extern "C" {
31*9162SPeter.Dunlap@Sun.COM #endif
32*9162SPeter.Dunlap@Sun.COM 
33*9162SPeter.Dunlap@Sun.COM #include <sys/types.h>
34*9162SPeter.Dunlap@Sun.COM #include <sys/ddi.h>
35*9162SPeter.Dunlap@Sun.COM #include <sys/cmn_err.h>
36*9162SPeter.Dunlap@Sun.COM #include <sys/socket.h>
37*9162SPeter.Dunlap@Sun.COM #include <netinet/in.h>
38*9162SPeter.Dunlap@Sun.COM #include <sys/sunddi.h>
39*9162SPeter.Dunlap@Sun.COM #include <sys/ib/ibtl/ibti.h>
40*9162SPeter.Dunlap@Sun.COM #include <sys/ib/ibtl/ibtl_types.h>
41*9162SPeter.Dunlap@Sun.COM 
42*9162SPeter.Dunlap@Sun.COM #include <sys/idm/idm.h>
43*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_ib.h>
44*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_resource.h>
45*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_cm.h>
46*9162SPeter.Dunlap@Sun.COM #include <sys/ib/clients/iser/iser_xfer.h>
47*9162SPeter.Dunlap@Sun.COM 
48*9162SPeter.Dunlap@Sun.COM /*
49*9162SPeter.Dunlap@Sun.COM  * iser.h
50*9162SPeter.Dunlap@Sun.COM  *	Definitions and macros related to iSER core functionality,
51*9162SPeter.Dunlap@Sun.COM  * 	softstate and DDI routines.
52*9162SPeter.Dunlap@Sun.COM  */
53*9162SPeter.Dunlap@Sun.COM extern boolean_t iser_logging;
54*9162SPeter.Dunlap@Sun.COM #define	ISER_LOG if (iser_logging) cmn_err
55*9162SPeter.Dunlap@Sun.COM 
56*9162SPeter.Dunlap@Sun.COM #define	ISER_TASKQ_NTHREADS	4
57*9162SPeter.Dunlap@Sun.COM 
58*9162SPeter.Dunlap@Sun.COM #define	ISER_HEADER_LENGTH	28
59*9162SPeter.Dunlap@Sun.COM 
60*9162SPeter.Dunlap@Sun.COM #define	ISER_DELAY_HALF_SECOND	500000 /* for use with drv_usectohz() */
61*9162SPeter.Dunlap@Sun.COM 
62*9162SPeter.Dunlap@Sun.COM /* iSER Operational Parameters */
63*9162SPeter.Dunlap@Sun.COM #define	ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_MIN		0x200
64*9162SPeter.Dunlap@Sun.COM #define	ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_MAX		0xFFFFFF
65*9162SPeter.Dunlap@Sun.COM #define	ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_IMPL_MAX		0xFFFFFF
66*9162SPeter.Dunlap@Sun.COM #define	ISER_TARGET_RECV_DATA_SEGMENT_LENGTH_DEFAULT		\
67*9162SPeter.Dunlap@Sun.COM 	ISCSI_DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH
68*9162SPeter.Dunlap@Sun.COM #define	ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_MIN		0x200
69*9162SPeter.Dunlap@Sun.COM #define	ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_MAX		0xFFFFFF
70*9162SPeter.Dunlap@Sun.COM #define	ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_IMPL_MAX	0xFFFFFF
71*9162SPeter.Dunlap@Sun.COM #define	ISER_INITIATOR_RECV_DATA_SEGMENT_LENGTH_DEFAULT		\
72*9162SPeter.Dunlap@Sun.COM 	ISCSI_DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH
73*9162SPeter.Dunlap@Sun.COM #define	ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_MIN		0x0
74*9162SPeter.Dunlap@Sun.COM #define	ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_MAX		0xFFFFFFFF
75*9162SPeter.Dunlap@Sun.COM #define	ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_IMPL_MAX		0xFFFFFFFF
76*9162SPeter.Dunlap@Sun.COM #define	ISER_MAX_OUTSTANDING_UNEXPECTED_PDUS_DEFAULT		0x0
77*9162SPeter.Dunlap@Sun.COM 
78*9162SPeter.Dunlap@Sun.COM /* iSCSI key names that iSER is interested in */
79*9162SPeter.Dunlap@Sun.COM #define	ISER_KV_KEY_NAME_RDMA_EXTENSIONS	"RDMAExtensions"
80*9162SPeter.Dunlap@Sun.COM #define	ISER_KV_KEY_NAME_OF_MARKER		"OFMarker"
81*9162SPeter.Dunlap@Sun.COM #define	ISER_KV_KEY_NAME_IF_MARKER		"IFMarker"
82*9162SPeter.Dunlap@Sun.COM #define	ISER_KV_KEY_NAME_TGT_RECV_SEGLEN	"TargetRecvDataSegmentLength"
83*9162SPeter.Dunlap@Sun.COM #define	ISER_KV_KEY_NAME_INI_RECV_SEGLEN	"InitiatorRecvDataSegmentLength"
84*9162SPeter.Dunlap@Sun.COM #define	ISER_KV_KEY_NAME_MAX_OUTSTANDING_PDU	"MaxOutstandingUnexpectedPDUs"
85*9162SPeter.Dunlap@Sun.COM 
86*9162SPeter.Dunlap@Sun.COM typedef struct iser_sbind_s {
87*9162SPeter.Dunlap@Sun.COM 	list_node_t		is_list_node;
88*9162SPeter.Dunlap@Sun.COM 	ibt_sbind_hdl_t		is_sbindhdl;
89*9162SPeter.Dunlap@Sun.COM 	ib_gid_t		is_gid;
90*9162SPeter.Dunlap@Sun.COM 	ib_guid_t		is_guid;
91*9162SPeter.Dunlap@Sun.COM } iser_sbind_t;
92*9162SPeter.Dunlap@Sun.COM 
93*9162SPeter.Dunlap@Sun.COM /* iSER-specific portion of idm_svc_t */
94*9162SPeter.Dunlap@Sun.COM typedef struct iser_svc_s {
95*9162SPeter.Dunlap@Sun.COM 	idm_refcnt_t		is_refcnt;
96*9162SPeter.Dunlap@Sun.COM 	ib_svc_id_t		is_svcid;
97*9162SPeter.Dunlap@Sun.COM 	ibt_srv_hdl_t		is_srvhdl;
98*9162SPeter.Dunlap@Sun.COM 	/* list of service bind handles - one per HCA port */
99*9162SPeter.Dunlap@Sun.COM 	list_t			is_sbindlist;
100*9162SPeter.Dunlap@Sun.COM } iser_svc_t;
101*9162SPeter.Dunlap@Sun.COM 
102*9162SPeter.Dunlap@Sun.COM /*
103*9162SPeter.Dunlap@Sun.COM  * iSER endpoint connection type
104*9162SPeter.Dunlap@Sun.COM  */
105*9162SPeter.Dunlap@Sun.COM typedef enum {
106*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_TYPE_INI = 1,
107*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_TYPE_TGT
108*9162SPeter.Dunlap@Sun.COM } iser_conn_type_t;
109*9162SPeter.Dunlap@Sun.COM 
110*9162SPeter.Dunlap@Sun.COM /*
111*9162SPeter.Dunlap@Sun.COM  * iSER Connection States to keep track of the connection going into
112*9162SPeter.Dunlap@Sun.COM  * iSER-assisted mode
113*9162SPeter.Dunlap@Sun.COM  */
114*9162SPeter.Dunlap@Sun.COM typedef enum {
115*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_UNDEFINED,
116*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_ALLOCATED,	/* conn handle allocated */
117*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_IC_CONNECTED,	/* conn established */
118*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLO_SENT,	/* hello exchange stages */
119*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLO_SENT_FAIL,
120*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLO_WAIT,
121*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLO_RCV,
122*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLO_RCV_FAIL,
123*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLOREPLY_SENT,
124*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLOREPLY_SENT_FAIL,
125*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLOREPLY_RCV,
126*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_HELLOREPLY_RCV_FAIL,
127*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_LOGGED_IN,
128*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_IC_DISCONNECTED, /* conn disconnected */
129*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_IC_FREED,	/* conn handle allocated */
130*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_CLOSING,	/* channel closing */
131*9162SPeter.Dunlap@Sun.COM 	ISER_CONN_STAGE_CLOSED		/* channel closed */
132*9162SPeter.Dunlap@Sun.COM } iser_conn_stage_t;
133*9162SPeter.Dunlap@Sun.COM 
134*9162SPeter.Dunlap@Sun.COM /*
135*9162SPeter.Dunlap@Sun.COM  * iSER operations parameters negotiated for a given connection
136*9162SPeter.Dunlap@Sun.COM  */
137*9162SPeter.Dunlap@Sun.COM typedef struct iser_op_params_s {
138*9162SPeter.Dunlap@Sun.COM 	uint32_t	op_header_digest:1,
139*9162SPeter.Dunlap@Sun.COM 			op_data_digest:1,
140*9162SPeter.Dunlap@Sun.COM 			op_rdma_extensions:1,
141*9162SPeter.Dunlap@Sun.COM 			op_ofmarker:1,
142*9162SPeter.Dunlap@Sun.COM 			op_ifmarker:1;
143*9162SPeter.Dunlap@Sun.COM 	uint64_t	op_target_recv_data_segment_length;
144*9162SPeter.Dunlap@Sun.COM 	uint64_t	op_initiator_recv_data_segment_length;
145*9162SPeter.Dunlap@Sun.COM 	uint64_t	op_max_outstanding_unexpected_pdus;
146*9162SPeter.Dunlap@Sun.COM } iser_op_params_t;
147*9162SPeter.Dunlap@Sun.COM 
148*9162SPeter.Dunlap@Sun.COM /*
149*9162SPeter.Dunlap@Sun.COM  * iSER connection information
150*9162SPeter.Dunlap@Sun.COM  */
151*9162SPeter.Dunlap@Sun.COM typedef struct iser_conn_s {
152*9162SPeter.Dunlap@Sun.COM 	kmutex_t		ic_lock;
153*9162SPeter.Dunlap@Sun.COM 	kcondvar_t		ic_stage_cv;
154*9162SPeter.Dunlap@Sun.COM 	iser_conn_type_t	ic_type;
155*9162SPeter.Dunlap@Sun.COM 	iser_chan_t		*ic_chan;
156*9162SPeter.Dunlap@Sun.COM 	iser_conn_stage_t	ic_stage; /* for iSER-assisted mode */
157*9162SPeter.Dunlap@Sun.COM 	iser_op_params_t	ic_op_params;
158*9162SPeter.Dunlap@Sun.COM 	idm_conn_t		*ic_idmc;
159*9162SPeter.Dunlap@Sun.COM 	idm_svc_t		*ic_idms;
160*9162SPeter.Dunlap@Sun.COM } iser_conn_t;
161*9162SPeter.Dunlap@Sun.COM 
162*9162SPeter.Dunlap@Sun.COM /*
163*9162SPeter.Dunlap@Sun.COM  * iser_state_t is the iser driver's state structure, encoding all of
164*9162SPeter.Dunlap@Sun.COM  * the state information.
165*9162SPeter.Dunlap@Sun.COM  */
166*9162SPeter.Dunlap@Sun.COM typedef struct iser_state_s {
167*9162SPeter.Dunlap@Sun.COM 	dev_info_t	*is_dip;
168*9162SPeter.Dunlap@Sun.COM 	int		is_instance;
169*9162SPeter.Dunlap@Sun.COM 
170*9162SPeter.Dunlap@Sun.COM 	/* IDM open ref counter and lock */
171*9162SPeter.Dunlap@Sun.COM 	kmutex_t	is_refcnt_lock;
172*9162SPeter.Dunlap@Sun.COM 	int		is_open_refcnt;
173*9162SPeter.Dunlap@Sun.COM 
174*9162SPeter.Dunlap@Sun.COM 	ibt_clnt_hdl_t	is_ibhdl;	/* IBT handle */
175*9162SPeter.Dunlap@Sun.COM 
176*9162SPeter.Dunlap@Sun.COM 	/* list of HCAs */
177*9162SPeter.Dunlap@Sun.COM 	kmutex_t	is_hcalist_lock; /* locked by is_hcalist_lock */
178*9162SPeter.Dunlap@Sun.COM 	list_t		is_hcalist;
179*9162SPeter.Dunlap@Sun.COM 	uint_t		is_num_hcas;
180*9162SPeter.Dunlap@Sun.COM 
181*9162SPeter.Dunlap@Sun.COM 	/* Connection list */
182*9162SPeter.Dunlap@Sun.COM 	iser_conn_t	*is_connlist;
183*9162SPeter.Dunlap@Sun.COM 
184*9162SPeter.Dunlap@Sun.COM 	/* Global work request handle cache */
185*9162SPeter.Dunlap@Sun.COM 	kmem_cache_t		*iser_wr_cache;
186*9162SPeter.Dunlap@Sun.COM } iser_state_t;
187*9162SPeter.Dunlap@Sun.COM 
188*9162SPeter.Dunlap@Sun.COM typedef enum {
189*9162SPeter.Dunlap@Sun.COM 	ISER_STATUS_SUCCESS = 0,
190*9162SPeter.Dunlap@Sun.COM 	ISER_STATUS_FAIL
191*9162SPeter.Dunlap@Sun.COM } iser_status_t;
192*9162SPeter.Dunlap@Sun.COM 
193*9162SPeter.Dunlap@Sun.COM int iser_idm_register();
194*9162SPeter.Dunlap@Sun.COM 
195*9162SPeter.Dunlap@Sun.COM iser_status_t iser_register_service(idm_svc_t *idm_svc);
196*9162SPeter.Dunlap@Sun.COM 
197*9162SPeter.Dunlap@Sun.COM iser_status_t iser_bind_service(idm_svc_t *idm_svc);
198*9162SPeter.Dunlap@Sun.COM 
199*9162SPeter.Dunlap@Sun.COM void iser_unbind_service(idm_svc_t *idm_svc);
200*9162SPeter.Dunlap@Sun.COM 
201*9162SPeter.Dunlap@Sun.COM void iser_deregister_service(idm_svc_t *idm_svc);
202*9162SPeter.Dunlap@Sun.COM 
203*9162SPeter.Dunlap@Sun.COM boolean_t iser_path_exists(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr);
204*9162SPeter.Dunlap@Sun.COM 
205*9162SPeter.Dunlap@Sun.COM iser_chan_t *iser_channel_alloc(idm_sockaddr_t *laddr, idm_sockaddr_t *raddr);
206*9162SPeter.Dunlap@Sun.COM 
207*9162SPeter.Dunlap@Sun.COM iser_status_t iser_channel_open(iser_chan_t *chan);
208*9162SPeter.Dunlap@Sun.COM 
209*9162SPeter.Dunlap@Sun.COM void iser_channel_close(iser_chan_t *chan);
210*9162SPeter.Dunlap@Sun.COM 
211*9162SPeter.Dunlap@Sun.COM void iser_channel_free(iser_chan_t *chan);
212*9162SPeter.Dunlap@Sun.COM 
213*9162SPeter.Dunlap@Sun.COM void iser_internal_conn_destroy(iser_conn_t *ic);
214*9162SPeter.Dunlap@Sun.COM 
215*9162SPeter.Dunlap@Sun.COM /* IDM refcnt utilities for the iSER tgt svc handle */
216*9162SPeter.Dunlap@Sun.COM void iser_tgt_svc_hold(iser_svc_t *is);
217*9162SPeter.Dunlap@Sun.COM void iser_tgt_svc_rele(iser_svc_t *is);
218*9162SPeter.Dunlap@Sun.COM 
219*9162SPeter.Dunlap@Sun.COM 
220*9162SPeter.Dunlap@Sun.COM #ifdef	__cplusplus
221*9162SPeter.Dunlap@Sun.COM }
222*9162SPeter.Dunlap@Sun.COM #endif
223*9162SPeter.Dunlap@Sun.COM 
224*9162SPeter.Dunlap@Sun.COM #endif /* _ISER_H */
225