Blame libvendor/osm_vendor_mlx_hca_sim.c

Packit Service 54dbc3
/*
Packit Service 54dbc3
 * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
Packit Service 54dbc3
 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
Packit Service 54dbc3
 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 * This software is available to you under a choice of one of two
Packit Service 54dbc3
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit Service 54dbc3
 * General Public License (GPL) Version 2, available from the file
Packit Service 54dbc3
 * COPYING in the main directory of this source tree, or the
Packit Service 54dbc3
 * OpenIB.org BSD license below:
Packit Service 54dbc3
 *
Packit Service 54dbc3
 *     Redistribution and use in source and binary forms, with or
Packit Service 54dbc3
 *     without modification, are permitted provided that the following
Packit Service 54dbc3
 *     conditions are met:
Packit Service 54dbc3
 *
Packit Service 54dbc3
 *      - Redistributions of source code must retain the above
Packit Service 54dbc3
 *        copyright notice, this list of conditions and the following
Packit Service 54dbc3
 *        disclaimer.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 *      - Redistributions in binary form must reproduce the above
Packit Service 54dbc3
 *        copyright notice, this list of conditions and the following
Packit Service 54dbc3
 *        disclaimer in the documentation and/or other materials
Packit Service 54dbc3
 *        provided with the distribution.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit Service 54dbc3
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service 54dbc3
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit Service 54dbc3
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit Service 54dbc3
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit Service 54dbc3
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service 54dbc3
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit Service 54dbc3
 * SOFTWARE.
Packit Service 54dbc3
 *
Packit Service 54dbc3
 */
Packit Service 54dbc3
Packit Service 54dbc3
#if HAVE_CONFIG_H
Packit Service 54dbc3
#  include <config.h>
Packit Service 54dbc3
#endif				/* HAVE_CONFIG_H */
Packit Service 54dbc3
Packit Service 54dbc3
#if defined(OSM_VENDOR_INTF_SIM)
Packit Service 54dbc3
#undef IN
Packit Service 54dbc3
#undef OUT
Packit Service 54dbc3
Packit Service 54dbc3
#include <unistd.h>
Packit Service 54dbc3
#include <vendor/osm_vendor_api.h>
Packit Service 54dbc3
#include <opensm/osm_log.h>
Packit Service 54dbc3
#include <stdlib.h>
Packit Service 54dbc3
#include <stdio.h>
Packit Service 54dbc3
#include <sys/types.h>
Packit Service 54dbc3
#include <dirent.h>
Packit Service 54dbc3
#include <stdlib.h>
Packit Service 54dbc3
#include <sys/stat.h>
Packit Service 54dbc3
#include <stdint.h>
Packit Service 54dbc3
#include <fcntl.h>
Packit Service 54dbc3
Packit Service 54dbc3
/******************************************************************************
Packit Service 54dbc3
*
Packit Service 54dbc3
* Provides the functionality for selecting an HCA Port and Obtaining it's guid.
Packit Service 54dbc3
* This version is based on $IBMGTSIM_DIR/$IBMGTSIM_NODE file system.
Packit Service 54dbc3
* This is a mimic of the OpenIB gen1 file system
Packit Service 54dbc3
*
Packit Service 54dbc3
******************************************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
char *__get_simulator_dir(void)
Packit Service 54dbc3
{
Packit Service 54dbc3
	static char *ibmgtSimDir = NULL;
Packit Service 54dbc3
	static char *defaultIbmgtSimDir = "/tmp/ibmgtsim";
Packit Service 54dbc3
	static char *ibmgtSimNode = NULL;
Packit Service 54dbc3
	static char dirName[1024];
Packit Service 54dbc3
Packit Service 54dbc3
	/* we use the first pointer to know if we were here */
