Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/rdma/rdma_cm.h
10817 views
1
/*
2
* Copyright (c) 2005 Voltaire Inc. All rights reserved.
3
* Copyright (c) 2005 Intel Corporation. All rights reserved.
4
*
5
* This software is available to you under a choice of one of two
6
* licenses. You may choose to be licensed under the terms of the GNU
7
* General Public License (GPL) Version 2, available from the file
8
* COPYING in the main directory of this source tree, or the
9
* OpenIB.org BSD license below:
10
*
11
* Redistribution and use in source and binary forms, with or
12
* without modification, are permitted provided that the following
13
* conditions are met:
14
*
15
* - Redistributions of source code must retain the above
16
* copyright notice, this list of conditions and the following
17
* disclaimer.
18
*
19
* - Redistributions in binary form must reproduce the above
20
* copyright notice, this list of conditions and the following
21
* disclaimer in the documentation and/or other materials
22
* provided with the distribution.
23
*
24
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
* SOFTWARE.
32
*/
33
34
#if !defined(RDMA_CM_H)
35
#define RDMA_CM_H
36
37
#include <linux/socket.h>
38
#include <linux/in6.h>
39
#include <rdma/ib_addr.h>
40
#include <rdma/ib_sa.h>
41
42
/*
43
* Upon receiving a device removal event, users must destroy the associated
44
* RDMA identifier and release all resources allocated with the device.
45
*/
46
enum rdma_cm_event_type {
47
RDMA_CM_EVENT_ADDR_RESOLVED,
48
RDMA_CM_EVENT_ADDR_ERROR,
49
RDMA_CM_EVENT_ROUTE_RESOLVED,
50
RDMA_CM_EVENT_ROUTE_ERROR,
51
RDMA_CM_EVENT_CONNECT_REQUEST,
52
RDMA_CM_EVENT_CONNECT_RESPONSE,
53
RDMA_CM_EVENT_CONNECT_ERROR,
54
RDMA_CM_EVENT_UNREACHABLE,
55
RDMA_CM_EVENT_REJECTED,
56
RDMA_CM_EVENT_ESTABLISHED,
57
RDMA_CM_EVENT_DISCONNECTED,
58
RDMA_CM_EVENT_DEVICE_REMOVAL,
59
RDMA_CM_EVENT_MULTICAST_JOIN,
60
RDMA_CM_EVENT_MULTICAST_ERROR,
61
RDMA_CM_EVENT_ADDR_CHANGE,
62
RDMA_CM_EVENT_TIMEWAIT_EXIT
63
};
64
65
enum rdma_port_space {
66
RDMA_PS_SDP = 0x0001,
67
RDMA_PS_IPOIB = 0x0002,
68
RDMA_PS_TCP = 0x0106,
69
RDMA_PS_UDP = 0x0111,
70
};
71
72
struct rdma_addr {
73
struct sockaddr_storage src_addr;
74
struct sockaddr_storage dst_addr;
75
struct rdma_dev_addr dev_addr;
76
};
77
78
struct rdma_route {
79
struct rdma_addr addr;
80
struct ib_sa_path_rec *path_rec;
81
int num_paths;
82
};
83
84
struct rdma_conn_param {
85
const void *private_data;
86
u8 private_data_len;
87
u8 responder_resources;
88
u8 initiator_depth;
89
u8 flow_control;
90
u8 retry_count; /* ignored when accepting */
91
u8 rnr_retry_count;
92
/* Fields below ignored if a QP is created on the rdma_cm_id. */
93
u8 srq;
94
u32 qp_num;
95
};
96
97
struct rdma_ud_param {
98
const void *private_data;
99
u8 private_data_len;
100
struct ib_ah_attr ah_attr;
101
u32 qp_num;
102
u32 qkey;
103
};
104
105
struct rdma_cm_event {
106
enum rdma_cm_event_type event;
107
int status;
108
union {
109
struct rdma_conn_param conn;
110
struct rdma_ud_param ud;
111
} param;
112
};
113
114
enum rdma_cm_state {
115
RDMA_CM_IDLE,
116
RDMA_CM_ADDR_QUERY,
117
RDMA_CM_ADDR_RESOLVED,
118
RDMA_CM_ROUTE_QUERY,
119
RDMA_CM_ROUTE_RESOLVED,
120
RDMA_CM_CONNECT,
121
RDMA_CM_DISCONNECT,
122
RDMA_CM_ADDR_BOUND,
123
RDMA_CM_LISTEN,
124
RDMA_CM_DEVICE_REMOVAL,
125
RDMA_CM_DESTROYING
126
};
127
128
struct rdma_cm_id;
129
130
/**
131
* rdma_cm_event_handler - Callback used to report user events.
132
*
133
* Notes: Users may not call rdma_destroy_id from this callback to destroy
134
* the passed in id, or a corresponding listen id. Returning a
135
* non-zero value from the callback will destroy the passed in id.
136
*/
137
typedef int (*rdma_cm_event_handler)(struct rdma_cm_id *id,
138
struct rdma_cm_event *event);
139
140
struct rdma_cm_id {
141
struct ib_device *device;
142
void *context;
143
struct ib_qp *qp;
144
rdma_cm_event_handler event_handler;
145
struct rdma_route route;
146
enum rdma_port_space ps;
147
enum ib_qp_type qp_type;
148
u8 port_num;
149
};
150
151
/**
152
* rdma_create_id - Create an RDMA identifier.
153
*
154
* @event_handler: User callback invoked to report events associated with the
155
* returned rdma_id.
156
* @context: User specified context associated with the id.
157
* @ps: RDMA port space.
158
* @qp_type: type of queue pair associated with the id.
159
*/
160
struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler,
161
void *context, enum rdma_port_space ps,
162
enum ib_qp_type qp_type);
163
164
/**
165
* rdma_destroy_id - Destroys an RDMA identifier.
166
*
167
* @id: RDMA identifier.
168
*
169
* Note: calling this function has the effect of canceling in-flight
170
* asynchronous operations associated with the id.
171
*/
172
void rdma_destroy_id(struct rdma_cm_id *id);
173
174
/**
175
* rdma_bind_addr - Bind an RDMA identifier to a source address and
176
* associated RDMA device, if needed.
177
*
178
* @id: RDMA identifier.
179
* @addr: Local address information. Wildcard values are permitted.
180
*
181
* This associates a source address with the RDMA identifier before calling
182
* rdma_listen. If a specific local address is given, the RDMA identifier will
183
* be bound to a local RDMA device.
184
*/
185
int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr);
186
187
/**
188
* rdma_resolve_addr - Resolve destination and optional source addresses
189
* from IP addresses to an RDMA address. If successful, the specified
190
* rdma_cm_id will be bound to a local device.
191
*
192
* @id: RDMA identifier.
193
* @src_addr: Source address information. This parameter may be NULL.
194
* @dst_addr: Destination address information.
195
* @timeout_ms: Time to wait for resolution to complete.
196
*/
197
int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
198
struct sockaddr *dst_addr, int timeout_ms);
199
200
/**
201
* rdma_resolve_route - Resolve the RDMA address bound to the RDMA identifier
202
* into route information needed to establish a connection.
203
*
204
* This is called on the client side of a connection.
205
* Users must have first called rdma_resolve_addr to resolve a dst_addr
206
* into an RDMA address before calling this routine.
207
*/
208
int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms);
209
210
/**
211
* rdma_create_qp - Allocate a QP and associate it with the specified RDMA
212
* identifier.
213
*
214
* QPs allocated to an rdma_cm_id will automatically be transitioned by the CMA
215
* through their states.
216
*/
217
int rdma_create_qp(struct rdma_cm_id *id, struct ib_pd *pd,
218
struct ib_qp_init_attr *qp_init_attr);
219
220
/**
221
* rdma_destroy_qp - Deallocate the QP associated with the specified RDMA
222
* identifier.
223
*
224
* Users must destroy any QP associated with an RDMA identifier before
225
* destroying the RDMA ID.
226
*/
227
void rdma_destroy_qp(struct rdma_cm_id *id);
228
229
/**
230
* rdma_init_qp_attr - Initializes the QP attributes for use in transitioning
231
* to a specified QP state.
232
* @id: Communication identifier associated with the QP attributes to
233
* initialize.
234
* @qp_attr: On input, specifies the desired QP state. On output, the
235
* mandatory and desired optional attributes will be set in order to
236
* modify the QP to the specified state.
237
* @qp_attr_mask: The QP attribute mask that may be used to transition the
238
* QP to the specified state.
239
*
240
* Users must set the @qp_attr->qp_state to the desired QP state. This call
241
* will set all required attributes for the given transition, along with
242
* known optional attributes. Users may override the attributes returned from
243
* this call before calling ib_modify_qp.
244
*
245
* Users that wish to have their QP automatically transitioned through its
246
* states can associate a QP with the rdma_cm_id by calling rdma_create_qp().
247
*/
248
int rdma_init_qp_attr(struct rdma_cm_id *id, struct ib_qp_attr *qp_attr,
249
int *qp_attr_mask);
250
251
/**
252
* rdma_connect - Initiate an active connection request.
253
* @id: Connection identifier to connect.
254
* @conn_param: Connection information used for connected QPs.
255
*
256
* Users must have resolved a route for the rdma_cm_id to connect with
257
* by having called rdma_resolve_route before calling this routine.
258
*
259
* This call will either connect to a remote QP or obtain remote QP
260
* information for unconnected rdma_cm_id's. The actual operation is
261
* based on the rdma_cm_id's port space.
262
*/
263
int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param);
264
265
/**
266
* rdma_listen - This function is called by the passive side to
267
* listen for incoming connection requests.
268
*
269
* Users must have bound the rdma_cm_id to a local address by calling
270
* rdma_bind_addr before calling this routine.
271
*/
272
int rdma_listen(struct rdma_cm_id *id, int backlog);
273
274
/**
275
* rdma_accept - Called to accept a connection request or response.
276
* @id: Connection identifier associated with the request.
277
* @conn_param: Information needed to establish the connection. This must be
278
* provided if accepting a connection request. If accepting a connection
279
* response, this parameter must be NULL.
280
*
281
* Typically, this routine is only called by the listener to accept a connection
282
* request. It must also be called on the active side of a connection if the
283
* user is performing their own QP transitions.
284
*
285
* In the case of error, a reject message is sent to the remote side and the
286
* state of the qp associated with the id is modified to error, such that any
287
* previously posted receive buffers would be flushed.
288
*/
289
int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param);
290
291
/**
292
* rdma_notify - Notifies the RDMA CM of an asynchronous event that has
293
* occurred on the connection.
294
* @id: Connection identifier to transition to established.
295
* @event: Asynchronous event.
296
*
297
* This routine should be invoked by users to notify the CM of relevant
298
* communication events. Events that should be reported to the CM and
299
* when to report them are:
300
*
301
* IB_EVENT_COMM_EST - Used when a message is received on a connected
302
* QP before an RTU has been received.
303
*/
304
int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event);
305
306
/**
307
* rdma_reject - Called to reject a connection request or response.
308
*/
309
int rdma_reject(struct rdma_cm_id *id, const void *private_data,
310
u8 private_data_len);
311
312
/**
313
* rdma_disconnect - This function disconnects the associated QP and
314
* transitions it into the error state.
315
*/
316
int rdma_disconnect(struct rdma_cm_id *id);
317
318
/**
319
* rdma_join_multicast - Join the multicast group specified by the given
320
* address.
321
* @id: Communication identifier associated with the request.
322
* @addr: Multicast address identifying the group to join.
323
* @context: User-defined context associated with the join request, returned
324
* to the user through the private_data pointer in multicast events.
325
*/
326
int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
327
void *context);
328
329
/**
330
* rdma_leave_multicast - Leave the multicast group specified by the given
331
* address.
332
*/
333
void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr);
334
335
/**
336
* rdma_set_service_type - Set the type of service associated with a
337
* connection identifier.
338
* @id: Communication identifier to associated with service type.
339
* @tos: Type of service.
340
*
341
* The type of service is interpretted as a differentiated service
342
* field (RFC 2474). The service type should be specified before
343
* performing route resolution, as existing communication on the
344
* connection identifier may be unaffected. The type of service
345
* requested may not be supported by the network to all destinations.
346
*/
347
void rdma_set_service_type(struct rdma_cm_id *id, int tos);
348
349
/**
350
* rdma_set_reuseaddr - Allow the reuse of local addresses when binding
351
* the rdma_cm_id.
352
* @id: Communication identifier to configure.
353
* @reuse: Value indicating if the bound address is reusable.
354
*
355
* Reuse must be set before an address is bound to the id.
356
*/
357
int rdma_set_reuseaddr(struct rdma_cm_id *id, int reuse);
358
359
#endif /* RDMA_CM_H */
360
361