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#include <rdma/ib_addr.h>
47#include <rdma/opa_addr.h>
48
49enum {
50 IB_SA_CLASS_VERSION = 2,
51
52 IB_SA_METHOD_GET_TABLE = 0x12,
53 IB_SA_METHOD_GET_TABLE_RESP = 0x92,
54 IB_SA_METHOD_DELETE = 0x15,
55 IB_SA_METHOD_DELETE_RESP = 0x95,
56 IB_SA_METHOD_GET_MULTI = 0x14,
57 IB_SA_METHOD_GET_MULTI_RESP = 0x94,
58 IB_SA_METHOD_GET_TRACE_TBL = 0x13
59};
60
61#define OPA_SA_CLASS_VERSION 0x80
62enum {
63 IB_SA_ATTR_CLASS_PORTINFO = 0x01,
64 IB_SA_ATTR_NOTICE = 0x02,
65 IB_SA_ATTR_INFORM_INFO = 0x03,
66 IB_SA_ATTR_NODE_REC = 0x11,
67 IB_SA_ATTR_PORT_INFO_REC = 0x12,
68 IB_SA_ATTR_SL2VL_REC = 0x13,
69 IB_SA_ATTR_SWITCH_REC = 0x14,
70 IB_SA_ATTR_LINEAR_FDB_REC = 0x15,
71 IB_SA_ATTR_RANDOM_FDB_REC = 0x16,
72 IB_SA_ATTR_MCAST_FDB_REC = 0x17,
73 IB_SA_ATTR_SM_INFO_REC = 0x18,
74 IB_SA_ATTR_LINK_REC = 0x20,
75 IB_SA_ATTR_GUID_INFO_REC = 0x30,
76 IB_SA_ATTR_SERVICE_REC = 0x31,
77 IB_SA_ATTR_PARTITION_REC = 0x33,
78 IB_SA_ATTR_PATH_REC = 0x35,
79 IB_SA_ATTR_VL_ARB_REC = 0x36,
80 IB_SA_ATTR_MC_MEMBER_REC = 0x38,
81 IB_SA_ATTR_TRACE_REC = 0x39,
82 IB_SA_ATTR_MULTI_PATH_REC = 0x3a,
83 IB_SA_ATTR_SERVICE_ASSOC_REC = 0x3b,
84 IB_SA_ATTR_INFORM_INFO_REC = 0xf3
85};
86
87enum ib_sa_selector {
88 IB_SA_GT = 0,
89 IB_SA_LT = 1,
90 IB_SA_EQ = 2,
91
92
93
94
95
96
97 IB_SA_BEST = 3
98};
99
100
101
102
103
104
105enum ib_sa_mc_join_states {
106 FULLMEMBER_JOIN,
107 NONMEMBER_JOIN,
108 SENDONLY_NONMEBER_JOIN,
109 SENDONLY_FULLMEMBER_JOIN,
110 NUM_JOIN_MEMBERSHIP_TYPES,
111};
112
113#define IB_SA_CAP_MASK2_SENDONLY_FULL_MEM_SUPPORT BIT(12)
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129#define IB_SA_PATH_REC_SERVICE_ID (IB_SA_COMP_MASK( 0) |\
130 IB_SA_COMP_MASK( 1))
131#define IB_SA_PATH_REC_DGID IB_SA_COMP_MASK( 2)
132#define IB_SA_PATH_REC_SGID IB_SA_COMP_MASK( 3)
133#define IB_SA_PATH_REC_DLID IB_SA_COMP_MASK( 4)
134#define IB_SA_PATH_REC_SLID IB_SA_COMP_MASK( 5)
135#define IB_SA_PATH_REC_RAW_TRAFFIC IB_SA_COMP_MASK( 6)
136
137#define IB_SA_PATH_REC_FLOW_LABEL IB_SA_COMP_MASK( 8)
138#define IB_SA_PATH_REC_HOP_LIMIT IB_SA_COMP_MASK( 9)
139#define IB_SA_PATH_REC_TRAFFIC_CLASS IB_SA_COMP_MASK(10)
140#define IB_SA_PATH_REC_REVERSIBLE IB_SA_COMP_MASK(11)
141#define IB_SA_PATH_REC_NUMB_PATH IB_SA_COMP_MASK(12)
142#define IB_SA_PATH_REC_PKEY IB_SA_COMP_MASK(13)
143#define IB_SA_PATH_REC_QOS_CLASS IB_SA_COMP_MASK(14)
144#define IB_SA_PATH_REC_SL IB_SA_COMP_MASK(15)
145#define IB_SA_PATH_REC_MTU_SELECTOR IB_SA_COMP_MASK(16)
146#define IB_SA_PATH_REC_MTU IB_SA_COMP_MASK(17)
147#define IB_SA_PATH_REC_RATE_SELECTOR IB_SA_COMP_MASK(18)
148#define IB_SA_PATH_REC_RATE IB_SA_COMP_MASK(19)
149#define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(20)
150#define IB_SA_PATH_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(21)
151#define IB_SA_PATH_REC_PREFERENCE IB_SA_COMP_MASK(22)
152
153enum sa_path_rec_type {
154 SA_PATH_REC_TYPE_IB,
155 SA_PATH_REC_TYPE_ROCE_V1,
156 SA_PATH_REC_TYPE_ROCE_V2,
157 SA_PATH_REC_TYPE_OPA
158};
159
160struct sa_path_rec_ib {
161 __be16 dlid;
162 __be16 slid;
163 u8 raw_traffic;
164};
165
166struct sa_path_rec_roce {
167 u8 dmac[ETH_ALEN];
168
169 int ifindex;
170
171 struct net *net;
172
173};
174
175struct sa_path_rec_opa {
176 __be32 dlid;
177 __be32 slid;
178 u8 raw_traffic;
179 u8 l2_8B;
180 u8 l2_10B;
181 u8 l2_9B;
182 u8 l2_16B;
183 u8 qos_type;
184 u8 qos_priority;
185};
186
187struct sa_path_rec {
188 union ib_gid dgid;
189 union ib_gid sgid;
190 __be64 service_id;
191
192 __be32 flow_label;
193 u8 hop_limit;
194 u8 traffic_class;
195 u8 reversible;
196 u8 numb_path;
197 __be16 pkey;
198 __be16 qos_class;
199 u8 sl;
200 u8 mtu_selector;
201 u8 mtu;
202 u8 rate_selector;
203 u8 rate;
204 u8 packet_life_time_selector;
205 u8 packet_life_time;
206 u8 preference;
207 union {
208 struct sa_path_rec_ib ib;
209 struct sa_path_rec_roce roce;
210 struct sa_path_rec_opa opa;
211 };
212 enum sa_path_rec_type rec_type;
213};
214
215static inline enum ib_gid_type
216 sa_conv_pathrec_to_gid_type(struct sa_path_rec *rec)
217{
218 switch (rec->rec_type) {
219 case SA_PATH_REC_TYPE_ROCE_V1:
220 return IB_GID_TYPE_ROCE;
221 case SA_PATH_REC_TYPE_ROCE_V2:
222 return IB_GID_TYPE_ROCE_UDP_ENCAP;
223 default:
224 return IB_GID_TYPE_IB;
225 }
226}
227
228static inline enum sa_path_rec_type
229 sa_conv_gid_to_pathrec_type(enum ib_gid_type type)
230{
231 switch (type) {
232 case IB_GID_TYPE_ROCE:
233 return SA_PATH_REC_TYPE_ROCE_V1;
234 case IB_GID_TYPE_ROCE_UDP_ENCAP:
235 return SA_PATH_REC_TYPE_ROCE_V2;
236 default:
237 return SA_PATH_REC_TYPE_IB;
238 }
239}
240
241static inline void path_conv_opa_to_ib(struct sa_path_rec *ib,
242 struct sa_path_rec *opa)
243{
244 if ((be32_to_cpu(opa->opa.dlid) >=
245 be16_to_cpu(IB_MULTICAST_LID_BASE)) ||
246 (be32_to_cpu(opa->opa.slid) >=
247 be16_to_cpu(IB_MULTICAST_LID_BASE))) {
248
249 ib->dgid.global.interface_id
250 = OPA_MAKE_ID(be32_to_cpu(opa->opa.dlid));
251 ib->dgid.global.subnet_prefix
252 = opa->dgid.global.subnet_prefix;
253 ib->sgid.global.interface_id
254 = OPA_MAKE_ID(be32_to_cpu(opa->opa.slid));
255 ib->dgid.global.subnet_prefix
256 = opa->dgid.global.subnet_prefix;
257 ib->ib.dlid = 0;
258
259 ib->ib.slid = 0;
260 } else {
261 ib->ib.dlid = htons(ntohl(opa->opa.dlid));
262 ib->ib.slid = htons(ntohl(opa->opa.slid));
263 }
264 ib->service_id = opa->service_id;
265 ib->ib.raw_traffic = opa->opa.raw_traffic;
266}
267
268static inline void path_conv_ib_to_opa(struct sa_path_rec *opa,
269 struct sa_path_rec *ib)
270{
271 __be32 slid, dlid;
272
273 if ((ib_is_opa_gid(&ib->sgid)) ||
274 (ib_is_opa_gid(&ib->dgid))) {
275 slid = htonl(opa_get_lid_from_gid(&ib->sgid));
276 dlid = htonl(opa_get_lid_from_gid(&ib->dgid));
277 } else {
278 slid = htonl(ntohs(ib->ib.slid));
279 dlid = htonl(ntohs(ib->ib.dlid));
280 }
281 opa->opa.slid = slid;
282 opa->opa.dlid = dlid;
283 opa->service_id = ib->service_id;
284 opa->opa.raw_traffic = ib->ib.raw_traffic;
285}
286
287
288static inline void sa_convert_path_opa_to_ib(struct sa_path_rec *dest,
289 struct sa_path_rec *src)
290{
291 if (src->rec_type != SA_PATH_REC_TYPE_OPA)
292 return;
293
294 *dest = *src;
295 dest->rec_type = SA_PATH_REC_TYPE_IB;
296 path_conv_opa_to_ib(dest, src);
297}
298
299
300static inline void sa_convert_path_ib_to_opa(struct sa_path_rec *dest,
301 struct sa_path_rec *src)
302{
303 if (src->rec_type != SA_PATH_REC_TYPE_IB)
304 return;
305
306
307 *dest = *src;
308 dest->rec_type = SA_PATH_REC_TYPE_OPA;
309 path_conv_ib_to_opa(dest, src);
310}
311
312#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
313#define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
314#define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
315#define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
316#define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
317#define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
318#define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
319#define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
320#define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
321#define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
322#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
323#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
324#define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
325#define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
326#define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
327#define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
328#define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
329#define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
330
331struct ib_sa_mcmember_rec {
332 union ib_gid mgid;
333 union ib_gid port_gid;
334 __be32 qkey;
335 __be16 mlid;
336 u8 mtu_selector;
337 u8 mtu;
338 u8 traffic_class;
339 __be16 pkey;
340 u8 rate_selector;
341 u8 rate;
342 u8 packet_life_time_selector;
343 u8 packet_life_time;
344 u8 sl;
345 __be32 flow_label;
346 u8 hop_limit;
347 u8 scope;
348 u8 join_state;
349 u8 proxy_join;
350};
351
352
353#define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
354#define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
355#define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
356
357#define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
358#define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
359#define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
360#define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
361#define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
362#define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
363#define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
364#define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
365#define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
366#define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
367#define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
368#define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
369#define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
370#define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
371#define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
372#define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
373#define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
374#define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
375#define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
376#define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
377#define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
378#define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
379#define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
380#define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
381#define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
382#define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
383#define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
384#define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
385#define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
386#define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
387#define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
388#define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
389#define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
390
391#define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
392
393struct ib_sa_service_rec {
394 u64 id;
395 union ib_gid gid;
396 __be16 pkey;
397
398 u32 lease;
399 u8 key[16];
400 u8 name[64];
401 u8 data8[16];
402 u16 data16[8];
403 u32 data32[4];
404 u64 data64[2];
405};
406
407#define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
408#define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
409#define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
410#define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
411#define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
412#define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
413#define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
414#define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
415#define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
416#define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
417#define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
418#define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
419
420struct ib_sa_guidinfo_rec {
421 __be16 lid;
422 u8 block_num;
423
424 u8 res1;
425 __be32 res2;
426 u8 guid_info_list[64];
427};
428
429struct ib_sa_client {
430 atomic_t users;
431 struct completion comp;
432};
433
434
435
436
437void ib_sa_register_client(struct ib_sa_client *client);
438
439
440
441
442
443void ib_sa_unregister_client(struct ib_sa_client *client);
444
445struct ib_sa_query;
446
447void ib_sa_cancel_query(int id, struct ib_sa_query *query);
448
449int ib_sa_path_rec_get(struct ib_sa_client *client,
450 struct ib_device *device, u8 port_num,
451 struct sa_path_rec *rec,
452 ib_sa_comp_mask comp_mask,
453 int timeout_ms, gfp_t gfp_mask,
454 void (*callback)(int status,
455 struct sa_path_rec *resp,
456 void *context),
457 void *context,
458 struct ib_sa_query **query);
459
460int ib_sa_service_rec_query(struct ib_sa_client *client,
461 struct ib_device *device, u8 port_num,
462 u8 method,
463 struct ib_sa_service_rec *rec,
464 ib_sa_comp_mask comp_mask,
465 int timeout_ms, gfp_t gfp_mask,
466 void (*callback)(int status,
467 struct ib_sa_service_rec *resp,
468 void *context),
469 void *context,
470 struct ib_sa_query **sa_query);
471
472struct ib_sa_multicast {
473 struct ib_sa_mcmember_rec rec;
474 ib_sa_comp_mask comp_mask;
475 int (*callback)(int status,
476 struct ib_sa_multicast *multicast);
477 void *context;
478};
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
509 struct ib_device *device, u8 port_num,
510 struct ib_sa_mcmember_rec *rec,
511 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
512 int (*callback)(int status,
513 struct ib_sa_multicast
514 *multicast),
515 void *context);
516
517
518
519
520
521
522
523
524
525
526
527void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
528
529
530
531
532
533
534
535
536
537
538int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
539 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
540
541
542
543
544
545int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
546 struct ib_sa_mcmember_rec *rec,
547 struct net_device *ndev,
548 enum ib_gid_type gid_type,
549 struct rdma_ah_attr *ah_attr);
550
551
552
553
554
555int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
556 struct sa_path_rec *rec,
557 struct rdma_ah_attr *ah_attr);
558
559
560
561
562
563void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute);
564
565
566
567
568
569void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
570
571
572int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
573 struct ib_device *device, u8 port_num,
574 struct ib_sa_guidinfo_rec *rec,
575 ib_sa_comp_mask comp_mask, u8 method,
576 int timeout_ms, gfp_t gfp_mask,
577 void (*callback)(int status,
578 struct ib_sa_guidinfo_rec *resp,
579 void *context),
580 void *context,
581 struct ib_sa_query **sa_query);
582
583bool ib_sa_sendonly_fullmem_support(struct ib_sa_client *client,
584 struct ib_device *device,
585 u8 port_num);
586
587static inline bool sa_path_is_roce(struct sa_path_rec *rec)
588{
589 return ((rec->rec_type == SA_PATH_REC_TYPE_ROCE_V1) ||
590 (rec->rec_type == SA_PATH_REC_TYPE_ROCE_V2));
591}
592
593static inline void sa_path_set_slid(struct sa_path_rec *rec, __be32 slid)
594{
595 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
596 rec->ib.slid = htons(ntohl(slid));
597 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
598 rec->opa.slid = slid;
599}
600
601static inline void sa_path_set_dlid(struct sa_path_rec *rec, __be32 dlid)
602{
603 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
604 rec->ib.dlid = htons(ntohl(dlid));
605 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
606 rec->opa.dlid = dlid;
607}
608
609static inline void sa_path_set_raw_traffic(struct sa_path_rec *rec,
610 u8 raw_traffic)
611{
612 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
613 rec->ib.raw_traffic = raw_traffic;
614 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
615 rec->opa.raw_traffic = raw_traffic;
616}
617
618static inline __be32 sa_path_get_slid(struct sa_path_rec *rec)
619{
620 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
621 return htonl(ntohs(rec->ib.slid));
622 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
623 return rec->opa.slid;
624 return 0;
625}
626
627static inline __be32 sa_path_get_dlid(struct sa_path_rec *rec)
628{
629 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
630 return htonl(ntohs(rec->ib.dlid));
631 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
632 return rec->opa.dlid;
633 return 0;
634}
635
636static inline u8 sa_path_get_raw_traffic(struct sa_path_rec *rec)
637{
638 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
639 return rec->ib.raw_traffic;
640 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
641 return rec->opa.raw_traffic;
642 return 0;
643}
644
645static inline void sa_path_set_dmac(struct sa_path_rec *rec, u8 *dmac)
646{
647 if (sa_path_is_roce(rec))
648 memcpy(rec->roce.dmac, dmac, ETH_ALEN);
649}
650
651static inline void sa_path_set_dmac_zero(struct sa_path_rec *rec)
652{
653 if (sa_path_is_roce(rec))
654 eth_zero_addr(rec->roce.dmac);
655}
656
657static inline void sa_path_set_ifindex(struct sa_path_rec *rec, int ifindex)
658{
659 if (sa_path_is_roce(rec))
660 rec->roce.ifindex = ifindex;
661}
662
663static inline void sa_path_set_ndev(struct sa_path_rec *rec, struct net *net)
664{
665 if (sa_path_is_roce(rec))
666 rec->roce.net = net;
667}
668
669static inline u8 *sa_path_get_dmac(struct sa_path_rec *rec)
670{
671 if (sa_path_is_roce(rec))
672 return rec->roce.dmac;
673 return NULL;
674}
675
676static inline int sa_path_get_ifindex(struct sa_path_rec *rec)
677{
678 if (sa_path_is_roce(rec))
679 return rec->roce.ifindex;
680 return 0;
681}
682
683static inline struct net *sa_path_get_ndev(struct sa_path_rec *rec)
684{
685 if (sa_path_is_roce(rec))
686 return rec->roce.net;
687 return NULL;
688}
689
690static inline struct net_device *ib_get_ndev_from_path(struct sa_path_rec *rec)
691{
692 return sa_path_get_ndev(rec) ?
693 dev_get_by_index(sa_path_get_ndev(rec),
694 sa_path_get_ifindex(rec))
695 : NULL;
696}
697
698#endif
699