1/*
2 * Copyright (c) 2004-2009 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_sm_mad_ctrl_t.
39 *	This object represents a controller that receives the IBA NodeInfo
40 *	attribute from a node.
41 *	This object is part of the OpenSM family of objects.
42 */
43
44#ifndef _OSM_SM_MAD_CTRL_H_
45#define _OSM_SM_MAD_CTRL_H_
46
47#include <complib/cl_passivelock.h>
48#include <complib/cl_dispatcher.h>
49#include <opensm/osm_base.h>
50#include <opensm/osm_stats.h>
51#include <opensm/osm_madw.h>
52#include <opensm/osm_mad_pool.h>
53#include <opensm/osm_subnet.h>
54#include <opensm/osm_log.h>
55#include <opensm/osm_vl15intf.h>
56
57#ifdef __cplusplus
58#  define BEGIN_C_DECLS extern "C" {
59#  define END_C_DECLS   }
60#else				/* !__cplusplus */
61#  define BEGIN_C_DECLS
62#  define END_C_DECLS
63#endif				/* __cplusplus */
64
65BEGIN_C_DECLS
66/****h* OpenSM/SM MAD Controller
67* NAME
68*	SM MAD Controller
69*
70* DESCRIPTION
71*	The SM MAD Controller object encapsulates
72*	the information	needed to receive MADs from the transport layer.
73*
74*	The SM MAD Controller object is thread safe.
75*
76*	This object should be treated as opaque and should be
77*	manipulated only through the provided functions.
78*
79* AUTHOR
80*	Steve King, Intel
81*
82*********/
83/****s* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_t
84* NAME
85*	osm_sm_mad_ctrl_t
86*
87* DESCRIPTION
88*	SM MAD Controller structure.
89*
90*	This object should be treated as opaque and should
91*	be manipulated only through the provided functions.
92*
93* SYNOPSIS
94*/
95typedef struct osm_sm_mad_ctrl {
96	osm_log_t *p_log;
97	osm_subn_t *p_subn;
98	osm_mad_pool_t *p_mad_pool;
99	osm_vl15_t *p_vl15;
100	osm_vendor_t *p_vendor;
101	osm_bind_handle_t h_bind;
102	cl_plock_t *p_lock;
103	cl_dispatcher_t *p_disp;
104	cl_disp_reg_handle_t h_disp;
105	osm_stats_t *p_stats;
106} osm_sm_mad_ctrl_t;
107/*
108* FIELDS
109*	p_log
110*		Pointer to the log object.
111*
112*	p_subn
113*		Pointer to the subnet object.
114*
115*	p_mad_pool
116*		Pointer to the MAD pool.
117*
118*	p_vendor
119*		Pointer to the vendor specific interfaces object.
120*
121*	h_bind
122*		Bind handle returned by the transport layer.
123*
124*	p_lock
125*		Pointer to the serializing lock.
126*
127*	p_disp
128*		Pointer to the Dispatcher.
129*
130*	h_disp
131*		Handle returned from dispatcher registration.
132*
133*	p_stats
134*		Pointer to the OpenSM statistics block.
135*
136* SEE ALSO
137*	SM MAD Controller object
138*	SM MADr object
139*********/
140
141/****f* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_construct
142* NAME
143*	osm_sm_mad_ctrl_construct
144*
145* DESCRIPTION
146*	This function constructs a SM MAD Controller object.
147*
148* SYNOPSIS
149*/
150void osm_sm_mad_ctrl_construct(IN osm_sm_mad_ctrl_t * p_ctrl);
151/*
152* PARAMETERS
153*	p_ctrl
154*		[in] Pointer to a SM MAD Controller
155*		object to construct.
156*
157* RETURN VALUE
158*	This function does not return a value.
159*
160* NOTES
161*	Allows calling osm_sm_mad_ctrl_init, and osm_sm_mad_ctrl_destroy.
162*
163*	Calling osm_sm_mad_ctrl_construct is a prerequisite to calling any other
164*	method except osm_sm_mad_ctrl_init.
165*
166* SEE ALSO
167*	SM MAD Controller object, osm_sm_mad_ctrl_init,
168*	osm_sm_mad_ctrl_destroy
169*********/
170
171/****f* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_destroy
172* NAME
173*	osm_sm_mad_ctrl_destroy
174*
175* DESCRIPTION
176*	The osm_sm_mad_ctrl_destroy function destroys the object, releasing
177*	all resources.
178*
179* SYNOPSIS
180*/
181void osm_sm_mad_ctrl_destroy(IN osm_sm_mad_ctrl_t * p_ctrl);
182/*
183* PARAMETERS
184*	p_ctrl
185*		[in] Pointer to the object to destroy.
186*
187* RETURN VALUE
188*	This function does not return a value.
189*
190* NOTES
191*	Performs any necessary cleanup of the specified
192*	SM MAD Controller object.
193*	Further operations should not be attempted on the destroyed object.
194*	This function should only be called after a call to
195*	osm_sm_mad_ctrl_construct or osm_sm_mad_ctrl_init.
196*
197* SEE ALSO
198*	SM MAD Controller object, osm_sm_mad_ctrl_construct,
199*	osm_sm_mad_ctrl_init
200*********/
201
202/****f* OpenSM: SM MAD Controller/osm_sm_mad_ctrl_init
203* NAME
204*	osm_sm_mad_ctrl_init
205*
206* DESCRIPTION
207*	The osm_sm_mad_ctrl_init function initializes a
208*	SM MAD Controller object for use.
209*
210* SYNOPSIS
211*/
212ib_api_status_t osm_sm_mad_ctrl_init(IN osm_sm_mad_ctrl_t * p_ctrl,
213				     IN osm_subn_t * p_subn,
214				     IN osm_mad_pool_t * p_mad_pool,
215				     IN osm_vl15_t * p_vl15,
216				     IN osm_vendor_t * p_vendor,
217				     IN osm_log_t * p_log,
218				     IN osm_stats_t * p_stats,
219				     IN cl_plock_t * p_lock,
220				     IN cl_dispatcher_t * p_disp);
221/*
222* PARAMETERS
223*	p_ctrl
224*		[in] Pointer to an osm_sm_mad_ctrl_t object to initialize.
225*
226*	p_mad_pool
227*		[in] Pointer to the MAD pool.
228*
229*	p_vl15
230*		[in] Pointer to the VL15 interface object.
231*
232*	p_vendor
233*		[in] Pointer to the vendor specific interfaces object.
234*
235*	p_log
236*		[in] Pointer to the log object.
237*
238*	p_stats
239*		[in] Pointer to the OpenSM stastics block.
240*
241*	p_lock
242*		[in] Pointer to the OpenSM serializing lock.
243*
244*	p_disp
245*		[in] Pointer to the OpenSM central Dispatcher.
246*
247* RETURN VALUES
248*	IB_SUCCESS if the SM MAD Controller object was initialized
249*	successfully.
250*
251* NOTES
252*	Allows calling other SM MAD Controller methods.
253*
254* SEE ALSO
255*	SM MAD Controller object, osm_sm_mad_ctrl_construct,
256*	osm_sm_mad_ctrl_destroy
257*********/
258
259/****f* OpenSM: SM/osm_sm_mad_ctrl_bind
260* NAME
261*	osm_sm_mad_ctrl_bind
262*
263* DESCRIPTION
264*	Binds the SM MAD Controller object to a port guid.
265*
266* SYNOPSIS
267*/
268ib_api_status_t osm_sm_mad_ctrl_bind(IN osm_sm_mad_ctrl_t * p_ctrl,
269				     IN ib_net64_t port_guid);
270/*
271* PARAMETERS
272*	p_ctrl
273*		[in] Pointer to an osm_sm_mad_ctrl_t object to initialize.
274*
275*	port_guid
276*		[in] Local port GUID with which to bind.
277*
278*
279* RETURN VALUES
280*	None
281*
282* NOTES
283*	A given SM MAD Controller object can only be bound to one
284*	port at a time.
285*
286* SEE ALSO
287*********/
288
289/****f* OpenSM: SM/osm_sm_mad_ctrl_get_bind_handle
290* NAME
291*	osm_sm_mad_ctrl_get_bind_handle
292*
293* DESCRIPTION
294*	Returns the bind handle.
295*
296* SYNOPSIS
297*/
298static inline osm_bind_handle_t
299osm_sm_mad_ctrl_get_bind_handle(IN const osm_sm_mad_ctrl_t * p_ctrl)
300{
301	return p_ctrl->h_bind;
302}
303
304/*
305* PARAMETERS
306*	p_ctrl
307*		[in] Pointer to an osm_sm_mad_ctrl_t object.
308*
309* RETURN VALUES
310*	Returns the bind handle, which may be OSM_BIND_INVALID_HANDLE
311*	if no port has been bound.
312*
313* NOTES
314*	A given SM MAD Controller object can only be bound to one
315*	port at a time.
316*
317* SEE ALSO
318*********/
319
320END_C_DECLS
321#endif				/* _OSM_SM_MAD_CTRL_H_ */
322