xref: /linux/include/rdma/ib_sa.h (revision 13abf8130139c2ccd4962a7e5a8902be5e6cb5a7)
1 /*
2  * Copyright (c) 2004 Topspin Communications.  All rights reserved.
3  * Copyright (c) 2005 Voltaire, Inc.  All rights reserved.
4  *
5  * This software is available to you under a choice of one of two
6  * licenses.  You may choose to be licensed under the terms of the GNU
7  * General Public License (GPL) Version 2, available from the file
8  * COPYING in the main directory of this source tree, or the
9  * OpenIB.org BSD license below:
10  *
11  *     Redistribution and use in source and binary forms, with or
12  *     without modification, are permitted provided that the following
13  *     conditions are met:
14  *
15  *      - Redistributions of source code must retain the above
16  *        copyright notice, this list of conditions and the following
17  *        disclaimer.
18  *
19  *      - Redistributions in binary form must reproduce the above
20  *        copyright notice, this list of conditions and the following
21  *        disclaimer in the documentation and/or other materials
22  *        provided with the distribution.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31  * SOFTWARE.
32  *
33  * $Id: ib_sa.h 2811 2005-07-06 18:11:43Z halr $
34  */
35 
36 #ifndef IB_SA_H
37 #define IB_SA_H
38 
39 #include <linux/compiler.h>
40 
41 #include <rdma/ib_verbs.h>
42 #include <rdma/ib_mad.h>
43 
44 enum {
45 	IB_SA_CLASS_VERSION		= 2,	/* IB spec version 1.1/1.2 */
46 
47 	IB_SA_METHOD_GET_TABLE		= 0x12,
48 	IB_SA_METHOD_GET_TABLE_RESP	= 0x92,
49 	IB_SA_METHOD_DELETE		= 0x15
50 };
51 
52 enum ib_sa_selector {
53 	IB_SA_GTE  = 0,
54 	IB_SA_LTE  = 1,
55 	IB_SA_EQ   = 2,
56 	/*
57 	 * The meaning of "best" depends on the attribute: for
58 	 * example, for MTU best will return the largest available
59 	 * MTU, while for packet life time, best will return the
60 	 * smallest available life time.
61 	 */
62 	IB_SA_BEST = 3
63 };
64 
65 enum ib_sa_rate {
66 	IB_SA_RATE_2_5_GBPS = 2,
67 	IB_SA_RATE_5_GBPS   = 5,
68 	IB_SA_RATE_10_GBPS  = 3,
69 	IB_SA_RATE_20_GBPS  = 6,
70 	IB_SA_RATE_30_GBPS  = 4,
71 	IB_SA_RATE_40_GBPS  = 7,
72 	IB_SA_RATE_60_GBPS  = 8,
73 	IB_SA_RATE_80_GBPS  = 9,
74 	IB_SA_RATE_120_GBPS = 10
75 };
76 
77 static inline int ib_sa_rate_enum_to_int(enum ib_sa_rate rate)
78 {
79 	switch (rate) {
80 	case IB_SA_RATE_2_5_GBPS: return  1;
81 	case IB_SA_RATE_5_GBPS:   return  2;
82 	case IB_SA_RATE_10_GBPS:  return  4;
83 	case IB_SA_RATE_20_GBPS:  return  8;
84 	case IB_SA_RATE_30_GBPS:  return 12;
85 	case IB_SA_RATE_40_GBPS:  return 16;
86 	case IB_SA_RATE_60_GBPS:  return 24;
87 	case IB_SA_RATE_80_GBPS:  return 32;
88 	case IB_SA_RATE_120_GBPS: return 48;
89 	default: 	          return -1;
90 	}
91 }
92 
93 /*
94  * Structures for SA records are named "struct ib_sa_xxx_rec."  No
95  * attempt is made to pack structures to match the physical layout of
96  * SA records in SA MADs; all packing and unpacking is handled by the
97  * SA query code.
98  *
99  * For a record with structure ib_sa_xxx_rec, the naming convention
100  * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we
101  * never use different abbreviations or otherwise change the spelling
102  * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY).
103  *
104  * Reserved rows are indicated with comments to help maintainability.
105  */
106 
107 /* reserved:								 0 */
108 /* reserved:								 1 */
109 #define IB_SA_PATH_REC_DGID				IB_SA_COMP_MASK( 2)
110 #define IB_SA_PATH_REC_SGID				IB_SA_COMP_MASK( 3)
111 #define IB_SA_PATH_REC_DLID				IB_SA_COMP_MASK( 4)
112 #define IB_SA_PATH_REC_SLID				IB_SA_COMP_MASK( 5)
113 #define IB_SA_PATH_REC_RAW_TRAFFIC			IB_SA_COMP_MASK( 6)
114 /* reserved:								 7 */
115 #define IB_SA_PATH_REC_FLOW_LABEL       		IB_SA_COMP_MASK( 8)
116 #define IB_SA_PATH_REC_HOP_LIMIT			IB_SA_COMP_MASK( 9)
117 #define IB_SA_PATH_REC_TRAFFIC_CLASS			IB_SA_COMP_MASK(10)
118 #define IB_SA_PATH_REC_REVERSIBLE			IB_SA_COMP_MASK(11)
119 #define IB_SA_PATH_REC_NUMB_PATH			IB_SA_COMP_MASK(12)
120 #define IB_SA_PATH_REC_PKEY				IB_SA_COMP_MASK(13)
121 /* reserved:								14 */
122 #define IB_SA_PATH_REC_SL				IB_SA_COMP_MASK(15)
123 #define IB_SA_PATH_REC_MTU_SELECTOR			IB_SA_COMP_MASK(16)
124 #define IB_SA_PATH_REC_MTU				IB_SA_COMP_MASK(17)
125 #define IB_SA_PATH_REC_RATE_SELECTOR			IB_SA_COMP_MASK(18)
126 #define IB_SA_PATH_REC_RATE				IB_SA_COMP_MASK(19)
127 #define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR	IB_SA_COMP_MASK(20)
128 #define IB_SA_PATH_REC_PACKET_LIFE_TIME			IB_SA_COMP_MASK(21)
129 #define IB_SA_PATH_REC_PREFERENCE			IB_SA_COMP_MASK(22)
130 
131 struct ib_sa_path_rec {
132 	/* reserved */
133 	/* reserved */
134 	union ib_gid dgid;
135 	union ib_gid sgid;
136 	__be16       dlid;
137 	__be16       slid;
138 	int          raw_traffic;
139 	/* reserved */
140 	__be32       flow_label;
141 	u8           hop_limit;
142 	u8           traffic_class;
143 	int          reversible;
144 	u8           numb_path;
145 	__be16       pkey;
146 	/* reserved */
147 	u8           sl;
148 	u8           mtu_selector;
149 	u8           mtu;
150 	u8           rate_selector;
151 	u8           rate;
152 	u8           packet_life_time_selector;
153 	u8           packet_life_time;
154 	u8           preference;
155 };
156 
157 #define IB_SA_MCMEMBER_REC_MGID				IB_SA_COMP_MASK( 0)
158 #define IB_SA_MCMEMBER_REC_PORT_GID			IB_SA_COMP_MASK( 1)
159 #define IB_SA_MCMEMBER_REC_QKEY				IB_SA_COMP_MASK( 2)
160 #define IB_SA_MCMEMBER_REC_MLID				IB_SA_COMP_MASK( 3)
161 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR			IB_SA_COMP_MASK( 4)
162 #define IB_SA_MCMEMBER_REC_MTU				IB_SA_COMP_MASK( 5)
163 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS		IB_SA_COMP_MASK( 6)
164 #define IB_SA_MCMEMBER_REC_PKEY				IB_SA_COMP_MASK( 7)
165 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR		IB_SA_COMP_MASK( 8)
166 #define IB_SA_MCMEMBER_REC_RATE				IB_SA_COMP_MASK( 9)
167 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR	IB_SA_COMP_MASK(10)
168 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME		IB_SA_COMP_MASK(11)
169 #define IB_SA_MCMEMBER_REC_SL				IB_SA_COMP_MASK(12)
170 #define IB_SA_MCMEMBER_REC_FLOW_LABEL			IB_SA_COMP_MASK(13)
171 #define IB_SA_MCMEMBER_REC_HOP_LIMIT			IB_SA_COMP_MASK(14)
172 #define IB_SA_MCMEMBER_REC_SCOPE			IB_SA_COMP_MASK(15)
173 #define IB_SA_MCMEMBER_REC_JOIN_STATE			IB_SA_COMP_MASK(16)
174 #define IB_SA_MCMEMBER_REC_PROXY_JOIN			IB_SA_COMP_MASK(17)
175 
176 struct ib_sa_mcmember_rec {
177 	union ib_gid mgid;
178 	union ib_gid port_gid;
179 	__be32       qkey;
180 	__be16       mlid;
181 	u8           mtu_selector;
182 	u8           mtu;
183 	u8           traffic_class;
184 	__be16       pkey;
185 	u8 	     rate_selector;
186 	u8 	     rate;
187 	u8 	     packet_life_time_selector;
188 	u8 	     packet_life_time;
189 	u8           sl;
190 	__be32       flow_label;
191 	u8           hop_limit;
192 	u8           scope;
193 	u8           join_state;
194 	int          proxy_join;
195 };
196 
197 /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1	*/
198 #define IB_SA_SERVICE_REC_SERVICE_ID			IB_SA_COMP_MASK( 0)
199 #define IB_SA_SERVICE_REC_SERVICE_GID			IB_SA_COMP_MASK( 1)
200 #define IB_SA_SERVICE_REC_SERVICE_PKEY			IB_SA_COMP_MASK( 2)
201 /* reserved:								 3 */
202 #define IB_SA_SERVICE_REC_SERVICE_LEASE			IB_SA_COMP_MASK( 4)
203 #define IB_SA_SERVICE_REC_SERVICE_KEY			IB_SA_COMP_MASK( 5)
204 #define IB_SA_SERVICE_REC_SERVICE_NAME			IB_SA_COMP_MASK( 6)
205 #define IB_SA_SERVICE_REC_SERVICE_DATA8_0		IB_SA_COMP_MASK( 7)
206 #define IB_SA_SERVICE_REC_SERVICE_DATA8_1		IB_SA_COMP_MASK( 8)
207 #define IB_SA_SERVICE_REC_SERVICE_DATA8_2		IB_SA_COMP_MASK( 9)
208 #define IB_SA_SERVICE_REC_SERVICE_DATA8_3		IB_SA_COMP_MASK(10)
209 #define IB_SA_SERVICE_REC_SERVICE_DATA8_4		IB_SA_COMP_MASK(11)
210 #define IB_SA_SERVICE_REC_SERVICE_DATA8_5		IB_SA_COMP_MASK(12)
211 #define IB_SA_SERVICE_REC_SERVICE_DATA8_6		IB_SA_COMP_MASK(13)
212 #define IB_SA_SERVICE_REC_SERVICE_DATA8_7		IB_SA_COMP_MASK(14)
213 #define IB_SA_SERVICE_REC_SERVICE_DATA8_8		IB_SA_COMP_MASK(15)
214 #define IB_SA_SERVICE_REC_SERVICE_DATA8_9		IB_SA_COMP_MASK(16)
215 #define IB_SA_SERVICE_REC_SERVICE_DATA8_10		IB_SA_COMP_MASK(17)
216 #define IB_SA_SERVICE_REC_SERVICE_DATA8_11		IB_SA_COMP_MASK(18)
217 #define IB_SA_SERVICE_REC_SERVICE_DATA8_12		IB_SA_COMP_MASK(19)
218 #define IB_SA_SERVICE_REC_SERVICE_DATA8_13		IB_SA_COMP_MASK(20)
219 #define IB_SA_SERVICE_REC_SERVICE_DATA8_14		IB_SA_COMP_MASK(21)
220 #define IB_SA_SERVICE_REC_SERVICE_DATA8_15		IB_SA_COMP_MASK(22)
221 #define IB_SA_SERVICE_REC_SERVICE_DATA16_0		IB_SA_COMP_MASK(23)
222 #define IB_SA_SERVICE_REC_SERVICE_DATA16_1		IB_SA_COMP_MASK(24)
223 #define IB_SA_SERVICE_REC_SERVICE_DATA16_2		IB_SA_COMP_MASK(25)
224 #define IB_SA_SERVICE_REC_SERVICE_DATA16_3		IB_SA_COMP_MASK(26)
225 #define IB_SA_SERVICE_REC_SERVICE_DATA16_4		IB_SA_COMP_MASK(27)
226 #define IB_SA_SERVICE_REC_SERVICE_DATA16_5		IB_SA_COMP_MASK(28)
227 #define IB_SA_SERVICE_REC_SERVICE_DATA16_6		IB_SA_COMP_MASK(29)
228 #define IB_SA_SERVICE_REC_SERVICE_DATA16_7		IB_SA_COMP_MASK(30)
229 #define IB_SA_SERVICE_REC_SERVICE_DATA32_0		IB_SA_COMP_MASK(31)
230 #define IB_SA_SERVICE_REC_SERVICE_DATA32_1		IB_SA_COMP_MASK(32)
231 #define IB_SA_SERVICE_REC_SERVICE_DATA32_2		IB_SA_COMP_MASK(33)
232 #define IB_SA_SERVICE_REC_SERVICE_DATA32_3		IB_SA_COMP_MASK(34)
233 #define IB_SA_SERVICE_REC_SERVICE_DATA64_0		IB_SA_COMP_MASK(35)
234 #define IB_SA_SERVICE_REC_SERVICE_DATA64_1		IB_SA_COMP_MASK(36)
235 
236 #define IB_DEFAULT_SERVICE_LEASE 	0xFFFFFFFF
237 
238 struct ib_sa_service_rec {
239 	u64		id;
240 	union ib_gid	gid;
241 	__be16 		pkey;
242 	/* reserved */
243 	u32		lease;
244 	u8		key[16];
245 	u8		name[64];
246 	u8		data8[16];
247 	u16		data16[8];
248 	u32		data32[4];
249 	u64		data64[2];
250 };
251 
252 struct ib_sa_query;
253 
254 void ib_sa_cancel_query(int id, struct ib_sa_query *query);
255 
256 int ib_sa_path_rec_get(struct ib_device *device, u8 port_num,
257 		       struct ib_sa_path_rec *rec,
258 		       ib_sa_comp_mask comp_mask,
259 		       int timeout_ms, unsigned int __nocast gfp_mask,
260 		       void (*callback)(int status,
261 					struct ib_sa_path_rec *resp,
262 					void *context),
263 		       void *context,
264 		       struct ib_sa_query **query);
265 
266 int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num,
267 			     u8 method,
268 			     struct ib_sa_mcmember_rec *rec,
269 			     ib_sa_comp_mask comp_mask,
270 			     int timeout_ms, unsigned int __nocast gfp_mask,
271 			     void (*callback)(int status,
272 					      struct ib_sa_mcmember_rec *resp,
273 					      void *context),
274 			     void *context,
275 			     struct ib_sa_query **query);
276 
277 int ib_sa_service_rec_query(struct ib_device *device, u8 port_num,
278 			 u8 method,
279 			 struct ib_sa_service_rec *rec,
280 			 ib_sa_comp_mask comp_mask,
281 			 int timeout_ms, unsigned int __nocast gfp_mask,
282 			 void (*callback)(int status,
283 					  struct ib_sa_service_rec *resp,
284 					  void *context),
285 			 void *context,
286 			 struct ib_sa_query **sa_query);
287 
288 /**
289  * ib_sa_mcmember_rec_set - Start an MCMember set query
290  * @device:device to send query on
291  * @port_num: port number to send query on
292  * @rec:MCMember Record to send in query
293  * @comp_mask:component mask to send in query
294  * @timeout_ms:time to wait for response
295  * @gfp_mask:GFP mask to use for internal allocations
296  * @callback:function called when query completes, times out or is
297  * canceled
298  * @context:opaque user context passed to callback
299  * @sa_query:query context, used to cancel query
300  *
301  * Send an MCMember Set query to the SA (eg to join a multicast
302  * group).  The callback function will be called when the query
303  * completes (or fails); status is 0 for a successful response, -EINTR
304  * if the query is canceled, -ETIMEDOUT is the query timed out, or
305  * -EIO if an error occurred sending the query.  The resp parameter of
306  * the callback is only valid if status is 0.
307  *
308  * If the return value of ib_sa_mcmember_rec_set() is negative, it is
309  * an error code.  Otherwise it is a query ID that can be used to
310  * cancel the query.
311  */
312 static inline int
313 ib_sa_mcmember_rec_set(struct ib_device *device, u8 port_num,
314 		       struct ib_sa_mcmember_rec *rec,
315 		       ib_sa_comp_mask comp_mask,
316 		       int timeout_ms, unsigned int __nocast gfp_mask,
317 		       void (*callback)(int status,
318 					struct ib_sa_mcmember_rec *resp,
319 					void *context),
320 		       void *context,
321 		       struct ib_sa_query **query)
322 {
323 	return ib_sa_mcmember_rec_query(device, port_num,
324 					IB_MGMT_METHOD_SET,
325 					rec, comp_mask,
326 					timeout_ms, gfp_mask, callback,
327 					context, query);
328 }
329 
330 /**
331  * ib_sa_mcmember_rec_delete - Start an MCMember delete query
332  * @device:device to send query on
333  * @port_num: port number to send query on
334  * @rec:MCMember Record to send in query
335  * @comp_mask:component mask to send in query
336  * @timeout_ms:time to wait for response
337  * @gfp_mask:GFP mask to use for internal allocations
338  * @callback:function called when query completes, times out or is
339  * canceled
340  * @context:opaque user context passed to callback
341  * @sa_query:query context, used to cancel query
342  *
343  * Send an MCMember Delete query to the SA (eg to leave a multicast
344  * group).  The callback function will be called when the query
345  * completes (or fails); status is 0 for a successful response, -EINTR
346  * if the query is canceled, -ETIMEDOUT is the query timed out, or
347  * -EIO if an error occurred sending the query.  The resp parameter of
348  * the callback is only valid if status is 0.
349  *
350  * If the return value of ib_sa_mcmember_rec_delete() is negative, it
351  * is an error code.  Otherwise it is a query ID that can be used to
352  * cancel the query.
353  */
354 static inline int
355 ib_sa_mcmember_rec_delete(struct ib_device *device, u8 port_num,
356 			  struct ib_sa_mcmember_rec *rec,
357 			  ib_sa_comp_mask comp_mask,
358 			  int timeout_ms, unsigned int __nocast gfp_mask,
359 			  void (*callback)(int status,
360 					   struct ib_sa_mcmember_rec *resp,
361 					   void *context),
362 			  void *context,
363 			  struct ib_sa_query **query)
364 {
365 	return ib_sa_mcmember_rec_query(device, port_num,
366 					IB_SA_METHOD_DELETE,
367 					rec, comp_mask,
368 					timeout_ms, gfp_mask, callback,
369 					context, query);
370 }
371 
372 
373 #endif /* IB_SA_H */
374