xref: /freebsd-src/contrib/ofed/opensm/opensm/osm_db_pack.c (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3*d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved.
4*d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5*d6b92ffaSHans Petter Selasky  *
6*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky  *
12*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky  *     conditions are met:
15*d6b92ffaSHans Petter Selasky  *
16*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky  *        disclaimer.
19*d6b92ffaSHans Petter Selasky  *
20*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24*d6b92ffaSHans Petter Selasky  *
25*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky  * SOFTWARE.
33*d6b92ffaSHans Petter Selasky  *
34*d6b92ffaSHans Petter Selasky  */
35*d6b92ffaSHans Petter Selasky 
36*d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
37*d6b92ffaSHans Petter Selasky #  include <config.h>
38*d6b92ffaSHans Petter Selasky #endif				/* HAVE_CONFIG_H */
39*d6b92ffaSHans Petter Selasky 
40*d6b92ffaSHans Petter Selasky #include <stdlib.h>
41*d6b92ffaSHans Petter Selasky #include <complib/cl_debug.h>
42*d6b92ffaSHans Petter Selasky #include <opensm/osm_file_ids.h>
43*d6b92ffaSHans Petter Selasky #define FILE_ID OSM_FILE_DB_PACK_C
44*d6b92ffaSHans Petter Selasky #include <opensm/osm_db_pack.h>
45*d6b92ffaSHans Petter Selasky 
pack_guid(uint64_t guid,char * p_guid_str)46*d6b92ffaSHans Petter Selasky static inline void pack_guid(uint64_t guid, char *p_guid_str)
47*d6b92ffaSHans Petter Selasky {
48*d6b92ffaSHans Petter Selasky 	sprintf(p_guid_str, "0x%016" PRIx64, guid);
49*d6b92ffaSHans Petter Selasky }
50*d6b92ffaSHans Petter Selasky 
unpack_guid(char * p_guid_str)51*d6b92ffaSHans Petter Selasky static inline uint64_t unpack_guid(char *p_guid_str)
52*d6b92ffaSHans Petter Selasky {
53*d6b92ffaSHans Petter Selasky 	return strtoull(p_guid_str, NULL, 0);
54*d6b92ffaSHans Petter Selasky }
55*d6b92ffaSHans Petter Selasky 
pack_lids(uint16_t min_lid,uint16_t max_lid,char * lid_str)56*d6b92ffaSHans Petter Selasky static inline void pack_lids(uint16_t min_lid, uint16_t max_lid, char *lid_str)
57*d6b92ffaSHans Petter Selasky {
58*d6b92ffaSHans Petter Selasky 	sprintf(lid_str, "0x%04x 0x%04x", min_lid, max_lid);
59*d6b92ffaSHans Petter Selasky }
60*d6b92ffaSHans Petter Selasky 
unpack_lids(IN char * p_lid_str,OUT uint16_t * p_min_lid,OUT uint16_t * p_max_lid)61*d6b92ffaSHans Petter Selasky static inline int unpack_lids(IN char *p_lid_str, OUT uint16_t * p_min_lid,
62*d6b92ffaSHans Petter Selasky 			      OUT uint16_t * p_max_lid)
63*d6b92ffaSHans Petter Selasky {
64*d6b92ffaSHans Petter Selasky 	unsigned long tmp;
65*d6b92ffaSHans Petter Selasky 	char *p_next;
66*d6b92ffaSHans Petter Selasky 	char *p_num;
67*d6b92ffaSHans Petter Selasky 	char lids_str[24];
68*d6b92ffaSHans Petter Selasky 
69*d6b92ffaSHans Petter Selasky 	strncpy(lids_str, p_lid_str, 23);
70*d6b92ffaSHans Petter Selasky 	lids_str[23] = '\0';
71*d6b92ffaSHans Petter Selasky 	p_num = strtok_r(lids_str, " \t", &p_next);
72*d6b92ffaSHans Petter Selasky 	if (!p_num)
73*d6b92ffaSHans Petter Selasky 		return 1;
74*d6b92ffaSHans Petter Selasky 	tmp = strtoul(p_num, NULL, 0);
75*d6b92ffaSHans Petter Selasky 	if (tmp >= 0xC000)
76*d6b92ffaSHans Petter Selasky 		return 1;
77*d6b92ffaSHans Petter Selasky 
78*d6b92ffaSHans Petter Selasky 	*p_min_lid = (uint16_t) tmp;
79*d6b92ffaSHans Petter Selasky 
80*d6b92ffaSHans Petter Selasky 	p_num = strtok_r(NULL, " \t", &p_next);
81*d6b92ffaSHans Petter Selasky 	if (!p_num)
82*d6b92ffaSHans Petter Selasky 		return 1;
83*d6b92ffaSHans Petter Selasky 	tmp = strtoul(p_num, NULL, 0);
84*d6b92ffaSHans Petter Selasky 	if (tmp >= 0xC000)
85*d6b92ffaSHans Petter Selasky 		return 1;
86*d6b92ffaSHans Petter Selasky 
87*d6b92ffaSHans Petter Selasky 	*p_max_lid = (uint16_t) tmp;
88*d6b92ffaSHans Petter Selasky 
89*d6b92ffaSHans Petter Selasky 	return 0;
90*d6b92ffaSHans Petter Selasky }
91*d6b92ffaSHans Petter Selasky 
pack_mkey(uint64_t mkey,char * p_mkey_str)92*d6b92ffaSHans Petter Selasky static inline void pack_mkey(uint64_t mkey, char *p_mkey_str)
93*d6b92ffaSHans Petter Selasky {
94*d6b92ffaSHans Petter Selasky 	sprintf(p_mkey_str, "0x%016" PRIx64, mkey);
95*d6b92ffaSHans Petter Selasky }
96*d6b92ffaSHans Petter Selasky 
unpack_mkey(char * p_mkey_str)97*d6b92ffaSHans Petter Selasky static inline uint64_t unpack_mkey(char *p_mkey_str)
98*d6b92ffaSHans Petter Selasky {
99*d6b92ffaSHans Petter Selasky 	return strtoull(p_mkey_str, NULL, 0);
100*d6b92ffaSHans Petter Selasky }
101*d6b92ffaSHans Petter Selasky 
pack_neighbor(uint64_t guid,uint8_t portnum,char * p_str)102*d6b92ffaSHans Petter Selasky static inline void pack_neighbor(uint64_t guid, uint8_t portnum, char *p_str)
103*d6b92ffaSHans Petter Selasky {
104*d6b92ffaSHans Petter Selasky 	sprintf(p_str, "0x%016" PRIx64 ":%u", guid, portnum);
105*d6b92ffaSHans Petter Selasky }
106*d6b92ffaSHans Petter Selasky 
unpack_neighbor(char * p_str,uint64_t * guid,uint8_t * portnum)107*d6b92ffaSHans Petter Selasky static inline int unpack_neighbor(char *p_str, uint64_t *guid,
108*d6b92ffaSHans Petter Selasky 				  uint8_t *portnum)
109*d6b92ffaSHans Petter Selasky {
110*d6b92ffaSHans Petter Selasky 	char tmp_str[24];
111*d6b92ffaSHans Petter Selasky 	char *p_num, *p_next;
112*d6b92ffaSHans Petter Selasky 	unsigned long tmp_port;
113*d6b92ffaSHans Petter Selasky 
114*d6b92ffaSHans Petter Selasky 	strncpy(tmp_str, p_str, 23);
115*d6b92ffaSHans Petter Selasky 	tmp_str[23] = '\0';
116*d6b92ffaSHans Petter Selasky 	p_num = strtok_r(tmp_str, ":", &p_next);
117*d6b92ffaSHans Petter Selasky 	if (!p_num)
118*d6b92ffaSHans Petter Selasky 		return 1;
119*d6b92ffaSHans Petter Selasky 	if (guid)
120*d6b92ffaSHans Petter Selasky 		*guid = strtoull(p_num, NULL, 0);
121*d6b92ffaSHans Petter Selasky 
122*d6b92ffaSHans Petter Selasky 	p_num = strtok_r(NULL, ":", &p_next);
123*d6b92ffaSHans Petter Selasky 	if (!p_num)
124*d6b92ffaSHans Petter Selasky 		return 1;
125*d6b92ffaSHans Petter Selasky 	if (portnum) {
126*d6b92ffaSHans Petter Selasky 		tmp_port = strtoul(p_num, NULL, 0);
127*d6b92ffaSHans Petter Selasky 		CL_ASSERT(tmp_port < 0x100);
128*d6b92ffaSHans Petter Selasky 		*portnum = (uint8_t) tmp_port;
129*d6b92ffaSHans Petter Selasky 	}
130*d6b92ffaSHans Petter Selasky 
131*d6b92ffaSHans Petter Selasky 	return 0;
132*d6b92ffaSHans Petter Selasky }
133*d6b92ffaSHans Petter Selasky 
osm_db_guid2lid_guids(IN osm_db_domain_t * p_g2l,OUT cl_qlist_t * p_guid_list)134*d6b92ffaSHans Petter Selasky int osm_db_guid2lid_guids(IN osm_db_domain_t * p_g2l,
135*d6b92ffaSHans Petter Selasky 			  OUT cl_qlist_t * p_guid_list)
136*d6b92ffaSHans Petter Selasky {
137*d6b92ffaSHans Petter Selasky 	char *p_key;
138*d6b92ffaSHans Petter Selasky 	cl_list_t keys;
139*d6b92ffaSHans Petter Selasky 	osm_db_guid_elem_t *p_guid_elem;
140*d6b92ffaSHans Petter Selasky 
141*d6b92ffaSHans Petter Selasky 	cl_list_construct(&keys);
142*d6b92ffaSHans Petter Selasky 	cl_list_init(&keys, 10);
143*d6b92ffaSHans Petter Selasky 
144*d6b92ffaSHans Petter Selasky 	if (osm_db_keys(p_g2l, &keys))
145*d6b92ffaSHans Petter Selasky 		return 1;
146*d6b92ffaSHans Petter Selasky 
147*d6b92ffaSHans Petter Selasky 	while ((p_key = cl_list_remove_head(&keys)) != NULL) {
148*d6b92ffaSHans Petter Selasky 		p_guid_elem =
149*d6b92ffaSHans Petter Selasky 		    (osm_db_guid_elem_t *) malloc(sizeof(osm_db_guid_elem_t));
150*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_guid_elem != NULL);
151*d6b92ffaSHans Petter Selasky 
152*d6b92ffaSHans Petter Selasky 		p_guid_elem->guid = unpack_guid(p_key);
153*d6b92ffaSHans Petter Selasky 		cl_qlist_insert_head(p_guid_list, &p_guid_elem->item);
154*d6b92ffaSHans Petter Selasky 	}
155*d6b92ffaSHans Petter Selasky 
156*d6b92ffaSHans Petter Selasky 	cl_list_destroy(&keys);
157*d6b92ffaSHans Petter Selasky 	return 0;
158*d6b92ffaSHans Petter Selasky }
159*d6b92ffaSHans Petter Selasky 
osm_db_guid2lid_get(IN osm_db_domain_t * p_g2l,IN uint64_t guid,OUT uint16_t * p_min_lid,OUT uint16_t * p_max_lid)160*d6b92ffaSHans Petter Selasky int osm_db_guid2lid_get(IN osm_db_domain_t * p_g2l, IN uint64_t guid,
161*d6b92ffaSHans Petter Selasky 			OUT uint16_t * p_min_lid, OUT uint16_t * p_max_lid)
162*d6b92ffaSHans Petter Selasky {
163*d6b92ffaSHans Petter Selasky 	char guid_str[20];
164*d6b92ffaSHans Petter Selasky 	char *p_lid_str;
165*d6b92ffaSHans Petter Selasky 	uint16_t min_lid, max_lid;
166*d6b92ffaSHans Petter Selasky 
167*d6b92ffaSHans Petter Selasky 	pack_guid(guid, guid_str);
168*d6b92ffaSHans Petter Selasky 	p_lid_str = osm_db_lookup(p_g2l, guid_str);
169*d6b92ffaSHans Petter Selasky 	if (!p_lid_str)
170*d6b92ffaSHans Petter Selasky 		return 1;
171*d6b92ffaSHans Petter Selasky 	if (unpack_lids(p_lid_str, &min_lid, &max_lid))
172*d6b92ffaSHans Petter Selasky 		return 1;
173*d6b92ffaSHans Petter Selasky 
174*d6b92ffaSHans Petter Selasky 	if (p_min_lid)
175*d6b92ffaSHans Petter Selasky 		*p_min_lid = min_lid;
176*d6b92ffaSHans Petter Selasky 	if (p_max_lid)
177*d6b92ffaSHans Petter Selasky 		*p_max_lid = max_lid;
178*d6b92ffaSHans Petter Selasky 
179*d6b92ffaSHans Petter Selasky 	return 0;
180*d6b92ffaSHans Petter Selasky }
181*d6b92ffaSHans Petter Selasky 
osm_db_guid2lid_set(IN osm_db_domain_t * p_g2l,IN uint64_t guid,IN uint16_t min_lid,IN uint16_t max_lid)182*d6b92ffaSHans Petter Selasky int osm_db_guid2lid_set(IN osm_db_domain_t * p_g2l, IN uint64_t guid,
183*d6b92ffaSHans Petter Selasky 			IN uint16_t min_lid, IN uint16_t max_lid)
184*d6b92ffaSHans Petter Selasky {
185*d6b92ffaSHans Petter Selasky 	char guid_str[20];
186*d6b92ffaSHans Petter Selasky 	char lid_str[16];
187*d6b92ffaSHans Petter Selasky 
188*d6b92ffaSHans Petter Selasky 	pack_guid(guid, guid_str);
189*d6b92ffaSHans Petter Selasky 	pack_lids(min_lid, max_lid, lid_str);
190*d6b92ffaSHans Petter Selasky 
191*d6b92ffaSHans Petter Selasky 	return osm_db_update(p_g2l, guid_str, lid_str);
192*d6b92ffaSHans Petter Selasky }
193*d6b92ffaSHans Petter Selasky 
osm_db_guid2lid_delete(IN osm_db_domain_t * p_g2l,IN uint64_t guid)194*d6b92ffaSHans Petter Selasky int osm_db_guid2lid_delete(IN osm_db_domain_t * p_g2l, IN uint64_t guid)
195*d6b92ffaSHans Petter Selasky {
196*d6b92ffaSHans Petter Selasky 	char guid_str[20];
197*d6b92ffaSHans Petter Selasky 	pack_guid(guid, guid_str);
198*d6b92ffaSHans Petter Selasky 	return osm_db_delete(p_g2l, guid_str);
199*d6b92ffaSHans Petter Selasky }
200*d6b92ffaSHans Petter Selasky 
osm_db_guid2mkey_guids(IN osm_db_domain_t * p_g2m,OUT cl_qlist_t * p_guid_list)201*d6b92ffaSHans Petter Selasky int osm_db_guid2mkey_guids(IN osm_db_domain_t * p_g2m,
202*d6b92ffaSHans Petter Selasky 			   OUT cl_qlist_t * p_guid_list)
203*d6b92ffaSHans Petter Selasky {
204*d6b92ffaSHans Petter Selasky 	char *p_key;
205*d6b92ffaSHans Petter Selasky 	cl_list_t keys;
206*d6b92ffaSHans Petter Selasky 	osm_db_guid_elem_t *p_guid_elem;
207*d6b92ffaSHans Petter Selasky 
208*d6b92ffaSHans Petter Selasky 	cl_list_construct(&keys);
209*d6b92ffaSHans Petter Selasky 	cl_list_init(&keys, 10);
210*d6b92ffaSHans Petter Selasky 
211*d6b92ffaSHans Petter Selasky 	if (osm_db_keys(p_g2m, &keys))
212*d6b92ffaSHans Petter Selasky 		return 1;
213*d6b92ffaSHans Petter Selasky 
214*d6b92ffaSHans Petter Selasky 	while ((p_key = cl_list_remove_head(&keys)) != NULL) {
215*d6b92ffaSHans Petter Selasky 		p_guid_elem =
216*d6b92ffaSHans Petter Selasky 		    (osm_db_guid_elem_t *) malloc(sizeof(osm_db_guid_elem_t));
217*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_guid_elem != NULL);
218*d6b92ffaSHans Petter Selasky 
219*d6b92ffaSHans Petter Selasky 		p_guid_elem->guid = unpack_guid(p_key);
220*d6b92ffaSHans Petter Selasky 		cl_qlist_insert_head(p_guid_list, &p_guid_elem->item);
221*d6b92ffaSHans Petter Selasky 	}
222*d6b92ffaSHans Petter Selasky 
223*d6b92ffaSHans Petter Selasky 	cl_list_destroy(&keys);
224*d6b92ffaSHans Petter Selasky 	return 0;
225*d6b92ffaSHans Petter Selasky }
226*d6b92ffaSHans Petter Selasky 
osm_db_guid2mkey_get(IN osm_db_domain_t * p_g2m,IN uint64_t guid,OUT uint64_t * p_mkey)227*d6b92ffaSHans Petter Selasky int osm_db_guid2mkey_get(IN osm_db_domain_t * p_g2m, IN uint64_t guid,
228*d6b92ffaSHans Petter Selasky 			 OUT uint64_t * p_mkey)
229*d6b92ffaSHans Petter Selasky {
230*d6b92ffaSHans Petter Selasky 	char guid_str[20];
231*d6b92ffaSHans Petter Selasky 	char *p_mkey_str;
232*d6b92ffaSHans Petter Selasky 
233*d6b92ffaSHans Petter Selasky 	pack_guid(guid, guid_str);
234*d6b92ffaSHans Petter Selasky 	p_mkey_str = osm_db_lookup(p_g2m, guid_str);
235*d6b92ffaSHans Petter Selasky 	if (!p_mkey_str)
236*d6b92ffaSHans Petter Selasky 		return 1;
237*d6b92ffaSHans Petter Selasky 
238*d6b92ffaSHans Petter Selasky 	if (p_mkey)
239*d6b92ffaSHans Petter Selasky 		*p_mkey = unpack_mkey(p_mkey_str);
240*d6b92ffaSHans Petter Selasky 
241*d6b92ffaSHans Petter Selasky 	return 0;
242*d6b92ffaSHans Petter Selasky }
243*d6b92ffaSHans Petter Selasky 
osm_db_guid2mkey_set(IN osm_db_domain_t * p_g2m,IN uint64_t guid,IN uint64_t mkey)244*d6b92ffaSHans Petter Selasky int osm_db_guid2mkey_set(IN osm_db_domain_t * p_g2m, IN uint64_t guid,
245*d6b92ffaSHans Petter Selasky 			 IN uint64_t mkey)
246*d6b92ffaSHans Petter Selasky {
247*d6b92ffaSHans Petter Selasky 	char guid_str[20];
248*d6b92ffaSHans Petter Selasky 	char mkey_str[20];
249*d6b92ffaSHans Petter Selasky 
250*d6b92ffaSHans Petter Selasky 	pack_guid(guid, guid_str);
251*d6b92ffaSHans Petter Selasky 	pack_mkey(mkey, mkey_str);
252*d6b92ffaSHans Petter Selasky 
253*d6b92ffaSHans Petter Selasky 	return osm_db_update(p_g2m, guid_str, mkey_str);
254*d6b92ffaSHans Petter Selasky }
255*d6b92ffaSHans Petter Selasky 
osm_db_guid2mkey_delete(IN osm_db_domain_t * p_g2m,IN uint64_t guid)256*d6b92ffaSHans Petter Selasky int osm_db_guid2mkey_delete(IN osm_db_domain_t * p_g2m, IN uint64_t guid)
257*d6b92ffaSHans Petter Selasky {
258*d6b92ffaSHans Petter Selasky 	char guid_str[20];
259*d6b92ffaSHans Petter Selasky 	pack_guid(guid, guid_str);
260*d6b92ffaSHans Petter Selasky 	return osm_db_delete(p_g2m, guid_str);
261*d6b92ffaSHans Petter Selasky }
262*d6b92ffaSHans Petter Selasky 
osm_db_neighbor_guids(IN osm_db_domain_t * p_neighbor,OUT cl_qlist_t * p_neighbor_list)263*d6b92ffaSHans Petter Selasky int osm_db_neighbor_guids(IN osm_db_domain_t * p_neighbor,
264*d6b92ffaSHans Petter Selasky 			  OUT cl_qlist_t * p_neighbor_list)
265*d6b92ffaSHans Petter Selasky {
266*d6b92ffaSHans Petter Selasky 	char *p_key;
267*d6b92ffaSHans Petter Selasky 	cl_list_t keys;
268*d6b92ffaSHans Petter Selasky 	osm_db_neighbor_elem_t *p_neighbor_elem;
269*d6b92ffaSHans Petter Selasky 
270*d6b92ffaSHans Petter Selasky 	cl_list_construct(&keys);
271*d6b92ffaSHans Petter Selasky 	cl_list_init(&keys, 10);
272*d6b92ffaSHans Petter Selasky 
273*d6b92ffaSHans Petter Selasky 	if (osm_db_keys(p_neighbor, &keys))
274*d6b92ffaSHans Petter Selasky 		return 1;
275*d6b92ffaSHans Petter Selasky 
276*d6b92ffaSHans Petter Selasky 	while ((p_key = cl_list_remove_head(&keys)) != NULL) {
277*d6b92ffaSHans Petter Selasky 		p_neighbor_elem =
278*d6b92ffaSHans Petter Selasky 		    (osm_db_neighbor_elem_t *) malloc(sizeof(osm_db_neighbor_elem_t));
279*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_neighbor_elem != NULL);
280*d6b92ffaSHans Petter Selasky 
281*d6b92ffaSHans Petter Selasky 		unpack_neighbor(p_key, &p_neighbor_elem->guid,
282*d6b92ffaSHans Petter Selasky 				&p_neighbor_elem->portnum);
283*d6b92ffaSHans Petter Selasky 		cl_qlist_insert_head(p_neighbor_list, &p_neighbor_elem->item);
284*d6b92ffaSHans Petter Selasky 	}
285*d6b92ffaSHans Petter Selasky 
286*d6b92ffaSHans Petter Selasky 	cl_list_destroy(&keys);
287*d6b92ffaSHans Petter Selasky 	return 0;
288*d6b92ffaSHans Petter Selasky }
289*d6b92ffaSHans Petter Selasky 
osm_db_neighbor_get(IN osm_db_domain_t * p_neighbor,IN uint64_t guid1,IN uint8_t portnum1,OUT uint64_t * p_guid2,OUT uint8_t * p_portnum2)290*d6b92ffaSHans Petter Selasky int osm_db_neighbor_get(IN osm_db_domain_t * p_neighbor, IN uint64_t guid1,
291*d6b92ffaSHans Petter Selasky 			IN uint8_t portnum1, OUT uint64_t * p_guid2,
292*d6b92ffaSHans Petter Selasky 			OUT uint8_t * p_portnum2)
293*d6b92ffaSHans Petter Selasky {
294*d6b92ffaSHans Petter Selasky 	char neighbor_str[24];
295*d6b92ffaSHans Petter Selasky 	char *p_other_str;
296*d6b92ffaSHans Petter Selasky 	uint64_t temp_guid;
297*d6b92ffaSHans Petter Selasky 	uint8_t temp_portnum;
298*d6b92ffaSHans Petter Selasky 
299*d6b92ffaSHans Petter Selasky 	pack_neighbor(guid1, portnum1, neighbor_str);
300*d6b92ffaSHans Petter Selasky 	p_other_str = osm_db_lookup(p_neighbor, neighbor_str);
301*d6b92ffaSHans Petter Selasky 	if (!p_other_str)
302*d6b92ffaSHans Petter Selasky 		return 1;
303*d6b92ffaSHans Petter Selasky 	if (unpack_neighbor(p_other_str, &temp_guid, &temp_portnum))
304*d6b92ffaSHans Petter Selasky 		return 1;
305*d6b92ffaSHans Petter Selasky 
306*d6b92ffaSHans Petter Selasky 	if (p_guid2)
307*d6b92ffaSHans Petter Selasky 		*p_guid2 = temp_guid;
308*d6b92ffaSHans Petter Selasky 	if (p_portnum2)
309*d6b92ffaSHans Petter Selasky 		*p_portnum2 = temp_portnum;
310*d6b92ffaSHans Petter Selasky 
311*d6b92ffaSHans Petter Selasky 	return 0;
312*d6b92ffaSHans Petter Selasky }
313*d6b92ffaSHans Petter Selasky 
osm_db_neighbor_set(IN osm_db_domain_t * p_neighbor,IN uint64_t guid1,IN uint8_t portnum1,IN uint64_t guid2,IN uint8_t portnum2)314*d6b92ffaSHans Petter Selasky int osm_db_neighbor_set(IN osm_db_domain_t * p_neighbor, IN uint64_t guid1,
315*d6b92ffaSHans Petter Selasky 			IN uint8_t portnum1, IN uint64_t guid2,
316*d6b92ffaSHans Petter Selasky 			IN uint8_t portnum2)
317*d6b92ffaSHans Petter Selasky {
318*d6b92ffaSHans Petter Selasky 	char n1_str[24], n2_str[24];
319*d6b92ffaSHans Petter Selasky 
320*d6b92ffaSHans Petter Selasky 	pack_neighbor(guid1, portnum1, n1_str);
321*d6b92ffaSHans Petter Selasky 	pack_neighbor(guid2, portnum2, n2_str);
322*d6b92ffaSHans Petter Selasky 
323*d6b92ffaSHans Petter Selasky 	return osm_db_update(p_neighbor, n1_str, n2_str);
324*d6b92ffaSHans Petter Selasky }
325*d6b92ffaSHans Petter Selasky 
osm_db_neighbor_delete(IN osm_db_domain_t * p_neighbor,IN uint64_t guid,IN uint8_t portnum)326*d6b92ffaSHans Petter Selasky int osm_db_neighbor_delete(IN osm_db_domain_t * p_neighbor, IN uint64_t guid,
327*d6b92ffaSHans Petter Selasky 			   IN uint8_t portnum)
328*d6b92ffaSHans Petter Selasky {
329*d6b92ffaSHans Petter Selasky 	char n_str[24];
330*d6b92ffaSHans Petter Selasky 
331*d6b92ffaSHans Petter Selasky 	pack_neighbor(guid, portnum, n_str);
332*d6b92ffaSHans Petter Selasky 	return osm_db_delete(p_neighbor, n_str);
333*d6b92ffaSHans Petter Selasky }
334