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
102enum ib_sa_mc_join_states {
103 FULLMEMBER_JOIN,
104 NONMEMBER_JOIN,
105 SENDONLY_NONMEBER_JOIN,
106 SENDONLY_FULLMEMBER_JOIN,
107 NUM_JOIN_MEMBERSHIP_TYPES,
108};
109
110#define IB_SA_CAP_MASK2_SENDONLY_FULL_MEM_SUPPORT BIT(12)
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126#define IB_SA_PATH_REC_SERVICE_ID (IB_SA_COMP_MASK( 0) |\
127 IB_SA_COMP_MASK( 1))
128#define IB_SA_PATH_REC_DGID IB_SA_COMP_MASK( 2)
129#define IB_SA_PATH_REC_SGID IB_SA_COMP_MASK( 3)
130#define IB_SA_PATH_REC_DLID IB_SA_COMP_MASK( 4)
131#define IB_SA_PATH_REC_SLID IB_SA_COMP_MASK( 5)
132#define IB_SA_PATH_REC_RAW_TRAFFIC IB_SA_COMP_MASK( 6)
133
134#define IB_SA_PATH_REC_FLOW_LABEL IB_SA_COMP_MASK( 8)
135#define IB_SA_PATH_REC_HOP_LIMIT IB_SA_COMP_MASK( 9)
136#define IB_SA_PATH_REC_TRAFFIC_CLASS IB_SA_COMP_MASK(10)
137#define IB_SA_PATH_REC_REVERSIBLE IB_SA_COMP_MASK(11)
138#define IB_SA_PATH_REC_NUMB_PATH IB_SA_COMP_MASK(12)
139#define IB_SA_PATH_REC_PKEY IB_SA_COMP_MASK(13)
140#define IB_SA_PATH_REC_QOS_CLASS IB_SA_COMP_MASK(14)
141#define IB_SA_PATH_REC_SL IB_SA_COMP_MASK(15)
142#define IB_SA_PATH_REC_MTU_SELECTOR IB_SA_COMP_MASK(16)
143#define IB_SA_PATH_REC_MTU IB_SA_COMP_MASK(17)
144#define IB_SA_PATH_REC_RATE_SELECTOR IB_SA_COMP_MASK(18)
145#define IB_SA_PATH_REC_RATE IB_SA_COMP_MASK(19)
146#define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(20)
147#define IB_SA_PATH_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(21)
148#define IB_SA_PATH_REC_PREFERENCE IB_SA_COMP_MASK(22)
149
150struct ib_sa_path_rec {
151 __be64 service_id;
152 union ib_gid dgid;
153 union ib_gid sgid;
154 __be16 dlid;
155 __be16 slid;
156 u8 raw_traffic;
157
158 __be32 flow_label;
159 u8 hop_limit;
160 u8 traffic_class;
161 u8 reversible;
162 u8 numb_path;
163 __be16 pkey;
164 __be16 qos_class;
165 u8 sl;
166 u8 mtu_selector;
167 u8 mtu;
168 u8 rate_selector;
169 u8 rate;
170 u8 packet_life_time_selector;
171 u8 packet_life_time;
172 u8 preference;
173 u8 dmac[ETH_ALEN];
174
175 int ifindex;
176
177 struct net *net;
178 enum ib_gid_type gid_type;
179};
180
181static inline struct net_device *ib_get_ndev_from_path(struct ib_sa_path_rec *rec)
182{
183 return rec->net ? dev_get_by_index(rec->net, rec->ifindex) : NULL;
184}
185
186#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
187#define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
188#define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
189#define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
190#define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
191#define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
192#define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
193#define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
194#define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
195#define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
196#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
197#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
198#define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
199#define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
200#define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
201#define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
202#define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
203#define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
204
205struct ib_sa_mcmember_rec {
206 union ib_gid mgid;
207 union ib_gid port_gid;
208 __be32 qkey;
209 __be16 mlid;
210 u8 mtu_selector;
211 u8 mtu;
212 u8 traffic_class;
213 __be16 pkey;
214 u8 rate_selector;
215 u8 rate;
216 u8 packet_life_time_selector;
217 u8 packet_life_time;
218 u8 sl;
219 __be32 flow_label;
220 u8 hop_limit;
221 u8 scope;
222 u8 join_state;
223 u8 proxy_join;
224};
225
226
227#define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
228#define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
229#define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
230
231#define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
232#define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
233#define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
234#define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
235#define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
236#define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
237#define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
238#define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
239#define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
240#define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
241#define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
242#define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
243#define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
244#define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
245#define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
246#define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
247#define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
248#define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
249#define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
250#define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
251#define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
252#define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
253#define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
254#define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
255#define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
256#define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
257#define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
258#define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
259#define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
260#define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
261#define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
262#define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
263#define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
264
265#define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
266
267struct ib_sa_service_rec {
268 u64 id;
269 union ib_gid gid;
270 __be16 pkey;
271
272 u32 lease;
273 u8 key[16];
274 u8 name[64];
275 u8 data8[16];
276 u16 data16[8];
277 u32 data32[4];
278 u64 data64[2];
279};
280
281#define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
282#define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
283#define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
284#define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
285#define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
286#define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
287#define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
288#define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
289#define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
290#define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
291#define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
292#define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
293
294struct ib_sa_guidinfo_rec {
295 __be16 lid;
296 u8 block_num;
297
298 u8 res1;
299 __be32 res2;
300 u8 guid_info_list[64];
301};
302
303struct ib_sa_client {
304 atomic_t users;
305 struct completion comp;
306};
307
308
309
310
311void ib_sa_register_client(struct ib_sa_client *client);
312
313
314
315
316
317void ib_sa_unregister_client(struct ib_sa_client *client);
318
319struct ib_sa_query;
320
321void ib_sa_cancel_query(int id, struct ib_sa_query *query);
322
323int ib_sa_path_rec_get(struct ib_sa_client *client,
324 struct ib_device *device, u8 port_num,
325 struct ib_sa_path_rec *rec,
326 ib_sa_comp_mask comp_mask,
327 int timeout_ms, gfp_t gfp_mask,
328 void (*callback)(int status,
329 struct ib_sa_path_rec *resp,
330 void *context),
331 void *context,
332 struct ib_sa_query **query);
333
334int ib_sa_service_rec_query(struct ib_sa_client *client,
335 struct ib_device *device, u8 port_num,
336 u8 method,
337 struct ib_sa_service_rec *rec,
338 ib_sa_comp_mask comp_mask,
339 int timeout_ms, gfp_t gfp_mask,
340 void (*callback)(int status,
341 struct ib_sa_service_rec *resp,
342 void *context),
343 void *context,
344 struct ib_sa_query **sa_query);
345
346struct ib_sa_multicast {
347 struct ib_sa_mcmember_rec rec;
348 ib_sa_comp_mask comp_mask;
349 int (*callback)(int status,
350 struct ib_sa_multicast *multicast);
351 void *context;
352};
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
383 struct ib_device *device, u8 port_num,
384 struct ib_sa_mcmember_rec *rec,
385 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
386 int (*callback)(int status,
387 struct ib_sa_multicast
388 *multicast),
389 void *context);
390
391
392
393
394
395
396
397
398
399
400
401void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
402
403
404
405
406
407
408
409
410
411
412int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
413 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
414
415
416
417
418
419int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
420 struct ib_sa_mcmember_rec *rec,
421 struct net_device *ndev,
422 enum ib_gid_type gid_type,
423 struct ib_ah_attr *ah_attr);
424
425
426
427
428
429int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
430 struct ib_sa_path_rec *rec,
431 struct ib_ah_attr *ah_attr);
432
433
434
435
436
437void ib_sa_pack_path(struct ib_sa_path_rec *rec, void *attribute);
438
439
440
441
442
443void ib_sa_unpack_path(void *attribute, struct ib_sa_path_rec *rec);
444
445
446int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
447 struct ib_device *device, u8 port_num,
448 struct ib_sa_guidinfo_rec *rec,
449 ib_sa_comp_mask comp_mask, u8 method,
450 int timeout_ms, gfp_t gfp_mask,
451 void (*callback)(int status,
452 struct ib_sa_guidinfo_rec *resp,
453 void *context),
454 void *context,
455 struct ib_sa_query **sa_query);
456
457
458int ib_sa_classport_info_rec_query(struct ib_sa_client *client,
459 struct ib_device *device, u8 port_num,
460 int timeout_ms, gfp_t gfp_mask,
461 void (*callback)(int status,
462 struct ib_class_port_info *resp,
463 void *context),
464 void *context,
465 struct ib_sa_query **sa_query);
466
467#endif
468