Packit Service 54dbc3
	if (ibmgtSimDir == NULL) {
Packit Service 54dbc3
		/* obtain the simulator directory */
Packit Service 54dbc3
		ibmgtSimDir = getenv("IBMGTSIM_DIR");
Packit Service 54dbc3
		if (ibmgtSimDir == NULL) {
Packit Service 54dbc3
			printf
Packit Service 54dbc3
			    ("-W- Environment variable: IBMGTSIM_DIR does not exist.\n");
Packit Service 54dbc3
			printf
Packit Service 54dbc3
			    ("    Please create one used by the simulator.\n");
Packit Service 54dbc3
			printf("    Using /tmp/ibmgtsim as default.\n");
Packit Service 54dbc3
			ibmgtSimDir = defaultIbmgtSimDir;
Packit Service 54dbc3
		}
Packit Service 54dbc3
Packit Service 54dbc3
		/* obtain the node name we simulate */
Packit Service 54dbc3
		ibmgtSimNode = getenv("IBMGTSIM_NODE");
Packit Service 54dbc3
		if (ibmgtSimNode == NULL) {
Packit Service 54dbc3
			printf
Packit Service 54dbc3
			    ("-W- Environment variable: IBMGTSIM_NODE does not exist.\n");
Packit Service 54dbc3
			printf
Packit Service 54dbc3
			    ("    This variable should be the name of the node you wish to simulate.\n");
Packit Service 54dbc3
			printf("    Using H-1 as default.\n");
Packit Service 54dbc3
			ibmgtSimNode = "H-1";
Packit Service 54dbc3
		}
Packit Service 54dbc3
		sprintf(dirName, "%s/%s", ibmgtSimDir, ibmgtSimNode);
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	return dirName;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
typedef struct _osm_ca_info {
Packit Service 54dbc3
	ib_net64_t guid;
Packit Service 54dbc3
	size_t attr_size;
Packit Service 54dbc3
	ib_ca_attr_t *p_attr;
Packit Service 54dbc3
Packit Service 54dbc3
} osm_ca_info_t;
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Returns a pointer to the port attribute of the specified port
Packit Service 54dbc3
 * owned by this CA.
Packit Service 54dbc3
 ************************************************************************/
Packit Service 54dbc3
static ib_port_attr_t *__osm_ca_info_get_port_attr_ptr(IN const osm_ca_info_t *
Packit Service 54dbc3
						       const p_ca_info,
Packit Service 54dbc3
						       IN const uint8_t index)
Packit Service 54dbc3
{
Packit Service 54dbc3
	return (&p_ca_info->p_attr->p_port_attr[index]);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Obtain the number of local CAs by scanning /proc/infiniband/core
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
int __hca_sim_get_num_cas(void)
Packit Service 54dbc3
{
Packit Service 54dbc3
	int num_cas = 0;
Packit Service 54dbc3
	DIR *dp;
Packit Service 54dbc3
	struct dirent *ep;
Packit Service 54dbc3
Packit Service 54dbc3
	dp = opendir(__get_simulator_dir());
Packit Service 54dbc3
Packit Service 54dbc3
	if (dp != NULL) {
Packit Service 54dbc3
		while ((ep = readdir(dp))) {
Packit Service 54dbc3
			/* CAs are directories with the format ca[1-9][0-9]* */
Packit Service 54dbc3
			/*  if ((ep->d_type == DT_DIR) && !strncmp(ep->d_name, "ca", 2)) */
Packit Service 54dbc3
			if (!strncmp(ep->d_name, "ca", 2)) {
Packit Service 54dbc3
				num_cas++;
Packit Service 54dbc3
			}
Packit Service 54dbc3
		}
Packit Service 54dbc3
		closedir(dp);
Packit Service 54dbc3
	} else {
Packit Service 54dbc3
		printf("__hca_sim_get_num_cas: ERROR: fail to open dir %s\n",
Packit Service 54dbc3
		       __get_simulator_dir());
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	return num_cas;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/*
Packit Service 54dbc3
  name:          InfiniHost0
Packit Service 54dbc3
  provider:      tavor
Packit Service 54dbc3
  node GUID:     0002:c900:0120:3470
Packit Service 54dbc3
  ports:         2
Packit Service 54dbc3
  vendor ID:     0x2c9
Packit Service 54dbc3
  device ID:     0x5a44
Packit Service 54dbc3
  HW revision:   0xa1
Packit Service 54dbc3
  FW revision:   0x300020080
Packit Service 54dbc3
*/
Packit Service 54dbc3
typedef struct _sim_ca_info {
Packit Service 54dbc3
	char name[32];
Packit Service 54dbc3
	char provider[32];
Packit Service 54dbc3
	uint64_t guid;
Packit Service 54dbc3
	uint8_t num_ports;
Packit Service 54dbc3
	uint32_t vend_id;
Packit Service 54dbc3
	uint16_t dev_id;
Packit Service 54dbc3
	uint16_t rev_id;
Packit Service 54dbc3
	uint64_t fw_rev;
Packit Service 54dbc3
} sim_ca_info_t;
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Parse the CA Info file available in ibmgtSimDir/caN/info
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
static ib_api_status_t
Packit Service 54dbc3
__parse_ca_info_file(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
		     IN uint32_t idx, OUT sim_ca_info_t * sim_ca_info)
Packit Service 54dbc3
{
Packit Service 54dbc3
	ib_api_status_t status = IB_ERROR;
Packit Service 54dbc3
	int info_file;
Packit Service 54dbc3
	char file_name[256];
Packit Service 54dbc3
	char file_buffer[3200];
Packit Service 54dbc3
	char *p_ch;
Packit Service 54dbc3
	int g1, g2, g3, g4;
Packit Service 54dbc3
	int num_ports;
Packit Service 54dbc3
	uint32_t len;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
		"__parse_ca_info_file: " "Querying CA %d.\n", idx);
Packit Service 54dbc3
Packit Service 54dbc3
	/* we use the proc file system so we must be able to open the info file .. */
Packit Service 54dbc3
	sprintf(file_name, "%s/ca%d/info", __get_simulator_dir(), idx);
Packit Service 54dbc3
	info_file = open(file_name, O_RDONLY);
Packit Service 54dbc3
	if (!info_file) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5105: "
Packit Service 54dbc3
			"Fail to open HCA:%d info file:(%s).\n", idx,
Packit Service 54dbc3
			file_name);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/* read in the file */
Packit Service 54dbc3
	len = read(info_file, file_buffer, 3200);
Packit Service 54dbc3
	close(info_file);
Packit Service 54dbc3
	file_buffer[len] = '\0';
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	   parse the file ...
Packit Service 54dbc3
	   name:          InfiniHost0
Packit Service 54dbc3
	   provider:      tavor
Packit Service 54dbc3
	   node GUID:     0002:c900:0120:3470
Packit Service 54dbc3
	   ports:         2
Packit Service 54dbc3
	   vendor ID:     0x2c9
Packit Service 54dbc3
	   device ID:     0x5a44
Packit Service 54dbc3
	   HW revision:   0xa1
Packit Service 54dbc3
	   FW revision:   0x300020080
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "name:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5106: "
Packit Service 54dbc3
			"Fail to obtain HCA name. In info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "name: %s", sim_ca_info->name) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5107: "
Packit Service 54dbc3
			"Fail to parse name in info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/* get the guid of the HCA */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "node GUID:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5108: "
Packit Service 54dbc3
			"Fail to obtain GUID in info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "node GUID: %x:%x:%x:%x", &g1, &g2, &g3, &g4) != 4) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5109: "
Packit Service 54dbc3
			"Fail to parse GUID in info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	sim_ca_info->guid = (uint64_t) g1 << 48 | (uint64_t) g1 << 32
Packit Service 54dbc3
	    | (uint64_t) g1 << 16 | (uint64_t) g3;
Packit Service 54dbc3
Packit Service 54dbc3
	/* obtain number of ports */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "ports:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5110: "
Packit Service 54dbc3
			"Fail to obtain number of ports in info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "ports: %d", &num_ports) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_ca_info_file: ERR 5111: "
Packit Service 54dbc3
			"Fail to parse num ports in info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	sim_ca_info->num_ports = num_ports;
Packit Service 54dbc3
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
		"__parse_ca_info_file: "
Packit Service 54dbc3
		"CA1 = name:%s guid:0x%" PRIx64 " ports:%d\n",
Packit Service 54dbc3
		sim_ca_info->name, sim_ca_info->guid, sim_ca_info->num_ports);
Packit Service 54dbc3
Packit Service 54dbc3
	status = IB_SUCCESS;
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return status;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/*
Packit Service 54dbc3
  state:         ACTIVE
Packit Service 54dbc3
  LID:           0x0001
Packit Service 54dbc3
  LMC:           0x0000
Packit Service 54dbc3
  SM LID:        0x0001
Packit Service 54dbc3
  SM SL:         0x0000
Packit Service 54dbc3
  Capabilities:  IsSM
Packit Service 54dbc3
  IsTrapSupported
Packit Service 54dbc3
  IsAutomaticMigrationSupported
Packit Service 54dbc3
  IsSLMappingSupported
Packit Service 54dbc3
  IsLEDInfoSupported
Packit Service 54dbc3
  IsSystemImageGUIDSupported
Packit Service 54dbc3
  IsVendorClassSupported
Packit Service 54dbc3
  IsCapabilityMaskNoticeSupported
Packit Service 54dbc3
*/
Packit Service 54dbc3
typedef struct _sim_port_info {
Packit Service 54dbc3
	uint8_t state;
Packit Service 54dbc3
	uint16_t lid;
Packit Service 54dbc3
	uint8_t lmc;
Packit Service 54dbc3
	uint16_t sm_lid;
Packit Service 54dbc3
	uint8_t sm_sl;
Packit Service 54dbc3
} sim_port_info_t;
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Parse the Port Info file available in ibmgtSimDir/caN/portM/info
Packit Service 54dbc3
 * Port num is 1..N
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
static ib_api_status_t
Packit Service 54dbc3
__parse_port_info_file(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
		       IN uint32_t hca_idx,
Packit Service 54dbc3
		       IN uint8_t port_num, OUT sim_port_info_t * sim_port_info)
Packit Service 54dbc3
{
Packit Service 54dbc3
	ib_api_status_t status = IB_ERROR;
Packit Service 54dbc3
	int info_file;
Packit Service 54dbc3
	char file_name[256];
Packit Service 54dbc3
	char file_buffer[3200];
Packit Service 54dbc3
	char state[12];
Packit Service 54dbc3
	char *p_ch;
Packit Service 54dbc3
	int lid, sm_lid, lmc, sm_sl;
Packit Service 54dbc3
	uint32_t len;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
		"__parse_port_info_file: "
Packit Service 54dbc3
		"Parsing Proc File System Port Info CA %d Port %d.\n", hca_idx,
Packit Service 54dbc3
		port_num);
Packit Service 54dbc3
Packit Service 54dbc3
	/* we use the proc file system so we must be able to open the info file .. */
Packit Service 54dbc3
	sprintf(file_name, "%s/ca%d/port%d/info", __get_simulator_dir(),
Packit Service 54dbc3
		hca_idx, port_num);
Packit Service 54dbc3
	info_file = open(file_name, O_RDONLY);
Packit Service 54dbc3
	if (!info_file) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5112: "
Packit Service 54dbc3
			"Fail to open HCA:%d Port:%d info file:(%s).\n",
Packit Service 54dbc3
			hca_idx, port_num, file_name);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/* read in the file */
Packit Service 54dbc3
	len = read(info_file, file_buffer, 3200);
Packit Service 54dbc3
	close(info_file);
Packit Service 54dbc3
	file_buffer[len] = '\0';
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	   parse the file ...
Packit Service 54dbc3
	   state:         ACTIVE
Packit Service 54dbc3
	   LID:           0x0001
Packit Service 54dbc3
	   LMC:           0x0000
Packit Service 54dbc3
	   SM LID:        0x0001
Packit Service 54dbc3
	   SM SL:         0x0000
Packit Service 54dbc3
	   ...
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "state:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5113: "
Packit Service 54dbc3
			"Fail to obtain port state. In info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "state: %s", state) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5114: "
Packit Service 54dbc3
			"Fail to parse state from info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	if (!strcmp(state, "ACTIVE"))
Packit Service 54dbc3
		sim_port_info->state = IB_LINK_ACTIVE;
Packit Service 54dbc3
	else if (!strcmp(state, "DOWN"))
Packit Service 54dbc3
		sim_port_info->state = IB_LINK_DOWN;
Packit Service 54dbc3
	else if (!strcmp(state, "INIT"))
Packit Service 54dbc3
		sim_port_info->state = IB_LINK_INIT;
Packit Service 54dbc3
	else if (!strcmp(state, "ARMED"))
Packit Service 54dbc3
		sim_port_info->state = IB_LINK_ARMED;
Packit Service 54dbc3
	else
Packit Service 54dbc3
		sim_port_info->state = 0;
Packit Service 54dbc3
Packit Service 54dbc3
	/* get lid */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "LID:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5115: "
Packit Service 54dbc3
			"Fail to obtain port lid. In info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "LID: %x", &lid) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5116: "
Packit Service 54dbc3
			"Fail to parse lid from info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	sim_port_info->lid = lid;
Packit Service 54dbc3
	/* get LMC */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "LMC:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5117: "
Packit Service 54dbc3
			"Fail to obtain port LMC. In info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "LMC: %x", &lmc) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5118: "
Packit Service 54dbc3
			"Fail to parse LMC from info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	sim_port_info->lmc = lmc;
Packit Service 54dbc3
Packit Service 54dbc3
	/* get SM LID */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "SM LID:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5119: "
Packit Service 54dbc3
			"Fail to obtain port SM LID. In info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "SM LID: %x", &sm_lid) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5120: "
Packit Service 54dbc3
			"Fail to parse SM LID from info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	sim_port_info->sm_lid = sm_lid;
Packit Service 54dbc3
Packit Service 54dbc3
	/* get SM LID */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "SM SL:"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5121: "
Packit Service 54dbc3
			"Fail to obtain port SM SL. In info file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch, "SM SL: %x", &sm_sl) != 1) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__parse_port_info_file: ERR 5122: "
Packit Service 54dbc3
			"Fail to parse SM SL from info file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	sim_port_info->sm_sl = sm_sl;
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
		"__parse_port_info_file:  "
Packit Service 54dbc3
		"Obtained Port:%d = state:%d, lid:0x%04X, lmc:%d, sm_lid:0x%04X, sm_sl:%d\n",
Packit Service 54dbc3
		port_num, sim_port_info->state, sim_port_info->lid,
Packit Service 54dbc3
		sim_port_info->lmc, sim_port_info->sm_lid,
Packit Service 54dbc3
		sim_port_info->sm_sl);
