osm_mcast_tbl.h revision 272461
1/*
2 * Copyright (c) 2004, 2005 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_mcast_tbl_t.
39 *	This object represents a multicast forwarding table.
40 *	This object is part of the OpenSM family of objects.
41 */
42
43#ifndef _OSM_MCAST_TBL_H_
44#define _OSM_MCAST_TBL_H_
45
46#include <iba/ib_types.h>
47#include <complib/cl_qmap.h>
48#include <opensm/osm_base.h>
49
50#ifdef __cplusplus
51#  define BEGIN_C_DECLS extern "C" {
52#  define END_C_DECLS   }
53#else				/* !__cplusplus */
54#  define BEGIN_C_DECLS
55#  define END_C_DECLS
56#endif				/* __cplusplus */
57
58BEGIN_C_DECLS
59/****s* OpenSM: Forwarding Table/osm_mcast_tbl_t
60* NAME
61*	osm_mcast_tbl_t
62*
63* DESCRIPTION
64*	Multicast Forwarding Table structure.
65*
66*	Callers may directly access this object.
67*
68* SYNOPSIS
69*/
70typedef struct osm_mcast_fwdbl {
71	uint8_t num_ports;
72	uint8_t max_position;
73	uint16_t max_block;
74	int16_t max_block_in_use;
75	uint16_t num_entries;
76	uint16_t max_mlid_ho;
77	uint16_t(*p_mask_tbl)[][IB_MCAST_POSITION_MAX];
78} osm_mcast_tbl_t;
79/*
80* FIELDS
81*	num_ports
82*		The number of ports in the port mask.  This value
83*		is the same as the number of ports on the switch
84*
85*	max_position
86*		Maximum bit mask position for this table.  This value
87*		is computed from the number of ports on the switch.
88*
89*	max_block
90*		Maximum block number supported in the table.  This value
91*		is approximately the number of MLID entries divided by the
92*		number of MLIDs per block
93*
94*	num_entries
95*		Number of entries in the table (aka number of MLIDs supported).
96*
97*	max_mlid_ho
98*		Maximum MLID value (host order).
99*
100*	pp_mask_tbl
101*		Pointer to a two dimensional array of port_masks for this switch.
102*		The first dimension is MLID, the second dimension is mask position.
103*		This pointer is null for switches that do not support multicast.
104*
105* SEE ALSO
106*********/
107
108/****f* OpenSM: Forwarding Table/osm_mcast_tbl_init
109* NAME
110*	osm_mcast_tbl_init
111*
112* DESCRIPTION
113*	This function initializes a Multicast Forwarding Table object.
114*
115* SYNOPSIS
116*/
117ib_api_status_t
118osm_mcast_tbl_init(IN osm_mcast_tbl_t * const p_tbl,
119		   IN uint8_t const num_ports, IN uint16_t const capacity);
120/*
121* PARAMETERS
122*	num_ports
123*		[in] Number of ports in the switch owning this table.
124*
125*	capacity
126*		[in] The number of MLID entries (starting at 0xC000) supported
127*		by this switch.
128*
129* RETURN VALUE
130*	IB_SUCCESS on success.
131*
132* NOTES
133*
134* SEE ALSO
135*********/
136
137/****f* OpenSM: Forwarding Table/osm_mcast_tbl_delete
138* NAME
139*	osm_mcast_tbl_delete
140*
141* DESCRIPTION
142*	This destroys and deallocates a Multicast Forwarding Table object.
143*
144* SYNOPSIS
145*/
146void osm_mcast_tbl_delete(IN osm_mcast_tbl_t ** const pp_tbl);
147/*
148* PARAMETERS
149*	pp_tbl
150*		[in] Pointer a Pointer to the Multicast Forwarding Table object.
151*
152* RETURN VALUE
153*	On success, returns a pointer to a new Multicast Forwarding Table object
154*	of the specified size.
155*	NULL otherwise.
156*
157* NOTES
158*
159* SEE ALSO
160*********/
161
162/****f* OpenSM: Forwarding Table/osm_mcast_tbl_destroy
163* NAME
164*	osm_mcast_tbl_destroy
165*
166* DESCRIPTION
167*	This destroys and deallocates a Multicast Forwarding Table object.
168*
169* SYNOPSIS
170*/
171void osm_mcast_tbl_destroy(IN osm_mcast_tbl_t * const p_tbl);
172/*
173* PARAMETERS
174*	p_tbl
175*		[in] Pointer to the Multicast Forwarding Table object.
176*
177* RETURN VALUE
178*    None
179*
180* NOTES
181*
182* SEE ALSO
183*********/
184
185/****f* OpenSM: Forwarding Table/osm_mcast_tbl_set
186* NAME
187*	osm_mcast_tbl_set
188*
189* DESCRIPTION
190*	Adds the port to the multicast group.
191*
192* SYNOPSIS
193*/
194void
195osm_mcast_tbl_set(IN osm_mcast_tbl_t * const p_tbl,
196		  IN const uint16_t mlid_ho, IN const uint8_t port_num);
197/*
198* PARAMETERS
199*	p_tbl
200*		[in] Pointer to the Multicast Forwarding Table object.
201*
202*	mlid_ho
203*		[in] MLID value (host order) for which to set the route.
204*
205*	port_num
206*		[in] Port to add to the multicast group.
207*
208* RETURN VALUE
209*	None.
210*
211* NOTES
212*
213* SEE ALSO
214*********/
215
216/****f* OpenSM: Forwarding Table/osm_mcast_tbl_clear_mlid
217* NAME
218*	osm_mcast_tbl_clear_mlid
219*
220* DESCRIPTION
221*	Removes all multicast paths for the specified MLID.
222*
223* SYNOPSIS
224*/
225void
226osm_mcast_tbl_clear_mlid(IN osm_mcast_tbl_t * const p_tbl,
227			 IN const uint16_t mlid_ho);
228/*
229* PARAMETERS
230*	p_tbl
231*		[in] Pointer to the Multicast Forwarding Table object.
232*
233*	mlid_ho
234*		[in] MLID value (host order) for which to clear.
235*
236* RETURN VALUE
237*	None.
238*
239* NOTES
240*
241* SEE ALSO
242*********/
243
244/****f* OpenSM: Forwarding Table/osm_mcast_tbl_is_port
245* NAME
246*	osm_mcast_tbl_is_port
247*
248* DESCRIPTION
249*	Returns TRUE if the port is in the multicast group.
250*
251* SYNOPSIS
252*/
253boolean_t
254osm_mcast_tbl_is_port(IN const osm_mcast_tbl_t * const p_tbl,
255		      IN const uint16_t mlid_ho, IN const uint8_t port_num);
256/*
257* PARAMETERS
258*	p_tbl
259*		[in] Pointer to the Multicast Forwarding Table object.
260*
261*	mlid_ho
262*		[in] MLID value (host order).
263*
264*	port_num
265*		[in] Port number on the switch
266*
267* RETURN VALUE
268*	Returns the port that routes the specified LID.
269*
270* NOTES
271*
272* SEE ALSO
273*********/
274
275/****f* OpenSM: Forwarding Table/osm_mcast_tbl_is_any_port
276* NAME
277*	osm_mcast_tbl_is_any_port
278*
279* DESCRIPTION
280*	Returns TRUE if any port is in the multicast group.
281*
282* SYNOPSIS
283*/
284boolean_t
285osm_mcast_tbl_is_any_port(IN const osm_mcast_tbl_t * const p_tbl,
286			  IN const uint16_t mlid_ho);
287/*
288* PARAMETERS
289*	p_tbl
290*		[in] Pointer to the Multicast Forwarding Table object.
291*
292*	mlid_ho
293*		[in] MLID value (host order).
294*
295* RETURN VALUE
296*	Returns TRUE if any port is in the multicast group.
297*
298* NOTES
299*
300* SEE ALSO
301*********/
302
303/****f* OpenSM: Forwarding Table/osm_mcast_tbl_set_block
304* NAME
305*	osm_mcast_tbl_set_block
306*
307* DESCRIPTION
308*	Copies the specified block into the Multicast Forwarding Table.
309*
310* SYNOPSIS
311*/
312ib_api_status_t
313osm_mcast_tbl_set_block(IN osm_mcast_tbl_t * const p_tbl,
314			IN const ib_net16_t * const p_block,
315			IN const int16_t block_num, IN const uint8_t position);
316/*
317* PARAMETERS
318*	p_tbl
319*		[in] Pointer to the Multicast Forwarding Table object.
320*
321*	p_block
322*		[in] Pointer to the Forwarding Table block.
323*
324*	block_num
325*		[in] Block number of this block.
326*
327* RETURN VALUE
328*	None.
329*
330* NOTES
331*
332* SEE ALSO
333*********/
334
335/****f* OpenSM: Forwarding Table/osm_mcast_get_tbl_block
336* NAME
337*	osm_mcast_get_tbl_block
338*
339* DESCRIPTION
340*	Retrieve a multicast forwarding table block.
341*
342* SYNOPSIS
343*/
344boolean_t
345osm_mcast_tbl_get_block(IN osm_mcast_tbl_t * const p_tbl,
346			IN const int16_t block_num,
347			IN const uint8_t position,
348			OUT ib_net16_t * const p_block);
349/*
350* PARAMETERS
351*	p_tbl
352*		[in] Pointer to an osm_mcast_tbl_t object.
353*
354*	p_block
355*		[in] Pointer to the Forwarding Table block.
356*
357*	block_num
358*		[in] Block number of this block.
359*
360*	p_block
361*		[out] Pointer to the 32 entry array to store the
362*		forwarding table clock specified by block_id.
363*
364* RETURN VALUES
365*	Returns true if there are more blocks necessary to
366*	configure all the MLIDs reachable from this switch.
367*	FALSE otherwise.
368*
369* NOTES
370*
371* SEE ALSO
372*********/
373
374/****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_block
375* NAME
376*	osm_mcast_tbl_get_max_block
377*
378* DESCRIPTION
379*	Returns the maximum block ID in this table.
380*
381* SYNOPSIS
382*/
383static inline uint16_t
384osm_mcast_tbl_get_max_block(IN osm_mcast_tbl_t * const p_tbl)
385{
386	return (p_tbl->max_block);
387}
388
389/*
390* PARAMETERS
391*	p_tbl
392*		[in] Pointer to an osm_mcast_tbl_t object.
393*
394* RETURN VALUES
395*	Returns the maximum block ID in this table.
396*
397* NOTES
398*
399* SEE ALSO
400*********/
401
402/****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_block_in_use
403* NAME
404*	osm_mcast_tbl_get_max_block_in_use
405*
406* DESCRIPTION
407*	Returns the maximum block ID in use in this table.
408*	A value of -1 indicates no blocks are in use.
409*
410* SYNOPSIS
411*/
412static inline int16_t
413osm_mcast_tbl_get_max_block_in_use(IN osm_mcast_tbl_t * const p_tbl)
414{
415	return (p_tbl->max_block_in_use);
416}
417
418/*
419* PARAMETERS
420*	p_tbl
421*		[in] Pointer to an osm_mcast_tbl_t object.
422*
423* RETURN VALUES
424*	Returns the maximum block ID in use in this table.
425*	A value of -1 indicates no blocks are in use.
426*
427* NOTES
428*
429* SEE ALSO
430*********/
431
432/****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_position
433* NAME
434*	osm_mcast_tbl_get_max_position
435*
436* DESCRIPTION
437*	Returns the maximum position in this table.
438*
439* SYNOPSIS
440*/
441static inline uint8_t
442osm_mcast_tbl_get_max_position(IN osm_mcast_tbl_t * const p_tbl)
443{
444	return (p_tbl->max_position);
445}
446
447/*
448* PARAMETERS
449*	p_tbl
450*		[in] Pointer to an osm_mcast_tbl_t object.
451*
452* RETURN VALUES
453*	Returns the maximum position in this table.
454*
455* NOTES
456*
457* SEE ALSO
458*********/
459
460END_C_DECLS
461#endif				/* _OSM_MCAST_TBL_H_ */
462