xref: /freebsd/contrib/ofed/libibcm/cm.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2006 Intel Corporation.  All rights reserved.
3*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
4*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
5*d6b92ffaSHans Petter Selasky  *
6*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky  *
12*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky  *     conditions are met:
15*d6b92ffaSHans Petter Selasky  *
16*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky  *        disclaimer.
19*d6b92ffaSHans Petter Selasky  *
20*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24*d6b92ffaSHans Petter Selasky  *
25*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky  * SOFTWARE.
33*d6b92ffaSHans Petter Selasky  *
34*d6b92ffaSHans Petter Selasky  * $Id$
35*d6b92ffaSHans Petter Selasky  */
36*d6b92ffaSHans Petter Selasky #if !defined(CM_H)
37*d6b92ffaSHans Petter Selasky #define CM_H
38*d6b92ffaSHans Petter Selasky 
39*d6b92ffaSHans Petter Selasky #include <infiniband/verbs.h>
40*d6b92ffaSHans Petter Selasky #include <infiniband/sa.h>
41*d6b92ffaSHans Petter Selasky #ifdef _KERNEL
42*d6b92ffaSHans Petter Selasky #include <linux/types.h>
43*d6b92ffaSHans Petter Selasky #include <sys/endian.h>
44*d6b92ffaSHans Petter Selasky #else
45*d6b92ffaSHans Petter Selasky #include <infiniband/types.h>
46*d6b92ffaSHans Petter Selasky #include <infiniband/endian.h>
47*d6b92ffaSHans Petter Selasky #endif
48*d6b92ffaSHans Petter Selasky 
49*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
50*d6b92ffaSHans Petter Selasky extern "C" {
51*d6b92ffaSHans Petter Selasky #endif
52*d6b92ffaSHans Petter Selasky 
53*d6b92ffaSHans Petter Selasky enum ib_cm_event_type {
54*d6b92ffaSHans Petter Selasky 	IB_CM_REQ_ERROR,
55*d6b92ffaSHans Petter Selasky 	IB_CM_REQ_RECEIVED,
56*d6b92ffaSHans Petter Selasky 	IB_CM_REP_ERROR,
57*d6b92ffaSHans Petter Selasky 	IB_CM_REP_RECEIVED,
58*d6b92ffaSHans Petter Selasky 	IB_CM_RTU_RECEIVED,
59*d6b92ffaSHans Petter Selasky 	IB_CM_USER_ESTABLISHED,
60*d6b92ffaSHans Petter Selasky 	IB_CM_DREQ_ERROR,
61*d6b92ffaSHans Petter Selasky 	IB_CM_DREQ_RECEIVED,
62*d6b92ffaSHans Petter Selasky 	IB_CM_DREP_RECEIVED,
63*d6b92ffaSHans Petter Selasky 	IB_CM_TIMEWAIT_EXIT,
64*d6b92ffaSHans Petter Selasky 	IB_CM_MRA_RECEIVED,
65*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_RECEIVED,
66*d6b92ffaSHans Petter Selasky 	IB_CM_LAP_ERROR,
67*d6b92ffaSHans Petter Selasky 	IB_CM_LAP_RECEIVED,
68*d6b92ffaSHans Petter Selasky 	IB_CM_APR_RECEIVED,
69*d6b92ffaSHans Petter Selasky 	IB_CM_SIDR_REQ_ERROR,
70*d6b92ffaSHans Petter Selasky 	IB_CM_SIDR_REQ_RECEIVED,
71*d6b92ffaSHans Petter Selasky 	IB_CM_SIDR_REP_RECEIVED
72*d6b92ffaSHans Petter Selasky };
73*d6b92ffaSHans Petter Selasky 
74*d6b92ffaSHans Petter Selasky enum ib_cm_data_size {
75*d6b92ffaSHans Petter Selasky 	IB_CM_REQ_PRIVATE_DATA_SIZE	 = 92,
76*d6b92ffaSHans Petter Selasky 	IB_CM_MRA_PRIVATE_DATA_SIZE	 = 222,
77*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_PRIVATE_DATA_SIZE	 = 148,
78*d6b92ffaSHans Petter Selasky 	IB_CM_REP_PRIVATE_DATA_SIZE	 = 196,
79*d6b92ffaSHans Petter Selasky 	IB_CM_RTU_PRIVATE_DATA_SIZE	 = 224,
80*d6b92ffaSHans Petter Selasky 	IB_CM_DREQ_PRIVATE_DATA_SIZE	 = 220,
81*d6b92ffaSHans Petter Selasky 	IB_CM_DREP_PRIVATE_DATA_SIZE	 = 224,
82*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_ARI_LENGTH		 = 72,
83*d6b92ffaSHans Petter Selasky 	IB_CM_LAP_PRIVATE_DATA_SIZE	 = 168,
84*d6b92ffaSHans Petter Selasky 	IB_CM_APR_PRIVATE_DATA_SIZE	 = 148,
85*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INFO_LENGTH		 = 72,
86*d6b92ffaSHans Petter Selasky 	IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE = 216,
87*d6b92ffaSHans Petter Selasky 	IB_CM_SIDR_REP_PRIVATE_DATA_SIZE = 136,
88*d6b92ffaSHans Petter Selasky 	IB_CM_SIDR_REP_INFO_LENGTH	 = 72
89*d6b92ffaSHans Petter Selasky };
90*d6b92ffaSHans Petter Selasky 
91*d6b92ffaSHans Petter Selasky struct ib_cm_device {
92*d6b92ffaSHans Petter Selasky 	struct ibv_context	*device_context;
93*d6b92ffaSHans Petter Selasky 	int			fd;
94*d6b92ffaSHans Petter Selasky };
95*d6b92ffaSHans Petter Selasky 
96*d6b92ffaSHans Petter Selasky struct ib_cm_id {
97*d6b92ffaSHans Petter Selasky 	void			*context;
98*d6b92ffaSHans Petter Selasky 	struct ib_cm_device	*device;
99*d6b92ffaSHans Petter Selasky 	uint32_t		handle;
100*d6b92ffaSHans Petter Selasky };
101*d6b92ffaSHans Petter Selasky 
102*d6b92ffaSHans Petter Selasky struct ib_cm_req_event_param {
103*d6b92ffaSHans Petter Selasky 	struct ib_cm_id		*listen_id;
104*d6b92ffaSHans Petter Selasky 	uint8_t			port;
105*d6b92ffaSHans Petter Selasky 
106*d6b92ffaSHans Petter Selasky 	struct ibv_sa_path_rec	*primary_path;
107*d6b92ffaSHans Petter Selasky 	struct ibv_sa_path_rec	*alternate_path;
108*d6b92ffaSHans Petter Selasky 
109*d6b92ffaSHans Petter Selasky 	__be64			remote_ca_guid;
110*d6b92ffaSHans Petter Selasky 	uint32_t		remote_qkey;
111*d6b92ffaSHans Petter Selasky 	uint32_t		remote_qpn;
112*d6b92ffaSHans Petter Selasky 	enum ibv_qp_type	qp_type;
113*d6b92ffaSHans Petter Selasky 
114*d6b92ffaSHans Petter Selasky 	uint32_t		starting_psn;
115*d6b92ffaSHans Petter Selasky 	uint8_t			responder_resources;
116*d6b92ffaSHans Petter Selasky 	uint8_t			initiator_depth;
117*d6b92ffaSHans Petter Selasky 	unsigned int		local_cm_response_timeout:5;
118*d6b92ffaSHans Petter Selasky 	unsigned int		flow_control:1;
119*d6b92ffaSHans Petter Selasky 	unsigned int		remote_cm_response_timeout:5;
120*d6b92ffaSHans Petter Selasky 	unsigned int		retry_count:3;
121*d6b92ffaSHans Petter Selasky 	unsigned int		rnr_retry_count:3;
122*d6b92ffaSHans Petter Selasky 	unsigned int		srq:1;
123*d6b92ffaSHans Petter Selasky };
124*d6b92ffaSHans Petter Selasky 
125*d6b92ffaSHans Petter Selasky struct ib_cm_rep_event_param {
126*d6b92ffaSHans Petter Selasky 	__be64			remote_ca_guid;
127*d6b92ffaSHans Petter Selasky 	uint32_t		remote_qkey;
128*d6b92ffaSHans Petter Selasky 	uint32_t		remote_qpn;
129*d6b92ffaSHans Petter Selasky 	uint32_t		starting_psn;
130*d6b92ffaSHans Petter Selasky 	uint8_t			responder_resources;
131*d6b92ffaSHans Petter Selasky 	uint8_t			initiator_depth;
132*d6b92ffaSHans Petter Selasky 	unsigned int		target_ack_delay:5;
133*d6b92ffaSHans Petter Selasky 	unsigned int		failover_accepted:2;
134*d6b92ffaSHans Petter Selasky 	unsigned int		flow_control:1;
135*d6b92ffaSHans Petter Selasky 	unsigned int		rnr_retry_count:3;
136*d6b92ffaSHans Petter Selasky 	unsigned int		srq:1;
137*d6b92ffaSHans Petter Selasky };
138*d6b92ffaSHans Petter Selasky 
139*d6b92ffaSHans Petter Selasky enum ib_cm_rej_reason {
140*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_NO_QP				= 1,
141*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_NO_EEC			= 2,
142*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_NO_RESOURCES			= 3,
143*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_TIMEOUT			= 4,
144*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_UNSUPPORTED			= 5,
145*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_COMM_ID		= 6,
146*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_COMM_INSTANCE		= 7,
147*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_SERVICE_ID		= 8,
148*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_TRANSPORT_TYPE	= 9,
149*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_STALE_CONN			= 10,
150*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_RDC_NOT_EXIST			= 11,
151*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_GID			= 12,
152*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_LID			= 13,
153*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_SL			= 14,
154*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_TRAFFIC_CLASS		= 15,
155*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_HOP_LIMIT		= 16,
156*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_PACKET_RATE		= 17,
157*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_GID		= 18,
158*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_LID		= 19,
159*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_SL		= 20,
160*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS	= 21,
161*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_HOP_LIMIT		= 22,
162*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_PACKET_RATE	= 23,
163*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_PORT_CM_REDIRECT		= 24,
164*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_PORT_REDIRECT			= 25,
165*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_MTU			= 26,
166*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES	= 27,
167*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_CONSUMER_DEFINED		= 28,
168*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_RNR_RETRY		= 29,
169*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID	= 30,
170*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_CLASS_VERSION		= 31,
171*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_FLOW_LABEL		= 32,
172*d6b92ffaSHans Petter Selasky 	IB_CM_REJ_INVALID_ALT_FLOW_LABEL	= 33
173*d6b92ffaSHans Petter Selasky };
174*d6b92ffaSHans Petter Selasky 
175*d6b92ffaSHans Petter Selasky struct ib_cm_rej_event_param {
176*d6b92ffaSHans Petter Selasky 	enum ib_cm_rej_reason	reason;
177*d6b92ffaSHans Petter Selasky 	void			*ari;
178*d6b92ffaSHans Petter Selasky 	uint8_t			ari_length;
179*d6b92ffaSHans Petter Selasky };
180*d6b92ffaSHans Petter Selasky 
181*d6b92ffaSHans Petter Selasky struct ib_cm_mra_event_param {
182*d6b92ffaSHans Petter Selasky 	uint8_t	service_timeout;
183*d6b92ffaSHans Petter Selasky };
184*d6b92ffaSHans Petter Selasky 
185*d6b92ffaSHans Petter Selasky struct ib_cm_lap_event_param {
186*d6b92ffaSHans Petter Selasky 	struct ibv_sa_path_rec	*alternate_path;
187*d6b92ffaSHans Petter Selasky };
188*d6b92ffaSHans Petter Selasky 
189*d6b92ffaSHans Petter Selasky enum ib_cm_apr_status {
190*d6b92ffaSHans Petter Selasky 	IB_CM_APR_SUCCESS,
191*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_COMM_ID,
192*d6b92ffaSHans Petter Selasky 	IB_CM_APR_UNSUPPORTED,
193*d6b92ffaSHans Petter Selasky 	IB_CM_APR_REJECT,
194*d6b92ffaSHans Petter Selasky 	IB_CM_APR_REDIRECT,
195*d6b92ffaSHans Petter Selasky 	IB_CM_APR_IS_CURRENT,
196*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_QPN_EECN,
197*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_LID,
198*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_GID,
199*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_FLOW_LABEL,
200*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_TCLASS,
201*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_HOP_LIMIT,
202*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_PACKET_RATE,
203*d6b92ffaSHans Petter Selasky 	IB_CM_APR_INVALID_SL
204*d6b92ffaSHans Petter Selasky };
205*d6b92ffaSHans Petter Selasky 
206*d6b92ffaSHans Petter Selasky struct ib_cm_apr_event_param {
207*d6b92ffaSHans Petter Selasky 	enum ib_cm_apr_status	ap_status;
208*d6b92ffaSHans Petter Selasky 	void			*apr_info;
209*d6b92ffaSHans Petter Selasky 	uint8_t			info_len;
210*d6b92ffaSHans Petter Selasky };
211*d6b92ffaSHans Petter Selasky 
212*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_req_event_param {
213*d6b92ffaSHans Petter Selasky 	struct ib_cm_id	 *listen_id;
214*d6b92ffaSHans Petter Selasky 	uint8_t		  port;
215*d6b92ffaSHans Petter Selasky 	uint16_t          pkey;
216*d6b92ffaSHans Petter Selasky };
217*d6b92ffaSHans Petter Selasky 
218*d6b92ffaSHans Petter Selasky enum ib_cm_sidr_status {
219*d6b92ffaSHans Petter Selasky 	IB_SIDR_SUCCESS,
220*d6b92ffaSHans Petter Selasky 	IB_SIDR_UNSUPPORTED,
221*d6b92ffaSHans Petter Selasky 	IB_SIDR_REJECT,
222*d6b92ffaSHans Petter Selasky 	IB_SIDR_NO_QP,
223*d6b92ffaSHans Petter Selasky 	IB_SIDR_REDIRECT,
224*d6b92ffaSHans Petter Selasky 	IB_SIDR_UNSUPPORTED_VERSION
225*d6b92ffaSHans Petter Selasky };
226*d6b92ffaSHans Petter Selasky 
227*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_rep_event_param {
228*d6b92ffaSHans Petter Selasky 	enum ib_cm_sidr_status	status;
229*d6b92ffaSHans Petter Selasky 	uint32_t		qkey;
230*d6b92ffaSHans Petter Selasky 	uint32_t		qpn;
231*d6b92ffaSHans Petter Selasky 	void			*info;
232*d6b92ffaSHans Petter Selasky 	uint8_t			info_len;
233*d6b92ffaSHans Petter Selasky };
234*d6b92ffaSHans Petter Selasky 
235*d6b92ffaSHans Petter Selasky struct ib_cm_event {
236*d6b92ffaSHans Petter Selasky 	struct ib_cm_id	      *cm_id;
237*d6b92ffaSHans Petter Selasky 	enum ib_cm_event_type event;
238*d6b92ffaSHans Petter Selasky 	union {
239*d6b92ffaSHans Petter Selasky 		struct ib_cm_req_event_param	req_rcvd;
240*d6b92ffaSHans Petter Selasky 		struct ib_cm_rep_event_param	rep_rcvd;
241*d6b92ffaSHans Petter Selasky 		/* No data for RTU received events. */
242*d6b92ffaSHans Petter Selasky 		struct ib_cm_rej_event_param	rej_rcvd;
243*d6b92ffaSHans Petter Selasky 		struct ib_cm_mra_event_param	mra_rcvd;
244*d6b92ffaSHans Petter Selasky 		struct ib_cm_lap_event_param	lap_rcvd;
245*d6b92ffaSHans Petter Selasky 		struct ib_cm_apr_event_param	apr_rcvd;
246*d6b92ffaSHans Petter Selasky 		/* No data for DREQ/DREP received events. */
247*d6b92ffaSHans Petter Selasky 		struct ib_cm_sidr_req_event_param sidr_req_rcvd;
248*d6b92ffaSHans Petter Selasky 		struct ib_cm_sidr_rep_event_param sidr_rep_rcvd;
249*d6b92ffaSHans Petter Selasky 		enum ibv_wc_status		send_status;
250*d6b92ffaSHans Petter Selasky 	} param;
251*d6b92ffaSHans Petter Selasky 
252*d6b92ffaSHans Petter Selasky 	void			*private_data;
253*d6b92ffaSHans Petter Selasky };
254*d6b92ffaSHans Petter Selasky 
255*d6b92ffaSHans Petter Selasky /**
256*d6b92ffaSHans Petter Selasky  * ib_cm_get_event - Retrieves the next pending communications event,
257*d6b92ffaSHans Petter Selasky  *   if no event is pending waits for an event.
258*d6b92ffaSHans Petter Selasky  * @device: CM device to retrieve the event.
259*d6b92ffaSHans Petter Selasky  * @event: Allocated information about the next communication event.
260*d6b92ffaSHans Petter Selasky  *    Event should be freed using ib_cm_ack_event()
261*d6b92ffaSHans Petter Selasky  *
262*d6b92ffaSHans Petter Selasky  * IB_CM_REQ_RECEIVED and IB_CM_SIDR_REQ_RECEIVED communication events
263*d6b92ffaSHans Petter Selasky  * generated as a result of listen requests result in the allocation of a
264*d6b92ffaSHans Petter Selasky  * new @cm_id.
265*d6b92ffaSHans Petter Selasky  * Clients are responsible for destroying the new @cm_id.  For peer-to-peer
266*d6b92ffaSHans Petter Selasky  * IB_CM_REQ_RECEIVED and all other events, the returned @cm_id corresponds
267*d6b92ffaSHans Petter Selasky  * to a user's existing communication identifier.
268*d6b92ffaSHans Petter Selasky  */
269*d6b92ffaSHans Petter Selasky int ib_cm_get_event(struct ib_cm_device *device, struct ib_cm_event **event);
270*d6b92ffaSHans Petter Selasky 
271*d6b92ffaSHans Petter Selasky /**
272*d6b92ffaSHans Petter Selasky  * ib_cm_ack_event - Free a communications event.
273*d6b92ffaSHans Petter Selasky  * @event: Event to be released.
274*d6b92ffaSHans Petter Selasky  *
275*d6b92ffaSHans Petter Selasky  * All events which are allocated by ib_cm_get_event() must be released,
276*d6b92ffaSHans Petter Selasky  * there should be a one-to-one correspondence between successful gets
277*d6b92ffaSHans Petter Selasky  * and puts.
278*d6b92ffaSHans Petter Selasky  */
279*d6b92ffaSHans Petter Selasky int ib_cm_ack_event(struct ib_cm_event *event);
280*d6b92ffaSHans Petter Selasky 
281*d6b92ffaSHans Petter Selasky /**
282*d6b92ffaSHans Petter Selasky  * ib_cm_open_device - Returns the device the CM uses to submit requests
283*d6b92ffaSHans Petter Selasky  *   and retrieve events, corresponding to the specified verbs device.
284*d6b92ffaSHans Petter Selasky  *
285*d6b92ffaSHans Petter Selasky  * The CM device contains the file descriptor that the CM uses to
286*d6b92ffaSHans Petter Selasky  * communicate with the kernel CM component.  The primary use of the
287*d6b92ffaSHans Petter Selasky  * file descriptor is to test for CM readiness events. When the CM
288*d6b92ffaSHans Petter Selasky  * becomes ready to READ there is a pending event ready, and a subsequent
289*d6b92ffaSHans Petter Selasky  * call to ib_cm_get_event will not block.
290*d6b92ffaSHans Petter Selasky  * Note: The user should not read or write directly to the CM file
291*d6b92ffaSHans Petter Selasky  *       descriptor, it will likely result in an error or unexpected
292*d6b92ffaSHans Petter Selasky  *       results.
293*d6b92ffaSHans Petter Selasky  */
294*d6b92ffaSHans Petter Selasky struct ib_cm_device* ib_cm_open_device(struct ibv_context *device_context);
295*d6b92ffaSHans Petter Selasky 
296*d6b92ffaSHans Petter Selasky /**
297*d6b92ffaSHans Petter Selasky  * ib_cm_close_device - Close a CM device.
298*d6b92ffaSHans Petter Selasky  * @device: Device to close.
299*d6b92ffaSHans Petter Selasky  */
300*d6b92ffaSHans Petter Selasky void ib_cm_close_device(struct ib_cm_device *device);
301*d6b92ffaSHans Petter Selasky 
302*d6b92ffaSHans Petter Selasky /**
303*d6b92ffaSHans Petter Selasky  * ib_cm_create_id - Allocate a communication identifier.
304*d6b92ffaSHans Petter Selasky  *
305*d6b92ffaSHans Petter Selasky  * Communication identifiers are used to track connection states, service
306*d6b92ffaSHans Petter Selasky  * ID resolution requests, and listen requests.
307*d6b92ffaSHans Petter Selasky  */
308*d6b92ffaSHans Petter Selasky int ib_cm_create_id(struct ib_cm_device *device,
309*d6b92ffaSHans Petter Selasky 		    struct ib_cm_id **cm_id, void *context);
310*d6b92ffaSHans Petter Selasky 
311*d6b92ffaSHans Petter Selasky /**
312*d6b92ffaSHans Petter Selasky  * ib_cm_destroy_id - Destroy a connection identifier.
313*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier to destroy.
314*d6b92ffaSHans Petter Selasky  */
315*d6b92ffaSHans Petter Selasky int ib_cm_destroy_id(struct ib_cm_id *cm_id);
316*d6b92ffaSHans Petter Selasky 
317*d6b92ffaSHans Petter Selasky struct ib_cm_attr_param {
318*d6b92ffaSHans Petter Selasky 	__be64			service_id;
319*d6b92ffaSHans Petter Selasky 	__be64			service_mask;
320*d6b92ffaSHans Petter Selasky 	__be32			local_id;
321*d6b92ffaSHans Petter Selasky 	__be32			remote_id;
322*d6b92ffaSHans Petter Selasky };
323*d6b92ffaSHans Petter Selasky 
324*d6b92ffaSHans Petter Selasky /**
325*d6b92ffaSHans Petter Selasky  * ib_cm_attr_id - Get connection identifier attributes.
326*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier to retrieve attributes.
327*d6b92ffaSHans Petter Selasky  * @param: Destination of retreived parameters.
328*d6b92ffaSHans Petter Selasky  *
329*d6b92ffaSHans Petter Selasky  * Not all parameters are valid during all connection states.
330*d6b92ffaSHans Petter Selasky  */
331*d6b92ffaSHans Petter Selasky int ib_cm_attr_id(struct ib_cm_id *cm_id,
332*d6b92ffaSHans Petter Selasky 		  struct ib_cm_attr_param *param);
333*d6b92ffaSHans Petter Selasky 
334*d6b92ffaSHans Petter Selasky #define IB_CM_ASSIGN_SERVICE_ID_MASK htobe64(0xFF00000000000000ULL)
335*d6b92ffaSHans Petter Selasky #define IB_CM_ASSIGN_SERVICE_ID      htobe64(0x0200000000000000ULL)
336*d6b92ffaSHans Petter Selasky 
337*d6b92ffaSHans Petter Selasky /**
338*d6b92ffaSHans Petter Selasky  * ib_cm_listen - Initiates listening on the specified service ID for
339*d6b92ffaSHans Petter Selasky  *   connection and service ID resolution requests.
340*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the listen request.
341*d6b92ffaSHans Petter Selasky  * @service_id: Service identifier matched against incoming connection
342*d6b92ffaSHans Petter Selasky  *   and service ID resolution requests.  The service ID should be specified
343*d6b92ffaSHans Petter Selasky  *   network-byte order.
344*d6b92ffaSHans Petter Selasky  * @service_mask: Mask applied to service ID used to listen across a
345*d6b92ffaSHans Petter Selasky  *   range of service IDs.  If set to 0, the service ID is matched
346*d6b92ffaSHans Petter Selasky  *   exactly.
347*d6b92ffaSHans Petter Selasky  */
348*d6b92ffaSHans Petter Selasky int ib_cm_listen(struct ib_cm_id *cm_id,
349*d6b92ffaSHans Petter Selasky 		 __be64 service_id,
350*d6b92ffaSHans Petter Selasky 		 __be64 service_mask);
351*d6b92ffaSHans Petter Selasky 
352*d6b92ffaSHans Petter Selasky struct ib_cm_req_param {
353*d6b92ffaSHans Petter Selasky 	struct ibv_sa_path_rec	*primary_path;
354*d6b92ffaSHans Petter Selasky 	struct ibv_sa_path_rec	*alternate_path;
355*d6b92ffaSHans Petter Selasky 	__be64			service_id;
356*d6b92ffaSHans Petter Selasky 	uint32_t		qp_num;
357*d6b92ffaSHans Petter Selasky 	enum ibv_qp_type	qp_type;
358*d6b92ffaSHans Petter Selasky 	uint32_t		starting_psn;
359*d6b92ffaSHans Petter Selasky 	void			*private_data;
360*d6b92ffaSHans Petter Selasky 	uint8_t			private_data_len;
361*d6b92ffaSHans Petter Selasky 	uint8_t			peer_to_peer;
362*d6b92ffaSHans Petter Selasky 	uint8_t			responder_resources;
363*d6b92ffaSHans Petter Selasky 	uint8_t			initiator_depth;
364*d6b92ffaSHans Petter Selasky 	uint8_t			remote_cm_response_timeout;
365*d6b92ffaSHans Petter Selasky 	uint8_t			flow_control;
366*d6b92ffaSHans Petter Selasky 	uint8_t			local_cm_response_timeout;
367*d6b92ffaSHans Petter Selasky 	uint8_t			retry_count;
368*d6b92ffaSHans Petter Selasky 	uint8_t			rnr_retry_count;
369*d6b92ffaSHans Petter Selasky 	uint8_t			max_cm_retries;
370*d6b92ffaSHans Petter Selasky 	uint8_t			srq;
371*d6b92ffaSHans Petter Selasky };
372*d6b92ffaSHans Petter Selasky 
373*d6b92ffaSHans Petter Selasky /**
374*d6b92ffaSHans Petter Selasky  * ib_cm_send_req - Sends a connection request to the remote node.
375*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier that will be associated with the
376*d6b92ffaSHans Petter Selasky  *   connection request.
377*d6b92ffaSHans Petter Selasky  * @param: Connection request information needed to establish the
378*d6b92ffaSHans Petter Selasky  *   connection.
379*d6b92ffaSHans Petter Selasky  */
380*d6b92ffaSHans Petter Selasky int ib_cm_send_req(struct ib_cm_id *cm_id,
381*d6b92ffaSHans Petter Selasky 		   struct ib_cm_req_param *param);
382*d6b92ffaSHans Petter Selasky 
383*d6b92ffaSHans Petter Selasky struct ib_cm_rep_param {
384*d6b92ffaSHans Petter Selasky 	uint32_t	qp_num;
385*d6b92ffaSHans Petter Selasky 	uint32_t	starting_psn;
386*d6b92ffaSHans Petter Selasky 	void		*private_data;
387*d6b92ffaSHans Petter Selasky 	uint8_t		private_data_len;
388*d6b92ffaSHans Petter Selasky 	uint8_t		responder_resources;
389*d6b92ffaSHans Petter Selasky 	uint8_t		initiator_depth;
390*d6b92ffaSHans Petter Selasky 	uint8_t		target_ack_delay;
391*d6b92ffaSHans Petter Selasky 	uint8_t		failover_accepted;
392*d6b92ffaSHans Petter Selasky 	uint8_t		flow_control;
393*d6b92ffaSHans Petter Selasky 	uint8_t		rnr_retry_count;
394*d6b92ffaSHans Petter Selasky 	uint8_t		srq;
395*d6b92ffaSHans Petter Selasky };
396*d6b92ffaSHans Petter Selasky 
397*d6b92ffaSHans Petter Selasky /**
398*d6b92ffaSHans Petter Selasky  * ib_cm_send_rep - Sends a connection reply in response to a connection
399*d6b92ffaSHans Petter Selasky  *   request.
400*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier that will be associated with the
401*d6b92ffaSHans Petter Selasky  *   connection request.
402*d6b92ffaSHans Petter Selasky  * @param: Connection reply information needed to establish the
403*d6b92ffaSHans Petter Selasky  *   connection.
404*d6b92ffaSHans Petter Selasky  */
405*d6b92ffaSHans Petter Selasky int ib_cm_send_rep(struct ib_cm_id *cm_id,
406*d6b92ffaSHans Petter Selasky 		   struct ib_cm_rep_param *param);
407*d6b92ffaSHans Petter Selasky 
408*d6b92ffaSHans Petter Selasky /**
409*d6b92ffaSHans Petter Selasky  * ib_cm_send_rtu - Sends a connection ready to use message in response
410*d6b92ffaSHans Petter Selasky  *   to a connection reply message.
411*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the connection request.
412*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
413*d6b92ffaSHans Petter Selasky  *   ready to use message.
414*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
415*d6b92ffaSHans Petter Selasky  */
416*d6b92ffaSHans Petter Selasky int ib_cm_send_rtu(struct ib_cm_id *cm_id,
417*d6b92ffaSHans Petter Selasky 		   void *private_data,
418*d6b92ffaSHans Petter Selasky 		   uint8_t private_data_len);
419*d6b92ffaSHans Petter Selasky 
420*d6b92ffaSHans Petter Selasky /**
421*d6b92ffaSHans Petter Selasky  * ib_cm_send_dreq - Sends a disconnection request for an existing
422*d6b92ffaSHans Petter Selasky  *   connection.
423*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the connection being
424*d6b92ffaSHans Petter Selasky  *   released.
425*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
426*d6b92ffaSHans Petter Selasky  *   disconnection request message.
427*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
428*d6b92ffaSHans Petter Selasky  */
429*d6b92ffaSHans Petter Selasky int ib_cm_send_dreq(struct ib_cm_id *cm_id,
430*d6b92ffaSHans Petter Selasky 		    void *private_data,
431*d6b92ffaSHans Petter Selasky 		    uint8_t private_data_len);
432*d6b92ffaSHans Petter Selasky 
433*d6b92ffaSHans Petter Selasky /**
434*d6b92ffaSHans Petter Selasky  * ib_cm_send_drep - Sends a disconnection reply to a disconnection request.
435*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the connection being
436*d6b92ffaSHans Petter Selasky  *   released.
437*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
438*d6b92ffaSHans Petter Selasky  *   disconnection reply message.
439*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
440*d6b92ffaSHans Petter Selasky  */
441*d6b92ffaSHans Petter Selasky int ib_cm_send_drep(struct ib_cm_id *cm_id,
442*d6b92ffaSHans Petter Selasky 		    void *private_data,
443*d6b92ffaSHans Petter Selasky 		    uint8_t private_data_len);
444*d6b92ffaSHans Petter Selasky 
445*d6b92ffaSHans Petter Selasky /**
446*d6b92ffaSHans Petter Selasky  * ib_cm_notify - Notifies the CM of an event reported to the consumer.
447*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier to transition to established.
448*d6b92ffaSHans Petter Selasky  * @event: Type of event.
449*d6b92ffaSHans Petter Selasky  *
450*d6b92ffaSHans Petter Selasky  * This routine should be invoked by users to notify the CM of relevant
451*d6b92ffaSHans Petter Selasky  * communication events.  Events that should be reported to the CM and
452*d6b92ffaSHans Petter Selasky  * when to report them are:
453*d6b92ffaSHans Petter Selasky  *
454*d6b92ffaSHans Petter Selasky  * IBV_EVENT_COMM_EST - Used when a message is received on a connected
455*d6b92ffaSHans Petter Selasky  *    QP before an RTU has been received.
456*d6b92ffaSHans Petter Selasky  * IBV_EVENT_PATH_MIG - Notifies the CM that the connection has failed over
457*d6b92ffaSHans Petter Selasky  *   to the alternate path.
458*d6b92ffaSHans Petter Selasky  */
459*d6b92ffaSHans Petter Selasky int ib_cm_notify(struct ib_cm_id *cm_id, enum ibv_event_type event);
460*d6b92ffaSHans Petter Selasky 
461*d6b92ffaSHans Petter Selasky /**
462*d6b92ffaSHans Petter Selasky  * ib_cm_send_rej - Sends a connection rejection message to the
463*d6b92ffaSHans Petter Selasky  *   remote node.
464*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the connection being
465*d6b92ffaSHans Petter Selasky  *   rejected.
466*d6b92ffaSHans Petter Selasky  * @reason: Reason for the connection request rejection.
467*d6b92ffaSHans Petter Selasky  * @ari: Optional additional rejection information.
468*d6b92ffaSHans Petter Selasky  * @ari_length: Size of the additional rejection information, in bytes.
469*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
470*d6b92ffaSHans Petter Selasky  *   rejection message.
471*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
472*d6b92ffaSHans Petter Selasky  */
473*d6b92ffaSHans Petter Selasky int ib_cm_send_rej(struct ib_cm_id *cm_id,
474*d6b92ffaSHans Petter Selasky 		   enum ib_cm_rej_reason reason,
475*d6b92ffaSHans Petter Selasky 		   void *ari,
476*d6b92ffaSHans Petter Selasky 		   uint8_t ari_length,
477*d6b92ffaSHans Petter Selasky 		   void *private_data,
478*d6b92ffaSHans Petter Selasky 		   uint8_t private_data_len);
479*d6b92ffaSHans Petter Selasky 
480*d6b92ffaSHans Petter Selasky /**
481*d6b92ffaSHans Petter Selasky  * ib_cm_send_mra - Sends a message receipt acknowledgement to a connection
482*d6b92ffaSHans Petter Selasky  *   message.
483*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the connection message.
484*d6b92ffaSHans Petter Selasky  * @service_timeout: The maximum time required for the sender to reply to
485*d6b92ffaSHans Petter Selasky  *   to the connection message.
486*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
487*d6b92ffaSHans Petter Selasky  *   message receipt acknowledgement.
488*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
489*d6b92ffaSHans Petter Selasky  */
490*d6b92ffaSHans Petter Selasky int ib_cm_send_mra(struct ib_cm_id *cm_id,
491*d6b92ffaSHans Petter Selasky 		   uint8_t service_timeout,
492*d6b92ffaSHans Petter Selasky 		   void *private_data,
493*d6b92ffaSHans Petter Selasky 		   uint8_t private_data_len);
494*d6b92ffaSHans Petter Selasky 
495*d6b92ffaSHans Petter Selasky /**
496*d6b92ffaSHans Petter Selasky  * ib_cm_send_lap - Sends a load alternate path request.
497*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the load alternate path
498*d6b92ffaSHans Petter Selasky  *   message.
499*d6b92ffaSHans Petter Selasky  * @alternate_path: A path record that identifies the alternate path to
500*d6b92ffaSHans Petter Selasky  *   load.
501*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
502*d6b92ffaSHans Petter Selasky  *   load alternate path message.
503*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
504*d6b92ffaSHans Petter Selasky  */
505*d6b92ffaSHans Petter Selasky int ib_cm_send_lap(struct ib_cm_id *cm_id,
506*d6b92ffaSHans Petter Selasky 		   struct ibv_sa_path_rec *alternate_path,
507*d6b92ffaSHans Petter Selasky 		   void *private_data,
508*d6b92ffaSHans Petter Selasky 		   uint8_t private_data_len);
509*d6b92ffaSHans Petter Selasky 
510*d6b92ffaSHans Petter Selasky /**
511*d6b92ffaSHans Petter Selasky  * ib_cm_init_qp_attr - Initializes the QP attributes for use in transitioning
512*d6b92ffaSHans Petter Selasky  *   to a specified QP state.
513*d6b92ffaSHans Petter Selasky  * @cm_id: Communication identifier associated with the QP attributes to
514*d6b92ffaSHans Petter Selasky  *   initialize.
515*d6b92ffaSHans Petter Selasky  * @qp_attr: On input, specifies the desired QP state.  On output, the
516*d6b92ffaSHans Petter Selasky  *   mandatory and desired optional attributes will be set in order to
517*d6b92ffaSHans Petter Selasky  *   modify the QP to the specified state.
518*d6b92ffaSHans Petter Selasky  * @qp_attr_mask: The QP attribute mask that may be used to transition the
519*d6b92ffaSHans Petter Selasky  *   QP to the specified state.
520*d6b92ffaSHans Petter Selasky  *
521*d6b92ffaSHans Petter Selasky  * Users must set the @qp_attr->qp_state to the desired QP state.  This call
522*d6b92ffaSHans Petter Selasky  * will set all required attributes for the given transition, along with
523*d6b92ffaSHans Petter Selasky  * known optional attributes.  Users may override the attributes returned from
524*d6b92ffaSHans Petter Selasky  * this call before calling ib_modify_qp.
525*d6b92ffaSHans Petter Selasky  */
526*d6b92ffaSHans Petter Selasky int ib_cm_init_qp_attr(struct ib_cm_id *cm_id,
527*d6b92ffaSHans Petter Selasky 		       struct ibv_qp_attr *qp_attr,
528*d6b92ffaSHans Petter Selasky 		       int *qp_attr_mask);
529*d6b92ffaSHans Petter Selasky 
530*d6b92ffaSHans Petter Selasky /**
531*d6b92ffaSHans Petter Selasky  * ib_cm_send_apr - Sends an alternate path response message in response to
532*d6b92ffaSHans Petter Selasky  *   a load alternate path request.
533*d6b92ffaSHans Petter Selasky  * @cm_id: Connection identifier associated with the alternate path response.
534*d6b92ffaSHans Petter Selasky  * @status: Reply status sent with the alternate path response.
535*d6b92ffaSHans Petter Selasky  * @info: Optional additional information sent with the alternate path
536*d6b92ffaSHans Petter Selasky  *   response.
537*d6b92ffaSHans Petter Selasky  * @info_length: Size of the additional information, in bytes.
538*d6b92ffaSHans Petter Selasky  * @private_data: Optional user-defined private data sent with the
539*d6b92ffaSHans Petter Selasky  *   alternate path response message.
540*d6b92ffaSHans Petter Selasky  * @private_data_len: Size of the private data buffer, in bytes.
541*d6b92ffaSHans Petter Selasky  */
542*d6b92ffaSHans Petter Selasky int ib_cm_send_apr(struct ib_cm_id *cm_id,
543*d6b92ffaSHans Petter Selasky 		   enum ib_cm_apr_status status,
544*d6b92ffaSHans Petter Selasky 		   void *info,
545*d6b92ffaSHans Petter Selasky 		   uint8_t info_length,
546*d6b92ffaSHans Petter Selasky 		   void *private_data,
547*d6b92ffaSHans Petter Selasky 		   uint8_t private_data_len);
548*d6b92ffaSHans Petter Selasky 
549*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_req_param {
550*d6b92ffaSHans Petter Selasky 	struct ibv_sa_path_rec	*path;
551*d6b92ffaSHans Petter Selasky 	__be64			service_id;
552*d6b92ffaSHans Petter Selasky 	int			timeout_ms;
553*d6b92ffaSHans Petter Selasky 	void			*private_data;
554*d6b92ffaSHans Petter Selasky 	uint8_t			private_data_len;
555*d6b92ffaSHans Petter Selasky 	uint8_t			max_cm_retries;
556*d6b92ffaSHans Petter Selasky };
557*d6b92ffaSHans Petter Selasky 
558*d6b92ffaSHans Petter Selasky /**
559*d6b92ffaSHans Petter Selasky  * ib_cm_send_sidr_req - Sends a service ID resolution request to the
560*d6b92ffaSHans Petter Selasky  *   remote node.
561*d6b92ffaSHans Petter Selasky  * @cm_id: Communication identifier that will be associated with the
562*d6b92ffaSHans Petter Selasky  *   service ID resolution request.
563*d6b92ffaSHans Petter Selasky  * @param: Service ID resolution request information.
564*d6b92ffaSHans Petter Selasky  */
565*d6b92ffaSHans Petter Selasky int ib_cm_send_sidr_req(struct ib_cm_id *cm_id,
566*d6b92ffaSHans Petter Selasky 			struct ib_cm_sidr_req_param *param);
567*d6b92ffaSHans Petter Selasky 
568*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_rep_param {
569*d6b92ffaSHans Petter Selasky 	uint32_t		qp_num;
570*d6b92ffaSHans Petter Selasky 	uint32_t		qkey;
571*d6b92ffaSHans Petter Selasky 	enum ib_cm_sidr_status	status;
572*d6b92ffaSHans Petter Selasky 	void			*info;
573*d6b92ffaSHans Petter Selasky 	uint8_t			info_length;
574*d6b92ffaSHans Petter Selasky 	void			*private_data;
575*d6b92ffaSHans Petter Selasky 	uint8_t			private_data_len;
576*d6b92ffaSHans Petter Selasky };
577*d6b92ffaSHans Petter Selasky 
578*d6b92ffaSHans Petter Selasky /**
579*d6b92ffaSHans Petter Selasky  * ib_cm_send_sidr_rep - Sends a service ID resolution reply to the
580*d6b92ffaSHans Petter Selasky  *   remote node.
581*d6b92ffaSHans Petter Selasky  * @cm_id: Communication identifier associated with the received service ID
582*d6b92ffaSHans Petter Selasky  *   resolution request.
583*d6b92ffaSHans Petter Selasky  * @param: Service ID resolution reply information.
584*d6b92ffaSHans Petter Selasky  */
585*d6b92ffaSHans Petter Selasky int ib_cm_send_sidr_rep(struct ib_cm_id *cm_id,
586*d6b92ffaSHans Petter Selasky 			struct ib_cm_sidr_rep_param *param);
587*d6b92ffaSHans Petter Selasky 
588*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
589*d6b92ffaSHans Petter Selasky }
590*d6b92ffaSHans Petter Selasky #endif
591*d6b92ffaSHans Petter Selasky 
592*d6b92ffaSHans Petter Selasky #endif /* CM_H */
593