1/*
2 * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2008 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_ucast_mgr_t.
39 *	This object represents the Unicast Manager object.
40 *	This object is part of the OpenSM family of objects.
41 */
42
43#ifndef _OSM_UCAST_MGR_H_
44#define _OSM_UCAST_MGR_H_
45
46#include <complib/cl_passivelock.h>
47#include <complib/cl_qlist.h>
48#include <opensm/osm_madw.h>
49#include <opensm/osm_subnet.h>
50#include <opensm/osm_switch.h>
51#include <opensm/osm_log.h>
52#include <opensm/osm_ucast_cache.h>
53
54#ifdef __cplusplus
55#  define BEGIN_C_DECLS extern "C" {
56#  define END_C_DECLS   }
57#else				/* !__cplusplus */
58#  define BEGIN_C_DECLS
59#  define END_C_DECLS
60#endif				/* __cplusplus */
61
62BEGIN_C_DECLS
63/****h* OpenSM/Unicast Manager
64* NAME
65*	Unicast Manager
66*
67* DESCRIPTION
68*	The Unicast Manager object encapsulates the information
69*	needed to control unicast LID forwarding on the subnet.
70*
71*	The Unicast Manager object is thread safe.
72*
73*	This object should be treated as opaque and should be
74*	manipulated only through the provided functions.
75*
76* AUTHOR
77*	Steve King, Intel
78*
79*********/
80struct osm_sm;
81/****s* OpenSM: Unicast Manager/osm_ucast_mgr_t
82* NAME
83*	osm_ucast_mgr_t
84*
85* DESCRIPTION
86*	Unicast Manager structure.
87*
88*	This object should be treated as opaque and should
89*	be manipulated only through the provided functions.
90*
91* SYNOPSIS
92*/
93typedef struct osm_ucast_mgr {
94	struct osm_sm *sm;
95	osm_subn_t *p_subn;
96	osm_log_t *p_log;
97	cl_plock_t *p_lock;
98	cl_qlist_t port_order_list;
99	boolean_t is_dor;
100	boolean_t some_hop_count_set;
101	cl_qmap_t cache_sw_tbl;
102	boolean_t cache_valid;
103} osm_ucast_mgr_t;
104/*
105* FIELDS
106*	sm
107*		Pointer to the SM object.
108*
109*	p_subn
110*		Pointer to the Subnet object for this subnet.
111*
112*	p_log
113*		Pointer to the log object.
114*
115*	p_lock
116*		Pointer to the serializing lock.
117*
118*	is_dor
119*		Dimension Order Routing (DOR) will be done
120*
121*	port_order_list
122*		List of ports ordered for routing.
123*
124*	any_change
125*		Initialized to FALSE at the beginning of the algorithm,
126*		set to TRUE by osm_ucast_mgr_set_fwd_table() if any mad
127*		was sent.
128*
129*	some_hop_count_set
130*		Initialized to FALSE at the beginning of each the min hop
131*		tables calculation iteration cycle, set to TRUE to indicate
132*		that some hop count changes were done.
133*
134*	cache_sw_tbl
135*		Cached switches table.
136*
137*	cache_valid
138*		TRUE if the unicast cache is valid.
139*
140* SEE ALSO
141*	Unicast Manager object
142*********/
143
144/****f* OpenSM: Unicast Manager/osm_ucast_mgr_construct
145* NAME
146*	osm_ucast_mgr_construct
147*
148* DESCRIPTION
149*	This function constructs a Unicast Manager object.
150*
151* SYNOPSIS
152*/
153void osm_ucast_mgr_construct(IN osm_ucast_mgr_t * const p_mgr);
154/*
155* PARAMETERS
156*	p_mgr
157*		[in] Pointer to a Unicast Manager object to construct.
158*
159* RETURN VALUE
160*	This function does not return a value.
161*
162* NOTES
163*	Allows osm_ucast_mgr_destroy
164*
165*	Calling osm_ucast_mgr_construct is a prerequisite to calling any other
166*	method except osm_ucast_mgr_init.
167*
168* SEE ALSO
169*	Unicast Manager object, osm_ucast_mgr_init,
170*	osm_ucast_mgr_destroy
171*********/
172
173/****f* OpenSM: Unicast Manager/osm_ucast_mgr_destroy
174* NAME
175*	osm_ucast_mgr_destroy
176*
177* DESCRIPTION
178*	The osm_ucast_mgr_destroy function destroys the object, releasing
179*	all resources.
180*
181* SYNOPSIS
182*/
183void osm_ucast_mgr_destroy(IN osm_ucast_mgr_t * const p_mgr);
184/*
185* PARAMETERS
186*	p_mgr
187*		[in] Pointer to the object to destroy.
188*
189* RETURN VALUE
190*	This function does not return a value.
191*
192* NOTES
193*	Performs any necessary cleanup of the specified
194*	Unicast Manager object.
195*	Further operations should not be attempted on the destroyed object.
196*	This function should only be called after a call to
197*	osm_ucast_mgr_construct or osm_ucast_mgr_init.
198*
199* SEE ALSO
200*	Unicast Manager object, osm_ucast_mgr_construct,
201*	osm_ucast_mgr_init
202*********/
203
204/****f* OpenSM: Unicast Manager/osm_ucast_mgr_init
205* NAME
206*	osm_ucast_mgr_init
207*
208* DESCRIPTION
209*	The osm_ucast_mgr_init function initializes a
210*	Unicast Manager object for use.
211*
212* SYNOPSIS
213*/
214ib_api_status_t
215osm_ucast_mgr_init(IN osm_ucast_mgr_t * const p_mgr, IN struct osm_sm * sm);
216/*
217* PARAMETERS
218*	p_mgr
219*		[in] Pointer to an osm_ucast_mgr_t object to initialize.
220*
221*	sm
222*		[in] Pointer to the SM object.
223*
224* RETURN VALUES
225*	IB_SUCCESS if the Unicast Manager object was initialized
226*	successfully.
227*
228* NOTES
229*	Allows calling other Unicast Manager methods.
230*
231* SEE ALSO
232*	Unicast Manager object, osm_ucast_mgr_construct,
233*	osm_ucast_mgr_destroy
234*********/
235
236/****f* OpenSM: Unicast Manager/osm_ucast_mgr_set_fwd_table
237* NAME
238*	osm_ucast_mgr_set_fwd_table
239*
240* DESCRIPTION
241*	Setup forwarding table for the switch (from prepared new_lft).
242*
243* SYNOPSIS
244*/
245int osm_ucast_mgr_set_fwd_table(IN osm_ucast_mgr_t * const p_mgr,
246				IN osm_switch_t * const p_sw);
247/*
248* PARAMETERS
249*	p_mgr
250*		[in] Pointer to an osm_ucast_mgr_t object.
251*
252*	p_mgr
253*		[in] Pointer to an osm_switch_t object.
254*
255* SEE ALSO
256*	Unicast Manager
257*********/
258
259/****f* OpenSM: Unicast Manager/osm_ucast_mgr_build_lid_matrices
260* NAME
261*	osm_ucast_mgr_build_lid_matrices
262*
263* DESCRIPTION
264*	Build switches's lid matrices.
265*
266* SYNOPSIS
267*/
268int osm_ucast_mgr_build_lid_matrices(IN osm_ucast_mgr_t * const p_mgr);
269/*
270* PARAMETERS
271*	p_mgr
272*		[in] Pointer to an osm_ucast_mgr_t object.
273*
274* NOTES
275*	This function processes the subnet, configuring switches'
276*	min hops tables (aka lid matrices).
277*
278* SEE ALSO
279*	Unicast Manager
280*********/
281
282/****f* OpenSM: Unicast Manager/osm_ucast_mgr_process
283* NAME
284*	osm_ucast_mgr_process
285*
286* DESCRIPTION
287*	Process and configure the subnet's unicast forwarding tables.
288*
289* SYNOPSIS
290*/
291int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr);
292/*
293* PARAMETERS
294*	p_mgr
295*		[in] Pointer to an osm_ucast_mgr_t object.
296*
297* RETURN VALUES
298*	Returns zero on success and negative value on failure.
299*
300* NOTES
301*	This function processes the subnet, configuring switch
302*	unicast forwarding tables.
303*
304* SEE ALSO
305*	Unicast Manager, Node Info Response Controller
306*********/
307END_C_DECLS
308#endif				/* _OSM_UCAST_MGR_H_ */
309