Packit Service 54dbc3
Packit Service 54dbc3
	status = IB_SUCCESS;
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return status;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Parse the port guid_tbl file to obtain the port guid.
Packit Service 54dbc3
 * File format is:
Packit Service 54dbc3
 * [  0] fe80:0000:0000:0000:0002:c900:0120:3472
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
static ib_api_status_t
Packit Service 54dbc3
__get_port_guid_from_port_gid_tbl(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
				  IN uint32_t hca_idx,
Packit Service 54dbc3
				  IN uint8_t port_num, OUT uint64_t * port_guid)
Packit Service 54dbc3
{
Packit Service 54dbc3
	ib_api_status_t status = IB_ERROR;
Packit Service 54dbc3
	int info_file;
Packit Service 54dbc3
	char file_name[256];
Packit Service 54dbc3
	char file_buffer[3200];
Packit Service 54dbc3
	char *p_ch;
Packit Service 54dbc3
	int g[8];
Packit Service 54dbc3
	uint32_t len;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
		"__get_port_guid_from_port_gid_tbl: "
Packit Service 54dbc3
		"Parsing Proc File System Port Guid Table CA %d Port %d.\n",
Packit Service 54dbc3
		hca_idx, port_num);
Packit Service 54dbc3
Packit Service 54dbc3
	/* we use the proc file system so we must be able to open the info file .. */
Packit Service 54dbc3
	sprintf(file_name, "%s/ca%d/port%d/gid_table",
Packit Service 54dbc3
		__get_simulator_dir(), hca_idx, port_num);
Packit Service 54dbc3
	info_file = open(file_name, O_RDONLY);
Packit Service 54dbc3
	if (!info_file) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__get_port_guid_from_port_gid_tbl: ERR 5123: "
Packit Service 54dbc3
			"Fail to open HCA:%d Port:%d gid_table file:(%s).\n",
Packit Service 54dbc3
			hca_idx, port_num, file_name);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/* read in the file */
Packit Service 54dbc3
	len = read(info_file, file_buffer, 3200);
Packit Service 54dbc3
	close(info_file);
Packit Service 54dbc3
	file_buffer[len] = '\0';
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	   parse the file ...
Packit Service 54dbc3
	   [  0] fe80:0000:0000:0000:0002:c900:0120:3472
Packit Service 54dbc3
	   ...
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	if (!(p_ch = strstr(file_buffer, "[  0]"))) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__get_port_guid_from_port_gid_tbl: ERR 5124: "
Packit Service 54dbc3
			"Fail to obtain first gid index. In gid_table file:(%s).\n",
Packit Service 54dbc3
			file_buffer);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
	if (sscanf(p_ch + 6, "%x:%x:%x:%x:%x:%x:%x:%x",
Packit Service 54dbc3
		   &g[7], &g[6], &g[5], &g[4], &g[3], &g[2], &g[1], &g[0]) != 8)
