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 <asm/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
254struct ib_sa_client {
255 atomic_t users;
256 struct completion comp;
257};
258
259
260
261
262void ib_sa_register_client(struct ib_sa_client *client);
263
264
265
266
267
268void ib_sa_unregister_client(struct ib_sa_client *client);
269
270struct ib_sa_query;
271
272void ib_sa_cancel_query(int id, struct ib_sa_query *query);
273
274int ib_sa_path_rec_get(struct ib_sa_client *client,
275 struct ib_device *device, u8 port_num,
276 struct ib_sa_path_rec *rec,
277 ib_sa_comp_mask comp_mask,
278 int timeout_ms, gfp_t gfp_mask,
279 void (*callback)(int status,
280 struct ib_sa_path_rec *resp,
281 void *context),
282 void *context,
283 struct ib_sa_query **query);
284
285int ib_sa_service_rec_query(struct ib_sa_client *client,
286 struct ib_device *device, u8 port_num,
287 u8 method,
288 struct ib_sa_service_rec *rec,
289 ib_sa_comp_mask comp_mask,
290 int timeout_ms, gfp_t gfp_mask,
291 void (*callback)(int status,
292 struct ib_sa_service_rec *resp,
293 void *context),
294 void *context,
295 struct ib_sa_query **sa_query);
296
297struct ib_sa_multicast {
298 struct ib_sa_mcmember_rec rec;
299 ib_sa_comp_mask comp_mask;
300 int (*callback)(int status,
301 struct ib_sa_multicast *multicast);
302 void *context;
303};
304
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
333struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
334 struct ib_device *device, u8 port_num,
335 struct ib_sa_mcmember_rec *rec,
336 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
337 int (*callback)(int status,
338 struct ib_sa_multicast
339 *multicast),
340 void *context);
341
342
343
344
345
346
347
348
349
350
351
352void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
353
354
355
356
357
358
359
360
361
362
363int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
364 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
365
366
367
368
369
370int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
371 struct ib_sa_mcmember_rec *rec,
372 struct ib_ah_attr *ah_attr);
373
374
375
376
377
378int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
379 struct ib_sa_path_rec *rec,
380 struct ib_ah_attr *ah_attr);
381
382#endif
383