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/****h* OpenSM/DB-Pack
37* NAME
38*	Database Types
39*
40* DESCRIPTION
41*	This module provides packing and unpacking of the database
42*  storage into specific types.
43*
44*  The following domains/conversions are supported:
45*  guid2lid - key is a guid and data is a lid.
46*
47* AUTHOR
48*	Eitan Zahavi, Mellanox Technologies LTD
49*
50*********/
51
52#ifndef _OSM_DB_PACK_H_
53#define _OSM_DB_PACK_H_
54
55#include <opensm/osm_db.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/****f* OpenSM: DB-Pack/osm_db_guid2lid_init
67* NAME
68*	osm_db_guid2lid_init
69*
70* DESCRIPTION
71*	Initialize a domain for the guid2lid table
72*
73* SYNOPSIS
74*/
75static inline osm_db_domain_t *osm_db_guid2lid_init(IN osm_db_t * p_db)
76{
77	return (osm_db_domain_init(p_db, "guid2lid"));
78}
79
80/*
81* PARAMETERS
82*	p_db
83*		[in] Pointer to the database object to construct
84*
85* RETURN VALUES
86*	The pointer to the new allocated domain object or NULL.
87*
88* NOTE: DB domains are destroyed by the osm_db_destroy
89*
90* SEE ALSO
91*	Database, osm_db_init, osm_db_destroy
92*********/
93
94/****f* OpenSM: DB-Pack/osm_db_guid2lid_init
95* NAME
96*	osm_db_guid2lid_init
97*
98* DESCRIPTION
99*	Initialize a domain for the guid2lid table
100*
101* SYNOPSIS
102*/
103typedef struct osm_db_guid_elem {
104	cl_list_item_t item;
105	uint64_t guid;
106} osm_db_guid_elem_t;
107/*
108* FIELDS
109*	item
110*		required for list manipulations
111*
112*  guid
113*
114************/
115
116/****f* OpenSM: DB-Pack/osm_db_guid2lid_guids
117* NAME
118*	osm_db_guid2lid_guids
119*
120* DESCRIPTION
121*	Provides back a list of guid elements.
122*
123* SYNOPSIS
124*/
125int osm_db_guid2lid_guids(IN osm_db_domain_t * p_g2l,
126			  OUT cl_qlist_t * p_guid_list);
127/*
128* PARAMETERS
129*	p_g2l
130*		[in] Pointer to the guid2lid domain
131*
132*  p_guid_list
133*     [out] A quick list of guid elements of type osm_db_guid_elem_t
134*
135* RETURN VALUES
136*	0 if successful
137*
138* NOTE: the output qlist should be initialized and each item freed
139*       by the caller, then destroyed.
140*
141* SEE ALSO
142* osm_db_guid2lid_init, osm_db_guid2lid_guids, osm_db_guid2lid_get
143* osm_db_guid2lid_set, osm_db_guid2lid_delete
144*********/
145
146/****f* OpenSM: DB-Pack/osm_db_guid2lid_get
147* NAME
148*	osm_db_guid2lid_get
149*
150* DESCRIPTION
151*	Get a lid range by given guid.
152*
153* SYNOPSIS
154*/
155int osm_db_guid2lid_get(IN osm_db_domain_t * p_g2l, IN uint64_t guid,
156			OUT uint16_t * p_min_lid, OUT uint16_t * p_max_lid);
157/*
158* PARAMETERS
159*	p_g2l
160*		[in] Pointer to the guid2lid domain
161*
162*  guid
163*     [in] The guid to look for
164*
165*  p_min_lid
166*     [out] Pointer to the resulting min lid in host order.
167*
168*  p_max_lid
169*     [out] Pointer to the resulting max lid in host order.
170*
171* RETURN VALUES
172*	0 if successful. The lid will be set to 0 if not found.
173*
174* SEE ALSO
175* osm_db_guid2lid_init, osm_db_guid2lid_guids
176* osm_db_guid2lid_set, osm_db_guid2lid_delete
177*********/
178
179/****f* OpenSM: DB-Pack/osm_db_guid2lid_set
180* NAME
181*	osm_db_guid2lid_set
182*
183* DESCRIPTION
184*	Set a lid range for the given guid.
185*
186* SYNOPSIS
187*/
188int osm_db_guid2lid_set(IN osm_db_domain_t * p_g2l, IN uint64_t guid,
189			IN uint16_t min_lid, IN uint16_t max_lid);
190/*
191* PARAMETERS
192*	p_g2l
193*		[in] Pointer to the guid2lid domain
194*
195*  guid
196*     [in] The guid to look for
197*
198*  min_lid
199*     [in] The min lid value to set
200*
201*  max_lid
202*     [in] The max lid value to set
203*
204* RETURN VALUES
205*	0 if successful
206*
207* SEE ALSO
208* osm_db_guid2lid_init, osm_db_guid2lid_guids
209* osm_db_guid2lid_get, osm_db_guid2lid_delete
210*********/
211
212/****f* OpenSM: DB-Pack/osm_db_guid2lid_delete
213* NAME
214*	osm_db_guid2lid_delete
215*
216* DESCRIPTION
217*	Delete the entry by the given guid
218*
219* SYNOPSIS
220*/
221int osm_db_guid2lid_delete(IN osm_db_domain_t * p_g2l, IN uint64_t guid);
222/*
223* PARAMETERS
224*	p_g2l
225*		[in] Pointer to the guid2lid domain
226*
227*  guid
228*     [in] The guid to look for
229*
230* RETURN VALUES
231*	0 if successful otherwise 1
232*
233* SEE ALSO
234* osm_db_guid2lid_init, osm_db_guid2lid_guids
235* osm_db_guid2lid_get, osm_db_guid2lid_set
236*********/
237
238/****f* OpenSM: DB-Pack/osm_db_guid2mkey_init
239* NAME
240*	osm_db_guid2mkey_init
241*
242* DESCRIPTION
243*	Initialize a domain for the guid2mkey table
244*
245* SYNOPSIS
246*/
247static inline osm_db_domain_t *osm_db_guid2mkey_init(IN osm_db_t * p_db)
248{
249	return osm_db_domain_init(p_db, "guid2mkey");
250}
251
252/*
253* PARAMETERS
254*	p_db
255*		[in] Pointer to the database object to construct
256*
257* RETURN VALUES
258*	The pointer to the new allocated domain object or NULL.
259*
260* NOTE: DB domains are destroyed by the osm_db_destroy
261*
262* SEE ALSO
263*	Database, osm_db_init, osm_db_destroy
264*********/
265
266/****f* OpenSM: DB-Pack/osm_db_guid2mkey_guids
267* NAME
268*	osm_db_guid2mkey_guids
269*
270* DESCRIPTION
271*	Provides back a list of guid elements.
272*
273* SYNOPSIS
274*/
275int osm_db_guid2mkey_guids(IN osm_db_domain_t * p_g2m,
276			  OUT cl_qlist_t * p_guid_list);
277/*
278* PARAMETERS
279*	p_g2l
280*		[in] Pointer to the guid2mkey domain
281*
282*  p_guid_list
283*     [out] A quick list of guid elements of type osm_db_guid_elem_t
284*
285* RETURN VALUES
286*	0 if successful
287*
288* NOTE: the output qlist should be initialized and each item freed
289*       by the caller, then destroyed.
290*
291* SEE ALSO
292* osm_db_guid2mkey_init, osm_db_guid2mkey_guids, osm_db_guid2mkey_get
293* osm_db_guid2mkey_set, osm_db_guid2mkey_delete
294*********/
295
296/****f* OpenSM: DB-Pack/osm_db_guid2mkey_get
297* NAME
298*	osm_db_guid2mkey_get
299*
300* DESCRIPTION
301*	Get the mkey for the given guid.
302*
303* SYNOPSIS
304*/
305int osm_db_guid2mkey_get(IN osm_db_domain_t * p_g2m, IN uint64_t guid,
306			 OUT uint64_t * p_mkey);
307/*
308* PARAMETERS
309*	p_g2m
310*		[in] Pointer to the guid2mkey domain
311*
312*  guid
313*     [in] The guid to look for
314*
315*  p_mkey
316*     [out] Pointer to the resulting mkey in host order.
317*
318* RETURN VALUES
319*	0 if successful. The lid will be set to 0 if not found.
320*
321* SEE ALSO
322* osm_db_guid2mkey_init, osm_db_guid2mkey_guids
323* osm_db_guid2mkey_set, osm_db_guid2mkey_delete
324*********/
325
326/****f* OpenSM: DB-Pack/osm_db_guid2mkey_set
327* NAME
328*	osm_db_guid2mkey_set
329*
330* DESCRIPTION
331*	Set the mkey for the given guid.
332*
333* SYNOPSIS
334*/
335int osm_db_guid2mkey_set(IN osm_db_domain_t * p_g2m, IN uint64_t guid,
336			 IN uint64_t mkey);
337/*
338* PARAMETERS
339*	p_g2m
340*		[in] Pointer to the guid2mkey domain
341*
342*  guid
343*     [in] The guid to look for
344*
345*  mkey
346*     [in] The mkey value to set, in host order
347*
348* RETURN VALUES
349*	0 if successful
350*
351* SEE ALSO
352* osm_db_guid2mkey_init, osm_db_guid2mkey_guids
353* osm_db_guid2mkey_get, osm_db_guid2mkey_delete
354*********/
355
356/****f* OpenSM: DB-Pack/osm_db_guid2mkey_delete
357* NAME
358*	osm_db_guid2mkey_delete
359*
360* DESCRIPTION
361*	Delete the entry by the given guid
362*
363* SYNOPSIS
364*/
365int osm_db_guid2mkey_delete(IN osm_db_domain_t * p_g2m, IN uint64_t guid);
366/*
367* PARAMETERS
368*	p_g2m
369*		[in] Pointer to the guid2mkey domain
370*
371*  guid
372*     [in] The guid to look for
373*
374* RETURN VALUES
375*	0 if successful otherwise 1
376*
377* SEE ALSO
378* osm_db_guid2mkey_init, osm_db_guid2mkey_guids
379* osm_db_guid2mkey_get, osm_db_guid2mkey_set
380*********/
381
382/****f* OpenSM: DB-Pack/osm_db_neighbor_init
383* NAME
384*	osm_db_neighbor_init
385*
386* DESCRIPTION
387*	Initialize a domain for the neighbors table
388*
389* SYNOPSIS
390*/
391static inline osm_db_domain_t *osm_db_neighbor_init(IN osm_db_t * p_db)
392{
393	return osm_db_domain_init(p_db, "neighbors");
394}
395
396/*
397* PARAMETERS
398*	p_db
399*		[in] Pointer to the database object to construct
400*
401* RETURN VALUES
402*	The pointer to the new allocated domain object or NULL.
403*
404* NOTE: DB domains are destroyed by the osm_db_destroy
405*
406* SEE ALSO
407*	Database, osm_db_init, osm_db_destroy
408*********/
409
410/****f* OpenSM: DB-Pack/osm_db_neighbor_elem
411* NAME
412*	osm_db_neighbor_elem
413*
414* DESCRIPTION
415*	Initialize a domain for the neighbor table
416*
417* SYNOPSIS
418*/
419typedef struct osm_db_neighbor_elem {
420	cl_list_item_t item;
421	uint64_t guid;
422	uint8_t portnum;
423} osm_db_neighbor_elem_t;
424/*
425* FIELDS
426*	item
427*		required for list manipulations
428*
429*  guid
430*  portnum
431*
432************/
433
434/****f* OpenSM: DB-Pack/osm_db_neighbor_guids
435* NAME
436*	osm_db_neighbor_guids
437*
438* DESCRIPTION
439*	Provides back a list of neighbor elements.
440*
441* SYNOPSIS
442*/
443int osm_db_neighbor_guids(IN osm_db_domain_t * p_neighbor,
444			  OUT cl_qlist_t * p_guid_list);
445/*
446* PARAMETERS
447*	p_neighbor
448*		[in] Pointer to the neighbor domain
449*
450*  p_guid_list
451*     [out] A quick list of neighbor elements of type osm_db_neighbor_elem_t
452*
453* RETURN VALUES
454*	0 if successful
455*
456* NOTE: the output qlist should be initialized and each item freed
457*       by the caller, then destroyed.
458*
459* SEE ALSO
460* osm_db_neighbor_init, osm_db_neighbor_guids, osm_db_neighbor_get
461* osm_db_neighbor_set, osm_db_neighbor_delete
462*********/
463
464/****f* OpenSM: DB-Pack/osm_db_neighbor_get
465* NAME
466*	osm_db_neighbor_get
467*
468* DESCRIPTION
469*	Get a neighbor's guid by given guid/port.
470*
471* SYNOPSIS
472*/
473int osm_db_neighbor_get(IN osm_db_domain_t * p_neighbor, IN uint64_t guid1,
474			IN uint8_t port1, OUT uint64_t * p_guid2,
475			OUT uint8_t * p_port2);
476/*
477* PARAMETERS
478*	p_neighbor
479*		[in] Pointer to the neighbor domain
480*
481*  guid1
482*     [in] The guid to look for
483*
484*  port1
485*     [in] The port to look for
486*
487*  p_guid2
488*     [out] Pointer to the resulting guid of the neighboring port.
489*
490*  p_port2
491*     [out] Pointer to the resulting port of the neighboring port.
492*
493* RETURN VALUES
494*	0 if successful. The lid will be set to 0 if not found.
495*
496* SEE ALSO
497* osm_db_neighbor_init, osm_db_neighbor_guids
498* osm_db_neighbor_set, osm_db_neighbor_delete
499*********/
500
501/****f* OpenSM: DB-Pack/osm_db_neighbor_set
502* NAME
503*	osm_db_neighbor_set
504*
505* DESCRIPTION
506*	Set up a relationship between two ports
507*
508* SYNOPSIS
509*/
510int osm_db_neighbor_set(IN osm_db_domain_t * p_neighbor, IN uint64_t guid1,
511			IN uint8_t port1, IN uint64_t guid2, IN uint8_t port2);
512/*
513* PARAMETERS
514*	p_neighbor
515*		[in] Pointer to the neighbor domain
516*
517*  guid1
518*     [in] The first guid in the relationship
519*
520*  port1
521*     [in] The first port in the relationship
522*
523*  guid2
524*     [in] The second guid in the relationship
525*
526*  port2
527*     [in] The second port in the relationship
528*
529* RETURN VALUES
530*	0 if successful
531*
532* SEE ALSO
533* osm_db_neighbor_init, osm_db_neighbor_guids
534* osm_db_neighbor_get, osm_db_neighbor_delete
535*********/
536
537/****f* OpenSM: DB-Pack/osm_db_neighbor_delete
538* NAME
539*	osm_db_neighbor_delete
540*
541* DESCRIPTION
542*	Delete the relationship between two ports
543*
544* SYNOPSIS
545*/
546int osm_db_neighbor_delete(IN osm_db_domain_t * p_neighbor,
547			   IN uint64_t guid, IN uint8_t port);
548/*
549* PARAMETERS
550*	p_neighbor
551*		[in] Pointer to the neighbor domain
552*
553*  guid
554*     [in] The guid to look for
555*
556*  port
557*     [in] The port to look for
558*
559* RETURN VALUES
560*	0 if successful otherwise 1
561*
562* SEE ALSO
563* osm_db_neighbor_init, osm_db_neighbor_guids
564* osm_db_neighbor_get, osm_db_neighbor_set
565*********/
566
567END_C_DECLS
568#endif				/* _OSM_DB_PACK_H_ */
569