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
166
167
168
169
170
171
172
173struct sa_path_rec_roce {
174 bool route_resolved;
175 u8 dmac[ETH_ALEN];
176
177 int ifindex;
178
179 struct net *net;
180
181};
182
183struct sa_path_rec_opa {
184 __be32 dlid;
185 __be32 slid;
186 u8 raw_traffic;
187 u8 l2_8B;
188 u8 l2_10B;
189 u8 l2_9B;
190 u8 l2_16B;
191 u8 qos_type;
192 u8 qos_priority;
193};
194
195struct sa_path_rec {
196 union ib_gid dgid;
197 union ib_gid sgid;
198 __be64 service_id;
199
200 __be32 flow_label;
201 u8 hop_limit;
202 u8 traffic_class;
203 u8 reversible;
204 u8 numb_path;
205 __be16 pkey;
206 __be16 qos_class;
207 u8 sl;
208 u8 mtu_selector;
209 u8 mtu;
210 u8 rate_selector;
211 u8 rate;
212 u8 packet_life_time_selector;
213 u8 packet_life_time;
214 u8 preference;
215 union {
216 struct sa_path_rec_ib ib;
217 struct sa_path_rec_roce roce;
218 struct sa_path_rec_opa opa;
219 };
220 enum sa_path_rec_type rec_type;
221};
222
223static inline enum ib_gid_type
224 sa_conv_pathrec_to_gid_type(struct sa_path_rec *rec)
225{
226 switch (rec->rec_type) {
227 case SA_PATH_REC_TYPE_ROCE_V1:
228 return IB_GID_TYPE_ROCE;
229 case SA_PATH_REC_TYPE_ROCE_V2:
230 return IB_GID_TYPE_ROCE_UDP_ENCAP;
231 default:
232 return IB_GID_TYPE_IB;
233 }
234}
235
236static inline enum sa_path_rec_type
237 sa_conv_gid_to_pathrec_type(enum ib_gid_type type)
238{
239 switch (type) {
240 case IB_GID_TYPE_ROCE:
241 return SA_PATH_REC_TYPE_ROCE_V1;
242 case IB_GID_TYPE_ROCE_UDP_ENCAP:
243 return SA_PATH_REC_TYPE_ROCE_V2;
244 default:
245 return SA_PATH_REC_TYPE_IB;
246 }
247}
248
249static inline void path_conv_opa_to_ib(struct sa_path_rec *ib,
250 struct sa_path_rec *opa)
251{
252 if ((be32_to_cpu(opa->opa.dlid) >=
253 be16_to_cpu(IB_MULTICAST_LID_BASE)) ||
254 (be32_to_cpu(opa->opa.slid) >=
255 be16_to_cpu(IB_MULTICAST_LID_BASE))) {
256
257 ib->dgid.global.interface_id
258 = OPA_MAKE_ID(be32_to_cpu(opa->opa.dlid));
259 ib->dgid.global.subnet_prefix
260 = opa->dgid.global.subnet_prefix;
261 ib->sgid.global.interface_id
262 = OPA_MAKE_ID(be32_to_cpu(opa->opa.slid));
263 ib->dgid.global.subnet_prefix
264 = opa->dgid.global.subnet_prefix;
265 ib->ib.dlid = 0;
266
267 ib->ib.slid = 0;
268 } else {
269 ib->ib.dlid = htons(ntohl(opa->opa.dlid));
270 ib->ib.slid = htons(ntohl(opa->opa.slid));
271 }
272 ib->service_id = opa->service_id;
273 ib->ib.raw_traffic = opa->opa.raw_traffic;
274}
275
276static inline void path_conv_ib_to_opa(struct sa_path_rec *opa,
277 struct sa_path_rec *ib)
278{
279 __be32 slid, dlid;
280
281 if ((ib_is_opa_gid(&ib->sgid)) ||
282 (ib_is_opa_gid(&ib->dgid))) {
283 slid = htonl(opa_get_lid_from_gid(&ib->sgid));
284 dlid = htonl(opa_get_lid_from_gid(&ib->dgid));
285 } else {
286 slid = htonl(ntohs(ib->ib.slid));
287 dlid = htonl(ntohs(ib->ib.dlid));
288 }
289 opa->opa.slid = slid;
290 opa->opa.dlid = dlid;
291 opa->service_id = ib->service_id;
292 opa->opa.raw_traffic = ib->ib.raw_traffic;
293}
294
295
296static inline void sa_convert_path_opa_to_ib(struct sa_path_rec *dest,
297 struct sa_path_rec *src)
298{
299 if (src->rec_type != SA_PATH_REC_TYPE_OPA)
300 return;
301
302 *dest = *src;
303 dest->rec_type = SA_PATH_REC_TYPE_IB;
304 path_conv_opa_to_ib(dest, src);
305}
306
307
308static inline void sa_convert_path_ib_to_opa(struct sa_path_rec *dest,
309 struct sa_path_rec *src)
310{
311 if (src->rec_type != SA_PATH_REC_TYPE_IB)
312 return;
313
314
315 *dest = *src;
316 dest->rec_type = SA_PATH_REC_TYPE_OPA;
317 path_conv_ib_to_opa(dest, src);
318}
319
320#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
321#define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
322#define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
323#define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
324#define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
325#define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
326#define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
327#define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
328#define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
329#define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
330#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
331#define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
332#define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
333#define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
334#define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
335#define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
336#define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
337#define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
338
339struct ib_sa_mcmember_rec {
340 union ib_gid mgid;
341 union ib_gid port_gid;
342 __be32 qkey;
343 __be16 mlid;
344 u8 mtu_selector;
345 u8 mtu;
346 u8 traffic_class;
347 __be16 pkey;
348 u8 rate_selector;
349 u8 rate;
350 u8 packet_life_time_selector;
351 u8 packet_life_time;
352 u8 sl;
353 __be32 flow_label;
354 u8 hop_limit;
355 u8 scope;
356 u8 join_state;
357 u8 proxy_join;
358};
359
360
361#define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
362#define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
363#define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
364
365#define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
366#define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
367#define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
368#define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
369#define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
370#define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
371#define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
372#define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
373#define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
374#define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
375#define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
376#define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
377#define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
378#define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
379#define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
380#define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
381#define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
382#define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
383#define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
384#define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
385#define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
386#define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
387#define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
388#define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
389#define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
390#define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
391#define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
392#define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
393#define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
394#define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
395#define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
396#define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
397#define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
398
399#define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
400
401struct ib_sa_service_rec {
402 u64 id;
403 union ib_gid gid;
404 __be16 pkey;
405
406 u32 lease;
407 u8 key[16];
408 u8 name[64];
409 u8 data8[16];
410 u16 data16[8];
411 u32 data32[4];
412 u64 data64[2];
413};
414
415#define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
416#define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
417#define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
418#define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
419#define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
420#define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
421#define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
422#define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
423#define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
424#define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
425#define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
426#define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
427
428struct ib_sa_guidinfo_rec {
429 __be16 lid;
430 u8 block_num;
431
432 u8 res1;
433 __be32 res2;
434 u8 guid_info_list[64];
435};
436
437struct ib_sa_client {
438 atomic_t users;
439 struct completion comp;
440};
441
442
443
444
445void ib_sa_register_client(struct ib_sa_client *client);
446
447
448
449
450
451void ib_sa_unregister_client(struct ib_sa_client *client);
452
453struct ib_sa_query;
454
455void ib_sa_cancel_query(int id, struct ib_sa_query *query);
456
457int ib_sa_path_rec_get(struct ib_sa_client *client,
458 struct ib_device *device, u8 port_num,
459 struct sa_path_rec *rec,
460 ib_sa_comp_mask comp_mask,
461 int timeout_ms, gfp_t gfp_mask,
462 void (*callback)(int status,
463 struct sa_path_rec *resp,
464 void *context),
465 void *context,
466 struct ib_sa_query **query);
467
468int ib_sa_service_rec_query(struct ib_sa_client *client,
469 struct ib_device *device, u8 port_num,
470 u8 method,
471 struct ib_sa_service_rec *rec,
472 ib_sa_comp_mask comp_mask,
473 int timeout_ms, gfp_t gfp_mask,
474 void (*callback)(int status,
475 struct ib_sa_service_rec *resp,
476 void *context),
477 void *context,
478 struct ib_sa_query **sa_query);
479
480struct ib_sa_multicast {
481 struct ib_sa_mcmember_rec rec;
482 ib_sa_comp_mask comp_mask;
483 int (*callback)(int status,
484 struct ib_sa_multicast *multicast);
485 void *context;
486};
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
517 struct ib_device *device, u8 port_num,
518 struct ib_sa_mcmember_rec *rec,
519 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
520 int (*callback)(int status,
521 struct ib_sa_multicast
522 *multicast),
523 void *context);
524
525
526
527
528
529
530
531
532
533
534
535void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
536
537
538
539
540
541
542
543
544
545
546int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
547 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
548
549
550
551
552
553int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
554 struct ib_sa_mcmember_rec *rec,
555 struct net_device *ndev,
556 enum ib_gid_type gid_type,
557 struct rdma_ah_attr *ah_attr);
558
559
560
561
562
563int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
564 struct sa_path_rec *rec,
565 struct rdma_ah_attr *ah_attr);
566
567
568
569
570
571void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute);
572
573
574
575
576
577void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
578
579
580int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
581 struct ib_device *device, u8 port_num,
582 struct ib_sa_guidinfo_rec *rec,
583 ib_sa_comp_mask comp_mask, u8 method,
584 int timeout_ms, gfp_t gfp_mask,
585 void (*callback)(int status,
586 struct ib_sa_guidinfo_rec *resp,
587 void *context),
588 void *context,
589 struct ib_sa_query **sa_query);
590
591bool ib_sa_sendonly_fullmem_support(struct ib_sa_client *client,
592 struct ib_device *device,
593 u8 port_num);
594
595static inline bool sa_path_is_roce(struct sa_path_rec *rec)
596{
597 return ((rec->rec_type == SA_PATH_REC_TYPE_ROCE_V1) ||
598 (rec->rec_type == SA_PATH_REC_TYPE_ROCE_V2));
599}
600
601static inline bool sa_path_is_opa(struct sa_path_rec *rec)
602{
603 return (rec->rec_type == SA_PATH_REC_TYPE_OPA);
604}
605
606static inline void sa_path_set_slid(struct sa_path_rec *rec, u32 slid)
607{
608 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
609 rec->ib.slid = cpu_to_be16(slid);
610 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
611 rec->opa.slid = cpu_to_be32(slid);
612}
613
614static inline void sa_path_set_dlid(struct sa_path_rec *rec, u32 dlid)
615{
616 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
617 rec->ib.dlid = cpu_to_be16(dlid);
618 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
619 rec->opa.dlid = cpu_to_be32(dlid);
620}
621
622static inline void sa_path_set_raw_traffic(struct sa_path_rec *rec,
623 u8 raw_traffic)
624{
625 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
626 rec->ib.raw_traffic = raw_traffic;
627 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
628 rec->opa.raw_traffic = raw_traffic;
629}
630
631static inline __be32 sa_path_get_slid(struct sa_path_rec *rec)
632{
633 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
634 return htonl(ntohs(rec->ib.slid));
635 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
636 return rec->opa.slid;
637 return 0;
638}
639
640static inline __be32 sa_path_get_dlid(struct sa_path_rec *rec)
641{
642 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
643 return htonl(ntohs(rec->ib.dlid));
644 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
645 return rec->opa.dlid;
646 return 0;
647}
648
649static inline u8 sa_path_get_raw_traffic(struct sa_path_rec *rec)
650{
651 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
652 return rec->ib.raw_traffic;
653 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
654 return rec->opa.raw_traffic;
655 return 0;
656}
657
658static inline void sa_path_set_dmac(struct sa_path_rec *rec, u8 *dmac)
659{
660 if (sa_path_is_roce(rec))
661 memcpy(rec->roce.dmac, dmac, ETH_ALEN);
662}
663
664static inline void sa_path_set_dmac_zero(struct sa_path_rec *rec)
665{
666 if (sa_path_is_roce(rec))
667 eth_zero_addr(rec->roce.dmac);
668}
669
670static inline void sa_path_set_ifindex(struct sa_path_rec *rec, int ifindex)
671{
672 if (sa_path_is_roce(rec))
673 rec->roce.ifindex = ifindex;
674}
675
676static inline void sa_path_set_ndev(struct sa_path_rec *rec, struct net *net)
677{
678 if (sa_path_is_roce(rec))
679 rec->roce.net = net;
680}
681
682static inline u8 *sa_path_get_dmac(struct sa_path_rec *rec)
683{
684 if (sa_path_is_roce(rec))
685 return rec->roce.dmac;
686 return NULL;
687}
688
689static inline int sa_path_get_ifindex(struct sa_path_rec *rec)
690{
691 if (sa_path_is_roce(rec))
692 return rec->roce.ifindex;
693 return 0;
694}
695
696static inline struct net *sa_path_get_ndev(struct sa_path_rec *rec)
697{
698 if (sa_path_is_roce(rec))
699 return rec->roce.net;
700 return NULL;
701}
702
703static inline struct net_device *ib_get_ndev_from_path(struct sa_path_rec *rec)
704{
705 return sa_path_get_ndev(rec) ?
706 dev_get_by_index(sa_path_get_ndev(rec),
707 sa_path_get_ifindex(rec))
708 : NULL;
709}
710
711#endif
712