1 /*
2  * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  *
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:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
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.
24  *
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
32  * SOFTWARE.
33  *
34  */
35 
36 /*
37  * Abstract:
38  * 	Specification of the OpenSM SA Client API. This API uses the basic osm
39  *    vendor API to provide SA Client interface.
40  */
41 
42 #ifndef _OSM_VENDOR_SA_API_H_
43 #define _OSM_VENDOR_SA_API_H_
44 
45 #include <iba/ib_types.h>
46 
47 #ifdef __cplusplus
48 #  define BEGIN_C_DECLS extern "C" {
49 #  define END_C_DECLS   }
50 #else				/* !__cplusplus */
51 #  define BEGIN_C_DECLS
52 #  define END_C_DECLS
53 #endif				/* __cplusplus */
54 
55 BEGIN_C_DECLS
56 /****d* OpenSM Vendor SA Client/osmv_flags_t
57 * NAME
58 *	osmv_flags_t
59 *
60 * DESCRIPTION
61 *	Access layer flags used to direct the operation of various calls.
62 *
63 * SYNOPSIS
64 */
65 typedef uint32_t osmv_flags_t;
66 #define OSM_SA_FLAGS_SYNC				0x00000001
67 /*
68 * VALUES
69 *	OSM_SA_FLAGS_SYNC
70 *		Indicates that the given operation should be performed synchronously.
71 *		The call will block until it completes.  Callbacks will still be
72 *		invoked.
73 *
74 * SEE ALSO
75 *  osmv_query_sa
76 *****/
77 
78 /****d* OpenSM Vendor SA Client/osmv_query_type_t
79 * NAME
80 *	osmv_query_type_t
81 *
82 * DESCRIPTION
83 *	Abstracted queries supported by the access layer.
84 *
85 * SYNOPSIS
86 */
87 typedef enum _osmv_query_type {
88 	OSMV_QUERY_USER_DEFINED,
89 
90 	OSMV_QUERY_ALL_SVC_RECS,
91 	OSMV_QUERY_SVC_REC_BY_NAME,
92 	OSMV_QUERY_SVC_REC_BY_ID,
93 
94 	OSMV_QUERY_CLASS_PORT_INFO,
95 
96 	OSMV_QUERY_NODE_REC_BY_NODE_GUID,
97 	OSMV_QUERY_PORT_REC_BY_LID,
98 	OSMV_QUERY_PORT_REC_BY_LID_AND_NUM,
99 
100 	OSMV_QUERY_VLARB_BY_LID_PORT_BLOCK,
101 	OSMV_QUERY_SLVL_BY_LID_AND_PORTS,
102 
103 	OSMV_QUERY_PATH_REC_BY_PORT_GUIDS,
104 	OSMV_QUERY_PATH_REC_BY_GIDS,
105 	OSMV_QUERY_PATH_REC_BY_LIDS,
106 
107 	OSMV_QUERY_UD_MULTICAST_SET,
108 	OSMV_QUERY_UD_MULTICAST_DELETE,
109 
110 	OSMV_QUERY_MULTIPATH_REC,
111 
112 } osmv_query_type_t;
113 /*
114 * VALUES
115 *	OSMV_QUERY_USER_DEFINED
116 *		Query the SA based on user-defined input.  Queries of this type
117 *		should reference an osmv_user_query_t structure as input to the
118 *		query.
119 *
120 *	OSMV_QUERY_SVC_REC_BY_NAME
121 *		Query for service records based on the service name.  Queries of
122 *		this type should reference an ib_svc_name_t structure as input
123 *		to the query.
124 *
125 *	OSMV_QUERY_SVC_REC_BY_ID
126 *		Query for service records based on the service ID.  Queries of
127 *		this type should reference an ib_net64_t value that indicates
128 *		the ID of the service being requested.
129 *
130 *	OSMV_QUERY_NODE_REC_BY_NODE_GUID
131 *		Query for node information based on the node's GUID.  Queries of
132 *		this type should reference an ib_net64_t value that indicates
133 *		the GUID of the node being requested.
134 *
135 *	OSMV_QUERY_PORT_REC_BY_LID
136 *		Query for port information based on the port's base LID. Queries
137 *		of this type should reference an ib_net16_t value that indicates
138 *		the base LID of the port being requested.
139 *
140 *	OSMV_QUERY_PORT_REC_BY_LID_AND_NUM
141 *		Query for port information based on the port's LID and port num.
142 *		Queries of this type should reference an osmv_user_query_t
143 *		structure as input to the query. The port num and lid should
144 *		be provided by it.
145 *
146 *	OSMV_QUERY_PATH_REC_BY_PORT_GUIDS
147 *		Query for path records between the specified pair of port GUIDs.
148 *		Queries of this type should reference an osmv_guid_pair_t
149 *		structure that indicates the GUIDs of the path being requested.
150 *
151 *	OSMV_QUERY_PATH_REC_BY_GIDS
152 *		Query for path records between the specified pair of port GIDs.
153 *		Queries of this type should reference an osmv_gid_pair_t
154 *		structure that indicates the GIDs of the path being requested.
155 *
156 *	OSMV_QUERY_PATH_REC_BY_LIDS
157 *		Query for path records between the specified pair of port LIDs.
158 *		Queries of this type should reference an osmv_lid_pair_t
159 *		structure that indicates the LIDs of the path being requested.
160 *
161 * NOTES
162 *	This enum is used to define abstracted queries provided by the access
163 *	layer.  Users may issue queries not listed here by sending MADs directly
164 *	to subnet administration or a class manager.  These queries are
165 *	intended to represent those most often used by clients.
166 *
167 * SEE ALSO
168 *	osmv_query, osmv_query_req_t, osmv_user_query_t, osmv_gid_pair_t,
169 *	osmv_lid_pair_t osmv_guid_pair_t
170 *****/
171 
172 /****s* OpenSM Vendor SA Client/osmv_user_query_t
173 * NAME
174 *	osmv_user_query_t
175 *
176 * DESCRIPTION
177 *	User-defined query information.
178 *
179 * SYNOPSIS
180 */
181 typedef struct _osmv_user_query {
182 	uint8_t method;
183 	ib_net16_t attr_id;
184 	ib_net16_t attr_offset;
185 	ib_net32_t attr_mod;
186 	ib_net64_t comp_mask;
187 	void *p_attr;
188 } osmv_user_query_t;
189 /*
190 * FIELDS
191 *
192 *	method
193 *		Method to be used
194 *
195 *	attr_id
196 *		Attribute identifier of query data.
197 *
198 *	attr_offset
199 *		Size of the query attribute, in 8-byte words.  Users can set
200 *		this value by passing in the sizeof( attribute ) into the
201 *		ib_get_attr_offset() routine.
202 *
203 *	attr_mod
204 *		Attribute modifier for query request.
205 *
206 *	comp_mask
207 *		Indicates the attribute components that are specified for the
208 *		query.
209 *
210 *	p_attr
211 *		References the attribute structure used as input into the query.
212 *		This field is ignored if comp_mask is set to 0.
213 *
214 * NOTES
215 *	This structure is used to describe a user-defined query.  The attribute
216 *	ID, attribute offset, component mask, and attribute structure must match
217 *	those defined by the IBA specification.  Users should refer to chapter
218 *	15 of the IBA specification for additional details.
219 *
220 * SEE ALSO
221 *	osmv_query_type_t, ib_get_attr_offset, ib_get_attr_size, osmv_query_sa
222 *****/
223 
224 /****s* OpenSM Vendor SA Client/osmv_gid_pair_t
225 * NAME
226 *	osmv_gid_pair_t
227 *
228 * DESCRIPTION
229 *	Source and destination GIDs.
230 *
231 * SYNOPSIS
232 */
233 typedef struct _osmv_gid_pair {
234 	ib_gid_t src_gid;
235 	ib_gid_t dest_gid;
236 } osmv_gid_pair_t;
237 /*
238 * FIELDS
239 *	src_gid
240 *		Source GID of a path.
241 *
242 *	dest_gid
243 *		Destination GID of a path.
244 *
245 * NOTES
246 *	This structure is used to describe the endpoints of a path.
247 *
248 * SEE ALSO
249 *	ib_gid_t
250 *****/
251 
252 /****s* OpenSM Vendor SA Client/osmv_lid_pair_t
253 * NAME
254 *	osmv_lid_pair_t
255 *
256 * DESCRIPTION
257 *	Source and destination LIDs.
258 *
259 * SYNOPSIS
260 */
261 typedef struct _osmv_lid_pair {
262 	ib_net16_t src_lid;
263 	ib_net16_t dest_lid;
264 } osmv_lid_pair_t;
265 /*
266 * FIELDS
267 *	src_lid
268 *		Source LID of a path.
269 *
270 *	dest_lid
271 *		Destination LID of a path.
272 *
273 * NOTES
274 *	This structure is used to describe the endpoints of a path.
275 *****/
276 
277 /****s* OpenSM Vendor SA Client/osmv_guid_pair_t
278 * NAME
279 *	osmv_guid_pair_t
280 *
281 * DESCRIPTION
282 *	Source and destination GUIDs.  These may be port or channel adapter
283 *	GUIDs, depending on the context in which this structure is used.
284 *
285 * SYNOPSIS
286 */
287 typedef struct _osmv_guid_pair {
288 	ib_net64_t src_guid;
289 	ib_net64_t dest_guid;
290 } osmv_guid_pair_t;
291 /*
292 * FIELDS
293 *	src_guid
294 *		Source GUID of a path.
295 *
296 *	dest_guid
297 *		Destination GUID of a path.
298 *
299 * NOTES
300 *	This structure is used to describe the endpoints of a path.  The given
301 *	GUID pair may belong to either ports or channel adapters.
302 *
303 * SEE ALSO
304 *	ib_guid_t
305 *****/
306 
307 /****s* OpenSM Vendor SA Client/osmv_multipath_req_t
308 * NAME
309 *       osmv_multipath_req_t
310 *
311 * DESCRIPTION
312 *       Fields from which to generate a MultiPathRecord request.
313 *
314 * SYNOPSIS
315 */
316 typedef struct _osmv_multipath_req_t {
317 	ib_net64_t comp_mask;
318 	uint16_t pkey;
319 	boolean_t reversible;
320 	uint8_t num_path;
321 	uint8_t sl;
322 	uint8_t independence;
323 	uint8_t sgid_count;
324 	uint8_t dgid_count;
325 	ib_gid_t gids[IB_MULTIPATH_MAX_GIDS];
326 } osmv_multipath_req_t;
327 /*
328 * FIELDS
329 *
330 * NOTES
331 *       This structure is used to describe a multipath request.
332 *
333 * SEE ALSO
334 *****/
335 
336 /****s* OpenSM Vendor SA Client/osmv_query_res_t
337 * NAME
338 *	osmv_query_res_t
339 *
340 * DESCRIPTION
341 *	Contains the results of a subnet administration query.
342 *
343 * SYNOPSIS
344 */
345 typedef struct _osmv_query_res {
346 	const void *query_context;
347 	ib_api_status_t status;
348 	osmv_query_type_t query_type;
349 	uint32_t result_cnt;
350 	osm_madw_t *p_result_madw;
351 } osmv_query_res_t;
352 /*
353 * FIELDS
354 *	query_context
355 *		User-defined context information associated with the query
356 *		through the osm_vendor_query_sa call.
357 *
358 *	status
359 *		Indicates the success of the query operation.
360 *
361 *	query_type
362 *		Indicates the type of query for which the results are being
363 *		returned.  This matches the query_type specified through the
364 *               osm_vendor_query_sa call.
365 *
366 *	result_cnt
367 *		The number of result structures that were returned by the query.
368 *
369 *	p_result_madw
370 *		For queries returning IB_SUCCESS or IB_REMOTE_ERROR, this
371 *		references the MAD wrapper returned by subnet administration
372 *		containing the list of results or the returned error code.
373 *
374 * NOTES
375 *	A query result structure is returned to a client through their
376 *	osmv_pfn_query_cb_t routine to notify them of the results of a subnet
377 *	administration query.  If the query was successful or received an error
378 *	from subnet administration, p_result_madw will reference a MAD wrapper
379 *	containing the results.  The MAD referenced by p_result_madw is owned by
380 *	the user and remains available even after their callback returns.  Users
381 *	must call osm_mad_pool_put() to return the MAD wrapper back to the
382 *	mad pool when they are done accessing the results.
383 *
384 *	To retrieve individual result structures from the p_result_madw, users
385 *	may call osmv_get_query_result().
386 *
387 * SEE ALSO
388 *	osmv_query_sa, osmv_pfn_query_cb_t, ib_api_status_t,
389 *	osmv_query_status_t, osmv_query_type_t,
390 *	osmv_get_query_result
391 *****/
392 
393 /****f* OpenSM Vendor SA Client/osmv_get_query_result
394 * NAME
395 *	osmv_get_query_result
396 *
397 * DESCRIPTION
398 *	Retrieves a result structure from a MADW returned by a call to
399 *	osmv_query_sa().
400 *
401 * SYNOPSIS
402 */
403 static inline void *osmv_get_query_result(IN osm_madw_t * p_result_madw,
404 					  IN uint32_t result_index)
405 {
406 	ib_sa_mad_t *p_sa_mad;
407 
408 	CL_ASSERT(p_result_madw);
409 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
410 	CL_ASSERT(p_sa_mad);
411 	CL_ASSERT(ib_get_attr_size(p_sa_mad->attr_offset) * (result_index + 1) +
412 		  IB_SA_MAD_HDR_SIZE <= p_result_madw->mad_size);
413 
414 	return (p_sa_mad->data +
415 		(ib_get_attr_size(p_sa_mad->attr_offset) * result_index));
416 }
417 
418 /*
419 * PARAMETERS
420 *	p_result_madw
421 *		[in] This is a reference to the MAD returned as a result of the
422 *		query.
423 *
424 *	result_index
425 *		[in] A zero-based index indicating which result to return.
426 *
427 * NOTES
428 *	This call returns a pointer to the start of a result structure from a
429 *	call to osmv_query_sa().  The type of result structure must be known to
430 *	the user either through the user's context or the query_type returned as
431 *	part of the osmv_query_res_t structure.
432 *
433 * SEE ALSO
434 *	osmv_query_res_t, osm_madw_t
435 *****/
436 
437 /****f* OpenSM Vendor SA Client/osmv_get_query_path_rec
438 * NAME
439 *	osmv_get_query_path_rec
440 *
441 * DESCRIPTION
442 *	Retrieves a path record result from a MAD returned by a call to
443 *	osmv_query_sa().
444 *
445 * SYNOPSIS
446 */
447 static inline ib_path_rec_t *osmv_get_query_path_rec(IN osm_madw_t *
448 						     p_result_madw,
449 						     IN uint32_t result_index)
450 {
451 	ib_sa_mad_t __attribute__((__unused__)) *p_sa_mad;
452 
453 	CL_ASSERT(p_result_madw);
454 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
455 	CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_PATH_RECORD);
456 
457 	return ((ib_path_rec_t *)
458 		osmv_get_query_result(p_result_madw, result_index));
459 }
460 
461 /*
462 * PARAMETERS
463 *	p_result_madw
464 *		[in] This is a reference to the MAD returned as a result of the
465 *		query.
466 *
467 *	result_index
468 *		[in] A zero-based index indicating which result to return.
469 *
470 * NOTES
471 *	This call returns a pointer to the start of a path record result from
472 *	a call to osmv_query_sa().
473 *
474 * SEE ALSO
475 *	osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_path_rec_t
476 *****/
477 
478 /****f* OpenSM Vendor SA Client/osmv_get_query_portinfo_rec
479 * NAME
480 *	osmv_get_query_portinfo_rec
481 *
482 * DESCRIPTION
483 *	Retrieves a port info record result from a MAD returned by a call to
484 *	osmv_query_sa().
485 *
486 * SYNOPSIS
487 */
488 static inline ib_portinfo_record_t *osmv_get_query_portinfo_rec(IN osm_madw_t *
489 								p_result_madw,
490 								IN uint32_t
491 								result_index)
492 {
493 	ib_sa_mad_t __attribute__((__unused__)) *p_sa_mad;
494 
495 	CL_ASSERT(p_result_madw);
496 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
497 	CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_PORTINFO_RECORD);
498 
499 	return ((ib_portinfo_record_t *) osmv_get_query_result(p_result_madw,
500 							       result_index));
501 }
502 
503 /*
504 * PARAMETERS
505 *	p_result_madw
506 *		[in] This is a reference to the MAD returned as a result of the
507 *		query.
508 *
509 *	result_index
510 *		[in] A zero-based index indicating which result to return.
511 *
512 * NOTES
513 *	This call returns a pointer to the start of a port info record result
514 *	from a call to osmv_query_sa().
515 *
516 * SEE ALSO
517 *	osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_portinfo_record_t
518 *****/
519 
520 /****f* OpenSM Vendor SA Client/osmv_get_query_node_rec
521 * NAME
522 *	osmv_get_query_node_rec
523 *
524 * DESCRIPTION
525 *	Retrieves a node record result from a MAD returned by a call to
526 *	osmv_query_sa().
527 *
528 * SYNOPSIS
529 */
530 static inline ib_node_record_t *osmv_get_query_node_rec(IN osm_madw_t *
531 							p_result_madw,
532 							IN uint32_t
533 							result_index)
534 {
535 	ib_sa_mad_t __attribute__((__unused__)) *p_sa_mad;
536 
537 	CL_ASSERT(p_result_madw);
538 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
539 	CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_NODE_RECORD);
540 
541 	return ((ib_node_record_t *) osmv_get_query_result(p_result_madw,
542 							   result_index));
543 }
544 
545 /*
546 * PARAMETERS
547 *	p_result_madw
548 *		[in] This is a reference to the MAD returned as a result of the
549 *		query.
550 *
551 *	result_index
552 *		[in] A zero-based index indicating which result to return.
553 *
554 * NOTES
555 *	This call returns a pointer to the start of a node record result from
556 *	a call to osmv_query_sa().
557 *
558 * SEE ALSO
559 *	osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_node_record_t
560 *****/
561 
562 /****f* OpenSM Vendor SA Client/osmv_get_query_svc_rec
563 * NAME
564 *	osmv_get_query_svc_rec
565 *
566 * DESCRIPTION
567 *	Retrieves a service record result from a MAD returned by a call to
568 *	osmv_query_sa().
569 *
570 * SYNOPSIS
571 */
572 static inline ib_service_record_t *osmv_get_query_svc_rec(IN osm_madw_t *
573 							  p_result_madw,
574 							  IN uint32_t
575 							  result_index)
576 {
577 	ib_sa_mad_t __attribute__((__unused__)) *p_sa_mad;
578 
579 	CL_ASSERT(p_result_madw);
580 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
581 	CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_SERVICE_RECORD);
582 
583 	return ((ib_service_record_t *) osmv_get_query_result(p_result_madw,
584 							      result_index));
585 }
586 
587 /*
588 * PARAMETERS
589 *	p_result_madw
590 *		[in] This is a reference to the MAD returned as a result of the
591 *		query.
592 *
593 *	result_index
594 *		[in] A zero-based index indicating which result to return.
595 *
596 * NOTES
597 *	This call returns a pointer to the start of a service record result from
598 *	a call to osmv_query_sa().
599 *
600 * SEE ALSO
601 *	osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_service_record_t
602 *****/
603 
604 /****f* OpenSM Vendor SA Client/osmv_get_query_mc_rec
605 * NAME
606 *	osmv_get_query_mc_rec
607 *
608 * DESCRIPTION
609 *	Retrieves a multicast record result from a MAD returned by a call to
610 *	osmv_query_sa().
611 *
612 * SYNOPSIS
613 */
614 static inline ib_member_rec_t *osmv_get_query_mc_rec(IN osm_madw_t *
615 						     p_result_madw,
616 						     IN uint32_t result_index)
617 {
618 	ib_sa_mad_t __attribute__((__unused__)) *p_sa_mad;
619 
620 	CL_ASSERT(p_result_madw);
621 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
622 	CL_ASSERT(p_sa_mad && p_sa_mad->attr_id == IB_MAD_ATTR_MCMEMBER_RECORD);
623 
624 	return ((ib_member_rec_t *) osmv_get_query_result(p_result_madw,
625 							  result_index));
626 }
627 
628 /*
629 * PARAMETERS
630 *	p_result_madw
631 *		[in] This is a reference to the MAD returned as a result of the
632 *		query.
633 *
634 *	result_index
635 *		[in] A zero-based index indicating which result to return.
636 *
637 * NOTES
638 *	This call returns a pointer to the start of a service record result from
639 *	a call to osmv_query_sa().
640 *
641 * SEE ALSO
642 *	osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_member_rec_t
643 *****/
644 
645 /****f* OpenSM Vendor SA Client/osmv_get_query_inform_info_rec
646 * NAME
647 *	osmv_get_query_inform_info_rec
648 *
649 * DESCRIPTION
650 *	Retrieves an InformInfo record result from a MAD returned by
651 *	a call to osmv_query_sa().
652 *
653 * SYNOPSIS
654 */
655 static inline ib_inform_info_record_t *osmv_get_query_inform_info_rec(IN
656 								      osm_madw_t
657 								      *
658 								      p_result_madw,
659 								      IN
660 								      uint32_t
661 								      result_index)
662 {
663 	ib_sa_mad_t __attribute__((__unused__)) *p_sa_mad;
664 
665 	CL_ASSERT(p_result_madw);
666 	p_sa_mad = (ib_sa_mad_t *) osm_madw_get_mad_ptr(p_result_madw);
667 	CL_ASSERT(p_sa_mad
668 		  && p_sa_mad->attr_id == IB_MAD_ATTR_INFORM_INFO_RECORD);
669 
670 	return ((ib_inform_info_record_t *) osmv_get_query_result(p_result_madw,
671 								  result_index));
672 }
673 
674 /*
675 * PARAMETERS
676 *	p_result_madw
677 *		[in] This is a reference to the MAD returned as a result of the
678 *		query.
679 *
680 *	result_index
681 *		[in] A zero-based index indicating which result to return.
682 *
683 * NOTES
684 *	This call returns a pointer to the start of a service record result from
685 *	a call to osmv_query_sa().
686 *
687 * SEE ALSO
688 *	osmv_query_res_t, osm_madw_t, osmv_get_query_result, ib_inform_info_record_t
689 *****/
690 
691 /****f* OpenSM Vendor SA Client/osmv_pfn_query_cb_t
692 * NAME
693 *	osmv_pfn_query_cb_t
694 *
695 * DESCRIPTION
696 *	User-defined callback invoked on completion of subnet administration
697 *	query.
698 *
699 * SYNOPSIS
700 */
701 typedef void
702  (*osmv_pfn_query_cb_t) (IN osmv_query_res_t * p_query_res);
703 /*
704 * PARAMETERS
705 *	p_query_res
706 *		[in] This is a reference to a structure containing the result of
707 *		the query.
708 *
709 * NOTES
710 *	This routine is invoked to notify a client of the result of a subnet
711 *	administration query.  The p_query_rec parameter references the result
712 *	of the query and, in the case of a successful query, any information
713 *	returned by subnet administration.
714 *
715 *	In the kernel, this callback is usually invoked using a tasklet,
716 *	dependent on the implementation of the underlying verbs provider driver.
717 *
718 * SEE ALSO
719 *	osmv_query_res_t
720 *****/
721 
722 /****s* OpenSM Vendor SA Client/osmv_query_req_t
723 * NAME
724 *	osmv_query_req_t
725 *
726 * DESCRIPTION
727 *	Information used to request an access layer provided query of subnet
728 *	administration.
729 *
730 * SYNOPSIS
731 */
732 typedef struct _osmv_query_req {
733 	osmv_query_type_t query_type;
734 	const void *p_query_input;
735 	ib_net64_t sm_key;
736 
737 	uint32_t timeout_ms;
738 	uint32_t retry_cnt;
739 	osmv_flags_t flags;
740 
741 	const void *query_context;
742 	osmv_pfn_query_cb_t pfn_query_cb;
743 	int with_grh;
744 	ib_gid_t gid;
745 } osmv_query_req_t;
746 /*
747 * FIELDS
748 *	query_type
749 *		Indicates the type of query that the access layer should
750 *		perform.
751 *
752 *	p_query_input
753 *		A pointer to the input for the query.  The data referenced by
754 *		this structure is dependent on the type of query being requested
755 *		and is determined by the specified query_type.
756 *
757 *	sm_key
758 *		The SM_Key to be provided with the SA MAD for authentication.
759 *		Normally 0 is used.
760 *
761 *	timeout_ms
762 *		Specifies the number of milliseconds to wait for a response for
763 *		this query until retrying or timing out the request.
764 *
765 *	retry_cnt
766 *		Specifies the number of times that the query will be retried
767 *		before failing the request.
768 *
769 *	flags
770 *		Used to describe the mode of operation.  Set to IB_FLAGS_SYNC to
771 *		process the called routine synchronously.
772 *
773 *	query_context
774 *		User-defined context information associated with this query.
775 *		The context data is returned to the user as a part of their
776 *		query callback.
777 *
778 *	pfn_query_cb
779 *		A user-defined callback that is invoked upon completion of the
780 *		query.
781 *
782 *	with_grh
783 *		Indicates that SA queries should be sent with GRH.
784 *
785 *	gid
786 *		Used to store the SM/SA GID.
787 *
788 * NOTES
789 *	This structure is used when requesting an osm vendor provided query
790 *	of subnet administration.  Clients specify the type of query through
791 *	the query_type field.  Based on the type of query, the p_query_input
792 *	field is set to reference the appropriate data structure.
793 *
794 *	The information referenced by the p_query_input field is one of the
795 *	following:
796 *
797 *		-- a NULL terminated service name
798 *		-- a service id
799 *		-- a single GUID
800 *		-- a pair of GUIDs specified through an osmv_guid_pair_t structure
801 *		-- a pair of GIDs specified through an osmv_gid_pair_t structure
802 *
803 * SEE ALSO
804 *	osmv_query_type_t, osmv_pfn_query_cb_t, osmv_guid_pair_t,
805 *	osmv_gid_pair_t
806 *****/
807 
808 /****f* OpenSM Vendor SA Client/osmv_bind_sa
809 * NAME
810 *   osmv_bind_sa
811 *
812 * DESCRIPTION
813 *	Bind to the SA service and return a handle to be used for later
814 *  queries.
815 *
816 *
817 * SYNOPSIS
818 */
819 osm_bind_handle_t
820 osmv_bind_sa(IN osm_vendor_t * const p_vend,
821 	     IN osm_mad_pool_t * const p_mad_pool, IN ib_net64_t port_guid);
822 /*
823 * PARAMETERS
824 *   p_vend
825 *	[in] an osm_vendor object to work with
826 *
827 *   p_mad_pool
828 *	[in] mad pool to obtain madw from
829 *
830 *   port_guid
831 *	[in] the port guid to attach to.
832 *
833 * RETURN VALUE
834 *	Bind handle to be used for later SA queries or OSM_BIND_INVALID_HANDLE
835 *
836 * NOTES
837 *
838 * SEE ALSO
839 * osmv_query_sa
840 *********/
841 
842 /****f* OpenSM Vendor SA Client/osmv_query_sa
843 * NAME
844 *   osmv_query_sa
845 *
846 * DESCRIPTION
847 *   Query the SA given an SA query request (similar to IBAL ib_query).
848 *
849 * SYNOPSIS
850 */
851 ib_api_status_t
852 osmv_query_sa(IN osm_bind_handle_t h_bind,
853 	      IN const osmv_query_req_t * const p_query_req);
854 /*
855 * PARAMETERS
856 *   h_bind
857 *	[in] bind handle for this port. Should be previously
858 *       obtained by calling osmv_bind_sa
859 *
860 *   p_query_req
861 *	[in] an SA query request structure.
862 *
863 * RETURN VALUE
864 *	IB_SUCCESS if completed successfuly (or in ASYNC mode
865 *	if the request was sent).
866 *
867 * NOTES
868 *
869 * SEE ALSO
870 * osmv_bind_sa
871 *********/
872 
873 END_C_DECLS
874 #endif				/* _OSM_VENDOR_SA_API_H_ */
875