^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2004 Topspin Communications. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2005 Voltaire, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2006 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef IB_SA_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define IB_SA_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/completion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/atomic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <rdma/ib_verbs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <rdma/ib_mad.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <rdma/ib_addr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <rdma/opa_addr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) IB_SA_CLASS_VERSION = 2, /* IB spec version 1.1/1.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) IB_SA_METHOD_GET_TABLE = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) IB_SA_METHOD_GET_TABLE_RESP = 0x92,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) IB_SA_METHOD_DELETE = 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) IB_SA_METHOD_DELETE_RESP = 0x95,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) IB_SA_METHOD_GET_MULTI = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) IB_SA_METHOD_GET_MULTI_RESP = 0x94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) IB_SA_METHOD_GET_TRACE_TBL = 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define OPA_SA_CLASS_VERSION 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) IB_SA_ATTR_CLASS_PORTINFO = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) IB_SA_ATTR_NOTICE = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) IB_SA_ATTR_INFORM_INFO = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) IB_SA_ATTR_NODE_REC = 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) IB_SA_ATTR_PORT_INFO_REC = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) IB_SA_ATTR_SL2VL_REC = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) IB_SA_ATTR_SWITCH_REC = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) IB_SA_ATTR_LINEAR_FDB_REC = 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) IB_SA_ATTR_RANDOM_FDB_REC = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) IB_SA_ATTR_MCAST_FDB_REC = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) IB_SA_ATTR_SM_INFO_REC = 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) IB_SA_ATTR_LINK_REC = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) IB_SA_ATTR_GUID_INFO_REC = 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) IB_SA_ATTR_SERVICE_REC = 0x31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) IB_SA_ATTR_PARTITION_REC = 0x33,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) IB_SA_ATTR_PATH_REC = 0x35,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) IB_SA_ATTR_VL_ARB_REC = 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) IB_SA_ATTR_MC_MEMBER_REC = 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) IB_SA_ATTR_TRACE_REC = 0x39,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) IB_SA_ATTR_MULTI_PATH_REC = 0x3a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) IB_SA_ATTR_SERVICE_ASSOC_REC = 0x3b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) IB_SA_ATTR_INFORM_INFO_REC = 0xf3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) enum ib_sa_selector {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) IB_SA_GT = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) IB_SA_LT = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) IB_SA_EQ = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * The meaning of "best" depends on the attribute: for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * example, for MTU best will return the largest available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * MTU, while for packet life time, best will return the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * smallest available life time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) IB_SA_BEST = 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * There are 4 types of join states:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * FullMember, NonMember, SendOnlyNonMember, SendOnlyFullMember.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * The order corresponds to JoinState bits in MCMemberRecord.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) enum ib_sa_mc_join_states {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) FULLMEMBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) NONMEMBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) SENDONLY_NONMEBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) SENDONLY_FULLMEMBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) NUM_JOIN_MEMBERSHIP_TYPES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define IB_SA_CAP_MASK2_SENDONLY_FULL_MEM_SUPPORT BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * Structures for SA records are named "struct ib_sa_xxx_rec." No
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * attempt is made to pack structures to match the physical layout of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * SA records in SA MADs; all packing and unpacking is handled by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * SA query code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * For a record with structure ib_sa_xxx_rec, the naming convention
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * never use different abbreviations or otherwise change the spelling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * Reserved rows are indicated with comments to help maintainability.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define IB_SA_PATH_REC_SERVICE_ID (IB_SA_COMP_MASK( 0) |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) IB_SA_COMP_MASK( 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define IB_SA_PATH_REC_DGID IB_SA_COMP_MASK( 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define IB_SA_PATH_REC_SGID IB_SA_COMP_MASK( 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define IB_SA_PATH_REC_DLID IB_SA_COMP_MASK( 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define IB_SA_PATH_REC_SLID IB_SA_COMP_MASK( 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define IB_SA_PATH_REC_RAW_TRAFFIC IB_SA_COMP_MASK( 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* reserved: 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define IB_SA_PATH_REC_FLOW_LABEL IB_SA_COMP_MASK( 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define IB_SA_PATH_REC_HOP_LIMIT IB_SA_COMP_MASK( 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define IB_SA_PATH_REC_TRAFFIC_CLASS IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define IB_SA_PATH_REC_REVERSIBLE IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define IB_SA_PATH_REC_NUMB_PATH IB_SA_COMP_MASK(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define IB_SA_PATH_REC_PKEY IB_SA_COMP_MASK(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define IB_SA_PATH_REC_QOS_CLASS IB_SA_COMP_MASK(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define IB_SA_PATH_REC_SL IB_SA_COMP_MASK(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define IB_SA_PATH_REC_MTU_SELECTOR IB_SA_COMP_MASK(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define IB_SA_PATH_REC_MTU IB_SA_COMP_MASK(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define IB_SA_PATH_REC_RATE_SELECTOR IB_SA_COMP_MASK(18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define IB_SA_PATH_REC_RATE IB_SA_COMP_MASK(19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define IB_SA_PATH_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define IB_SA_PATH_REC_PREFERENCE IB_SA_COMP_MASK(22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) enum sa_path_rec_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) SA_PATH_REC_TYPE_IB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) SA_PATH_REC_TYPE_ROCE_V1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) SA_PATH_REC_TYPE_ROCE_V2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) SA_PATH_REC_TYPE_OPA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) struct sa_path_rec_ib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) __be16 dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) __be16 slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) u8 raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * struct sa_path_rec_roce - RoCE specific portion of the path record entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * @route_resolved: When set, it indicates that this route is already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) * resolved for this path record entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * @dmac: Destination mac address for the given DGID entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * of the path record entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct sa_path_rec_roce {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) bool route_resolved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) u8 dmac[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct sa_path_rec_opa {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) __be32 dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) __be32 slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) u8 raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) u8 l2_8B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) u8 l2_10B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) u8 l2_9B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) u8 l2_16B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) u8 qos_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) u8 qos_priority;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) struct sa_path_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) union ib_gid dgid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) union ib_gid sgid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) __be64 service_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) __be32 flow_label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) u8 hop_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u8 traffic_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) u8 reversible;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) u8 numb_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) __be16 pkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) __be16 qos_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) u8 sl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) u8 mtu_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u8 mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u8 rate_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) u8 rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u8 packet_life_time_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u8 packet_life_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) u8 preference;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct sa_path_rec_ib ib;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct sa_path_rec_roce roce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct sa_path_rec_opa opa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) enum sa_path_rec_type rec_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static inline enum ib_gid_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) sa_conv_pathrec_to_gid_type(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) switch (rec->rec_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) case SA_PATH_REC_TYPE_ROCE_V1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) return IB_GID_TYPE_ROCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) case SA_PATH_REC_TYPE_ROCE_V2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) return IB_GID_TYPE_ROCE_UDP_ENCAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return IB_GID_TYPE_IB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) static inline enum sa_path_rec_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) sa_conv_gid_to_pathrec_type(enum ib_gid_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) case IB_GID_TYPE_ROCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) return SA_PATH_REC_TYPE_ROCE_V1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) case IB_GID_TYPE_ROCE_UDP_ENCAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) return SA_PATH_REC_TYPE_ROCE_V2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) return SA_PATH_REC_TYPE_IB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) static inline void path_conv_opa_to_ib(struct sa_path_rec *ib,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct sa_path_rec *opa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if ((be32_to_cpu(opa->opa.dlid) >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) be16_to_cpu(IB_MULTICAST_LID_BASE)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) (be32_to_cpu(opa->opa.slid) >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) be16_to_cpu(IB_MULTICAST_LID_BASE))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* Create OPA GID and zero out the LID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ib->dgid.global.interface_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) = OPA_MAKE_ID(be32_to_cpu(opa->opa.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) ib->dgid.global.subnet_prefix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) = opa->dgid.global.subnet_prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) ib->sgid.global.interface_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) = OPA_MAKE_ID(be32_to_cpu(opa->opa.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) ib->dgid.global.subnet_prefix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) = opa->dgid.global.subnet_prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) ib->ib.dlid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ib->ib.slid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) ib->ib.dlid = htons(ntohl(opa->opa.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) ib->ib.slid = htons(ntohl(opa->opa.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) ib->service_id = opa->service_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) ib->ib.raw_traffic = opa->opa.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) static inline void path_conv_ib_to_opa(struct sa_path_rec *opa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct sa_path_rec *ib)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) __be32 slid, dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if ((ib_is_opa_gid(&ib->sgid)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) (ib_is_opa_gid(&ib->dgid))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) slid = htonl(opa_get_lid_from_gid(&ib->sgid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) dlid = htonl(opa_get_lid_from_gid(&ib->dgid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) slid = htonl(ntohs(ib->ib.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) dlid = htonl(ntohs(ib->ib.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) opa->opa.slid = slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) opa->opa.dlid = dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) opa->service_id = ib->service_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) opa->opa.raw_traffic = ib->ib.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /* Convert from OPA to IB path record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) static inline void sa_convert_path_opa_to_ib(struct sa_path_rec *dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct sa_path_rec *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (src->rec_type != SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) *dest = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) dest->rec_type = SA_PATH_REC_TYPE_IB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) path_conv_opa_to_ib(dest, src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* Convert from IB to OPA path record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static inline void sa_convert_path_ib_to_opa(struct sa_path_rec *dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct sa_path_rec *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if (src->rec_type != SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) /* Do a structure copy and overwrite the relevant fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) *dest = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) dest->rec_type = SA_PATH_REC_TYPE_OPA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) path_conv_ib_to_opa(dest, src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define IB_SA_MCMEMBER_REC_PORT_GID IB_SA_COMP_MASK( 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define IB_SA_MCMEMBER_REC_QKEY IB_SA_COMP_MASK( 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define IB_SA_MCMEMBER_REC_MLID IB_SA_COMP_MASK( 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define IB_SA_MCMEMBER_REC_MTU_SELECTOR IB_SA_COMP_MASK( 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define IB_SA_MCMEMBER_REC_MTU IB_SA_COMP_MASK( 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS IB_SA_COMP_MASK( 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define IB_SA_MCMEMBER_REC_PKEY IB_SA_COMP_MASK( 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define IB_SA_MCMEMBER_REC_RATE_SELECTOR IB_SA_COMP_MASK( 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define IB_SA_MCMEMBER_REC_RATE IB_SA_COMP_MASK( 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define IB_SA_MCMEMBER_REC_SL IB_SA_COMP_MASK(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define IB_SA_MCMEMBER_REC_FLOW_LABEL IB_SA_COMP_MASK(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define IB_SA_MCMEMBER_REC_HOP_LIMIT IB_SA_COMP_MASK(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define IB_SA_MCMEMBER_REC_SCOPE IB_SA_COMP_MASK(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define IB_SA_MCMEMBER_REC_JOIN_STATE IB_SA_COMP_MASK(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define IB_SA_MCMEMBER_REC_PROXY_JOIN IB_SA_COMP_MASK(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct ib_sa_mcmember_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) union ib_gid mgid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) union ib_gid port_gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) __be32 qkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) __be16 mlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) u8 mtu_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) u8 mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) u8 traffic_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) __be16 pkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) u8 rate_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) u8 rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) u8 packet_life_time_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) u8 packet_life_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) u8 sl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) __be32 flow_label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) u8 hop_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) u8 scope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) u8 join_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) u8 proxy_join;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) #define IB_SA_SERVICE_REC_SERVICE_ID IB_SA_COMP_MASK( 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #define IB_SA_SERVICE_REC_SERVICE_GID IB_SA_COMP_MASK( 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #define IB_SA_SERVICE_REC_SERVICE_PKEY IB_SA_COMP_MASK( 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* reserved: 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #define IB_SA_SERVICE_REC_SERVICE_LEASE IB_SA_COMP_MASK( 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define IB_SA_SERVICE_REC_SERVICE_KEY IB_SA_COMP_MASK( 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define IB_SA_SERVICE_REC_SERVICE_NAME IB_SA_COMP_MASK( 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define IB_SA_SERVICE_REC_SERVICE_DATA8_0 IB_SA_COMP_MASK( 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define IB_SA_SERVICE_REC_SERVICE_DATA8_1 IB_SA_COMP_MASK( 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #define IB_SA_SERVICE_REC_SERVICE_DATA8_2 IB_SA_COMP_MASK( 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define IB_SA_SERVICE_REC_SERVICE_DATA8_3 IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define IB_SA_SERVICE_REC_SERVICE_DATA8_4 IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define IB_SA_SERVICE_REC_SERVICE_DATA8_5 IB_SA_COMP_MASK(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #define IB_SA_SERVICE_REC_SERVICE_DATA8_6 IB_SA_COMP_MASK(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define IB_SA_SERVICE_REC_SERVICE_DATA8_7 IB_SA_COMP_MASK(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) #define IB_SA_SERVICE_REC_SERVICE_DATA8_8 IB_SA_COMP_MASK(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define IB_SA_SERVICE_REC_SERVICE_DATA8_9 IB_SA_COMP_MASK(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define IB_SA_SERVICE_REC_SERVICE_DATA8_10 IB_SA_COMP_MASK(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define IB_SA_SERVICE_REC_SERVICE_DATA8_11 IB_SA_COMP_MASK(18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) #define IB_SA_SERVICE_REC_SERVICE_DATA8_12 IB_SA_COMP_MASK(19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #define IB_SA_SERVICE_REC_SERVICE_DATA8_13 IB_SA_COMP_MASK(20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define IB_SA_SERVICE_REC_SERVICE_DATA8_14 IB_SA_COMP_MASK(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define IB_SA_SERVICE_REC_SERVICE_DATA8_15 IB_SA_COMP_MASK(22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define IB_SA_SERVICE_REC_SERVICE_DATA16_0 IB_SA_COMP_MASK(23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define IB_SA_SERVICE_REC_SERVICE_DATA16_1 IB_SA_COMP_MASK(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define IB_SA_SERVICE_REC_SERVICE_DATA16_2 IB_SA_COMP_MASK(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define IB_SA_SERVICE_REC_SERVICE_DATA16_3 IB_SA_COMP_MASK(26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define IB_SA_SERVICE_REC_SERVICE_DATA16_4 IB_SA_COMP_MASK(27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define IB_SA_SERVICE_REC_SERVICE_DATA16_5 IB_SA_COMP_MASK(28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) #define IB_SA_SERVICE_REC_SERVICE_DATA16_6 IB_SA_COMP_MASK(29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define IB_SA_SERVICE_REC_SERVICE_DATA16_7 IB_SA_COMP_MASK(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define IB_SA_SERVICE_REC_SERVICE_DATA32_0 IB_SA_COMP_MASK(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define IB_SA_SERVICE_REC_SERVICE_DATA32_1 IB_SA_COMP_MASK(32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define IB_SA_SERVICE_REC_SERVICE_DATA32_2 IB_SA_COMP_MASK(33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define IB_SA_SERVICE_REC_SERVICE_DATA32_3 IB_SA_COMP_MASK(34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) #define IB_SA_SERVICE_REC_SERVICE_DATA64_0 IB_SA_COMP_MASK(35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define IB_SA_SERVICE_REC_SERVICE_DATA64_1 IB_SA_COMP_MASK(36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #define IB_DEFAULT_SERVICE_LEASE 0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct ib_sa_service_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) u64 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) union ib_gid gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) __be16 pkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) u32 lease;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) u8 key[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) u8 name[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) u8 data8[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) u16 data16[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) u32 data32[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) u64 data64[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #define IB_SA_GUIDINFO_REC_LID IB_SA_COMP_MASK(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #define IB_SA_GUIDINFO_REC_BLOCK_NUM IB_SA_COMP_MASK(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #define IB_SA_GUIDINFO_REC_RES1 IB_SA_COMP_MASK(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #define IB_SA_GUIDINFO_REC_RES2 IB_SA_COMP_MASK(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) #define IB_SA_GUIDINFO_REC_GID0 IB_SA_COMP_MASK(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) #define IB_SA_GUIDINFO_REC_GID1 IB_SA_COMP_MASK(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define IB_SA_GUIDINFO_REC_GID2 IB_SA_COMP_MASK(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #define IB_SA_GUIDINFO_REC_GID3 IB_SA_COMP_MASK(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #define IB_SA_GUIDINFO_REC_GID4 IB_SA_COMP_MASK(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define IB_SA_GUIDINFO_REC_GID5 IB_SA_COMP_MASK(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #define IB_SA_GUIDINFO_REC_GID6 IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) #define IB_SA_GUIDINFO_REC_GID7 IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) struct ib_sa_guidinfo_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) __be16 lid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) u8 block_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) u8 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) __be32 res2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) u8 guid_info_list[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct ib_sa_client {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) atomic_t users;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct completion comp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) * ib_sa_register_client - Register an SA client.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) void ib_sa_register_client(struct ib_sa_client *client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) * ib_sa_unregister_client - Deregister an SA client.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) * @client: Client object to deregister.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) void ib_sa_unregister_client(struct ib_sa_client *client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) struct ib_sa_query;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) void ib_sa_cancel_query(int id, struct ib_sa_query *query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) u8 port_num, struct sa_path_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) void (*callback)(int status, struct sa_path_rec *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) void *context),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) void *context, struct ib_sa_query **query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) int ib_sa_service_rec_query(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) struct ib_device *device, u8 port_num, u8 method,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) struct ib_sa_service_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) void (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) struct ib_sa_service_rec *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) void *context),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) void *context, struct ib_sa_query **sa_query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) struct ib_sa_multicast {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) struct ib_sa_mcmember_rec rec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) ib_sa_comp_mask comp_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) int (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct ib_sa_multicast *multicast);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) void *context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * ib_sa_join_multicast - Initiates a join request to the specified multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) * group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) * @client: SA client
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * @device: Device associated with the multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * @port_num: Port on the specified device to associate with the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * @rec: SA multicast member record specifying group attributes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * @comp_mask: Component mask indicating which group attributes of %rec are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) * valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * @gfp_mask: GFP mask for memory allocations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * @callback: User callback invoked once the join operation completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * @context: User specified context stored with the ib_sa_multicast structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * This call initiates a multicast join request with the SA for the specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * multicast group. If the join operation is started successfully, it returns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) * an ib_sa_multicast structure that is used to track the multicast operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) * Users must free this structure by calling ib_free_multicast, even if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) * join operation later fails. (The callback status is non-zero.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * If the join operation fails; status will be non-zero, with the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * failures possible:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * -ETIMEDOUT: The request timed out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) * -EIO: An error occurred sending the query.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * -EINVAL: The MCMemberRecord values differed from the existing group's.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * -ENETRESET: Indicates that an fatal error has occurred on the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) * group, and the user must rejoin the group to continue using it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) struct ib_sa_mcmember_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) int (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) struct ib_sa_multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) *multicast),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) void *context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * ib_free_multicast - Frees the multicast tracking structure, and releases
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * any reference on the multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * @multicast: Multicast tracking structure allocated by ib_join_multicast.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * This call blocks until the multicast identifier is destroyed. It may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) * not be called from within the multicast callback; however, returning a non-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) * zero value from the callback will result in destroying the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) * tracking structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) * ib_get_mcmember_rec - Looks up a multicast member record by its MGID and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) * returns it if found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) * @device: Device associated with the multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) * @port_num: Port on the specified device to associate with the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) * group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) * @mgid: MGID of multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * @rec: Location to copy SA multicast member record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) * ib_init_ah_from_mcmember - Initialize address handle attributes based on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) * an SA multicast member record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) struct ib_sa_mcmember_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) struct net_device *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) enum ib_gid_type gid_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) struct rdma_ah_attr *ah_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) struct sa_path_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) struct rdma_ah_attr *ah_attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) const struct ib_gid_attr *sgid_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) * ib_sa_pack_path - Conert a path record from struct ib_sa_path_rec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) * to IB MAD wire format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * ib_sa_unpack_path - Convert a path record from MAD format to struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) * ib_sa_path_rec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) /* Support GuidInfoRecord */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) struct ib_sa_guidinfo_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) ib_sa_comp_mask comp_mask, u8 method,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) unsigned long timeout_ms, gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) void (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct ib_sa_guidinfo_rec *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) void *context),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) void *context, struct ib_sa_query **sa_query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) bool ib_sa_sendonly_fullmem_support(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) struct ib_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) u8 port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) static inline bool sa_path_is_roce(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) return ((rec->rec_type == SA_PATH_REC_TYPE_ROCE_V1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) (rec->rec_type == SA_PATH_REC_TYPE_ROCE_V2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) static inline bool sa_path_is_opa(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) return (rec->rec_type == SA_PATH_REC_TYPE_OPA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) static inline void sa_path_set_slid(struct sa_path_rec *rec, u32 slid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) rec->ib.slid = cpu_to_be16(slid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) rec->opa.slid = cpu_to_be32(slid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) static inline void sa_path_set_dlid(struct sa_path_rec *rec, u32 dlid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) rec->ib.dlid = cpu_to_be16(dlid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) rec->opa.dlid = cpu_to_be32(dlid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) static inline void sa_path_set_raw_traffic(struct sa_path_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) u8 raw_traffic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) rec->ib.raw_traffic = raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) rec->opa.raw_traffic = raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) static inline __be32 sa_path_get_slid(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) return htonl(ntohs(rec->ib.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) return rec->opa.slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) static inline __be32 sa_path_get_dlid(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) return htonl(ntohs(rec->ib.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) return rec->opa.dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) static inline u8 sa_path_get_raw_traffic(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) return rec->ib.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return rec->opa.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) static inline void sa_path_set_dmac(struct sa_path_rec *rec, u8 *dmac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (sa_path_is_roce(rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) memcpy(rec->roce.dmac, dmac, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) static inline void sa_path_set_dmac_zero(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (sa_path_is_roce(rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) eth_zero_addr(rec->roce.dmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) static inline u8 *sa_path_get_dmac(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (sa_path_is_roce(rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) return rec->roce.dmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) #endif /* IB_SA_H */