a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER START
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The contents of this file are subject to the terms of the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Common Development and Distribution License (the "License").
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You may not use this file except in compliance with the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * or http://www.opensolaris.org/os/licensing.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * See the License for the specific language governing permissions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and limitations under the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * When distributing Covered Code, include this CDDL HEADER in each
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If applicable, add the following below this CDDL HEADER, with the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER END
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
9fc69cd99026dc35cc62ad524193fa0dfd4de20fShampavman/*
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
9fc69cd99026dc35cc62ad524193fa0dfd4de20fShampavman */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/types.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/stat.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <ctype.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <fcntl.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <uuid/uuid.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <errno.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <unistd.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <strings.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <libintl.h>
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson#include <libscf.h>
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov#include <assert.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <libstmf.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <libiscsit.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/iscsi_protocol.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/iscsit/isns_protocol.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* From iscsitgtd */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define TARGET_NAME_VERS 2
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* this should be defined someplace central... */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSI_NAME_LEN_MAX 223
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* max length of a base64 encoded secret */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define MAX_BASE64_LEN 341
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* Default RADIUS server port */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define DEFAULT_RADIUS_PORT 1812
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson/* The iscsit SMF service FMRI */
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson#define ISCSIT_FMRI "svc:/network/iscsi/target:default"
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The kernel reserves target portal group tag value 1 as the default.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSIT_DEFAULT_TPGT 1
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define MAXTAG 0xffff
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* helper for property list validation */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define PROPERR(lst, key, value) { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (lst) { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_add_string(lst, key, value); \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* helper function declarations */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_iqn_generate(char *iqn_buf, int iqn_buf_len, char *opt_iqn_suffix);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_val_pass(char *name, char *val, nvlist_t *e);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* consider making validate funcs public */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_validate_configprops(nvlist_t *nvl, nvlist_t *errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_validate_tgtprops(nvlist_t *nvl, nvlist_t *errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_validate_iniprops(nvlist_t *nvl, nvlist_t *errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleesonstatic boolean_t
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleesonis_iscsit_enabled(void);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
fcc214c383d20beb968b623b83d851672e174702Charles Tingstatic void
fcc214c383d20beb968b623b83d851672e174702Charles Tingiqnstr(char *s);
fcc214c383d20beb968b623b83d851672e174702Charles Ting
fcc214c383d20beb968b623b83d851672e174702Charles Tingstatic void
fcc214c383d20beb968b623b83d851672e174702Charles Tingeuistr(char *s);
fcc214c383d20beb968b623b83d851672e174702Charles Ting
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkovstatic void
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkovfree_empty_errlist(nvlist_t **errlist);
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Allocate and create an it_config_t structure representing the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * current iSCSI configuration. This structure is compiled using
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the 'provider' data returned by stmfGetProviderData(). If there
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is no provider data associated with iscsit, the it_config_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * structure will be set to a default configuration.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg A C representation of the current iSCSI configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Could not allocate resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_config_load(it_config_t **cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *cfg_nv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_config_t *newcfg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint64_t stmf_token = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *cfg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = stmfGetProviderDataProt(ISCSIT_MODNAME, &cfg_nv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_PORT_PROVIDER_TYPE, &stmf_token);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == STMF_STATUS_SUCCESS) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ret == STMF_ERROR_NOT_FOUND)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If not initialized yet, return empty it_config_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Else, convert nvlist to struct
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_config(cfg_nv, &newcfg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap newcfg->stmf_token = stmf_token;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *cfg = newcfg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
3c006dd52b10b0c2c2929e73abc98aec63f1f124Charles Ting if (cfg_nv) {
3c006dd52b10b0c2c2929e73abc98aec63f1f124Charles Ting nvlist_free(cfg_nv);
3c006dd52b10b0c2c2929e73abc98aec63f1f124Charles Ting }
3c006dd52b10b0c2c2929e73abc98aec63f1f124Charles Ting
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_config_commit()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Informs the iscsit service that the configuration has changed and
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * commits the new configuration to persistent store by calling
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * stmfSetProviderData. This function can be called multiple times
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * during a configuration sequence if necessary.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg A C representation of the current iSCSI configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Could not allocate resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid it_config_t structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * TBD ioctl() failed
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * TBD could not save config to STMF
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_config_commit(it_config_t *cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *cfgnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *packednv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int iscsit_fd = -1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap size_t pnv_size;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_ioc_set_config_t iop;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *tgtp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_config_to_nv(cfg, &cfgnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_size(cfgnv, &pnv_size, NV_ENCODE_NATIVE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson /*
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson * If the iscsit service is enabled, send the changes to the
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson * kernel first. Kernel will be the final sanity check before
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson * the config is saved persistently.
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson *
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson * This somewhat leaves open the simultaneous-change hole
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson * that STMF was trying to solve, but is a better sanity
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson * check and allows for graceful handling of target renames.
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson */
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if ((ret == 0) && is_iscsit_enabled()) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap packednv = malloc(pnv_size);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!packednv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = ENOMEM;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_pack(cfgnv, &packednv, &pnv_size,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NV_ENCODE_NATIVE, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if (ret == 0) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson iscsit_fd = open(ISCSIT_NODE, O_RDWR|O_EXCL);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if (iscsit_fd != -1) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson iop.set_cfg_vers = ISCSIT_API_VERS0;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson iop.set_cfg_pnvlist = packednv;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson iop.set_cfg_pnvlist_len = pnv_size;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if ((ioctl(iscsit_fd, ISCSIT_IOC_SET_CONFIG,
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson &iop)) != 0) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson ret = errno;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson }
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson (void) close(iscsit_fd);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson } else {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson ret = errno;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson }
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson }
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if (packednv != NULL) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson free(packednv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Before saving the config persistently, remove any
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * PROP_OLD_TARGET_NAME entries. This is only interesting to
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the active service.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson boolean_t changed = B_FALSE;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgtp = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (; tgtp != NULL; tgtp = tgtp->tgt_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tgtp->tgt_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvlist_exists(tgtp->tgt_properties,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_OLD_TARGET_NAME)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(tgtp->tgt_properties,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_OLD_TARGET_NAME);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson changed = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if (changed) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson /* rebuild the config nvlist */
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson nvlist_free(cfgnv);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson cfgnv = NULL;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson ret = it_config_to_nv(cfg, &cfgnv);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * stmfGetProviderDataProt() checks to ensure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * that the config data hasn't changed since we fetched it.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The kernel now has a version we need to save persistently.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CLI will 'do the right thing' and warn the user if it
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * gets STMF_ERROR_PROV_DATA_STALE. We'll try once to revert
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the kernel to the persistently saved data, but ultimately,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it's up to the administrator to validate things are as they
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * want them to be.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = stmfSetProviderDataProt(ISCSIT_MODNAME, cfgnv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_PORT_PROVIDER_TYPE, &(cfg->stmf_token));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == STMF_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == STMF_ERROR_NOMEM) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = ENOMEM;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == STMF_ERROR_PROV_DATA_STALE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int st;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_config_t *rcfg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap st = it_config_load(&rcfg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (st == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) it_config_commit(rcfg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_config_free(rcfg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfgnv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(cfgnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_config_setprop()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Validate the provided property list and set the global properties
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * for iSCSI Target. If errlist is not NULL, returns detailed
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * errors for each property that failed. The format for errorlist
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is key = property, value = error string.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * proplist nvlist_t containing properties for this target.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * errlist (optional) nvlist_t of errors encountered when
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * validating the properties.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid property
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_config_setprop(it_config_t *cfg, nvlist_t *proplist, nvlist_t **errlist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill nvlist_t *errs = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *isns = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *pnext = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *newisnslist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char **arr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t count;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t newcount;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *cprops = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !proplist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (errlist) {
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill (void) nvlist_alloc(&errs, 0, 0);
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill *errlist = errs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * copy the existing properties, merge, then validate
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the merged properties before committing them.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfg->config_global_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_dup(cfg->config_global_properties, &cprops, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&cprops, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill }
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill ret = nvlist_merge(cprops, proplist, 0);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill nvlist_free(cprops);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill }
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill /*
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill * base64 encode the radius secret, if it's changed.
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string(proplist, PROP_RADIUS_SECRET, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char bsecret[MAX_BASE64_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill ret = it_val_pass(PROP_RADIUS_SECRET, val, errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) memset(bsecret, 0, MAX_BASE64_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = iscsi_binary_to_base64_str((uint8_t *)val,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlen(val), bsecret, MAX_BASE64_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* replace the value in the nvlist */
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill ret = nvlist_add_string(cprops,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_RADIUS_SECRET, bsecret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill nvlist_free(cprops);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* see if we need to remove the radius server setting */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string(cprops, PROP_RADIUS_SERVER, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (val && (strcasecmp(val, "none") == 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(cprops, PROP_RADIUS_SERVER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* and/or remove the alias */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string(cprops, PROP_ALIAS, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (val && (strcasecmp(val, "none") == 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(cprops, PROP_ALIAS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill ret = it_validate_configprops(cprops, errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cprops) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(cprops);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Update iSNS server list, if exists in provided property list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_string_array(proplist, PROP_ISNS_SERVER,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &arr, &count);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* special case: if "none", remove all defined */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcasecmp(arr[0], "none") != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_array_to_portallist(arr, count,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISNS_DEFAULT_SERVER_PORT, &newisnslist, &newcount);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap newisnslist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap newcount = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(cprops, PROP_ISNS_SERVER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap isns = cfg->config_isns_svr_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (isns) {
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill pnext = isns->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap free(isns);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap isns = pnext;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_isns_svr_list = newisnslist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_isns_svr_count = newcount;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Replace the array in the nvlist to ensure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * duplicates are properly removed & port numbers
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * are added.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (newcount > 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int i = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char **newarray;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap newarray = malloc(sizeof (char *) * newcount);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (newarray == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = ENOMEM;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (isns = newisnslist; isns != NULL;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill isns = isns->portal_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) sockaddr_to_str(
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(isns->portal_addr),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(newarray[i++]));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_add_string_array(cprops,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_ISNS_SERVER, newarray,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap newcount);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (i = 0; i < newcount; i++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (newarray[i]) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap free(newarray[i]);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap free(newarray);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* not an error */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* replace the global properties list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(cfg->config_global_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_global_properties = cprops;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cprops) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(cprops);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov if (ret == 0)
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov free_empty_errlist(errlist);
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_config_free()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Free any resources associated with the it_config_t structure.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg A C representation of the current iSCSI configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_config_free(it_config_t *cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_config_free_cmn(cfg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tgt_create()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Allocate and create an it_tgt_t structure representing a new iSCSI
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target node. If tgt_name is NULL, then a unique target node name will
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * be generated automatically. Otherwise, the value of tgt_name will be
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * used as the target node name. The new it_tgt_t structure is added to
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the target list (cfg_tgt_list) in the configuration structure, and the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * new target will not be instantiated until the modified configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tgt Pointer to an iSCSI target structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tgt_name The target node name for the target to be created.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The name must be in either IQN or EUI format. If
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * this value is NULL, a node name will be generated
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * automatically in IQN format.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Could not allocated resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EFAULT Invalid iSCSI name specified
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer * E2BIG Too many already exist
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_create(it_config_t *cfg, it_tgt_t **tgt, char *tgt_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *cfgtgt;
fcc214c383d20beb968b623b83d851672e174702Charles Ting char *namep;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char buf[ISCSI_NAME_LEN_MAX + 1];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (!tgt_name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* generate a name */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_iqn_generate(buf, sizeof (buf), NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* validate the passed-in name */
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (!validate_iscsi_name(tgt_name)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EFAULT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
fcc214c383d20beb968b623b83d851672e174702Charles Ting (void) strlcpy(buf, tgt_name, sizeof (buf));
fcc214c383d20beb968b623b83d851672e174702Charles Ting canonical_iscsi_name(buf);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
fcc214c383d20beb968b623b83d851672e174702Charles Ting namep = buf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* make sure this name isn't already on the list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfgtgt = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (cfgtgt != NULL) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (strcasecmp(namep, cfgtgt->tgt_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EEXIST);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfgtgt = cfgtgt->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
ade94d8b38f784d25f7d2abc544ef161399e22bbCharles Ting /* Too many targets? */
ade94d8b38f784d25f7d2abc544ef161399e22bbCharles Ting if (cfg->config_tgt_count >= MAX_TARGETS) {
ade94d8b38f784d25f7d2abc544ef161399e22bbCharles Ting return (E2BIG);
ade94d8b38f784d25f7d2abc544ef161399e22bbCharles Ting }
ade94d8b38f784d25f7d2abc544ef161399e22bbCharles Ting
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = calloc(1, sizeof (it_tgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ptr == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ptr->tgt_name, namep, sizeof (ptr->tgt_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tgt_generation = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tgt_next = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tgt_list = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tgt_count++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tgt = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tgt_setprop()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Validate the provided property list and set the properties for
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the specified target. If errlist is not NULL, returns detailed
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * errors for each property that failed. The format for errorlist
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is key = property, value = error string.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tgt Pointer to an iSCSI target structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * proplist nvlist_t containing properties for this target.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * errlist (optional) nvlist_t of errors encountered when
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * validating the properties.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid property
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_setprop(it_config_t *cfg, it_tgt_t *tgt, nvlist_t *proplist,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t **errlist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill nvlist_t *errs = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *tprops = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tgt || !proplist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
fcc214c383d20beb968b623b83d851672e174702Charles Ting /* verify the target name in case the target node is renamed */
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (!validate_iscsi_name(tgt->tgt_name)) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting return (EINVAL);
fcc214c383d20beb968b623b83d851672e174702Charles Ting }
fcc214c383d20beb968b623b83d851672e174702Charles Ting canonical_iscsi_name(tgt->tgt_name);
fcc214c383d20beb968b623b83d851672e174702Charles Ting
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (errlist) {
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill (void) nvlist_alloc(&errs, 0, 0);
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill *errlist = errs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * copy the existing properties, merge, then validate
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the merged properties before committing them.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->tgt_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_dup(tgt->tgt_properties, &tprops, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&tprops, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill }
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill ret = nvlist_merge(tprops, proplist, 0);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill nvlist_free(tprops);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* unset chap username or alias if requested */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string(proplist, PROP_TARGET_CHAP_USER, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (val && (strcasecmp(val, "none") == 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(tprops, PROP_TARGET_CHAP_USER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string(proplist, PROP_ALIAS, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (val && (strcasecmp(val, "none") == 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(tprops, PROP_ALIAS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* base64 encode the CHAP secret, if it's changed */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string(proplist, PROP_TARGET_CHAP_SECRET, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char bsecret[MAX_BASE64_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill ret = it_val_pass(PROP_TARGET_CHAP_SECRET, val, errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) memset(bsecret, 0, MAX_BASE64_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = iscsi_binary_to_base64_str((uint8_t *)val,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlen(val), bsecret, MAX_BASE64_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* replace the value in the nvlist */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_string(tprops,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_TARGET_CHAP_SECRET, bsecret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill ret = it_validate_tgtprops(tprops, errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tprops) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tprops);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->tgt_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tgt->tgt_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_properties = tprops;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov free_empty_errlist(errlist);
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tgt_delete()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Delete target represented by 'tgt', where 'tgt' is an existing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_tgt_structure within the configuration 'cfg'. The target removal
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * will not take effect until the modified configuration is committed
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tgt Pointer to an iSCSI target structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * force Set the target to offline before removing it from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the config. If not specified, the operation will
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * fail if the target is determined to be online.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EBUSY Target is online
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_delete(it_config_t *cfg, it_tgt_t *tgt, boolean_t force)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *ptgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmfDevid devid;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmfTargetProperties props;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptgt = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptgt != NULL) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (strcasecmp(tgt->tgt_name, ptgt->tgt_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = ptgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptgt = ptgt->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * check to see if this target is offline. If it is not,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and the 'force' flag is TRUE, tell STMF to offline it
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * before removing from the configuration.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = stmfDevidFromIscsiName(ptgt->tgt_name, &devid);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != STMF_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* can't happen? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = stmfGetTargetProperties(&devid, &props);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == STMF_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * only other return is STMF_ERROR_NOT_FOUND, which
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * means we don't have to offline it.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (props.status == STMF_TARGET_PORT_ONLINE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!force) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EBUSY);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = stmfOfflineTarget(&devid);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EBUSY);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (prev) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->tgt_next = ptgt->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* first one on the list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tgt_list = ptgt->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptgt->tgt_next = NULL; /* Only free this target */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tgt_count--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_free(ptgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tgt_free()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Frees an it_tgt_t structure. If tgt_next is not NULL, frees
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * all structures in the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_free(it_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_free_cmn(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpgt_create()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Allocate and create an it_tpgt_t structure representing a new iSCSI
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target portal group tag. The new it_tpgt_t structure is added to the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target tpgt list (tgt_tpgt_list) in the it_tgt_t structure. The new
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target portal group tag will not be instantiated until the modified
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * configuration is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tgt Pointer to the iSCSI target structure associated
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * with the target portal group tag
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpgt Pointer to a target portal group tag structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg_name The name of the TPG to be associated with this TPGT
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpgt_tag 16-bit numerical identifier for this TPGT. If
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpgt_tag is '0', this function will choose the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tag number. If tpgt_tag is >0, and the requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tag is determined to be in use, another value
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * will be chosen.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Could not allocate resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EEXIST Specified tag name is already used.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * E2BIG No available tag numbers
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpgt_create(it_config_t *cfg, it_tgt_t *tgt, it_tpgt_t **tpgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *tpg_name, uint16_t tpgt_tag)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *ptr = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *cfgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char tagid_used[MAXTAG + 1];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint16_t tagid = ISCSIT_DEFAULT_TPGT;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tgt || !tpgt || !tpg_name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) memset(&(tagid_used[0]), 0, sizeof (tagid_used));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Make sure this name and/or tag isn't already on the list
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * At the same time, capture all tag ids in use for this target
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * About tag numbering -- since tag numbers are used by
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the iSCSI protocol, we should be careful about reusing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * them too quickly. Start with a value greater than the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * highest one currently defined. If current == MAXTAG,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * just find an unused tag.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfgt = tgt->tgt_tpgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (cfgt != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tagid_used[cfgt->tpgt_tag] = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(tpg_name, cfgt->tpgt_tpg_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EEXIST);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfgt->tpgt_tag > tagid) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tagid = cfgt->tpgt_tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfgt = cfgt->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((tpgt_tag > ISCSIT_DEFAULT_TPGT) && (tpgt_tag < MAXTAG) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (tagid_used[tpgt_tag] == 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* ok to use requested */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tagid = tpgt_tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (tagid == MAXTAG) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The highest value is used, find an available id.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tagid = ISCSIT_DEFAULT_TPGT + 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (; tagid < MAXTAG; tagid++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tagid_used[tagid] == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tagid >= MAXTAG) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (E2BIG);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* next available ID */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tagid++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = calloc(1, sizeof (it_tpgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ptr->tpgt_tpg_name, tpg_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (ptr->tpgt_tpg_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpgt_generation = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpgt_tag = tagid;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpgt_next = tgt->tgt_tpgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_tpgt_list = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_tpgt_count++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_generation++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpgt = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpgt_delete()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Delete the target portal group tag represented by 'tpgt', where
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 'tpgt' is an existing is_tpgt_t structure within the target 'tgt'.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The target portal group tag removal will not take effect until the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * modified configuration is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tgt Pointer to the iSCSI target structure associated
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * with the target portal group tag
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpgt Pointer to a target portal group tag structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpgt_delete(it_config_t *cfg, it_tgt_t *tgt, it_tpgt_t *tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tgt || !tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = tgt->tgt_tpgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ptr->tpgt_tag == tpgt->tpgt_tag) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (prev) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->tpgt_next = ptr->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_tpgt_list = ptr->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpgt_next = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_tpgt_count--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_generation++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_free(ptr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpgt_free()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Deallocates resources of an it_tpgt_t structure. If tpgt->next
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is not NULL, frees all members of the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpgt_free(it_tpgt_t *tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_free_cmn(tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpg_create()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Allocate and create an it_tpg_t structure representing a new iSCSI
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target portal group. The new it_tpg_t structure is added to the global
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg list (cfg_tgt_list) in the it_config_t structure. The new target
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * portal group will not be instantiated until the modified configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg Pointer to the it_tpg_t structure representing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the target portal group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg_name Identifier for the target portal group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * portal_ip_port A string containing an appropriatedly formatted
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * IP address:port. Both IPv4 and IPv6 addresses are
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * permitted. This value becomes the first portal in
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the TPG -- applications can add additional values
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * using it_portal_create() before committing the TPG.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Cannot allocate resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EEXIST Requested portal in use by another target portal
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_create(it_config_t *cfg, it_tpg_t **tpg, char *tpg_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *portal_ip_port)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *portal = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tpg || !tpg_name || !portal_ip_port) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = cfg->config_tpg_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(tpg_name, ptr->tpg_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EEXIST);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = calloc(1, sizeof (it_tpg_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpg_generation = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ptr->tpg_name, tpg_name, sizeof (ptr->tpg_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* create the portal */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_portal_create(cfg, ptr, &portal, portal_ip_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap free(ptr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpg_next = cfg->config_tpg_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tpg_list = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tpg_count++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpg = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpg_delete()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Delete target portal group represented by 'tpg', where 'tpg' is an
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * existing it_tpg_t structure within the global configuration 'cfg'.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The target portal group removal will not take effect until the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * modified configuration is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configuration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg Pointer to the it_tpg_t structure representing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the target portal group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * force Remove this target portal group even if it's
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * associated with one or more targets.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EBUSY Portal group associated with one or more targets.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_delete(it_config_t *cfg, it_tpg_t *tpg, boolean_t force)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *ntpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = cfg->config_tpg_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(ptr->tpg_name, tpg->tpg_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * See if any targets are using this portal group.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If there are, and the force flag is not set, fail.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = tgt->tgt_tpgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ntpgt = tpgt->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(tpgt->tpgt_tpg_name, tpg->tpg_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!force) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EBUSY);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_delete(cfg, tgt, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = ntpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt = tgt->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Now that it's not in use anywhere, remove the TPG */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (prev) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->tpg_next = ptr->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tpg_list = ptr->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->tpg_next = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_tpg_count--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_free(ptr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpg_free()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Deallocates resources associated with an it_tpg_t structure.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If tpg->next is not NULL, frees all members of the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_free(it_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_free_cmn(tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_portal_create()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Add an it_portal_t structure presenting a new portal to the specified
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target portal group. The change to the target portal group will not take
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * effect until the modified configuration is committed by calling
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg Pointer to the it_tpg_t structure representing the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target portal group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * portal Pointer to the it_portal_t structure representing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the portal
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * portal_ip_port A string containing an appropriately formatted
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * IP address or IP address:port in either IPv4 or
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * IPv6 format.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Could not allocate resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EEXIST Portal already configured for another portal group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_portal_create(it_config_t *cfg, it_tpg_t *tpg, it_portal_t **portal,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *portal_ip_port)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *ctpg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tpg || !portal || !portal_ip_port) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((it_common_convert_sa(portal_ip_port, &sa, ISCSI_LISTEN_PORT))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Check that this portal doesn't appear in any other tag */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctpg = cfg->config_tpg_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ctpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ctpg->tpg_portal_list;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill for (; ptr != NULL; ptr = ptr->portal_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_sa_compare(&(ptr->portal_addr), &sa) != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Existing in the same group is not an error,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * but don't add it again.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(ctpg->tpg_name, tpg->tpg_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Not allowed */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EEXIST);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctpg = ctpg->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = calloc(1, sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) memcpy(&(ptr->portal_addr), &sa,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (struct sockaddr_storage));
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill ptr->portal_next = tpg->tpg_portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_portal_list = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_portal_count++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_generation++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_portal_delete()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Remove the specified portal from the specified target portal group.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The portal removal will not take effect until the modified configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * tpg Pointer to the it_tpg_t structure representing the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target portal group
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * portal Pointer to the it_portal_t structure representing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the portal
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_portal_delete(it_config_t *cfg, it_tpg_t *tpg, it_portal_t *portal)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *ptr;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill it_portal_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !tpg || !portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = tpg->tpg_portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (memcmp(&(ptr->portal_addr), &(portal->portal_addr),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (ptr->portal_addr)) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = ptr;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill ptr = ptr->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (prev) {
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill prev->portal_next = ptr->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill tpg->tpg_portal_list = ptr->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_portal_count--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_generation++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap free(ptr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_ini_create()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Add an initiator context to the global configuration. The new
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * initiator context will not be instantiated until the modified
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * configuration is committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ini Pointer to the it_ini_t structure representing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the initiator context.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ini_node_name The iSCSI node name of the remote initiator.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ENOMEM Could not allocate resources
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid parameter.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EFAULT Invalid initiator name
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_ini_create(it_config_t *cfg, it_ini_t **ini, char *ini_node_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !ini || !ini_node_name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Ensure this is a valid ini name
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!validate_iscsi_name(ini_node_name)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EFAULT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = cfg->config_ini_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
e20dd2eed1abc2cdf00090cf24a23a2c33f9b868Charles Ting if (strcasecmp(ptr->ini_name, ini_node_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->ini_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EEXIST);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = calloc(1, sizeof (it_ini_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ptr->ini_name, ini_node_name, sizeof (ptr->ini_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->ini_generation = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nvlist for props? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->ini_next = cfg->config_ini_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_ini_list = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_ini_count++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ini = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_ini_setprop()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Validate the provided property list and set the initiator properties.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If errlist is not NULL, returns detailed errors for each property
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * that failed. The format for errorlist is key = property,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * value = error string.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ini The initiator being updated.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * proplist nvlist_t containing properties for this target.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * errlist (optional) nvlist_t of errors encountered when
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * validating the properties.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Return Values:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 0 Success
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EINVAL Invalid property
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_ini_setprop(it_ini_t *ini, nvlist_t *proplist, nvlist_t **errlist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill nvlist_t *errs = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *iprops = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ini || !proplist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (errlist) {
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill (void) nvlist_alloc(&errs, 0, 0);
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill *errlist = errs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * copy the existing properties, merge, then validate
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the merged properties before committing them.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ini->ini_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_dup(ini->ini_properties, &iprops, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&iprops, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill }
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill ret = nvlist_merge(iprops, proplist, 0);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill if (ret != 0) {
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill nvlist_free(iprops);
7f6f3ee7534143c5c719c28315b305ffa5e252b1Peter Gill return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* unset chap username if requested */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((nvlist_lookup_string(proplist, PROP_CHAP_USER, &val)) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcasecmp(val, "none") == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(iprops, PROP_CHAP_USER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* base64 encode the CHAP secret, if it's changed */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((nvlist_lookup_string(proplist, PROP_CHAP_SECRET, &val)) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char bsecret[MAX_BASE64_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill ret = it_val_pass(PROP_CHAP_SECRET, val, errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) memset(bsecret, 0, MAX_BASE64_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = iscsi_binary_to_base64_str((uint8_t *)val,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlen(val), bsecret, MAX_BASE64_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* replace the value in the nvlist */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_string(iprops,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_CHAP_SECRET, bsecret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
8175704f100a4d28687a2b2df9563d67194962bdPeter Gill ret = it_validate_iniprops(iprops, errs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iprops) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(iprops);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ini->ini_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(ini->ini_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini->ini_properties = iprops;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov free_empty_errlist(errlist);
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_ini_delete()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Remove the specified initiator context from the global configuration.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The removal will not take effect until the modified configuration is
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * committed by calling it_config_commit().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg The current iSCSI configration obtained from
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * it_config_load()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ini Pointer to the it_ini_t structure representing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the initiator context.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_ini_delete(it_config_t *cfg, it_ini_t *ini)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg || !ini) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = cfg->config_ini_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
e20dd2eed1abc2cdf00090cf24a23a2c33f9b868Charles Ting if (strcasecmp(ptr->ini_name, ini->ini_name) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->ini_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (prev) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->ini_next = ptr->ini_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_ini_list = ptr->ini_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr->ini_next = NULL; /* Only free this initiator */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_ini_count--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_free(ptr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_ini_free()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Deallocates resources of an it_ini_t structure. If ini->next is
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * not NULL, frees all members of the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_ini_free(it_ini_t *ini)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_free_cmn(ini);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Goes through the target property list and validates
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * each entry. If errs is non-NULL, will return explicit errors
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * for each property that fails validation.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_validate_tgtprops(nvlist_t *nvl, nvlist_t *errs)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int errcnt = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap data_type_t nvtype;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *val;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *auth = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvtype = nvpair_type(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(name, PROP_TARGET_CHAP_USER) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype != DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_TARGET_CHAP_SECRET) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * must be between 12 and 255 chars in cleartext.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * will be base64 encoded when it's set.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype == DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvpair_value_string(nvp, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_ALIAS) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype != DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_AUTH) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype == DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvpair_value_string(nvp, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((strcmp(val, PA_AUTH_NONE) != 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(val, PA_AUTH_CHAP) != 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(val, PA_AUTH_RADIUS) != 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(val, "default") != 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, val, gettext(
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "must be none, chap, radius or default"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap auth = val;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_OLD_TARGET_NAME) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* unrecognized property */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name, gettext("unrecognized property"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (errcnt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* if auth is being set to default, remove from this nvlist */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (auth && (strcmp(auth, "default") == 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_remove_all(nvl, PROP_AUTH);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Goes through the config property list and validates
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * each entry. If errs is non-NULL, will return explicit errors
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * for each property that fails validation.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_validate_configprops(nvlist_t *nvl, nvlist_t *errs)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int errcnt = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap data_type_t nvtype;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *val;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage sa;
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap boolean_t update_rad_server = B_FALSE;
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap char *rad_server;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *auth = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvtype = nvpair_type(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* prefetch string value as we mostly need it */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype == DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvpair_value_string(nvp, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(name, PROP_ALIAS) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_AUTH) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((strcmp(val, PA_AUTH_NONE) != 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(val, PA_AUTH_CHAP) != 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(val, PA_AUTH_RADIUS) != 0)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, PROP_AUTH,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be none, chap or radius"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap auth = val;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_ISNS_ENABLED) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype != DATA_TYPE_BOOLEAN_VALUE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a boolean value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_ISNS_SERVER) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char **arr = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t acount = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_lookup_string_array(nvl, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &arr, &acount);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (acount > 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcasecmp(arr[acount - 1], "none") == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((it_common_convert_sa(arr[acount - 1],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &sa, 0)) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, arr[acount - 1],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("invalid address"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap acount--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_RADIUS_SECRET) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_RADIUS_SERVER) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((it_common_convert_sa(val, &sa,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap DEFAULT_RADIUS_PORT)) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("invalid address"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * rewrite this property to ensure port
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * number is added.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap if (sockaddr_to_str(&sa, &rad_server) == 0) {
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap update_rad_server = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* unrecognized property */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name, gettext("unrecognized property"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap /*
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap * If we successfully reformatted the radius server to add the port
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap * number then update the nvlist
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap */
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap if (update_rad_server) {
6ced70a9f1bd8e73f1cd6804344bf85abe6b6c43Priya Krishnan (void) nvlist_add_string(nvl, PROP_RADIUS_SERVER, rad_server);
4f1fc35da1d29699488fd1c9472dbeb042b2b9d0srivijitha dugganapalli free(rad_server);
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap }
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * if auth = radius, ensure radius server & secret are set.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (auth) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(auth, PA_AUTH_RADIUS) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* need server & secret for radius */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvlist_exists(nvl, PROP_RADIUS_SERVER)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, PROP_RADIUS_SERVER,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("missing required property"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvlist_exists(nvl, PROP_RADIUS_SECRET)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, PROP_RADIUS_SECRET,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("missing required property"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (errcnt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Goes through the ini property list and validates
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * each entry. If errs is non-NULL, will return explicit errors
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * for each property that fails validation.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_validate_iniprops(nvlist_t *nvl, nvlist_t *errs)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int errcnt = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap data_type_t nvtype;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *val;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvtype = nvpair_type(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strcmp(name, PROP_CHAP_USER) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype != DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (strcmp(name, PROP_CHAP_SECRET) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * must be between 12 and 255 chars in cleartext.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * will be base64 encoded when it's set.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (nvtype == DATA_TYPE_STRING) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap val = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvpair_value_string(nvp, &val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap gettext("must be a string value"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* unrecognized property */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(errs, name, gettext("unrecognized property"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap errcnt++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (errcnt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_iqn_generate(char *iqn_buf, int iqn_buf_len, char *opt_iqn_suffix)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uuid_t id;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char id_str[UUID_PRINTABLE_STRING_LENGTH];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uuid_generate_random(id);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uuid_unparse(id, id_str);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (opt_iqn_suffix) {
9fc69cd99026dc35cc62ad524193fa0dfd4de20fShampavman ret = snprintf(iqn_buf, iqn_buf_len, DEFAULT_IQN
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "%02d:%s.%s", TARGET_NAME_VERS, id_str, opt_iqn_suffix);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
9fc69cd99026dc35cc62ad524193fa0dfd4de20fShampavman ret = snprintf(iqn_buf, iqn_buf_len, DEFAULT_IQN
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "%02d:%s", TARGET_NAME_VERS, id_str);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret > iqn_buf_len) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_val_pass(char *name, char *val, nvlist_t *e)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap size_t sz;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!name || !val) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * must be at least 12 chars and less than 256 chars cleartext.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sz = strlen(val);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Since we will be automatically encoding secrets we don't really
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * need the prefix anymore.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (sz < 12) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(e, name, gettext("secret too short"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (sz > 255) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROPERR(e, name, gettext("secret too long"));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* all is well */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: validate_iscsi_name()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Ensures the passed-in string is a valid IQN or EUI iSCSI name
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapboolean_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvalidate_iscsi_name(char *in_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap size_t in_len;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char month[3];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (in_name == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in_len = strlen(in_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (in_len < 12) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (IS_IQN_NAME(in_name)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * IQN names are iqn.yyyy-mm.<xxx>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((!isdigit(in_name[4])) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (!isdigit(in_name[5])) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (!isdigit(in_name[6])) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (!isdigit(in_name[7])) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (in_name[8] != '-') ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (!isdigit(in_name[9])) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (!isdigit(in_name[10])) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (in_name[11] != '.')) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strncpy(month, &(in_name[9]), 2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap month[2] = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap i = atoi(month);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((i < 0) || (i > 12)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer /*
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer * RFC 3722: if using only ASCII chars, only the following
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer * chars are allowed: dash, dot, colon, lower case a-z, 0-9.
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer * We allow upper case names, which should be folded
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer * to lower case names later.
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer */
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer for (i = 12; i < in_len; i++) {
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer char c = in_name[i];
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer if ((c != '-') && (c != '.') && (c != ':') &&
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer !isalpha(c) && !isdigit(c)) {
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer return (B_FALSE);
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer }
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer }
836fc322d4b4884a4c64c7b5d172a4a3bb6a5772Sam Cramer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Finally, validate the overall length, in wide chars */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in_len = mbstowcs(NULL, in_name, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (in_len > ISCSI_NAME_LEN_MAX) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
fcc214c383d20beb968b623b83d851672e174702Charles Ting } else if (IS_EUI_NAME(in_name)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * EUI names are "eui." + 16 hex chars
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (in_len != 20) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (i = 4; i < in_len; i++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!isxdigit(in_name[i])) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_FALSE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (B_TRUE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleesonstatic boolean_t
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleesonis_iscsit_enabled(void)
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson{
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson char *state;
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson state = smf_get_state(ISCSIT_FMRI);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if (state != NULL) {
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson if (strcmp(state, SCF_STATE_STRING_ONLINE) == 0) {
23d7d581ccf24b36e10377600f86b370955845dbPeter Gill free(state);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson return (B_TRUE);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson }
4f1fc35da1d29699488fd1c9472dbeb042b2b9d0srivijitha dugganapalli free(state);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson }
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson return (B_FALSE);
5de03f841f1da359071f4d303d88b50ec0e2093aSue Gleeson}
fcc214c383d20beb968b623b83d851672e174702Charles Ting
fcc214c383d20beb968b623b83d851672e174702Charles Ting/*
fcc214c383d20beb968b623b83d851672e174702Charles Ting * Function: canonical_iscsi_name()
fcc214c383d20beb968b623b83d851672e174702Charles Ting *
fcc214c383d20beb968b623b83d851672e174702Charles Ting * Fold the iqn iscsi name to lower-case and the EUI-64 identifier of
fcc214c383d20beb968b623b83d851672e174702Charles Ting * the eui iscsi name to upper-case.
fcc214c383d20beb968b623b83d851672e174702Charles Ting * Ensures the passed-in string is a valid IQN or EUI iSCSI name
fcc214c383d20beb968b623b83d851672e174702Charles Ting */
fcc214c383d20beb968b623b83d851672e174702Charles Tingvoid
fcc214c383d20beb968b623b83d851672e174702Charles Tingcanonical_iscsi_name(char *tgt)
fcc214c383d20beb968b623b83d851672e174702Charles Ting{
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (IS_IQN_NAME(tgt)) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting /* lowercase iqn names */
fcc214c383d20beb968b623b83d851672e174702Charles Ting iqnstr(tgt);
fcc214c383d20beb968b623b83d851672e174702Charles Ting } else {
fcc214c383d20beb968b623b83d851672e174702Charles Ting /* uppercase EUI-64 identifier */
fcc214c383d20beb968b623b83d851672e174702Charles Ting euistr(tgt);
fcc214c383d20beb968b623b83d851672e174702Charles Ting }
fcc214c383d20beb968b623b83d851672e174702Charles Ting}
fcc214c383d20beb968b623b83d851672e174702Charles Ting
fcc214c383d20beb968b623b83d851672e174702Charles Ting/*
fcc214c383d20beb968b623b83d851672e174702Charles Ting * Fold an iqn name to lower-case.
fcc214c383d20beb968b623b83d851672e174702Charles Ting */
fcc214c383d20beb968b623b83d851672e174702Charles Tingstatic void
fcc214c383d20beb968b623b83d851672e174702Charles Tingiqnstr(char *s)
fcc214c383d20beb968b623b83d851672e174702Charles Ting{
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (s != NULL) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting while (*s) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting *s = tolower(*s);
fcc214c383d20beb968b623b83d851672e174702Charles Ting s++;
fcc214c383d20beb968b623b83d851672e174702Charles Ting }
fcc214c383d20beb968b623b83d851672e174702Charles Ting }
fcc214c383d20beb968b623b83d851672e174702Charles Ting}
fcc214c383d20beb968b623b83d851672e174702Charles Ting
fcc214c383d20beb968b623b83d851672e174702Charles Ting/*
fcc214c383d20beb968b623b83d851672e174702Charles Ting * Fold the EUI-64 identifier of a eui name to upper-case.
fcc214c383d20beb968b623b83d851672e174702Charles Ting */
fcc214c383d20beb968b623b83d851672e174702Charles Tingstatic void
fcc214c383d20beb968b623b83d851672e174702Charles Tingeuistr(char *s)
fcc214c383d20beb968b623b83d851672e174702Charles Ting{
fcc214c383d20beb968b623b83d851672e174702Charles Ting if (s != NULL) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting char *l = s + 4;
fcc214c383d20beb968b623b83d851672e174702Charles Ting while (*l) {
fcc214c383d20beb968b623b83d851672e174702Charles Ting *l = toupper(*l);
fcc214c383d20beb968b623b83d851672e174702Charles Ting l++;
fcc214c383d20beb968b623b83d851672e174702Charles Ting }
fcc214c383d20beb968b623b83d851672e174702Charles Ting }
fcc214c383d20beb968b623b83d851672e174702Charles Ting}
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkovstatic void
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkovfree_empty_errlist(nvlist_t **errlist)
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov{
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov if (errlist != NULL && *errlist != NULL) {
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov assert(fnvlist_num_pairs(*errlist) == 0);
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov nvlist_free(*errlist);
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov *errlist = NULL;
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov }
fd76205d7372b305e64b7cfcd27939a39c743cb4Saso Kiselkov}