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