Packit Service 54dbc3
	{
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"__get_port_guid_from_port_gid_tbl: ERR 5125: "
Packit Service 54dbc3
			"Fail to parse gid from gid_table file:(%s).\n", p_ch);
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	*port_guid =
Packit Service 54dbc3
	    (uint64_t) g[3] << 48 | (uint64_t) g[2] << 32 | (uint64_t) g[1] <<
Packit Service 54dbc3
	    16 | g[0];
Packit Service 54dbc3
	status = IB_SUCCESS;
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return status;
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Initialize an Info Struct for the Given HCA by its index 1..N
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
static ib_api_status_t
Packit Service 54dbc3
__osm_ca_info_init(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
		   IN uint32_t const idx, OUT osm_ca_info_t * const p_ca_info)
Packit Service 54dbc3
{
Packit Service 54dbc3
	ib_api_status_t status = IB_ERROR;
Packit Service 54dbc3
	uint8_t port_num;
Packit Service 54dbc3
	uint64_t port_guid;
Packit Service 54dbc3
Packit Service 54dbc3
	sim_ca_info_t sim_ca_info;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	/* parse the CA info file */
Packit Service 54dbc3
	if (__parse_ca_info_file(p_vend, idx, &sim_ca_info) != IB_SUCCESS)
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
Packit Service 54dbc3
	p_ca_info->guid = cl_hton64(sim_ca_info.guid);
Packit Service 54dbc3
Packit Service 54dbc3
	/* set size of attributes and allocate them */
Packit Service 54dbc3
	p_ca_info->attr_size = 1;
Packit Service 54dbc3
	p_ca_info->p_attr = (ib_ca_attr_t *) malloc(sizeof(ib_ca_attr_t));
Packit Service 54dbc3
Packit Service 54dbc3
	p_ca_info->p_attr->ca_guid = p_ca_info->guid;
Packit Service 54dbc3
	p_ca_info->p_attr->num_ports = sim_ca_info.num_ports;
Packit Service 54dbc3
Packit Service 54dbc3
	/* now obtain the attributes of the ports */
Packit Service 54dbc3
	p_ca_info->p_attr->p_port_attr =
Packit Service 54dbc3
	    (ib_port_attr_t *) malloc(sim_ca_info.num_ports *
Packit Service 54dbc3
				      sizeof(ib_port_attr_t));
Packit Service 54dbc3
Packit Service 54dbc3
	/* get all the ports info */
Packit Service 54dbc3
	for (port_num = 1; port_num <= sim_ca_info.num_ports; port_num++) {
Packit Service 54dbc3
		sim_port_info_t sim_port_info;
Packit Service 54dbc3
		/* query the port attributes */
Packit Service 54dbc3
		if (__parse_port_info_file
Packit Service 54dbc3
		    (p_vend, idx, port_num, &sim_port_info)) {
Packit Service 54dbc3
			osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
				"__osm_ca_info_init: ERR 5126: "
Packit Service 54dbc3
				"Fail to get HCA:%d Port:%d Attributes.\n", idx,
Packit Service 54dbc3
				port_num);
Packit Service 54dbc3
			goto Exit;
Packit Service 54dbc3
		}
Packit Service 54dbc3
Packit Service 54dbc3
		/* HACK: the lids should have been converted to network but the rest of the code
Packit Service 54dbc3
		   is wrong and provdes them as is (host order) - so we stick with it. */
Packit Service 54dbc3
		p_ca_info->p_attr->p_port_attr[port_num - 1].lid =
Packit Service 54dbc3
		    sim_port_info.lid;
Packit Service 54dbc3
		p_ca_info->p_attr->p_port_attr[port_num - 1].link_state =
Packit Service 54dbc3
		    sim_port_info.state;
Packit Service 54dbc3
		p_ca_info->p_attr->p_port_attr[port_num - 1].sm_lid =
Packit Service 54dbc3
		    sim_port_info.sm_lid;
Packit Service 54dbc3
Packit Service 54dbc3
		/* get the port guid */
Packit Service 54dbc3
		if (__get_port_guid_from_port_gid_tbl
Packit Service 54dbc3
		    (p_vend, idx, port_num, &port_guid)) {
Packit Service 54dbc3
			osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
				"__osm_ca_info_init: ERR 5127: "
Packit Service 54dbc3
				"Fail to get HCA:%d Port:%d Guid.\n", idx,
Packit Service 54dbc3
				port_num);
Packit Service 54dbc3
			goto Exit;
Packit Service 54dbc3
		}
