1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5d6b92ffaSHans Petter Selasky  *
6d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11d6b92ffaSHans Petter Selasky  *
12d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14d6b92ffaSHans Petter Selasky  *     conditions are met:
15d6b92ffaSHans Petter Selasky  *
16d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18d6b92ffaSHans Petter Selasky  *        disclaimer.
19d6b92ffaSHans Petter Selasky  *
20d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24d6b92ffaSHans Petter Selasky  *
25d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32d6b92ffaSHans Petter Selasky  * SOFTWARE.
33d6b92ffaSHans Petter Selasky  *
34d6b92ffaSHans Petter Selasky  */
35d6b92ffaSHans Petter Selasky 
36d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
37d6b92ffaSHans Petter Selasky #  include <config.h>
38d6b92ffaSHans Petter Selasky #endif				/* HAVE_CONFIG_H */
39d6b92ffaSHans Petter Selasky 
40d6b92ffaSHans Petter Selasky #if defined(OSM_VENDOR_INTF_SIM)
41d6b92ffaSHans Petter Selasky #undef IN
42d6b92ffaSHans Petter Selasky #undef OUT
43d6b92ffaSHans Petter Selasky 
44d6b92ffaSHans Petter Selasky #include <unistd.h>
45d6b92ffaSHans Petter Selasky #include <vendor/osm_vendor_api.h>
46d6b92ffaSHans Petter Selasky #include <opensm/osm_log.h>
47d6b92ffaSHans Petter Selasky #include <stdlib.h>
48d6b92ffaSHans Petter Selasky #include <stdio.h>
49d6b92ffaSHans Petter Selasky #include <sys/types.h>
50d6b92ffaSHans Petter Selasky #include <dirent.h>
51d6b92ffaSHans Petter Selasky #include <stdlib.h>
52d6b92ffaSHans Petter Selasky #include <sys/stat.h>
53d6b92ffaSHans Petter Selasky #include <stdint.h>
54d6b92ffaSHans Petter Selasky #include <fcntl.h>
55d6b92ffaSHans Petter Selasky 
56d6b92ffaSHans Petter Selasky /******************************************************************************
57d6b92ffaSHans Petter Selasky *
58d6b92ffaSHans Petter Selasky * Provides the functionality for selecting an HCA Port and Obtaining it's guid.
59d6b92ffaSHans Petter Selasky * This version is based on $IBMGTSIM_DIR/$IBMGTSIM_NODE file system.
60d6b92ffaSHans Petter Selasky * This is a mimic of the OpenIB gen1 file system
61d6b92ffaSHans Petter Selasky *
62d6b92ffaSHans Petter Selasky ******************************************************************************/
63d6b92ffaSHans Petter Selasky 
__get_simulator_dir(void)64d6b92ffaSHans Petter Selasky char *__get_simulator_dir(void)
65d6b92ffaSHans Petter Selasky {
66d6b92ffaSHans Petter Selasky 	static char *ibmgtSimDir = NULL;
67d6b92ffaSHans Petter Selasky 	static char *defaultIbmgtSimDir = "/tmp/ibmgtsim";
68d6b92ffaSHans Petter Selasky 	static char *ibmgtSimNode = NULL;
69d6b92ffaSHans Petter Selasky 	static char dirName[1024];
70d6b92ffaSHans Petter Selasky 
71d6b92ffaSHans Petter Selasky 	/* we use the first pointer to know if we were here */
72d6b92ffaSHans Petter Selasky 	if (ibmgtSimDir == NULL) {
73d6b92ffaSHans Petter Selasky 		/* obtain the simulator directory */
74d6b92ffaSHans Petter Selasky 		ibmgtSimDir = getenv("IBMGTSIM_DIR");
75d6b92ffaSHans Petter Selasky 		if (ibmgtSimDir == NULL) {
76d6b92ffaSHans Petter Selasky 			printf
77d6b92ffaSHans Petter Selasky 			    ("-W- Environment variable: IBMGTSIM_DIR does not exist.\n");
78d6b92ffaSHans Petter Selasky 			printf
79d6b92ffaSHans Petter Selasky 			    ("    Please create one used by the simulator.\n");
80d6b92ffaSHans Petter Selasky 			printf("    Using /tmp/ibmgtsim as default.\n");
81d6b92ffaSHans Petter Selasky 			ibmgtSimDir = defaultIbmgtSimDir;
82d6b92ffaSHans Petter Selasky 		}
83d6b92ffaSHans Petter Selasky 
84d6b92ffaSHans Petter Selasky 		/* obtain the node name we simulate */
85d6b92ffaSHans Petter Selasky 		ibmgtSimNode = getenv("IBMGTSIM_NODE");
86d6b92ffaSHans Petter Selasky 		if (ibmgtSimNode == NULL) {
87d6b92ffaSHans Petter Selasky 			printf
88d6b92ffaSHans Petter Selasky 			    ("-W- Environment variable: IBMGTSIM_NODE does not exist.\n");
89d6b92ffaSHans Petter Selasky 			printf
90d6b92ffaSHans Petter Selasky 			    ("    This variable should be the name of the node you wish to simulate.\n");
91d6b92ffaSHans Petter Selasky 			printf("    Using H-1 as default.\n");
92d6b92ffaSHans Petter Selasky 			ibmgtSimNode = "H-1";
93d6b92ffaSHans Petter Selasky 		}
94d6b92ffaSHans Petter Selasky 		sprintf(dirName, "%s/%s", ibmgtSimDir, ibmgtSimNode);
95d6b92ffaSHans Petter Selasky 	}
96d6b92ffaSHans Petter Selasky 
97d6b92ffaSHans Petter Selasky 	return dirName;
98d6b92ffaSHans Petter Selasky }
99d6b92ffaSHans Petter Selasky 
100d6b92ffaSHans Petter Selasky typedef struct _osm_ca_info {
101d6b92ffaSHans Petter Selasky 	ib_net64_t guid;
102d6b92ffaSHans Petter Selasky 	size_t attr_size;
103d6b92ffaSHans Petter Selasky 	ib_ca_attr_t *p_attr;
104d6b92ffaSHans Petter Selasky 
105d6b92ffaSHans Petter Selasky } osm_ca_info_t;
106d6b92ffaSHans Petter Selasky 
107d6b92ffaSHans Petter Selasky /**********************************************************************
108d6b92ffaSHans Petter Selasky  * Returns a pointer to the port attribute of the specified port
109d6b92ffaSHans Petter Selasky  * owned by this CA.
110d6b92ffaSHans Petter Selasky  ************************************************************************/
__osm_ca_info_get_port_attr_ptr(IN const osm_ca_info_t * const p_ca_info,IN const uint8_t index)111d6b92ffaSHans Petter Selasky static ib_port_attr_t *__osm_ca_info_get_port_attr_ptr(IN const osm_ca_info_t *
112d6b92ffaSHans Petter Selasky 						       const p_ca_info,
113d6b92ffaSHans Petter Selasky 						       IN const uint8_t index)
114d6b92ffaSHans Petter Selasky {
115d6b92ffaSHans Petter Selasky 	return (&p_ca_info->p_attr->p_port_attr[index]);
116d6b92ffaSHans Petter Selasky }
117d6b92ffaSHans Petter Selasky 
118d6b92ffaSHans Petter Selasky /**********************************************************************
119d6b92ffaSHans Petter Selasky  * Obtain the number of local CAs by scanning /proc/infiniband/core
120d6b92ffaSHans Petter Selasky  **********************************************************************/
__hca_sim_get_num_cas(void)121d6b92ffaSHans Petter Selasky int __hca_sim_get_num_cas(void)
122d6b92ffaSHans Petter Selasky {
123d6b92ffaSHans Petter Selasky 	int num_cas = 0;
124d6b92ffaSHans Petter Selasky 	DIR *dp;
125d6b92ffaSHans Petter Selasky 	struct dirent *ep;
126d6b92ffaSHans Petter Selasky 
127d6b92ffaSHans Petter Selasky 	dp = opendir(__get_simulator_dir());
128d6b92ffaSHans Petter Selasky 
129d6b92ffaSHans Petter Selasky 	if (dp != NULL) {
130d6b92ffaSHans Petter Selasky 		while ((ep = readdir(dp))) {
131d6b92ffaSHans Petter Selasky 			/* CAs are directories with the format ca[1-9][0-9]* */
132d6b92ffaSHans Petter Selasky 			/*  if ((ep->d_type == DT_DIR) && !strncmp(ep->d_name, "ca", 2)) */
133d6b92ffaSHans Petter Selasky 			if (!strncmp(ep->d_name, "ca", 2)) {
134d6b92ffaSHans Petter Selasky 				num_cas++;
135d6b92ffaSHans Petter Selasky 			}
136d6b92ffaSHans Petter Selasky 		}
137d6b92ffaSHans Petter Selasky 		closedir(dp);
138d6b92ffaSHans Petter Selasky 	} else {
139d6b92ffaSHans Petter Selasky 		printf("__hca_sim_get_num_cas: ERROR : ail to open dir %s\n",
140d6b92ffaSHans Petter Selasky 		       __get_simulator_dir());
141d6b92ffaSHans Petter Selasky 		exit(1);
142d6b92ffaSHans Petter Selasky 	}
143d6b92ffaSHans Petter Selasky 
144d6b92ffaSHans Petter Selasky 	if (!num_cas)
145d6b92ffaSHans Petter Selasky 		exit(1);
146d6b92ffaSHans Petter Selasky 	return num_cas;
147d6b92ffaSHans Petter Selasky }
148d6b92ffaSHans Petter Selasky 
149d6b92ffaSHans Petter Selasky /*
150d6b92ffaSHans Petter Selasky   name:          InfiniHost0
151d6b92ffaSHans Petter Selasky   provider:      tavor
152d6b92ffaSHans Petter Selasky   node GUID:     0002:c900:0120:3470
153d6b92ffaSHans Petter Selasky   ports:         2
154d6b92ffaSHans Petter Selasky   vendor ID:     0x2c9
155d6b92ffaSHans Petter Selasky   device ID:     0x5a44
156d6b92ffaSHans Petter Selasky   HW revision:   0xa1
157d6b92ffaSHans Petter Selasky   FW revision:   0x300020080
158d6b92ffaSHans Petter Selasky */
159d6b92ffaSHans Petter Selasky typedef struct _sim_ca_info {
160d6b92ffaSHans Petter Selasky 	char name[32];
161d6b92ffaSHans Petter Selasky 	char provider[32];
162d6b92ffaSHans Petter Selasky 	uint64_t guid;
163d6b92ffaSHans Petter Selasky 	uint8_t num_ports;
164d6b92ffaSHans Petter Selasky 	uint32_t vend_id;
165d6b92ffaSHans Petter Selasky 	uint16_t dev_id;
166d6b92ffaSHans Petter Selasky 	uint16_t rev_id;
167d6b92ffaSHans Petter Selasky 	uint64_t fw_rev;
168d6b92ffaSHans Petter Selasky } sim_ca_info_t;
169d6b92ffaSHans Petter Selasky 
170d6b92ffaSHans Petter Selasky /**********************************************************************
171d6b92ffaSHans Petter Selasky  * Parse the CA Info file available in ibmgtSimDir/caN/info
172d6b92ffaSHans Petter Selasky  **********************************************************************/
173d6b92ffaSHans Petter Selasky static ib_api_status_t
__parse_ca_info_file(IN osm_vendor_t * const p_vend,IN uint32_t idx,OUT sim_ca_info_t * sim_ca_info)174d6b92ffaSHans Petter Selasky __parse_ca_info_file(IN osm_vendor_t * const p_vend,
175d6b92ffaSHans Petter Selasky 		     IN uint32_t idx, OUT sim_ca_info_t * sim_ca_info)
176d6b92ffaSHans Petter Selasky {
177d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_ERROR;
178d6b92ffaSHans Petter Selasky 	int info_file;
179d6b92ffaSHans Petter Selasky 	char file_name[256];
180d6b92ffaSHans Petter Selasky 	char file_buffer[3200];
181d6b92ffaSHans Petter Selasky 	char *p_ch;
182d6b92ffaSHans Petter Selasky 	int g1, g2, g3, g4;
183d6b92ffaSHans Petter Selasky 	int num_ports;
184d6b92ffaSHans Petter Selasky 	uint32_t len;
185d6b92ffaSHans Petter Selasky 
186d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
187d6b92ffaSHans Petter Selasky 
188d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
189d6b92ffaSHans Petter Selasky 		"__parse_ca_info_file: " "Querying CA %d.\n", idx);
190d6b92ffaSHans Petter Selasky 
191d6b92ffaSHans Petter Selasky 	/* we use the proc file system so we must be able to open the info file .. */
192d6b92ffaSHans Petter Selasky 	sprintf(file_name, "%s/ca%d/info", __get_simulator_dir(), idx);
193d6b92ffaSHans Petter Selasky 	info_file = open(file_name, O_RDONLY);
194d6b92ffaSHans Petter Selasky 	if (!info_file) {
195d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
196d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5105: "
197d6b92ffaSHans Petter Selasky 			"Fail to open HCA:%d info file:(%s).\n", idx,
198d6b92ffaSHans Petter Selasky 			file_name);
199d6b92ffaSHans Petter Selasky 		goto Exit;
200d6b92ffaSHans Petter Selasky 	}
201d6b92ffaSHans Petter Selasky 
202d6b92ffaSHans Petter Selasky 	/* read in the file */
203d6b92ffaSHans Petter Selasky 	len = read(info_file, file_buffer, 3200);
204d6b92ffaSHans Petter Selasky 	close(info_file);
205d6b92ffaSHans Petter Selasky 	file_buffer[len] = '\0';
206d6b92ffaSHans Petter Selasky 
207d6b92ffaSHans Petter Selasky 	/*
208d6b92ffaSHans Petter Selasky 	   parse the file ...
209d6b92ffaSHans Petter Selasky 	   name:          InfiniHost0
210d6b92ffaSHans Petter Selasky 	   provider:      tavor
211d6b92ffaSHans Petter Selasky 	   node GUID:     0002:c900:0120:3470
212d6b92ffaSHans Petter Selasky 	   ports:         2
213d6b92ffaSHans Petter Selasky 	   vendor ID:     0x2c9
214d6b92ffaSHans Petter Selasky 	   device ID:     0x5a44
215d6b92ffaSHans Petter Selasky 	   HW revision:   0xa1
216d6b92ffaSHans Petter Selasky 	   FW revision:   0x300020080
217d6b92ffaSHans Petter Selasky 	 */
218d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "name:"))) {
219d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
220d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5106: "
221d6b92ffaSHans Petter Selasky 			"Fail to obtain HCA name. In info file:(%s).\n",
222d6b92ffaSHans Petter Selasky 			file_buffer);
223d6b92ffaSHans Petter Selasky 		goto Exit;
224d6b92ffaSHans Petter Selasky 	}
225d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "name: %s", sim_ca_info->name) != 1) {
226d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
227d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5107: "
228d6b92ffaSHans Petter Selasky 			"Fail to parse name in info file:(%s).\n", p_ch);
229d6b92ffaSHans Petter Selasky 		goto Exit;
230d6b92ffaSHans Petter Selasky 	}
231d6b92ffaSHans Petter Selasky 
232d6b92ffaSHans Petter Selasky 	/* get the guid of the HCA */
233d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "node GUID:"))) {
234d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
235d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5108: "
236d6b92ffaSHans Petter Selasky 			"Fail to obtain GUID in info file:(%s).\n",
237d6b92ffaSHans Petter Selasky 			file_buffer);
238d6b92ffaSHans Petter Selasky 		goto Exit;
239d6b92ffaSHans Petter Selasky 	}
240d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "node GUID: %x:%x:%x:%x", &g1, &g2, &g3, &g4) != 4) {
241d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
242d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5109: "
243d6b92ffaSHans Petter Selasky 			"Fail to parse GUID in info file:(%s).\n", p_ch);
244d6b92ffaSHans Petter Selasky 		goto Exit;
245d6b92ffaSHans Petter Selasky 	}
246d6b92ffaSHans Petter Selasky 	sim_ca_info->guid = (uint64_t) g1 << 48 | (uint64_t) g1 << 32
247d6b92ffaSHans Petter Selasky 	    | (uint64_t) g1 << 16 | (uint64_t) g3;
248d6b92ffaSHans Petter Selasky 
249d6b92ffaSHans Petter Selasky 	/* obtain number of ports */
250d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "ports:"))) {
251d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
252d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5110: "
253d6b92ffaSHans Petter Selasky 			"Fail to obtain number of ports in info file:(%s).\n",
254d6b92ffaSHans Petter Selasky 			file_buffer);
255d6b92ffaSHans Petter Selasky 		goto Exit;
256d6b92ffaSHans Petter Selasky 	}
257d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "ports: %d", &num_ports) != 1) {
258d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
259d6b92ffaSHans Petter Selasky 			"__parse_ca_info_file: ERR 5111: "
260d6b92ffaSHans Petter Selasky 			"Fail to parse num ports in info file:(%s).\n", p_ch);
261d6b92ffaSHans Petter Selasky 		goto Exit;
262d6b92ffaSHans Petter Selasky 	}
263d6b92ffaSHans Petter Selasky 	sim_ca_info->num_ports = num_ports;
264d6b92ffaSHans Petter Selasky 
265d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
266d6b92ffaSHans Petter Selasky 		"__parse_ca_info_file: "
267d6b92ffaSHans Petter Selasky 		"CA1 = name:%s guid:0x%" PRIx64 " ports:%d\n",
268d6b92ffaSHans Petter Selasky 		sim_ca_info->name, sim_ca_info->guid, sim_ca_info->num_ports);
269d6b92ffaSHans Petter Selasky 
270d6b92ffaSHans Petter Selasky 	status = IB_SUCCESS;
271d6b92ffaSHans Petter Selasky Exit:
272d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
273d6b92ffaSHans Petter Selasky 	return status;
274d6b92ffaSHans Petter Selasky }
275d6b92ffaSHans Petter Selasky 
276d6b92ffaSHans Petter Selasky /*
277d6b92ffaSHans Petter Selasky   state:         ACTIVE
278d6b92ffaSHans Petter Selasky   LID:           0x0001
279d6b92ffaSHans Petter Selasky   LMC:           0x0000
280d6b92ffaSHans Petter Selasky   SM LID:        0x0001
281d6b92ffaSHans Petter Selasky   SM SL:         0x0000
282d6b92ffaSHans Petter Selasky   Capabilities:  IsSM
283d6b92ffaSHans Petter Selasky   IsTrapSupported
284d6b92ffaSHans Petter Selasky   IsAutomaticMigrationSupported
285d6b92ffaSHans Petter Selasky   IsSLMappingSupported
286d6b92ffaSHans Petter Selasky   IsLEDInfoSupported
287d6b92ffaSHans Petter Selasky   IsSystemImageGUIDSupported
288d6b92ffaSHans Petter Selasky   IsVendorClassSupported
289d6b92ffaSHans Petter Selasky   IsCapabilityMaskNoticeSupported
290d6b92ffaSHans Petter Selasky */
291d6b92ffaSHans Petter Selasky typedef struct _sim_port_info {
292d6b92ffaSHans Petter Selasky 	uint8_t state;
293d6b92ffaSHans Petter Selasky 	uint16_t lid;
294d6b92ffaSHans Petter Selasky 	uint8_t lmc;
295d6b92ffaSHans Petter Selasky 	uint16_t sm_lid;
296d6b92ffaSHans Petter Selasky 	uint8_t sm_sl;
297d6b92ffaSHans Petter Selasky } sim_port_info_t;
298d6b92ffaSHans Petter Selasky 
299d6b92ffaSHans Petter Selasky /**********************************************************************
300d6b92ffaSHans Petter Selasky  * Parse the Port Info file available in ibmgtSimDir/caN/portM/info
301d6b92ffaSHans Petter Selasky  * Port num is 1..N
302d6b92ffaSHans Petter Selasky  **********************************************************************/
303d6b92ffaSHans Petter Selasky static ib_api_status_t
__parse_port_info_file(IN osm_vendor_t * const p_vend,IN uint32_t hca_idx,IN uint8_t port_num,OUT sim_port_info_t * sim_port_info)304d6b92ffaSHans Petter Selasky __parse_port_info_file(IN osm_vendor_t * const p_vend,
305d6b92ffaSHans Petter Selasky 		       IN uint32_t hca_idx,
306d6b92ffaSHans Petter Selasky 		       IN uint8_t port_num, OUT sim_port_info_t * sim_port_info)
307d6b92ffaSHans Petter Selasky {
308d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_ERROR;
309d6b92ffaSHans Petter Selasky 	int info_file;
310d6b92ffaSHans Petter Selasky 	char file_name[256];
311d6b92ffaSHans Petter Selasky 	char file_buffer[3200];
312d6b92ffaSHans Petter Selasky 	char state[12];
313d6b92ffaSHans Petter Selasky 	char *p_ch;
314d6b92ffaSHans Petter Selasky 	int lid, sm_lid, lmc, sm_sl;
315d6b92ffaSHans Petter Selasky 	uint32_t len;
316d6b92ffaSHans Petter Selasky 
317d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
318d6b92ffaSHans Petter Selasky 
319d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
320d6b92ffaSHans Petter Selasky 		"__parse_port_info_file: "
321d6b92ffaSHans Petter Selasky 		"Parsing Proc File System Port Info CA %d Port %d.\n", hca_idx,
322d6b92ffaSHans Petter Selasky 		port_num);
323d6b92ffaSHans Petter Selasky 
324d6b92ffaSHans Petter Selasky 	/* we use the proc file system so we must be able to open the info file .. */
325d6b92ffaSHans Petter Selasky 	sprintf(file_name, "%s/ca%d/port%d/info", __get_simulator_dir(),
326d6b92ffaSHans Petter Selasky 		hca_idx, port_num);
327d6b92ffaSHans Petter Selasky 	info_file = open(file_name, O_RDONLY);
328d6b92ffaSHans Petter Selasky 	if (!info_file) {
329d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
330d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5112: "
331d6b92ffaSHans Petter Selasky 			"Fail to open HCA:%d Port:%d info file:(%s).\n",
332d6b92ffaSHans Petter Selasky 			hca_idx, port_num, file_name);
333d6b92ffaSHans Petter Selasky 		goto Exit;
334d6b92ffaSHans Petter Selasky 	}
335d6b92ffaSHans Petter Selasky 
336d6b92ffaSHans Petter Selasky 	/* read in the file */
337d6b92ffaSHans Petter Selasky 	len = read(info_file, file_buffer, 3200);
338d6b92ffaSHans Petter Selasky 	close(info_file);
339d6b92ffaSHans Petter Selasky 	file_buffer[len] = '\0';
340d6b92ffaSHans Petter Selasky 
341d6b92ffaSHans Petter Selasky 	/*
342d6b92ffaSHans Petter Selasky 	   parse the file ...
343d6b92ffaSHans Petter Selasky 	   state:         ACTIVE
344d6b92ffaSHans Petter Selasky 	   LID:           0x0001
345d6b92ffaSHans Petter Selasky 	   LMC:           0x0000
346d6b92ffaSHans Petter Selasky 	   SM LID:        0x0001
347d6b92ffaSHans Petter Selasky 	   SM SL:         0x0000
348d6b92ffaSHans Petter Selasky 	   ...
349d6b92ffaSHans Petter Selasky 	 */
350d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "state:"))) {
351d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
352d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5113: "
353d6b92ffaSHans Petter Selasky 			"Fail to obtain port state. In info file:(%s).\n",
354d6b92ffaSHans Petter Selasky 			file_buffer);
355d6b92ffaSHans Petter Selasky 		goto Exit;
356d6b92ffaSHans Petter Selasky 	}
357d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "state: %s", state) != 1) {
358d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
359d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5114: "
360d6b92ffaSHans Petter Selasky 			"Fail to parse state from info file:(%s).\n", p_ch);
361d6b92ffaSHans Petter Selasky 		goto Exit;
362d6b92ffaSHans Petter Selasky 	}
363d6b92ffaSHans Petter Selasky 
364d6b92ffaSHans Petter Selasky 	if (!strcmp(state, "ACTIVE"))
365d6b92ffaSHans Petter Selasky 		sim_port_info->state = IB_LINK_ACTIVE;
366d6b92ffaSHans Petter Selasky 	else if (!strcmp(state, "DOWN"))
367d6b92ffaSHans Petter Selasky 		sim_port_info->state = IB_LINK_DOWN;
368d6b92ffaSHans Petter Selasky 	else if (!strcmp(state, "INIT"))
369d6b92ffaSHans Petter Selasky 		sim_port_info->state = IB_LINK_INIT;
370d6b92ffaSHans Petter Selasky 	else if (!strcmp(state, "ARMED"))
371d6b92ffaSHans Petter Selasky 		sim_port_info->state = IB_LINK_ARMED;
372d6b92ffaSHans Petter Selasky 	else
373d6b92ffaSHans Petter Selasky 		sim_port_info->state = 0;
374d6b92ffaSHans Petter Selasky 
375d6b92ffaSHans Petter Selasky 	/* get lid */
376d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "LID:"))) {
377d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
378d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5115: "
379d6b92ffaSHans Petter Selasky 			"Fail to obtain port lid. In info file:(%s).\n",
380d6b92ffaSHans Petter Selasky 			file_buffer);
381d6b92ffaSHans Petter Selasky 		goto Exit;
382d6b92ffaSHans Petter Selasky 	}
383d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "LID: %x", &lid) != 1) {
384d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
385d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5116: "
386d6b92ffaSHans Petter Selasky 			"Fail to parse lid from info file:(%s).\n", p_ch);
387d6b92ffaSHans Petter Selasky 		goto Exit;
388d6b92ffaSHans Petter Selasky 	}
389d6b92ffaSHans Petter Selasky 	sim_port_info->lid = lid;
390d6b92ffaSHans Petter Selasky 	/* get LMC */
391d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "LMC:"))) {
392d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
393d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5117: "
394d6b92ffaSHans Petter Selasky 			"Fail to obtain port LMC. In info file:(%s).\n",
395d6b92ffaSHans Petter Selasky 			file_buffer);
396d6b92ffaSHans Petter Selasky 		goto Exit;
397d6b92ffaSHans Petter Selasky 	}
398d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "LMC: %x", &lmc) != 1) {
399d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
400d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5118: "
401d6b92ffaSHans Petter Selasky 			"Fail to parse LMC from info file:(%s).\n", p_ch);
402d6b92ffaSHans Petter Selasky 		goto Exit;
403d6b92ffaSHans Petter Selasky 	}
404d6b92ffaSHans Petter Selasky 	sim_port_info->lmc = lmc;
405d6b92ffaSHans Petter Selasky 
406d6b92ffaSHans Petter Selasky 	/* get SM LID */
407d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "SM LID:"))) {
408d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
409d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5119: "
410d6b92ffaSHans Petter Selasky 			"Fail to obtain port SM LID. In info file:(%s).\n",
411d6b92ffaSHans Petter Selasky 			file_buffer);
412d6b92ffaSHans Petter Selasky 		goto Exit;
413d6b92ffaSHans Petter Selasky 	}
414d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "SM LID: %x", &sm_lid) != 1) {
415d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
416d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5120: "
417d6b92ffaSHans Petter Selasky 			"Fail to parse SM LID from info file:(%s).\n", p_ch);
418d6b92ffaSHans Petter Selasky 		goto Exit;
419d6b92ffaSHans Petter Selasky 	}
420d6b92ffaSHans Petter Selasky 	sim_port_info->sm_lid = sm_lid;
421d6b92ffaSHans Petter Selasky 
422d6b92ffaSHans Petter Selasky 	/* get SM LID */
423d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "SM SL:"))) {
424d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
425d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5121: "
426d6b92ffaSHans Petter Selasky 			"Fail to obtain port SM SL. In info file:(%s).\n",
427d6b92ffaSHans Petter Selasky 			file_buffer);
428d6b92ffaSHans Petter Selasky 		goto Exit;
429d6b92ffaSHans Petter Selasky 	}
430d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch, "SM SL: %x", &sm_sl) != 1) {
431d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
432d6b92ffaSHans Petter Selasky 			"__parse_port_info_file: ERR 5122: "
433d6b92ffaSHans Petter Selasky 			"Fail to parse SM SL from info file:(%s).\n", p_ch);
434d6b92ffaSHans Petter Selasky 		goto Exit;
435d6b92ffaSHans Petter Selasky 	}
436d6b92ffaSHans Petter Selasky 	sim_port_info->sm_sl = sm_sl;
437d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
438d6b92ffaSHans Petter Selasky 		"__parse_port_info_file:  "
439d6b92ffaSHans Petter Selasky 		"Obtained Port:%d = state:%d, lid:0x%04X, lmc:%d, sm_lid:0x%04X, sm_sl:%d\n",
440d6b92ffaSHans Petter Selasky 		port_num, sim_port_info->state, sim_port_info->lid,
441d6b92ffaSHans Petter Selasky 		sim_port_info->lmc, sim_port_info->sm_lid,
442d6b92ffaSHans Petter Selasky 		sim_port_info->sm_sl);
443d6b92ffaSHans Petter Selasky 
444d6b92ffaSHans Petter Selasky 	status = IB_SUCCESS;
445d6b92ffaSHans Petter Selasky Exit:
446d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
447d6b92ffaSHans Petter Selasky 	return status;
448d6b92ffaSHans Petter Selasky }
449d6b92ffaSHans Petter Selasky 
450d6b92ffaSHans Petter Selasky /**********************************************************************
451d6b92ffaSHans Petter Selasky  * Parse the port guid_tbl file to obtain the port guid.
452d6b92ffaSHans Petter Selasky  * File format is:
453d6b92ffaSHans Petter Selasky  * [  0] fe80:0000:0000:0000:0002:c900:0120:3472
454d6b92ffaSHans Petter Selasky  **********************************************************************/
455d6b92ffaSHans Petter Selasky static ib_api_status_t
__get_port_guid_from_port_gid_tbl(IN osm_vendor_t * const p_vend,IN uint32_t hca_idx,IN uint8_t port_num,OUT uint64_t * port_guid)456d6b92ffaSHans Petter Selasky __get_port_guid_from_port_gid_tbl(IN osm_vendor_t * const p_vend,
457d6b92ffaSHans Petter Selasky 				  IN uint32_t hca_idx,
458d6b92ffaSHans Petter Selasky 				  IN uint8_t port_num, OUT uint64_t * port_guid)
459d6b92ffaSHans Petter Selasky {
460d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_ERROR;
461d6b92ffaSHans Petter Selasky 	int info_file;
462d6b92ffaSHans Petter Selasky 	char file_name[256];
463d6b92ffaSHans Petter Selasky 	char file_buffer[3200];
464d6b92ffaSHans Petter Selasky 	char *p_ch;
465d6b92ffaSHans Petter Selasky 	int g[8];
466d6b92ffaSHans Petter Selasky 	uint32_t len;
467d6b92ffaSHans Petter Selasky 
468d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
469d6b92ffaSHans Petter Selasky 
470d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
471d6b92ffaSHans Petter Selasky 		"__get_port_guid_from_port_gid_tbl: "
472d6b92ffaSHans Petter Selasky 		"Parsing Proc File System Port Guid Table CA %d Port %d.\n",
473d6b92ffaSHans Petter Selasky 		hca_idx, port_num);
474d6b92ffaSHans Petter Selasky 
475d6b92ffaSHans Petter Selasky 	/* we use the proc file system so we must be able to open the info file .. */
476d6b92ffaSHans Petter Selasky 	sprintf(file_name, "%s/ca%d/port%d/gid_table",
477d6b92ffaSHans Petter Selasky 		__get_simulator_dir(), hca_idx, port_num);
478d6b92ffaSHans Petter Selasky 	info_file = open(file_name, O_RDONLY);
479d6b92ffaSHans Petter Selasky 	if (!info_file) {
480d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
481d6b92ffaSHans Petter Selasky 			"__get_port_guid_from_port_gid_tbl: ERR 5123: "
482d6b92ffaSHans Petter Selasky 			"Fail to open HCA:%d Port:%d gid_table file:(%s).\n",
483d6b92ffaSHans Petter Selasky 			hca_idx, port_num, file_name);
484d6b92ffaSHans Petter Selasky 		goto Exit;
485d6b92ffaSHans Petter Selasky 	}
486d6b92ffaSHans Petter Selasky 
487d6b92ffaSHans Petter Selasky 	/* read in the file */
488d6b92ffaSHans Petter Selasky 	len = read(info_file, file_buffer, 3200);
489d6b92ffaSHans Petter Selasky 	close(info_file);
490d6b92ffaSHans Petter Selasky 	file_buffer[len] = '\0';
491d6b92ffaSHans Petter Selasky 
492d6b92ffaSHans Petter Selasky 	/*
493d6b92ffaSHans Petter Selasky 	   parse the file ...
494d6b92ffaSHans Petter Selasky 	   [  0] fe80:0000:0000:0000:0002:c900:0120:3472
495d6b92ffaSHans Petter Selasky 	   ...
496d6b92ffaSHans Petter Selasky 	 */
497d6b92ffaSHans Petter Selasky 	if (!(p_ch = strstr(file_buffer, "[  0]"))) {
498d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
499d6b92ffaSHans Petter Selasky 			"__get_port_guid_from_port_gid_tbl: ERR 5124: "
500d6b92ffaSHans Petter Selasky 			"Fail to obtain first gid index. In gid_table file:(%s).\n",
501d6b92ffaSHans Petter Selasky 			file_buffer);
502d6b92ffaSHans Petter Selasky 		goto Exit;
503d6b92ffaSHans Petter Selasky 	}
504d6b92ffaSHans Petter Selasky 	if (sscanf(p_ch + 6, "%x:%x:%x:%x:%x:%x:%x:%x",
505d6b92ffaSHans Petter Selasky 		   &g[7], &g[6], &g[5], &g[4], &g[3], &g[2], &g[1], &g[0]) != 8)
506d6b92ffaSHans Petter Selasky 	{
507d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
508d6b92ffaSHans Petter Selasky 			"__get_port_guid_from_port_gid_tbl: ERR 5125: "
509d6b92ffaSHans Petter Selasky 			"Fail to parse gid from gid_table file:(%s).\n", p_ch);
510d6b92ffaSHans Petter Selasky 		goto Exit;
511d6b92ffaSHans Petter Selasky 	}
512d6b92ffaSHans Petter Selasky 
513d6b92ffaSHans Petter Selasky 	*port_guid =
514d6b92ffaSHans Petter Selasky 	    (uint64_t) g[3] << 48 | (uint64_t) g[2] << 32 | (uint64_t) g[1] <<
515d6b92ffaSHans Petter Selasky 	    16 | g[0];
516d6b92ffaSHans Petter Selasky 	status = IB_SUCCESS;
517d6b92ffaSHans Petter Selasky Exit:
518d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
519d6b92ffaSHans Petter Selasky 	return status;
520d6b92ffaSHans Petter Selasky }
521d6b92ffaSHans Petter Selasky 
522d6b92ffaSHans Petter Selasky /**********************************************************************
523d6b92ffaSHans Petter Selasky  * Initialize an Info Struct for the Given HCA by its index 1..N
524d6b92ffaSHans Petter Selasky  **********************************************************************/
525d6b92ffaSHans Petter Selasky static ib_api_status_t
__osm_ca_info_init(IN osm_vendor_t * const p_vend,IN uint32_t const idx,OUT osm_ca_info_t * const p_ca_info)526d6b92ffaSHans Petter Selasky __osm_ca_info_init(IN osm_vendor_t * const p_vend,
527d6b92ffaSHans Petter Selasky 		   IN uint32_t const idx, OUT osm_ca_info_t * const p_ca_info)
528d6b92ffaSHans Petter Selasky {
529d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_ERROR;
530d6b92ffaSHans Petter Selasky 	uint8_t port_num;
531d6b92ffaSHans Petter Selasky 	uint64_t port_guid;
532d6b92ffaSHans Petter Selasky 
533d6b92ffaSHans Petter Selasky 	sim_ca_info_t sim_ca_info;
534d6b92ffaSHans Petter Selasky 
535d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
536d6b92ffaSHans Petter Selasky 
537d6b92ffaSHans Petter Selasky 	/* parse the CA info file */
538d6b92ffaSHans Petter Selasky 	if (__parse_ca_info_file(p_vend, idx, &sim_ca_info) != IB_SUCCESS)
539d6b92ffaSHans Petter Selasky 		goto Exit;
540d6b92ffaSHans Petter Selasky 
541d6b92ffaSHans Petter Selasky 	p_ca_info->guid = cl_hton64(sim_ca_info.guid);
542d6b92ffaSHans Petter Selasky 
543d6b92ffaSHans Petter Selasky 	/* set size of attributes and allocate them */
544d6b92ffaSHans Petter Selasky 	p_ca_info->attr_size = 1;
545d6b92ffaSHans Petter Selasky 	p_ca_info->p_attr = (ib_ca_attr_t *) malloc(sizeof(ib_ca_attr_t));
546d6b92ffaSHans Petter Selasky 
547d6b92ffaSHans Petter Selasky 	p_ca_info->p_attr->ca_guid = p_ca_info->guid;
548d6b92ffaSHans Petter Selasky 	p_ca_info->p_attr->num_ports = sim_ca_info.num_ports;
549d6b92ffaSHans Petter Selasky 
550d6b92ffaSHans Petter Selasky 	/* now obtain the attributes of the ports */
551d6b92ffaSHans Petter Selasky 	p_ca_info->p_attr->p_port_attr =
552d6b92ffaSHans Petter Selasky 	    (ib_port_attr_t *) malloc(sim_ca_info.num_ports *
553d6b92ffaSHans Petter Selasky 				      sizeof(ib_port_attr_t));
554d6b92ffaSHans Petter Selasky 
555d6b92ffaSHans Petter Selasky 	/* get all the ports info */
556d6b92ffaSHans Petter Selasky 	for (port_num = 1; port_num <= sim_ca_info.num_ports; port_num++) {
557d6b92ffaSHans Petter Selasky 		sim_port_info_t sim_port_info;
558d6b92ffaSHans Petter Selasky 		/* query the port attributes */
559d6b92ffaSHans Petter Selasky 		if (__parse_port_info_file
560d6b92ffaSHans Petter Selasky 		    (p_vend, idx, port_num, &sim_port_info)) {
561d6b92ffaSHans Petter Selasky 			osm_log(p_vend->p_log, OSM_LOG_ERROR,
562d6b92ffaSHans Petter Selasky 				"__osm_ca_info_init: ERR 5126: "
563d6b92ffaSHans Petter Selasky 				"Fail to get HCA:%d Port:%d Attributes.\n", idx,
564d6b92ffaSHans Petter Selasky 				port_num);
565d6b92ffaSHans Petter Selasky 			goto Exit;
566d6b92ffaSHans Petter Selasky 		}
567d6b92ffaSHans Petter Selasky 
568d6b92ffaSHans Petter Selasky 		/* HACK: the lids should have been converted to network but the rest of the code
569d6b92ffaSHans Petter Selasky 		   is wrong and provdes them as is (host order) - so we stick with it. */
570d6b92ffaSHans Petter Selasky 		p_ca_info->p_attr->p_port_attr[port_num - 1].lid =
571d6b92ffaSHans Petter Selasky 		    sim_port_info.lid;
572d6b92ffaSHans Petter Selasky 		p_ca_info->p_attr->p_port_attr[port_num - 1].link_state =
573d6b92ffaSHans Petter Selasky 		    sim_port_info.state;
574d6b92ffaSHans Petter Selasky 		p_ca_info->p_attr->p_port_attr[port_num - 1].sm_lid =
575d6b92ffaSHans Petter Selasky 		    sim_port_info.sm_lid;
576d6b92ffaSHans Petter Selasky 
577d6b92ffaSHans Petter Selasky 		/* get the port guid */
578d6b92ffaSHans Petter Selasky 		if (__get_port_guid_from_port_gid_tbl
579d6b92ffaSHans Petter Selasky 		    (p_vend, idx, port_num, &port_guid)) {
580d6b92ffaSHans Petter Selasky 			osm_log(p_vend->p_log, OSM_LOG_ERROR,
581d6b92ffaSHans Petter Selasky 				"__osm_ca_info_init: ERR 5127: "
582d6b92ffaSHans Petter Selasky 				"Fail to get HCA:%d Port:%d Guid.\n", idx,
583d6b92ffaSHans Petter Selasky 				port_num);
584d6b92ffaSHans Petter Selasky 			goto Exit;
585d6b92ffaSHans Petter Selasky 		}
586d6b92ffaSHans Petter Selasky 		p_ca_info->p_attr->p_port_attr[port_num - 1].port_guid =
587d6b92ffaSHans Petter Selasky 		    cl_hton64(port_guid);
588d6b92ffaSHans Petter Selasky 	}
589d6b92ffaSHans Petter Selasky 
590d6b92ffaSHans Petter Selasky 	status = IB_SUCCESS;
591d6b92ffaSHans Petter Selasky Exit:
592d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
593d6b92ffaSHans Petter Selasky 	return (status);
594d6b92ffaSHans Petter Selasky }
595d6b92ffaSHans Petter Selasky 
596d6b92ffaSHans Petter Selasky void
osm_ca_info_destroy(IN osm_vendor_t * const p_vend,IN osm_ca_info_t * const p_ca_info,IN uint8_t num_ca)597d6b92ffaSHans Petter Selasky osm_ca_info_destroy(IN osm_vendor_t * const p_vend,
598d6b92ffaSHans Petter Selasky 		    IN osm_ca_info_t * const p_ca_info, IN uint8_t num_ca)
599d6b92ffaSHans Petter Selasky {
600d6b92ffaSHans Petter Selasky 	osm_ca_info_t *p_ca;
601d6b92ffaSHans Petter Selasky 	uint8_t i;
602d6b92ffaSHans Petter Selasky 
603d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
604d6b92ffaSHans Petter Selasky 
605d6b92ffaSHans Petter Selasky 	for (i = 0; i < num_ca; i++) {
606d6b92ffaSHans Petter Selasky 		p_ca = &p_ca_info[i];
607d6b92ffaSHans Petter Selasky 
608d6b92ffaSHans Petter Selasky 		if (NULL != p_ca->p_attr) {
609d6b92ffaSHans Petter Selasky 			if (0 != p_ca->p_attr->num_ports) {
610d6b92ffaSHans Petter Selasky 				free(p_ca->p_attr->p_port_attr);
611d6b92ffaSHans Petter Selasky 			}
612d6b92ffaSHans Petter Selasky 
613d6b92ffaSHans Petter Selasky 			free(p_ca->p_attr);
614d6b92ffaSHans Petter Selasky 		}
615d6b92ffaSHans Petter Selasky 	}
616d6b92ffaSHans Petter Selasky 
617d6b92ffaSHans Petter Selasky 	free(p_ca_info);
618d6b92ffaSHans Petter Selasky 
619d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
620d6b92ffaSHans Petter Selasky }
621d6b92ffaSHans Petter Selasky 
622d6b92ffaSHans Petter Selasky /**********************************************************************
623d6b92ffaSHans Petter Selasky  * Fill in the array of port_attr with all available ports on ALL the
624d6b92ffaSHans Petter Selasky  * avilable CAs on this machine.
625d6b92ffaSHans Petter Selasky  **********************************************************************/
626d6b92ffaSHans Petter Selasky ib_api_status_t
osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,IN ib_port_attr_t * const p_attr_array,IN uint32_t * const p_num_ports)627d6b92ffaSHans Petter Selasky osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
628d6b92ffaSHans Petter Selasky 			     IN ib_port_attr_t * const p_attr_array,
629d6b92ffaSHans Petter Selasky 			     IN uint32_t * const p_num_ports)
630d6b92ffaSHans Petter Selasky {
631d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_SUCCESS;
632d6b92ffaSHans Petter Selasky 
633d6b92ffaSHans Petter Selasky 	uint32_t caIdx;
634d6b92ffaSHans Petter Selasky 	uint32_t ca_count = 0;
635d6b92ffaSHans Petter Selasky 	uint32_t port_count = 0;
636d6b92ffaSHans Petter Selasky 	uint8_t port_num;
637d6b92ffaSHans Petter Selasky 	uint32_t total_ports = 0;
638d6b92ffaSHans Petter Selasky 	osm_ca_info_t *p_ca_infos = NULL;
639d6b92ffaSHans Petter Selasky 	uint32_t attr_array_sz = *p_num_ports;
640d6b92ffaSHans Petter Selasky 
641d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
642d6b92ffaSHans Petter Selasky 
643d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend);
644d6b92ffaSHans Petter Selasky 
645d6b92ffaSHans Petter Selasky 	/* determine the number of CA's */
646d6b92ffaSHans Petter Selasky 	ca_count = __hca_sim_get_num_cas();
647d6b92ffaSHans Petter Selasky 	if (!ca_count) {
648d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
649d6b92ffaSHans Petter Selasky 			"osm_vendor_get_all_port_attr: ERR 5128: "
650d6b92ffaSHans Petter Selasky 			"Fail to get Any CA Ids.\n");
651d6b92ffaSHans Petter Selasky 		goto Exit;
652d6b92ffaSHans Petter Selasky 	}
653d6b92ffaSHans Petter Selasky 
654d6b92ffaSHans Petter Selasky 	/* Allocate an array big enough to hold the ca info objects */
655d6b92ffaSHans Petter Selasky 	p_ca_infos = malloc(ca_count * sizeof(osm_ca_info_t));
656d6b92ffaSHans Petter Selasky 	if (p_ca_infos == NULL) {
657d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
658d6b92ffaSHans Petter Selasky 			"osm_vendor_get_all_port_attr: ERR 5129: "
659d6b92ffaSHans Petter Selasky 			"Unable to allocate CA information array.\n");
660d6b92ffaSHans Petter Selasky 		goto Exit;
661d6b92ffaSHans Petter Selasky 	}
662d6b92ffaSHans Petter Selasky 
663d6b92ffaSHans Petter Selasky 	memset(p_ca_infos, 0, ca_count * sizeof(osm_ca_info_t));
664d6b92ffaSHans Petter Selasky 
665d6b92ffaSHans Petter Selasky 	/*
666d6b92ffaSHans Petter Selasky 	 * For each CA, retrieve the CA info attributes
667d6b92ffaSHans Petter Selasky 	 */
668d6b92ffaSHans Petter Selasky 	for (caIdx = 1; caIdx <= ca_count; caIdx++) {
669d6b92ffaSHans Petter Selasky 		status =
670d6b92ffaSHans Petter Selasky 		    __osm_ca_info_init(p_vend, caIdx, &p_ca_infos[caIdx - 1]);
671d6b92ffaSHans Petter Selasky 		if (status != IB_SUCCESS) {
672d6b92ffaSHans Petter Selasky 			osm_log(p_vend->p_log, OSM_LOG_ERROR,
673d6b92ffaSHans Petter Selasky 				"osm_vendor_get_all_port_attr: ERR 5130: "
674d6b92ffaSHans Petter Selasky 				"Unable to initialize CA Info object (%s).\n",
675d6b92ffaSHans Petter Selasky 				ib_get_err_str(status));
676d6b92ffaSHans Petter Selasky 			goto Exit;
677d6b92ffaSHans Petter Selasky 		}
678d6b92ffaSHans Petter Selasky 		total_ports += p_ca_infos[caIdx - 1].p_attr->num_ports;
679d6b92ffaSHans Petter Selasky 	}
680d6b92ffaSHans Petter Selasky 
681d6b92ffaSHans Petter Selasky 	*p_num_ports = total_ports;
682d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
683d6b92ffaSHans Petter Selasky 		"osm_vendor_get_all_port_attr: total ports:%u \n", total_ports);
684d6b92ffaSHans Petter Selasky 
685d6b92ffaSHans Petter Selasky 	/*
686d6b92ffaSHans Petter Selasky 	 * If the user supplied enough storage, return the port guids,
687d6b92ffaSHans Petter Selasky 	 * otherwise, return the appropriate error.
688d6b92ffaSHans Petter Selasky 	 */
689d6b92ffaSHans Petter Selasky 	if (attr_array_sz >= total_ports) {
690d6b92ffaSHans Petter Selasky 		for (caIdx = 1; caIdx <= ca_count; caIdx++) {
691d6b92ffaSHans Petter Selasky 			uint32_t num_ports;
692d6b92ffaSHans Petter Selasky 
693d6b92ffaSHans Petter Selasky 			num_ports = p_ca_infos[caIdx - 1].p_attr->num_ports;
694d6b92ffaSHans Petter Selasky 
695d6b92ffaSHans Petter Selasky 			for (port_num = 0; port_num < num_ports; port_num++) {
696d6b92ffaSHans Petter Selasky 				p_attr_array[port_count] =
697d6b92ffaSHans Petter Selasky 				    *__osm_ca_info_get_port_attr_ptr(&p_ca_infos
698d6b92ffaSHans Petter Selasky 								     [caIdx -
699d6b92ffaSHans Petter Selasky 								      1],
700d6b92ffaSHans Petter Selasky 								     port_num);
701d6b92ffaSHans Petter Selasky 				port_count++;
702d6b92ffaSHans Petter Selasky 			}
703d6b92ffaSHans Petter Selasky 		}
704d6b92ffaSHans Petter Selasky 	} else {
705d6b92ffaSHans Petter Selasky 		status = IB_INSUFFICIENT_MEMORY;
706d6b92ffaSHans Petter Selasky 		goto Exit;
707d6b92ffaSHans Petter Selasky 	}
708d6b92ffaSHans Petter Selasky 
709d6b92ffaSHans Petter Selasky 	status = IB_SUCCESS;
710d6b92ffaSHans Petter Selasky 
711d6b92ffaSHans Petter Selasky Exit:
712d6b92ffaSHans Petter Selasky 	if (p_ca_infos) {
713d6b92ffaSHans Petter Selasky 		osm_ca_info_destroy(p_vend, p_ca_infos, ca_count);
714d6b92ffaSHans Petter Selasky 	}
715d6b92ffaSHans Petter Selasky 
716d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
717d6b92ffaSHans Petter Selasky 	return (status);
718d6b92ffaSHans Petter Selasky }
719d6b92ffaSHans Petter Selasky 
720d6b92ffaSHans Petter Selasky /**********************************************************************
721d6b92ffaSHans Petter Selasky  * Given the vendor obj and a port guid
722d6b92ffaSHans Petter Selasky  * return the ca id and port number that have that guid
723d6b92ffaSHans Petter Selasky  **********************************************************************/
724d6b92ffaSHans Petter Selasky 
725d6b92ffaSHans Petter Selasky ib_api_status_t
osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend,IN ib_net64_t const guid,OUT uint32_t * p_hca_hndl,OUT char * p_hca_id,OUT uint8_t * p_hca_idx,OUT uint32_t * p_port_num)726d6b92ffaSHans Petter Selasky osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend,
727d6b92ffaSHans Petter Selasky 				IN ib_net64_t const guid,
728d6b92ffaSHans Petter Selasky 				OUT uint32_t * p_hca_hndl,
729d6b92ffaSHans Petter Selasky 				OUT char *p_hca_id,
730d6b92ffaSHans Petter Selasky 				OUT uint8_t * p_hca_idx,
731d6b92ffaSHans Petter Selasky 				OUT uint32_t * p_port_num)
732d6b92ffaSHans Petter Selasky {
733d6b92ffaSHans Petter Selasky 	uint32_t caIdx;
734d6b92ffaSHans Petter Selasky 	uint32_t ca_count = 0;
735d6b92ffaSHans Petter Selasky 	uint8_t port_num;
736d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_ERROR;
737d6b92ffaSHans Petter Selasky 
738d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
739d6b92ffaSHans Petter Selasky 
740d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend);
741d6b92ffaSHans Petter Selasky 
742d6b92ffaSHans Petter Selasky 	/* determine the number of CA's */
743d6b92ffaSHans Petter Selasky 	ca_count = __hca_sim_get_num_cas();
744d6b92ffaSHans Petter Selasky 	if (!ca_count) {
745d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
746d6b92ffaSHans Petter Selasky 			"osm_vendor_get_guid_ca_and_port: ERR 5131: "
747d6b92ffaSHans Petter Selasky 			"Fail to get Any CA Ids.\n");
748d6b92ffaSHans Petter Selasky 		goto Exit;
749d6b92ffaSHans Petter Selasky 	}
750d6b92ffaSHans Petter Selasky 
751d6b92ffaSHans Petter Selasky 	/*
752d6b92ffaSHans Petter Selasky 	 * For each CA, retrieve the CA info attributes
753d6b92ffaSHans Petter Selasky 	 */
754d6b92ffaSHans Petter Selasky 	for (caIdx = 1; caIdx <= ca_count; caIdx++) {
755d6b92ffaSHans Petter Selasky 		sim_ca_info_t sim_ca_info;
756d6b92ffaSHans Petter Selasky 		if (__parse_ca_info_file(p_vend, caIdx, &sim_ca_info) ==
757d6b92ffaSHans Petter Selasky 		    IB_SUCCESS) {
758d6b92ffaSHans Petter Selasky 			/* get all the ports info */
759d6b92ffaSHans Petter Selasky 			for (port_num = 1; port_num <= sim_ca_info.num_ports;
760d6b92ffaSHans Petter Selasky 			     port_num++) {
761d6b92ffaSHans Petter Selasky 				uint64_t port_guid;
762d6b92ffaSHans Petter Selasky 				if (!__get_port_guid_from_port_gid_tbl
763d6b92ffaSHans Petter Selasky 				    (p_vend, caIdx, port_num, &port_guid)) {
764d6b92ffaSHans Petter Selasky 					if (cl_hton64(port_guid) == guid) {
765d6b92ffaSHans Petter Selasky 						osm_log(p_vend->p_log,
766d6b92ffaSHans Petter Selasky 							OSM_LOG_DEBUG,
767d6b92ffaSHans Petter Selasky 							"osm_vendor_get_guid_ca_and_port: "
768d6b92ffaSHans Petter Selasky 							"Found Matching guid on HCA:%d Port:%d.\n",
769d6b92ffaSHans Petter Selasky 							caIdx, port_num);
770d6b92ffaSHans Petter Selasky 						strcpy(p_hca_id,
771d6b92ffaSHans Petter Selasky 						       sim_ca_info.name);
772d6b92ffaSHans Petter Selasky 						*p_port_num = port_num;
773d6b92ffaSHans Petter Selasky 						*p_hca_idx = caIdx - 1;
774d6b92ffaSHans Petter Selasky 						*p_hca_hndl = 0;
775d6b92ffaSHans Petter Selasky 						status = IB_SUCCESS;
776d6b92ffaSHans Petter Selasky 						goto Exit;
777d6b92ffaSHans Petter Selasky 					}
778d6b92ffaSHans Petter Selasky 				}
779d6b92ffaSHans Petter Selasky 			}
780d6b92ffaSHans Petter Selasky 		}
781d6b92ffaSHans Petter Selasky 	}
782d6b92ffaSHans Petter Selasky 
783d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_ERROR,
784d6b92ffaSHans Petter Selasky 		"osm_vendor_get_guid_ca_and_port: ERR 5132: "
785d6b92ffaSHans Petter Selasky 		"Fail to find HCA and Port for Port Guid 0x%" PRIx64 "\n",
786d6b92ffaSHans Petter Selasky 		cl_ntoh64(guid));
787d6b92ffaSHans Petter Selasky 	status = IB_INVALID_GUID;
788d6b92ffaSHans Petter Selasky 
789d6b92ffaSHans Petter Selasky Exit:
790d6b92ffaSHans Petter Selasky 
791d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
792d6b92ffaSHans Petter Selasky 	return (status);
793d6b92ffaSHans Petter Selasky }
794d6b92ffaSHans Petter Selasky 
795d6b92ffaSHans Petter Selasky /**********************************************************************
796d6b92ffaSHans Petter Selasky  * Given the vendor obj HCA ID and Port Num
797d6b92ffaSHans Petter Selasky  * update the given port guid if found. Return 0 on success.
798d6b92ffaSHans Petter Selasky  **********************************************************************/
799d6b92ffaSHans Petter Selasky 
800d6b92ffaSHans Petter Selasky ib_api_status_t
osm_vendor_get_guid_by_ca_and_port(IN osm_vendor_t * const p_vend,IN char * hca_id,IN uint32_t port_num,OUT uint64_t * p_port_guid)801d6b92ffaSHans Petter Selasky osm_vendor_get_guid_by_ca_and_port(IN osm_vendor_t * const p_vend,
802d6b92ffaSHans Petter Selasky 				   IN char *hca_id,
803d6b92ffaSHans Petter Selasky 				   IN uint32_t port_num,
804d6b92ffaSHans Petter Selasky 				   OUT uint64_t * p_port_guid)
805d6b92ffaSHans Petter Selasky {
806d6b92ffaSHans Petter Selasky 	uint32_t caIdx;
807d6b92ffaSHans Petter Selasky 	uint32_t ca_count = 0;
808d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_ERROR;
809d6b92ffaSHans Petter Selasky 
810d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_vend->p_log);
811d6b92ffaSHans Petter Selasky 
812d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend);
813d6b92ffaSHans Petter Selasky 
814d6b92ffaSHans Petter Selasky 	/* determine the number of CA's */
815d6b92ffaSHans Petter Selasky 	ca_count = __hca_sim_get_num_cas();
816d6b92ffaSHans Petter Selasky 	if (!ca_count) {
817d6b92ffaSHans Petter Selasky 		osm_log(p_vend->p_log, OSM_LOG_ERROR,
818d6b92ffaSHans Petter Selasky 			"osm_vendor_get_guid_by_ca_and_port: ERR 5133: "
819d6b92ffaSHans Petter Selasky 			"Fail to get Any CA Ids.\n");
820d6b92ffaSHans Petter Selasky 		goto Exit;
821d6b92ffaSHans Petter Selasky 	}
822d6b92ffaSHans Petter Selasky 
823d6b92ffaSHans Petter Selasky 	/*
824d6b92ffaSHans Petter Selasky 	 * For each CA, retrieve the CA info attributes
825d6b92ffaSHans Petter Selasky 	 */
826d6b92ffaSHans Petter Selasky 	for (caIdx = 1; caIdx <= ca_count; caIdx++) {
827d6b92ffaSHans Petter Selasky 		sim_ca_info_t sim_ca_info;
828d6b92ffaSHans Petter Selasky 		if (__parse_ca_info_file(p_vend, caIdx, &sim_ca_info) ==
829d6b92ffaSHans Petter Selasky 		    IB_SUCCESS) {
830d6b92ffaSHans Petter Selasky 			/* if not identical by id - go to next one */
831d6b92ffaSHans Petter Selasky 			if (strcmp(sim_ca_info.name, hca_id))
832d6b92ffaSHans Petter Selasky 				continue;
833d6b92ffaSHans Petter Selasky 
834d6b92ffaSHans Petter Selasky 			if ((port_num < 1)
835d6b92ffaSHans Petter Selasky 			    || (port_num > sim_ca_info.num_ports)) {
836d6b92ffaSHans Petter Selasky 				return 1;
837d6b92ffaSHans Petter Selasky 			}
838d6b92ffaSHans Petter Selasky 
839d6b92ffaSHans Petter Selasky 			if (!__get_port_guid_from_port_gid_tbl
840d6b92ffaSHans Petter Selasky 			    (p_vend, caIdx, port_num, p_port_guid)) {
841d6b92ffaSHans Petter Selasky 				osm_log(p_vend->p_log, OSM_LOG_DEBUG,
842d6b92ffaSHans Petter Selasky 					"osm_vendor_get_guid_by_ca_and_port: "
843d6b92ffaSHans Petter Selasky 					"Found Matching guid on HCA:%d Port:%d.\n",
844d6b92ffaSHans Petter Selasky 					caIdx, port_num);
845d6b92ffaSHans Petter Selasky 				status = IB_SUCCESS;
846d6b92ffaSHans Petter Selasky 				goto Exit;
847d6b92ffaSHans Petter Selasky 			}
848d6b92ffaSHans Petter Selasky 		}
849d6b92ffaSHans Petter Selasky 	}
850d6b92ffaSHans Petter Selasky 
851d6b92ffaSHans Petter Selasky 	osm_log(p_vend->p_log, OSM_LOG_ERROR,
852d6b92ffaSHans Petter Selasky 		"osm_vendor_get_guid_by_ca_and_port: ERR 5134: "
853d6b92ffaSHans Petter Selasky 		"Fail to find HCA:%s\n", hca_id);
854d6b92ffaSHans Petter Selasky 	status = IB_INVALID_GUID;
855d6b92ffaSHans Petter Selasky 
856d6b92ffaSHans Petter Selasky Exit:
857d6b92ffaSHans Petter Selasky 
858d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_vend->p_log);
859d6b92ffaSHans Petter Selasky 	return (status);
860d6b92ffaSHans Petter Selasky }
861d6b92ffaSHans Petter Selasky 
862d6b92ffaSHans Petter Selasky #endif
863