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