iscsid.c revision 49311b3511690f5b23558b0fba067bc8067c7a87
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * Common Development and Distribution License (the "License").
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ISCSID --
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Discovery of targets and access to the persistent storage starts here.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/thread.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/types.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/proc.h> /* declares: p0 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/cmn_err.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/scsi/adapters/iscsi_if.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <netinet/in.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "iscsi_targetparam.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_client.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "isns_protocol.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "persistent.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "iscsi.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/ethernet.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/bootprops.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * local function prototypes
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t iscsid_init_config(iscsi_hba_t *ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t iscsid_init_targets(iscsi_hba_t *ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_thread_static(iscsi_thread_t *thread, void *p);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_thread_sendtgts(iscsi_thread_t *thread, void *p);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_thread_isns(iscsi_thread_t *thread, void *p);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_thread_slp(iscsi_thread_t *thread, void *p);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_thread_boot_wd(iscsi_thread_t *thread, void *p);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_threads_create(iscsi_hba_t *ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_threads_destroy(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int iscsid_copyto_param_set(uint32_t param_id,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_login_params_t *params, iscsi_param_set_t *ipsp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_add_pg_list_to_cache(iscsi_hba_t *ihp,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock isns_portal_group_list_t *pg_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsid_remove_target_param(char *name);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t iscsid_add(iscsi_hba_t *ihp, iSCSIDiscoveryMethod_t method,
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr *addr_dsc, char *target_name, int tpgt,
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr *addr_tgt);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void iscsi_discovery_event(iscsi_hba_t *ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t m, boolean_t start);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t iscsid_boot_init_config(iscsi_hba_t *ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic iscsi_sess_t *iscsi_add_boot_sess(iscsi_hba_t *ihp, int isid);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t iscsid_make_entry(ib_boot_prop_t *boot_prop_entry,
fa9e4066f08beec538e775443c5be79dd423fcabahrens entry_t *entry);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockextern int modrootloaded;
fa9e4066f08beec538e775443c5be79dd423fcabahrensint iscsi_configroot_retry = 20;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t iscsi_configroot_printed = FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int iscsi_net_up = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern ib_boot_prop_t *iscsiboot_prop;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iSCSI target discovery thread table
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct iscsid_thr_table {
fa9e4066f08beec538e775443c5be79dd423fcabahrens void (*func_start)(iscsi_thread_t *, void *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_thread_t *thr_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t method;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} iscsid_thr_table;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic iscsid_thr_table iscsid_thr[] = {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { iscsid_thread_static, NULL,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock iSCSIDiscoveryMethodStatic,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "Static" },
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock { iscsid_thread_sendtgts, NULL,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock iSCSIDiscoveryMethodSendTargets,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "SendTarget" },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { iscsid_thread_slp, NULL,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock iSCSIDiscoveryMethodSLP,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "SLP" },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { iscsid_thread_isns, NULL,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock iSCSIDiscoveryMethodISNS,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "iSNS" },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL, NULL,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock iSCSIDiscoveryMethodUnknown,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock NULL }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock};
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * discovery method event table
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensiSCSIDiscoveryMethod_t for_failure[] = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodStatic,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodSLP,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock iSCSIDiscoveryMethodISNS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodSendTargets,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown /* terminating value */
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * The following private tunable, set in /etc/system, e.g.,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * set iscsi:iscsi_boot_max_delay = 360
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * , provides with customer a max wait time in
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * seconds to wait for boot lun online during iscsi boot.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Defaults to 180s.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint iscsi_boot_max_delay = ISCSI_BOOT_DEFAULT_MAX_DELAY;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery configuration semaphore
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensksema_t iscsid_config_semaphore;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic iscsi_thread_t *iscsi_boot_wd_handle = NULL;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define CHECK_METHOD(v) ((dm & v) ? B_TRUE : B_FALSE)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Check if IP is valid
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic boolean_t
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockiscsid_ip_check(char *ip)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i = 0;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ip)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (B_FALSE);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock for (; (ip[i] == 0) && (i < IB_IP_BUFLEN); i++) {}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (i == IB_IP_BUFLEN) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* invalid IP address */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Make an entry for the boot target.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * return B_TRUE upon success
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * B_FALSE if fail
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic boolean_t
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockiscsid_make_entry(ib_boot_prop_t *boot_prop_entry, entry_t *entry)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (entry == NULL || boot_prop_entry == NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (B_FALSE);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock if (!iscsid_ip_check(
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (char *)&boot_prop_entry->boot_tgt.tgt_ip_u))
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (B_FALSE);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock if (boot_prop_entry->boot_tgt.sin_family != AF_INET &&
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock boot_prop_entry->boot_tgt.sin_family != AF_INET6)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (B_FALSE);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm entry->e_vers = ISCSI_INTERFACE_VERSION;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm mutex_enter(&iscsi_oid_mutex);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm entry->e_oid = iscsi_oid++;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock mutex_exit(&iscsi_oid_mutex);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock entry->e_tpgt = ISCSI_DEFAULT_TPGT;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock if (boot_prop_entry->boot_tgt.sin_family == AF_INET) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock entry->e_u.u_in4.s_addr =
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock boot_prop_entry->boot_tgt.tgt_ip_u.u_in4.s_addr;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling entry->e_insize = sizeof (struct in_addr);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock } else {
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling (void) bcopy(
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock &boot_prop_entry->boot_tgt.tgt_ip_u.u_in6.s6_addr,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock entry->e_u.u_in6.s6_addr, 16);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock entry->e_insize = sizeof (struct in6_addr);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock entry->e_port = boot_prop_entry->boot_tgt.tgt_port;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock entry->e_boot = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (B_TRUE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Create the boot session
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic void
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockiscsi_boot_session_create(iscsi_hba_t *ihp,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock ib_boot_prop_t *boot_prop_table)
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm;
fa9e4066f08beec538e775443c5be79dd423fcabahrens entry_t e;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_dsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ihp == NULL || boot_prop_table == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!iscsid_ip_check(
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)&boot_prop_table->boot_tgt.tgt_ip_u)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (boot_prop_table->boot_tgt.tgt_name != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = iSCSIDiscoveryMethodStatic |
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodBoot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!iscsid_make_entry(boot_prop_table, &e))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(e.e_insize, &e.e_u,
fa9e4066f08beec538e775443c5be79dd423fcabahrens e.e_port, &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_add(ihp, dm, &addr_dsc.sin,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)boot_prop_table->boot_tgt.tgt_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens e.e_tpgt, &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = iSCSIDiscoveryMethodSendTargets |
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodBoot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!iscsid_make_entry(boot_prop_table, &e))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(e.e_insize, &e.e_u,
fa9e4066f08beec538e775443c5be79dd423fcabahrens e.e_port, &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_do_sendtgts(&e);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_login_tgt(ihp, NULL, dm,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_init -- to initialize stuffs related to iscsi daemon,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and to create boot session if needed
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_init(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rval = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens sema_init(&iscsid_config_semaphore, 1, NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens SEMA_DRIVER, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_init();
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_threads_create(ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (modrootloaded == 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* normal case, load the persistent store */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_load() == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_persistent_loaded = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((modrootloaded == 0) && (iscsiboot_prop != NULL)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!iscsid_boot_init_config(ihp)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_boot_session_create(ihp, iscsiboot_prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_boot_wd_handle =
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_thread_create(ihp->hba_dip,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "BootWD", iscsid_thread_boot_wd, ihp);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock if (iscsi_boot_wd_handle) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = iscsi_thread_start(
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_boot_wd_handle);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock rval = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "Initializaton of iscsi boot session"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " partially failed");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_start -- start the iscsi initiator daemon, actually this code
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is just to enable discovery methods which are set enabled in
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * persistent store, as an economic way to present the 'daemon' funtionality
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_start(iscsi_hba_t *ihp) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rval = B_FALSE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock iSCSIDiscoveryMethod_t dm;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock iSCSIDiscoveryMethod_t *fdm;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock rval = iscsid_init_config(ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = iscsid_init_targets(ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = persistent_disc_meth_get();
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = iscsid_enable_discovery(ihp, dm, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_poke_discovery(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_login_tgt(ihp, NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown, NULL);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_FALSE) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * In case of failure the events still need to be sent
fa9e4066f08beec538e775443c5be79dd423fcabahrens * because the door daemon will pause until all these
fa9e4066f08beec538e775443c5be79dd423fcabahrens * events have occurred.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (fdm = &for_failure[0]; *fdm !=
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown; fdm++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ---- Send both start and end events ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, *fdm, B_TRUE);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock iscsi_discovery_event(ihp, *fdm, B_FALSE);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock }
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock }
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_stop -- stop the iscsi initiator daemon, by disabling
fa9e4066f08beec538e775443c5be79dd423fcabahrens * all the discovery methods first, and then try to stop all
fa9e4066f08beec538e775443c5be79dd423fcabahrens * related threads
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_stop(iscsi_hba_t *ihp) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rval = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsid_disable_discovery(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_ALL_DISCOVERY_METHODS) == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_enable_discovery(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_ALL_DISCOVERY_METHODS, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* final check */
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_enter(&ihp->hba_sess_list_rwlock, RW_READER);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ihp->hba_sess_list == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_enable_discovery(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_ALL_DISCOVERY_METHODS, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_fini -- do whatever is required to clean up
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_fini()
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_boot_wd_handle != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_thread_destroy(iscsi_boot_wd_handle);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_boot_wd_handle = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_threads_destroy();
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_fini();
fa9e4066f08beec538e775443c5be79dd423fcabahrens sema_destroy(&iscsid_config_semaphore);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_props -- returns discovery thread information, used by ioctl code
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_props(iSCSIDiscoveryProperties_t *props)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = persistent_disc_meth_get();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->vers = ISCSI_INTERFACE_VERSION;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /* ---- change once thread is implemented ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->iSNSDiscoverySettable = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->SLPDiscoverySettable = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->StaticDiscoverySettable = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->SendTargetsDiscoverySettable = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->iSNSDiscoveryMethod = iSNSDiscoveryMethodStatic;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->iSNSDiscoveryEnabled = CHECK_METHOD(iSCSIDiscoveryMethodISNS);
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->StaticDiscoveryEnabled =
fa9e4066f08beec538e775443c5be79dd423fcabahrens CHECK_METHOD(iSCSIDiscoveryMethodStatic);
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->SendTargetsDiscoveryEnabled =
fa9e4066f08beec538e775443c5be79dd423fcabahrens CHECK_METHOD(iSCSIDiscoveryMethodSendTargets);
fa9e4066f08beec538e775443c5be79dd423fcabahrens props->SLPDiscoveryEnabled = CHECK_METHOD(iSCSIDiscoveryMethodSLP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_enable_discovery - start specified discovery methods
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_enable_discovery(iscsi_hba_t *ihp, iSCSIDiscoveryMethod_t idm,
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t poke)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock boolean_t rval = B_TRUE;
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock iscsid_thr_table *dt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * start the specified discovery method(s)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (dt = &iscsid_thr[0]; dt->method != iSCSIDiscoveryMethodUnknown;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dt++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (idm & dt->method) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dt->thr_id != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = iscsi_thread_start(dt->thr_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (poke == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_thread_send_wakeup(
fa9e4066f08beec538e775443c5be79dd423fcabahrens dt->thr_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * unexpected condition. The threads for each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery method should have started at
fa9e4066f08beec538e775443c5be79dd423fcabahrens * initialization
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } /* END for() */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_disable_discovery - stop specified discovery methods
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_disable_discovery(iscsi_hba_t *ihp, iSCSIDiscoveryMethod_t idm)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rval = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_thr_table *dt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * stop the specified discovery method(s)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (dt = &iscsid_thr[0]; dt->method != iSCSIDiscoveryMethodUnknown;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dt++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (idm & dt->method) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* signal discovery event change - begin */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, dt->method, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Attempt to logout of all associated targets */
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = iscsid_del(ihp, NULL, dt->method, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Successfully logged out of targets */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dt->thr_id != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rval = iscsi_thread_stop(dt->thr_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rval == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * signal discovery
fa9e4066f08beec538e775443c5be79dd423fcabahrens * event change - end
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dt->method, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * unexpected condition. The threads
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for each discovery method should
fa9e4066f08beec538e775443c5be79dd423fcabahrens * have started at initialization
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* signal discovery event change - end */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, dt->method, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } /* END for() */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_poke_discovery - wakeup discovery methods to find any new targets
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and wait for all discovery processes to complete.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_poke_discovery(iscsi_hba_t *ihp, iSCSIDiscoveryMethod_t method)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define ISCSI_DISCOVERY_DELAY 1
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_thr_table *dt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t send_wakeup;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(ihp != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* reset discovery flags */
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_enter(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_in_progress = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_events = iSCSIDiscoveryMethodUnknown;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* start all enabled discovery methods */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = persistent_disc_meth_get();
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (dt = &iscsid_thr[0]; dt->method != iSCSIDiscoveryMethodUnknown;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dt++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens send_wakeup = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((method == iSCSIDiscoveryMethodUnknown) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (method == dt->method)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((dm & dt->method) && (dt->thr_id != NULL)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_thread_send_wakeup(dt->thr_id) ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens send_wakeup = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (send_wakeup == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, dt->method, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, dt->method, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_enter(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (ihp->hba_discovery_events != ISCSI_ALL_DISCOVERY_METHODS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens delay(SEC_TO_TICK(ISCSI_DISCOVERY_DELAY));
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_enter(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_in_progress = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_do_sendtgts - issue send targets command to the given discovery
fa9e4066f08beec538e775443c5be79dd423fcabahrens * address and then add the discovered targets to the discovery queue
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_do_sendtgts(entry_t *disc_addr)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SENDTGTS_DEFAULT_NUM_TARGETS 10
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int stl_sz;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int stl_num_tgts = SENDTGTS_DEFAULT_NUM_TARGETS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sendtgts_list_t *stl_hdr = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t retry = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char inp_buf[INET6_ADDRSTRLEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *ip;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ctr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm = iSCSIDiscoveryMethodSendTargets;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* allocate and initialize sendtargets list header */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock stl_sz = sizeof (*stl_hdr) + ((stl_num_tgts - 1) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (iscsi_sendtgts_entry_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr = kmem_zalloc(stl_sz, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensretry_sendtgts:
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr->stl_in_cnt = stl_num_tgts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(disc_addr, &(stl_hdr->stl_entry),
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (stl_hdr->stl_entry));
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr->stl_entry.e_vers = ISCSI_INTERFACE_VERSION;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* lock interface so only one SendTargets operation occurs */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ihp = (iscsi_hba_t *)ddi_get_soft_state(iscsi_state, 0)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "!iscsi discovery failure - SendTargets. "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "failure to get soft state");
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(stl_hdr, stl_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens sema_p(&ihp->hba_sendtgts_semaphore);
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsi_ioctl_sendtgts_get(ihp, stl_hdr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sema_v(&ihp->hba_sendtgts_semaphore);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip = inet_ntop((disc_addr->e_insize ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (struct in_addr) ? AF_INET : AF_INET6),
fa9e4066f08beec538e775443c5be79dd423fcabahrens &disc_addr->e_u, inp_buf, sizeof (inp_buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "iscsi discovery failure - SendTargets (%s)\n", ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(stl_hdr, stl_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check if all targets received */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (stl_hdr->stl_in_cnt < stl_hdr->stl_out_cnt) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (retry == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_num_tgts = stl_hdr->stl_out_cnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(stl_hdr, stl_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_sz = sizeof (*stl_hdr) +
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((stl_num_tgts - 1) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (iscsi_sendtgts_entry_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr = kmem_zalloc(stl_sz, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens retry = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto retry_sendtgts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ip = inet_ntop((disc_addr->e_insize ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (struct in_addr) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens AF_INET : AF_INET6), &disc_addr->e_u,
fa9e4066f08beec538e775443c5be79dd423fcabahrens inp_buf, sizeof (inp_buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "iscsi discovery failure - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "SendTargets overflow (%s)\n", ip);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(stl_hdr, stl_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (ctr = 0; ctr < stl_hdr->stl_out_cnt; ctr++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_dsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_tgt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(disc_addr->e_insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &disc_addr->e_u, disc_addr->e_port, &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr->stl_list[ctr].ste_ipaddr.a_addr.i_insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &(stl_hdr->stl_list[ctr].ste_ipaddr.a_addr.i_addr),
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr->stl_list[ctr].ste_ipaddr.a_port,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_tgt.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (disc_addr->e_boot == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = dm | iSCSIDiscoveryMethodBoot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_add(ihp, dm,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_dsc.sin, (char *)stl_hdr->stl_list[ctr].ste_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens stl_hdr->stl_list[ctr].ste_tpgt,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_tgt.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(stl_hdr, stl_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_do_isns_query_one_server(iscsi_hba_t *ihp, entry_t *isns_server)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int pg_sz, query_status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_addr_t *ap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_portal_group_list_t *pg_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ap = (iscsi_addr_t *)kmem_zalloc(sizeof (iscsi_addr_t), KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ap->a_port = isns_server->e_port;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ap->a_addr.i_insize = isns_server->e_insize;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (isns_server->e_insize == sizeof (struct in_addr)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ap->a_addr.i_addr.in4.s_addr = (isns_server->e_u.u_in4.s_addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (isns_server->e_insize == sizeof (struct in6_addr)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&(isns_server->e_u.u_in6.s6_addr),
fa9e4066f08beec538e775443c5be79dd423fcabahrens ap->a_addr.i_addr.in6.s6_addr, 16);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ap, sizeof (iscsi_addr_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens query_status = isns_query_one_server(
fa9e4066f08beec538e775443c5be79dd423fcabahrens ap, ihp->hba_isid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_name, ihp->hba_alias,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_INITIATOR_NODE_TYPE, &pg_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ap, sizeof (iscsi_addr_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (query_status != isns_ok || pg_list == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens DTRACE_PROBE1(iscsid_do_isns_query_one_server_status,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int, query_status);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_add_pg_list_to_cache(ihp, pg_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_sz = sizeof (isns_portal_group_list_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pg_list->pg_out_cnt > 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_sz += (pg_list->pg_out_cnt - 1) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (isns_portal_group_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pg_list, pg_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_do_isns_query(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int pg_sz, query_status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_portal_group_list_t *pg_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens query_status = isns_query(ihp->hba_isid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_alias,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_INITIATOR_NODE_TYPE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pg_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((query_status != isns_ok &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens query_status != isns_op_partially_failed) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens DTRACE_PROBE1(iscsid_do_isns_query_status,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int, query_status);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_add_pg_list_to_cache(ihp, pg_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_sz = sizeof (isns_portal_group_list_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pg_list->pg_out_cnt > 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_sz += (pg_list->pg_out_cnt - 1) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (isns_portal_group_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pg_list, pg_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_config_one - for the given target name, attempt
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to login to all targets associated with name. If target
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name is not found in discovery queue, reset the discovery
fa9e4066f08beec538e775443c5be79dd423fcabahrens * queue, kick the discovery processes, and then retry.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * NOTE: The caller of this function must hold the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_config_semaphore across this call.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_config_one(iscsi_hba_t *ihp, char *name, boolean_t protect)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rc = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int retry = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int lun_online = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cur_sec = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!modrootloaded && (iscsiboot_prop != NULL)) {
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock if (!iscsi_configroot_printed) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "Configuring"
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock " iSCSI boot session...");
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_configroot_printed = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_net_up == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_net_interface() == ISCSI_STATUS_SUCCESS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_net_up = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_WARN, "Failed to configure interface"
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock " for iSCSI boot session");
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (rc == B_FALSE && retry <
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_configroot_retry) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsid_login_tgt(ihp, name,
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock iSCSIDiscoveryMethodBoot, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * create boot session
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_boot_session_create(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsiboot_prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The boot session has been created, if
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the target lun has not been online,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we should wait here for a while
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens do {
fa9e4066f08beec538e775443c5be79dd423fcabahrens lun_online =
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsiboot_prop->boot_tgt.lun_online;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (lun_online == 0) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock delay(SEC_TO_TICK(1));
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_sec++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } while ((lun_online == 0) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (cur_sec < iscsi_boot_max_delay));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens retry++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!rc) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_WARN, "Failed to configure iSCSI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " boot session");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsid_login_tgt(ihp, name, iSCSIDiscoveryMethodUnknown,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we didn't login to the device we might have
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to update our discovery information and attempt
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the login again.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Stale /dev links can cause us to get floods
fa9e4066f08beec538e775443c5be79dd423fcabahrens * of config requests. Prevent these repeated
fa9e4066f08beec538e775443c5be79dd423fcabahrens * requests from causing unneeded discovery updates
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if ISCSI_CONFIG_STORM_PROTECT is set.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if ((protect == B_FALSE) ||
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (ddi_get_lbolt() > ihp->hba_config_lbolt +
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock SEC_TO_TICK(ihp->hba_config_storm_delay))) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ihp->hba_config_lbolt = ddi_get_lbolt();
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_poke_discovery(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_login_tgt(ihp, name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_config_all - reset the discovery queue, kick the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery processes, and login to all targets found
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * NOTE: The caller of this function must hold the
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * iscsid_config_semaphore across this call.
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
afefbcddfd8caf5f3b2da510d9439471ab225040eschrockiscsid_config_all(iscsi_hba_t *ihp, boolean_t protect)
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rc = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int retry = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int lun_online = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cur_sec = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!modrootloaded && iscsiboot_prop != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!iscsi_configroot_printed) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "Configuring"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " iSCSI boot session...");
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_configroot_printed = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_net_up == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_net_interface() == ISCSI_STATUS_SUCCESS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_net_up = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (rc == B_FALSE && retry <
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_configroot_retry) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsid_login_tgt(ihp, NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodBoot, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No boot session has been created.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We would like to create the boot
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Session first.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_boot_session_create(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsiboot_prop);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The boot session has been created, if
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the target lun has not been online,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we should wait here for a while
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens do {
fa9e4066f08beec538e775443c5be79dd423fcabahrens lun_online =
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsiboot_prop->boot_tgt.lun_online;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (lun_online == 0) {
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm delay(SEC_TO_TICK(1));
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm cur_sec++;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } while ((lun_online == 0) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (cur_sec < iscsi_boot_max_delay));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens retry++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!rc) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_WARN, "Failed to configure"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " boot session");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Stale /dev links can cause us to get floods
fa9e4066f08beec538e775443c5be79dd423fcabahrens * of config requests. Prevent these repeated
fa9e4066f08beec538e775443c5be79dd423fcabahrens * requests from causing unneeded discovery updates
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if ISCSI_CONFIG_STORM_PROTECT is set.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((protect == B_FALSE) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (ddi_get_lbolt() > ihp->hba_config_lbolt +
fa9e4066f08beec538e775443c5be79dd423fcabahrens SEC_TO_TICK(ihp->hba_config_storm_delay))) {
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling ihp->hba_config_lbolt = ddi_get_lbolt();
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling iscsid_poke_discovery(ihp,
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling iSCSIDiscoveryMethodUnknown);
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling }
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling (void) iscsid_login_tgt(ihp, NULL,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock iSCSIDiscoveryMethodUnknown, NULL);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * isns_scn_callback - iSNS client received an SCN
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock *
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * This code processes the iSNS client SCN events. These
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * could relate to the addition, removal, or update of a
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * logical unit.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockvoid
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockisns_scn_callback(void *arg)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int i, pg_sz;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int qry_status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_portal_group_list_t *pg_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t scn_type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (arg == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* No argument */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ihp = (iscsi_hba_t *)ddi_get_soft_state(iscsi_state, 0)) == NULL) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock kmem_free(arg, sizeof (isns_scn_callback_arg_t));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * All isns callbacks are from a standalone taskq
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * therefore the blocking here doesn't affect the enable/disable
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * of isns discovery method
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_client_request_service(ihp) == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(arg, sizeof (isns_scn_callback_arg_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock scn_type = ((isns_scn_callback_arg_t *)arg)->scn_type;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock DTRACE_PROBE1(isns_scn_callback_scn_type, int, scn_type);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock switch (scn_type) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * ISNS_OBJ_ADDED - An object has been added.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ISNS_OBJ_ADDED:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /* Query iSNS server for contact information */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock pg_list = NULL;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock qry_status = isns_query_one_node(
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((isns_scn_callback_arg_t *)arg)->source_key_attr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_isid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_name,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (uint8_t *)"",
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ISNS_INITIATOR_NODE_TYPE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pg_list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /* Verify portal group is found */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if ((qry_status != isns_ok &&
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock qry_status != isns_op_partially_failed) ||
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock pg_list == NULL) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock DTRACE_PROBE1(pg_list,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock isns_portal_group_list_t *, pg_list);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /* Add all portals for logical unit to discovery cache */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < pg_list->pg_out_cnt; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_dsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_tgt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].isns_server_ip.i_insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pg_list->pg_list[i].isns_server_ip.i_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].isns_server_port,
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(pg_list->pg_list[i].insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pg_list->pg_list[i].pg_ip_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].pg_port, &addr_tgt.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_add(ihp, iSCSIDiscoveryMethodISNS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_dsc.sin, (char *)pg_list->pg_list[i].
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_iscsi_name, pg_list->pg_list[i].pg_tag,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_tgt.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Force target to login */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_login_tgt(ihp, (char *)pg_list->
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list[i].pg_iscsi_name, iSCSIDiscoveryMethodISNS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pg_list != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_sz = sizeof (isns_portal_group_list_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pg_list->pg_out_cnt > 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_sz += (pg_list->pg_out_cnt - 1) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (isns_portal_group_t);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pg_list, pg_sz);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ISNS_OBJ_REMOVED - logical unit has been removed
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISNS_OBJ_REMOVED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsid_del(ihp,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (char *)((isns_scn_callback_arg_t *)arg)->
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock source_key_attr, iSCSIDiscoveryMethodISNS, NULL) !=
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock B_TRUE) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cmn_err(CE_NOTE, "iscsi initiator - "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "isns remove scn failed for target %s\n",
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (char *)((isns_scn_callback_arg_t *)arg)->
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock source_key_attr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ISNS_OBJ_UPDATED - logical unit has changed
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISNS_OBJ_UPDATED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "iscsi initiator - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "received iSNS update SCN for %s\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)((isns_scn_callback_arg_t *)arg)->
fa9e4066f08beec538e775443c5be79dd423fcabahrens source_key_attr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
cbcb6089bf49be7bed77b8c9c1727b26f2e9c913lling /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ISNS_OBJ_UNKNOWN -
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "iscsi initiator - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "received unknown iSNS SCN type 0x%x\n", scn_type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_client_release_service(ihp);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm kmem_free(arg, sizeof (isns_scn_callback_arg_t));
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm}
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_add - Creates discovered session and connection
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
4c58d71403cebfaa40a572ff12b17668ebd56987darrenmstatic boolean_t
4c58d71403cebfaa40a572ff12b17668ebd56987darrenmiscsid_add(iscsi_hba_t *ihp, iSCSIDiscoveryMethod_t method,
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm struct sockaddr *addr_dsc, char *target_name, int tpgt,
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr *addr_tgt)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rtn = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_t *isp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_conn_t *icp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t oid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int isid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_config_sess_t *ics;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *tmp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(ihp != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(addr_dsc != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(target_name != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(addr_tgt != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* setup initial buffer for configured session information */
fa9e4066f08beec538e775443c5be79dd423fcabahrens size = sizeof (*ics);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics = kmem_zalloc(size, KM_SLEEP);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm ics->ics_in = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get configured sessions information */
fa9e4066f08beec538e775443c5be79dd423fcabahrens tmp = target_name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_get_config_session(tmp, ics) == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No target information available check for
fa9e4066f08beec538e775443c5be79dd423fcabahrens * initiator information.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens tmp = (char *)ihp->hba_name;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (persistent_get_config_session(tmp, ics) == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No hba information is
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * found. So assume default
fa9e4066f08beec538e775443c5be79dd423fcabahrens * one session unbound behavior.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics->ics_out = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics->ics_bound = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && (ics->ics_out > 1) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens !iscsi_chk_bootlun_mpxio(ihp)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsi boot with mpxio disabled
fa9e4066f08beec538e775443c5be79dd423fcabahrens * no need to search configured boot session
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsi_cmp_boot_ini_name(tmp) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_cmp_boot_tgt_name(tmp)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics->ics_out = 1;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm ics->ics_bound = B_FALSE;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm }
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm }
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Check to see if we need to get more information */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ics->ics_out > 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* record new size and free last buffer */
fa9e4066f08beec538e775443c5be79dd423fcabahrens idx = ics->ics_out;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size = ISCSI_SESSION_CONFIG_SIZE(ics->ics_out);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, sizeof (*ics));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* allocate new buffer */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics = kmem_zalloc(size, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics->ics_in = idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get configured sessions information */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_get_config_session(tmp, ics) != B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "iscsi session(%s) - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "unable to get configured session information\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens target_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* loop for all configured sessions */
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_enter(&ihp->hba_sess_list_rwlock, RW_WRITER);
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (isid = 0; isid < ics->ics_out; isid++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* create or find matching session */
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = iscsi_sess_create(ihp, method, addr_dsc, target_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens tpgt, isid, ISCSI_SESS_TYPE_NORMAL, &oid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (isp == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* create or find matching connection */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ISCSI_SUCCESS(iscsi_conn_create(addr_tgt, isp, &icp))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Teardown the session we just created. It can't
fa9e4066f08beec538e775443c5be79dd423fcabahrens * have any luns or connections associated with it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * so this should always succeed (luckily since what
fa9e4066f08beec538e775443c5be79dd423fcabahrens * would we do if it failed?)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_sess_destroy(isp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rtn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_del - Attempts to delete all associated sessions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_del(iscsi_hba_t *ihp, char *target_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t method, struct sockaddr *addr_dsc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rtn = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_status_t status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_t *isp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char name[ISCSI_MAX_NAME_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(ihp != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* target name can be NULL or !NULL */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* addr_dsc can be NULL or !NULL */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_enter(&ihp->hba_sess_list_rwlock, RW_WRITER);
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = ihp->hba_sess_list;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm while (isp != NULL) {
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If no target_name is listed (meaning all targets)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or this specific target was listed. And the same
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery method discovered this target then
fa9e4066f08beec538e775443c5be79dd423fcabahrens * continue evaulation. Otherwise fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (((target_name == NULL) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (strcmp((char *)isp->sess_name, target_name) == 0)) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (isp->sess_discovered_by == method)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t try_destroy;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If iSNS, SendTargets, or Static then special
fa9e4066f08beec538e775443c5be79dd423fcabahrens * handling for disc_addr.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((method == iSCSIDiscoveryMethodISNS) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (method == iSCSIDiscoveryMethodSendTargets)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If NULL addr_dsc (meaning all disc_addr)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or matching discovered addr.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if ((addr_dsc == NULL) ||
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm (bcmp(addr_dsc, &isp->sess_discovered_addr,
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm SIZEOF_SOCKADDR(
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm &isp->sess_discovered_addr.sin)) == 0)) {
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm try_destroy = B_TRUE;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm } else {
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm try_destroy = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (method == iSCSIDiscoveryMethodStatic) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If NULL addr_dsc (meaning all disc_addr)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or matching active connection.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((addr_dsc == NULL) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((isp->sess_conn_act != NULL) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (bcmp(addr_dsc,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &isp->sess_conn_act->conn_base_addr.sin,
fa9e4066f08beec538e775443c5be79dd423fcabahrens SIZEOF_SOCKADDR(
fa9e4066f08beec538e775443c5be79dd423fcabahrens &isp->sess_conn_act->conn_base_addr.sin))
fa9e4066f08beec538e775443c5be79dd423fcabahrens == 0))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_destroy = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_destroy = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Unknown discovery specified */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_destroy = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (try_destroy == B_TRUE &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp->sess_boot == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(name, (char *)isp->sess_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = iscsi_sess_destroy(isp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ISCSI_SUCCESS(status)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_remove_target_param(name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = ihp->hba_sess_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The most likely destroy failure
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is that ndi/mdi offline failed.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This means that the resource is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * in_use/busy.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "iscsi session(%d) - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "session logout failed (%d)\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp->sess_oid, status);
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rtn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_login_tgt - request target(s) to login
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_login_tgt(iscsi_hba_t *ihp, char *target_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t method, struct sockaddr *addr_dsc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_t *isp = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_list_t *isp_list = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_list_t *last_sess = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_list_t *cur_sess = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int total = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddi_taskq_t *login_taskq = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char taskq_name[ISCSI_TH_MAX_NAME_LEN] = {0};
fa9e4066f08beec538e775443c5be79dd423fcabahrens time_t time_stamp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(ihp != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_enter(&ihp->hba_sess_list_rwlock, RW_WRITER);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Loop thru sessions */
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = ihp->hba_sess_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (isp != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t try_online;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!(method & iSCSIDiscoveryMethodBoot)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (target_name == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (method == iSCSIDiscoveryMethodUnknown) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* unknown method mean login to all */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (isp->sess_discovered_by & method) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((method ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodISNS) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (method ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodSendTargets)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SESS_DISC_ADDR isp->sess_discovered_addr.sin
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((addr_dsc == NULL) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (bcmp(
fa9e4066f08beec538e775443c5be79dd423fcabahrens &isp->sess_discovered_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_dsc, SIZEOF_SOCKADDR(
fa9e4066f08beec538e775443c5be79dd423fcabahrens &SESS_DISC_ADDR))
fa9e4066f08beec538e775443c5be79dd423fcabahrens == 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iSNS or sendtarget
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery address
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is NULL or match
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* addr_dsc not a match */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens#undef SESS_DISC_ADDR
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* static configuration */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* method not a match */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (strcmp(target_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)isp->sess_name) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* target_name match */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock try_online = B_TRUE;
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* target_name not a match */
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * online the boot session.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (isp->sess_boot == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens try_online = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (try_online == B_TRUE &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens total++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Copy these sessions to the list. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (isp_list == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp_list =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (iscsi_sess_list_t *)kmem_zalloc(
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (iscsi_sess_list_t), KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess = isp_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess->session = isp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess->next = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess->next =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (iscsi_sess_list_t *)kmem_zalloc(
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (iscsi_sess_list_t), KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess->next->session = isp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess->next->next = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens last_sess = last_sess->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (total > 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens time_stamp = ddi_get_time();
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(taskq_name, (ISCSI_TH_MAX_NAME_LEN - 1),
fa9e4066f08beec538e775443c5be79dd423fcabahrens "login_queue.%lx", time_stamp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens login_taskq = ddi_taskq_create(ihp->hba_dip,
fa9e4066f08beec538e775443c5be79dd423fcabahrens taskq_name, total, TASKQ_DEFAULTPRI, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (login_taskq == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (isp_list != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_sess = isp_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp_list = isp_list->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(cur_sess, sizeof (iscsi_sess_list_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rtn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (cur_sess = isp_list; cur_sess != NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_sess = cur_sess->next) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ddi_taskq_dispatch(login_taskq,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_online, (void *)cur_sess->session,
fa9e4066f08beec538e775443c5be79dd423fcabahrens DDI_SLEEP) != DDI_SUCCESS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "Can't dispatch the task "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "for login to the target: %s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens cur_sess->session->sess_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock ddi_taskq_wait(login_taskq);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock ddi_taskq_destroy(login_taskq);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock while (isp_list != NULL) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock cur_sess = isp_list;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock isp_list = isp_list->next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(cur_sess, sizeof (iscsi_sess_list_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock rw_exit(&ihp->hba_sess_list_rwlock);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (rtn);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock}
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock/*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * +--------------------------------------------------------------------+
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * | Local Helper Functions |
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * +--------------------------------------------------------------------+
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_init_config -- initialize configuration parameters of iSCSI initiator
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_init_config(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_param_set_t ips;
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *initiatorName;
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_t pp;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock persistent_tunable_param_t pparam;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t param_id;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock int rc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* allocate memory to hold initiator names */
fa9e4066f08beec538e775443c5be79dd423fcabahrens initiatorName = kmem_zalloc(ISCSI_MAX_NAME_LEN, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * initialize iSCSI initiator name
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock bzero(&ips, sizeof (ips));
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (persistent_initiator_name_get(initiatorName,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock ISCSI_MAX_NAME_LEN) == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_vers = ISCSI_INTERFACE_VERSION;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_param = ISCSI_LOGIN_PARAM_INITIATOR_NAME;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && !iscsi_cmp_boot_ini_name(initiatorName)) {
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock (void) strncpy(initiatorName,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (const char *)iscsiboot_prop->boot_init.ini_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy((char *)ips.s_value.v_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (const char *)iscsiboot_prop->boot_init.ini_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (ips.s_value.v_name));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_set_params(&ips, ihp, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* use default tunable value */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_tunable_params.recv_login_rsp_timeout =
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_RX_TIMEOUT_VALUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_tunable_params.polling_login_delay =
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_LOGIN_POLLING_DELAY;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_tunable_params.conn_login_max =
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_CONN_DEFAULT_LOGIN_MAX;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock cmn_err(CE_NOTE, "Set initiator's name"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " from firmware");
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy((char *)ips.s_value.v_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens initiatorName, sizeof (ips.s_value.v_name));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock (void) iscsi_set_params(&ips, ihp, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_get_tunable_param(initiatorName,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pparam) == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* use default value */
fa9e4066f08beec538e775443c5be79dd423fcabahrens pparam.p_params.recv_login_rsp_timeout =
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_RX_TIMEOUT_VALUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pparam.p_params.polling_login_delay =
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_LOGIN_POLLING_DELAY;
fa9e4066f08beec538e775443c5be79dd423fcabahrens pparam.p_params.conn_login_max =
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_CONN_DEFAULT_LOGIN_MAX;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&pparam.p_params, &ihp->hba_tunable_params,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (iscsi_tunable_params_t));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * if no initiator-node name available it is most
fa9e4066f08beec538e775443c5be79dd423fcabahrens * likely due to a fresh install, or the persistent
fa9e4066f08beec538e775443c5be79dd423fcabahrens * store is not working correctly. Set
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a default initiator name so that the initiator can
fa9e4066f08beec538e775443c5be79dd423fcabahrens * be brought up properly.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_set_default_initiator_node_settings(ihp, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy(initiatorName, (const char *)ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * initialize iSCSI initiator alias (if any)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens bzero(&ips, sizeof (ips));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_alias_name_get((char *)ips.s_value.v_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (ips.s_value.v_name)) == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_param = ISCSI_LOGIN_PARAM_INITIATOR_ALIAS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_set_params(&ips, ihp, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* EMPTY */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* No alias defined - not a problem. */
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * load up the overriden iSCSI initiator parameters
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = kmem_zalloc(ISCSI_MAX_NAME_LEN, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_lock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (persistent_param_next(&v, name, &pp) == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(name, initiatorName, ISCSI_MAX_NAME_LEN) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_oid = ihp->hba_oid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_vers = ISCSI_INTERFACE_VERSION;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (param_id = 0; param_id < ISCSI_NUM_LOGIN_PARAM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens param_id++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pp.p_bitmap & (1 << param_id)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsid_copyto_param_set(param_id,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pp.p_params, &ips);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsi_set_params(&ips,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* note error but continue */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "Failed to set "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "param %d for OID %d",
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_param, ips.s_oid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } /* END for() */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_chk_bootlun_mpxio(ihp)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_reconfig_boot_sess(ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } /* END while() */
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_unlock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(initiatorName, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(name, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_init_targets -- Load up the driver with known static targets and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * targets whose parameters have been modified.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This is done so that the CLI can find a list of targets the driver
fa9e4066f08beec538e775443c5be79dd423fcabahrens * currently knows about.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The driver doesn't need to log into these targets. Log in is done based
fa9e4066f08beec538e775443c5be79dd423fcabahrens * upon the enabled discovery methods.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_init_targets(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_param_set_t ips;
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_t pp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *iname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t param_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(ihp != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* allocate memory to hold target names */
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = kmem_zalloc(ISCSI_MAX_NAME_LEN, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * load up targets whose parameters have been overriden
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ---- only need to be set once ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens bzero(&ips, sizeof (ips));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_vers = ISCSI_INTERFACE_VERSION;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* allocate memory to hold initiator name */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iname = kmem_zalloc(ISCSI_MAX_NAME_LEN, KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) persistent_initiator_name_get(iname, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_lock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (persistent_param_next(&v, name, &pp) == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(iname, name, ISCSI_MAX_NAME_LEN) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * target name matched initiator's name so,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * continue to next target. Initiator's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * parmeters have already been set.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && iscsi_cmp_boot_tgt_name(name) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens !iscsi_chk_bootlun_mpxio(ihp)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * boot target is not mpxio enabled
fa9e4066f08beec538e775443c5be79dd423fcabahrens * simply ignore these overriden parameters
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock continue;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock ips.s_oid = iscsi_targetparam_get_oid((unsigned char *)name);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock for (param_id = 0; param_id < ISCSI_NUM_LOGIN_PARAM;
fa9e4066f08beec538e775443c5be79dd423fcabahrens param_id++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pp.p_bitmap & (1 << param_id)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsid_copyto_param_set(param_id,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pp.p_params, &ips);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsi_set_params(&ips,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* note error but continue ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "Failed to set "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "param %d for OID %d",
fa9e4066f08beec538e775443c5be79dd423fcabahrens ips.s_param, ips.s_oid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } /* END for() */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && iscsi_cmp_boot_tgt_name(name) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_chk_bootlun_mpxio(ihp)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_reconfig_boot_sess(ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } /* END while() */
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_unlock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(iname, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(name, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_thread_static -- If static discovery is enabled, this routine obtains
fa9e4066f08beec538e775443c5be79dd423fcabahrens * all statically configured targets from the peristent store and issues a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * login request to the driver.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_thread_static(iscsi_thread_t *thread, void *p)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm;
fa9e4066f08beec538e775443c5be79dd423fcabahrens entry_t entry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char name[ISCSI_MAX_NAME_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp = (iscsi_hba_t *)p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (iscsi_thread_wait(thread, -1) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodStatic, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ---- ensure static target discovery is enabled ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = persistent_disc_meth_get();
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((dm & iSCSIDiscoveryMethodStatic) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "iscsi discovery failure - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "StaticTargets method is not enabled");
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodStatic, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * walk list of the statically configured targets from the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * persistent store
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_static_addr_lock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (persistent_static_addr_next(&v, name, &entry) ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(entry.e_insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &(entry.e_u), entry.e_port, &addr.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_add(ihp, iSCSIDiscoveryMethodStatic,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr.sin, name, entry.e_tpgt, &addr.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_static_addr_unlock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodStatic, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_thread_sendtgts -- If SendTargets discovery is enabled, this routine
fa9e4066f08beec538e775443c5be79dd423fcabahrens * obtains all target discovery addresses configured from the peristent store
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and probe the IP/port addresses for possible targets. It will then issue
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a login request to the driver for all discoveryed targets.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_thread_sendtgts(iscsi_thread_t *thread, void *p)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp = (iscsi_hba_t *)p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm;
fa9e4066f08beec538e775443c5be79dd423fcabahrens entry_t entry;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock void *v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (iscsi_thread_wait(thread, -1) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodSendTargets,
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ---- ensure SendTargets discovery is enabled ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = persistent_disc_meth_get();
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((dm & iSCSIDiscoveryMethodSendTargets) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "iscsi discovery failure - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "SendTargets method is not enabled");
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodSendTargets, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * walk list of the SendTarget discovery addresses from the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * persistent store
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens v = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_disc_addr_lock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (persistent_disc_addr_next(&v, &entry) == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_do_sendtgts(&entry);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_disc_addr_unlock();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodSendTargets,
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_thread_slp -- If SLP discovery is enabled, this routine provides
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the SLP discovery service.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_thread_slp(iscsi_thread_t *thread, void *p)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp = (iscsi_hba_t *)p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens do {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Even though we don't have support for SLP at this point
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we'll send the events if someone has enabled this thread.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is not done the daemon waiting for discovery to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * complete will pause forever holding up the boot process.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodSLP, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodSLP, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } while (iscsi_thread_wait(thread, -1) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_thread_isns --
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_thread_isns(iscsi_thread_t *thread, void *ptr)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp = (iscsi_hba_t *)ptr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethod_t dm;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (iscsi_thread_wait(thread, -1) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodISNS, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* ---- ensure iSNS discovery is enabled ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm = persistent_disc_meth_get();
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((dm & iSCSIDiscoveryMethodISNS) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "iscsi discovery failure - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "iSNS method is not enabled");
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodISNS, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) isns_reg(ihp->hba_isid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_alias,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISNS_INITIATOR_NODE_TYPE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_scn_callback);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_do_isns_query(ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_discovery_event(ihp, iSCSIDiscoveryMethodISNS, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Thread stopped. Deregister from iSNS servers(s). */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) isns_dereg(ihp->hba_isid, ihp->hba_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_threads_create -- Creates all the discovery threads.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_threads_create(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_thr_table *t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * start a thread for each discovery method
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (t = &iscsid_thr[0]; t->method != iSCSIDiscoveryMethodUnknown;
fa9e4066f08beec538e775443c5be79dd423fcabahrens t++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (t->thr_id == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens t->thr_id = iscsi_thread_create(ihp->hba_dip, t->name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens t->func_start, ihp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_threads_destroy -- Destroys all the discovery threads.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_threads_destroy(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_thr_table *t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (t = &iscsid_thr[0]; t->method != iSCSIDiscoveryMethodUnknown;
fa9e4066f08beec538e775443c5be79dd423fcabahrens t++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (t->thr_id != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_thread_destroy(t->thr_id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens t->thr_id = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_copyto_param_set - helper function for iscsid_init_params.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_copyto_param_set(uint32_t param_id, iscsi_login_params_t *params,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_param_set_t *ipsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rtn = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (param_id >= ISCSI_NUM_LOGIN_PARAM) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (EINVAL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (param_id) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Boolean parameters
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_DATA_SEQUENCE_IN_ORDER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_bool = params->data_pdu_in_order;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_IMMEDIATE_DATA:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_bool = params->immediate_data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_INITIAL_R2T:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_bool = params->initial_r2t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_DATA_PDU_IN_ORDER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_bool = params->data_pdu_in_order;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Integer parameters
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_HEADER_DIGEST:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->header_digest;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_DATA_DIGEST:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->data_digest;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_RETAIN:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->default_time_to_retain;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_WAIT:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->default_time_to_wait;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_MAX_RECV_DATA_SEGMENT_LENGTH:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->max_recv_data_seg_len;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_FIRST_BURST_LENGTH:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->first_burst_length;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_MAX_BURST_LENGTH:
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_value.v_integer = params->max_burst_length;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Integer parameters which currently are unsettable
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_MAX_CONNECTIONS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_OUTSTANDING_R2T:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ISCSI_LOGIN_PARAM_ERROR_RECOVERY_LEVEL:
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* ---- drop through to default case ---- */
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = EINVAL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* if all is well, set the parameter identifier */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (rtn == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ipsp->s_param = param_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rtn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_add_pg_list_to_cache - Add portal groups in the list to the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * discovery cache.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_add_pg_list_to_cache(iscsi_hba_t *ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens isns_portal_group_list_t *pg_list)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < pg_list->pg_out_cnt; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_dsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_tgt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].isns_server_ip.i_insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pg_list->pg_list[i].isns_server_ip.i_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].isns_server_port,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_dsc.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsid_addr_to_sockaddr(
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].insize,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pg_list->pg_list[i].pg_ip_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].pg_port,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_tgt.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsid_add(ihp, iSCSIDiscoveryMethodISNS, &addr_dsc.sin,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)pg_list->pg_list[i].pg_iscsi_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens pg_list->pg_list[i].pg_tag, &addr_tgt.sin);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * set_initiator_name - set default initiator name and alias.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This sets the default initiator name and alias. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * initiator name is composed of sun's reverse domain name
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and registration followed and a unique classifier. This
fa9e4066f08beec538e775443c5be79dd423fcabahrens * classifier is the mac address of the first NIC in the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * host and a timestamp to make sure the classifier is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * unique if the NIC is moved between hosts. The alias
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is just the hostname.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_set_default_initiator_node_settings(iscsi_hba_t *ihp, boolean_t minimal)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens time_t x;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct ether_addr eaddr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char val[10];
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_chap_props_t *chap = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Set default initiator-node name */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && iscsiboot_prop->boot_init.ini_name != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy((char *)ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (const char *)iscsiboot_prop->boot_init.ini_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf((char *)ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock "iqn.1986-03.com.sun:01:");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) localetheraddr(NULL, &eaddr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < ETHERADDRL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(val, sizeof (val), "%02x",
fa9e4066f08beec538e775443c5be79dd423fcabahrens eaddr.ether_addr_octet[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncat((char *)ihp->hba_name, val,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Set default initiator-node alias */
fa9e4066f08beec538e775443c5be79dd423fcabahrens x = ddi_get_time();
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(val, sizeof (val), ".%lx", x);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncat((char *)ihp->hba_name, val, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ihp->hba_alias[0] == '\0') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy((char *)ihp->hba_alias,
fa9e4066f08beec538e775443c5be79dd423fcabahrens utsname.nodename, ISCSI_MAX_NAME_LEN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_alias_length = strlen((char *)ihp->hba_alias);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (minimal == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) persistent_alias_name_set(
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)ihp->hba_alias);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (minimal == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) persistent_initiator_name_set((char *)ihp->hba_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Set default initiator-node CHAP settings */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_initiator_name_get((char *)ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN) == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens chap = (iscsi_chap_props_t *)kmem_zalloc(sizeof (*chap),
fa9e4066f08beec538e775443c5be79dd423fcabahrens KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_chap_get((char *)ihp->hba_name, chap) ==
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy((char *)ihp->hba_name, chap->c_user,
fa9e4066f08beec538e775443c5be79dd423fcabahrens strlen((char *)ihp->hba_name));
fa9e4066f08beec538e775443c5be79dd423fcabahrens chap->c_user_len = strlen((char *)ihp->hba_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) persistent_chap_set((char *)ihp->hba_name, chap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(chap, sizeof (*chap));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_remove_target_param(char *name)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens persistent_param_t *pparam;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t t_oid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_config_sess_t *ics;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(name != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Remove target-param <-> target mapping.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Only remove if there is not any overridden
fa9e4066f08beec538e775443c5be79dd423fcabahrens * parameters in the persistent store
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens pparam = (persistent_param_t *)kmem_zalloc(sizeof (*pparam), KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * setup initial buffer for configured session
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics = (iscsi_config_sess_t *)kmem_zalloc(sizeof (*ics), KM_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics->ics_in = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((persistent_param_get(name, pparam) == B_FALSE) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (persistent_get_config_session(name, ics) == B_FALSE)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens t_oid = iscsi_targetparam_get_oid((uchar_t *)name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) iscsi_targetparam_remove_target(t_oid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(pparam, sizeof (*pparam));
fa9e4066f08beec538e775443c5be79dd423fcabahrens pparam = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, sizeof (*ics));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsid_addr_to_sockaddr - convert other types to struct sockaddr
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_addr_to_sockaddr(int src_insize, void *src_addr, int src_port,
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr *dst_addr)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT((src_insize == sizeof (struct in_addr)) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (src_insize == sizeof (struct in6_addr)));
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(src_addr != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ASSERT(dst_addr != NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens bzero(dst_addr, sizeof (*dst_addr));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* translate discovery information */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (src_insize == sizeof (struct in_addr)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr_in *addr_in =
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling (struct sockaddr_in *)dst_addr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_in->sin_family = AF_INET;
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(src_addr, &addr_in->sin_addr.s_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (struct in_addr));
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_in->sin_port = htons(src_port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sockaddr_in6 *addr_in6 =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (struct sockaddr_in6 *)dst_addr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_in6->sin6_family = AF_INET6;
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(src_addr, &addr_in6->sin6_addr.s6_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (struct in6_addr));
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_in6->sin6_port = htons(src_port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsi_discovery_event -- send event associated with discovery operations
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Each discovery event has a start and end event. Which is sent is based
fa9e4066f08beec538e775443c5be79dd423fcabahrens * on the boolean argument start with the obvious results.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsi_discovery_event(iscsi_hba_t *ihp, iSCSIDiscoveryMethod_t m,
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t start)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *subclass = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_enter(&ihp->hba_discovery_events_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (m) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case iSCSIDiscoveryMethodStatic:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (start == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_STATIC_START;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_events |= iSCSIDiscoveryMethodStatic;
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_STATIC_END;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case iSCSIDiscoveryMethodSendTargets:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (start == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_SEND_TARGETS_START;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_events |=
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodSendTargets;
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_SEND_TARGETS_END;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case iSCSIDiscoveryMethodSLP:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (start == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_SLP_START;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_events |= iSCSIDiscoveryMethodSLP;
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_SLP_END;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case iSCSIDiscoveryMethodISNS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (start == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_ISNS_START;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_discovery_events |= iSCSIDiscoveryMethodISNS;
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass = ESC_ISCSI_ISNS_END;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit(&ihp->hba_discovery_events_mutex);
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling iscsi_send_sysevent(ihp, EC_ISCSI, subclass, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * iscsi_send_sysevent -- send sysevent using specified class
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
441d80aa4f613b6298fc8bd3151f4be02dbf84fcllingvoid
441d80aa4f613b6298fc8bd3151f4be02dbf84fcllingiscsi_send_sysevent(
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling iscsi_hba_t *ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *eventclass,
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *subclass,
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *np)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) ddi_log_sysevent(ihp->hba_dip, DDI_VENDOR_SUNW, eventclass,
fa9e4066f08beec538e775443c5be79dd423fcabahrens subclass, np, NULL, DDI_SLEEP);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic boolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_boot_init_config(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strlen((const char *)iscsiboot_prop->boot_init.ini_name) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(iscsiboot_prop->boot_init.ini_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens strlen((const char *)iscsiboot_prop->boot_init.ini_name));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* or using default login param for boot session */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsi_reconfig_boot_sess(iscsi_hba_t *ihp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_config_sess_t *ics;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int idx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_t *isp, *t_isp;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling int isid, size;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t rtn = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens size = sizeof (*ics);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ics = kmem_zalloc(size, KM_SLEEP);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ics->ics_in = 1;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* get information of number of sessions to be configured */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock name = (char *)iscsiboot_prop->boot_tgt.tgt_name;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (persistent_get_config_session(name, ics) == B_FALSE) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * No target information available to check
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * initiator information. Assume one session
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * by default.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock name = (char *)iscsiboot_prop->boot_init.ini_name;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (persistent_get_config_session(name, ics) == B_FALSE) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ics->ics_out = 1;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ics->ics_bound = B_TRUE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* get necessary information */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (ics->ics_out > 1) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock idx = ics->ics_out;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock size = ISCSI_SESSION_CONFIG_SIZE(ics->ics_out);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock kmem_free(ics, sizeof (*ics));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ics = kmem_zalloc(size, KM_SLEEP);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ics->ics_in = idx;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* get configured sessions information */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (persistent_get_config_session((char *)name,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ics) != B_TRUE) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cmn_err(CE_NOTE, "session(%s) - "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "failed to setup multiple sessions",
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock name);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock kmem_free(ics, size);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* create a temporary session to keep boot session connective */
fa9e4066f08beec538e775443c5be79dd423fcabahrens t_isp = iscsi_add_boot_sess(ihp, ISCSI_MAX_CONFIG_SESSIONS);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (t_isp == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "session(%s) - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "failed to setup multiple sessions", name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* destroy all old boot sessions */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock rw_enter(&ihp->hba_sess_list_rwlock, RW_WRITER);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock isp = ihp->hba_sess_list;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock while (isp != NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (iscsi_chk_bootlun_mpxio(ihp) && isp->sess_boot) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (isp->sess_isid[5] != ISCSI_MAX_CONFIG_SESSIONS) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * destroy all stale sessions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * except temporary boot session
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ISCSI_SUCCESS(iscsi_sess_destroy(
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = ihp->hba_sess_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * couldn't destroy stale sessions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * at least poke it to disconnect
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_enter(&isp->sess_state_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_state_machine(isp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_SESS_EVENT_N7);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mutex_exit(&isp->sess_state_mutex);
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "session(%s) - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "failed to setup multiple"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " sessions", name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = isp->sess_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (isid = 0; isid < ics->ics_out; isid++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = iscsi_add_boot_sess(ihp, isid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (isp == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "session(%s) - failed to setup"
fa9e4066f08beec538e775443c5be79dd423fcabahrens " multiple sessions", name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!rtn && (isid == 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fail to create any new boot session
fa9e4066f08beec538e775443c5be79dd423fcabahrens * so only the temporary session is alive
fa9e4066f08beec538e775443c5be79dd423fcabahrens * quit without destroying it
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rtn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_enter(&ihp->hba_sess_list_rwlock, RW_WRITER);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ISCSI_SUCCESS(iscsi_sess_destroy(t_isp))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* couldn't destroy temp boot session */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmn_err(CE_NOTE, "session(%s) - "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "failed to setup multiple sessions", name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens rtn = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmem_free(ics, size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (rtn);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic iscsi_sess_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsi_add_boot_sess(iscsi_hba_t *ihp, int isid)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sess_t *isp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_conn_t *icp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t oid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_sockaddr_t addr_dst;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_dst.sin.sa_family = iscsiboot_prop->boot_tgt.sin_family;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (addr_dst.sin.sa_family == AF_INET) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&iscsiboot_prop->boot_tgt.tgt_ip_u.u_in4.s_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_dst.sin4.sin_addr.s_addr, sizeof (struct in_addr));
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_dst.sin4.sin_port =
fa9e4066f08beec538e775443c5be79dd423fcabahrens htons(iscsiboot_prop->boot_tgt.tgt_port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(&iscsiboot_prop->boot_tgt.tgt_ip_u.u_in6.s6_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &addr_dst.sin6.sin6_addr.s6_addr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (struct in6_addr));
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr_dst.sin6.sin6_port =
fa9e4066f08beec538e775443c5be79dd423fcabahrens htons(iscsiboot_prop->boot_tgt.tgt_port);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_enter(&ihp->hba_sess_list_rwlock, RW_WRITER);
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp = iscsi_sess_create(ihp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodBoot|iSCSIDiscoveryMethodStatic,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (struct sockaddr *)&addr_dst,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (char *)iscsiboot_prop->boot_tgt.tgt_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_DEFAULT_TPGT, isid, ISCSI_SESS_TYPE_NORMAL, &oid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (isp == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* create temp booting session failed */
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp->sess_boot = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ISCSI_SUCCESS(iscsi_conn_create((struct sockaddr *)&addr_dst,
fa9e4066f08beec538e775443c5be79dd423fcabahrens isp, &icp))) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens rw_exit(&ihp->hba_sess_list_rwlock);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock /* now online created session */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock if (iscsid_login_tgt(ihp, (char *)iscsiboot_prop->boot_tgt.tgt_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodBoot|iSCSIDiscoveryMethodStatic,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (struct sockaddr *)&addr_dst) == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock return (isp);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsid_thread_boot_wd(iscsi_thread_t *thread, void *p)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int rc = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_hba_t *ihp = (iscsi_hba_t *)p;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t reconfigured = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (rc != 0) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (iscsiboot_prop && (modrootloaded == 1)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ihp->hba_persistent_loaded == B_FALSE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (persistent_load() == B_TRUE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ihp->hba_persistent_loaded = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ihp->hba_persistent_loaded == B_TRUE) &&
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (reconfigured == B_FALSE)) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (iscsi_chk_bootlun_mpxio(ihp) == B_TRUE) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) iscsi_reconfig_boot_sess(ihp);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock iscsid_poke_discovery(ihp,
0917b783fd655a0c943e0b8fb848db2301774947eschrock iSCSIDiscoveryMethodUnknown);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) iscsid_login_tgt(ihp, NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens iSCSIDiscoveryMethodUnknown, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens reconfigured = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens rc = iscsi_thread_wait(thread, SEC_TO_TICK(1));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsi_cmp_boot_tgt_name(char *name)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && (strncmp((const char *)name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (const char *)iscsiboot_prop->boot_tgt.tgt_name,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ISCSI_MAX_NAME_LEN) == 0)) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (B_TRUE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensiscsi_cmp_boot_ini_name(char *name)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (iscsiboot_prop && (strncmp((const char *)name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (const char *)iscsiboot_prop->boot_init.ini_name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ISCSI_MAX_NAME_LEN) == 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensboolean_t
afefbcddfd8caf5f3b2da510d9439471ab225040eschrockiscsi_chk_bootlun_mpxio(iscsi_hba_t *ihp)
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock{
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock iscsi_sess_t *isp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iscsi_lun_t *ilp;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock isp = ihp->hba_sess_list;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock boolean_t tgt_mpxio_enabled = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t bootlun_found = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint16_t lun_num;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (iscsiboot_prop == NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (!ihp->hba_mpxio_enabled) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock lun_num = *((uint64_t *)(iscsiboot_prop->boot_tgt.tgt_boot_lun));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock while (isp != NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if ((strncmp((char *)isp->sess_name,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (const char *)iscsiboot_prop->boot_tgt.tgt_name,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ISCSI_MAX_NAME_LEN) == 0) &&
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (isp->sess_boot == B_TRUE)) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * found boot session.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * check its mdi path info is null or not
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ilp = isp->sess_lun_list;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock while (ilp != NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (lun_num == ilp->lun_num) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (ilp->lun_pip) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock tgt_mpxio_enabled = B_TRUE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock bootlun_found = B_TRUE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ilp = ilp->lun_next;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock isp = isp->sess_next;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (bootlun_found) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (tgt_mpxio_enabled);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock } else {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * iscsiboot_prop not NULL while no boot lun found
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * in most cases this is none iscsi boot while iscsiboot_prop
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * is not NULL, in this scenario return iscsi HBA's mpxio config
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (ihp->hba_mpxio_enabled);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock