c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * CDDL HEADER START
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * The contents of this file are subject to the terms of the
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Common Development and Distribution License (the "License").
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * You may not use this file except in compliance with the License.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * or http://www.opensolaris.org/os/licensing.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * See the License for the specific language governing permissions
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * and limitations under the License.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * When distributing Covered Code, include this CDDL HEADER in each
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * If applicable, add the following below this CDDL HEADER, with the
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * fields enclosed by brackets "[]" replaced with your own identifying
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * information: Portions Copyright [yyyy] [name of copyright owner]
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * CDDL HEADER END
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <sys/types.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <sys/stat.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <limits.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <ctype.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <fcntl.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <errno.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <unistd.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <strings.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libintl.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libscf.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libnvpair.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libstmf.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include <libsrpt.h>
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#include "srpt_common.h"
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#define SRPT_PROV_NAME "srpt"
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_GetConfig()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * cfg Current SRPT configuration in nvlist form
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * token Configuration generation number. Use this token
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * if updating the configuration with srpt_SetConfig.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_GetConfig(nvlist_t **cfg, uint64_t *token)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *cfg_nv = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t stmf_token = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *hcanv = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (!cfg) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *cfg = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = stmfGetProviderDataProt(SRPT_PROV_NAME, &cfg_nv,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson STMF_PORT_PROVIDER_TYPE, &stmf_token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == STMF_STATUS_SUCCESS) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (ret == STMF_ERROR_NOT_FOUND) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* Not initialized yet */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_alloc(&cfg_nv, NV_UNIQUE_NAME, 0);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* create the HCA list */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_alloc(&hcanv, NV_UNIQUE_NAME, 0);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_add_nvlist(cfg_nv, SRPT_PROP_HCALIST,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson hcanv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(hcanv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfg_nv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson cfg_nv = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (ret == STMF_ERROR_NOMEM) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = ENOMEM;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = EINVAL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *cfg = cfg_nv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *token = stmf_token;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_SetConfig()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * cfg SRPT configuration in nvlist form
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * token Configuration generation number from srpt_GetConfig.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Use this token to ensure the configuration hasn't been
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * updated by another user since the time it was fetched.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ECANCELED Configuration updated by another user
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_SetConfig(nvlist_t *cfg, uint64_t token)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = stmfSetProviderDataProt(SRPT_PROV_NAME, cfg,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson STMF_PORT_PROVIDER_TYPE, &token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == STMF_STATUS_SUCCESS) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (ret == STMF_ERROR_NOMEM) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = ENOMEM;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (ret == STMF_ERROR_PROV_DATA_STALE) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = ECANCELED; /* could be a better errno */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = EINVAL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_GetDefaultState()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * enabled If B_TRUE, indicates that targets will be created for all
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * discovered HCAs that have not been specifically disabled.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * If B_FALSE, targets will not be created unless the HCA has
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * been specifically enabled. See also srpt_SetDefaultState().
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_GetDefaultState(boolean_t *enabled)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *cfgnv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t token;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson boolean_t val = B_TRUE;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (enabled == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetConfig(&cfgnv, &token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (cfgnv != NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_boolean_value(cfgnv,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPT_PROP_DEFAULT_ENABLED, &val);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == ENOENT) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *enabled = val;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_SetDefaultState()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * enabled If B_TRUE, indicates that targets will be created for all
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * discovered HCAs that have not been specifically disabled.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * If B_FALSE, targets will not be created unless the HCA has
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * been specifically enabled. See also srpt_SetDefaultState().
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_SetDefaultState(boolean_t enabled)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *cfgnv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t token;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetConfig(&cfgnv, &token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (cfgnv == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_alloc(&cfgnv, NV_UNIQUE_NAME, 0);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_add_boolean_value(cfgnv, SRPT_PROP_DEFAULT_ENABLED,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_SetConfig(cfgnv, token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_SetTargetState()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * hca_guid HCA GUID. See description of srpt_NormalizeGuid
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * enabled If B_TRUE, indicates that a target will be created for
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * this HCA when the SRPT SMF service is enabled. If B_FALSE,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * a target will not be created
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_SetTargetState(char *hca_guid, boolean_t enabled)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *cfgnv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t token;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *hcalist;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *hcanv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char guid[32];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t hcaguid;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hca_guid == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_NormalizeGuid(hca_guid, guid, sizeof (guid), &hcaguid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetConfig(&cfgnv, &token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* get the list of HCAs */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_nvlist(cfgnv, SRPT_PROP_HCALIST, &hcalist);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_nvlist(hcalist, guid, &hcanv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == ENOENT) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* no entry yet */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_alloc(&hcanv, NV_UNIQUE_NAME, 0);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_add_uint64(hcanv, SRPT_PROP_GUID, hcaguid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_add_boolean_value(hcanv, SRPT_PROP_ENABLED,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_add_nvlist(hcalist, guid, hcanv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_SetConfig(cfgnv, token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_GetTargetState()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * hca_guid HCA GUID. See description of srpt_NormalizeGuid
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * enabled If B_TRUE, indicates that a target will be created for
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * this HCA when the SRPT SMF service is enabled. If B_FALSE,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * a target will not be created
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_GetTargetState(char *hca_guid, boolean_t *enabled)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *cfgnv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t token;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *hcalist;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *hcanv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson boolean_t defaultState = B_TRUE;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char guid[32];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hca_guid == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_NormalizeGuid(hca_guid, guid, sizeof (guid), NULL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetConfig(&cfgnv, &token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* get the list of HCAs */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_nvlist(cfgnv, SRPT_PROP_HCALIST, &hcalist);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Find the default, for the likely case that this HCA isn't
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * explicitly set.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) nvlist_lookup_boolean_value(cfgnv, SRPT_PROP_DEFAULT_ENABLED,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson &defaultState);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_nvlist(hcalist, guid, &hcanv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_boolean_value(hcanv, SRPT_PROP_ENABLED,
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson enabled);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == ENOENT) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* not explicitly set, use the default */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *enabled = defaultState;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = 0;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Function: srpt_ResetTarget()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Clears the HCA-specific configuration. Target creation will revert to
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * the default.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * hca_guid HCA GUID. See description of srpt_NormalizeGuid
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * ENOMEM Could not allocate resources
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid parameter
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_ResetTarget(char *hca_guid)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson int ret;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *cfgnv;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_t *hcalist;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t token;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char guid[32];
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (hca_guid == NULL) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_NormalizeGuid(hca_guid, guid, sizeof (guid), NULL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_GetConfig(&cfgnv, &token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* get the list of HCAs */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = nvlist_lookup_nvlist(cfgnv, SRPT_PROP_HCALIST, &hcalist);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret != 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* don't set config if we don't actually change anything */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (nvlist_exists(hcalist, guid)) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) nvlist_remove_all(hcalist, guid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (ret == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ret = srpt_SetConfig(cfgnv, token);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson nvlist_free(cfgnv);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (ret);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson/*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * srpt_NormalizeGuid()
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Parameters:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * in HCA GUID. Must be in one of the following forms:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 3BA000100CD18 - base hex form
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0003BA000100CD18 - base hex form with leading zeroes
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * hca:3BA000100CD18 - form from cfgadm and/or /dev/cfg
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * eui.0003BA000100CD18 - EUI form
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * buf Buffer to hold normalized guid string. Must be at least
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 17 chars long.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * buflen Length of provided buffer
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * int_guid Optional. If not NULL, the integer form of the GUID will also
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * be returned.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * Return Values:
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * 0 Success
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * EINVAL Invalid HCA GUID or invalid parameter.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonint
c3a558e7c77127215b010652905be7916ec5a080Sue Gleesonsrpt_NormalizeGuid(char *in, char *buf, size_t buflen, uint64_t *int_guid)
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson{
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson uint64_t guid;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *bufp = in;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson char *end = NULL;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if ((in == NULL) || (buf == NULL)) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (strncasecmp(bufp, "eui.", 4) == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* EUI form */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson bufp += 4;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson } else if (strncasecmp(bufp, "hca:", 4) == 0) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /* cfgadm and /dev/hca form */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson bufp += 4;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson /*
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * strtoull() does not return EINVAL as documented. Lucky
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * for us, neither 0 nor ULLONG_MAX will be valid. Trap on
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson * those and fail.
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson */
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson guid = strtoull(bufp, &end, 16);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if ((guid == 0) || (guid == ULLONG_MAX) ||
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson ((end != NULL) && (strlen(end) > 0))) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (EINVAL);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#if 0
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson (void) snprintf(buf, buflen, "%llX", guid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson#endif
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson SRPT_FORMAT_HCAKEY(buf, buflen, guid);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson if (int_guid) {
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson *int_guid = guid;
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson }
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson return (0);
c3a558e7c77127215b010652905be7916ec5a080Sue Gleeson}