| 1 |
|
| 2 | |
| 3 | * Copyright (c) 2004 Topspin Communications. All rights reserved.
|
| 4 | * Copyright (c) 2005 Voltaire, Inc. All rights reserved.
|
| 5 | * Copyright (c) 2006 Intel Corporation. All rights reserved.
|
| 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 |
|
| 22 | enum {
|
| 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
|
| 35 | enum {
|
| 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 |
|
| 60 | enum ib_sa_selector {
|
| 61 | IB_SA_GT = 0,
|
| 62 | IB_SA_LT = 1,
|
| 63 | IB_SA_EQ = 2,
|
| 64 | |
| 65 | * The meaning of "best" depends on the attribute: for
|
| 66 | * example, for MTU best will return the largest available
|
| 67 | * MTU, while for packet life time, best will return the
|
| 68 | * smallest available life time.
|
| 69 |
|
| 70 | IB_SA_BEST = 3
|
| 71 | };
|
| 72 |
|
| 73 | |
| 74 | * There are 4 types of join states:
|
| 75 | * FullMember, NonMember, SendOnlyNonMember, SendOnlyFullMember.
|
| 76 | * The order corresponds to JoinState bits in MCMemberRecord.
|
| 77 |
|
| 78 | enum 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 | * Structures for SA records are named "struct ib_sa_xxx_rec." No
|
| 90 | * attempt is made to pack structures to match the physical layout of
|
| 91 | * SA records in SA MADs; all packing and unpacking is handled by the
|
| 92 | * SA query code.
|
| 93 | *
|
| 94 | * For a record with structure ib_sa_xxx_rec, the naming convention
|
| 95 | * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we
|
| 96 | * never use different abbreviations or otherwise change the spelling
|
| 97 | * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY).
|
| 98 | *
|
| 99 | * Reserved rows are indicated with comments to help maintainability.
|
| 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 |
|
| 126 | enum 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 |
|
| 133 | struct sa_path_rec_ib {
|
| 134 | __be16 dlid;
|
| 135 | __be16 slid;
|
| 136 | u8 raw_traffic;
|
| 137 | };
|
| 138 |
|
| 139 | |
| 140 | * struct sa_path_rec_roce - RoCE specific portion of the path record entry
|
| 141 | * @route_resolved: When set, it indicates that this route is already
|
| 142 | * resolved for this path record entry.
|
| 143 | * @dmac: Destination mac address for the given DGID entry
|
| 144 | * of the path record entry.
|
| 145 |
|
| 146 | struct sa_path_rec_roce {
|
| 147 | bool route_resolved;
|
| 148 | u8 dmac[ETH_ALEN];
|
| 149 | };
|
| 150 |
|
| 151 | struct 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 |
|
| 163 | struct 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 | u32 flags;
|
| 190 | };
|
| 191 |
|
| 192 | struct sa_service_rec {
|
| 193 | __be64 id;
|
| 194 | __u8 gid[16];
|
| 195 | __be16 pkey;
|
| 196 | __u8 reserved[2];
|
| 197 | __be32 lease;
|
| 198 | __u8 key[16];
|
| 199 | __u8 name[64];
|
| 200 | __u8 data_8[16];
|
| 201 | __be16 data_16[8];
|
| 202 | __be32 data_32[4];
|
| 203 | __be64 data_64[2];
|
| 204 | };
|
| 205 |
|
| 206 | static inline enum ib_gid_type
|
| 207 | sa_conv_pathrec_to_gid_type(struct sa_path_rec *rec)
|
| 208 | {
|
| 209 | switch (rec->rec_type) {
|
| 210 | case SA_PATH_REC_TYPE_ROCE_V1:
|
| 211 | return IB_GID_TYPE_ROCE;
|
| 212 | case SA_PATH_REC_TYPE_ROCE_V2:
|
| 213 | return IB_GID_TYPE_ROCE_UDP_ENCAP;
|
| 214 | default:
|
| 215 | return IB_GID_TYPE_IB;
|
| 216 | }
|
| 217 | }
|
| 218 |
|
| 219 | static inline enum sa_path_rec_type
|
| 220 | sa_conv_gid_to_pathrec_type(enum ib_gid_type type)
|
| 221 | {
|
| 222 | switch (type) {
|
| 223 | case IB_GID_TYPE_ROCE:
|
| 224 | return SA_PATH_REC_TYPE_ROCE_V1;
|
| 225 | case IB_GID_TYPE_ROCE_UDP_ENCAP:
|
| 226 | return SA_PATH_REC_TYPE_ROCE_V2;
|
| 227 | default:
|
| 228 | return SA_PATH_REC_TYPE_IB;
|
| 229 | }
|
| 230 | }
|
| 231 |
|
| 232 | static inline void path_conv_opa_to_ib(struct sa_path_rec *ib,
|
| 233 | struct sa_path_rec *opa)
|
| 234 | {
|
| 235 | if ((be32_to_cpu(opa->opa.dlid) >=
|
| 236 | be16_to_cpu(IB_MULTICAST_LID_BASE)) ||
|
| 237 | (be32_to_cpu(opa->opa.slid) >=
|
| 238 | be16_to_cpu(IB_MULTICAST_LID_BASE))) {
|
| 239 |
|
| 240 | ib->dgid.global.interface_id
|
| 241 | = OPA_MAKE_ID(be32_to_cpu(opa->opa.dlid));
|
| 242 | ib->dgid.global.subnet_prefix
|
| 243 | = opa->dgid.global.subnet_prefix;
|
| 244 | ib->sgid.global.interface_id
|
| 245 | = OPA_MAKE_ID(be32_to_cpu(opa->opa.slid));
|
| 246 | ib->dgid.global.subnet_prefix
|
| 247 | = opa->dgid.global.subnet_prefix;
|
| 248 | ib->ib.dlid = 0;
|
| 249 |
|
| 250 | ib->ib.slid = 0;
|
| 251 | } else {
|
| 252 | ib->ib.dlid = htons(ntohl(opa->opa.dlid));
|
| 253 | ib->ib.slid = htons(ntohl(opa->opa.slid));
|
| 254 | }
|
| 255 | ib->service_id = opa->service_id;
|
| 256 | ib->ib.raw_traffic = opa->opa.raw_traffic;
|
| 257 | }
|
| 258 |
|
| 259 | static inline void path_conv_ib_to_opa(struct sa_path_rec *opa,
|
| 260 | struct sa_path_rec *ib)
|
| 261 | {
|
| 262 | __be32 slid, dlid;
|
| 263 |
|
| 264 | if ((ib_is_opa_gid(&ib->sgid)) ||
|
| 265 | (ib_is_opa_gid(&ib->dgid))) {
|
| 266 | slid = htonl(opa_get_lid_from_gid(&ib->sgid));
|
| 267 | dlid = htonl(opa_get_lid_from_gid(&ib->dgid));
|
| 268 | } else {
|
| 269 | slid = htonl(ntohs(ib->ib.slid));
|
| 270 | dlid = htonl(ntohs(ib->ib.dlid));
|
| 271 | }
|
| 272 | opa->opa.slid = slid;
|
| 273 | opa->opa.dlid = dlid;
|
| 274 | opa->service_id = ib->service_id;
|
| 275 | opa->opa.raw_traffic = ib->ib.raw_traffic;
|
| 276 | }
|
| 277 |
|
| 278 |
|
| 279 | static inline void sa_convert_path_opa_to_ib(struct sa_path_rec *dest,
|
| 280 | struct sa_path_rec *src)
|
| 281 | {
|
| 282 | if (src->rec_type != SA_PATH_REC_TYPE_OPA)
|
| 283 | return;
|
| 284 |
|
| 285 | *dest = *src;
|
| 286 | dest->rec_type = SA_PATH_REC_TYPE_IB;
|
| 287 | path_conv_opa_to_ib(dest, src);
|
| 288 | }
|
| 289 |
|
| 290 |
|
| 291 | static inline void sa_convert_path_ib_to_opa(struct sa_path_rec *dest,
|
| 292 | struct sa_path_rec *src)
|
| 293 | {
|
| 294 | if (src->rec_type != SA_PATH_REC_TYPE_IB)
|
| 295 | return;
|
| 296 |
|
| 297 |
|
| 298 | *dest = *src;
|
| 299 | dest->rec_type = SA_PATH_REC_TYPE_OPA;
|
| 300 | path_conv_ib_to_opa(dest, src);
|
| 301 | }
|
| 302 |
|
| 303 | #define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
|
| 304 | #define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
|
| 305 | #define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
|
| 306 | #define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
|
| 307 | #define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
|
| 308 | #define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
|
| 309 | #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
|
| 310 | #define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
|
| 311 | #define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
|
| 312 | #define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
|
| 313 | #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
|
| 314 | #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
|
| 315 | #define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
|
| 316 | #define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
|
| 317 | #define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
|
| 318 | #define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
|
| 319 | #define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
|
| 320 | #define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
|
| 321 |
|
| 322 | struct ib_sa_mcmember_rec {
|
| 323 | union ib_gid mgid;
|
| 324 | union ib_gid port_gid;
|
| 325 | __be32 qkey;
|
| 326 | __be16 mlid;
|
| 327 | u8 mtu_selector;
|
| 328 | u8 mtu;
|
| 329 | u8 traffic_class;
|
| 330 | __be16 pkey;
|
| 331 | u8 rate_selector;
|
| 332 | u8 rate;
|
| 333 | u8 packet_life_time_selector;
|
| 334 | u8 packet_life_time;
|
| 335 | u8 sl;
|
| 336 | __be32 flow_label;
|
| 337 | u8 hop_limit;
|
| 338 | u8 scope;
|
| 339 | u8 join_state;
|
| 340 | u8 proxy_join;
|
| 341 | };
|
| 342 |
|
| 343 |
|
| 344 | #define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
|
| 345 | #define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
|
| 346 | #define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
|
| 347 |
|
| 348 | #define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
|
| 349 | #define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
|
| 350 | #define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
|
| 351 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
|
| 352 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
|
| 353 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
|
| 354 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
|
| 355 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
|
| 356 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
|
| 357 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
|
| 358 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
|
| 359 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
|
| 360 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
|
| 361 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
|
| 362 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
|
| 363 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
|
| 364 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
|
| 365 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
|
| 366 | #define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
|
| 367 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
|
| 368 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
|
| 369 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
|
| 370 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
|
| 371 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
|
| 372 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
|
| 373 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
|
| 374 | #define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
|
| 375 | #define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
|
| 376 | #define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
|
| 377 | #define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
|
| 378 | #define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
|
| 379 | #define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
|
| 380 | #define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
|
| 381 |
|
| 382 | #define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
|
| 383 |
|
| 384 | #define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
|
| 385 | #define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
|
| 386 | #define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
|
| 387 | #define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
|
| 388 | #define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
|
| 389 | #define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
|
| 390 | #define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
|
| 391 | #define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
|
| 392 | #define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
|
| 393 | #define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
|
| 394 | #define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
|
| 395 | #define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
|
| 396 |
|
| 397 | struct ib_sa_guidinfo_rec {
|
| 398 | __be16 lid;
|
| 399 | u8 block_num;
|
| 400 |
|
| 401 | u8 res1;
|
| 402 | __be32 res2;
|
| 403 | u8 guid_info_list[64];
|
| 404 | };
|
| 405 |
|
| 406 | struct ib_sa_client {
|
| 407 | atomic_t users;
|
| 408 | struct completion comp;
|
| 409 | };
|
| 410 |
|
| 411 | |
| 412 | * ib_sa_register_client - Register an SA client.
|
| 413 |
|
| 414 | void ib_sa_register_client(struct ib_sa_client *client);
|
| 415 |
|
| 416 | |
| 417 | * ib_sa_unregister_client - Deregister an SA client.
|
| 418 | * @client: Client object to deregister.
|
| 419 |
|
| 420 | void ib_sa_unregister_client(struct ib_sa_client *client);
|
| 421 |
|
| 422 | struct ib_sa_query;
|
| 423 |
|
| 424 | void ib_sa_cancel_query(int id, struct ib_sa_query *query);
|
| 425 |
|
| 426 | int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device,
|
| 427 | u32 port_num, struct sa_path_rec *rec,
|
| 428 | ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
|
| 429 | gfp_t gfp_mask,
|
| 430 | void (*callback)(int status, struct sa_path_rec *resp,
|
| 431 | unsigned int num_prs, void *context),
|
| 432 | void *context, struct ib_sa_query **query);
|
| 433 |
|
| 434 | int ib_sa_service_rec_get(struct ib_sa_client *client,
|
| 435 | struct ib_device *device, u32 port_num,
|
| 436 | struct sa_service_rec *rec,
|
| 437 | ib_sa_comp_mask comp_mask,
|
| 438 | unsigned long timeout_ms, gfp_t gfp_mask,
|
| 439 | void (*callback)(int status,
|
| 440 | struct sa_service_rec *resp,
|
| 441 | unsigned int num_services,
|
| 442 | void *context),
|
| 443 | void *context, struct ib_sa_query **sa_query);
|
| 444 |
|
| 445 | struct ib_sa_multicast {
|
| 446 | struct ib_sa_mcmember_rec rec;
|
| 447 | ib_sa_comp_mask comp_mask;
|
| 448 | int (*callback)(int status,
|
| 449 | struct ib_sa_multicast *multicast);
|
| 450 | void *context;
|
| 451 | };
|
| 452 |
|
| 453 | |
| 454 | * ib_sa_join_multicast - Initiates a join request to the specified multicast
|
| 455 | * group.
|
| 456 | * @client: SA client
|
| 457 | * @device: Device associated with the multicast group.
|
| 458 | * @port_num: Port on the specified device to associate with the multicast
|
| 459 | * group.
|
| 460 | * @rec: SA multicast member record specifying group attributes.
|
| 461 | * @comp_mask: Component mask indicating which group attributes of %rec are
|
| 462 | * valid.
|
| 463 | * @gfp_mask: GFP mask for memory allocations.
|
| 464 | * @callback: User callback invoked once the join operation completes.
|
| 465 | * @context: User specified context stored with the ib_sa_multicast structure.
|
| 466 | *
|
| 467 | * This call initiates a multicast join request with the SA for the specified
|
| 468 | * multicast group. If the join operation is started successfully, it returns
|
| 469 | * an ib_sa_multicast structure that is used to track the multicast operation.
|
| 470 | * Users must free this structure by calling ib_free_multicast, even if the
|
| 471 | * join operation later fails. (The callback status is non-zero.)
|
| 472 | *
|
| 473 | * If the join operation fails; status will be non-zero, with the following
|
| 474 | * failures possible:
|
| 475 | * -ETIMEDOUT: The request timed out.
|
| 476 | * -EIO: An error occurred sending the query.
|
| 477 | * -EINVAL: The MCMemberRecord values differed from the existing group's.
|
| 478 | * -ENETRESET: Indicates that an fatal error has occurred on the multicast
|
| 479 | * group, and the user must rejoin the group to continue using it.
|
| 480 |
|
| 481 | struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
|
| 482 | struct ib_device *device,
|
| 483 | u32 port_num,
|
| 484 | struct ib_sa_mcmember_rec *rec,
|
| 485 | ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
|
| 486 | int (*callback)(int status,
|
| 487 | struct ib_sa_multicast
|
| 488 | *multicast),
|
| 489 | void *context);
|
| 490 |
|
| 491 | |
| 492 | * ib_free_multicast - Frees the multicast tracking structure, and releases
|
| 493 | * any reference on the multicast group.
|
| 494 | * @multicast: Multicast tracking structure allocated by ib_join_multicast.
|
| 495 | *
|
| 496 | * This call blocks until the multicast identifier is destroyed. It may
|
| 497 | * not be called from within the multicast callback; however, returning a non-
|
| 498 | * zero value from the callback will result in destroying the multicast
|
| 499 | * tracking structure.
|
| 500 |
|
| 501 | void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
|
| 502 |
|
| 503 | |
| 504 | * ib_get_mcmember_rec - Looks up a multicast member record by its MGID and
|
| 505 | * returns it if found.
|
| 506 | * @device: Device associated with the multicast group.
|
| 507 | * @port_num: Port on the specified device to associate with the multicast
|
| 508 | * group.
|
| 509 | * @mgid: MGID of multicast group.
|
| 510 | * @rec: Location to copy SA multicast member record.
|
| 511 |
|
| 512 | int ib_sa_get_mcmember_rec(struct ib_device *device, u32 port_num,
|
| 513 | union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
|
| 514 |
|
| 515 | |
| 516 | * ib_init_ah_from_mcmember - Initialize address handle attributes based on
|
| 517 | * an SA multicast member record.
|
| 518 |
|
| 519 | int ib_init_ah_from_mcmember(struct ib_device *device, u32 port_num,
|
| 520 | struct ib_sa_mcmember_rec *rec,
|
| 521 | struct net_device *ndev,
|
| 522 | enum ib_gid_type gid_type,
|
| 523 | struct rdma_ah_attr *ah_attr);
|
| 524 |
|
| 525 | int ib_init_ah_attr_from_path(struct ib_device *device, u32 port_num,
|
| 526 | struct sa_path_rec *rec,
|
| 527 | struct rdma_ah_attr *ah_attr,
|
| 528 | const struct ib_gid_attr *sgid_attr);
|
| 529 |
|
| 530 | |
| 531 | * ib_sa_pack_path - Conert a path record from struct ib_sa_path_rec
|
| 532 | * to IB MAD wire format.
|
| 533 |
|
| 534 | void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute);
|
| 535 |
|
| 536 | |
| 537 | * ib_sa_pack_service - Convert a service record from struct ib_sa_service_rec
|
| 538 | * to IB MAD wire format.
|
| 539 |
|
| 540 | void ib_sa_pack_service(struct sa_service_rec *rec, void *attribute);
|
| 541 |
|
| 542 | |
| 543 | * ib_sa_unpack_service - Convert a service record from MAD format to struct
|
| 544 | * ib_sa_service_rec.
|
| 545 |
|
| 546 | void ib_sa_unpack_service(void *attribute, struct sa_service_rec *rec);
|
| 547 |
|
| 548 | |
| 549 | * ib_sa_unpack_path - Convert a path record from MAD format to struct
|
| 550 | * ib_sa_path_rec.
|
| 551 |
|
| 552 | void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
|
| 553 |
|
| 554 |
|
| 555 | int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
|
| 556 | struct ib_device *device, u32 port_num,
|
| 557 | struct ib_sa_guidinfo_rec *rec,
|
| 558 | ib_sa_comp_mask comp_mask, u8 method,
|
| 559 | unsigned long timeout_ms, gfp_t gfp_mask,
|
| 560 | void (*callback)(int status,
|
| 561 | struct ib_sa_guidinfo_rec *resp,
|
| 562 | void *context),
|
| 563 | void *context, struct ib_sa_query **sa_query);
|
| 564 |
|
| 565 | static inline bool sa_path_is_roce(struct sa_path_rec *rec)
|
| 566 | {
|
| 567 | return ((rec->rec_type == SA_PATH_REC_TYPE_ROCE_V1) ||
|
| 568 | (rec->rec_type == SA_PATH_REC_TYPE_ROCE_V2));
|
| 569 | }
|
| 570 |
|
| 571 | static inline bool sa_path_is_opa(struct sa_path_rec *rec)
|
| 572 | {
|
| 573 | return (rec->rec_type == SA_PATH_REC_TYPE_OPA);
|
| 574 | }
|
| 575 |
|
| 576 | static inline void sa_path_set_slid(struct sa_path_rec *rec, u32 slid)
|
| 577 | {
|
| 578 | if (rec->rec_type == SA_PATH_REC_TYPE_IB)
|
| 579 | rec->ib.slid = cpu_to_be16(slid);
|
| 580 | else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
|
| 581 | rec->opa.slid = cpu_to_be32(slid);
|
| 582 | }
|
| 583 |
|
| 584 | static inline void sa_path_set_dlid(struct sa_path_rec *rec, u32 dlid)
|
| 585 | {
|
| 586 | if (rec->rec_type == SA_PATH_REC_TYPE_IB)
|
| 587 | rec->ib.dlid = cpu_to_be16(dlid);
|
| 588 | else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
|
| 589 | rec->opa.dlid = cpu_to_be32(dlid);
|
| 590 | }
|
| 591 |
|
| 592 | static inline void sa_path_set_raw_traffic(struct sa_path_rec *rec,
|
| 593 | u8 raw_traffic)
|
| 594 | {
|
| 595 | if (rec->rec_type == SA_PATH_REC_TYPE_IB)
|
| 596 | rec->ib.raw_traffic = raw_traffic;
|
| 597 | else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
|
| 598 | rec->opa.raw_traffic = raw_traffic;
|
| 599 | }
|
| 600 |
|
| 601 | static inline __be32 sa_path_get_slid(struct sa_path_rec *rec)
|
| 602 | {
|
| 603 | if (rec->rec_type == SA_PATH_REC_TYPE_IB)
|
| 604 | return htonl(ntohs(rec->ib.slid));
|
| 605 | else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
|
| 606 | return rec->opa.slid;
|
| 607 | return 0;
|
| 608 | }
|
| 609 |
|
| 610 | static inline __be32 sa_path_get_dlid(struct sa_path_rec *rec)
|
| 611 | {
|
| 612 | if (rec->rec_type == SA_PATH_REC_TYPE_IB)
|
| 613 | return htonl(ntohs(rec->ib.dlid));
|
| 614 | else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
|
| 615 | return rec->opa.dlid;
|
| 616 | return 0;
|
| 617 | }
|
| 618 |
|
| 619 | static inline u8 sa_path_get_raw_traffic(struct sa_path_rec *rec)
|
| 620 | {
|
| 621 | if (rec->rec_type == SA_PATH_REC_TYPE_IB)
|
| 622 | return rec->ib.raw_traffic;
|
| 623 | else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
|
| 624 | return rec->opa.raw_traffic;
|
| 625 | return 0;
|
| 626 | }
|
| 627 |
|
| 628 | static inline void sa_path_set_dmac(struct sa_path_rec *rec, u8 *dmac)
|
| 629 | {
|
| 630 | if (sa_path_is_roce(rec))
|
| 631 | memcpy(rec->roce.dmac, dmac, ETH_ALEN);
|
| 632 | }
|
| 633 |
|
| 634 | static inline void sa_path_set_dmac_zero(struct sa_path_rec *rec)
|
| 635 | {
|
| 636 | if (sa_path_is_roce(rec))
|
| 637 | eth_zero_addr(rec->roce.dmac);
|
| 638 | }
|
| 639 |
|
| 640 | static inline u8 *sa_path_get_dmac(struct sa_path_rec *rec)
|
| 641 | {
|
| 642 | if (sa_path_is_roce(rec))
|
| 643 | return rec->roce.dmac;
|
| 644 | return NULL;
|
| 645 | }
|
| 646 | #endif
|