Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/rdma/ib_cm.h
26282 views
1
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2
/*
3
* Copyright (c) 2004, 2005 Intel Corporation. All rights reserved.
4
* Copyright (c) 2004 Topspin Corporation. All rights reserved.
5
* Copyright (c) 2004 Voltaire Corporation. All rights reserved.
6
* Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
7
* Copyright (c) 2019, Mellanox Technologies inc. All rights reserved.
8
*/
9
10
#ifndef IB_CM_H
11
#define IB_CM_H
12
13
#include <rdma/ib_mad.h>
14
#include <rdma/ib_sa.h>
15
#include <rdma/rdma_cm.h>
16
17
enum ib_cm_state {
18
IB_CM_IDLE,
19
IB_CM_LISTEN,
20
IB_CM_REQ_SENT,
21
IB_CM_REQ_RCVD,
22
IB_CM_MRA_REQ_SENT,
23
IB_CM_MRA_REQ_RCVD,
24
IB_CM_REP_SENT,
25
IB_CM_REP_RCVD,
26
IB_CM_MRA_REP_SENT,
27
IB_CM_MRA_REP_RCVD,
28
IB_CM_ESTABLISHED,
29
IB_CM_DREQ_SENT,
30
IB_CM_DREQ_RCVD,
31
IB_CM_TIMEWAIT,
32
IB_CM_SIDR_REQ_SENT,
33
IB_CM_SIDR_REQ_RCVD
34
};
35
36
enum ib_cm_lap_state {
37
IB_CM_LAP_UNINIT,
38
IB_CM_LAP_IDLE,
39
IB_CM_LAP_SENT,
40
IB_CM_LAP_RCVD,
41
IB_CM_MRA_LAP_SENT,
42
IB_CM_MRA_LAP_RCVD,
43
};
44
45
enum ib_cm_event_type {
46
IB_CM_REQ_ERROR,
47
IB_CM_REQ_RECEIVED,
48
IB_CM_REP_ERROR,
49
IB_CM_REP_RECEIVED,
50
IB_CM_RTU_RECEIVED,
51
IB_CM_USER_ESTABLISHED,
52
IB_CM_DREQ_ERROR,
53
IB_CM_DREQ_RECEIVED,
54
IB_CM_DREP_RECEIVED,
55
IB_CM_TIMEWAIT_EXIT,
56
IB_CM_MRA_RECEIVED,
57
IB_CM_REJ_RECEIVED,
58
IB_CM_LAP_ERROR,
59
IB_CM_LAP_RECEIVED,
60
IB_CM_APR_RECEIVED,
61
IB_CM_SIDR_REQ_ERROR,
62
IB_CM_SIDR_REQ_RECEIVED,
63
IB_CM_SIDR_REP_RECEIVED
64
};
65
66
enum ib_cm_data_size {
67
IB_CM_REQ_PRIVATE_DATA_SIZE = 92,
68
IB_CM_MRA_PRIVATE_DATA_SIZE = 222,
69
IB_CM_REJ_PRIVATE_DATA_SIZE = 148,
70
IB_CM_REP_PRIVATE_DATA_SIZE = 196,
71
IB_CM_RTU_PRIVATE_DATA_SIZE = 224,
72
IB_CM_DREQ_PRIVATE_DATA_SIZE = 220,
73
IB_CM_DREP_PRIVATE_DATA_SIZE = 224,
74
IB_CM_REJ_ARI_LENGTH = 72,
75
IB_CM_LAP_PRIVATE_DATA_SIZE = 168,
76
IB_CM_APR_PRIVATE_DATA_SIZE = 148,
77
IB_CM_APR_INFO_LENGTH = 72,
78
IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE = 216,
79
IB_CM_SIDR_REP_PRIVATE_DATA_SIZE = 136,
80
IB_CM_SIDR_REP_INFO_LENGTH = 72,
81
};
82
83
struct ib_cm_id;
84
85
struct ib_cm_req_event_param {
86
struct ib_cm_id *listen_id;
87
88
/* P_Key that was used by the GMP's BTH header */
89
u16 bth_pkey;
90
91
u8 port;
92
93
struct sa_path_rec *primary_path;
94
struct sa_path_rec *alternate_path;
95
96
/*
97
* SGID attribute of the primary path. Currently only
98
* useful for RoCE. Alternate path GID attributes
99
* are not yet supported.
100
*/
101
const struct ib_gid_attr *ppath_sgid_attr;
102
103
__be64 remote_ca_guid;
104
u32 remote_qkey;
105
u32 remote_qpn;
106
enum ib_qp_type qp_type;
107
108
u32 starting_psn;
109
u8 responder_resources;
110
u8 initiator_depth;
111
unsigned int local_cm_response_timeout:5;
112
unsigned int flow_control:1;
113
unsigned int remote_cm_response_timeout:5;
114
unsigned int retry_count:3;
115
unsigned int rnr_retry_count:3;
116
unsigned int srq:1;
117
struct rdma_ucm_ece ece;
118
};
119
120
struct ib_cm_rep_event_param {
121
__be64 remote_ca_guid;
122
u32 remote_qkey;
123
u32 remote_qpn;
124
u32 starting_psn;
125
u8 responder_resources;
126
u8 initiator_depth;
127
unsigned int target_ack_delay:5;
128
unsigned int failover_accepted:2;
129
unsigned int flow_control:1;
130
unsigned int rnr_retry_count:3;
131
unsigned int srq:1;
132
struct rdma_ucm_ece ece;
133
};
134
135
enum ib_cm_rej_reason {
136
IB_CM_REJ_NO_QP = 1,
137
IB_CM_REJ_NO_EEC = 2,
138
IB_CM_REJ_NO_RESOURCES = 3,
139
IB_CM_REJ_TIMEOUT = 4,
140
IB_CM_REJ_UNSUPPORTED = 5,
141
IB_CM_REJ_INVALID_COMM_ID = 6,
142
IB_CM_REJ_INVALID_COMM_INSTANCE = 7,
143
IB_CM_REJ_INVALID_SERVICE_ID = 8,
144
IB_CM_REJ_INVALID_TRANSPORT_TYPE = 9,
145
IB_CM_REJ_STALE_CONN = 10,
146
IB_CM_REJ_RDC_NOT_EXIST = 11,
147
IB_CM_REJ_INVALID_GID = 12,
148
IB_CM_REJ_INVALID_LID = 13,
149
IB_CM_REJ_INVALID_SL = 14,
150
IB_CM_REJ_INVALID_TRAFFIC_CLASS = 15,
151
IB_CM_REJ_INVALID_HOP_LIMIT = 16,
152
IB_CM_REJ_INVALID_PACKET_RATE = 17,
153
IB_CM_REJ_INVALID_ALT_GID = 18,
154
IB_CM_REJ_INVALID_ALT_LID = 19,
155
IB_CM_REJ_INVALID_ALT_SL = 20,
156
IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS = 21,
157
IB_CM_REJ_INVALID_ALT_HOP_LIMIT = 22,
158
IB_CM_REJ_INVALID_ALT_PACKET_RATE = 23,
159
IB_CM_REJ_PORT_CM_REDIRECT = 24,
160
IB_CM_REJ_PORT_REDIRECT = 25,
161
IB_CM_REJ_INVALID_MTU = 26,
162
IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES = 27,
163
IB_CM_REJ_CONSUMER_DEFINED = 28,
164
IB_CM_REJ_INVALID_RNR_RETRY = 29,
165
IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID = 30,
166
IB_CM_REJ_INVALID_CLASS_VERSION = 31,
167
IB_CM_REJ_INVALID_FLOW_LABEL = 32,
168
IB_CM_REJ_INVALID_ALT_FLOW_LABEL = 33,
169
IB_CM_REJ_VENDOR_OPTION_NOT_SUPPORTED = 35,
170
};
171
172
struct ib_cm_rej_event_param {
173
enum ib_cm_rej_reason reason;
174
void *ari;
175
u8 ari_length;
176
};
177
178
struct ib_cm_mra_event_param {
179
u8 service_timeout;
180
};
181
182
struct ib_cm_lap_event_param {
183
struct sa_path_rec *alternate_path;
184
};
185
186
enum ib_cm_apr_status {
187
IB_CM_APR_SUCCESS,
188
IB_CM_APR_INVALID_COMM_ID,
189
IB_CM_APR_UNSUPPORTED,
190
IB_CM_APR_REJECT,
191
IB_CM_APR_REDIRECT,
192
IB_CM_APR_IS_CURRENT,
193
IB_CM_APR_INVALID_QPN_EECN,
194
IB_CM_APR_INVALID_LID,
195
IB_CM_APR_INVALID_GID,
196
IB_CM_APR_INVALID_FLOW_LABEL,
197
IB_CM_APR_INVALID_TCLASS,
198
IB_CM_APR_INVALID_HOP_LIMIT,
199
IB_CM_APR_INVALID_PACKET_RATE,
200
IB_CM_APR_INVALID_SL
201
};
202
203
struct ib_cm_apr_event_param {
204
enum ib_cm_apr_status ap_status;
205
void *apr_info;
206
u8 info_len;
207
};
208
209
struct ib_cm_sidr_req_event_param {
210
struct ib_cm_id *listen_id;
211
__be64 service_id;
212
213
/*
214
* SGID attribute of the request. Currently only
215
* useful for RoCE.
216
*/
217
const struct ib_gid_attr *sgid_attr;
218
/* P_Key that was used by the GMP's BTH header */
219
u16 bth_pkey;
220
u8 port;
221
u16 pkey;
222
};
223
224
enum ib_cm_sidr_status {
225
IB_SIDR_SUCCESS,
226
IB_SIDR_UNSUPPORTED,
227
IB_SIDR_REJECT,
228
IB_SIDR_NO_QP,
229
IB_SIDR_REDIRECT,
230
IB_SIDR_UNSUPPORTED_VERSION
231
};
232
233
struct ib_cm_sidr_rep_event_param {
234
enum ib_cm_sidr_status status;
235
u32 qkey;
236
u32 qpn;
237
void *info;
238
const struct ib_gid_attr *sgid_attr;
239
u8 info_len;
240
};
241
242
struct ib_cm_event {
243
enum ib_cm_event_type event;
244
union {
245
struct ib_cm_req_event_param req_rcvd;
246
struct ib_cm_rep_event_param rep_rcvd;
247
/* No data for RTU received events. */
248
struct ib_cm_rej_event_param rej_rcvd;
249
struct ib_cm_mra_event_param mra_rcvd;
250
struct ib_cm_lap_event_param lap_rcvd;
251
struct ib_cm_apr_event_param apr_rcvd;
252
/* No data for DREQ/DREP received events. */
253
struct ib_cm_sidr_req_event_param sidr_req_rcvd;
254
struct ib_cm_sidr_rep_event_param sidr_rep_rcvd;
255
enum ib_wc_status send_status;
256
} param;
257
258
void *private_data;
259
};
260
261
#define CM_REQ_ATTR_ID cpu_to_be16(0x0010)
262
#define CM_MRA_ATTR_ID cpu_to_be16(0x0011)
263
#define CM_REJ_ATTR_ID cpu_to_be16(0x0012)
264
#define CM_REP_ATTR_ID cpu_to_be16(0x0013)
265
#define CM_RTU_ATTR_ID cpu_to_be16(0x0014)
266
#define CM_DREQ_ATTR_ID cpu_to_be16(0x0015)
267
#define CM_DREP_ATTR_ID cpu_to_be16(0x0016)
268
#define CM_SIDR_REQ_ATTR_ID cpu_to_be16(0x0017)
269
#define CM_SIDR_REP_ATTR_ID cpu_to_be16(0x0018)
270
#define CM_LAP_ATTR_ID cpu_to_be16(0x0019)
271
#define CM_APR_ATTR_ID cpu_to_be16(0x001A)
272
273
/**
274
* ib_cm_handler - User-defined callback to process communication events.
275
* @cm_id: Communication identifier associated with the reported event.
276
* @event: Information about the communication event.
277
*
278
* IB_CM_REQ_RECEIVED and IB_CM_SIDR_REQ_RECEIVED communication events
279
* generated as a result of listen requests result in the allocation of a
280
* new @cm_id. The new @cm_id is returned to the user through this callback.
281
* Clients are responsible for destroying the new @cm_id. For peer-to-peer
282
* IB_CM_REQ_RECEIVED and all other events, the returned @cm_id corresponds
283
* to a user's existing communication identifier.
284
*
285
* Users may not call ib_destroy_cm_id while in the context of this callback;
286
* however, returning a non-zero value instructs the communication manager to
287
* destroy the @cm_id after the callback completes.
288
*/
289
typedef int (*ib_cm_handler)(struct ib_cm_id *cm_id,
290
const struct ib_cm_event *event);
291
292
struct ib_cm_id {
293
ib_cm_handler cm_handler;
294
void *context;
295
struct ib_device *device;
296
__be64 service_id;
297
enum ib_cm_state state; /* internal CM/debug use */
298
enum ib_cm_lap_state lap_state; /* internal CM/debug use */
299
__be32 local_id;
300
__be32 remote_id;
301
u32 remote_cm_qpn; /* 1 unless redirected */
302
};
303
304
/**
305
* ib_create_cm_id - Allocate a communication identifier.
306
* @device: Device associated with the cm_id. All related communication will
307
* be associated with the specified device.
308
* @cm_handler: Callback invoked to notify the user of CM events.
309
* @context: User specified context associated with the communication
310
* identifier.
311
*
312
* Communication identifiers are used to track connection states, service
313
* ID resolution requests, and listen requests.
314
*/
315
struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
316
ib_cm_handler cm_handler,
317
void *context);
318
319
/**
320
* ib_destroy_cm_id - Destroy a connection identifier.
321
* @cm_id: Connection identifier to destroy.
322
*
323
* This call blocks until the connection identifier is destroyed.
324
*/
325
void ib_destroy_cm_id(struct ib_cm_id *cm_id);
326
327
#define IB_SERVICE_ID_AGN_MASK cpu_to_be64(0xFF00000000000000ULL)
328
#define IB_CM_ASSIGN_SERVICE_ID cpu_to_be64(0x0200000000000000ULL)
329
#define IB_CMA_SERVICE_ID cpu_to_be64(0x0000000001000000ULL)
330
#define IB_CMA_SERVICE_ID_MASK cpu_to_be64(0xFFFFFFFFFF000000ULL)
331
#define IB_SDP_SERVICE_ID cpu_to_be64(0x0000000000010000ULL)
332
#define IB_SDP_SERVICE_ID_MASK cpu_to_be64(0xFFFFFFFFFFFF0000ULL)
333
334
/**
335
* ib_cm_listen - Initiates listening on the specified service ID for
336
* connection and service ID resolution requests.
337
* @cm_id: Connection identifier associated with the listen request.
338
* @service_id: Service identifier matched against incoming connection
339
* and service ID resolution requests. The service ID should be specified
340
* network-byte order. If set to IB_CM_ASSIGN_SERVICE_ID, the CM will
341
* assign a service ID to the caller.
342
*/
343
int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id);
344
345
struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,
346
ib_cm_handler cm_handler,
347
__be64 service_id);
348
349
struct ib_cm_req_param {
350
struct sa_path_rec *primary_path;
351
struct sa_path_rec *primary_path_inbound;
352
struct sa_path_rec *primary_path_outbound;
353
struct sa_path_rec *alternate_path;
354
const struct ib_gid_attr *ppath_sgid_attr;
355
__be64 service_id;
356
u32 qp_num;
357
enum ib_qp_type qp_type;
358
u32 starting_psn;
359
const void *private_data;
360
u8 private_data_len;
361
u8 responder_resources;
362
u8 initiator_depth;
363
u8 remote_cm_response_timeout;
364
u8 flow_control;
365
u8 local_cm_response_timeout;
366
u8 retry_count;
367
u8 rnr_retry_count;
368
u8 max_cm_retries;
369
u8 srq;
370
struct rdma_ucm_ece ece;
371
};
372
373
/**
374
* ib_send_cm_req - Sends a connection request to the remote node.
375
* @cm_id: Connection identifier that will be associated with the
376
* connection request.
377
* @param: Connection request information needed to establish the
378
* connection.
379
*/
380
int ib_send_cm_req(struct ib_cm_id *cm_id,
381
struct ib_cm_req_param *param);
382
383
struct ib_cm_rep_param {
384
u32 qp_num;
385
u32 starting_psn;
386
const void *private_data;
387
u8 private_data_len;
388
u8 responder_resources;
389
u8 initiator_depth;
390
u8 failover_accepted;
391
u8 flow_control;
392
u8 rnr_retry_count;
393
u8 srq;
394
struct rdma_ucm_ece ece;
395
};
396
397
/**
398
* ib_send_cm_rep - Sends a connection reply in response to a connection
399
* request.
400
* @cm_id: Connection identifier that will be associated with the
401
* connection request.
402
* @param: Connection reply information needed to establish the
403
* connection.
404
*/
405
int ib_send_cm_rep(struct ib_cm_id *cm_id,
406
struct ib_cm_rep_param *param);
407
408
/**
409
* ib_send_cm_rtu - Sends a connection ready to use message in response
410
* to a connection reply message.
411
* @cm_id: Connection identifier associated with the connection request.
412
* @private_data: Optional user-defined private data sent with the
413
* ready to use message.
414
* @private_data_len: Size of the private data buffer, in bytes.
415
*/
416
int ib_send_cm_rtu(struct ib_cm_id *cm_id,
417
const void *private_data,
418
u8 private_data_len);
419
420
/**
421
* ib_send_cm_dreq - Sends a disconnection request for an existing
422
* connection.
423
* @cm_id: Connection identifier associated with the connection being
424
* released.
425
* @private_data: Optional user-defined private data sent with the
426
* disconnection request message.
427
* @private_data_len: Size of the private data buffer, in bytes.
428
*/
429
int ib_send_cm_dreq(struct ib_cm_id *cm_id,
430
const void *private_data,
431
u8 private_data_len);
432
433
/**
434
* ib_send_cm_drep - Sends a disconnection reply to a disconnection request.
435
* @cm_id: Connection identifier associated with the connection being
436
* released.
437
* @private_data: Optional user-defined private data sent with the
438
* disconnection reply message.
439
* @private_data_len: Size of the private data buffer, in bytes.
440
*
441
* If the cm_id is in the correct state, the CM will transition the connection
442
* to the timewait state, even if an error occurs sending the DREP message.
443
*/
444
int ib_send_cm_drep(struct ib_cm_id *cm_id,
445
const void *private_data,
446
u8 private_data_len);
447
448
/**
449
* ib_cm_notify - Notifies the CM of an event reported to the consumer.
450
* @cm_id: Connection identifier to transition to established.
451
* @event: Type of event.
452
*
453
* This routine should be invoked by users to notify the CM of relevant
454
* communication events. Events that should be reported to the CM and
455
* when to report them are:
456
*
457
* IB_EVENT_COMM_EST - Used when a message is received on a connected
458
* QP before an RTU has been received.
459
* IB_EVENT_PATH_MIG - Notifies the CM that the connection has failed over
460
* to the alternate path.
461
*/
462
int ib_cm_notify(struct ib_cm_id *cm_id, enum ib_event_type event);
463
464
/**
465
* ib_send_cm_rej - Sends a connection rejection message to the
466
* remote node.
467
* @cm_id: Connection identifier associated with the connection being
468
* rejected.
469
* @reason: Reason for the connection request rejection.
470
* @ari: Optional additional rejection information.
471
* @ari_length: Size of the additional rejection information, in bytes.
472
* @private_data: Optional user-defined private data sent with the
473
* rejection message.
474
* @private_data_len: Size of the private data buffer, in bytes.
475
*/
476
int ib_send_cm_rej(struct ib_cm_id *cm_id,
477
enum ib_cm_rej_reason reason,
478
void *ari,
479
u8 ari_length,
480
const void *private_data,
481
u8 private_data_len);
482
483
/**
484
* ib_prepare_cm_mra - Prepares to send a message receipt acknowledgment to a
485
connection message in case duplicates are received.
486
* @cm_id: Connection identifier associated with the connection message.
487
*/
488
int ib_prepare_cm_mra(struct ib_cm_id *cm_id);
489
490
/**
491
* ib_cm_init_qp_attr - Initializes the QP attributes for use in transitioning
492
* to a specified QP state.
493
* @cm_id: Communication identifier associated with the QP attributes to
494
* initialize.
495
* @qp_attr: On input, specifies the desired QP state. On output, the
496
* mandatory and desired optional attributes will be set in order to
497
* modify the QP to the specified state.
498
* @qp_attr_mask: The QP attribute mask that may be used to transition the
499
* QP to the specified state.
500
*
501
* Users must set the @qp_attr->qp_state to the desired QP state. This call
502
* will set all required attributes for the given transition, along with
503
* known optional attributes. Users may override the attributes returned from
504
* this call before calling ib_modify_qp.
505
*/
506
int ib_cm_init_qp_attr(struct ib_cm_id *cm_id,
507
struct ib_qp_attr *qp_attr,
508
int *qp_attr_mask);
509
510
struct ib_cm_sidr_req_param {
511
struct sa_path_rec *path;
512
const struct ib_gid_attr *sgid_attr;
513
__be64 service_id;
514
unsigned long timeout_ms;
515
const void *private_data;
516
u8 private_data_len;
517
u8 max_cm_retries;
518
};
519
520
/**
521
* ib_send_cm_sidr_req - Sends a service ID resolution request to the
522
* remote node.
523
* @cm_id: Communication identifier that will be associated with the
524
* service ID resolution request.
525
* @param: Service ID resolution request information.
526
*/
527
int ib_send_cm_sidr_req(struct ib_cm_id *cm_id,
528
struct ib_cm_sidr_req_param *param);
529
530
struct ib_cm_sidr_rep_param {
531
u32 qp_num;
532
u32 qkey;
533
enum ib_cm_sidr_status status;
534
const void *info;
535
u8 info_length;
536
const void *private_data;
537
u8 private_data_len;
538
struct rdma_ucm_ece ece;
539
};
540
541
/**
542
* ib_send_cm_sidr_rep - Sends a service ID resolution reply to the
543
* remote node.
544
* @cm_id: Communication identifier associated with the received service ID
545
* resolution request.
546
* @param: Service ID resolution reply information.
547
*/
548
int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
549
struct ib_cm_sidr_rep_param *param);
550
551
/**
552
* ibcm_reject_msg - return a pointer to a reject message string.
553
* @reason: Value returned in the REJECT event status field.
554
*/
555
const char *__attribute_const__ ibcm_reject_msg(int reason);
556
557
#endif /* IB_CM_H */
558
559