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.
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.
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]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_IB_IBTL_IBTI_CM_H
27 #define _SYS_IB_IBTL_IBTI_CM_H
32 * This file contains the data structure definitions for the IBTI
33 * communication manager (CM). It is only included in ibti.h
43 #define IBT_MAX_PRIV_DATA_SZ 224
44 #define IBT_DREP_PRIV_DATA_SZ 224
45 #define IBT_RTU_PRIV_DATA_SZ 224
46 #define IBT_MRA_PRIV_DATA_SZ 222
47 #define IBT_DREQ_PRIV_DATA_SZ 220
48 #define IBT_REP_PRIV_DATA_SZ 196
49 #define IBT_LAP_PRIV_DATA_SZ 168
50 #define IBT_APR_PRIV_DATA_SZ 148
51 #define IBT_REJ_PRIV_DATA_SZ 148
52 #define IBT_REQ_PRIV_DATA_SZ 92
53 #define IBT_SIDR_REQ_PRIV_DATA_SZ 216
54 #define IBT_SIDR_REP_PRIV_DATA_SZ 136
55 #define IBT_IP_HDR_PRIV_DATA_SZ 36
57 #define IBT_CM_ADDL_REJ_LEN 72 /* Additional Rej Info len */
58 /* This is the max consumer addl */
60 #define IBT_CM_SIDR_CP_LEN 72 /* SIDR REP Class Port Info len */
61 #define IBT_CM_APR_ADDL_LEN 72 /* Additional Info len in APR message */
63 typedef uint8_t ibt_priv_data_len_t
;
66 * CM channel handler reject reasons.
68 * Refer to InfiniBand Architecture Release Volume 1 Rev 1.0a:
69 * Section 12.6.7.2 Rejection Reason, and RDMA IP CM Service Annex
72 * When a REJ happens for an RDMA-aware ULP, a consumer reject code
73 * indicating an IP CM Service reject or a RDMA-Aware ULP reject can
74 * be returned. In the IBTA spec both use the consumer reject code, but
75 * are distinguished by the REJ layer byte (table 3 of the annex 11).
76 * The IBTF CM can thus tell what type of reject has been returned. When
77 * a RDMA ULP issues a consumer REJ to an RDMA REQ then the CM will
78 * return an IBT_CM_CONSUMER ibt_cm_reason_t. The ARI data is returned
79 * in an ibt_ari_con_t struct accessed by the 'ari_consumer' member of
80 * the ibt_arej_info_t. However the consumer reject data begins at
81 * 'ari_consumer.rej_ari[1]', and is of length
82 * 'ari_consumer.rej_ari_len - 1' (the first byte is the REJ layer byte),
83 * where as for a non RDMA-aware ULP consumer REJ, the ARI data begins
84 * at 'ari_consumer.rej_ari[0]' and is of length 'ari_consumer.rej_ari_len'
86 * If an RDMA-aware ULP REQ is rejected by the IP CM Service layer, the
87 * CM will return the new IBT_CM_RDMA_IP ibt_cm_reason_t, and the
88 * private data is returned in an ibt_ari_ip_t struct accessed via the
89 * 'ari_ip' member of the ibt_arej_info_t struct.
91 * If an RDMA IP CM REQ is sent to a non RDMA-aware ULP consumer, then
92 * the REQ is Rejected with an IBT_CM_INVALID_SID ibt_cm_reason_t.
94 typedef enum ibt_cm_reason_e
{
95 IBT_CM_SUCCESS
= 0, /* Success */
96 IBT_CM_NO_CHAN
= 1, /* Remote unable to allocate a CHAN */
97 IBT_CM_NO_EEC
= 2, /* Remote unable to allocate an EEC */
98 IBT_CM_NO_RESC
= 3, /* Remote unable to allocate resource */
99 IBT_CM_TIMEOUT
= 4, /* CM protocol timed out waiting for */
101 IBT_CM_NOT_SUPPORTED
= 5, /* Request not supported */
102 IBT_CM_INVALID_CID
= 6, /* Local CID or Remote CID invalid */
103 IBT_CM_INVALID_COMM_INS
= 7, /* Local CID, Remote CID, Channel */
104 /* does not refer to a valid */
105 /* communication Instance. */
106 IBT_CM_INVALID_SID
= 8, /* Service not supported or not */
108 IBT_CM_INVALID_SRV_TYPE
= 9, /* Invalid transport service type */
109 IBT_CM_CONN_STALE
= 10, /* Stale connection */
110 IBT_CM_INVALID_RDC
= 11, /* RDC does not exist */
111 IBT_CM_PRIM_GID
= 12, /* Primary remote port gid rejected. */
112 IBT_CM_PRIM_LID
= 13, /* Primary remote port lid rejected. */
113 IBT_CM_INVALID_PRIM_SL
= 14, /* Primary Requested SL not supported */
114 IBT_CM_INVALID_PRIM_TC
= 15, /* Primary Requested traffic class */
116 IBT_CM_INVALID_PRIM_HOP
= 16, /* Primary Requested hop limit not */
118 IBT_CM_INVALID_PRIM_RATE
= 17, /* Primary Packet rate not accepted */
119 IBT_CM_ALT_GID
= 18, /* Alternate remote port gid rejected */
120 IBT_CM_ALT_LID
= 19, /* Alternate remote port lid rejected */
121 IBT_CM_INVALID_ALT_SL
= 20, /* Alternate Requested SL not */
123 IBT_CM_INVALID_ALT_TC
= 21, /* Alternate Requested traffic class */
125 IBT_CM_INVALID_ALT_HOP
= 22, /* Alternate Requested hop limit */
127 IBT_CM_INVALID_ALT_RATE
= 23, /* Alternate Packet rate not accepted */
128 IBT_CM_REDIRECT_CM
= 24, /* Port & CM redirected */
129 IBT_CM_PORT_REDIRECT
= 25, /* Port redirected */
130 IBT_CM_INVALID_MTU
= 26, /* Path MTU not supported */
131 IBT_CM_INSUFF_RESOURCE
= 27, /* Insufficient responder resources */
132 IBT_CM_CONSUMER
= 28, /* Consumer rejected connection */
133 IBT_CM_RNR_RETRY_CNT_REJ
= 29, /* RNR NAK retry count rejected */
134 IBT_CM_DUP_COM_ID
= 30, /* Local CID in REQ is duplicated */
135 IBT_CM_CLASS_NO_SUPPORT
= 31, /* Class version not supported */
136 IBT_CM_INVALID_PRIM_FLOW
= 32, /* Invalid primary flow label */
137 IBT_CM_INVALID_ALT_FLOW
= 33, /* Invalid alternate flow label */
138 IBT_CM_DUP_CONN_REQ
= 1000, /* Duplicate connection request */
139 IBT_CM_ABORT
= 1001, /* Connection aborted */
140 IBT_CM_CI_FAILURE
= 1002, /* A call to CI failed, could be */
141 /* query/modify channel */
142 IBT_CM_CHAN_INVALID_STATE
= 1003, /* Passive's QP is not in Init */
144 IBT_CM_RDMA_IP
= 1004 /* RDMA IP CM reject */
150 typedef uint8_t ibt_cm_flags_t
;
152 #define IBT_CM_NO_FLAGS 0x0
153 #define IBT_CM_FLOW_CONTROL 0x1
154 #define IBT_CM_SRQ_EXISTS 0x2
158 * The CM Handler function return values.
160 typedef enum ibt_cm_status_e
{
163 IBT_CM_REDIRECT_PORT
= 2, /* Redirect port */
164 IBT_CM_REDIRECT
= 3, /* Redirect port and CM */
165 IBT_CM_NO_CHANNEL
= 4, /* Unable to allocate a channel */
166 IBT_CM_NO_RESOURCE
= 5, /* Unable to allocate a resource */
167 IBT_CM_DEFAULT
= 6, /* Do the default action */
168 IBT_CM_DEFER
= 7 /* Can't complete processing now */
169 } ibt_cm_status_t
; /* will call ibt_cm_proceed() */
173 * SIDR_REP status type
175 typedef enum ibt_sidr_status_e
{
176 IBT_CM_SREP_CHAN_VALID
= 0,
177 IBT_CM_SREP_SID_INVALID
= 1, /* Service ID not supported */
178 IBT_CM_SREP_REJ
= 2, /* Service provider reject */
179 IBT_CM_SREP_NO_CHAN
= 3, /* No channel available */
180 IBT_CM_SREP_REDIRECT
= 4, /* Redirect request */
181 IBT_CM_SREP_CL_INVALID
= 5, /* Class Version is invalid */
182 IBT_CM_SREP_TIMEOUT
= 1000 /* No SIDR_REP received */
186 * Alternate path status type
187 * The implementation defined status codes begin from 20. The status codes
188 * below 20 are based on apr_status in the APR mad.
190 typedef enum ibt_ap_status_e
{
191 IBT_CM_AP_LOADED
= 0, /* AP loaded successfully */
192 IBT_CM_AP_INVALID_COMMID
= 1, /* Invalid communication instance */
193 IBT_CM_AP_NOT_SUPPORTED
= 2, /* Alternate paths not supported */
194 IBT_CM_AP_REJECT
= 3, /* Failover port rejected */
195 IBT_CM_AP_REDIRECT
= 4, /* Reject - redirect */
196 IBT_CM_AP_MATCH_PRIM
= 5, /* AP matches primary path */
197 IBT_CM_AP_QPNEECN_INVALID
= 6, /* AP QPN/EECN does not match */
198 IBT_CM_AP_RLID_REJECTED
= 7, /* AP remote port lid rejected */
199 IBT_CM_AP_RGID_REJECTED
= 8, /* AP remote port gid rejected */
200 IBT_CM_AP_FLOW_REJECTED
= 9, /* AP flow label rejected */
201 IBT_CM_AP_TCLASS_REJECTED
= 10, /* AP traffic class rejected */
202 IBT_CM_AP_HOP_REJECTED
= 11, /* AP hop limit rejected */
203 IBT_CM_AP_RATE_REJECTED
= 12, /* AP static packet rate rejected */
204 IBT_CM_AP_SL_REJECTED
= 13, /* AP service level rejected */
205 IBT_CM_AP_TIMEOUT
= 1000, /* LAP timed out */
206 IBT_CM_AP_ABORT
= 1001 /* ibt_set_alternate_path returned */
207 /* earlier because of connection */
212 * Communication event types.
214 typedef enum ibt_cm_event_type_e
{
215 IBT_CM_EVENT_REQ_RCV
= 0x1,
216 IBT_CM_EVENT_REP_RCV
,
217 IBT_CM_EVENT_MRA_RCV
,
218 IBT_CM_EVENT_LAP_RCV
,
219 IBT_CM_EVENT_APR_RCV
,
220 IBT_CM_EVENT_CONN_EST
, /* RTU has been sent/recvd and it is */
221 /* OK to use the connection */
222 IBT_CM_EVENT_CONN_CLOSED
, /* Connection has been closed and it */
223 /* is OK to free resources associated */
224 /* with the connection. */
225 IBT_CM_EVENT_FAILURE
/* The CM Failure see cf_code in the */
226 /* ibt_cm_conn_failed_t struct for */
227 /* details of the failure */
228 } ibt_cm_event_type_t
;
231 * CM and Port redirect information.
233 typedef struct ibt_redirect_info_s
{
242 } ibt_redirect_info_t
;
245 * Values for rep_failover_status.
247 #define IBT_CM_FAILOVER_ACCEPT 0x00 /* Failover port accepted */
248 #define IBT_CM_FAILOVER_REJ_NOTSUPP 0x01 /* Failover not supported */
249 #define IBT_CM_FAILOVER_REJ 0x02 /* Failover port rejected */
252 * CM REP_RCV event structure.
254 typedef struct ibt_cm_rep_rcv_s
{
255 uint8_t rep_rdma_ra_in
; /* Arbitrated responder */
256 /* resources (rdma_ra_in) */
257 uint8_t rep_rdma_ra_out
; /* Arbitrated initiator */
258 /* depth (rdma_ra_out) */
259 clock_t rep_service_time
; /* time in clock ticks */
260 /* Time to complete */
261 /* processing of REP event */
262 uint8_t rep_failover_status
; /* Failover Port status */
263 ibt_cm_flags_t rep_flags
; /* EE flow control, SRQ etc */
268 * Values for mra_msg_type.
270 #define IBT_CM_MRA_TYPE_REQ 0x00 /* mra_msg values */
271 #define IBT_CM_MRA_TYPE_REP 0x01
272 #define IBT_CM_MRA_TYPE_LAP 0x02
275 * CM MRA_RCV event structure.
277 typedef struct ibt_cm_mra_rcv_s
{
278 uint8_t mra_msg_type
; /* The message being MRA'd */
279 clock_t mra_service_time
; /* timeout in microseconds */
283 * CM LAP_RCV event structure.
285 typedef struct ibt_cm_lap_rcv_s
{
286 ibt_adds_vect_t lap_alternate_path
;
287 clock_t lap_timeout
; /* timeout in microseconds */
288 /* This is the time that the */
289 /* Service handler has to */
290 /* return to the CM */
293 #define IBT_CM_IP_MAJ_VER 0
294 #define IBT_CM_IP_MIN_VER 0
295 #define IBT_CM_IP_IPV_V4 0x4
296 #define IBT_CM_IP_IPV_V6 0x6
299 * Consumer defined Additional reject information.
301 typedef struct ibt_ari_con_s
{
302 uint8_t rej_ari_len
; /* Length */
303 uint8_t rej_ari
[IBT_CM_ADDL_REJ_LEN
]; /* Buffer */
307 * Consumer defined Additional reject information.
308 * For RDMA IP CM Service.
310 typedef uint8_t ibt_ari_ip_reason_t
;
311 #define IBT_ARI_IP_UNSPECIFIED 0x0
312 #define IBT_ARI_IP_MAJOR_VERSION 0x1
313 #define IBT_ARI_IP_MINOR_VERSION 0x2
314 #define IBT_ARI_IP_IPV 0x3
315 #define IBT_ARI_IP_SRC_ADDR 0x4
316 #define IBT_ARI_IP_DST_ADDR 0x5
317 #define IBT_ARI_IP_UNKNOWN_ADDR 0x6
319 typedef struct ibt_ari_ip_s
{
320 ibt_ip_addr_t ip_suggested_addr
; /* IP_UNKNOWN_ADDR */
321 boolean_t ip_suggested
; /* suggested valid */
322 ibt_ari_ip_reason_t ip_reason
;
323 uint8_t ip_suggested_version
:4; /* IP_MAJOR_VERSION */
324 /* IP_MINOR_VERSION */
331 * Additional reject information.
333 typedef union ibt_arej_info_u
{
334 ibt_ari_con_t ari_consumer
; /* IBT_CM_CONSUMER */
335 ib_gid_t ari_gid
; /* IBT_CM_PRIM_GID, */
336 /* IBT_CM_ALT_GID, */
337 /* IBT_CM_PORT_REDIRECT */
338 ib_lid_t ari_lid
; /* IBT_CM_PRIM_LID, */
340 uint8_t ari_sl
:4; /* IBT_CM_INVALID_PRIM_SL, */
341 /* IBT_CM_INVALID_ALT_SL */
342 uint8_t ari_tclass
; /* IBT_CM_INVALID_PRIM_TC, */
343 /* IBT_CM_INVALID_ALT_TC */
344 uint8_t ari_hop
; /* IBT_CM_INVALID_PRIM_HOP, */
345 /* IBT_CM_INVALID_ALT_HOP */
346 uint_t ari_flow
:20; /* IBT_CM_INVALID_PRIM_FLOW, */
347 /* IBT_CM_INVALID_ALT_FLOW */
348 ibt_srate_t ari_rate
; /* IBT_CM_INVALID_PRIM_RATE, */
349 /* IBT_CM_INVALID_ALT_RATE */
350 ib_mtu_t ari_mtu
; /* IBT_CM_INVALID_MTU */
351 ibt_redirect_info_t ari_redirect
; /* IBT_CM_REDIRECT_CM */
352 ibt_ari_ip_t ari_ip
; /* IBT_CM_RDMA_IP */
356 * CM APR_RCV event structure.
358 typedef struct ibt_cm_apr_rcv_s
{
359 ibt_ap_status_t apr_status
;
360 boolean_t apr_arej_info_valid
;
361 ibt_arej_info_t apr_arej_info
;
366 * Connection Failed Message type (values of cf_msg).
367 * Identifies the CM message that either timed out or is being rejected.
369 #define IBT_CM_FAILURE_REQ 0x00
370 #define IBT_CM_FAILURE_REP 0x01
371 #define IBT_CM_FAILURE_UNKNOWN 0x02
372 #define IBT_CM_FAILURE_LAP 0x03
375 * CM Failure code (values of cf_code).
376 * Identifies the reason for failure.
378 #define IBT_CM_FAILURE_REJ_SENT 0x00
379 #define IBT_CM_FAILURE_REJ_RCV 0x01
380 #define IBT_CM_FAILURE_TIMEOUT 0x02
381 #define IBT_CM_FAILURE_DUP 0x03
382 #define IBT_CM_FAILURE_STALE 0x04
385 * IBT_CM_EVENT_FAILURE event struct.
387 typedef struct ibt_cm_conn_failed_s
{
388 uint8_t cf_code
; /* Failure Code */
389 uint8_t cf_msg
; /* The message that timed out or is */
391 boolean_t cf_arej_info_valid
; /* Is cf_additional valid? */
392 ibt_cm_reason_t cf_reason
; /* Reject reason */
393 ibt_arej_info_t cf_additional
; /* Additional Reject info */
394 } ibt_cm_conn_failed_t
;
398 * CM REQ_RCV event structure.
400 * The req_cm_opaque is an IBTF CM opaque (to the client) value, that should
401 * be returned to the IBTF CM if the client/server CM handler wishes to call
404 * prim_addr->av_dgid Is the GID of the requester.
405 * prim_addr->av_sgid Is the local GID to which the
406 * requester is attempting to establish
408 * hca_guid Is the HCA GUID that contains the
410 * prim_hca_port Is the port on the hca_guid that
411 * prim_addr->av_sgid is on.
413 typedef struct ibt_cm_req_rcv_s
{
414 ib_svc_id_t req_service_id
;
415 ibt_tran_srv_t req_transport
;
416 ib_guid_t req_hca_guid
;
417 uint8_t req_prim_hca_port
;
418 uint8_t req_alt_hca_port
;
419 ibt_adds_vect_t req_prim_addr
;
420 ibt_adds_vect_t req_alt_addr
;
421 uint8_t req_rdma_ra_in
; /* Offered responder */
423 uint8_t req_rdma_ra_out
; /* Offered initiator depth */
424 clock_t req_timeout
; /* timeout in microseconds */
425 /* This is the time that the */
426 /* Service handler has to */
427 /* return to the CM */
428 ib_qpn_t req_remote_qpn
;
429 ib_qkey_t req_remote_qkey
;
431 ibt_cm_flags_t req_flags
; /* EE flow control etc */
432 uint8_t req_retry_cnt
:3;
433 ibt_rnr_retry_cnt_t req_rnr_retry_cnt
;
434 ib_eecn_t req_opaque1
;
435 ib_eecn_t req_opaque2
;
438 typedef struct ibt_ofuvcm_req_data_s
{
439 uint32_t req_rq_psn
:24;
441 ib_mtu_t req_path_mtu
;
442 ibt_rnr_nak_time_t req_rnr_nak_time
;
443 } ibt_ofuvcm_req_data_t
;
446 * The IBT_CM_EVENT_CONN_CLOSED event is generated by the CM when a connection
447 * has been closed. The reason the connection was closed is given in the
448 * "closed" member of the cm_event as one of:
450 * A client can only call ibt_free_channel() to free channel resources on
451 * receipt of the IBT_CM_EVENT_CONN_CLOSED event.
453 #define IBT_CM_CLOSED_DREP_RCVD 0x01
454 #define IBT_CM_CLOSED_DREQ_RCVD 0x02
455 #define IBT_CM_CLOSED_REJ_RCVD 0x03
456 #define IBT_CM_CLOSED_DREQ_TIMEOUT 0x04
457 #define IBT_CM_CLOSED_DUP 0x05
458 #define IBT_CM_CLOSED_ABORT 0x06
459 #define IBT_CM_CLOSED_STALE 0x07
460 #define IBT_CM_CLOSED_ALREADY 0x08
463 * Operation type in ibt_cm_event_type_t.
466 * The IBT_CM_EVENT_CONN_EST event has no associated "cm_event"
467 * field in the ibt_cm_event_t structure.
469 * The cm_session_id is a CM opaque (to the client) value, that
470 * should be returned to the CM if the client/server CM handler wishes
471 * to call ibt_cm_delay() or ibt_cm_proceed().
474 typedef struct ibt_cm_event_s
{
475 ibt_cm_event_type_t cm_type
; /* Describes the event */
476 void *cm_session_id
; /* Used by the CM */
477 ibt_channel_hdl_t cm_channel
; /* Event channel. Not valid */
478 /* for ibt_cm_req_rcv_t */
479 ibt_eec_hdl_t cm_opaque
;
480 ibt_priv_data_len_t cm_priv_data_len
; /* 0 if no private */
481 void *cm_priv_data
; /* data returned */
483 ibt_cm_rep_rcv_t rep
;
484 ibt_cm_req_rcv_t req
;
485 ibt_cm_lap_rcv_t lap
;
486 ibt_cm_apr_rcv_t apr
;
487 ibt_cm_mra_rcv_t mra
;
488 ibt_cm_conn_failed_t failed
;
490 } cm_event
; /* operation specific */
494 * CM Return structure for an incoming REQ
495 * Server handler that wishes to accept the connection, fills all the
496 * values before returning to CM
498 typedef struct ibt_cm_ret_rep_s
{
499 ibt_channel_hdl_t cm_channel
; /* The channel overwhich the */
500 /* connection will be */
502 /* can be returned NULL */
503 /* if no resources available */
504 uint8_t cm_rdma_ra_out
; /* max RDMA-R/Atomic sent */
505 /* Number of RDMA RD's & */
506 /* Atomics outstanding */
507 uint8_t cm_rdma_ra_in
; /* Incoming RDMA-R/Atomic */
508 /* Responder resources for */
509 /* handling incoming */
510 /* RDMA RD's & Atomics */
511 ibt_rnr_retry_cnt_t cm_rnr_retry_cnt
;
515 * Define an ibt_cm_proceed() argument union.
517 * rep is valid when an IBT client cm handler has decided to continue a
518 * REQ_RCV, accepting the connection.
520 * rej is valid when an IBT client cm handler has decided to continue a
521 * REQ_RCV or REP_RCV, rejecting the message.
523 * apr is valid when an IBT client cm handler has decided to continue a
524 * LAP_RCV, redirecting the lap request.
526 typedef union ibt_cm_proceed_reply_s
{
527 ibt_cm_ret_rep_t rep
; /* Return for REP */
528 ibt_arej_info_t rej
; /* Return for REJ */
529 ibt_redirect_info_t apr
; /* Return for APR */
530 } ibt_cm_proceed_reply_t
;
534 * Define a CM handler return arguments structure.
536 * cm_ret.rep is returned to the CM when an IBT client cm handler has
537 * decided to accept a connection in response to a CM REQ_RCV event.
539 * cm_ret.rej is returned to the CM when an IBT client cm handler
540 * has decided to reject the connection in response to a CM REQ_RCV event.
542 * cm_ret.apr is returned to the CM when an IBT client cm handler
543 * has decided to redirect the lap request in response to a CM LAP RCV event.
545 * The client/server should update cm_ret_len with number of private data
546 * bytes filled in priv_data arg of the cm handler.
548 typedef struct ibt_cm_return_args_s
{
549 ibt_priv_data_len_t cm_ret_len
;
551 ibt_cm_ret_rep_t rep
; /* Return for REP */
552 ibt_arej_info_t rej
; /* Return for REJ */
553 ibt_redirect_info_t apr
; /* Return for APR */
554 } cm_ret
; /* reply specific */
555 } ibt_cm_return_args_t
;
559 * Communication Manager UD event types.
561 typedef enum ibt_cm_ud_event_type_e
{
562 IBT_CM_UD_EVENT_SIDR_REQ
= 1,
563 IBT_CM_UD_EVENT_SIDR_REP
= 2
564 } ibt_cm_ud_event_type_t
;
567 * CM SIDR_REQ event structure.
569 typedef struct ibt_cm_sidr_req_s
{
570 ib_guid_t sreq_hca_guid
;
571 uint8_t sreq_hca_port
;
573 ib_svc_id_t sreq_service_id
;
577 * CM SIDR_REP event structure.
579 typedef struct ibt_cm_sidr_rep_s
{
580 ibt_sidr_status_t srep_status
;
581 ib_svc_id_t srep_service_id
;
582 ib_qkey_t srep_remote_qkey
;
583 ib_qpn_t srep_remote_qpn
;
584 ibt_redirect_info_t srep_redirect
; /* Only valid if redirect */
588 * Operation type in ibt_cm_ud_event_type_t.
590 * The cm_session_id is a CM opaque (to the client) value, that
591 * should be returned to the CM if the client/server CM handler
592 * wishes to call ibt_cm_ud_proceed().
594 typedef struct ibt_cm_ud_event_s
{
595 ibt_cm_ud_event_type_t cm_type
; /* Describes the event record */
596 void *cm_session_id
; /* Used by the CM */
597 ibt_priv_data_len_t cm_priv_data_len
;
600 ibt_cm_sidr_rep_t sidr_rep
;
601 ibt_cm_sidr_req_t sidr_req
;
602 } cm_event
; /* operation specific */
607 * Define a CM UD handler return arguments structure.
609 * The information here is returned to the CM when an IBT client CM UD
610 * handler has decided to communicate (via UD messages) with the requester
611 * of the SIDR_REQ_RCV event.
613 * The ud_channel encodes the QPN and Q_Key to be placed in the SIDR_REP.
615 * CM sets ud_ret_len to 0 before calling the UD CM handler. If the CM UD
616 * handler wishes to send private data back, it needs to update ud_ret_len
617 * with the actual number of bytes to be sent back in the SIDR_REP MAD. It
618 * copies said data to the buffer pointed to by the ret_priv_data argument.
620 * The ud_redirect structure should only be updated if the UD CM handler is
621 * Redirecting a CM request.
623 typedef struct ibt_cm_ud_return_args_s
{
624 ibt_priv_data_len_t ud_ret_len
;
625 ibt_channel_hdl_t ud_channel
;
626 ibt_redirect_info_t ud_redirect
;
627 } ibt_cm_ud_return_args_t
;
631 * IBT Client CM Callback function typedefs.
635 * The CM event handler function. An IBT client callback that handles
636 * CM events. If the handler will exceed the event service timeout
637 * then it should call ibt_cm_delay(), specifying the maximum time it
638 * will take to complete processing the CM event.
640 * Clients are advised not to issue blocking calls from a cm handler, as this
641 * would block the CM threads, and could delay or block other client
644 * Clients are allowed to make resource clean up/free calls in the CM handler
645 * such as ibt_free_cq, ibt_free_rc/ud_channel, etc. on connection failure
648 * Clients should not call ibt_close_rc_channel in the cm handler for connection
649 * failure or tear down events, as these events already perform the processing
650 * necessary to close the channel.
652 * Clients can call ibt_close_rc_channel only in the non-blocking mode from
653 * the cm handler for connection abort.
655 typedef ibt_cm_status_t (*ibt_cm_handler_t
)(void *cm_private
,
656 ibt_cm_event_t
*event
, ibt_cm_return_args_t
*ret_args
,
657 void *ret_priv_data
, ibt_priv_data_len_t ret_len_max
);
660 * ibt_cm_ud_handler_t - Pointer to the CM UD event handler function.
661 * This function should handle the following CM
663 * IBT_CM_UD_EVENT_SIDR_REQ
664 * IBT_CM_UD_EVENT_SIDR_REP
666 typedef ibt_cm_status_t (*ibt_cm_ud_handler_t
)(void *ud_cm_private
,
667 ibt_cm_ud_event_t
*event
, ibt_cm_ud_return_args_t
*ret_args
,
668 void *ret_priv_data
, ibt_priv_data_len_t ret_len_max
);
674 #endif /* _SYS_IB_IBTL_IBTI_CM_H */