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
369#define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
370#define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
371#define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
372#define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
373#define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
374#define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
375#define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
376#define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
377#define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
378#define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
379#define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
380#define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
381
382struct ib_sa_guidinfo_rec {
383 __be16 lid;
384 u8 block_num;
385
386 u8 res1;
387 __be32 res2;
388 u8 guid_info_list[64];
389};
390
391struct ib_sa_client {
392 atomic_t users;
393 struct completion comp;
394};
395
396
397
398
399void ib_sa_register_client(struct ib_sa_client *client);
400
401
402
403
404
405void ib_sa_unregister_client(struct ib_sa_client *client);
406
407struct ib_sa_query;
408
409void ib_sa_cancel_query(int id, struct ib_sa_query *query);
410
411int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device,
412 u32 port_num, struct sa_path_rec *rec,
413 ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
414 gfp_t gfp_mask,
415 void (*callback)(int status, struct sa_path_rec *resp,
416 void *context),
417 void *context, struct ib_sa_query **query);
418
419struct ib_sa_multicast {
420 struct ib_sa_mcmember_rec rec;
421 ib_sa_comp_mask comp_mask;
422 int (*callback)(int status,
423 struct ib_sa_multicast *multicast);
424 void *context;
425};
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
456 struct ib_device *device,
457 u32 port_num,
458 struct ib_sa_mcmember_rec *rec,
459 ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
460 int (*callback)(int status,
461 struct ib_sa_multicast
462 *multicast),
463 void *context);
464
465
466
467
468
469
470
471
472
473
474
475void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
476
477
478
479
480
481
482
483
484
485
486int ib_sa_get_mcmember_rec(struct ib_device *device, u32 port_num,
487 union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
488
489
490
491
492
493int ib_init_ah_from_mcmember(struct ib_device *device, u32 port_num,
494 struct ib_sa_mcmember_rec *rec,
495 struct net_device *ndev,
496 enum ib_gid_type gid_type,
497 struct rdma_ah_attr *ah_attr);
498
499int ib_init_ah_attr_from_path(struct ib_device *device, u32 port_num,
500 struct sa_path_rec *rec,
501 struct rdma_ah_attr *ah_attr,
502 const struct ib_gid_attr *sgid_attr);
503
504
505
506
507
508void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute);
509
510
511
512
513
514void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
515
516
517int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
518 struct ib_device *device, u32 port_num,
519 struct ib_sa_guidinfo_rec *rec,
520 ib_sa_comp_mask comp_mask, u8 method,
521 unsigned long timeout_ms, gfp_t gfp_mask,
522 void (*callback)(int status,
523 struct ib_sa_guidinfo_rec *resp,
524 void *context),
525 void *context, struct ib_sa_query **sa_query);
526
527static inline bool sa_path_is_roce(struct sa_path_rec *rec)
528{
529 return ((rec->rec_type == SA_PATH_REC_TYPE_ROCE_V1) ||
530 (rec->rec_type == SA_PATH_REC_TYPE_ROCE_V2));
531}
532
533static inline bool sa_path_is_opa(struct sa_path_rec *rec)
534{
535 return (rec->rec_type == SA_PATH_REC_TYPE_OPA);
536}
537
538static inline void sa_path_set_slid(struct sa_path_rec *rec, u32 slid)
539{
540 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
541 rec->ib.slid = cpu_to_be16(slid);
542 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
543 rec->opa.slid = cpu_to_be32(slid);
544}
545
546static inline void sa_path_set_dlid(struct sa_path_rec *rec, u32 dlid)
547{
548 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
549 rec->ib.dlid = cpu_to_be16(dlid);
550 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
551 rec->opa.dlid = cpu_to_be32(dlid);
552}
553
554static inline void sa_path_set_raw_traffic(struct sa_path_rec *rec,
555 u8 raw_traffic)
556{
557 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
558 rec->ib.raw_traffic = raw_traffic;
559 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
560 rec->opa.raw_traffic = raw_traffic;
561}
562
563static inline __be32 sa_path_get_slid(struct sa_path_rec *rec)
564{
565 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
566 return htonl(ntohs(rec->ib.slid));
567 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
568 return rec->opa.slid;
569 return 0;
570}
571
572static inline __be32 sa_path_get_dlid(struct sa_path_rec *rec)
573{
574 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
575 return htonl(ntohs(rec->ib.dlid));
576 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
577 return rec->opa.dlid;
578 return 0;
579}
580
581static inline u8 sa_path_get_raw_traffic(struct sa_path_rec *rec)
582{
583 if (rec->rec_type == SA_PATH_REC_TYPE_IB)
584 return rec->ib.raw_traffic;
585 else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
586 return rec->opa.raw_traffic;
587 return 0;
588}
589
590static inline void sa_path_set_dmac(struct sa_path_rec *rec, u8 *dmac)
591{
592 if (sa_path_is_roce(rec))
593 memcpy(rec->roce.dmac, dmac, ETH_ALEN);
594}
595
596static inline void sa_path_set_dmac_zero(struct sa_path_rec *rec)
597{
598 if (sa_path_is_roce(rec))
599 eth_zero_addr(rec->roce.dmac);
600}
601
602static inline u8 *sa_path_get_dmac(struct sa_path_rec *rec)
603{
604 if (sa_path_is_roce(rec))
605 return rec->roce.dmac;
606 return NULL;
607}
608#endif
609