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