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