124f52149SLeon Romanovsky /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2a977049dSHal Rosenstock /* 3ef700446SSean Hefty * Copyright (c) 2004, 2011 Intel Corporation. All rights reserved. 4a977049dSHal Rosenstock * Copyright (c) 2004 Topspin Corporation. All rights reserved. 5a977049dSHal Rosenstock * Copyright (c) 2004 Voltaire Corporation. All rights reserved. 624f52149SLeon Romanovsky * Copyright (c) 2019, Mellanox Technologies inc. All rights reserved. 7a977049dSHal Rosenstock */ 8a9160511SLeon Romanovsky #ifndef CM_MSGS_H 9a977049dSHal Rosenstock #define CM_MSGS_H 10a977049dSHal Rosenstock 11d05d4ac4SLeon Romanovsky #include <rdma/ibta_vol1_c12.h> 12a4d61e84SRoland Dreier #include <rdma/ib_mad.h> 135d861be8SSean Hefty #include <rdma/ib_cm.h> 14a977049dSHal Rosenstock 15a977049dSHal Rosenstock /* 16a977049dSHal Rosenstock * Parameters to routines below should be in network-byte order, and values 17a977049dSHal Rosenstock * are returned in network-byte order. 18a977049dSHal Rosenstock */ 19a977049dSHal Rosenstock 20a977049dSHal Rosenstock #define IB_CM_CLASS_VERSION 2 /* IB specification 1.2 */ 21a977049dSHal Rosenstock 22a977049dSHal Rosenstock struct cm_req_msg { 23a977049dSHal Rosenstock struct ib_mad_hdr hdr; 24a977049dSHal Rosenstock 2597f52eb4SSean Hefty __be32 local_comm_id; 2697f52eb4SSean Hefty __be32 rsvd4; 2797f52eb4SSean Hefty __be64 service_id; 2897f52eb4SSean Hefty __be64 local_ca_guid; 2997f52eb4SSean Hefty __be32 rsvd24; 3097f52eb4SSean Hefty __be32 local_qkey; 31a977049dSHal Rosenstock /* local QPN:24, responder resources:8 */ 3297f52eb4SSean Hefty __be32 offset32; 33a977049dSHal Rosenstock /* local EECN:24, initiator depth:8 */ 3497f52eb4SSean Hefty __be32 offset36; 35a977049dSHal Rosenstock /* 36a977049dSHal Rosenstock * remote EECN:24, remote CM response timeout:5, 37a977049dSHal Rosenstock * transport service type:2, end-to-end flow control:1 38a977049dSHal Rosenstock */ 3997f52eb4SSean Hefty __be32 offset40; 40a977049dSHal Rosenstock /* starting PSN:24, local CM response timeout:5, retry count:3 */ 4197f52eb4SSean Hefty __be32 offset44; 4297f52eb4SSean Hefty __be16 pkey; 43a977049dSHal Rosenstock /* path MTU:4, RDC exists:1, RNR retry count:3. */ 44a977049dSHal Rosenstock u8 offset50; 45d26a360bSSean Hefty /* max CM Retries:4, SRQ:1, extended transport type:3 */ 46a977049dSHal Rosenstock u8 offset51; 47a977049dSHal Rosenstock 4897f52eb4SSean Hefty __be16 primary_local_lid; 4997f52eb4SSean Hefty __be16 primary_remote_lid; 50a977049dSHal Rosenstock union ib_gid primary_local_gid; 51a977049dSHal Rosenstock union ib_gid primary_remote_gid; 52a977049dSHal Rosenstock /* flow label:20, rsvd:6, packet rate:6 */ 5397f52eb4SSean Hefty __be32 primary_offset88; 54a977049dSHal Rosenstock u8 primary_traffic_class; 55a977049dSHal Rosenstock u8 primary_hop_limit; 56a977049dSHal Rosenstock /* SL:4, subnet local:1, rsvd:3 */ 57a977049dSHal Rosenstock u8 primary_offset94; 58a977049dSHal Rosenstock /* local ACK timeout:5, rsvd:3 */ 59a977049dSHal Rosenstock u8 primary_offset95; 60a977049dSHal Rosenstock 6197f52eb4SSean Hefty __be16 alt_local_lid; 6297f52eb4SSean Hefty __be16 alt_remote_lid; 63a977049dSHal Rosenstock union ib_gid alt_local_gid; 64a977049dSHal Rosenstock union ib_gid alt_remote_gid; 65a977049dSHal Rosenstock /* flow label:20, rsvd:6, packet rate:6 */ 6697f52eb4SSean Hefty __be32 alt_offset132; 67a977049dSHal Rosenstock u8 alt_traffic_class; 68a977049dSHal Rosenstock u8 alt_hop_limit; 69a977049dSHal Rosenstock /* SL:4, subnet local:1, rsvd:3 */ 70a977049dSHal Rosenstock u8 alt_offset138; 71a977049dSHal Rosenstock /* local ACK timeout:5, rsvd:3 */ 72a977049dSHal Rosenstock u8 alt_offset139; 73a977049dSHal Rosenstock 740d0f738fSDavid Ahern u32 private_data[IB_CM_REQ_PRIVATE_DATA_SIZE / sizeof(u32)]; 75a977049dSHal Rosenstock 7619b1a294SErez Alfasi } __packed; 77a977049dSHal Rosenstock 7897f52eb4SSean Hefty static inline __be32 cm_req_get_local_qpn(struct cm_req_msg *req_msg) 79a977049dSHal Rosenstock { 80a977049dSHal Rosenstock return cpu_to_be32(be32_to_cpu(req_msg->offset32) >> 8); 81a977049dSHal Rosenstock } 82a977049dSHal Rosenstock 8397f52eb4SSean Hefty static inline void cm_req_set_local_qpn(struct cm_req_msg *req_msg, __be32 qpn) 84a977049dSHal Rosenstock { 85a977049dSHal Rosenstock req_msg->offset32 = cpu_to_be32((be32_to_cpu(qpn) << 8) | 86a977049dSHal Rosenstock (be32_to_cpu(req_msg->offset32) & 87a977049dSHal Rosenstock 0x000000FF)); 88a977049dSHal Rosenstock } 89a977049dSHal Rosenstock 90a977049dSHal Rosenstock static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg) 91a977049dSHal Rosenstock { 92b6bbee68SJason Gunthorpe u8 transport_type = IBA_GET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg); 93a977049dSHal Rosenstock switch(transport_type) { 94a977049dSHal Rosenstock case 0: return IB_QPT_RC; 95a977049dSHal Rosenstock case 1: return IB_QPT_UC; 96d26a360bSSean Hefty case 3: 97b6bbee68SJason Gunthorpe switch (IBA_GET(CM_REQ_EXTENDED_TRANSPORT_TYPE, req_msg)) { 98d26a360bSSean Hefty case 1: return IB_QPT_XRC_TGT; 99d26a360bSSean Hefty default: return 0; 100d26a360bSSean Hefty } 101a977049dSHal Rosenstock default: return 0; 102a977049dSHal Rosenstock } 103a977049dSHal Rosenstock } 104a977049dSHal Rosenstock 105a977049dSHal Rosenstock static inline void cm_req_set_qp_type(struct cm_req_msg *req_msg, 106a977049dSHal Rosenstock enum ib_qp_type qp_type) 107a977049dSHal Rosenstock { 108a977049dSHal Rosenstock switch(qp_type) { 109a977049dSHal Rosenstock case IB_QPT_UC: 110b6bbee68SJason Gunthorpe IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 1); 1113910f44dSRoland Dreier break; 112d26a360bSSean Hefty case IB_QPT_XRC_INI: 113b6bbee68SJason Gunthorpe IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 3); 114b6bbee68SJason Gunthorpe IBA_SET(CM_REQ_EXTENDED_TRANSPORT_TYPE, req_msg, 1); 115d26a360bSSean Hefty break; 116a977049dSHal Rosenstock default: 117b6bbee68SJason Gunthorpe IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 0); 118a977049dSHal Rosenstock } 119a977049dSHal Rosenstock } 120a977049dSHal Rosenstock 12197f52eb4SSean Hefty static inline __be32 cm_req_get_starting_psn(struct cm_req_msg *req_msg) 122a977049dSHal Rosenstock { 123a977049dSHal Rosenstock return cpu_to_be32(be32_to_cpu(req_msg->offset44) >> 8); 124a977049dSHal Rosenstock } 125a977049dSHal Rosenstock 126a977049dSHal Rosenstock static inline void cm_req_set_starting_psn(struct cm_req_msg *req_msg, 12797f52eb4SSean Hefty __be32 starting_psn) 128a977049dSHal Rosenstock { 129a977049dSHal Rosenstock req_msg->offset44 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) | 130a977049dSHal Rosenstock (be32_to_cpu(req_msg->offset44) & 0x000000FF)); 131a977049dSHal Rosenstock } 132a977049dSHal Rosenstock 13397f52eb4SSean Hefty static inline __be32 cm_req_get_primary_flow_label(struct cm_req_msg *req_msg) 134a977049dSHal Rosenstock { 13597f52eb4SSean Hefty return cpu_to_be32(be32_to_cpu(req_msg->primary_offset88) >> 12); 136a977049dSHal Rosenstock } 137a977049dSHal Rosenstock 138a977049dSHal Rosenstock static inline void cm_req_set_primary_flow_label(struct cm_req_msg *req_msg, 13997f52eb4SSean Hefty __be32 flow_label) 140a977049dSHal Rosenstock { 141a977049dSHal Rosenstock req_msg->primary_offset88 = cpu_to_be32( 142a977049dSHal Rosenstock (be32_to_cpu(req_msg->primary_offset88) & 143a977049dSHal Rosenstock 0x00000FFF) | 144a977049dSHal Rosenstock (be32_to_cpu(flow_label) << 12)); 145a977049dSHal Rosenstock } 146a977049dSHal Rosenstock 14797f52eb4SSean Hefty static inline __be32 cm_req_get_alt_flow_label(struct cm_req_msg *req_msg) 148a977049dSHal Rosenstock { 14997f52eb4SSean Hefty return cpu_to_be32(be32_to_cpu(req_msg->alt_offset132) >> 12); 150a977049dSHal Rosenstock } 151a977049dSHal Rosenstock 152a977049dSHal Rosenstock static inline void cm_req_set_alt_flow_label(struct cm_req_msg *req_msg, 15397f52eb4SSean Hefty __be32 flow_label) 154a977049dSHal Rosenstock { 155a977049dSHal Rosenstock req_msg->alt_offset132 = cpu_to_be32( 156a977049dSHal Rosenstock (be32_to_cpu(req_msg->alt_offset132) & 157a977049dSHal Rosenstock 0x00000FFF) | 158a977049dSHal Rosenstock (be32_to_cpu(flow_label) << 12)); 159a977049dSHal Rosenstock } 160a977049dSHal Rosenstock 161a977049dSHal Rosenstock /* Message REJected or MRAed */ 162a977049dSHal Rosenstock enum cm_msg_response { 163a977049dSHal Rosenstock CM_MSG_RESPONSE_REQ = 0x0, 164a977049dSHal Rosenstock CM_MSG_RESPONSE_REP = 0x1, 165a977049dSHal Rosenstock CM_MSG_RESPONSE_OTHER = 0x2 166a977049dSHal Rosenstock }; 167a977049dSHal Rosenstock 168a977049dSHal Rosenstock struct cm_mra_msg { 169a977049dSHal Rosenstock struct ib_mad_hdr hdr; 170a977049dSHal Rosenstock 17197f52eb4SSean Hefty __be32 local_comm_id; 17297f52eb4SSean Hefty __be32 remote_comm_id; 173a977049dSHal Rosenstock /* message MRAed:2, rsvd:6 */ 174a977049dSHal Rosenstock u8 offset8; 175a977049dSHal Rosenstock /* service timeout:5, rsvd:3 */ 176a977049dSHal Rosenstock u8 offset9; 177a977049dSHal Rosenstock 178a977049dSHal Rosenstock u8 private_data[IB_CM_MRA_PRIVATE_DATA_SIZE]; 179a977049dSHal Rosenstock 18019b1a294SErez Alfasi } __packed; 181a977049dSHal Rosenstock 182a977049dSHal Rosenstock struct cm_rej_msg { 183a977049dSHal Rosenstock struct ib_mad_hdr hdr; 184a977049dSHal Rosenstock 18597f52eb4SSean Hefty __be32 local_comm_id; 18697f52eb4SSean Hefty __be32 remote_comm_id; 187a977049dSHal Rosenstock /* message REJected:2, rsvd:6 */ 188a977049dSHal Rosenstock u8 offset8; 189a977049dSHal Rosenstock /* reject info length:7, rsvd:1. */ 190a977049dSHal Rosenstock u8 offset9; 19197f52eb4SSean Hefty __be16 reason; 192a977049dSHal Rosenstock u8 ari[IB_CM_REJ_ARI_LENGTH]; 193a977049dSHal Rosenstock 194a977049dSHal Rosenstock u8 private_data[IB_CM_REJ_PRIVATE_DATA_SIZE]; 195a977049dSHal Rosenstock 19619b1a294SErez Alfasi } __packed; 197a977049dSHal Rosenstock 198a977049dSHal Rosenstock struct cm_rep_msg { 199a977049dSHal Rosenstock struct ib_mad_hdr hdr; 200a977049dSHal Rosenstock 20197f52eb4SSean Hefty __be32 local_comm_id; 20297f52eb4SSean Hefty __be32 remote_comm_id; 20397f52eb4SSean Hefty __be32 local_qkey; 204a977049dSHal Rosenstock /* local QPN:24, rsvd:8 */ 20597f52eb4SSean Hefty __be32 offset12; 206a977049dSHal Rosenstock /* local EECN:24, rsvd:8 */ 20797f52eb4SSean Hefty __be32 offset16; 208a977049dSHal Rosenstock /* starting PSN:24 rsvd:8 */ 20997f52eb4SSean Hefty __be32 offset20; 210a977049dSHal Rosenstock u8 resp_resources; 211a977049dSHal Rosenstock u8 initiator_depth; 212a977049dSHal Rosenstock /* target ACK delay:5, failover accepted:2, end-to-end flow control:1 */ 213a977049dSHal Rosenstock u8 offset26; 214a977049dSHal Rosenstock /* RNR retry count:3, SRQ:1, rsvd:5 */ 215a977049dSHal Rosenstock u8 offset27; 21697f52eb4SSean Hefty __be64 local_ca_guid; 217a977049dSHal Rosenstock 218a977049dSHal Rosenstock u8 private_data[IB_CM_REP_PRIVATE_DATA_SIZE]; 219a977049dSHal Rosenstock 22019b1a294SErez Alfasi } __packed; 221a977049dSHal Rosenstock 22297f52eb4SSean Hefty static inline __be32 cm_rep_get_local_qpn(struct cm_rep_msg *rep_msg) 223a977049dSHal Rosenstock { 224a977049dSHal Rosenstock return cpu_to_be32(be32_to_cpu(rep_msg->offset12) >> 8); 225a977049dSHal Rosenstock } 226a977049dSHal Rosenstock 22797f52eb4SSean Hefty static inline void cm_rep_set_local_qpn(struct cm_rep_msg *rep_msg, __be32 qpn) 228a977049dSHal Rosenstock { 229a977049dSHal Rosenstock rep_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) | 230a977049dSHal Rosenstock (be32_to_cpu(rep_msg->offset12) & 0x000000FF)); 231a977049dSHal Rosenstock } 232a977049dSHal Rosenstock 233ef700446SSean Hefty static inline __be32 cm_rep_get_local_eecn(struct cm_rep_msg *rep_msg) 234ef700446SSean Hefty { 235ef700446SSean Hefty return cpu_to_be32(be32_to_cpu(rep_msg->offset16) >> 8); 236ef700446SSean Hefty } 237ef700446SSean Hefty 238ef700446SSean Hefty static inline void cm_rep_set_local_eecn(struct cm_rep_msg *rep_msg, __be32 eecn) 239ef700446SSean Hefty { 240ef700446SSean Hefty rep_msg->offset16 = cpu_to_be32((be32_to_cpu(eecn) << 8) | 241ef700446SSean Hefty (be32_to_cpu(rep_msg->offset16) & 0x000000FF)); 242ef700446SSean Hefty } 243ef700446SSean Hefty 244ef700446SSean Hefty static inline __be32 cm_rep_get_qpn(struct cm_rep_msg *rep_msg, enum ib_qp_type qp_type) 245ef700446SSean Hefty { 246ef700446SSean Hefty return (qp_type == IB_QPT_XRC_INI) ? 247ef700446SSean Hefty cm_rep_get_local_eecn(rep_msg) : cm_rep_get_local_qpn(rep_msg); 248ef700446SSean Hefty } 249ef700446SSean Hefty 25097f52eb4SSean Hefty static inline __be32 cm_rep_get_starting_psn(struct cm_rep_msg *rep_msg) 251a977049dSHal Rosenstock { 252a977049dSHal Rosenstock return cpu_to_be32(be32_to_cpu(rep_msg->offset20) >> 8); 253a977049dSHal Rosenstock } 254a977049dSHal Rosenstock 255a977049dSHal Rosenstock static inline void cm_rep_set_starting_psn(struct cm_rep_msg *rep_msg, 25697f52eb4SSean Hefty __be32 starting_psn) 257a977049dSHal Rosenstock { 258a977049dSHal Rosenstock rep_msg->offset20 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) | 259a977049dSHal Rosenstock (be32_to_cpu(rep_msg->offset20) & 0x000000FF)); 260a977049dSHal Rosenstock } 261a977049dSHal Rosenstock 262a977049dSHal Rosenstock struct cm_rtu_msg { 263a977049dSHal Rosenstock struct ib_mad_hdr hdr; 264a977049dSHal Rosenstock 26597f52eb4SSean Hefty __be32 local_comm_id; 26697f52eb4SSean Hefty __be32 remote_comm_id; 267a977049dSHal Rosenstock 268a977049dSHal Rosenstock u8 private_data[IB_CM_RTU_PRIVATE_DATA_SIZE]; 269a977049dSHal Rosenstock 27019b1a294SErez Alfasi } __packed; 271a977049dSHal Rosenstock 272a977049dSHal Rosenstock struct cm_dreq_msg { 273a977049dSHal Rosenstock struct ib_mad_hdr hdr; 274a977049dSHal Rosenstock 27597f52eb4SSean Hefty __be32 local_comm_id; 27697f52eb4SSean Hefty __be32 remote_comm_id; 277a977049dSHal Rosenstock /* remote QPN/EECN:24, rsvd:8 */ 27897f52eb4SSean Hefty __be32 offset8; 279a977049dSHal Rosenstock 280a977049dSHal Rosenstock u8 private_data[IB_CM_DREQ_PRIVATE_DATA_SIZE]; 281a977049dSHal Rosenstock 28219b1a294SErez Alfasi } __packed; 283a977049dSHal Rosenstock 28497f52eb4SSean Hefty static inline __be32 cm_dreq_get_remote_qpn(struct cm_dreq_msg *dreq_msg) 285a977049dSHal Rosenstock { 286a977049dSHal Rosenstock return cpu_to_be32(be32_to_cpu(dreq_msg->offset8) >> 8); 287a977049dSHal Rosenstock } 288a977049dSHal Rosenstock 28997f52eb4SSean Hefty static inline void cm_dreq_set_remote_qpn(struct cm_dreq_msg *dreq_msg, __be32 qpn) 290a977049dSHal Rosenstock { 291a977049dSHal Rosenstock dreq_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) | 292a977049dSHal Rosenstock (be32_to_cpu(dreq_msg->offset8) & 0x000000FF)); 293a977049dSHal Rosenstock } 294a977049dSHal Rosenstock 295a977049dSHal Rosenstock struct cm_drep_msg { 296a977049dSHal Rosenstock struct ib_mad_hdr hdr; 297a977049dSHal Rosenstock 29897f52eb4SSean Hefty __be32 local_comm_id; 29997f52eb4SSean Hefty __be32 remote_comm_id; 300a977049dSHal Rosenstock 301a977049dSHal Rosenstock u8 private_data[IB_CM_DREP_PRIVATE_DATA_SIZE]; 302a977049dSHal Rosenstock 30319b1a294SErez Alfasi } __packed; 304a977049dSHal Rosenstock 305a977049dSHal Rosenstock struct cm_lap_msg { 306a977049dSHal Rosenstock struct ib_mad_hdr hdr; 307a977049dSHal Rosenstock 30897f52eb4SSean Hefty __be32 local_comm_id; 30997f52eb4SSean Hefty __be32 remote_comm_id; 310a977049dSHal Rosenstock 31197f52eb4SSean Hefty __be32 rsvd8; 312a977049dSHal Rosenstock /* remote QPN/EECN:24, remote CM response timeout:5, rsvd:3 */ 31397f52eb4SSean Hefty __be32 offset12; 31497f52eb4SSean Hefty __be32 rsvd16; 315a977049dSHal Rosenstock 31697f52eb4SSean Hefty __be16 alt_local_lid; 31797f52eb4SSean Hefty __be16 alt_remote_lid; 318a977049dSHal Rosenstock union ib_gid alt_local_gid; 319a977049dSHal Rosenstock union ib_gid alt_remote_gid; 320a977049dSHal Rosenstock /* flow label:20, rsvd:4, traffic class:8 */ 32197f52eb4SSean Hefty __be32 offset56; 322a977049dSHal Rosenstock u8 alt_hop_limit; 323a977049dSHal Rosenstock /* rsvd:2, packet rate:6 */ 32497f52eb4SSean Hefty u8 offset61; 325a977049dSHal Rosenstock /* SL:4, subnet local:1, rsvd:3 */ 32697f52eb4SSean Hefty u8 offset62; 327a977049dSHal Rosenstock /* local ACK timeout:5, rsvd:3 */ 32897f52eb4SSean Hefty u8 offset63; 329a977049dSHal Rosenstock 330a977049dSHal Rosenstock u8 private_data[IB_CM_LAP_PRIVATE_DATA_SIZE]; 33119b1a294SErez Alfasi } __packed; 332a977049dSHal Rosenstock 33397f52eb4SSean Hefty static inline __be32 cm_lap_get_flow_label(struct cm_lap_msg *lap_msg) 334a977049dSHal Rosenstock { 33597f52eb4SSean Hefty return cpu_to_be32(be32_to_cpu(lap_msg->offset56) >> 12); 336a977049dSHal Rosenstock } 337a977049dSHal Rosenstock 338a977049dSHal Rosenstock struct cm_apr_msg { 339a977049dSHal Rosenstock struct ib_mad_hdr hdr; 340a977049dSHal Rosenstock 34197f52eb4SSean Hefty __be32 local_comm_id; 34297f52eb4SSean Hefty __be32 remote_comm_id; 343a977049dSHal Rosenstock 344a977049dSHal Rosenstock u8 info_length; 345a977049dSHal Rosenstock u8 ap_status; 3466f233d30SEli Cohen __be16 rsvd; 347a977049dSHal Rosenstock u8 info[IB_CM_APR_INFO_LENGTH]; 348a977049dSHal Rosenstock 349a977049dSHal Rosenstock u8 private_data[IB_CM_APR_PRIVATE_DATA_SIZE]; 35019b1a294SErez Alfasi } __packed; 351a977049dSHal Rosenstock 352a977049dSHal Rosenstock struct cm_sidr_req_msg { 353a977049dSHal Rosenstock struct ib_mad_hdr hdr; 354a977049dSHal Rosenstock 35597f52eb4SSean Hefty __be32 request_id; 35697f52eb4SSean Hefty __be16 pkey; 35797f52eb4SSean Hefty __be16 rsvd; 35897f52eb4SSean Hefty __be64 service_id; 359a977049dSHal Rosenstock 3600d0f738fSDavid Ahern u32 private_data[IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE / sizeof(u32)]; 36119b1a294SErez Alfasi } __packed; 362a977049dSHal Rosenstock 363a977049dSHal Rosenstock struct cm_sidr_rep_msg { 364a977049dSHal Rosenstock struct ib_mad_hdr hdr; 365a977049dSHal Rosenstock 36697f52eb4SSean Hefty __be32 request_id; 367a977049dSHal Rosenstock u8 status; 368a977049dSHal Rosenstock u8 info_length; 36997f52eb4SSean Hefty __be16 rsvd; 370a977049dSHal Rosenstock /* QPN:24, rsvd:8 */ 37197f52eb4SSean Hefty __be32 offset8; 37297f52eb4SSean Hefty __be64 service_id; 37397f52eb4SSean Hefty __be32 qkey; 374a977049dSHal Rosenstock u8 info[IB_CM_SIDR_REP_INFO_LENGTH]; 375a977049dSHal Rosenstock 376a977049dSHal Rosenstock u8 private_data[IB_CM_SIDR_REP_PRIVATE_DATA_SIZE]; 37719b1a294SErez Alfasi } __packed; 378a977049dSHal Rosenstock 37997f52eb4SSean Hefty static inline __be32 cm_sidr_rep_get_qpn(struct cm_sidr_rep_msg *sidr_rep_msg) 380a977049dSHal Rosenstock { 381a977049dSHal Rosenstock return cpu_to_be32(be32_to_cpu(sidr_rep_msg->offset8) >> 8); 382a977049dSHal Rosenstock } 383a977049dSHal Rosenstock 384a977049dSHal Rosenstock static inline void cm_sidr_rep_set_qpn(struct cm_sidr_rep_msg *sidr_rep_msg, 38597f52eb4SSean Hefty __be32 qpn) 386a977049dSHal Rosenstock { 387a977049dSHal Rosenstock sidr_rep_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) | 388a977049dSHal Rosenstock (be32_to_cpu(sidr_rep_msg->offset8) & 389a977049dSHal Rosenstock 0x000000FF)); 390a977049dSHal Rosenstock } 391a977049dSHal Rosenstock 392a977049dSHal Rosenstock #endif /* CM_MSGS_H */ 393