9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/types.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/socket.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/sockio.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/param.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/stat.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <netinet/in.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <arpa/inet.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <net/if.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <unistd.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <stdlib.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <string.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <errno.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <strings.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <fcntl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdladm.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdlib.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdllink.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/ib/ibnex/ibnex_devctl.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_adapter_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_tavor_ibtf_impl.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_hca_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_name_service.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define MAX_HCAS 64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PROP_HCA_GUID "hca-guid"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PROP_PORT_NUM "port-number"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define PROP_PORT_PKEY "port-pkey"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define DEVDAPLT "/dev/daplt"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* function prototypes */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic DAT_RETURN dapli_process_tavor_node(char *dev_path, int *hca_idx,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int try_blueflame);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic DAT_RETURN dapli_process_ia(dladm_ib_attr_t *ib_attr, DAPL_HCA *hca_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int hca_idx);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(IBHOSTS_NAMING)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <stdio.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic int dapli_process_fake_ibds(DAPL_HCA **hca_list, int hca_idx);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* IBHOSTS_NAMING */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAPL_OS_LOCK g_tavor_state_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic struct dapls_ib_hca_state g_tavor_state[MAX_HCAS];
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAPL_OS_LOCK g_tavor_uar_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_init_hca(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_HCA *hca_ptr)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DAT_RETURN dat_status = DAT_SUCCESS;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int hca_idx = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int check_for_bf = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_class_t class;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_ib_attr_t ib_attr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibnex_ctl_query_hca_t query_hca;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int ibnex_fd = -1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_handle_t dlh;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char hca_device_path[MAXPATHLEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (dladm_open(&dlh) != DLADM_STATUS_OK) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hca: dladm_open failed\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_INTERNAL_ERROR);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((ibnex_fd = open(IBNEX_DEVCTL_DEV, O_RDONLY)) < 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dat_status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hca: could not open ib nexus (%s)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strerror(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((dladm_name2info(dlh, hca_ptr->name, &linkid, NULL, &class,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL) != DLADM_STATUS_OK) ||
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (class != DATALINK_CLASS_PART) ||
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (dladm_part_info(dlh, linkid, &ib_attr,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_ACTIVE) != DLADM_STATUS_OK)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hca: %s not found - couldn't get partition info\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(&query_hca, sizeof (query_hca));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala query_hca.hca_guid = ib_attr.dia_hca_guid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala query_hca.hca_device_path = hca_device_path;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala query_hca.hca_device_path_alloc_sz = sizeof (hca_device_path);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ioctl(ibnex_fd, IBNEX_CTL_QUERY_HCA, &query_hca) == -1) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dat_status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hca: %s not found; query_hca failed\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->name);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto bail;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (strcmp(query_hca.hca_info.hca_driver_name, "tavor") == 0)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_init_funcs_tavor(hca_ptr);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else if (strcmp(query_hca.hca_info.hca_driver_name, "arbel") == 0)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_init_funcs_arbel(hca_ptr);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else if (strcmp(query_hca.hca_info.hca_driver_name, "hermon") == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_init_funcs_hermon(hca_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor check_for_bf = 1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hca: %s not found\n", hca_ptr->name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dat_status = dapli_process_tavor_node(hca_device_path, &hca_idx,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala check_for_bf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hcas: %s process_tavor_node failed(0x%x)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->name, dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(IBHOSTS_NAMING)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapli_process_fake_ibds(hca_ptr, hca_idx) == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* no entries were found */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_NAME_NOT_FOUND, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dat_status = dapli_process_ia(&ib_attr, hca_ptr, hca_idx);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hcas: %s process_ia failed(0x%x)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->name, dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "init_hcas: done %s\n", hca_ptr->name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibnex_fd != -1)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) close(ibnex_fd);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_close(dlh);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladapli_process_tavor_node(char *dev_path, int *hca_idx, int try_blueflame)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char path_buf[MAXPATHLEN];
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor int i, idx, fd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _LP64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int tmpfd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t pagesize;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *mapaddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pid_t cur_pid;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor off64_t uarpg_offset;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_lock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (idx = 0; idx < MAX_HCAS; idx++) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * page size == 0 means this entry is not occupied
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (g_tavor_state[idx].uarpg_size == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor break;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (idx == MAX_HCAS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: all hcas are being used!\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor for (i = 0; i < idx; i++) {
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor if (strcmp(dev_path, g_tavor_state[i].hca_path) == 0) {
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor /* no need for a refcnt */
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor idx = i;
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor goto done;
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor }
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor }
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Add 16 to accomodate the prefix "/devices" and suffix ":devctl" */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (strlen("/devices") + strlen(dev_path) + strlen(":devctl") + 1 >
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor MAXPATHLEN) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: devfs path %s is too long\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dev_path);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_strcpy(path_buf, "/devices");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_strcat(path_buf, dev_path);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_strcat(path_buf, ":devctl");
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor (void) dapl_os_strcpy(g_tavor_state[idx].hca_path, dev_path);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pagesize = (size_t)sysconf(_SC_PAGESIZE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pagesize == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: page_size == 0\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_pid = getpid();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor fd = open(path_buf, O_RDWR);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (fd < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: cannot open %s: %s\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor path_buf, strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _LP64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * libc can't handle fd's greater than 255, in order to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ensure that these values remain available make fd > 255.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Note: not needed for LP64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmpfd = fcntl(fd, F_DUPFD, 256);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (tmpfd < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: cannot F_DUPFD: %s\n", strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor fd = tmpfd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* _LP64 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: cannot F_SETFD: %s\n", strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uarpg_offset = (((off64_t)cur_pid << MLNX_UMAP_RSRC_TYPE_SHIFT) |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor MLNX_UMAP_UARPG_RSRC) * pagesize;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mapaddr = mmap64((void *)0, pagesize, PROT_READ | PROT_WRITE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor MAP_SHARED, fd, uarpg_offset);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mapaddr == MAP_FAILED) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: mmap failed %s\n", strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[idx].hca_fd = fd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[idx].uarpg_baseaddr = mapaddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[idx].uarpg_size = pagesize;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (try_blueflame == 0)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto done;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Try to do the Hermon Blueflame page mapping */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uarpg_offset = (((off64_t)cur_pid << MLNX_UMAP_RSRC_TYPE_SHIFT) |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor MLNX_UMAP_BLUEFLAMEPG_RSRC) * pagesize;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mapaddr = mmap64((void *)0, pagesize, PROT_READ | PROT_WRITE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor MAP_SHARED, fd, uarpg_offset);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mapaddr == MAP_FAILED) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* This is not considered to be fatal. Charge on! */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_WARN,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "process_tavor: mmap of blueflame page failed %s\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[idx].bf_pg_baseaddr = mapaddr;
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor g_tavor_state[idx].bf_toggle = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordone:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *hca_idx = idx;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladapli_process_ia(dladm_ib_attr_t *ib_attr, DAPL_HCA *hca_ptr, int hca_idx)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct lifreq lifreq;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int sfd, retval, af;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char addr_buf[64];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ib_attr->dia_hca_guid == 0 || ib_attr->dia_portnum == 0 ||
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ib_attr->dia_pkey == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "process_ia: invalid properties: guid 0x%016llx, "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "port %d, pkey 0x%08x\n", ib_attr->dia_hca_guid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ib_attr->dia_portnum, (uint_t)ib_attr->dia_pkey);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_PARAMETER, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * if an interface has both v4 and v6 addresses plumbed,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * we'll take the v4 address.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor af = AF_INET;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloragain:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sfd = socket(af, SOCK_DGRAM, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (sfd < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "process_ia: socket failed: %s\n", strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* check if name will fit in lifr_name */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (dapl_os_strlen(hca_ptr->name) >= LIFNAMSIZ) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(sfd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "process_ia: if name overflow %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_PARAMETER, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dapl_os_strcpy(lifreq.lifr_name, hca_ptr->name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor retval = ioctl(sfd, SIOCGLIFADDR, (caddr_t)&lifreq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (retval < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(sfd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (af == AF_INET6) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the interface is not plumbed.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "process_ia: %s: ip address not found\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lifreq.lifr_name);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * we've failed to find a v4 address. now
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * let's try v6.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor af = AF_INET6;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto again;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(sfd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->tavor_idx = hca_idx;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->node_GUID = ib_attr->dia_hca_guid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->port_num = ib_attr->dia_portnum;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->partition_key = ib_attr->dia_pkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memcpy((void *)&hca_ptr->hca_address,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void *)&lifreq.lifr_addr, sizeof (hca_ptr->hca_address));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->max_inline_send = dapls_tavor_max_inline();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "process_ia: interface %s, hca guid 0x%016llx, port %d, "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "pkey 0x%08x, ip addr %s\n", lifreq.lifr_name, hca_ptr->node_GUID,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala hca_ptr->port_num, hca_ptr->partition_key, dapls_inet_ntop(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (struct sockaddr *)&hca_ptr->hca_address, addr_buf, 64));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapls_ib_state_init(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int i;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_lock_init(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_lock_init(&g_tavor_uar_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_lock_init(&dapls_ib_dbp_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (i = 0; i < MAX_HCAS; i++) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].hca_fd = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_baseaddr = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_size = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].bf_pg_baseaddr = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapls_ib_state_fini(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int i, count = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Uinitialize the per hca instance state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_lock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (i = 0; i < MAX_HCAS; i++) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (g_tavor_state[i].uarpg_size == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(g_tavor_state[i].uarpg_baseaddr ==
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor continue;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (munmap(g_tavor_state[i].uarpg_baseaddr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_size) < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "ib_state_fini: "
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "munmap(0x%p, 0x%llx) failed(%d)\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_baseaddr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_size, errno);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((g_tavor_state[i].bf_pg_baseaddr != NULL) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (munmap(g_tavor_state[i].bf_pg_baseaddr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_size) < 0)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "ib_state_fini: "
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "munmap(0x%p, 0x%llx) of blueflame failed(%d)\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].bf_pg_baseaddr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_tavor_state[i].uarpg_size, errno);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(g_tavor_state[i].hca_fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor count++;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_unlock(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_lock_destroy(&g_tavor_uar_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_lock_destroy(&g_tavor_state_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_lock_destroy(&dapls_ib_dbp_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "ib_state_fini: cleaned %d hcas\n", count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapls_ib_open_hca
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Open HCA
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * *hca_ptr pointer to hca device
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * *ib_hca_handle_p pointer to provide HCA handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Output:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * none
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INSUFFICIENT_RESOURCES
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapls_ib_open_hca(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_HCA *hca_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT ib_hca_handle_t *ib_hca_handle_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_create_t args;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct dapls_ib_hca_handle *hca_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int fd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _LP64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int tmpfd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int retval;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct sockaddr *s;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct sockaddr_in6 *v6addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct sockaddr_in *v4addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_addr_t *sap;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapli_init_hca(hca_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dat_status != DAT_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "dapls_ib_open_hca: init_hca failed %d\n", dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor fd = open(DEVDAPLT, O_RDONLY);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (fd < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_INSUFFICIENT_RESOURCES);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _LP64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * libc can't handle fd's greater than 255, in order to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ensure that these values remain available make fd > 255.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Note: not needed for LP64
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tmpfd = fcntl(fd, F_DUPFD, 256);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (tmpfd < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "dapls_ib_open_hca: cannot F_DUPFD: %s\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor fd = tmpfd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* _LP64 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "dapls_ib_open_hca: cannot F_SETFD: %s\n", strerror(errno));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_INTERNAL_ERROR);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p = (struct dapls_ib_hca_handle *)dapl_os_alloc(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (struct dapls_ib_hca_handle));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca_p == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_INSUFFICIENT_RESOURCES);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor args.ia_guid = hca_ptr->node_GUID;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor args.ia_port = hca_ptr->port_num;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor args.ia_pkey = hca_ptr->partition_key;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor args.ia_version = DAPL_IF_VERSION;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memzero((void *)args.ia_sadata, DAPL_ATS_NBYTES);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* pass down local ip address to be stored in SA */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor s = (struct sockaddr *)&hca_ptr->hca_address;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* LINTED: E_BAD_PTR_CAST_ALIGN */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sap = (dapl_ia_addr_t *)args.ia_sadata;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor switch (s->sa_family) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor case AF_INET:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* LINTED: E_BAD_PTR_CAST_ALIGN */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor v4addr = (struct sockaddr_in *)s;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sap->iad_v4 = v4addr->sin_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor break;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor case AF_INET6:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* LINTED: E_BAD_PTR_CAST_ALIGN */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor v6addr = (struct sockaddr_in6 *)s;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sap->iad_v6 = v6addr->sin6_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor break;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor default:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor break; /* fall through */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor retval = ioctl(fd, DAPL_IA_CREATE, &args);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (retval != 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "open_hca: ia_create failed, fd %d, "
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "guid 0x%016llx, port %d, pkey 0x%x, version %d\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor fd, args.ia_guid, args.ia_port, args.ia_pkey,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor args.ia_version);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(hca_p, sizeof (*hca_p));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dapls_convert_error(errno, retval));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p->ia_fd = fd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p->ia_rnum = args.ia_resnum;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p->hca_fd = g_tavor_state[hca_ptr->tavor_idx].hca_fd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p->ia_uar = g_tavor_state[hca_ptr->tavor_idx].uarpg_baseaddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p->ia_bf = g_tavor_state[hca_ptr->tavor_idx].bf_pg_baseaddr;
1ed53a3f65abecaadc1b967e341970ad0f6b2aebBill Taylor hca_p->ia_bf_toggle = &g_tavor_state[hca_ptr->tavor_idx].bf_toggle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ib_hca_handle_p = hca_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "open_hca: ia_created, hca_p 0x%p, fd %d, "
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "rnum %d, guid 0x%016llx, port %d, pkey 0x%x\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_p, hca_p->ia_fd, hca_p->ia_rnum, hca_ptr->node_GUID,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->port_num, hca_ptr->partition_key);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapls_ib_close_hca
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Open HCA
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ib_hca_handle provide HCA handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Output:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * none
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INSUFFICIENT_RESOURCES
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapls_ib_close_hca(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN ib_hca_handle_t ib_hca_handle)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ib_hca_handle == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "close_hca: ib_hca_handle == NULL\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "close_hca: closing hca 0x%p, fd %d, rnum %d\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_hca_handle, ib_hca_handle->ia_fd, ib_hca_handle->ia_rnum);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) close(ib_hca_handle->ia_fd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free((void *)ib_hca_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizeof (struct dapls_ib_hca_handle));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#if defined(IBHOSTS_NAMING)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define LINE_LEN 256
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic int
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_process_fake_ibds(DAPL_HCA *hca_ptr, int hca_idx)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char line_buf[LINE_LEN];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char host_buf[LINE_LEN];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char localhost[LINE_LEN];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_guid_t prefix;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_guid_t guid;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor FILE *fp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int count = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_HCA *hca_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor fp = fopen("/etc/dapl/ibhosts", "r");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (fp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "fake_ibds: ibhosts not found!\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (gethostname(localhost, LINE_LEN) != 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_ERR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "fake_ibds: hostname not found!\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!feof(fp)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) fgets(line_buf, LINE_LEN, fp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sscanf(line_buf, "%s %llx %llx", host_buf, &prefix, &guid);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) sprintf(line_buf, "%s-ib%d", localhost, count + 1);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (strncmp(line_buf, host_buf, strlen(line_buf)) == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor guid &= 0xfffffffffffffff0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->tavor_idx = hca_idx;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->node_GUID = guid;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->port_num = count + 1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr->partition_key = 0x0000ffff;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor count++;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (count >= 2) break;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) fclose(fp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* IBHOSTS_NAMING */