2  * Copyright (c) 2004 Topspin Communications.  All rights reserved.
 
   3  * Copyright (c) 2005 Voltaire, Inc.  All rights reserved.
 
   4  * Copyright (c) 2006 Intel Corporation.  All rights reserved.
 
   6  * This software is available to you under a choice of one of two
 
   7  * licenses.  You may choose to be licensed under the terms of the GNU
 
   8  * General Public License (GPL) Version 2, available from the file
 
   9  * COPYING in the main directory of this source tree, or the
 
  10  * OpenIB.org BSD license below:
 
  12  *     Redistribution and use in source and binary forms, with or
 
  13  *     without modification, are permitted provided that the following
 
  16  *      - Redistributions of source code must retain the above
 
  17  *        copyright notice, this list of conditions and the following
 
  20  *      - Redistributions in binary form must reproduce the above
 
  21  *        copyright notice, this list of conditions and the following
 
  22  *        disclaimer in the documentation and/or other materials
 
  23  *        provided with the distribution.
 
  25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
  26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
  27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
  28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 
  29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 
  30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 
  31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 
  34  * $Id: ib_sa.h 2811 2005-07-06 18:11:43Z halr $
 
  40 #include <linux/completion.h>
 
  41 #include <linux/compiler.h>
 
  43 #include <asm/atomic.h>
 
  45 #include <rdma/ib_verbs.h>
 
  46 #include <rdma/ib_mad.h>
 
  49         IB_SA_CLASS_VERSION             = 2,    /* IB spec version 1.1/1.2 */
 
  51         IB_SA_METHOD_GET_TABLE          = 0x12,
 
  52         IB_SA_METHOD_GET_TABLE_RESP     = 0x92,
 
  53         IB_SA_METHOD_DELETE             = 0x15,
 
  54         IB_SA_METHOD_DELETE_RESP        = 0x95,
 
  55         IB_SA_METHOD_GET_MULTI          = 0x14,
 
  56         IB_SA_METHOD_GET_MULTI_RESP     = 0x94,
 
  57         IB_SA_METHOD_GET_TRACE_TBL      = 0x13
 
  61         IB_SA_ATTR_CLASS_PORTINFO    = 0x01,
 
  62         IB_SA_ATTR_NOTICE            = 0x02,
 
  63         IB_SA_ATTR_INFORM_INFO       = 0x03,
 
  64         IB_SA_ATTR_NODE_REC          = 0x11,
 
  65         IB_SA_ATTR_PORT_INFO_REC     = 0x12,
 
  66         IB_SA_ATTR_SL2VL_REC         = 0x13,
 
  67         IB_SA_ATTR_SWITCH_REC        = 0x14,
 
  68         IB_SA_ATTR_LINEAR_FDB_REC    = 0x15,
 
  69         IB_SA_ATTR_RANDOM_FDB_REC    = 0x16,
 
  70         IB_SA_ATTR_MCAST_FDB_REC     = 0x17,
 
  71         IB_SA_ATTR_SM_INFO_REC       = 0x18,
 
  72         IB_SA_ATTR_LINK_REC          = 0x20,
 
  73         IB_SA_ATTR_GUID_INFO_REC     = 0x30,
 
  74         IB_SA_ATTR_SERVICE_REC       = 0x31,
 
  75         IB_SA_ATTR_PARTITION_REC     = 0x33,
 
  76         IB_SA_ATTR_PATH_REC          = 0x35,
 
  77         IB_SA_ATTR_VL_ARB_REC        = 0x36,
 
  78         IB_SA_ATTR_MC_MEMBER_REC     = 0x38,
 
  79         IB_SA_ATTR_TRACE_REC         = 0x39,
 
  80         IB_SA_ATTR_MULTI_PATH_REC    = 0x3a,
 
  81         IB_SA_ATTR_SERVICE_ASSOC_REC = 0x3b,
 
  82         IB_SA_ATTR_INFORM_INFO_REC   = 0xf3
 
  90          * The meaning of "best" depends on the attribute: for
 
  91          * example, for MTU best will return the largest available
 
  92          * MTU, while for packet life time, best will return the
 
  93          * smallest available life time.
 
  99  * Structures for SA records are named "struct ib_sa_xxx_rec."  No
 
 100  * attempt is made to pack structures to match the physical layout of
 
 101  * SA records in SA MADs; all packing and unpacking is handled by the
 
 104  * For a record with structure ib_sa_xxx_rec, the naming convention
 
 105  * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we
 
 106  * never use different abbreviations or otherwise change the spelling
 
 107  * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY).
 
 109  * Reserved rows are indicated with comments to help maintainability.
 
 114 #define IB_SA_PATH_REC_DGID                             IB_SA_COMP_MASK( 2)
 
 115 #define IB_SA_PATH_REC_SGID                             IB_SA_COMP_MASK( 3)
 
 116 #define IB_SA_PATH_REC_DLID                             IB_SA_COMP_MASK( 4)
 
 117 #define IB_SA_PATH_REC_SLID                             IB_SA_COMP_MASK( 5)
 
 118 #define IB_SA_PATH_REC_RAW_TRAFFIC                      IB_SA_COMP_MASK( 6)
 
 120 #define IB_SA_PATH_REC_FLOW_LABEL                       IB_SA_COMP_MASK( 8)
 
 121 #define IB_SA_PATH_REC_HOP_LIMIT                        IB_SA_COMP_MASK( 9)
 
 122 #define IB_SA_PATH_REC_TRAFFIC_CLASS                    IB_SA_COMP_MASK(10)
 
 123 #define IB_SA_PATH_REC_REVERSIBLE                       IB_SA_COMP_MASK(11)
 
 124 #define IB_SA_PATH_REC_NUMB_PATH                        IB_SA_COMP_MASK(12)
 
 125 #define IB_SA_PATH_REC_PKEY                             IB_SA_COMP_MASK(13)
 
 127 #define IB_SA_PATH_REC_SL                               IB_SA_COMP_MASK(15)
 
 128 #define IB_SA_PATH_REC_MTU_SELECTOR                     IB_SA_COMP_MASK(16)
 
 129 #define IB_SA_PATH_REC_MTU                              IB_SA_COMP_MASK(17)
 
 130 #define IB_SA_PATH_REC_RATE_SELECTOR                    IB_SA_COMP_MASK(18)
 
 131 #define IB_SA_PATH_REC_RATE                             IB_SA_COMP_MASK(19)
 
 132 #define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR        IB_SA_COMP_MASK(20)
 
 133 #define IB_SA_PATH_REC_PACKET_LIFE_TIME                 IB_SA_COMP_MASK(21)
 
 134 #define IB_SA_PATH_REC_PREFERENCE                       IB_SA_COMP_MASK(22)
 
 136 struct ib_sa_path_rec {
 
 157         u8           packet_life_time_selector;
 
 162 #define IB_SA_MCMEMBER_REC_MGID                         IB_SA_COMP_MASK( 0)
 
 163 #define IB_SA_MCMEMBER_REC_PORT_GID                     IB_SA_COMP_MASK( 1)
 
 164 #define IB_SA_MCMEMBER_REC_QKEY                         IB_SA_COMP_MASK( 2)
 
 165 #define IB_SA_MCMEMBER_REC_MLID                         IB_SA_COMP_MASK( 3)
 
 166 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR                 IB_SA_COMP_MASK( 4)
 
 167 #define IB_SA_MCMEMBER_REC_MTU                          IB_SA_COMP_MASK( 5)
 
 168 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS                IB_SA_COMP_MASK( 6)
 
 169 #define IB_SA_MCMEMBER_REC_PKEY                         IB_SA_COMP_MASK( 7)
 
 170 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR                IB_SA_COMP_MASK( 8)
 
 171 #define IB_SA_MCMEMBER_REC_RATE                         IB_SA_COMP_MASK( 9)
 
 172 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR    IB_SA_COMP_MASK(10)
 
 173 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME             IB_SA_COMP_MASK(11)
 
 174 #define IB_SA_MCMEMBER_REC_SL                           IB_SA_COMP_MASK(12)
 
 175 #define IB_SA_MCMEMBER_REC_FLOW_LABEL                   IB_SA_COMP_MASK(13)
 
 176 #define IB_SA_MCMEMBER_REC_HOP_LIMIT                    IB_SA_COMP_MASK(14)
 
 177 #define IB_SA_MCMEMBER_REC_SCOPE                        IB_SA_COMP_MASK(15)
 
 178 #define IB_SA_MCMEMBER_REC_JOIN_STATE                   IB_SA_COMP_MASK(16)
 
 179 #define IB_SA_MCMEMBER_REC_PROXY_JOIN                   IB_SA_COMP_MASK(17)
 
 181 struct ib_sa_mcmember_rec {
 
 183         union ib_gid port_gid;
 
 192         u8           packet_life_time_selector;
 
 202 /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1  */
 
 203 #define IB_SA_SERVICE_REC_SERVICE_ID                    IB_SA_COMP_MASK( 0)
 
 204 #define IB_SA_SERVICE_REC_SERVICE_GID                   IB_SA_COMP_MASK( 1)
 
 205 #define IB_SA_SERVICE_REC_SERVICE_PKEY                  IB_SA_COMP_MASK( 2)
 
 207 #define IB_SA_SERVICE_REC_SERVICE_LEASE                 IB_SA_COMP_MASK( 4)
 
 208 #define IB_SA_SERVICE_REC_SERVICE_KEY                   IB_SA_COMP_MASK( 5)
 
 209 #define IB_SA_SERVICE_REC_SERVICE_NAME                  IB_SA_COMP_MASK( 6)
 
 210 #define IB_SA_SERVICE_REC_SERVICE_DATA8_0               IB_SA_COMP_MASK( 7)
 
 211 #define IB_SA_SERVICE_REC_SERVICE_DATA8_1               IB_SA_COMP_MASK( 8)
 
 212 #define IB_SA_SERVICE_REC_SERVICE_DATA8_2               IB_SA_COMP_MASK( 9)
 
 213 #define IB_SA_SERVICE_REC_SERVICE_DATA8_3               IB_SA_COMP_MASK(10)
 
 214 #define IB_SA_SERVICE_REC_SERVICE_DATA8_4               IB_SA_COMP_MASK(11)
 
 215 #define IB_SA_SERVICE_REC_SERVICE_DATA8_5               IB_SA_COMP_MASK(12)
 
 216 #define IB_SA_SERVICE_REC_SERVICE_DATA8_6               IB_SA_COMP_MASK(13)
 
 217 #define IB_SA_SERVICE_REC_SERVICE_DATA8_7               IB_SA_COMP_MASK(14)
 
 218 #define IB_SA_SERVICE_REC_SERVICE_DATA8_8               IB_SA_COMP_MASK(15)
 
 219 #define IB_SA_SERVICE_REC_SERVICE_DATA8_9               IB_SA_COMP_MASK(16)
 
 220 #define IB_SA_SERVICE_REC_SERVICE_DATA8_10              IB_SA_COMP_MASK(17)
 
 221 #define IB_SA_SERVICE_REC_SERVICE_DATA8_11              IB_SA_COMP_MASK(18)
 
 222 #define IB_SA_SERVICE_REC_SERVICE_DATA8_12              IB_SA_COMP_MASK(19)
 
 223 #define IB_SA_SERVICE_REC_SERVICE_DATA8_13              IB_SA_COMP_MASK(20)
 
 224 #define IB_SA_SERVICE_REC_SERVICE_DATA8_14              IB_SA_COMP_MASK(21)
 
 225 #define IB_SA_SERVICE_REC_SERVICE_DATA8_15              IB_SA_COMP_MASK(22)
 
 226 #define IB_SA_SERVICE_REC_SERVICE_DATA16_0              IB_SA_COMP_MASK(23)
 
 227 #define IB_SA_SERVICE_REC_SERVICE_DATA16_1              IB_SA_COMP_MASK(24)
 
 228 #define IB_SA_SERVICE_REC_SERVICE_DATA16_2              IB_SA_COMP_MASK(25)
 
 229 #define IB_SA_SERVICE_REC_SERVICE_DATA16_3              IB_SA_COMP_MASK(26)
 
 230 #define IB_SA_SERVICE_REC_SERVICE_DATA16_4              IB_SA_COMP_MASK(27)
 
 231 #define IB_SA_SERVICE_REC_SERVICE_DATA16_5              IB_SA_COMP_MASK(28)
 
 232 #define IB_SA_SERVICE_REC_SERVICE_DATA16_6              IB_SA_COMP_MASK(29)
 
 233 #define IB_SA_SERVICE_REC_SERVICE_DATA16_7              IB_SA_COMP_MASK(30)
 
 234 #define IB_SA_SERVICE_REC_SERVICE_DATA32_0              IB_SA_COMP_MASK(31)
 
 235 #define IB_SA_SERVICE_REC_SERVICE_DATA32_1              IB_SA_COMP_MASK(32)
 
 236 #define IB_SA_SERVICE_REC_SERVICE_DATA32_2              IB_SA_COMP_MASK(33)
 
 237 #define IB_SA_SERVICE_REC_SERVICE_DATA32_3              IB_SA_COMP_MASK(34)
 
 238 #define IB_SA_SERVICE_REC_SERVICE_DATA64_0              IB_SA_COMP_MASK(35)
 
 239 #define IB_SA_SERVICE_REC_SERVICE_DATA64_1              IB_SA_COMP_MASK(36)
 
 241 #define IB_DEFAULT_SERVICE_LEASE        0xFFFFFFFF
 
 243 struct ib_sa_service_rec {
 
 257 struct ib_sa_client {
 
 259         struct completion comp;
 
 263  * ib_sa_register_client - Register an SA client.
 
 265 void ib_sa_register_client(struct ib_sa_client *client);
 
 268  * ib_sa_unregister_client - Deregister an SA client.
 
 269  * @client: Client object to deregister.
 
 271 void ib_sa_unregister_client(struct ib_sa_client *client);
 
 275 void ib_sa_cancel_query(int id, struct ib_sa_query *query);
 
 277 int ib_sa_path_rec_get(struct ib_sa_client *client,
 
 278                        struct ib_device *device, u8 port_num,
 
 279                        struct ib_sa_path_rec *rec,
 
 280                        ib_sa_comp_mask comp_mask,
 
 281                        int timeout_ms, gfp_t gfp_mask,
 
 282                        void (*callback)(int status,
 
 283                                         struct ib_sa_path_rec *resp,
 
 286                        struct ib_sa_query **query);
 
 288 int ib_sa_service_rec_query(struct ib_sa_client *client,
 
 289                          struct ib_device *device, u8 port_num,
 
 291                          struct ib_sa_service_rec *rec,
 
 292                          ib_sa_comp_mask comp_mask,
 
 293                          int timeout_ms, gfp_t gfp_mask,
 
 294                          void (*callback)(int status,
 
 295                                           struct ib_sa_service_rec *resp,
 
 298                          struct ib_sa_query **sa_query);
 
 300 struct ib_sa_multicast {
 
 301         struct ib_sa_mcmember_rec rec;
 
 302         ib_sa_comp_mask         comp_mask;
 
 303         int                     (*callback)(int status,
 
 304                                             struct ib_sa_multicast *multicast);
 
 309  * ib_sa_join_multicast - Initiates a join request to the specified multicast
 
 312  * @device: Device associated with the multicast group.
 
 313  * @port_num: Port on the specified device to associate with the multicast
 
 315  * @rec: SA multicast member record specifying group attributes.
 
 316  * @comp_mask: Component mask indicating which group attributes of %rec are
 
 318  * @gfp_mask: GFP mask for memory allocations.
 
 319  * @callback: User callback invoked once the join operation completes.
 
 320  * @context: User specified context stored with the ib_sa_multicast structure.
 
 322  * This call initiates a multicast join request with the SA for the specified
 
 323  * multicast group.  If the join operation is started successfully, it returns
 
 324  * an ib_sa_multicast structure that is used to track the multicast operation.
 
 325  * Users must free this structure by calling ib_free_multicast, even if the
 
 326  * join operation later fails.  (The callback status is non-zero.)
 
 328  * If the join operation fails; status will be non-zero, with the following
 
 330  * -ETIMEDOUT: The request timed out.
 
 331  * -EIO: An error occurred sending the query.
 
 332  * -EINVAL: The MCMemberRecord values differed from the existing group's.
 
 333  * -ENETRESET: Indicates that an fatal error has occurred on the multicast
 
 334  *   group, and the user must rejoin the group to continue using it.
 
 336 struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
 
 337                                              struct ib_device *device, u8 port_num,
 
 338                                              struct ib_sa_mcmember_rec *rec,
 
 339                                              ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
 
 340                                              int (*callback)(int status,
 
 341                                                              struct ib_sa_multicast
 
 346  * ib_free_multicast - Frees the multicast tracking structure, and releases
 
 347  *    any reference on the multicast group.
 
 348  * @multicast: Multicast tracking structure allocated by ib_join_multicast.
 
 350  * This call blocks until the multicast identifier is destroyed.  It may
 
 351  * not be called from within the multicast callback; however, returning a non-
 
 352  * zero value from the callback will result in destroying the multicast
 
 353  * tracking structure.
 
 355 void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
 
 358  * ib_get_mcmember_rec - Looks up a multicast member record by its MGID and
 
 359  *   returns it if found.
 
 360  * @device: Device associated with the multicast group.
 
 361  * @port_num: Port on the specified device to associate with the multicast
 
 363  * @mgid: MGID of multicast group.
 
 364  * @rec: Location to copy SA multicast member record.
 
 366 int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
 
 367                            union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
 
 370  * ib_init_ah_from_mcmember - Initialize address handle attributes based on
 
 371  * an SA multicast member record.
 
 373 int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
 
 374                              struct ib_sa_mcmember_rec *rec,
 
 375                              struct ib_ah_attr *ah_attr);
 
 378  * ib_init_ah_from_path - Initialize address handle attributes based on an SA
 
 381 int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
 
 382                          struct ib_sa_path_rec *rec,
 
 383                          struct ib_ah_attr *ah_attr);