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