osm_madw.h revision 219820
1/*
2 * Copyright (c) 2004-2008 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 * 	Declaration of osm_mad_wrapper_t.
39 *	This object represents the context wrapper for OpenSM MAD processing.
40 *	This object is part of the OpenSM family of objects.
41 */
42
43#ifndef _OSM_MADW_H_
44#define _OSM_MADW_H_
45
46#include <string.h>
47#include <iba/ib_types.h>
48#include <complib/cl_qlist.h>
49#include <complib/cl_dispatcher.h>
50#include <opensm/osm_base.h>
51#include <vendor/osm_vendor.h>
52
53#ifdef __cplusplus
54#  define BEGIN_C_DECLS extern "C" {
55#  define END_C_DECLS   }
56#else				/* !__cplusplus */
57#  define BEGIN_C_DECLS
58#  define END_C_DECLS
59#endif				/* __cplusplus */
60
61BEGIN_C_DECLS
62/****s* OpenSM: MAD Wrapper/osm_bind_info_t
63* NAME
64*   osm_bind_info_t
65*
66* DESCRIPTION
67*
68* SYNOPSIS
69*/
70typedef struct osm_bind_info {
71	ib_net64_t port_guid;
72	uint8_t mad_class;
73	uint8_t class_version;
74	boolean_t is_responder;
75	boolean_t is_trap_processor;
76	boolean_t is_report_processor;
77	uint32_t send_q_size;
78	uint32_t recv_q_size;
79} osm_bind_info_t;
80/*
81* FIELDS
82*	portguid
83*		PortGuid of local port
84*
85*	mad_class
86*		Mgmt Class ID
87*
88*	class_version
89*		Mgmt Class version
90*
91*	is_responder
92*		True if this is a GSI Agent
93*
94*	is_trap_processor
95*		True if GSI Trap msgs are handled
96*
97*	is_report_processor
98*		True if GSI Report msgs are handled
99*
100*	send_q_size
101*		SendQueueSize
102*
103*	recv_q_size
104*		Receive Queue Size
105*
106* SEE ALSO
107*********/
108
109/****h* OpenSM/MAD Wrapper
110* NAME
111*	MAD Wrapper
112*
113* DESCRIPTION
114*	The MAD Wrapper object encapsulates the information needed by the
115*	OpenSM to manage individual MADs.  The OpenSM allocates one MAD Wrapper
116*	per MAD.
117*
118*	The MAD Wrapper is not thread safe, thus callers must provide
119*	serialization.
120*
121*	This object should be treated as opaque and should be
122*	manipulated only through the provided functions.
123*
124* AUTHOR
125*	Steve King, Intel
126*
127*********/
128
129/****s* OpenSM: MAD Wrapper/osm_ni_context_t
130* NAME
131*	osm_ni_context_t
132*
133* DESCRIPTION
134*	Context needed by recipient of NodeInfo attribute.
135*
136* SYNOPSIS
137*/
138typedef struct osm_ni_context {
139	ib_net64_t node_guid;
140	uint8_t port_num;
141	ib_net64_t dup_node_guid;
142	uint8_t dup_port_num;
143	unsigned dup_count;
144} osm_ni_context_t;
145/*
146* FIELDS
147*	p_node
148*		Pointer to the node thru which we got to this node.
149*
150*	p_sw
151*		Pointer to the switch object (if any) of the switch
152*		thru which we got to this node.
153*
154*	port_num
155*		Port number on the node or switch thru which we got
156*		to this node.
157*
158* SEE ALSO
159*********/
160
161/****s* OpenSM: MAD Wrapper/osm_pi_context_t
162* NAME
163*	osm_pi_context_t
164*
165* DESCRIPTION
166*	Context needed by recipient of PortInfo attribute.
167*
168* SYNOPSIS
169*/
170typedef struct osm_pi_context {
171	ib_net64_t node_guid;
172	ib_net64_t port_guid;
173	boolean_t set_method;
174	boolean_t light_sweep;
175	boolean_t active_transition;
176} osm_pi_context_t;
177/*********/
178
179/****s* OpenSM: MAD Wrapper/osm_nd_context_t
180* NAME
181*	osm_nd_context_t
182*
183* DESCRIPTION
184*	Context needed by recipient of NodeDescription attribute.
185*
186* SYNOPSIS
187*/
188typedef struct osm_nd_context {
189	ib_net64_t node_guid;
190} osm_nd_context_t;
191/*********/
192
193/****s* OpenSM: MAD Wrapper/osm_si_context_t
194* NAME
195*	osm_si_context_t
196*
197* DESCRIPTION
198*	Context needed by recipient of SwitchInfo attribute.
199*
200* SYNOPSIS
201*/
202typedef struct osm_si_context {
203	ib_net64_t node_guid;
204	boolean_t set_method;
205	boolean_t light_sweep;
206} osm_si_context_t;
207/*********/
208
209/****s* OpenSM: MAD Wrapper/osm_lft_context_t
210* NAME
211*	osm_lft_context_t
212*
213* DESCRIPTION
214*	Context needed by recipient of LinearForwardingTable attribute.
215*
216* SYNOPSIS
217*/
218typedef struct osm_lft_context {
219	ib_net64_t node_guid;
220	boolean_t set_method;
221} osm_lft_context_t;
222/*********/
223
224/****s* OpenSM: MAD Wrapper/osm_mft_context_t
225* NAME
226*	osm_mft_context_t
227*
228* DESCRIPTION
229*	Context needed by recipient of MulticastForwardingTable attribute.
230*
231* SYNOPSIS
232*/
233typedef struct osm_mft_context {
234	ib_net64_t node_guid;
235	boolean_t set_method;
236} osm_mft_context_t;
237/*********/
238
239/****s* OpenSM: MAD Wrapper/osm_smi_context_t
240* NAME
241*	osm_smi_context_t
242*
243* DESCRIPTION
244*	Context needed by recipient of SMInfo attribute.
245*
246* SYNOPSIS
247*/
248typedef struct osm_smi_context {
249	ib_net64_t port_guid;
250	boolean_t set_method;
251	boolean_t light_sweep;
252} osm_smi_context_t;
253/*********/
254
255/****s* OpenSM: MAD Wrapper/osm_pkey_context_t
256* NAME
257*	osm_pkey_context_t
258*
259* DESCRIPTION
260*	Context needed by recipient of P_Key attribute.
261*
262* SYNOPSIS
263*/
264typedef struct osm_pkey_context {
265	ib_net64_t node_guid;
266	ib_net64_t port_guid;
267	boolean_t set_method;
268} osm_pkey_context_t;
269/*********/
270
271/****s* OpenSM: MAD Wrapper/osm_slvl_context_t
272* NAME
273*	osm_slvl_context_t
274*
275* DESCRIPTION
276*	Context needed by recipient of PortInfo attribute.
277*
278* SYNOPSIS
279*/
280typedef struct osm_slvl_context {
281	ib_net64_t node_guid;
282	ib_net64_t port_guid;
283	boolean_t set_method;
284} osm_slvl_context_t;
285/*********/
286
287/****s* OpenSM: MAD Wrapper/osm_vla_context_t
288* NAME
289*	osm_vla_context_t
290*
291* DESCRIPTION
292*	Context needed by recipient of VL Arb attribute.
293*
294* SYNOPSIS
295*/
296typedef struct osm_vla_context {
297	ib_net64_t node_guid;
298	ib_net64_t port_guid;
299	boolean_t set_method;
300} osm_vla_context_t;
301/*********/
302
303/****s* OpenSM: MAD Wrapper/osm_perfmgr_context_t
304* DESCRIPTION
305*	Context for Performance manager queries
306*/
307typedef struct osm_perfmgr_context {
308	uint64_t node_guid;
309	uint16_t port;
310	uint8_t mad_method;	/* was this a get or a set */
311#if ENABLE_OSM_PERF_MGR_PROFILE
312	struct timeval query_start;
313#endif
314} osm_perfmgr_context_t;
315/*********/
316
317#ifndef OSM_VENDOR_INTF_OPENIB
318/****s* OpenSM: MAD Wrapper/osm_arbitrary_context_t
319* NAME
320*	osm_arbitrary_context_t
321*
322* DESCRIPTION
323*	Context needed by arbitrary recipient.
324*
325* SYNOPSIS
326*/
327typedef struct osm_arbitrary_context {
328	void *context1;
329	void *context2;
330} osm_arbitrary_context_t;
331/*********/
332#endif
333
334/****s* OpenSM: MAD Wrapper/osm_madw_context_t
335* NAME
336*	osm_madw_context_t
337*
338* DESCRIPTION
339*	Context needed by recipients of MAD responses.
340*
341* SYNOPSIS
342*/
343typedef union _osm_madw_context {
344	osm_ni_context_t ni_context;
345	osm_pi_context_t pi_context;
346	osm_nd_context_t nd_context;
347	osm_si_context_t si_context;
348	osm_lft_context_t lft_context;
349	osm_mft_context_t mft_context;
350	osm_smi_context_t smi_context;
351	osm_slvl_context_t slvl_context;
352	osm_pkey_context_t pkey_context;
353	osm_vla_context_t vla_context;
354	osm_perfmgr_context_t perfmgr_context;
355#ifndef OSM_VENDOR_INTF_OPENIB
356	osm_arbitrary_context_t arb_context;
357#endif
358} osm_madw_context_t;
359/*********/
360
361/****s* OpenSM: MAD Wrapper/osm_mad_addr_t
362* NAME
363*   osm_mad_addr_t
364*
365* DESCRIPTION
366*
367* SYNOPSIS
368*/
369typedef struct osm_mad_addr {
370	ib_net16_t dest_lid;
371	uint8_t path_bits;
372	uint8_t static_rate;
373	union addr_type {
374		struct _smi {
375			ib_net16_t source_lid;
376			uint8_t port_num;
377		} smi;
378
379		struct _gsi {
380			ib_net32_t remote_qp;
381			ib_net32_t remote_qkey;
382			uint16_t pkey_ix;
383			uint8_t service_level;
384			boolean_t global_route;
385			ib_grh_t grh_info;
386		} gsi;
387	} addr_type;
388} osm_mad_addr_t;
389/*
390* FIELDS
391*
392* SEE ALSO
393*********/
394
395/****s* OpenSM: MAD Wrapper/osm_madw_t
396* NAME
397*	osm_madw_t
398*
399* DESCRIPTION
400*	Context needed for processing individual MADs
401*
402* SYNOPSIS
403*/
404typedef struct osm_madw {
405	cl_list_item_t list_item;
406	osm_bind_handle_t h_bind;
407	osm_vend_wrap_t vend_wrap;
408	osm_mad_addr_t mad_addr;
409	osm_bind_info_t bind_info;
410	osm_madw_context_t context;
411	uint32_t mad_size;
412	ib_api_status_t status;
413	cl_disp_msgid_t fail_msg;
414	boolean_t resp_expected;
415	const ib_mad_t *p_mad;
416} osm_madw_t;
417/*
418* FIELDS
419*	list_item
420*		List linkage for lists.  MUST BE FIRST MEMBER!
421*
422*	h_bind
423*		Bind handle for the port on which this MAD will be sent
424*		or was received.
425*
426*	vend_wrap
427*		Transport vendor specific context.  This structure is not
428*		used outside MAD transport vendor specific code.
429*
430*	context
431*		Union of controller specific contexts needed for this MAD.
432*		This structure allows controllers to indirectly communicate
433*		with each other through the dispatcher.
434*
435*	mad_size
436*		Size of this MAD in bytes.
437*
438*	status
439*		Status of completed operation on the MAD.
440*		CL_SUCCESS if the operation was successful.
441*
442*	fail_msg
443*		Dispatcher message with which to post this MAD on failure.
444*		This value is set by the originator of the MAD.
445*		If an operation on this MAD fails, for example due to a timeout,
446*		then the transport layer will dispose of the MAD by sending
447*		it through the Dispatcher with this message type.  Presumably,
448*		there is a controller listening for the failure message that can
449*		properly clean up.
450*
451*	resp_expected
452*		TRUE if a response is expected to this MAD.
453*		FALSE otherwise.
454*
455*	p_mad
456*		Pointer to the wire MAD.  The MAD itself cannot be part of the
457*		wrapper, since wire MADs typically reside in special memory
458*		registered with the local HCA.
459*
460* SEE ALSO
461*********/
462
463/****f* OpenSM: MAD Wrapper/osm_madw_init
464* NAME
465*	osm_madw_init
466*
467* DESCRIPTION
468*	Initializes a MAD Wrapper object for use.
469*
470* SYNOPSIS
471*/
472static inline void
473osm_madw_init(IN osm_madw_t * const p_madw,
474	      IN osm_bind_handle_t h_bind,
475	      IN const uint32_t mad_size,
476	      IN const osm_mad_addr_t * const p_mad_addr)
477{
478	memset(p_madw, 0, sizeof(*p_madw));
479	p_madw->h_bind = h_bind;
480	p_madw->fail_msg = CL_DISP_MSGID_NONE;
481	p_madw->mad_size = mad_size;
482	if (p_mad_addr)
483		p_madw->mad_addr = *p_mad_addr;
484	p_madw->resp_expected = FALSE;
485}
486
487/*
488* PARAMETERS
489*	p_madw
490*		[in] Pointer to an osm_madw_t object to initialize.
491*
492*	h_bind
493*		[in] Pointer to the wire MAD.
494*
495*	p_mad_addr
496*		[in] Pointer to the MAD address structure.  This parameter may
497*		be NULL for directed route MADs.
498*
499* RETURN VALUES
500*	None.
501*
502* NOTES
503*
504* SEE ALSO
505*********/
506
507/****f* OpenSM: MAD Wrapper/osm_madw_get_smp_ptr
508* NAME
509*	osm_madw_get_smp_ptr
510*
511* DESCRIPTION
512*	Gets a pointer to the SMP in this MAD.
513*
514* SYNOPSIS
515*/
516static inline ib_smp_t *osm_madw_get_smp_ptr(IN const osm_madw_t * const p_madw)
517{
518	return ((ib_smp_t *) p_madw->p_mad);
519}
520
521/*
522* PARAMETERS
523*	p_madw
524*		[in] Pointer to an osm_madw_t object to initialize.
525*
526* RETURN VALUES
527*	Pointer to the start of the SMP MAD.
528*
529* NOTES
530*
531* SEE ALSO
532*	MAD Wrapper object
533*********/
534
535/****f* OpenSM: MAD Wrapper/osm_madw_get_sa_mad_ptr
536* NAME
537*	osm_madw_get_sa_mad_ptr
538*
539* DESCRIPTION
540*	Gets a pointer to the SA MAD in this MAD wrapper.
541*
542* SYNOPSIS
543*/
544static inline ib_sa_mad_t *osm_madw_get_sa_mad_ptr(IN const osm_madw_t *
545						   const p_madw)
546{
547	return ((ib_sa_mad_t *) p_madw->p_mad);
548}
549
550/*
551* PARAMETERS
552*	p_madw
553*		[in] Pointer to an osm_madw_t object.
554*
555* RETURN VALUES
556*	Pointer to the start of the SA MAD.
557*
558* NOTES
559*
560* SEE ALSO
561*	MAD Wrapper object
562*********/
563
564/****f* OpenSM: MAD Wrapper/osm_madw_get_perfmgt_mad_ptr
565* DESCRIPTION
566*	Gets a pointer to the PerfMgt MAD in this MAD wrapper.
567*
568* SYNOPSIS
569*/
570static inline ib_perfmgt_mad_t *osm_madw_get_perfmgt_mad_ptr(IN const osm_madw_t
571							     * const p_madw)
572{
573	return ((ib_perfmgt_mad_t *) p_madw->p_mad);
574}
575
576/*
577* PARAMETERS
578*	p_madw
579*		[in] Pointer to an osm_madw_t object.
580*
581* RETURN VALUES
582*	Pointer to the start of the PerfMgt MAD.
583*
584* NOTES
585*
586* SEE ALSO
587*	MAD Wrapper object
588*********/
589
590/****f* OpenSM: MAD Wrapper/osm_madw_get_ni_context_ptr
591* NAME
592*	osm_madw_get_ni_context_ptr
593*
594* DESCRIPTION
595*	Gets a pointer to the NodeInfo context in this MAD.
596*
597* SYNOPSIS
598*/
599static inline osm_ni_context_t *osm_madw_get_ni_context_ptr(IN const osm_madw_t
600							    * const p_madw)
601{
602	return ((osm_ni_context_t *) & p_madw->context);
603}
604
605/*
606* PARAMETERS
607*	p_madw
608*		[in] Pointer to an osm_madw_t object.
609*
610* RETURN VALUES
611*	Pointer to the start of the context structure.
612*
613* NOTES
614*
615* SEE ALSO
616*********/
617
618/****f* OpenSM: MAD Wrapper/osm_madw_get_pi_context_ptr
619* NAME
620*	osm_madw_get_pi_context_ptr
621*
622* DESCRIPTION
623*	Gets a pointer to the PortInfo context in this MAD.
624*
625* SYNOPSIS
626*/
627static inline osm_pi_context_t *osm_madw_get_pi_context_ptr(IN const osm_madw_t
628							    * const p_madw)
629{
630	return ((osm_pi_context_t *) & p_madw->context);
631}
632
633/*
634* PARAMETERS
635*	p_madw
636*		[in] Pointer to an osm_madw_t object.
637*
638* RETURN VALUES
639*	Pointer to the start of the context structure.
640*
641* NOTES
642*
643* SEE ALSO
644*********/
645
646/****f* OpenSM: MAD Wrapper/osm_madw_get_nd_context_ptr
647* NAME
648*	osm_madw_get_nd_context_ptr
649*
650* DESCRIPTION
651*	Gets a pointer to the NodeDescription context in this MAD.
652*
653* SYNOPSIS
654*/
655static inline osm_nd_context_t *osm_madw_get_nd_context_ptr(IN const osm_madw_t
656							    * const p_madw)
657{
658	return ((osm_nd_context_t *) & p_madw->context);
659}
660
661/*
662* PARAMETERS
663*	p_madw
664*		[in] Pointer to an osm_madw_t object.
665*
666* RETURN VALUES
667*	Pointer to the start of the context structure.
668*
669* NOTES
670*
671* SEE ALSO
672*********/
673
674/****f* OpenSM: MAD Wrapper/osm_madw_get_lft_context_ptr
675* NAME
676*	osm_madw_get_lft_context_ptr
677*
678* DESCRIPTION
679*	Gets a pointer to the LFT context in this MAD.
680*
681* SYNOPSIS
682*/
683static inline osm_lft_context_t *osm_madw_get_lft_context_ptr(IN const
684							      osm_madw_t *
685							      const p_madw)
686{
687	return ((osm_lft_context_t *) & p_madw->context);
688}
689
690/*
691* PARAMETERS
692*	p_madw
693*		[in] Pointer to an osm_madw_t object.
694*
695* RETURN VALUES
696*	Pointer to the start of the context structure.
697*
698* NOTES
699*
700* SEE ALSO
701*********/
702
703/****f* OpenSM: MAD Wrapper/osm_madw_get_mft_context_ptr
704* NAME
705*	osm_madw_get_mft_context_ptr
706*
707* DESCRIPTION
708*	Gets a pointer to the MFT context in this MAD.
709*
710* SYNOPSIS
711*/
712static inline osm_mft_context_t *osm_madw_get_mft_context_ptr(IN const
713							      osm_madw_t *
714							      const p_madw)
715{
716	return ((osm_mft_context_t *) & p_madw->context);
717}
718
719/*
720* PARAMETERS
721*	p_madw
722*		[in] Pointer to an osm_madw_t object.
723*
724* RETURN VALUES
725*	Pointer to the start of the context structure.
726*
727* NOTES
728*
729* SEE ALSO
730*********/
731
732/****f* OpenSM: MAD Wrapper/osm_madw_get_si_context_ptr
733* NAME
734*	osm_madw_get_si_context_ptr
735*
736* DESCRIPTION
737*	Gets a pointer to the SwitchInfo context in this MAD.
738*
739* SYNOPSIS
740*/
741static inline osm_si_context_t *osm_madw_get_si_context_ptr(IN const osm_madw_t
742							    * const p_madw)
743{
744	return ((osm_si_context_t *) & p_madw->context);
745}
746
747/*
748* PARAMETERS
749*	p_madw
750*		[in] Pointer to an osm_madw_t object.
751*
752* RETURN VALUES
753*	Pointer to the start of the context structure.
754*
755* NOTES
756*
757* SEE ALSO
758*********/
759
760/****f* OpenSM: MAD Wrapper/osm_madw_get_smi_context_ptr
761* NAME
762*	osm_madw_get_smi_context_ptr
763*
764* DESCRIPTION
765*	Gets a pointer to the SMInfo context in this MAD.
766*
767* SYNOPSIS
768*/
769static inline osm_smi_context_t *osm_madw_get_smi_context_ptr(IN const
770							      osm_madw_t *
771							      const p_madw)
772{
773	return ((osm_smi_context_t *) & p_madw->context);
774}
775
776/*
777* PARAMETERS
778*	p_madw
779*		[in] Pointer to an osm_madw_t object.
780*
781* RETURN VALUES
782*	Pointer to the start of the context structure.
783*
784* NOTES
785*
786* SEE ALSO
787*********/
788
789/****f* OpenSM: MAD Wrapper/osm_madw_get_pkey_context_ptr
790* NAME
791*	osm_madw_get_pkey_context_ptr
792*
793* DESCRIPTION
794*	Gets a pointer to the P_Key context in this MAD.
795*
796* SYNOPSIS
797*/
798static inline osm_pkey_context_t *osm_madw_get_pkey_context_ptr(IN const
799								osm_madw_t *
800								const p_madw)
801{
802	return ((osm_pkey_context_t *) & p_madw->context);
803}
804
805/*
806* PARAMETERS
807*	p_madw
808*		[in] Pointer to an osm_madw_t object.
809*
810* RETURN VALUES
811*	Pointer to the start of the context structure.
812*
813* NOTES
814*
815* SEE ALSO
816*********/
817
818/****f* OpenSM: MAD Wrapper/osm_madw_get_slvl_context_ptr
819* NAME
820*	osm_madw_get_slvl_context_ptr
821*
822* DESCRIPTION
823*	Gets a pointer to the PortInfo context in this MAD.
824*
825* SYNOPSIS
826*/
827static inline osm_slvl_context_t *osm_madw_get_slvl_context_ptr(IN const
828								osm_madw_t *
829								const p_madw)
830{
831	return ((osm_slvl_context_t *) & p_madw->context);
832}
833
834/*
835* PARAMETERS
836*	p_madw
837*		[in] Pointer to an osm_madw_t object.
838*
839* RETURN VALUES
840*	Pointer to the start of the context structure.
841*
842* NOTES
843*
844* SEE ALSO
845*********/
846
847/****f* OpenSM: MAD Wrapper/osm_madw_get_vla_context_ptr
848* NAME
849*	osm_madw_get_vla_context_ptr
850*
851* DESCRIPTION
852*	Gets a pointer to the Vl Arb context in this MAD.
853*
854* SYNOPSIS
855*/
856static inline osm_vla_context_t *osm_madw_get_vla_context_ptr(IN const
857							      osm_madw_t *
858							      const p_madw)
859{
860	return ((osm_vla_context_t *) & p_madw->context);
861}
862
863/*
864* PARAMETERS
865*	p_madw
866*		[in] Pointer to an osm_madw_t object.
867*
868* RETURN VALUES
869*	Pointer to the start of the context structure.
870*
871* NOTES
872*
873* SEE ALSO
874*********/
875
876#ifndef OSM_VENDOR_INTF_OPENIB
877/****f* OpenSM: MAD Wrapper/osm_madw_get_arbitrary_context_ptr
878* NAME
879*	osm_madw_get_arbitrary_context_ptr
880*
881* DESCRIPTION
882*	Gets a pointer to the arbitrary context in this MAD.
883*
884* SYNOPSIS
885*/
886static inline osm_arbitrary_context_t *osm_madw_get_arbitrary_context_ptr(IN
887									  const
888									  osm_madw_t
889									  *
890									  const
891									  p_madw)
892{
893	return ((osm_arbitrary_context_t *) & p_madw->context);
894}
895
896/*
897* PARAMETERS
898*	p_madw
899*		[in] Pointer to an osm_madw_t object.
900*
901* RETURN VALUES
902*	Pointer to the start of the context structure.
903*
904* NOTES
905*
906* SEE ALSO
907*********/
908#endif
909
910/****f* OpenSM: MAD Wrapper/osm_madw_get_vend_ptr
911* NAME
912*	osm_madw_get_vend_ptr
913*
914* DESCRIPTION
915*	Gets a pointer to the vendor specific MAD wrapper component.
916*
917* SYNOPSIS
918*/
919static inline osm_vend_wrap_t *osm_madw_get_vend_ptr(IN const osm_madw_t *
920						     const p_madw)
921{
922	return ((osm_vend_wrap_t *) & p_madw->vend_wrap);
923}
924
925/*
926* PARAMETERS
927*	p_madw
928*		[in] Pointer to an osm_madw_t object.
929*
930* RETURN VALUES
931*	Gets a pointer to the vendor specific MAD wrapper component.
932*
933* NOTES
934*
935* SEE ALSO
936*********/
937
938/****f* OpenSM: MAD Wrapper/osm_madw_get_vend_ptr
939* NAME
940*	osm_madw_get_vend_ptr
941*
942* DESCRIPTION
943*	Returns the bind handle associated with this MAD.
944*
945* SYNOPSIS
946*/
947static inline osm_bind_handle_t
948osm_madw_get_bind_handle(IN const osm_madw_t * const p_madw)
949{
950	return ((osm_bind_handle_t) p_madw->h_bind);
951}
952
953/*
954* PARAMETERS
955*	p_madw
956*		[in] Pointer to an osm_madw_t object.
957*
958* RETURN VALUES
959*	Returns the bind handle associated with this MAD.
960*
961* NOTES
962*
963* SEE ALSO
964*********/
965
966/****f* OpenSM: MAD Wrapper/osm_madw_get_mad_addr_ptr
967* NAME
968*	osm_madw_get_mad_addr_ptr
969*
970* DESCRIPTION
971*	Returns the mad address structure associated with this MAD.
972*
973* SYNOPSIS
974*/
975static inline osm_mad_addr_t *osm_madw_get_mad_addr_ptr(IN const osm_madw_t *
976							const p_madw)
977{
978	return ((osm_mad_addr_t *) & p_madw->mad_addr);
979}
980
981/*
982* PARAMETERS
983*	p_madw
984*		[in] Pointer to an osm_madw_t object.
985*
986* RETURN VALUES
987*	Returns the mad address structure associated with this MAD.
988*
989* NOTES
990*
991* SEE ALSO
992*********/
993
994/****f* OpenSM: MAD Wrapper/osm_madw_get_mad_ptr
995* NAME
996*	osm_madw_get_mad_ptr
997*
998* DESCRIPTION
999*	Returns the mad address structure associated with this MAD.
1000*
1001* SYNOPSIS
1002*/
1003static inline ib_mad_t *osm_madw_get_mad_ptr(IN const osm_madw_t * const p_madw)
1004{
1005	return ((ib_mad_t *) p_madw->p_mad);
1006}
1007
1008/*
1009* PARAMETERS
1010*	p_madw
1011*		[in] Pointer to an osm_madw_t object.
1012*
1013* RETURN VALUES
1014*	Returns the mad address structure associated with this MAD.
1015*
1016* NOTES
1017*
1018* SEE ALSO
1019*********/
1020
1021/****f* OpenSM: MAD Wrapper/osm_madw_get_err_msg
1022* NAME
1023*	osm_madw_get_err_msg
1024*
1025* DESCRIPTION
1026*	Returns the message with which to post this mad wrapper if
1027*	an error occurs during processing the mad.
1028*
1029* SYNOPSIS
1030*/
1031static inline cl_disp_msgid_t
1032osm_madw_get_err_msg(IN const osm_madw_t * const p_madw)
1033{
1034	return ((cl_disp_msgid_t) p_madw->fail_msg);
1035}
1036
1037/*
1038* PARAMETERS
1039*	p_madw
1040*		[in] Pointer to an osm_madw_t object.
1041*
1042* RETURN VALUES
1043*	Returns the message with which to post this mad wrapper if
1044*	an error occurs during processing the mad.
1045*
1046* NOTES
1047*
1048* SEE ALSO
1049*********/
1050
1051/****f* OpenSM: MAD Wrapper/osm_madw_set_mad
1052* NAME
1053*	osm_madw_set_mad
1054*
1055* DESCRIPTION
1056*	Associates a wire MAD with this MAD Wrapper object.
1057*
1058* SYNOPSIS
1059*/
1060static inline void
1061osm_madw_set_mad(IN osm_madw_t * const p_madw, IN const ib_mad_t * const p_mad)
1062{
1063	p_madw->p_mad = p_mad;
1064}
1065
1066/*
1067* PARAMETERS
1068*	p_madw
1069*		[in] Pointer to an osm_madw_t object.
1070*
1071*	p_mad
1072*		[in] Pointer to the wire MAD to attach to this wrapper.
1073*
1074* RETURN VALUES
1075*	None.
1076*
1077* NOTES
1078*
1079* SEE ALSO
1080*********/
1081
1082/****f* OpenSM: MAD Wrapper/osm_madw_copy_context
1083* NAME
1084*	osm_madw_copy_context
1085*
1086* DESCRIPTION
1087*	Copies the controller context from one MAD Wrapper to another.
1088*
1089* SYNOPSIS
1090*/
1091static inline void
1092osm_madw_copy_context(IN osm_madw_t * const p_dest,
1093		      IN const osm_madw_t * const p_src)
1094{
1095	p_dest->context = p_src->context;
1096}
1097
1098/*
1099* PARAMETERS
1100*	p_dest
1101*		[in] Pointer to the destination osm_madw_t object.
1102*
1103*	p_src
1104*		[in] Pointer to the source osm_madw_t object.
1105*
1106* RETURN VALUES
1107*	None.
1108*
1109* NOTES
1110*
1111* SEE ALSO
1112*********/
1113
1114END_C_DECLS
1115#endif				/* _OSM_MADW_H_ */
1116