1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#ifndef IB_SA_H
36#define IB_SA_H
37
38#include <linux/completion.h>
39#include <linux/compiler.h>
40
41#include <linux/atomic.h>
42
43#include <rdma/ib_verbs.h>
44#include <rdma/ib_mad.h>
45
46enum {
47 IB_SA_CLASS_VERSION = 2,
48
49 IB_SA_METHOD_GET_TABLE = 0x12,
50 IB_SA_METHOD_GET_TABLE_RESP = 0x92,
51 IB_SA_METHOD_DELETE = 0x15,
52 IB_SA_METHOD_DELETE_RESP = 0x95,
53 IB_SA_METHOD_GET_MULTI = 0x14,
54 IB_SA_METHOD_GET_MULTI_RESP = 0x94,
55 IB_SA_METHOD_GET_TRACE_TBL = 0x13
56};
57
58enum {
59 IB_SA_ATTR_CLASS_PORTINFO = 0x01,
60 IB_SA_ATTR_NOTICE = 0x02,
61 IB_SA_ATTR_INFORM_INFO = 0x03,
62 IB_SA_ATTR_NODE_REC = 0x11,
63 IB_SA_ATTR_PORT_INFO_REC = 0x12,
64 IB_SA_ATTR_SL2VL_REC = 0x13,
65 IB_SA_ATTR_SWITCH_REC = 0x14,
66 IB_SA_ATTR_LINEAR_FDB_REC = 0x15,
67 IB_SA_ATTR_RANDOM_FDB_REC = 0x16,
68 IB_SA_ATTR_MCAST_FDB_REC = 0x17,
69 IB_SA_ATTR_SM_INFO_REC = 0x18,
70 IB_SA_ATTR_LINK_REC = 0x20,
71 IB_SA_ATTR_GUID_INFO_REC = 0x30,
72 IB_SA_ATTR_SERVICE_REC = 0x31,
73 IB_SA_ATTR_PARTITION_REC = 0x33,
74 IB_SA_ATTR_PATH_REC = 0x35,
75 IB_SA_ATTR_VL_ARB_REC = 0x36,
76 IB_SA_ATTR_MC_MEMBER_REC = 0x38,
77 IB_SA_ATTR_TRACE_REC = 0x39,
78 IB_SA_ATTR_MULTI_PATH_REC = 0x3a,
79 IB_SA_ATTR_SERVICE_ASSOC_REC = 0x3b,
80 IB_SA_ATTR_INFORM_INFO_REC = 0xf3
81};
82
83enum ib_sa_selector {
84 IB_SA_GT = 0,
85 IB_SA_LT = 1,
86 IB_SA_EQ = 2,
87
88
89
90
91
92
93 IB_SA_BEST = 3
94};
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110#define IB_SA_PATH_REC_SERVICE_ID (IB_SA_COMP_MASK( 0) |\
111 IB_SA_COMP_MASK( 1))
112#define IB_SA_PATH_REC_DGID IB_SA_COMP_MASK( 2)
113#define IB_SA_PATH_REC_SGID IB_SA_COMP_MASK( 3)
114#define IB_SA_PATH_REC_DLID IB_SA_COMP_MASK( 4)
115#define IB_SA_PATH_REC_SLID IB_SA_COMP_MASK( 5)
116#define IB_SA_PATH_REC_RAW_TRAFFIC IB_SA_COMP_MASK( 6)
117
118#define IB_SA_PATH_REC_FLOW_LABEL IB_SA_COMP_MASK( 8)
119#define IB_SA_PATH_REC_HOP_LIMIT IB_SA_COMP_MASK( 9)
120#define IB_SA_PATH_REC_TRAFFIC_CLASS IB_SA_COMP_MASK(10)
121#define IB_SA_PATH_REC_REVERSIBLE IB_SA_COMP_MASK(11)
122#define IB_SA_PATH_REC_NUMB_PATH IB_SA_COMP_MASK(12)
123#define IB_SA_PATH_REC_PKEY IB_SA_COMP_MASK(13)
124#define IB_SA_PATH_REC_QOS_CLASS IB_SA_COMP_MASK(14)
125#define IB_SA_PATH_REC_SL IB_SA_COMP_MASK(15)
126#define IB_SA_PATH_REC_MTU_SELECTOR IB_SA_COMP_MASK(16)
127#define IB_SA_PATH_REC_MTU IB_SA_COMP_MASK(17)
128#define IB_SA_PATH_REC_RATE_SELECTOR IB_SA_COMP_MASK(18)
129#define IB_SA_PATH_REC_RATE IB_SA_COMP_MASK(19)
130#define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(20)
131#define IB_SA_PATH_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(21)
132#define IB_SA_PATH_REC_PREFERENCE IB_SA_COMP_MASK(22)
133
134struct ib_sa_path_rec {
135 __be64 service_id;
136 union ib_gid dgid;
137 union ib_gid sgid;
138 __be16 dlid;
139 __be16 slid;
140 int raw_traffic;
141
142 __be32 flow_label;
143 u8 hop_limit;
144 u8 traffic_class;
145 int reversible;
146 u8 numb_path;
147 __be16 pkey;
148 __be16 qos_class;
149 u8 sl;
150 u8 mtu_selector;
151 u8 mtu;
152 u8 rate_selector;
153 u8 rate;
154 u8 packet_life_time_selector;
155 u8 packet_life_time;
156 u8 preference;
157};
158
159#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
160#define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
161#define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
162#define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
163#define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
164#define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
165#define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
166#define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
167#define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
168#define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
169#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
170#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
171#define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
172#define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
173#define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
174#define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
175#define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
176#define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
177
178struct ib_sa_mcmember_rec {
179 union ib_gid mgid;
180 union ib_gid port_gid;
181 __be32 qkey;
182 __be16 mlid;
183 u8 mtu_selector;
184 u8 mtu;
185 u8 traffic_class;
186 __be16 pkey;
187 u8 rate_selector;
188 u8 rate;
189 u8 packet_life_time_selector;
190 u8 packet_life_time;
191 u8 sl;
192 __be32 flow_label;
193 u8 hop_limit;
194 u8 scope;
195 u8 join_state;
196 int proxy_join;
197};
198
199
200#define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
201#define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
202#define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
203
204#define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
205#define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
206#define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
207#define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
208#define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
209#define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
210#define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
211#define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
212#define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
213#define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
214#define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
215#define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
216#define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
217#define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
218#define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
219#define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
220#define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
221#define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
222#define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
223#define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
224#define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
225#define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
226#define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
227#define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
228#define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
229#define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
230#define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
231#define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
232#define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
233#define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
234#define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
235#define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
236#define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
237
238#define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
239
240struct ib_sa_service_rec {
241 u64 id;
242 union ib_gid gid;
243 __be16 pkey;
244
245 u32 lease;
246 u8 key[16];
247 u8 name[64];
248 u8 data8[16];
249 u16 data16[8];
250 u32 data32[4];
251 u64 data64[2];
252};
253
254#define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
255#define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
256#define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
257#define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
258#define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
259#define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
260#define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
261#define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
262#define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
263#define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
264#define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
265#define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
266
267struct ib_sa_guidinfo_rec {
268 __be16 lid;
269 u8 block_num;
270
271 u8 res1;
272 __be32 res2;
273 u8 guid_info_list[64];
274};
275
276struct ib_sa_client {
277 atomic_t users;
278 struct completion comp;
279};
280
281
282
283
284void ib_sa_register_client(struct ib_sa_client *client);
285
286
287
288
289
290void ib_sa_unregister_client(struct ib_sa_client *client);
291
292struct ib_sa_query;
293
294void ib_sa_cancel_query(int id, struct ib_sa_query *query);
295
296int ib_sa_path_rec_get(struct ib_sa_client *client,
297 struct ib_device *device, u8 port_num,
298 struct ib_sa_path_rec *rec,
299 ib_sa_comp_mask comp_mask,
300 int timeout_ms, gfp_t gfp_mask,
301 void (*callback)(int status,
302 struct ib_sa_path_rec *resp,
303 void *context),
304 void *context,
305 struct ib_sa_query **query);
306
307int ib_sa_service_rec_query(struct ib_sa_client *client,
308 struct ib_device *device, u8 port_num,
309 u8 method,
310 struct ib_sa_service_rec *rec,
311 ib_sa_comp_mask comp_mask,
312 int timeout_ms, gfp_t gfp_mask,
313 void (*callback)(int status,
314 struct ib_sa_service_rec *resp,
315 void *context),
316 void *context,
317 struct ib_sa_query **sa_query);
318
319struct ib_sa_multicast {
320 struct ib_sa_mcmember_rec rec;
321 ib_sa_comp_mask comp_mask;
322 int (*callback)(int status,
323 struct ib_sa_multicast *multicast);
324 void *context;
325};
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
356 struct ib_device *device, u8 port_num,
357 struct ib_sa_mcmember_rec *rec,
358 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
359 int (*callback)(int status,
360 struct ib_sa_multicast
361 *multicast),
362 void *context);
363
364
365
366
367
368
369
370
371
372
373
374void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
375
376
377
378
379
380
381
382
383
384
385int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
386 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
387
388
389
390
391
392int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
393 struct ib_sa_mcmember_rec *rec,
394 struct ib_ah_attr *ah_attr);
395
396
397
398
399
400int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
401 struct ib_sa_path_rec *rec,
402 struct ib_ah_attr *ah_attr);
403
404
405
406
407
408void ib_sa_unpack_path(void *attribute, struct ib_sa_path_rec *rec);
409
410
411int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
412 struct ib_device *device, u8 port_num,
413 struct ib_sa_guidinfo_rec *rec,
414 ib_sa_comp_mask comp_mask, u8 method,
415 int timeout_ms, gfp_t gfp_mask,
416 void (*callback)(int status,
417 struct ib_sa_guidinfo_rec *resp,
418 void *context),
419 void *context,
420 struct ib_sa_query **sa_query);
421#endif
422