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  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef _SYS_IB_IBTL_IMPL_IBTL_CM_H
26 #define	_SYS_IB_IBTL_IMPL_IBTL_CM_H
27 
28 /*
29  * ibtl_cm.h
30  *
31  * All data structures and function prototypes that are specific to the
32  * IBTL <-> IBCM private interface.
33  */
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 /*
40  * ibt_ud_dest_t is defined in ibtl_ci_types.h, it holds all the
41  * information needed to reach a UD destination.
42  *
43  *	typedef struct ibt_ud_dest_s {
44  *		ibc_ah_hdl_t		ud_ah;		* Address handle *
45  *		ib_qpn_t		ud_dst_qpn;	* Destination QPN *
46  *		ib_qkey_t		ud_qkey;	* Q_Key *
47  *
48  *		* The following fields are CM-only, i.e., opaque to the CI *
49  *		struct ibtl_hca_s	*ud_hca;	* IBTL HCA handle *
50  *	} ibt_ud_dest_t;
51  */
52 #define	ud_dest_hca	ud_dest_opaque1
53 
54 /* CM private data */
55 void ibtl_cm_set_chan_private(ibt_channel_hdl_t chan, void *cm_private);
56 void *ibtl_cm_get_chan_private(ibt_channel_hdl_t chan);
57 void ibtl_cm_release_chan_private(ibt_channel_hdl_t chan);
58 void ibtl_cm_wait_chan_private(ibt_channel_hdl_t chan);
59 
60 /*
61  * ibtl_cm_get_hca_port() helper function will retrieve these for the
62  * specified SGID value.
63  */
64 typedef struct ibtl_cm_hca_port_s {
65 	ib_guid_t	hp_hca_guid;	/* HCA GUID. */
66 	ib_guid_t	hp_port_guid;   /* Port GUID. */
67 	ib_lid_t	hp_base_lid;	/* Base LID of Port. */
68 	uint8_t		hp_port;	/* HCA Port Number. */
69 	uint8_t		hp_sgid_ix;	/* SGID Index in SGID Table. */
70 	uint8_t		hp_lmc:3;	/* Local mask control */
71 	ib_mtu_t	hp_mtu;		/* Max transfer unit - pkt */
72 } ibtl_cm_hca_port_t;
73 
74 /*
75  * ibtl_cm_get_hca_port()
76  *
77  * 	A helper function to get HCA node GUID, Base LID, SGID Index,
78  *	port number, LMC and MTU for the specified SGID.
79  *
80  *	sgid		Input Source GID.
81  *
82  *	hca_guid	Optional HCA Guid.
83  *
84  *	hca_port	Pointer to ibtl_cm_hca_port_t structure,
85  */
86 ibt_status_t ibtl_cm_get_hca_port(ib_gid_t sgid, ib_guid_t hca_guid,
87     ibtl_cm_hca_port_t *hca_port);
88 
89 
90 ibt_status_t ibtl_cm_get_local_comp_gids(ib_guid_t hca_guid, ib_gid_t sgid,
91     ib_gid_t **gids_p, uint_t *num_gids_p);
92 
93 int ibtl_cm_is_multi_sm(ib_guid_t hca_guid);
94 
95 /*
96  * ibtl_cm_get_1st_full_pkey_ix()
97  *
98  *	A helper function to get P_Key Index of the first full member P_Key
99  *	available on the specified HCA and Port combination.
100  *
101  *	hca_guid	HCA GUID.
102  *
103  *	port		HCA port number.
104  */
105 uint16_t ibtl_cm_get_1st_full_pkey_ix(ib_guid_t hca_guid, uint8_t port);
106 
107 
108 /*
109  * Functions to support CM and clients to reliably free RC QPs.
110  *
111  * ibtl_cm_chan_is_open()
112  *
113  *	Inform IBTL that the connection has been established on this
114  *	channel so that a later call to ibtl_cm_chan_is_closed()
115  *	will be required to free the QPN used by this channel.
116  *
117  * ibtl_cm_chan_is_opening()
118  *
119  *	Inform IBTL that the connection established on this channel is
120  *	in progress.
121  *
122  * ibtl_cm_chan_open_is_aborted()
123  *
124  *	Inform IBTL that the connection established on this channel has
125  *	aborted. So undo what was done in ibtl_cm_chan_is_opening().
126  *
127  * ibtl_cm_chan_is_closing()
128  *
129  *	Inform IBTL that the TIMEWAIT delay for the connection has been
130  *	started for this channel so that the QP can be freed.
131  *
132  * ibtl_cm_is_chan_closing()
133  *
134  *	Returns 1 if the connection on this channel has been moved to TIME WAIT
135  *
136  * ibtl_cm_is_chan_closed()
137  *
138  *	Returns 1 if the connection on this channel has completed TIME WAIT
139  *
140  * ibtl_cm_chan_is_closed()
141  *
142  *	Inform IBTL that the TIMEWAIT delay for the connection has been
143  *	reached for this channel so that the QPN can be reused.
144  *
145  *	rc_chan		Channel Handle
146  *
147  * ibtl_cm_chan_is_reused()
148  *
149  *	Inform IBTL that the channel is going to be re-used for another
150  *	connection.
151  *
152  *	rc_chan		Channel Handle
153  */
154 void ibtl_cm_chan_is_open(ibt_channel_hdl_t rc_chan);
155 void ibtl_cm_chan_is_opening(ibt_channel_hdl_t rc_chan);
156 void ibtl_cm_chan_open_is_aborted(ibt_channel_hdl_t rc_chan);
157 void ibtl_cm_chan_is_closing(ibt_channel_hdl_t rc_chan);
158 void ibtl_cm_chan_is_closed(ibt_channel_hdl_t rc_chan);
159 void ibtl_cm_chan_is_reused(ibt_channel_hdl_t rc_chan);
160 int  ibtl_cm_is_chan_closing(ibt_channel_hdl_t rc_chan);
161 int  ibtl_cm_is_chan_closed(ibt_channel_hdl_t rc_chan);
162 
163 /*
164  * ibtl_cm_get_chan_type()
165  *
166  *	A helper function to get channel transport type.
167  */
168 ibt_tran_srv_t ibtl_cm_get_chan_type(ibt_channel_hdl_t chan);
169 
170 /*
171  * ibtl_cm_change_service_cnt()
172  *
173  *	Inform IBTL that service registration count has changed
174  *	so that it can correctly manage whether or not it should
175  *	allow ibt_detach() to succeed.
176  */
177 void ibtl_cm_change_service_cnt(ibt_clnt_hdl_t ibt_hdl, int delta_num_sids);
178 
179 /*
180  * ibtl_cm_query_hca_ports_byguid()
181  *
182  *	Use the cached copy of the portinfo.
183  */
184 ibt_status_t ibtl_cm_query_hca_ports_byguid(ib_guid_t hca_guid, uint8_t port,
185     ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p);
186 
187 
188 /*
189  * ibtl_cm_get_active_plist
190  *
191  *	Returns a list of active source points which satisfy the desired
192  *	attribute. The memory allocated for the array "port_list_p" should
193  *	be freed by the caller using ibtl_cm_free_active_plist().
194  *
195  * ibtl_cm_free_active_plist
196  *
197  *	Frees the memory allocated in ibtl_cm_get_active_plist().
198  */
199 
200 #define	IBTL_CM_SIMPLE_SETUP	0
201 #define	IBTL_CM_MULTI_SM	(1 << 0)
202 #define	IBTL_CM_MULTI_HCA	(1 << 1)
203 
204 typedef struct ibtl_cm_port_list_s {
205 	ib_guid_t	p_hca_guid;
206 	ib_gid_t	p_sgid;
207 	ib_lid_t	p_base_lid;
208 	ib_mtu_t	p_mtu;
209 	uint8_t		p_sgid_ix;
210 	uint8_t		p_port_num;
211 	uint8_t		p_count;
212 	uint8_t		p_multi;
213 	void		*p_saa_hdl;
214 	ibt_ip_addr_t	p_src_ip;
215 } ibtl_cm_port_list_t;
216 
217 ibt_status_t ibtl_cm_get_active_plist(ibt_path_attr_t *attr,
218     ibt_path_flags_t flags, ibtl_cm_port_list_t **port_list_p);
219 void ibtl_cm_free_active_plist(ibtl_cm_port_list_t *port_list);
220 
221 /*
222  * Functions to support ibt_register_subnet_notices and the
223  * related callbacks.
224  *
225  * ibtl_cm_set_sm_notice_handler
226  *	Pass the handler into IBTL where it will actually be used.
227  *
228  * ibtl_cm_sm_notice_handler
229  *	Post an event to interested IBT clients.
230  *
231  * ibtl_cm_sm_notice_init_failure
232  *	Inform the client that callbacks are not working.
233  */
234 void ibtl_cm_sm_notice_handler(ib_gid_t sgid, ibt_subnet_event_code_t code,
235     ibt_subnet_event_t *event);
236 
237 void ibtl_cm_set_sm_notice_handler(ibt_clnt_hdl_t ibt_hdl,
238     ibt_sm_notice_handler_t sm_notice_handler, void *private);
239 
240 /* pass all failing sgids at once */
241 typedef struct ibtl_cm_sm_init_fail_s {
242 	int		smf_num_sgids;
243 	ibt_clnt_hdl_t	smf_ibt_hdl;
244 	ib_gid_t	smf_sgid[1];
245 } ibtl_cm_sm_init_fail_t;
246 
247 void ibtl_cm_sm_notice_init_failure(ibtl_cm_sm_init_fail_t *ifail);
248 
249 char *ibtl_cm_get_clnt_name(ibt_clnt_hdl_t ibt_hdl);
250 
251 /*
252  * ibtl_cm_set_node_info_cb: This is a private interface between IBTL and IBCM
253  * to let IBTL get the Node Record of a remote port. This interface is used by
254  * IBCM to register a callback which can be used by IBTL to get the Node record.
255  */
256 void ibtl_cm_set_node_info_cb(ibt_status_t (*)(ib_guid_t, uint8_t, ib_lid_t,
257     ibt_node_info_t *));
258 
259 #ifdef __cplusplus
260 }
261 #endif
262 
263 #endif /* _SYS_IB_IBTL_IMPL_IBTL_CM_H */
264