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