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 u8 smac[ETH_ALEN];
158 u8 dmac[ETH_ALEN];
159 u16 vlan_id;
160};
161
162#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
163#define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
164#define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
165#define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
166#define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
167#define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
168#define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
169#define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
170#define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
171#define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
172#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
173#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
174#define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
175#define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
176#define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
177#define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
178#define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
179#define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
180
181struct ib_sa_mcmember_rec {
182 union ib_gid mgid;
183 union ib_gid port_gid;
184 __be32 qkey;
185 __be16 mlid;
186 u8 mtu_selector;
187 u8 mtu;
188 u8 traffic_class;
189 __be16 pkey;
190 u8 rate_selector;
191 u8 rate;
192 u8 packet_life_time_selector;
193 u8 packet_life_time;
194 u8 sl;
195 __be32 flow_label;
196 u8 hop_limit;
197 u8 scope;
198 u8 join_state;
199 int proxy_join;
200};
201
202
203#define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
204#define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
205#define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
206
207#define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
208#define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
209#define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
210#define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
211#define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
212#define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
213#define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
214#define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
215#define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
216#define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
217#define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
218#define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
219#define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
220#define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
221#define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
222#define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
223#define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
224#define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
225#define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
226#define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
227#define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
228#define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
229#define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
230#define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
231#define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
232#define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
233#define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
234#define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
235#define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
236#define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
237#define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
238#define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
239#define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
240
241#define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
242
243struct ib_sa_service_rec {
244 u64 id;
245 union ib_gid gid;
246 __be16 pkey;
247
248 u32 lease;
249 u8 key[16];
250 u8 name[64];
251 u8 data8[16];
252 u16 data16[8];
253 u32 data32[4];
254 u64 data64[2];
255};
256
257#define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
258#define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
259#define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
260#define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
261#define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
262#define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
263#define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
264#define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
265#define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
266#define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
267#define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
268#define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
269
270struct ib_sa_guidinfo_rec {
271 __be16 lid;
272 u8 block_num;
273
274 u8 res1;
275 __be32 res2;
276 u8 guid_info_list[64];
277};
278
279struct ib_sa_client {
280 atomic_t users;
281 struct completion comp;
282};
283
284
285
286
287void ib_sa_register_client(struct ib_sa_client *client);
288
289
290
291
292
293void ib_sa_unregister_client(struct ib_sa_client *client);
294
295struct ib_sa_query;
296
297void ib_sa_cancel_query(int id, struct ib_sa_query *query);
298
299int ib_sa_path_rec_get(struct ib_sa_client *client,
300 struct ib_device *device, u8 port_num,
301 struct ib_sa_path_rec *rec,
302 ib_sa_comp_mask comp_mask,
303 int timeout_ms, gfp_t gfp_mask,
304 void (*callback)(int status,
305 struct ib_sa_path_rec *resp,
306 void *context),
307 void *context,
308 struct ib_sa_query **query);
309
310int ib_sa_service_rec_query(struct ib_sa_client *client,
311 struct ib_device *device, u8 port_num,
312 u8 method,
313 struct ib_sa_service_rec *rec,
314 ib_sa_comp_mask comp_mask,
315 int timeout_ms, gfp_t gfp_mask,
316 void (*callback)(int status,
317 struct ib_sa_service_rec *resp,
318 void *context),
319 void *context,
320 struct ib_sa_query **sa_query);
321
322struct ib_sa_multicast {
323 struct ib_sa_mcmember_rec rec;
324 ib_sa_comp_mask comp_mask;
325 int (*callback)(int status,
326 struct ib_sa_multicast *multicast);
327 void *context;
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
355
356
357
358struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
359 struct ib_device *device, u8 port_num,
360 struct ib_sa_mcmember_rec *rec,
361 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
362 int (*callback)(int status,
363 struct ib_sa_multicast
364 *multicast),
365 void *context);
366
367
368
369
370
371
372
373
374
375
376
377void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
378
379
380
381
382
383
384
385
386
387
388int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
389 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
390
391
392
393
394
395int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
396 struct ib_sa_mcmember_rec *rec,
397 struct ib_ah_attr *ah_attr);
398
399
400
401
402
403int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
404 struct ib_sa_path_rec *rec,
405 struct ib_ah_attr *ah_attr);
406
407
408
409
410
411void ib_sa_pack_path(struct ib_sa_path_rec *rec, void *attribute);
412
413
414
415
416
417void ib_sa_unpack_path(void *attribute, struct ib_sa_path_rec *rec);
418
419
420int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
421 struct ib_device *device, u8 port_num,
422 struct ib_sa_guidinfo_rec *rec,
423 ib_sa_comp_mask comp_mask, u8 method,
424 int timeout_ms, gfp_t gfp_mask,
425 void (*callback)(int status,
426 struct ib_sa_guidinfo_rec *resp,
427 void *context),
428 void *context,
429 struct ib_sa_query **sa_query);
430
431#endif
432