1 /* 2 * Copyright (c) 2004 Topspin Communications. All rights reserved. 3 * Copyright (c) 2005 Voltaire, Inc. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 * 33 * $Id: ib_sa.h 2811 2005-07-06 18:11:43Z halr $ 34 */ 35 36 #ifndef IB_SA_H 37 #define IB_SA_H 38 39 #include <linux/compiler.h> 40 41 #include <rdma/ib_verbs.h> 42 #include <rdma/ib_mad.h> 43 44 enum { 45 IB_SA_CLASS_VERSION = 2, /* IB spec version 1.1/1.2 */ 46 47 IB_SA_METHOD_GET_TABLE = 0x12, 48 IB_SA_METHOD_GET_TABLE_RESP = 0x92, 49 IB_SA_METHOD_DELETE = 0x15 50 }; 51 52 enum ib_sa_selector { 53 IB_SA_GTE = 0, 54 IB_SA_LTE = 1, 55 IB_SA_EQ = 2, 56 /* 57 * The meaning of "best" depends on the attribute: for 58 * example, for MTU best will return the largest available 59 * MTU, while for packet life time, best will return the 60 * smallest available life time. 61 */ 62 IB_SA_BEST = 3 63 }; 64 65 enum ib_sa_rate { 66 IB_SA_RATE_2_5_GBPS = 2, 67 IB_SA_RATE_5_GBPS = 5, 68 IB_SA_RATE_10_GBPS = 3, 69 IB_SA_RATE_20_GBPS = 6, 70 IB_SA_RATE_30_GBPS = 4, 71 IB_SA_RATE_40_GBPS = 7, 72 IB_SA_RATE_60_GBPS = 8, 73 IB_SA_RATE_80_GBPS = 9, 74 IB_SA_RATE_120_GBPS = 10 75 }; 76 77 static inline int ib_sa_rate_enum_to_int(enum ib_sa_rate rate) 78 { 79 switch (rate) { 80 case IB_SA_RATE_2_5_GBPS: return 1; 81 case IB_SA_RATE_5_GBPS: return 2; 82 case IB_SA_RATE_10_GBPS: return 4; 83 case IB_SA_RATE_20_GBPS: return 8; 84 case IB_SA_RATE_30_GBPS: return 12; 85 case IB_SA_RATE_40_GBPS: return 16; 86 case IB_SA_RATE_60_GBPS: return 24; 87 case IB_SA_RATE_80_GBPS: return 32; 88 case IB_SA_RATE_120_GBPS: return 48; 89 default: return -1; 90 } 91 } 92 93 /* 94 * Structures for SA records are named "struct ib_sa_xxx_rec." No 95 * attempt is made to pack structures to match the physical layout of 96 * SA records in SA MADs; all packing and unpacking is handled by the 97 * SA query code. 98 * 99 * For a record with structure ib_sa_xxx_rec, the naming convention 100 * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we 101 * never use different abbreviations or otherwise change the spelling 102 * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY). 103 * 104 * Reserved rows are indicated with comments to help maintainability. 105 */ 106 107 /* reserved: 0 */ 108 /* reserved: 1 */ 109 #define IB_SA_PATH_REC_DGID IB_SA_COMP_MASK( 2) 110 #define IB_SA_PATH_REC_SGID IB_SA_COMP_MASK( 3) 111 #define IB_SA_PATH_REC_DLID IB_SA_COMP_MASK( 4) 112 #define IB_SA_PATH_REC_SLID IB_SA_COMP_MASK( 5) 113 #define IB_SA_PATH_REC_RAW_TRAFFIC IB_SA_COMP_MASK( 6) 114 /* reserved: 7 */ 115 #define IB_SA_PATH_REC_FLOW_LABEL IB_SA_COMP_MASK( 8) 116 #define IB_SA_PATH_REC_HOP_LIMIT IB_SA_COMP_MASK( 9) 117 #define IB_SA_PATH_REC_TRAFFIC_CLASS IB_SA_COMP_MASK(10) 118 #define IB_SA_PATH_REC_REVERSIBLE IB_SA_COMP_MASK(11) 119 #define IB_SA_PATH_REC_NUMB_PATH IB_SA_COMP_MASK(12) 120 #define IB_SA_PATH_REC_PKEY IB_SA_COMP_MASK(13) 121 /* reserved: 14 */ 122 #define IB_SA_PATH_REC_SL IB_SA_COMP_MASK(15) 123 #define IB_SA_PATH_REC_MTU_SELECTOR IB_SA_COMP_MASK(16) 124 #define IB_SA_PATH_REC_MTU IB_SA_COMP_MASK(17) 125 #define IB_SA_PATH_REC_RATE_SELECTOR IB_SA_COMP_MASK(18) 126 #define IB_SA_PATH_REC_RATE IB_SA_COMP_MASK(19) 127 #define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(20) 128 #define IB_SA_PATH_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(21) 129 #define IB_SA_PATH_REC_PREFERENCE IB_SA_COMP_MASK(22) 130 131 struct ib_sa_path_rec { 132 /* reserved */ 133 /* reserved */ 134 union ib_gid dgid; 135 union ib_gid sgid; 136 __be16 dlid; 137 __be16 slid; 138 int raw_traffic; 139 /* reserved */ 140 __be32 flow_label; 141 u8 hop_limit; 142 u8 traffic_class; 143 int reversible; 144 u8 numb_path; 145 __be16 pkey; 146 /* reserved */ 147 u8 sl; 148 u8 mtu_selector; 149 u8 mtu; 150 u8 rate_selector; 151 u8 rate; 152 u8 packet_life_time_selector; 153 u8 packet_life_time; 154 u8 preference; 155 }; 156 157 #define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0) 158 #define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1) 159 #define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2) 160 #define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3) 161 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4) 162 #define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5) 163 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6) 164 #define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7) 165 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8) 166 #define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9) 167 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10) 168 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11) 169 #define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12) 170 #define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13) 171 #define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14) 172 #define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15) 173 #define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16) 174 #define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17) 175 176 struct ib_sa_mcmember_rec { 177 union ib_gid mgid; 178 union ib_gid port_gid; 179 __be32 qkey; 180 __be16 mlid; 181 u8 mtu_selector; 182 u8 mtu; 183 u8 traffic_class; 184 __be16 pkey; 185 u8 rate_selector; 186 u8 rate; 187 u8 packet_life_time_selector; 188 u8 packet_life_time; 189 u8 sl; 190 __be32 flow_label; 191 u8 hop_limit; 192 u8 scope; 193 u8 join_state; 194 int proxy_join; 195 }; 196 197 /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1 */ 198 #define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0) 199 #define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1) 200 #define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2) 201 /* reserved: 3 */ 202 #define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4) 203 #define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5) 204 #define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6) 205 #define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7) 206 #define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8) 207 #define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9) 208 #define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10) 209 #define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11) 210 #define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12) 211 #define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13) 212 #define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14) 213 #define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15) 214 #define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16) 215 #define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17) 216 #define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18) 217 #define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19) 218 #define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20) 219 #define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21) 220 #define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22) 221 #define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23) 222 #define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24) 223 #define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25) 224 #define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26) 225 #define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27) 226 #define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28) 227 #define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29) 228 #define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30) 229 #define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31) 230 #define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32) 231 #define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33) 232 #define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34) 233 #define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35) 234 #define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36) 235 236 #define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF 237 238 struct ib_sa_service_rec { 239 u64 id; 240 union ib_gid gid; 241 __be16 pkey; 242 /* reserved */ 243 u32 lease; 244 u8 key[16]; 245 u8 name[64]; 246 u8 data8[16]; 247 u16 data16[8]; 248 u32 data32[4]; 249 u64 data64[2]; 250 }; 251 252 struct ib_sa_query; 253 254 void ib_sa_cancel_query(int id, struct ib_sa_query *query); 255 256 int ib_sa_path_rec_get(struct ib_device *device, u8 port_num, 257 struct ib_sa_path_rec *rec, 258 ib_sa_comp_mask comp_mask, 259 int timeout_ms, unsigned int __nocast gfp_mask, 260 void (*callback)(int status, 261 struct ib_sa_path_rec *resp, 262 void *context), 263 void *context, 264 struct ib_sa_query **query); 265 266 int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num, 267 u8 method, 268 struct ib_sa_mcmember_rec *rec, 269 ib_sa_comp_mask comp_mask, 270 int timeout_ms, unsigned int __nocast gfp_mask, 271 void (*callback)(int status, 272 struct ib_sa_mcmember_rec *resp, 273 void *context), 274 void *context, 275 struct ib_sa_query **query); 276 277 int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, 278 u8 method, 279 struct ib_sa_service_rec *rec, 280 ib_sa_comp_mask comp_mask, 281 int timeout_ms, unsigned int __nocast gfp_mask, 282 void (*callback)(int status, 283 struct ib_sa_service_rec *resp, 284 void *context), 285 void *context, 286 struct ib_sa_query **sa_query); 287 288 /** 289 * ib_sa_mcmember_rec_set - Start an MCMember set query 290 * @device:device to send query on 291 * @port_num: port number to send query on 292 * @rec:MCMember Record to send in query 293 * @comp_mask:component mask to send in query 294 * @timeout_ms:time to wait for response 295 * @gfp_mask:GFP mask to use for internal allocations 296 * @callback:function called when query completes, times out or is 297 * canceled 298 * @context:opaque user context passed to callback 299 * @sa_query:query context, used to cancel query 300 * 301 * Send an MCMember Set query to the SA (eg to join a multicast 302 * group). The callback function will be called when the query 303 * completes (or fails); status is 0 for a successful response, -EINTR 304 * if the query is canceled, -ETIMEDOUT is the query timed out, or 305 * -EIO if an error occurred sending the query. The resp parameter of 306 * the callback is only valid if status is 0. 307 * 308 * If the return value of ib_sa_mcmember_rec_set() is negative, it is 309 * an error code. Otherwise it is a query ID that can be used to 310 * cancel the query. 311 */ 312 static inline int 313 ib_sa_mcmember_rec_set(struct ib_device *device, u8 port_num, 314 struct ib_sa_mcmember_rec *rec, 315 ib_sa_comp_mask comp_mask, 316 int timeout_ms, unsigned int __nocast gfp_mask, 317 void (*callback)(int status, 318 struct ib_sa_mcmember_rec *resp, 319 void *context), 320 void *context, 321 struct ib_sa_query **query) 322 { 323 return ib_sa_mcmember_rec_query(device, port_num, 324 IB_MGMT_METHOD_SET, 325 rec, comp_mask, 326 timeout_ms, gfp_mask, callback, 327 context, query); 328 } 329 330 /** 331 * ib_sa_mcmember_rec_delete - Start an MCMember delete query 332 * @device:device to send query on 333 * @port_num: port number to send query on 334 * @rec:MCMember Record to send in query 335 * @comp_mask:component mask to send in query 336 * @timeout_ms:time to wait for response 337 * @gfp_mask:GFP mask to use for internal allocations 338 * @callback:function called when query completes, times out or is 339 * canceled 340 * @context:opaque user context passed to callback 341 * @sa_query:query context, used to cancel query 342 * 343 * Send an MCMember Delete query to the SA (eg to leave a multicast 344 * group). The callback function will be called when the query 345 * completes (or fails); status is 0 for a successful response, -EINTR 346 * if the query is canceled, -ETIMEDOUT is the query timed out, or 347 * -EIO if an error occurred sending the query. The resp parameter of 348 * the callback is only valid if status is 0. 349 * 350 * If the return value of ib_sa_mcmember_rec_delete() is negative, it 351 * is an error code. Otherwise it is a query ID that can be used to 352 * cancel the query. 353 */ 354 static inline int 355 ib_sa_mcmember_rec_delete(struct ib_device *device, u8 port_num, 356 struct ib_sa_mcmember_rec *rec, 357 ib_sa_comp_mask comp_mask, 358 int timeout_ms, unsigned int __nocast gfp_mask, 359 void (*callback)(int status, 360 struct ib_sa_mcmember_rec *resp, 361 void *context), 362 void *context, 363 struct ib_sa_query **query) 364 { 365 return ib_sa_mcmember_rec_query(device, port_num, 366 IB_SA_METHOD_DELETE, 367 rec, comp_mask, 368 timeout_ms, gfp_mask, callback, 369 context, query); 370 } 371 372 373 #endif /* IB_SA_H */ 374