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