Packit Service 54dbc3
		p_ca_info->p_attr->p_port_attr[port_num - 1].port_guid =
Packit Service 54dbc3
		    cl_hton64(port_guid);
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	status = IB_SUCCESS;
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return (status);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
void
Packit Service 54dbc3
osm_ca_info_destroy(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
		    IN osm_ca_info_t * const p_ca_info, IN uint8_t num_ca)
Packit Service 54dbc3
{
Packit Service 54dbc3
	osm_ca_info_t *p_ca;
Packit Service 54dbc3
	uint8_t i;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	for (i = 0; i < num_ca; i++) {
Packit Service 54dbc3
		p_ca = &p_ca_info[i];
Packit Service 54dbc3
Packit Service 54dbc3
		if (NULL != p_ca->p_attr) {
Packit Service 54dbc3
			if (0 != p_ca->p_attr->num_ports) {
Packit Service 54dbc3
				free(p_ca->p_attr->p_port_attr);
Packit Service 54dbc3
			}
Packit Service 54dbc3
Packit Service 54dbc3
			free(p_ca->p_attr);
Packit Service 54dbc3
		}
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	free(p_ca_info);
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Fill in the array of port_attr with all available ports on ALL the
Packit Service 54dbc3
 * avilable CAs on this machine.
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
ib_api_status_t
Packit Service 54dbc3
osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
			     IN ib_port_attr_t * const p_attr_array,
Packit Service 54dbc3
			     IN uint32_t * const p_num_ports)
Packit Service 54dbc3
{
Packit Service 54dbc3
	ib_api_status_t status = IB_SUCCESS;
Packit Service 54dbc3
Packit Service 54dbc3
	uint32_t caIdx;
Packit Service 54dbc3
	uint32_t ca_count = 0;
Packit Service 54dbc3
	uint32_t port_count = 0;
Packit Service 54dbc3
	uint8_t port_num;
Packit Service 54dbc3
	uint32_t total_ports = 0;
Packit Service 54dbc3
	osm_ca_info_t *p_ca_infos = NULL;
Packit Service 54dbc3
	uint32_t attr_array_sz = *p_num_ports;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	CL_ASSERT(p_vend);
Packit Service 54dbc3
Packit Service 54dbc3
	/* determine the number of CA's */
Packit Service 54dbc3
	ca_count = __hca_sim_get_num_cas();
Packit Service 54dbc3
	if (!ca_count) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"osm_vendor_get_all_port_attr: ERR 5128: "
Packit Service 54dbc3
			"Fail to get Any CA Ids.\n");
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/* Allocate an array big enough to hold the ca info objects */
Packit Service 54dbc3
	p_ca_infos = malloc(ca_count * sizeof(osm_ca_info_t));
Packit Service 54dbc3
	if (p_ca_infos == NULL) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"osm_vendor_get_all_port_attr: ERR 5129: "
Packit Service 54dbc3
			"Unable to allocate CA information array.\n");
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	memset(p_ca_infos, 0, ca_count * sizeof(osm_ca_info_t));
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	 * For each CA, retrieve the CA info attributes
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	for (caIdx = 1; caIdx <= ca_count; caIdx++) {
Packit Service 54dbc3
		status =
Packit Service 54dbc3
		    __osm_ca_info_init(p_vend, caIdx, &p_ca_infos[caIdx - 1]);
Packit Service 54dbc3
		if (status != IB_SUCCESS) {
Packit Service 54dbc3
			osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
				"osm_vendor_get_all_port_attr: ERR 5130: "
Packit Service 54dbc3
				"Unable to initialize CA Info object (%s).\n",
Packit Service 54dbc3
				ib_get_err_str(status));
Packit Service 54dbc3
			goto Exit;
Packit Service 54dbc3
		}
