xref: /onnv-gate/usr/src/uts/common/sys/ib/ibtl/ibti_cm.h (revision 9913:b5cbbe12c671)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
54703Shiremath  * Common Development and Distribution License (the "License").
64703Shiremath  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
22*9913SShantkumar.Hiremath@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #ifndef	_SYS_IB_IBTL_IBTI_CM_H
270Sstevel@tonic-gate #define	_SYS_IB_IBTL_IBTI_CM_H
280Sstevel@tonic-gate 
290Sstevel@tonic-gate /*
300Sstevel@tonic-gate  * ibti_cm.h
310Sstevel@tonic-gate  *
320Sstevel@tonic-gate  * This file contains the data structure definitions for the IBTI
330Sstevel@tonic-gate  * communication manager (CM). It is only included in ibti.h
340Sstevel@tonic-gate  */
350Sstevel@tonic-gate 
360Sstevel@tonic-gate #ifdef	__cplusplus
370Sstevel@tonic-gate extern "C" {
380Sstevel@tonic-gate #endif
390Sstevel@tonic-gate 
400Sstevel@tonic-gate /*
410Sstevel@tonic-gate  * Defines.
420Sstevel@tonic-gate  */
430Sstevel@tonic-gate #define	IBT_MAX_PRIV_DATA_SZ		224
440Sstevel@tonic-gate #define	IBT_DREP_PRIV_DATA_SZ		224
450Sstevel@tonic-gate #define	IBT_RTU_PRIV_DATA_SZ		224
460Sstevel@tonic-gate #define	IBT_MRA_PRIV_DATA_SZ		222
470Sstevel@tonic-gate #define	IBT_DREQ_PRIV_DATA_SZ		220
480Sstevel@tonic-gate #define	IBT_REP_PRIV_DATA_SZ		196
490Sstevel@tonic-gate #define	IBT_LAP_PRIV_DATA_SZ		168
500Sstevel@tonic-gate #define	IBT_APR_PRIV_DATA_SZ		148
510Sstevel@tonic-gate #define	IBT_REJ_PRIV_DATA_SZ		148
520Sstevel@tonic-gate #define	IBT_REQ_PRIV_DATA_SZ		92
530Sstevel@tonic-gate #define	IBT_SIDR_REQ_PRIV_DATA_SZ	216
540Sstevel@tonic-gate #define	IBT_SIDR_REP_PRIV_DATA_SZ	136
554703Shiremath #define	IBT_IP_HDR_PRIV_DATA_SZ		36
560Sstevel@tonic-gate 
570Sstevel@tonic-gate #define	IBT_CM_ADDL_REJ_LEN	72	/* Additional Rej Info len */
580Sstevel@tonic-gate 					/* This is the max consumer addl */
590Sstevel@tonic-gate 					/* reject info len */
600Sstevel@tonic-gate #define	IBT_CM_SIDR_CP_LEN	72	/* SIDR REP Class Port Info len */
610Sstevel@tonic-gate #define	IBT_CM_APR_ADDL_LEN	72	/* Additional Info len in APR message */
620Sstevel@tonic-gate 
630Sstevel@tonic-gate typedef	uint8_t	ibt_priv_data_len_t;
640Sstevel@tonic-gate 
650Sstevel@tonic-gate /*
660Sstevel@tonic-gate  * CM channel handler reject reasons.
670Sstevel@tonic-gate  *
680Sstevel@tonic-gate  * Refer to InfiniBand Architecture Release Volume 1 Rev 1.0a:
694703Shiremath  * Section 12.6.7.2 Rejection Reason, and RDMA IP CM Service Annex
704703Shiremath  *
714703Shiremath  * Note:
724703Shiremath  *	When a REJ happens for an RDMA-aware ULP, a consumer reject code
734703Shiremath  *	indicating an IP CM Service reject or a RDMA-Aware ULP reject can
744703Shiremath  *	be returned. In the IBTA spec both use the consumer reject code, but
754703Shiremath  *	are distinguished by the REJ layer byte (table 3 of the annex 11).
764703Shiremath  *	The IBTF CM can thus tell what type of reject has been returned. When
774703Shiremath  *	a RDMA ULP issues a consumer REJ to an RDMA REQ then the CM will
784703Shiremath  *	return an IBT_CM_CONSUMER ibt_cm_reason_t. The ARI data is returned
794703Shiremath  *	in an ibt_ari_con_t struct accessed by the 'ari_consumer' member of
804703Shiremath  *	the ibt_arej_info_t. However the consumer reject data begins at
814703Shiremath  *	'ari_consumer.rej_ari[1]', and is of length
824703Shiremath  *	'ari_consumer.rej_ari_len - 1' (the first byte is the REJ layer byte),
834703Shiremath  *	where as for a non RDMA-aware ULP consumer REJ, the ARI data begins
844703Shiremath  *	at 'ari_consumer.rej_ari[0]' and is of length 'ari_consumer.rej_ari_len'
854703Shiremath  *
864703Shiremath  *	If an RDMA-aware ULP REQ is rejected by the IP CM Service layer, the
874703Shiremath  *	CM will return the new IBT_CM_RDMA_IP ibt_cm_reason_t, and the
884703Shiremath  *	private data is returned in an ibt_ari_ip_t struct accessed via the
894703Shiremath  *	'ari_ip' member of the ibt_arej_info_t struct.
904703Shiremath  *
914703Shiremath  *	If an RDMA IP CM REQ is sent to a non RDMA-aware ULP consumer, then
924703Shiremath  *	the REQ is Rejected with an IBT_CM_INVALID_SID ibt_cm_reason_t.
930Sstevel@tonic-gate  */
940Sstevel@tonic-gate typedef enum ibt_cm_reason_e {
950Sstevel@tonic-gate 	IBT_CM_SUCCESS		= 0,	/* Success */
960Sstevel@tonic-gate 	IBT_CM_NO_CHAN		= 1,	/* Remote unable to allocate a CHAN */
970Sstevel@tonic-gate 	IBT_CM_NO_EEC		= 2,	/* Remote unable to allocate an EEC */
980Sstevel@tonic-gate 	IBT_CM_NO_RESC		= 3,	/* Remote unable to allocate resource */
990Sstevel@tonic-gate 	IBT_CM_TIMEOUT		= 4,	/* CM protocol timed out waiting for */
1000Sstevel@tonic-gate 					/* a msg */
1010Sstevel@tonic-gate 	IBT_CM_NOT_SUPPORTED 	= 5,	/* Request not supported */
1020Sstevel@tonic-gate 	IBT_CM_INVALID_CID 	= 6,	/* Local CID or Remote CID invalid */
1030Sstevel@tonic-gate 	IBT_CM_INVALID_COMM_INS	= 7,	/* Local CID, Remote CID, Channel */
1040Sstevel@tonic-gate 					/* does not refer to a valid */
1050Sstevel@tonic-gate 					/* communication Instance. */
1060Sstevel@tonic-gate 	IBT_CM_INVALID_SID 	= 8,	/* Service not supported or not */
1070Sstevel@tonic-gate 					/* recognized */
1080Sstevel@tonic-gate 	IBT_CM_INVALID_SRV_TYPE	= 9,	/* Invalid transport service type */
1090Sstevel@tonic-gate 	IBT_CM_CONN_STALE 	= 10,	/* Stale connection */
1100Sstevel@tonic-gate 	IBT_CM_INVALID_RDC 	= 11,	/* RDC does not exist */
1110Sstevel@tonic-gate 	IBT_CM_PRIM_GID 	= 12,	/* Primary remote port gid rejected. */
1120Sstevel@tonic-gate 	IBT_CM_PRIM_LID 	= 13,	/* Primary remote port lid rejected. */
1130Sstevel@tonic-gate 	IBT_CM_INVALID_PRIM_SL 	= 14,	/* Primary Requested SL not supported */
1140Sstevel@tonic-gate 	IBT_CM_INVALID_PRIM_TC 	= 15,	/* Primary Requested traffic class */
1150Sstevel@tonic-gate 					/* not supported */
1160Sstevel@tonic-gate 	IBT_CM_INVALID_PRIM_HOP	= 16,	/* Primary Requested hop limit not */
1170Sstevel@tonic-gate 					/* accepted */
1180Sstevel@tonic-gate 	IBT_CM_INVALID_PRIM_RATE = 17,	/* Primary Packet rate not accepted */
1190Sstevel@tonic-gate 	IBT_CM_ALT_GID 		= 18,	/* Alternate remote port gid rejected */
1200Sstevel@tonic-gate 	IBT_CM_ALT_LID 		= 19,	/* Alternate remote port lid rejected */
1210Sstevel@tonic-gate 	IBT_CM_INVALID_ALT_SL 	= 20,	/* Alternate Requested SL not */
1220Sstevel@tonic-gate 					/* supported */
1230Sstevel@tonic-gate 	IBT_CM_INVALID_ALT_TC 	= 21,	/* Alternate Requested traffic class */
1240Sstevel@tonic-gate 					/* not supported */
1250Sstevel@tonic-gate 	IBT_CM_INVALID_ALT_HOP 	= 22,	/* Alternate Requested hop limit */
1260Sstevel@tonic-gate 					/* accepted */
1270Sstevel@tonic-gate 	IBT_CM_INVALID_ALT_RATE = 23,	/* Alternate Packet rate not accepted */
1280Sstevel@tonic-gate 	IBT_CM_REDIRECT_CM 	= 24,	/* Port & CM redirected */
1290Sstevel@tonic-gate 	IBT_CM_PORT_REDIRECT 	= 25,	/* Port redirected */
1300Sstevel@tonic-gate 	IBT_CM_INVALID_MTU 	= 26,	/* Path MTU not supported */
1310Sstevel@tonic-gate 	IBT_CM_INSUFF_RESOURCE	= 27,	/* Insufficient responder resources */
1320Sstevel@tonic-gate 	IBT_CM_CONSUMER 	= 28,	/* Consumer rejected connection */
1330Sstevel@tonic-gate 	IBT_CM_RNR_RETRY_CNT_REJ = 29,	/* RNR NAK retry count rejected */
1340Sstevel@tonic-gate 	IBT_CM_DUP_COM_ID	= 30,	/* Local CID in REQ is duplicated */
1350Sstevel@tonic-gate 	IBT_CM_CLASS_NO_SUPPORT	= 31,	/* Class version not supported */
1360Sstevel@tonic-gate 	IBT_CM_INVALID_PRIM_FLOW = 32,	/* Invalid primary flow label */
1370Sstevel@tonic-gate 	IBT_CM_INVALID_ALT_FLOW = 33,	/* Invalid alternate flow label */
1380Sstevel@tonic-gate 	IBT_CM_DUP_CONN_REQ	= 1000, /* Duplicate connection request */
1390Sstevel@tonic-gate 	IBT_CM_ABORT		= 1001,	/* Connection aborted */
1400Sstevel@tonic-gate 	IBT_CM_CI_FAILURE	= 1002,	/* A call to CI failed, could be */
1410Sstevel@tonic-gate 					/* query/modify channel */
1424703Shiremath 	IBT_CM_CHAN_INVALID_STATE = 1003, /* Passive's QP is not in Init */
1430Sstevel@tonic-gate 					/* state */
1444703Shiremath 	IBT_CM_RDMA_IP		= 1004 /* RDMA IP CM reject */
1450Sstevel@tonic-gate } ibt_cm_reason_t;
1460Sstevel@tonic-gate 
1470Sstevel@tonic-gate /*
1480Sstevel@tonic-gate  * CM flags.
1490Sstevel@tonic-gate  */
1500Sstevel@tonic-gate typedef uint8_t ibt_cm_flags_t;
1510Sstevel@tonic-gate 
1520Sstevel@tonic-gate #define	IBT_CM_NO_FLAGS		0x0
1530Sstevel@tonic-gate #define	IBT_CM_FLOW_CONTROL	0x1
1540Sstevel@tonic-gate #define	IBT_CM_SRQ_EXISTS	0x2
1550Sstevel@tonic-gate 
1560Sstevel@tonic-gate 
1570Sstevel@tonic-gate /*
1580Sstevel@tonic-gate  * The CM Handler function return values.
1590Sstevel@tonic-gate  */
1600Sstevel@tonic-gate typedef enum ibt_cm_status_e {
1610Sstevel@tonic-gate 	IBT_CM_ACCEPT		= 0,
1620Sstevel@tonic-gate 	IBT_CM_REJECT		= 1,
1630Sstevel@tonic-gate 	IBT_CM_REDIRECT_PORT	= 2,	/* Redirect port */
1640Sstevel@tonic-gate 	IBT_CM_REDIRECT		= 3,	/* Redirect port and CM */
1650Sstevel@tonic-gate 	IBT_CM_NO_CHANNEL	= 4,	/* Unable to allocate a channel */
1660Sstevel@tonic-gate 	IBT_CM_NO_RESOURCE	= 5,	/* Unable to allocate a resource */
1670Sstevel@tonic-gate 	IBT_CM_DEFAULT		= 6,	/* Do the default action */
1680Sstevel@tonic-gate 	IBT_CM_DEFER		= 7	/* Can't complete processing now */
1690Sstevel@tonic-gate } ibt_cm_status_t;			/* will call ibt_cm_proceed() */
1700Sstevel@tonic-gate 					/* later */
1710Sstevel@tonic-gate 
1720Sstevel@tonic-gate /*
1730Sstevel@tonic-gate  * SIDR_REP status type
1740Sstevel@tonic-gate  */
1750Sstevel@tonic-gate typedef enum ibt_sidr_status_e {
1760Sstevel@tonic-gate 	IBT_CM_SREP_CHAN_VALID	= 0,
1770Sstevel@tonic-gate 	IBT_CM_SREP_SID_INVALID	= 1,	/* Service ID not supported */
1780Sstevel@tonic-gate 	IBT_CM_SREP_REJ		= 2,	/* Service provider reject */
1790Sstevel@tonic-gate 	IBT_CM_SREP_NO_CHAN	= 3,	/* No channel available */
1800Sstevel@tonic-gate 	IBT_CM_SREP_REDIRECT	= 4,	/* Redirect request */
1810Sstevel@tonic-gate 	IBT_CM_SREP_CL_INVALID	= 5,	/* Class Version is invalid */
1820Sstevel@tonic-gate 	IBT_CM_SREP_TIMEOUT	= 1000	/* No SIDR_REP received */
1830Sstevel@tonic-gate } ibt_sidr_status_t;
1840Sstevel@tonic-gate 
1850Sstevel@tonic-gate /*
1860Sstevel@tonic-gate  * Alternate path status type
1870Sstevel@tonic-gate  * The implementation defined status codes begin from 20. The status codes
1880Sstevel@tonic-gate  * below 20 are based on apr_status in the APR mad.
1890Sstevel@tonic-gate  */
1900Sstevel@tonic-gate typedef enum ibt_ap_status_e {
1910Sstevel@tonic-gate 	IBT_CM_AP_LOADED	= 0,	/* AP loaded successfully */
1920Sstevel@tonic-gate 	IBT_CM_AP_INVALID_COMMID = 1,	/* Invalid communication instance */
1930Sstevel@tonic-gate 	IBT_CM_AP_NOT_SUPPORTED	= 2,	/* Alternate paths not supported */
1940Sstevel@tonic-gate 	IBT_CM_AP_REJECT	= 3,	/* Failover port rejected */
1950Sstevel@tonic-gate 	IBT_CM_AP_REDIRECT	= 4,	/* Reject - redirect */
1960Sstevel@tonic-gate 	IBT_CM_AP_MATCH_PRIM	= 5,	/* AP matches primary path */
1970Sstevel@tonic-gate 	IBT_CM_AP_QPNEECN_INVALID = 6,	/* AP QPN/EECN does not match */
1980Sstevel@tonic-gate 	IBT_CM_AP_RLID_REJECTED	= 7,	/* AP remote port lid rejected */
1990Sstevel@tonic-gate 	IBT_CM_AP_RGID_REJECTED	= 8,	/* AP remote port gid rejected */
2000Sstevel@tonic-gate 	IBT_CM_AP_FLOW_REJECTED	= 9,	/* AP flow label rejected */
2010Sstevel@tonic-gate 	IBT_CM_AP_TCLASS_REJECTED = 10,	/* AP traffic class rejected */
2020Sstevel@tonic-gate 	IBT_CM_AP_HOP_REJECTED	= 11,	/* AP hop limit rejected */
2030Sstevel@tonic-gate 	IBT_CM_AP_RATE_REJECTED	= 12,	/* AP static packet rate rejected */
2040Sstevel@tonic-gate 	IBT_CM_AP_SL_REJECTED	= 13,	/* AP service level rejected */
2050Sstevel@tonic-gate 	IBT_CM_AP_TIMEOUT	= 1000,	/* LAP timed out */
2060Sstevel@tonic-gate 	IBT_CM_AP_ABORT		= 1001	/* ibt_set_alternate_path returned */
2070Sstevel@tonic-gate 					/* earlier because of connection */
2080Sstevel@tonic-gate 					/* getting closed */
2090Sstevel@tonic-gate } ibt_ap_status_t;
2100Sstevel@tonic-gate 
2110Sstevel@tonic-gate /*
2120Sstevel@tonic-gate  * Communication event types.
2130Sstevel@tonic-gate  */
2140Sstevel@tonic-gate typedef enum ibt_cm_event_type_e {
2150Sstevel@tonic-gate 	IBT_CM_EVENT_REQ_RCV	= 0x1,
2160Sstevel@tonic-gate 	IBT_CM_EVENT_REP_RCV,
2170Sstevel@tonic-gate 	IBT_CM_EVENT_MRA_RCV,
2180Sstevel@tonic-gate 	IBT_CM_EVENT_LAP_RCV,
2190Sstevel@tonic-gate 	IBT_CM_EVENT_APR_RCV,
2200Sstevel@tonic-gate 	IBT_CM_EVENT_CONN_EST,		/* RTU has been sent/recvd and it is */
2210Sstevel@tonic-gate 					/* OK to use the connection */
2220Sstevel@tonic-gate 	IBT_CM_EVENT_CONN_CLOSED,	/* Connection has been closed and it */
2230Sstevel@tonic-gate 					/* is OK to free resources associated */
2240Sstevel@tonic-gate 					/* with the connection. */
2250Sstevel@tonic-gate 	IBT_CM_EVENT_FAILURE		/* The CM Failure see cf_code in the */
2260Sstevel@tonic-gate 					/* ibt_cm_conn_failed_t struct for */
2270Sstevel@tonic-gate 					/* details of the failure */
2280Sstevel@tonic-gate } ibt_cm_event_type_t;
2290Sstevel@tonic-gate 
2300Sstevel@tonic-gate /*
2310Sstevel@tonic-gate  * CM and Port redirect information.
2320Sstevel@tonic-gate  */
2330Sstevel@tonic-gate typedef struct ibt_redirect_info_s {
2340Sstevel@tonic-gate 	ib_gid_t	rdi_gid;
2350Sstevel@tonic-gate 	uint8_t		rdi_tclass;
2360Sstevel@tonic-gate 	uint8_t		rdi_sl:4;
2370Sstevel@tonic-gate 	uint_t		rdi_flow:20;
2380Sstevel@tonic-gate 	ib_lid_t	rdi_dlid;
2390Sstevel@tonic-gate 	ib_qpn_t	rdi_qpn;
2400Sstevel@tonic-gate 	ib_qkey_t	rdi_qkey;
2410Sstevel@tonic-gate 	ib_pkey_t	rdi_pkey;
2420Sstevel@tonic-gate } ibt_redirect_info_t;
2430Sstevel@tonic-gate 
2440Sstevel@tonic-gate /*
2450Sstevel@tonic-gate  * Values for rep_failover_status.
2460Sstevel@tonic-gate  */
2470Sstevel@tonic-gate #define	IBT_CM_FAILOVER_ACCEPT		0x00 /* Failover port accepted */
2480Sstevel@tonic-gate #define	IBT_CM_FAILOVER_REJ_NOTSUPP	0x01 /* Failover not supported */
2490Sstevel@tonic-gate #define	IBT_CM_FAILOVER_REJ		0x02 /* Failover port rejected */
2500Sstevel@tonic-gate 
2510Sstevel@tonic-gate /*
2520Sstevel@tonic-gate  * CM REP_RCV event structure.
2530Sstevel@tonic-gate  */
2540Sstevel@tonic-gate typedef struct ibt_cm_rep_rcv_s {
2550Sstevel@tonic-gate 	uint8_t		rep_rdma_ra_in;		/* Arbitrated responder */
2560Sstevel@tonic-gate 						/* resources (rdma_ra_in) */
2570Sstevel@tonic-gate 	uint8_t		rep_rdma_ra_out;	/* Arbitrated initiator */
2580Sstevel@tonic-gate 						/* depth (rdma_ra_out) */
2590Sstevel@tonic-gate 	clock_t		rep_service_time;	/* time in clock ticks */
2600Sstevel@tonic-gate 						/* Time to complete */
2610Sstevel@tonic-gate 						/* processing of REP event */
2620Sstevel@tonic-gate 	uint8_t		rep_failover_status;	/* Failover Port status */
2630Sstevel@tonic-gate 	ibt_cm_flags_t	rep_flags;		/* EE flow control, SRQ etc */
2640Sstevel@tonic-gate } ibt_cm_rep_rcv_t;
2650Sstevel@tonic-gate 
2660Sstevel@tonic-gate 
2670Sstevel@tonic-gate /*
2680Sstevel@tonic-gate  * Values for mra_msg_type.
2690Sstevel@tonic-gate  */
2700Sstevel@tonic-gate #define	IBT_CM_MRA_TYPE_REQ	0x00	/* mra_msg values */
2710Sstevel@tonic-gate #define	IBT_CM_MRA_TYPE_REP	0x01
2720Sstevel@tonic-gate #define	IBT_CM_MRA_TYPE_LAP	0x02
2730Sstevel@tonic-gate 
2740Sstevel@tonic-gate /*
2750Sstevel@tonic-gate  * CM MRA_RCV event structure.
2760Sstevel@tonic-gate  */
2770Sstevel@tonic-gate typedef struct ibt_cm_mra_rcv_s {
2780Sstevel@tonic-gate 	uint8_t		mra_msg_type;	/* The message being MRA'd */
2790Sstevel@tonic-gate 	clock_t		mra_service_time;	/* timeout in microseconds */
2800Sstevel@tonic-gate } ibt_cm_mra_rcv_t;
2810Sstevel@tonic-gate 
2820Sstevel@tonic-gate /*
2830Sstevel@tonic-gate  * CM LAP_RCV event structure.
2840Sstevel@tonic-gate  */
2850Sstevel@tonic-gate typedef struct ibt_cm_lap_rcv_s {
2860Sstevel@tonic-gate 	ibt_adds_vect_t	lap_alternate_path;
2870Sstevel@tonic-gate 	clock_t		lap_timeout;		/* timeout in microseconds */
2880Sstevel@tonic-gate 						/* This is the time that the */
2890Sstevel@tonic-gate 						/* Service handler has to */
2900Sstevel@tonic-gate 						/* return to the CM */
2910Sstevel@tonic-gate } ibt_cm_lap_rcv_t;
2920Sstevel@tonic-gate 
2934703Shiremath #define	IBT_CM_IP_MAJ_VER	0
2944703Shiremath #define	IBT_CM_IP_MIN_VER	0
2954703Shiremath #define	IBT_CM_IP_IPV_V4	0x4
2964703Shiremath #define	IBT_CM_IP_IPV_V6	0x6
2974703Shiremath 
2980Sstevel@tonic-gate /*
2990Sstevel@tonic-gate  * Consumer defined Additional reject information.
3000Sstevel@tonic-gate  */
3010Sstevel@tonic-gate typedef struct ibt_ari_con_s {
3020Sstevel@tonic-gate 	uint8_t		rej_ari_len;			/* Length */
3030Sstevel@tonic-gate 	uint8_t		rej_ari[IBT_CM_ADDL_REJ_LEN];	/* Buffer */
3040Sstevel@tonic-gate } ibt_ari_con_t;
3050Sstevel@tonic-gate 
3060Sstevel@tonic-gate /*
3074703Shiremath  * Consumer defined Additional reject information.
3084703Shiremath  * For RDMA IP CM Service.
3094703Shiremath  */
3104703Shiremath typedef uint8_t ibt_ari_ip_reason_t;
3114703Shiremath #define	IBT_ARI_IP_UNSPECIFIED		0x0
3124703Shiremath #define	IBT_ARI_IP_MAJOR_VERSION	0x1
3134703Shiremath #define	IBT_ARI_IP_MINOR_VERSION	0x2
3144703Shiremath #define	IBT_ARI_IP_IPV			0x3
3154703Shiremath #define	IBT_ARI_IP_SRC_ADDR		0x4
3164703Shiremath #define	IBT_ARI_IP_DST_ADDR		0x5
3174703Shiremath #define	IBT_ARI_IP_UNKNOWN_ADDR		0x6
3184703Shiremath 
3194703Shiremath typedef struct ibt_ari_ip_s {
3204703Shiremath 	ibt_ip_addr_t		ip_suggested_addr;	/* IP_UNKNOWN_ADDR */
3214703Shiremath 	boolean_t		ip_suggested;	/* suggested valid */
3224703Shiremath 	ibt_ari_ip_reason_t	ip_reason;
3234703Shiremath 	uint8_t			ip_suggested_version:4;	/* IP_MAJOR_VERSION */
3244703Shiremath 							/* IP_MINOR_VERSION */
3254703Shiremath 							/* IP_IPV, */
3264703Shiremath 							/* IP_SRC_ADDR, */
3274703Shiremath 							/* IP_DST_ADDR */
3284703Shiremath } ibt_ari_ip_t;
3294703Shiremath 
3304703Shiremath /*
3310Sstevel@tonic-gate  * Additional reject information.
3320Sstevel@tonic-gate  */
3330Sstevel@tonic-gate typedef union ibt_arej_info_u {
3340Sstevel@tonic-gate 	ibt_ari_con_t		ari_consumer;	/* IBT_CM_CONSUMER */
3350Sstevel@tonic-gate 	ib_gid_t		ari_gid;	/* IBT_CM_PRIM_GID, */
3360Sstevel@tonic-gate 						/* IBT_CM_ALT_GID, */
3370Sstevel@tonic-gate 						/* IBT_CM_PORT_REDIRECT */
3380Sstevel@tonic-gate 	ib_lid_t		ari_lid;	/* IBT_CM_PRIM_LID, */
3390Sstevel@tonic-gate 						/* IBT_CM_ALT_LID */
3400Sstevel@tonic-gate 	uint8_t			ari_sl:4;	/* IBT_CM_INVALID_PRIM_SL, */
3410Sstevel@tonic-gate 						/* IBT_CM_INVALID_ALT_SL */
3420Sstevel@tonic-gate 	uint8_t			ari_tclass;	/* IBT_CM_INVALID_PRIM_TC, */
3430Sstevel@tonic-gate 						/* IBT_CM_INVALID_ALT_TC */
3440Sstevel@tonic-gate 	uint8_t			ari_hop;	/* IBT_CM_INVALID_PRIM_HOP, */
3450Sstevel@tonic-gate 						/* IBT_CM_INVALID_ALT_HOP */
3460Sstevel@tonic-gate 	uint_t			ari_flow:20;	/* IBT_CM_INVALID_PRIM_FLOW, */
3470Sstevel@tonic-gate 						/* IBT_CM_INVALID_ALT_FLOW */
3480Sstevel@tonic-gate 	ibt_srate_t		ari_rate;	/* IBT_CM_INVALID_PRIM_RATE, */
3490Sstevel@tonic-gate 						/* IBT_CM_INVALID_ALT_RATE */
3500Sstevel@tonic-gate 	ib_mtu_t		ari_mtu;	/* IBT_CM_INVALID_MTU */
3510Sstevel@tonic-gate 	ibt_redirect_info_t	ari_redirect;	/* IBT_CM_REDIRECT_CM */
3524703Shiremath 	ibt_ari_ip_t		ari_ip;		/* IBT_CM_RDMA_IP */
3530Sstevel@tonic-gate } ibt_arej_info_t;
3540Sstevel@tonic-gate 
3550Sstevel@tonic-gate /*
3560Sstevel@tonic-gate  * CM APR_RCV event structure.
3570Sstevel@tonic-gate  */
3580Sstevel@tonic-gate typedef struct ibt_cm_apr_rcv_s {
3590Sstevel@tonic-gate 	ibt_ap_status_t		apr_status;
3600Sstevel@tonic-gate 	boolean_t		apr_arej_info_valid;
3610Sstevel@tonic-gate 	ibt_arej_info_t		apr_arej_info;
3620Sstevel@tonic-gate } ibt_cm_apr_rcv_t;
3630Sstevel@tonic-gate 
3640Sstevel@tonic-gate 
3650Sstevel@tonic-gate /*
3660Sstevel@tonic-gate  * Connection Failed Message type (values of cf_msg).
3670Sstevel@tonic-gate  * Identifies the CM message that either timed out or is being rejected.
3680Sstevel@tonic-gate  */
3690Sstevel@tonic-gate #define	IBT_CM_FAILURE_REQ	0x00
3700Sstevel@tonic-gate #define	IBT_CM_FAILURE_REP	0x01
3710Sstevel@tonic-gate #define	IBT_CM_FAILURE_UNKNOWN	0x02
3720Sstevel@tonic-gate #define	IBT_CM_FAILURE_LAP	0x03
3730Sstevel@tonic-gate 
3740Sstevel@tonic-gate /*
3750Sstevel@tonic-gate  * CM Failure code (values of cf_code).
3760Sstevel@tonic-gate  * Identifies the reason for failure.
3770Sstevel@tonic-gate  */
3780Sstevel@tonic-gate #define	IBT_CM_FAILURE_REJ_SENT	0x00
3790Sstevel@tonic-gate #define	IBT_CM_FAILURE_REJ_RCV	0x01
3800Sstevel@tonic-gate #define	IBT_CM_FAILURE_TIMEOUT	0x02
3810Sstevel@tonic-gate #define	IBT_CM_FAILURE_DUP	0x03
3820Sstevel@tonic-gate #define	IBT_CM_FAILURE_STALE	0x04
3830Sstevel@tonic-gate 
3840Sstevel@tonic-gate /*
3850Sstevel@tonic-gate  * IBT_CM_EVENT_FAILURE event struct.
3860Sstevel@tonic-gate  */
3870Sstevel@tonic-gate typedef struct ibt_cm_conn_failed_s {
3880Sstevel@tonic-gate 	uint8_t		cf_code;	/* Failure Code */
3890Sstevel@tonic-gate 	uint8_t		cf_msg;		/* The message that timed out or is */
3900Sstevel@tonic-gate 					/* being rejected */
3910Sstevel@tonic-gate 	boolean_t	cf_arej_info_valid;	/* Is cf_additional valid? */
3920Sstevel@tonic-gate 	ibt_cm_reason_t	cf_reason;	/* Reject reason */
3930Sstevel@tonic-gate 	ibt_arej_info_t	cf_additional;	/* Additional Reject info */
3940Sstevel@tonic-gate } ibt_cm_conn_failed_t;
3950Sstevel@tonic-gate 
3960Sstevel@tonic-gate 
3970Sstevel@tonic-gate /*
3980Sstevel@tonic-gate  * CM REQ_RCV event structure.
3990Sstevel@tonic-gate  *
4000Sstevel@tonic-gate  * The req_cm_opaque is an IBTF CM opaque (to the client) value, that should
4010Sstevel@tonic-gate  * be returned to the IBTF CM if the client/server CM handler wishes to call
4020Sstevel@tonic-gate  * ibt_cm_delay().
4030Sstevel@tonic-gate  *
4040Sstevel@tonic-gate  *	prim_addr->av_dgid		Is the GID of the requester.
4050Sstevel@tonic-gate  *	prim_addr->av_sgid		Is the local GID to which the
4060Sstevel@tonic-gate  *					requester is attempting to establish
4070Sstevel@tonic-gate  *					a connection to.
4080Sstevel@tonic-gate  *	hca_guid			Is the HCA GUID that contains the
4090Sstevel@tonic-gate  *					prim_addr->av_sgid
4100Sstevel@tonic-gate  *	prim_hca_port			Is the port on the hca_guid that
4110Sstevel@tonic-gate  *					prim_addr->av_sgid is on.
4120Sstevel@tonic-gate  */
4130Sstevel@tonic-gate typedef struct ibt_cm_req_rcv_s {
4140Sstevel@tonic-gate 	ib_svc_id_t	req_service_id;
4150Sstevel@tonic-gate 	ibt_tran_srv_t	req_transport;
4160Sstevel@tonic-gate 	ib_guid_t	req_hca_guid;
4170Sstevel@tonic-gate 	uint8_t		req_prim_hca_port;
4180Sstevel@tonic-gate 	uint8_t		req_alt_hca_port;
4190Sstevel@tonic-gate 	ibt_adds_vect_t	req_prim_addr;
4200Sstevel@tonic-gate 	ibt_adds_vect_t	req_alt_addr;
4210Sstevel@tonic-gate 	uint8_t		req_rdma_ra_in;   	/* Offered responder */
4220Sstevel@tonic-gate 						/* resources. */
4230Sstevel@tonic-gate 	uint8_t		req_rdma_ra_out; 	/* Offered initiator depth */
4240Sstevel@tonic-gate 	clock_t		req_timeout;		/* timeout in microseconds */
4250Sstevel@tonic-gate 						/* This is the time that the */
4260Sstevel@tonic-gate 						/* Service handler has to */
4270Sstevel@tonic-gate 						/* return to the CM */
4280Sstevel@tonic-gate 	ib_qpn_t	req_remote_qpn;
4290Sstevel@tonic-gate 	ib_qkey_t	req_remote_qkey;
4300Sstevel@tonic-gate 	ib_pkey_t	req_pkey;
4310Sstevel@tonic-gate 	ibt_cm_flags_t	req_flags;		/* EE flow control etc */
4320Sstevel@tonic-gate 	uint8_t		req_retry_cnt:3;
4330Sstevel@tonic-gate 	ibt_rnr_retry_cnt_t	req_rnr_retry_cnt;
4340Sstevel@tonic-gate 	ib_eecn_t	req_opaque1;
4350Sstevel@tonic-gate 	ib_eecn_t	req_opaque2;
4360Sstevel@tonic-gate } ibt_cm_req_rcv_t;
4370Sstevel@tonic-gate 
438*9913SShantkumar.Hiremath@Sun.COM typedef struct ibt_ofuvcm_req_data_s {
439*9913SShantkumar.Hiremath@Sun.COM 	uint32_t		req_rq_psn:24;
440*9913SShantkumar.Hiremath@Sun.COM 	uint32_t		reserved:8;
441*9913SShantkumar.Hiremath@Sun.COM 	ib_mtu_t		req_path_mtu;
442*9913SShantkumar.Hiremath@Sun.COM 	ibt_rnr_nak_time_t	req_rnr_nak_time;
443*9913SShantkumar.Hiremath@Sun.COM } ibt_ofuvcm_req_data_t;
444*9913SShantkumar.Hiremath@Sun.COM 
4450Sstevel@tonic-gate /*
4460Sstevel@tonic-gate  * The IBT_CM_EVENT_CONN_CLOSED event is generated by the CM when a connection
4470Sstevel@tonic-gate  * has been closed. The reason the connection was closed is given in the
4480Sstevel@tonic-gate  * "closed" member of the cm_event as one of:
4490Sstevel@tonic-gate  *
4500Sstevel@tonic-gate  * A client can only call ibt_free_channel() to free channel resources on
4510Sstevel@tonic-gate  * receipt of the IBT_CM_EVENT_CONN_CLOSED event.
4520Sstevel@tonic-gate  */
4530Sstevel@tonic-gate #define	IBT_CM_CLOSED_DREP_RCVD		0x01
4540Sstevel@tonic-gate #define	IBT_CM_CLOSED_DREQ_RCVD		0x02
4550Sstevel@tonic-gate #define	IBT_CM_CLOSED_REJ_RCVD		0x03
4560Sstevel@tonic-gate #define	IBT_CM_CLOSED_DREQ_TIMEOUT	0x04
4570Sstevel@tonic-gate #define	IBT_CM_CLOSED_DUP		0x05
4580Sstevel@tonic-gate #define	IBT_CM_CLOSED_ABORT		0x06
4590Sstevel@tonic-gate #define	IBT_CM_CLOSED_STALE		0x07
4600Sstevel@tonic-gate #define	IBT_CM_CLOSED_ALREADY		0x08
4610Sstevel@tonic-gate 
4620Sstevel@tonic-gate /*
4630Sstevel@tonic-gate  * Operation type in ibt_cm_event_type_t.
4640Sstevel@tonic-gate  *
4650Sstevel@tonic-gate  * Note:
4660Sstevel@tonic-gate  * 	The IBT_CM_EVENT_CONN_EST event has no associated "cm_event"
4670Sstevel@tonic-gate  *	field in the ibt_cm_event_t structure.
4680Sstevel@tonic-gate  *
4690Sstevel@tonic-gate  *	The cm_session_id is a CM opaque (to the client) value, that
4700Sstevel@tonic-gate  *	should be returned to the CM if the client/server CM handler wishes
4710Sstevel@tonic-gate  *	to call ibt_cm_delay() or ibt_cm_proceed().
4720Sstevel@tonic-gate  *
4730Sstevel@tonic-gate  */
4740Sstevel@tonic-gate typedef struct ibt_cm_event_s {
4750Sstevel@tonic-gate 	ibt_cm_event_type_t	cm_type;	/* Describes the event */
4760Sstevel@tonic-gate 	void			*cm_session_id;	/* Used by the CM */
4770Sstevel@tonic-gate 	ibt_channel_hdl_t	cm_channel;	/* Event channel. Not valid */
4780Sstevel@tonic-gate 						/* for ibt_cm_req_rcv_t */
4790Sstevel@tonic-gate 	ibt_eec_hdl_t		cm_opaque;
4800Sstevel@tonic-gate 	ibt_priv_data_len_t	cm_priv_data_len;	/* 0 if no private */
4810Sstevel@tonic-gate 	void			*cm_priv_data;		/* data returned */
4820Sstevel@tonic-gate 	union {
4830Sstevel@tonic-gate 		ibt_cm_rep_rcv_t		rep;
4840Sstevel@tonic-gate 		ibt_cm_req_rcv_t 		req;
4850Sstevel@tonic-gate 		ibt_cm_lap_rcv_t		lap;
4860Sstevel@tonic-gate 		ibt_cm_apr_rcv_t		apr;
4870Sstevel@tonic-gate 		ibt_cm_mra_rcv_t		mra;
4880Sstevel@tonic-gate 		ibt_cm_conn_failed_t		failed;
4890Sstevel@tonic-gate 		uint8_t				closed;
4900Sstevel@tonic-gate 	} cm_event;	/* operation specific */
4910Sstevel@tonic-gate } ibt_cm_event_t;
4920Sstevel@tonic-gate 
4930Sstevel@tonic-gate /*
4940Sstevel@tonic-gate  * CM Return structure for an incoming REQ
4950Sstevel@tonic-gate  * Server handler that wishes to accept the connection, fills all the
4960Sstevel@tonic-gate  * values before returning to CM
4970Sstevel@tonic-gate  */
4980Sstevel@tonic-gate typedef struct ibt_cm_ret_rep_s {
4990Sstevel@tonic-gate 	ibt_channel_hdl_t	cm_channel;	/* The channel overwhich the */
5000Sstevel@tonic-gate 						/* connection will be */
5010Sstevel@tonic-gate 						/* established */
5020Sstevel@tonic-gate 						/* can be returned NULL */
5030Sstevel@tonic-gate 						/* if no resources available */
5040Sstevel@tonic-gate 	uint8_t			cm_rdma_ra_out; /* max RDMA-R/Atomic sent */
5050Sstevel@tonic-gate 						/* Number of RDMA RD's & */
5060Sstevel@tonic-gate 						/* Atomics outstanding */
5070Sstevel@tonic-gate 	uint8_t			cm_rdma_ra_in;	/* Incoming RDMA-R/Atomic */
5080Sstevel@tonic-gate 						/* Responder resources for */
5090Sstevel@tonic-gate 						/* handling incoming */
5100Sstevel@tonic-gate 						/* RDMA RD's & Atomics */
5110Sstevel@tonic-gate 	ibt_rnr_retry_cnt_t	cm_rnr_retry_cnt;
5120Sstevel@tonic-gate } ibt_cm_ret_rep_t;
5130Sstevel@tonic-gate 
5140Sstevel@tonic-gate /*
5150Sstevel@tonic-gate  * Define an ibt_cm_proceed() argument union.
5160Sstevel@tonic-gate  *
5170Sstevel@tonic-gate  * rep is valid when an IBT client cm handler has decided to continue a
5180Sstevel@tonic-gate  * REQ_RCV, accepting the connection.
5190Sstevel@tonic-gate  *
5200Sstevel@tonic-gate  * rej is valid when an IBT client cm handler has decided to continue a
5210Sstevel@tonic-gate  * REQ_RCV or REP_RCV, rejecting the message.
5220Sstevel@tonic-gate  *
5230Sstevel@tonic-gate  * apr is valid when an IBT client cm handler has decided to continue a
5240Sstevel@tonic-gate  * LAP_RCV, redirecting the lap request.
5250Sstevel@tonic-gate  */
5260Sstevel@tonic-gate typedef union ibt_cm_proceed_reply_s {
5270Sstevel@tonic-gate 	ibt_cm_ret_rep_t	rep;	/* Return for REP */
5280Sstevel@tonic-gate 	ibt_arej_info_t		rej;	/* Return for REJ */
5290Sstevel@tonic-gate 	ibt_redirect_info_t	apr;	/* Return for APR */
5300Sstevel@tonic-gate } ibt_cm_proceed_reply_t;
5310Sstevel@tonic-gate 
5320Sstevel@tonic-gate 
5330Sstevel@tonic-gate /*
5340Sstevel@tonic-gate  * Define a CM handler return arguments structure.
5350Sstevel@tonic-gate  *
5360Sstevel@tonic-gate  * cm_ret.rep is returned to the CM when an IBT client cm handler has
5370Sstevel@tonic-gate  * decided to accept a connection in response to a CM REQ_RCV event.
5380Sstevel@tonic-gate  *
5390Sstevel@tonic-gate  * cm_ret.rej is returned to the CM when an IBT client cm handler
5400Sstevel@tonic-gate  * has decided to reject the connection in response to a CM REQ_RCV event.
5410Sstevel@tonic-gate  *
5420Sstevel@tonic-gate  * cm_ret.apr is returned to the CM when an IBT client cm handler
5430Sstevel@tonic-gate  * has decided to redirect the lap request in response to a CM LAP RCV event.
5440Sstevel@tonic-gate  *
5450Sstevel@tonic-gate  * The client/server should update cm_ret_len with number of private data
5460Sstevel@tonic-gate  * bytes filled in priv_data arg of the cm handler.
5470Sstevel@tonic-gate  */
5480Sstevel@tonic-gate typedef struct ibt_cm_return_args_s {
5490Sstevel@tonic-gate 	ibt_priv_data_len_t	cm_ret_len;
5500Sstevel@tonic-gate 	union {
5510Sstevel@tonic-gate 		ibt_cm_ret_rep_t	rep;	/* Return for REP */
5520Sstevel@tonic-gate 		ibt_arej_info_t		rej;	/* Return for REJ */
5530Sstevel@tonic-gate 		ibt_redirect_info_t	apr;	/* Return for APR */
5540Sstevel@tonic-gate 	} cm_ret;	/* reply specific */
5550Sstevel@tonic-gate } ibt_cm_return_args_t;
5560Sstevel@tonic-gate 
5570Sstevel@tonic-gate 
5580Sstevel@tonic-gate /*
5590Sstevel@tonic-gate  * Communication Manager UD event types.
5600Sstevel@tonic-gate  */
5610Sstevel@tonic-gate typedef enum ibt_cm_ud_event_type_e {
5620Sstevel@tonic-gate 	IBT_CM_UD_EVENT_SIDR_REQ	= 1,
5630Sstevel@tonic-gate 	IBT_CM_UD_EVENT_SIDR_REP	= 2
5640Sstevel@tonic-gate } ibt_cm_ud_event_type_t;
5650Sstevel@tonic-gate 
5660Sstevel@tonic-gate /*
5670Sstevel@tonic-gate  * CM SIDR_REQ event structure.
5680Sstevel@tonic-gate  */
5690Sstevel@tonic-gate typedef struct ibt_cm_sidr_req_s {
5700Sstevel@tonic-gate 	ib_guid_t	sreq_hca_guid;
5710Sstevel@tonic-gate 	uint8_t		sreq_hca_port;
5720Sstevel@tonic-gate 	ib_pkey_t	sreq_pkey;
5730Sstevel@tonic-gate 	ib_svc_id_t	sreq_service_id;
5740Sstevel@tonic-gate } ibt_cm_sidr_req_t;
5750Sstevel@tonic-gate 
5760Sstevel@tonic-gate /*
5770Sstevel@tonic-gate  * CM SIDR_REP event structure.
5780Sstevel@tonic-gate  */
5790Sstevel@tonic-gate typedef struct ibt_cm_sidr_rep_s {
5800Sstevel@tonic-gate 	ibt_sidr_status_t	srep_status;
5810Sstevel@tonic-gate 	ib_svc_id_t		srep_service_id;
5820Sstevel@tonic-gate 	ib_qkey_t		srep_remote_qkey;
5830Sstevel@tonic-gate 	ib_qpn_t		srep_remote_qpn;
5840Sstevel@tonic-gate 	ibt_redirect_info_t	srep_redirect;	/* Only valid if redirect */
5850Sstevel@tonic-gate } ibt_cm_sidr_rep_t;
5860Sstevel@tonic-gate 
5870Sstevel@tonic-gate /*
5880Sstevel@tonic-gate  * Operation type in ibt_cm_ud_event_type_t.
5890Sstevel@tonic-gate  *
5900Sstevel@tonic-gate  * The cm_session_id is a CM opaque (to the client) value, that
5910Sstevel@tonic-gate  * should be returned to the CM if the client/server CM handler
5920Sstevel@tonic-gate  * wishes to call ibt_cm_ud_proceed().
5930Sstevel@tonic-gate  */
5940Sstevel@tonic-gate typedef struct ibt_cm_ud_event_s {
5950Sstevel@tonic-gate 	ibt_cm_ud_event_type_t	cm_type;	/* Describes the event record */
5960Sstevel@tonic-gate 	void			*cm_session_id;	/* Used by the CM */
5970Sstevel@tonic-gate 	ibt_priv_data_len_t	cm_priv_data_len;
5980Sstevel@tonic-gate 	void			*cm_priv_data;
5990Sstevel@tonic-gate 	union {
6000Sstevel@tonic-gate 		ibt_cm_sidr_rep_t	sidr_rep;
6010Sstevel@tonic-gate 		ibt_cm_sidr_req_t	sidr_req;
6020Sstevel@tonic-gate 	} cm_event;				/* operation specific */
6030Sstevel@tonic-gate } ibt_cm_ud_event_t;
6040Sstevel@tonic-gate 
6050Sstevel@tonic-gate 
6060Sstevel@tonic-gate /*
6070Sstevel@tonic-gate  * Define a CM UD handler return arguments structure.
6080Sstevel@tonic-gate  *
6090Sstevel@tonic-gate  * The information here is returned to the CM when an IBT client CM UD
6100Sstevel@tonic-gate  * handler has decided to communicate (via UD messages) with the requester
6110Sstevel@tonic-gate  * of the SIDR_REQ_RCV event.
6120Sstevel@tonic-gate  *
6130Sstevel@tonic-gate  * The ud_channel encodes the QPN and Q_Key to be placed in the SIDR_REP.
6140Sstevel@tonic-gate  *
6150Sstevel@tonic-gate  * CM sets ud_ret_len to 0 before calling the UD CM handler.  If the CM UD
6160Sstevel@tonic-gate  * handler wishes to send private data back, it needs to update ud_ret_len
6170Sstevel@tonic-gate  * with the actual number of bytes to be sent back in the SIDR_REP MAD.  It
6180Sstevel@tonic-gate  * copies said data to the buffer pointed to by the ret_priv_data argument.
6190Sstevel@tonic-gate  *
6200Sstevel@tonic-gate  * The ud_redirect structure should only be updated if the UD CM handler is
6210Sstevel@tonic-gate  * Redirecting a CM request.
6220Sstevel@tonic-gate  */
6230Sstevel@tonic-gate typedef struct ibt_cm_ud_return_args_s {
6240Sstevel@tonic-gate 	ibt_priv_data_len_t	ud_ret_len;
6250Sstevel@tonic-gate 	ibt_channel_hdl_t	ud_channel;
6260Sstevel@tonic-gate 	ibt_redirect_info_t	ud_redirect;
6270Sstevel@tonic-gate } ibt_cm_ud_return_args_t;
6280Sstevel@tonic-gate 
6290Sstevel@tonic-gate 
6300Sstevel@tonic-gate /*
6310Sstevel@tonic-gate  * IBT Client CM Callback function typedefs.
6320Sstevel@tonic-gate  *
6330Sstevel@tonic-gate  * ibt_cm_handler_t:
6340Sstevel@tonic-gate  *
6350Sstevel@tonic-gate  * The CM event handler function. An IBT client callback that handles
6360Sstevel@tonic-gate  * CM events. If the handler will exceed the event service timeout
6370Sstevel@tonic-gate  * then it should call ibt_cm_delay(), specifying the maximum time it
6380Sstevel@tonic-gate  * will take to complete processing the CM event.
6390Sstevel@tonic-gate  *
6400Sstevel@tonic-gate  * Clients are advised not to issue blocking calls from a cm handler, as this
6410Sstevel@tonic-gate  * would block the CM threads, and could delay or block other client
6420Sstevel@tonic-gate  * connections.
6430Sstevel@tonic-gate  *
6440Sstevel@tonic-gate  * Clients are allowed to make resource clean up/free calls in the CM handler
6450Sstevel@tonic-gate  * such as ibt_free_cq, ibt_free_rc/ud_channel, etc. on connection failure
6460Sstevel@tonic-gate  * or tear down.
6470Sstevel@tonic-gate  *
6480Sstevel@tonic-gate  * Clients should not call ibt_close_rc_channel in the cm handler for connection
6490Sstevel@tonic-gate  * failure or tear down events, as these events already perform the processing
6500Sstevel@tonic-gate  * necessary to close the channel.
6510Sstevel@tonic-gate  *
6520Sstevel@tonic-gate  * Clients can call ibt_close_rc_channel only in the non-blocking mode from
6530Sstevel@tonic-gate  * the cm handler for connection abort.
6540Sstevel@tonic-gate  */
6550Sstevel@tonic-gate typedef ibt_cm_status_t (*ibt_cm_handler_t)(void *cm_private,
6560Sstevel@tonic-gate     ibt_cm_event_t *event, ibt_cm_return_args_t *ret_args,
6570Sstevel@tonic-gate     void *ret_priv_data, ibt_priv_data_len_t ret_len_max);
6580Sstevel@tonic-gate 
6590Sstevel@tonic-gate /*
6600Sstevel@tonic-gate  * ibt_cm_ud_handler_t	- Pointer to the CM UD event handler function.
6610Sstevel@tonic-gate  *			  This function should handle the following CM
6620Sstevel@tonic-gate  *			  events:
6630Sstevel@tonic-gate  *				IBT_CM_UD_EVENT_SIDR_REQ
6640Sstevel@tonic-gate  *				IBT_CM_UD_EVENT_SIDR_REP
6650Sstevel@tonic-gate  */
6660Sstevel@tonic-gate typedef ibt_cm_status_t (*ibt_cm_ud_handler_t)(void *ud_cm_private,
6670Sstevel@tonic-gate     ibt_cm_ud_event_t *event, ibt_cm_ud_return_args_t *ret_args,
6680Sstevel@tonic-gate     void *ret_priv_data, ibt_priv_data_len_t ret_len_max);
6690Sstevel@tonic-gate 
6700Sstevel@tonic-gate #ifdef __cplusplus
6710Sstevel@tonic-gate }
6720Sstevel@tonic-gate #endif
6730Sstevel@tonic-gate 
6740Sstevel@tonic-gate #endif /* _SYS_IB_IBTL_IBTI_CM_H */
675