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