Packit Service 54dbc3
		total_ports += p_ca_infos[caIdx - 1].p_attr->num_ports;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	*p_num_ports = total_ports;
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
		"osm_vendor_get_all_port_attr: total ports:%u \n", total_ports);
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	 * If the user supplied enough storage, return the port guids,
Packit Service 54dbc3
	 * otherwise, return the appropriate error.
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	if (attr_array_sz >= total_ports) {
Packit Service 54dbc3
		for (caIdx = 1; caIdx <= ca_count; caIdx++) {
Packit Service 54dbc3
			uint32_t num_ports;
Packit Service 54dbc3
Packit Service 54dbc3
			num_ports = p_ca_infos[caIdx - 1].p_attr->num_ports;
Packit Service 54dbc3
Packit Service 54dbc3
			for (port_num = 0; port_num < num_ports; port_num++) {
Packit Service 54dbc3
				p_attr_array[port_count] =
Packit Service 54dbc3
				    *__osm_ca_info_get_port_attr_ptr(&p_ca_infos
Packit Service 54dbc3
								     [caIdx -
Packit Service 54dbc3
								      1],
Packit Service 54dbc3
								     port_num);
Packit Service 54dbc3
				port_count++;
Packit Service 54dbc3
			}
Packit Service 54dbc3
		}
Packit Service 54dbc3
	} else {
Packit Service 54dbc3
		status = IB_INSUFFICIENT_MEMORY;
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	status = IB_SUCCESS;
Packit Service 54dbc3
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
	if (p_ca_infos) {
Packit Service 54dbc3
		osm_ca_info_destroy(p_vend, p_ca_infos, ca_count);
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return (status);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Given the vendor obj and a port guid
Packit Service 54dbc3
 * return the ca id and port number that have that guid
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
ib_api_status_t
Packit Service 54dbc3
osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
				IN ib_net64_t const guid,
Packit Service 54dbc3
				OUT uint32_t * p_hca_hndl,
Packit Service 54dbc3
				OUT char *p_hca_id,
Packit Service 54dbc3
				OUT uint8_t * p_hca_idx,
Packit Service 54dbc3
				OUT uint32_t * p_port_num)
Packit Service 54dbc3
{
Packit Service 54dbc3
	uint32_t caIdx;
Packit Service 54dbc3
	uint32_t ca_count = 0;
Packit Service 54dbc3
	uint8_t port_num;
Packit Service 54dbc3
	ib_api_status_t status = IB_ERROR;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	CL_ASSERT(p_vend);
Packit Service 54dbc3
Packit Service 54dbc3
	/* determine the number of CA's */
Packit Service 54dbc3
	ca_count = __hca_sim_get_num_cas();
Packit Service 54dbc3
	if (!ca_count) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"osm_vendor_get_guid_ca_and_port: ERR 5131: "
Packit Service 54dbc3
			"Fail to get Any CA Ids.\n");
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	 * For each CA, retrieve the CA info attributes
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	for (caIdx = 1; caIdx <= ca_count; caIdx++) {
Packit Service 54dbc3
		sim_ca_info_t sim_ca_info;
Packit Service 54dbc3
		if (__parse_ca_info_file(p_vend, caIdx, &sim_ca_info) ==
Packit Service 54dbc3
		    IB_SUCCESS) {
Packit Service 54dbc3
			/* get all the ports info */
Packit Service 54dbc3
			for (port_num = 1; port_num <= sim_ca_info.num_ports;
Packit Service 54dbc3
			     port_num++) {
Packit Service 54dbc3
				uint64_t port_guid;
Packit Service 54dbc3
				if (!__get_port_guid_from_port_gid_tbl
Packit Service 54dbc3
				    (p_vend, caIdx, port_num, &port_guid)) {
Packit Service 54dbc3
					if (cl_hton64(port_guid) == guid) {
Packit Service 54dbc3
						osm_log(p_vend->p_log,
Packit Service 54dbc3
							OSM_LOG_DEBUG,
Packit Service 54dbc3
							"osm_vendor_get_guid_ca_and_port: "
Packit Service 54dbc3
							"Found Matching guid on HCA:%d Port:%d.\n",
Packit Service 54dbc3
							caIdx, port_num);
Packit Service 54dbc3
						strcpy(p_hca_id,
Packit Service 54dbc3
						       sim_ca_info.name);
Packit Service 54dbc3
						*p_port_num = port_num;
Packit Service 54dbc3
						*p_hca_idx = caIdx - 1;
Packit Service 54dbc3
						*p_hca_hndl = 0;
Packit Service 54dbc3
						status = IB_SUCCESS;
Packit Service 54dbc3
						goto Exit;
Packit Service 54dbc3
					}
Packit Service 54dbc3
				}
Packit Service 54dbc3
			}
Packit Service 54dbc3
		}
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
		"osm_vendor_get_guid_ca_and_port: ERR 5132: "
Packit Service 54dbc3
		"Fail to find HCA and Port for Port Guid 0x%" PRIx64 "\n",
Packit Service 54dbc3
		cl_ntoh64(guid));
Packit Service 54dbc3
	status = IB_INVALID_GUID;
Packit Service 54dbc3
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return (status);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
/**********************************************************************
Packit Service 54dbc3
 * Given the vendor obj HCA ID and Port Num
Packit Service 54dbc3
 * update the given port guid if found. Return 0 on success.
Packit Service 54dbc3
 **********************************************************************/
Packit Service 54dbc3
Packit Service 54dbc3
ib_api_status_t
Packit Service 54dbc3
osm_vendor_get_guid_by_ca_and_port(IN osm_vendor_t * const p_vend,
Packit Service 54dbc3
				   IN char *hca_id,
Packit Service 54dbc3
				   IN uint32_t port_num,
Packit Service 54dbc3
				   OUT uint64_t * p_port_guid)
Packit Service 54dbc3
{
Packit Service 54dbc3
	uint32_t caIdx;
Packit Service 54dbc3
	uint32_t ca_count = 0;
Packit Service 54dbc3
	ib_api_status_t status = IB_ERROR;
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_ENTER(p_vend->p_log);
Packit Service 54dbc3
Packit Service 54dbc3
	CL_ASSERT(p_vend);
Packit Service 54dbc3
Packit Service 54dbc3
	/* determine the number of CA's */
Packit Service 54dbc3
	ca_count = __hca_sim_get_num_cas();
Packit Service 54dbc3
	if (!ca_count) {
Packit Service 54dbc3
		osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
			"osm_vendor_get_guid_by_ca_and_port: ERR 5133: "
Packit Service 54dbc3
			"Fail to get Any CA Ids.\n");
Packit Service 54dbc3
		goto Exit;
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	/*
Packit Service 54dbc3
	 * For each CA, retrieve the CA info attributes
Packit Service 54dbc3
	 */
Packit Service 54dbc3
	for (caIdx = 1; caIdx <= ca_count; caIdx++) {
Packit Service 54dbc3
		sim_ca_info_t sim_ca_info;
Packit Service 54dbc3
		if (__parse_ca_info_file(p_vend, caIdx, &sim_ca_info) ==
Packit Service 54dbc3
		    IB_SUCCESS) {
Packit Service 54dbc3
			/* if not identical by id - go to next one */
Packit Service 54dbc3
			if (strcmp(sim_ca_info.name, hca_id))
Packit Service 54dbc3
				continue;
Packit Service 54dbc3
Packit Service 54dbc3
			if ((port_num < 1)
Packit Service 54dbc3
			    || (port_num > sim_ca_info.num_ports)) {
Packit Service 54dbc3
				return 1;
Packit Service 54dbc3
			}
Packit Service 54dbc3
Packit Service 54dbc3
			if (!__get_port_guid_from_port_gid_tbl
Packit Service 54dbc3
			    (p_vend, caIdx, port_num, p_port_guid)) {
Packit Service 54dbc3
				osm_log(p_vend->p_log, OSM_LOG_DEBUG,
Packit Service 54dbc3
					"osm_vendor_get_guid_by_ca_and_port: "
Packit Service 54dbc3
					"Found Matching guid on HCA:%d Port:%d.\n",
Packit Service 54dbc3
					caIdx, port_num);
Packit Service 54dbc3
				status = IB_SUCCESS;
Packit Service 54dbc3
				goto Exit;
Packit Service 54dbc3
			}
Packit Service 54dbc3
		}
Packit Service 54dbc3
	}
Packit Service 54dbc3
Packit Service 54dbc3
	osm_log(p_vend->p_log, OSM_LOG_ERROR,
Packit Service 54dbc3
		"osm_vendor_get_guid_by_ca_and_port: ERR 5134: "
Packit Service 54dbc3
		"Fail to find HCA:%s\n", hca_id);
Packit Service 54dbc3
	status = IB_INVALID_GUID;
Packit Service 54dbc3
Packit Service 54dbc3
Exit:
Packit Service 54dbc3
Packit Service 54dbc3
	OSM_LOG_EXIT(p_vend->p_log);
Packit Service 54dbc3
	return (status);
Packit Service 54dbc3
}
Packit Service 54dbc3
Packit Service 54dbc3
#endif