1*d6b92ffaSHans Petter Selasky /* 2*d6b92ffaSHans Petter Selasky * Copyright (c) 2004-2006 Intel Corporation. All rights reserved. 3*d6b92ffaSHans Petter Selasky * Copyright (c) 2004 Topspin Corporation. All rights reserved. 4*d6b92ffaSHans Petter Selasky * Copyright (c) 2004 Voltaire Corporation. All rights reserved. 5*d6b92ffaSHans Petter Selasky * 6*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two 7*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 8*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file 9*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the 10*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below: 11*d6b92ffaSHans Petter Selasky * 12*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or 13*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following 14*d6b92ffaSHans Petter Selasky * conditions are met: 15*d6b92ffaSHans Petter Selasky * 16*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above 17*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 18*d6b92ffaSHans Petter Selasky * disclaimer. 19*d6b92ffaSHans Petter Selasky * 20*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above 21*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 22*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials 23*d6b92ffaSHans Petter Selasky * provided with the distribution. 24*d6b92ffaSHans Petter Selasky * 25*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*d6b92ffaSHans Petter Selasky * SOFTWARE. 33*d6b92ffaSHans Petter Selasky * 34*d6b92ffaSHans Petter Selasky * $Id$ 35*d6b92ffaSHans Petter Selasky */ 36*d6b92ffaSHans Petter Selasky #if !defined(CM_H) 37*d6b92ffaSHans Petter Selasky #define CM_H 38*d6b92ffaSHans Petter Selasky 39*d6b92ffaSHans Petter Selasky #include <infiniband/verbs.h> 40*d6b92ffaSHans Petter Selasky #include <infiniband/sa.h> 41*d6b92ffaSHans Petter Selasky #ifdef _KERNEL 42*d6b92ffaSHans Petter Selasky #include <linux/types.h> 43*d6b92ffaSHans Petter Selasky #include <sys/endian.h> 44*d6b92ffaSHans Petter Selasky #else 45*d6b92ffaSHans Petter Selasky #include <infiniband/types.h> 46*d6b92ffaSHans Petter Selasky #include <infiniband/endian.h> 47*d6b92ffaSHans Petter Selasky #endif 48*d6b92ffaSHans Petter Selasky 49*d6b92ffaSHans Petter Selasky #ifdef __cplusplus 50*d6b92ffaSHans Petter Selasky extern "C" { 51*d6b92ffaSHans Petter Selasky #endif 52*d6b92ffaSHans Petter Selasky 53*d6b92ffaSHans Petter Selasky enum ib_cm_event_type { 54*d6b92ffaSHans Petter Selasky IB_CM_REQ_ERROR, 55*d6b92ffaSHans Petter Selasky IB_CM_REQ_RECEIVED, 56*d6b92ffaSHans Petter Selasky IB_CM_REP_ERROR, 57*d6b92ffaSHans Petter Selasky IB_CM_REP_RECEIVED, 58*d6b92ffaSHans Petter Selasky IB_CM_RTU_RECEIVED, 59*d6b92ffaSHans Petter Selasky IB_CM_USER_ESTABLISHED, 60*d6b92ffaSHans Petter Selasky IB_CM_DREQ_ERROR, 61*d6b92ffaSHans Petter Selasky IB_CM_DREQ_RECEIVED, 62*d6b92ffaSHans Petter Selasky IB_CM_DREP_RECEIVED, 63*d6b92ffaSHans Petter Selasky IB_CM_TIMEWAIT_EXIT, 64*d6b92ffaSHans Petter Selasky IB_CM_MRA_RECEIVED, 65*d6b92ffaSHans Petter Selasky IB_CM_REJ_RECEIVED, 66*d6b92ffaSHans Petter Selasky IB_CM_LAP_ERROR, 67*d6b92ffaSHans Petter Selasky IB_CM_LAP_RECEIVED, 68*d6b92ffaSHans Petter Selasky IB_CM_APR_RECEIVED, 69*d6b92ffaSHans Petter Selasky IB_CM_SIDR_REQ_ERROR, 70*d6b92ffaSHans Petter Selasky IB_CM_SIDR_REQ_RECEIVED, 71*d6b92ffaSHans Petter Selasky IB_CM_SIDR_REP_RECEIVED 72*d6b92ffaSHans Petter Selasky }; 73*d6b92ffaSHans Petter Selasky 74*d6b92ffaSHans Petter Selasky enum ib_cm_data_size { 75*d6b92ffaSHans Petter Selasky IB_CM_REQ_PRIVATE_DATA_SIZE = 92, 76*d6b92ffaSHans Petter Selasky IB_CM_MRA_PRIVATE_DATA_SIZE = 222, 77*d6b92ffaSHans Petter Selasky IB_CM_REJ_PRIVATE_DATA_SIZE = 148, 78*d6b92ffaSHans Petter Selasky IB_CM_REP_PRIVATE_DATA_SIZE = 196, 79*d6b92ffaSHans Petter Selasky IB_CM_RTU_PRIVATE_DATA_SIZE = 224, 80*d6b92ffaSHans Petter Selasky IB_CM_DREQ_PRIVATE_DATA_SIZE = 220, 81*d6b92ffaSHans Petter Selasky IB_CM_DREP_PRIVATE_DATA_SIZE = 224, 82*d6b92ffaSHans Petter Selasky IB_CM_REJ_ARI_LENGTH = 72, 83*d6b92ffaSHans Petter Selasky IB_CM_LAP_PRIVATE_DATA_SIZE = 168, 84*d6b92ffaSHans Petter Selasky IB_CM_APR_PRIVATE_DATA_SIZE = 148, 85*d6b92ffaSHans Petter Selasky IB_CM_APR_INFO_LENGTH = 72, 86*d6b92ffaSHans Petter Selasky IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE = 216, 87*d6b92ffaSHans Petter Selasky IB_CM_SIDR_REP_PRIVATE_DATA_SIZE = 136, 88*d6b92ffaSHans Petter Selasky IB_CM_SIDR_REP_INFO_LENGTH = 72 89*d6b92ffaSHans Petter Selasky }; 90*d6b92ffaSHans Petter Selasky 91*d6b92ffaSHans Petter Selasky struct ib_cm_device { 92*d6b92ffaSHans Petter Selasky struct ibv_context *device_context; 93*d6b92ffaSHans Petter Selasky int fd; 94*d6b92ffaSHans Petter Selasky }; 95*d6b92ffaSHans Petter Selasky 96*d6b92ffaSHans Petter Selasky struct ib_cm_id { 97*d6b92ffaSHans Petter Selasky void *context; 98*d6b92ffaSHans Petter Selasky struct ib_cm_device *device; 99*d6b92ffaSHans Petter Selasky uint32_t handle; 100*d6b92ffaSHans Petter Selasky }; 101*d6b92ffaSHans Petter Selasky 102*d6b92ffaSHans Petter Selasky struct ib_cm_req_event_param { 103*d6b92ffaSHans Petter Selasky struct ib_cm_id *listen_id; 104*d6b92ffaSHans Petter Selasky uint8_t port; 105*d6b92ffaSHans Petter Selasky 106*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *primary_path; 107*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *alternate_path; 108*d6b92ffaSHans Petter Selasky 109*d6b92ffaSHans Petter Selasky __be64 remote_ca_guid; 110*d6b92ffaSHans Petter Selasky uint32_t remote_qkey; 111*d6b92ffaSHans Petter Selasky uint32_t remote_qpn; 112*d6b92ffaSHans Petter Selasky enum ibv_qp_type qp_type; 113*d6b92ffaSHans Petter Selasky 114*d6b92ffaSHans Petter Selasky uint32_t starting_psn; 115*d6b92ffaSHans Petter Selasky uint8_t responder_resources; 116*d6b92ffaSHans Petter Selasky uint8_t initiator_depth; 117*d6b92ffaSHans Petter Selasky unsigned int local_cm_response_timeout:5; 118*d6b92ffaSHans Petter Selasky unsigned int flow_control:1; 119*d6b92ffaSHans Petter Selasky unsigned int remote_cm_response_timeout:5; 120*d6b92ffaSHans Petter Selasky unsigned int retry_count:3; 121*d6b92ffaSHans Petter Selasky unsigned int rnr_retry_count:3; 122*d6b92ffaSHans Petter Selasky unsigned int srq:1; 123*d6b92ffaSHans Petter Selasky }; 124*d6b92ffaSHans Petter Selasky 125*d6b92ffaSHans Petter Selasky struct ib_cm_rep_event_param { 126*d6b92ffaSHans Petter Selasky __be64 remote_ca_guid; 127*d6b92ffaSHans Petter Selasky uint32_t remote_qkey; 128*d6b92ffaSHans Petter Selasky uint32_t remote_qpn; 129*d6b92ffaSHans Petter Selasky uint32_t starting_psn; 130*d6b92ffaSHans Petter Selasky uint8_t responder_resources; 131*d6b92ffaSHans Petter Selasky uint8_t initiator_depth; 132*d6b92ffaSHans Petter Selasky unsigned int target_ack_delay:5; 133*d6b92ffaSHans Petter Selasky unsigned int failover_accepted:2; 134*d6b92ffaSHans Petter Selasky unsigned int flow_control:1; 135*d6b92ffaSHans Petter Selasky unsigned int rnr_retry_count:3; 136*d6b92ffaSHans Petter Selasky unsigned int srq:1; 137*d6b92ffaSHans Petter Selasky }; 138*d6b92ffaSHans Petter Selasky 139*d6b92ffaSHans Petter Selasky enum ib_cm_rej_reason { 140*d6b92ffaSHans Petter Selasky IB_CM_REJ_NO_QP = 1, 141*d6b92ffaSHans Petter Selasky IB_CM_REJ_NO_EEC = 2, 142*d6b92ffaSHans Petter Selasky IB_CM_REJ_NO_RESOURCES = 3, 143*d6b92ffaSHans Petter Selasky IB_CM_REJ_TIMEOUT = 4, 144*d6b92ffaSHans Petter Selasky IB_CM_REJ_UNSUPPORTED = 5, 145*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_COMM_ID = 6, 146*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_COMM_INSTANCE = 7, 147*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_SERVICE_ID = 8, 148*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_TRANSPORT_TYPE = 9, 149*d6b92ffaSHans Petter Selasky IB_CM_REJ_STALE_CONN = 10, 150*d6b92ffaSHans Petter Selasky IB_CM_REJ_RDC_NOT_EXIST = 11, 151*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_GID = 12, 152*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_LID = 13, 153*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_SL = 14, 154*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_TRAFFIC_CLASS = 15, 155*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_HOP_LIMIT = 16, 156*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_PACKET_RATE = 17, 157*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_GID = 18, 158*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_LID = 19, 159*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_SL = 20, 160*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS = 21, 161*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_HOP_LIMIT = 22, 162*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_PACKET_RATE = 23, 163*d6b92ffaSHans Petter Selasky IB_CM_REJ_PORT_CM_REDIRECT = 24, 164*d6b92ffaSHans Petter Selasky IB_CM_REJ_PORT_REDIRECT = 25, 165*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_MTU = 26, 166*d6b92ffaSHans Petter Selasky IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES = 27, 167*d6b92ffaSHans Petter Selasky IB_CM_REJ_CONSUMER_DEFINED = 28, 168*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_RNR_RETRY = 29, 169*d6b92ffaSHans Petter Selasky IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID = 30, 170*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_CLASS_VERSION = 31, 171*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_FLOW_LABEL = 32, 172*d6b92ffaSHans Petter Selasky IB_CM_REJ_INVALID_ALT_FLOW_LABEL = 33 173*d6b92ffaSHans Petter Selasky }; 174*d6b92ffaSHans Petter Selasky 175*d6b92ffaSHans Petter Selasky struct ib_cm_rej_event_param { 176*d6b92ffaSHans Petter Selasky enum ib_cm_rej_reason reason; 177*d6b92ffaSHans Petter Selasky void *ari; 178*d6b92ffaSHans Petter Selasky uint8_t ari_length; 179*d6b92ffaSHans Petter Selasky }; 180*d6b92ffaSHans Petter Selasky 181*d6b92ffaSHans Petter Selasky struct ib_cm_mra_event_param { 182*d6b92ffaSHans Petter Selasky uint8_t service_timeout; 183*d6b92ffaSHans Petter Selasky }; 184*d6b92ffaSHans Petter Selasky 185*d6b92ffaSHans Petter Selasky struct ib_cm_lap_event_param { 186*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *alternate_path; 187*d6b92ffaSHans Petter Selasky }; 188*d6b92ffaSHans Petter Selasky 189*d6b92ffaSHans Petter Selasky enum ib_cm_apr_status { 190*d6b92ffaSHans Petter Selasky IB_CM_APR_SUCCESS, 191*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_COMM_ID, 192*d6b92ffaSHans Petter Selasky IB_CM_APR_UNSUPPORTED, 193*d6b92ffaSHans Petter Selasky IB_CM_APR_REJECT, 194*d6b92ffaSHans Petter Selasky IB_CM_APR_REDIRECT, 195*d6b92ffaSHans Petter Selasky IB_CM_APR_IS_CURRENT, 196*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_QPN_EECN, 197*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_LID, 198*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_GID, 199*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_FLOW_LABEL, 200*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_TCLASS, 201*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_HOP_LIMIT, 202*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_PACKET_RATE, 203*d6b92ffaSHans Petter Selasky IB_CM_APR_INVALID_SL 204*d6b92ffaSHans Petter Selasky }; 205*d6b92ffaSHans Petter Selasky 206*d6b92ffaSHans Petter Selasky struct ib_cm_apr_event_param { 207*d6b92ffaSHans Petter Selasky enum ib_cm_apr_status ap_status; 208*d6b92ffaSHans Petter Selasky void *apr_info; 209*d6b92ffaSHans Petter Selasky uint8_t info_len; 210*d6b92ffaSHans Petter Selasky }; 211*d6b92ffaSHans Petter Selasky 212*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_req_event_param { 213*d6b92ffaSHans Petter Selasky struct ib_cm_id *listen_id; 214*d6b92ffaSHans Petter Selasky uint8_t port; 215*d6b92ffaSHans Petter Selasky uint16_t pkey; 216*d6b92ffaSHans Petter Selasky }; 217*d6b92ffaSHans Petter Selasky 218*d6b92ffaSHans Petter Selasky enum ib_cm_sidr_status { 219*d6b92ffaSHans Petter Selasky IB_SIDR_SUCCESS, 220*d6b92ffaSHans Petter Selasky IB_SIDR_UNSUPPORTED, 221*d6b92ffaSHans Petter Selasky IB_SIDR_REJECT, 222*d6b92ffaSHans Petter Selasky IB_SIDR_NO_QP, 223*d6b92ffaSHans Petter Selasky IB_SIDR_REDIRECT, 224*d6b92ffaSHans Petter Selasky IB_SIDR_UNSUPPORTED_VERSION 225*d6b92ffaSHans Petter Selasky }; 226*d6b92ffaSHans Petter Selasky 227*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_rep_event_param { 228*d6b92ffaSHans Petter Selasky enum ib_cm_sidr_status status; 229*d6b92ffaSHans Petter Selasky uint32_t qkey; 230*d6b92ffaSHans Petter Selasky uint32_t qpn; 231*d6b92ffaSHans Petter Selasky void *info; 232*d6b92ffaSHans Petter Selasky uint8_t info_len; 233*d6b92ffaSHans Petter Selasky }; 234*d6b92ffaSHans Petter Selasky 235*d6b92ffaSHans Petter Selasky struct ib_cm_event { 236*d6b92ffaSHans Petter Selasky struct ib_cm_id *cm_id; 237*d6b92ffaSHans Petter Selasky enum ib_cm_event_type event; 238*d6b92ffaSHans Petter Selasky union { 239*d6b92ffaSHans Petter Selasky struct ib_cm_req_event_param req_rcvd; 240*d6b92ffaSHans Petter Selasky struct ib_cm_rep_event_param rep_rcvd; 241*d6b92ffaSHans Petter Selasky /* No data for RTU received events. */ 242*d6b92ffaSHans Petter Selasky struct ib_cm_rej_event_param rej_rcvd; 243*d6b92ffaSHans Petter Selasky struct ib_cm_mra_event_param mra_rcvd; 244*d6b92ffaSHans Petter Selasky struct ib_cm_lap_event_param lap_rcvd; 245*d6b92ffaSHans Petter Selasky struct ib_cm_apr_event_param apr_rcvd; 246*d6b92ffaSHans Petter Selasky /* No data for DREQ/DREP received events. */ 247*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_req_event_param sidr_req_rcvd; 248*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_rep_event_param sidr_rep_rcvd; 249*d6b92ffaSHans Petter Selasky enum ibv_wc_status send_status; 250*d6b92ffaSHans Petter Selasky } param; 251*d6b92ffaSHans Petter Selasky 252*d6b92ffaSHans Petter Selasky void *private_data; 253*d6b92ffaSHans Petter Selasky }; 254*d6b92ffaSHans Petter Selasky 255*d6b92ffaSHans Petter Selasky /** 256*d6b92ffaSHans Petter Selasky * ib_cm_get_event - Retrieves the next pending communications event, 257*d6b92ffaSHans Petter Selasky * if no event is pending waits for an event. 258*d6b92ffaSHans Petter Selasky * @device: CM device to retrieve the event. 259*d6b92ffaSHans Petter Selasky * @event: Allocated information about the next communication event. 260*d6b92ffaSHans Petter Selasky * Event should be freed using ib_cm_ack_event() 261*d6b92ffaSHans Petter Selasky * 262*d6b92ffaSHans Petter Selasky * IB_CM_REQ_RECEIVED and IB_CM_SIDR_REQ_RECEIVED communication events 263*d6b92ffaSHans Petter Selasky * generated as a result of listen requests result in the allocation of a 264*d6b92ffaSHans Petter Selasky * new @cm_id. 265*d6b92ffaSHans Petter Selasky * Clients are responsible for destroying the new @cm_id. For peer-to-peer 266*d6b92ffaSHans Petter Selasky * IB_CM_REQ_RECEIVED and all other events, the returned @cm_id corresponds 267*d6b92ffaSHans Petter Selasky * to a user's existing communication identifier. 268*d6b92ffaSHans Petter Selasky */ 269*d6b92ffaSHans Petter Selasky int ib_cm_get_event(struct ib_cm_device *device, struct ib_cm_event **event); 270*d6b92ffaSHans Petter Selasky 271*d6b92ffaSHans Petter Selasky /** 272*d6b92ffaSHans Petter Selasky * ib_cm_ack_event - Free a communications event. 273*d6b92ffaSHans Petter Selasky * @event: Event to be released. 274*d6b92ffaSHans Petter Selasky * 275*d6b92ffaSHans Petter Selasky * All events which are allocated by ib_cm_get_event() must be released, 276*d6b92ffaSHans Petter Selasky * there should be a one-to-one correspondence between successful gets 277*d6b92ffaSHans Petter Selasky * and puts. 278*d6b92ffaSHans Petter Selasky */ 279*d6b92ffaSHans Petter Selasky int ib_cm_ack_event(struct ib_cm_event *event); 280*d6b92ffaSHans Petter Selasky 281*d6b92ffaSHans Petter Selasky /** 282*d6b92ffaSHans Petter Selasky * ib_cm_open_device - Returns the device the CM uses to submit requests 283*d6b92ffaSHans Petter Selasky * and retrieve events, corresponding to the specified verbs device. 284*d6b92ffaSHans Petter Selasky * 285*d6b92ffaSHans Petter Selasky * The CM device contains the file descriptor that the CM uses to 286*d6b92ffaSHans Petter Selasky * communicate with the kernel CM component. The primary use of the 287*d6b92ffaSHans Petter Selasky * file descriptor is to test for CM readiness events. When the CM 288*d6b92ffaSHans Petter Selasky * becomes ready to READ there is a pending event ready, and a subsequent 289*d6b92ffaSHans Petter Selasky * call to ib_cm_get_event will not block. 290*d6b92ffaSHans Petter Selasky * Note: The user should not read or write directly to the CM file 291*d6b92ffaSHans Petter Selasky * descriptor, it will likely result in an error or unexpected 292*d6b92ffaSHans Petter Selasky * results. 293*d6b92ffaSHans Petter Selasky */ 294*d6b92ffaSHans Petter Selasky struct ib_cm_device* ib_cm_open_device(struct ibv_context *device_context); 295*d6b92ffaSHans Petter Selasky 296*d6b92ffaSHans Petter Selasky /** 297*d6b92ffaSHans Petter Selasky * ib_cm_close_device - Close a CM device. 298*d6b92ffaSHans Petter Selasky * @device: Device to close. 299*d6b92ffaSHans Petter Selasky */ 300*d6b92ffaSHans Petter Selasky void ib_cm_close_device(struct ib_cm_device *device); 301*d6b92ffaSHans Petter Selasky 302*d6b92ffaSHans Petter Selasky /** 303*d6b92ffaSHans Petter Selasky * ib_cm_create_id - Allocate a communication identifier. 304*d6b92ffaSHans Petter Selasky * 305*d6b92ffaSHans Petter Selasky * Communication identifiers are used to track connection states, service 306*d6b92ffaSHans Petter Selasky * ID resolution requests, and listen requests. 307*d6b92ffaSHans Petter Selasky */ 308*d6b92ffaSHans Petter Selasky int ib_cm_create_id(struct ib_cm_device *device, 309*d6b92ffaSHans Petter Selasky struct ib_cm_id **cm_id, void *context); 310*d6b92ffaSHans Petter Selasky 311*d6b92ffaSHans Petter Selasky /** 312*d6b92ffaSHans Petter Selasky * ib_cm_destroy_id - Destroy a connection identifier. 313*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier to destroy. 314*d6b92ffaSHans Petter Selasky */ 315*d6b92ffaSHans Petter Selasky int ib_cm_destroy_id(struct ib_cm_id *cm_id); 316*d6b92ffaSHans Petter Selasky 317*d6b92ffaSHans Petter Selasky struct ib_cm_attr_param { 318*d6b92ffaSHans Petter Selasky __be64 service_id; 319*d6b92ffaSHans Petter Selasky __be64 service_mask; 320*d6b92ffaSHans Petter Selasky __be32 local_id; 321*d6b92ffaSHans Petter Selasky __be32 remote_id; 322*d6b92ffaSHans Petter Selasky }; 323*d6b92ffaSHans Petter Selasky 324*d6b92ffaSHans Petter Selasky /** 325*d6b92ffaSHans Petter Selasky * ib_cm_attr_id - Get connection identifier attributes. 326*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier to retrieve attributes. 327*d6b92ffaSHans Petter Selasky * @param: Destination of retreived parameters. 328*d6b92ffaSHans Petter Selasky * 329*d6b92ffaSHans Petter Selasky * Not all parameters are valid during all connection states. 330*d6b92ffaSHans Petter Selasky */ 331*d6b92ffaSHans Petter Selasky int ib_cm_attr_id(struct ib_cm_id *cm_id, 332*d6b92ffaSHans Petter Selasky struct ib_cm_attr_param *param); 333*d6b92ffaSHans Petter Selasky 334*d6b92ffaSHans Petter Selasky #define IB_CM_ASSIGN_SERVICE_ID_MASK htobe64(0xFF00000000000000ULL) 335*d6b92ffaSHans Petter Selasky #define IB_CM_ASSIGN_SERVICE_ID htobe64(0x0200000000000000ULL) 336*d6b92ffaSHans Petter Selasky 337*d6b92ffaSHans Petter Selasky /** 338*d6b92ffaSHans Petter Selasky * ib_cm_listen - Initiates listening on the specified service ID for 339*d6b92ffaSHans Petter Selasky * connection and service ID resolution requests. 340*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the listen request. 341*d6b92ffaSHans Petter Selasky * @service_id: Service identifier matched against incoming connection 342*d6b92ffaSHans Petter Selasky * and service ID resolution requests. The service ID should be specified 343*d6b92ffaSHans Petter Selasky * network-byte order. 344*d6b92ffaSHans Petter Selasky * @service_mask: Mask applied to service ID used to listen across a 345*d6b92ffaSHans Petter Selasky * range of service IDs. If set to 0, the service ID is matched 346*d6b92ffaSHans Petter Selasky * exactly. 347*d6b92ffaSHans Petter Selasky */ 348*d6b92ffaSHans Petter Selasky int ib_cm_listen(struct ib_cm_id *cm_id, 349*d6b92ffaSHans Petter Selasky __be64 service_id, 350*d6b92ffaSHans Petter Selasky __be64 service_mask); 351*d6b92ffaSHans Petter Selasky 352*d6b92ffaSHans Petter Selasky struct ib_cm_req_param { 353*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *primary_path; 354*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *alternate_path; 355*d6b92ffaSHans Petter Selasky __be64 service_id; 356*d6b92ffaSHans Petter Selasky uint32_t qp_num; 357*d6b92ffaSHans Petter Selasky enum ibv_qp_type qp_type; 358*d6b92ffaSHans Petter Selasky uint32_t starting_psn; 359*d6b92ffaSHans Petter Selasky void *private_data; 360*d6b92ffaSHans Petter Selasky uint8_t private_data_len; 361*d6b92ffaSHans Petter Selasky uint8_t peer_to_peer; 362*d6b92ffaSHans Petter Selasky uint8_t responder_resources; 363*d6b92ffaSHans Petter Selasky uint8_t initiator_depth; 364*d6b92ffaSHans Petter Selasky uint8_t remote_cm_response_timeout; 365*d6b92ffaSHans Petter Selasky uint8_t flow_control; 366*d6b92ffaSHans Petter Selasky uint8_t local_cm_response_timeout; 367*d6b92ffaSHans Petter Selasky uint8_t retry_count; 368*d6b92ffaSHans Petter Selasky uint8_t rnr_retry_count; 369*d6b92ffaSHans Petter Selasky uint8_t max_cm_retries; 370*d6b92ffaSHans Petter Selasky uint8_t srq; 371*d6b92ffaSHans Petter Selasky }; 372*d6b92ffaSHans Petter Selasky 373*d6b92ffaSHans Petter Selasky /** 374*d6b92ffaSHans Petter Selasky * ib_cm_send_req - Sends a connection request to the remote node. 375*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier that will be associated with the 376*d6b92ffaSHans Petter Selasky * connection request. 377*d6b92ffaSHans Petter Selasky * @param: Connection request information needed to establish the 378*d6b92ffaSHans Petter Selasky * connection. 379*d6b92ffaSHans Petter Selasky */ 380*d6b92ffaSHans Petter Selasky int ib_cm_send_req(struct ib_cm_id *cm_id, 381*d6b92ffaSHans Petter Selasky struct ib_cm_req_param *param); 382*d6b92ffaSHans Petter Selasky 383*d6b92ffaSHans Petter Selasky struct ib_cm_rep_param { 384*d6b92ffaSHans Petter Selasky uint32_t qp_num; 385*d6b92ffaSHans Petter Selasky uint32_t starting_psn; 386*d6b92ffaSHans Petter Selasky void *private_data; 387*d6b92ffaSHans Petter Selasky uint8_t private_data_len; 388*d6b92ffaSHans Petter Selasky uint8_t responder_resources; 389*d6b92ffaSHans Petter Selasky uint8_t initiator_depth; 390*d6b92ffaSHans Petter Selasky uint8_t target_ack_delay; 391*d6b92ffaSHans Petter Selasky uint8_t failover_accepted; 392*d6b92ffaSHans Petter Selasky uint8_t flow_control; 393*d6b92ffaSHans Petter Selasky uint8_t rnr_retry_count; 394*d6b92ffaSHans Petter Selasky uint8_t srq; 395*d6b92ffaSHans Petter Selasky }; 396*d6b92ffaSHans Petter Selasky 397*d6b92ffaSHans Petter Selasky /** 398*d6b92ffaSHans Petter Selasky * ib_cm_send_rep - Sends a connection reply in response to a connection 399*d6b92ffaSHans Petter Selasky * request. 400*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier that will be associated with the 401*d6b92ffaSHans Petter Selasky * connection request. 402*d6b92ffaSHans Petter Selasky * @param: Connection reply information needed to establish the 403*d6b92ffaSHans Petter Selasky * connection. 404*d6b92ffaSHans Petter Selasky */ 405*d6b92ffaSHans Petter Selasky int ib_cm_send_rep(struct ib_cm_id *cm_id, 406*d6b92ffaSHans Petter Selasky struct ib_cm_rep_param *param); 407*d6b92ffaSHans Petter Selasky 408*d6b92ffaSHans Petter Selasky /** 409*d6b92ffaSHans Petter Selasky * ib_cm_send_rtu - Sends a connection ready to use message in response 410*d6b92ffaSHans Petter Selasky * to a connection reply message. 411*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the connection request. 412*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 413*d6b92ffaSHans Petter Selasky * ready to use message. 414*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 415*d6b92ffaSHans Petter Selasky */ 416*d6b92ffaSHans Petter Selasky int ib_cm_send_rtu(struct ib_cm_id *cm_id, 417*d6b92ffaSHans Petter Selasky void *private_data, 418*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 419*d6b92ffaSHans Petter Selasky 420*d6b92ffaSHans Petter Selasky /** 421*d6b92ffaSHans Petter Selasky * ib_cm_send_dreq - Sends a disconnection request for an existing 422*d6b92ffaSHans Petter Selasky * connection. 423*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the connection being 424*d6b92ffaSHans Petter Selasky * released. 425*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 426*d6b92ffaSHans Petter Selasky * disconnection request message. 427*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 428*d6b92ffaSHans Petter Selasky */ 429*d6b92ffaSHans Petter Selasky int ib_cm_send_dreq(struct ib_cm_id *cm_id, 430*d6b92ffaSHans Petter Selasky void *private_data, 431*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 432*d6b92ffaSHans Petter Selasky 433*d6b92ffaSHans Petter Selasky /** 434*d6b92ffaSHans Petter Selasky * ib_cm_send_drep - Sends a disconnection reply to a disconnection request. 435*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the connection being 436*d6b92ffaSHans Petter Selasky * released. 437*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 438*d6b92ffaSHans Petter Selasky * disconnection reply message. 439*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 440*d6b92ffaSHans Petter Selasky */ 441*d6b92ffaSHans Petter Selasky int ib_cm_send_drep(struct ib_cm_id *cm_id, 442*d6b92ffaSHans Petter Selasky void *private_data, 443*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 444*d6b92ffaSHans Petter Selasky 445*d6b92ffaSHans Petter Selasky /** 446*d6b92ffaSHans Petter Selasky * ib_cm_notify - Notifies the CM of an event reported to the consumer. 447*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier to transition to established. 448*d6b92ffaSHans Petter Selasky * @event: Type of event. 449*d6b92ffaSHans Petter Selasky * 450*d6b92ffaSHans Petter Selasky * This routine should be invoked by users to notify the CM of relevant 451*d6b92ffaSHans Petter Selasky * communication events. Events that should be reported to the CM and 452*d6b92ffaSHans Petter Selasky * when to report them are: 453*d6b92ffaSHans Petter Selasky * 454*d6b92ffaSHans Petter Selasky * IBV_EVENT_COMM_EST - Used when a message is received on a connected 455*d6b92ffaSHans Petter Selasky * QP before an RTU has been received. 456*d6b92ffaSHans Petter Selasky * IBV_EVENT_PATH_MIG - Notifies the CM that the connection has failed over 457*d6b92ffaSHans Petter Selasky * to the alternate path. 458*d6b92ffaSHans Petter Selasky */ 459*d6b92ffaSHans Petter Selasky int ib_cm_notify(struct ib_cm_id *cm_id, enum ibv_event_type event); 460*d6b92ffaSHans Petter Selasky 461*d6b92ffaSHans Petter Selasky /** 462*d6b92ffaSHans Petter Selasky * ib_cm_send_rej - Sends a connection rejection message to the 463*d6b92ffaSHans Petter Selasky * remote node. 464*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the connection being 465*d6b92ffaSHans Petter Selasky * rejected. 466*d6b92ffaSHans Petter Selasky * @reason: Reason for the connection request rejection. 467*d6b92ffaSHans Petter Selasky * @ari: Optional additional rejection information. 468*d6b92ffaSHans Petter Selasky * @ari_length: Size of the additional rejection information, in bytes. 469*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 470*d6b92ffaSHans Petter Selasky * rejection message. 471*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 472*d6b92ffaSHans Petter Selasky */ 473*d6b92ffaSHans Petter Selasky int ib_cm_send_rej(struct ib_cm_id *cm_id, 474*d6b92ffaSHans Petter Selasky enum ib_cm_rej_reason reason, 475*d6b92ffaSHans Petter Selasky void *ari, 476*d6b92ffaSHans Petter Selasky uint8_t ari_length, 477*d6b92ffaSHans Petter Selasky void *private_data, 478*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 479*d6b92ffaSHans Petter Selasky 480*d6b92ffaSHans Petter Selasky /** 481*d6b92ffaSHans Petter Selasky * ib_cm_send_mra - Sends a message receipt acknowledgement to a connection 482*d6b92ffaSHans Petter Selasky * message. 483*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the connection message. 484*d6b92ffaSHans Petter Selasky * @service_timeout: The maximum time required for the sender to reply to 485*d6b92ffaSHans Petter Selasky * to the connection message. 486*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 487*d6b92ffaSHans Petter Selasky * message receipt acknowledgement. 488*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 489*d6b92ffaSHans Petter Selasky */ 490*d6b92ffaSHans Petter Selasky int ib_cm_send_mra(struct ib_cm_id *cm_id, 491*d6b92ffaSHans Petter Selasky uint8_t service_timeout, 492*d6b92ffaSHans Petter Selasky void *private_data, 493*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 494*d6b92ffaSHans Petter Selasky 495*d6b92ffaSHans Petter Selasky /** 496*d6b92ffaSHans Petter Selasky * ib_cm_send_lap - Sends a load alternate path request. 497*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the load alternate path 498*d6b92ffaSHans Petter Selasky * message. 499*d6b92ffaSHans Petter Selasky * @alternate_path: A path record that identifies the alternate path to 500*d6b92ffaSHans Petter Selasky * load. 501*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 502*d6b92ffaSHans Petter Selasky * load alternate path message. 503*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 504*d6b92ffaSHans Petter Selasky */ 505*d6b92ffaSHans Petter Selasky int ib_cm_send_lap(struct ib_cm_id *cm_id, 506*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *alternate_path, 507*d6b92ffaSHans Petter Selasky void *private_data, 508*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 509*d6b92ffaSHans Petter Selasky 510*d6b92ffaSHans Petter Selasky /** 511*d6b92ffaSHans Petter Selasky * ib_cm_init_qp_attr - Initializes the QP attributes for use in transitioning 512*d6b92ffaSHans Petter Selasky * to a specified QP state. 513*d6b92ffaSHans Petter Selasky * @cm_id: Communication identifier associated with the QP attributes to 514*d6b92ffaSHans Petter Selasky * initialize. 515*d6b92ffaSHans Petter Selasky * @qp_attr: On input, specifies the desired QP state. On output, the 516*d6b92ffaSHans Petter Selasky * mandatory and desired optional attributes will be set in order to 517*d6b92ffaSHans Petter Selasky * modify the QP to the specified state. 518*d6b92ffaSHans Petter Selasky * @qp_attr_mask: The QP attribute mask that may be used to transition the 519*d6b92ffaSHans Petter Selasky * QP to the specified state. 520*d6b92ffaSHans Petter Selasky * 521*d6b92ffaSHans Petter Selasky * Users must set the @qp_attr->qp_state to the desired QP state. This call 522*d6b92ffaSHans Petter Selasky * will set all required attributes for the given transition, along with 523*d6b92ffaSHans Petter Selasky * known optional attributes. Users may override the attributes returned from 524*d6b92ffaSHans Petter Selasky * this call before calling ib_modify_qp. 525*d6b92ffaSHans Petter Selasky */ 526*d6b92ffaSHans Petter Selasky int ib_cm_init_qp_attr(struct ib_cm_id *cm_id, 527*d6b92ffaSHans Petter Selasky struct ibv_qp_attr *qp_attr, 528*d6b92ffaSHans Petter Selasky int *qp_attr_mask); 529*d6b92ffaSHans Petter Selasky 530*d6b92ffaSHans Petter Selasky /** 531*d6b92ffaSHans Petter Selasky * ib_cm_send_apr - Sends an alternate path response message in response to 532*d6b92ffaSHans Petter Selasky * a load alternate path request. 533*d6b92ffaSHans Petter Selasky * @cm_id: Connection identifier associated with the alternate path response. 534*d6b92ffaSHans Petter Selasky * @status: Reply status sent with the alternate path response. 535*d6b92ffaSHans Petter Selasky * @info: Optional additional information sent with the alternate path 536*d6b92ffaSHans Petter Selasky * response. 537*d6b92ffaSHans Petter Selasky * @info_length: Size of the additional information, in bytes. 538*d6b92ffaSHans Petter Selasky * @private_data: Optional user-defined private data sent with the 539*d6b92ffaSHans Petter Selasky * alternate path response message. 540*d6b92ffaSHans Petter Selasky * @private_data_len: Size of the private data buffer, in bytes. 541*d6b92ffaSHans Petter Selasky */ 542*d6b92ffaSHans Petter Selasky int ib_cm_send_apr(struct ib_cm_id *cm_id, 543*d6b92ffaSHans Petter Selasky enum ib_cm_apr_status status, 544*d6b92ffaSHans Petter Selasky void *info, 545*d6b92ffaSHans Petter Selasky uint8_t info_length, 546*d6b92ffaSHans Petter Selasky void *private_data, 547*d6b92ffaSHans Petter Selasky uint8_t private_data_len); 548*d6b92ffaSHans Petter Selasky 549*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_req_param { 550*d6b92ffaSHans Petter Selasky struct ibv_sa_path_rec *path; 551*d6b92ffaSHans Petter Selasky __be64 service_id; 552*d6b92ffaSHans Petter Selasky int timeout_ms; 553*d6b92ffaSHans Petter Selasky void *private_data; 554*d6b92ffaSHans Petter Selasky uint8_t private_data_len; 555*d6b92ffaSHans Petter Selasky uint8_t max_cm_retries; 556*d6b92ffaSHans Petter Selasky }; 557*d6b92ffaSHans Petter Selasky 558*d6b92ffaSHans Petter Selasky /** 559*d6b92ffaSHans Petter Selasky * ib_cm_send_sidr_req - Sends a service ID resolution request to the 560*d6b92ffaSHans Petter Selasky * remote node. 561*d6b92ffaSHans Petter Selasky * @cm_id: Communication identifier that will be associated with the 562*d6b92ffaSHans Petter Selasky * service ID resolution request. 563*d6b92ffaSHans Petter Selasky * @param: Service ID resolution request information. 564*d6b92ffaSHans Petter Selasky */ 565*d6b92ffaSHans Petter Selasky int ib_cm_send_sidr_req(struct ib_cm_id *cm_id, 566*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_req_param *param); 567*d6b92ffaSHans Petter Selasky 568*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_rep_param { 569*d6b92ffaSHans Petter Selasky uint32_t qp_num; 570*d6b92ffaSHans Petter Selasky uint32_t qkey; 571*d6b92ffaSHans Petter Selasky enum ib_cm_sidr_status status; 572*d6b92ffaSHans Petter Selasky void *info; 573*d6b92ffaSHans Petter Selasky uint8_t info_length; 574*d6b92ffaSHans Petter Selasky void *private_data; 575*d6b92ffaSHans Petter Selasky uint8_t private_data_len; 576*d6b92ffaSHans Petter Selasky }; 577*d6b92ffaSHans Petter Selasky 578*d6b92ffaSHans Petter Selasky /** 579*d6b92ffaSHans Petter Selasky * ib_cm_send_sidr_rep - Sends a service ID resolution reply to the 580*d6b92ffaSHans Petter Selasky * remote node. 581*d6b92ffaSHans Petter Selasky * @cm_id: Communication identifier associated with the received service ID 582*d6b92ffaSHans Petter Selasky * resolution request. 583*d6b92ffaSHans Petter Selasky * @param: Service ID resolution reply information. 584*d6b92ffaSHans Petter Selasky */ 585*d6b92ffaSHans Petter Selasky int ib_cm_send_sidr_rep(struct ib_cm_id *cm_id, 586*d6b92ffaSHans Petter Selasky struct ib_cm_sidr_rep_param *param); 587*d6b92ffaSHans Petter Selasky 588*d6b92ffaSHans Petter Selasky #ifdef __cplusplus 589*d6b92ffaSHans Petter Selasky } 590*d6b92ffaSHans Petter Selasky #endif 591*d6b92ffaSHans Petter Selasky 592*d6b92ffaSHans Petter Selasky #endif /* CM_H */ 593