a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER START
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The contents of this file are subject to the terms of the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Common Development and Distribution License (the "License").
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You may not use this file except in compliance with the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * or http://www.opensolaris.org/os/licensing.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * See the License for the specific language governing permissions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and limitations under the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * When distributing Covered Code, include this CDDL HEADER in each
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If applicable, add the following below this CDDL HEADER, with the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER END
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni#include <mdb/mdb_modapi.h>
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni#include <mdb/mdb_ks.h>
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/cpuvar.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/conf.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/file.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/types.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/taskq.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/sysmacros.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/socket.h> /* networking stuff */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/strsubr.h> /* networking stuff */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/nvpair.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/sunldi.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/stmf.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/stmf_ioctl.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/portif.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define IDM_CONN_SM_STRINGS
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap#define IDM_TASK_SM_STRINGS
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSIT_TGT_SM_STRINGS
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSIT_SESS_SM_STRINGS
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSIT_LOGIN_SM_STRINGS
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap#define ISCSI_SESS_SM_STRINGS
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap#define ISCSI_CMD_SM_STRINGS
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap#define ISCSI_ICS_NAMES
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap#define ISCSI_LOGIN_STATE_NAMES
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States#define IDM_CN_NOTIFY_STRINGS
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/idm/idm.h>
aff4bce51ecc47df7e5a6351b7cee6bc20408c63yi zhang - Sun Microsystems - Beijing China#include <iscsi.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <iscsit.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <iscsit_isns.h>
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill#include <sys/ib/clients/iser/iser.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We want to be able to print multiple levels of object hierarchy with a
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * single dcmd information, and preferably also exclude intermediate
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * levels if desired. For example some of the target objects have the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * following relationship:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * target --> session --> connection --> task
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The session dcmd should allow the printing of all associated tasks for the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * sessions without printing all the associated connections. To accomplish
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * this the following structure contains a bit for each object type. Dcmds
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * should invoke the functions for child objects if any bits are set
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * in iscsi_dcmd_ctrl_t but the functions for the child object should only
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * print data if their associated bit is set. Each object type should print
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * a header for its first occurrence or if it is being printed as a child
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * object for the first occurrence under each parent. For the model to follow
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * see how idc->idc_header is handled in iscsi_sess_impl.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Each dcmd should provide an external interface with the standard MDB API
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and an internal interface that accepts iscsi_dcmd_ctrl_t. To display
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * child objects the dcmd calls the internal interface for the child object
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * directly. Dcmds invoked from the command line will, of course, call the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * external interface. See iscsi_conn() and iscsi_conn_impl().
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptypedef struct {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap union {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t idc_children;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t idc_tgt:1,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc_tpg:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_tpgt:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_portal:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_sess:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_conn:1,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc_svc:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_print_ip:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_task:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_buffer:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_states:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_rc_audit:1,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc_lun:1,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc_hba:1,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc_cmd:1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } child;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } u;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t idc_ini;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t idc_tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t idc_verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t idc_header;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Our connection dcmd code works off the global connection lists
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * in IDM since we want to know about connections even when they
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * have not progressed to the point that they have an associated
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * session. If we use "::iscsi_sess [-c]" then we only want to
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * see connections associated with particular session. To avoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * writing a separate set of code to print session-specific connection
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the session code should set the sessions kernel address in the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * following field. The connection code will then only print
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * connections that match.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t idc_assoc_session;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap} iscsi_dcmd_ctrl_t;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilltypedef struct idm_hba_walk_info {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void **array;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int n_elements;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int cur_element;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *data;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill} idm_hba_walk_info_t;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_walk_all_sess(iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_walk_all_conn(iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_tgt_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_tpgt_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_tpg_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_portal_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_sess_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_conn_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_buffer_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_svc_walk_cb(uintptr_t addr, const void *list_walker_data,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_hba_walk_cb(uintptr_t addr, const void *vhba,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_sess_walk_cb(uintptr_t addr, const void *vsess,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_conn_walk_cb(uintptr_t addr, const void *vconn,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_lun_walk_cb(uintptr_t addr, const void *vlun,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_cmd_walk_cb(uintptr_t addr, const void *vcmd,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_tgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_tpgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_tpg_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_portal_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_sess_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_conn_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void iscsi_print_iscsit_conn_data(idm_conn_t *ict);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic void iscsi_print_ini_conn_data(idm_conn_t *ict);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void iscsi_print_idm_conn_data(idm_conn_t *ict);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_task_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void iscsi_print_iscsit_task_data(idm_task_t *idt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_buffer_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_conn_type_t idm_conn_type(uintptr_t addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_i_task_impl(idm_task_t *idt, uintptr_t addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_refcnt_impl(uintptr_t addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_sm_audit_impl(uintptr_t addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_isns(uintptr_t addr, uint_t flags, int argc,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const mdb_arg_t *argv);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_svc_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_hba_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_print_ini_sess(uintptr_t addr, iscsi_sess_t *sess,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_print_ini_lun(uintptr_t addr, const iscsi_lun_t *lun,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_print_ini_cmd(uintptr_t addr, const iscsi_cmd_t *cmd,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_sess_walk_init(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_sess_step(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_conn_walk_init(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_conn_step(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_lun_walk_init(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_lun_step(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_cmd_walk_init(mdb_walk_state_t *wsp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int iscsi_ini_cmd_step(mdb_walk_state_t *wsp);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_idm_conn_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsit_tgt_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsit_sess_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsit_login_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsi_cmd_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsi_sess_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_idm_conn_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_idm_task_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsit_tgt_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsit_sess_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsit_login_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsi_cmd_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsi_sess_state(unsigned int state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsi_conn_state(unsigned int state);
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United Statesstatic const char *iscsi_iscsi_conn_event(unsigned int event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *iscsi_iscsi_login_state(unsigned int state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void iscsi_format_timestamp(char *ts_str, int strlen,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap timespec_t *ts);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic char *iscsi_inet_ntop(int af, const void *addr, char *buf, int addrlen);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void convert2ascii(char *, const in6_addr_t *);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int sa_to_str(struct sockaddr_storage *sa, char *addr);
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlapstatic int iscsi_isns_esi_cb(uintptr_t addr, const void *walker_data,
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap void *data);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int iscsi_isns_portal_cb(uintptr_t addr, const void *walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *data);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define PORTAL_STR_LEN (INET6_ADDRSTRLEN + 7)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ::iscsi_tgt [-scatgpbSRv]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsi_tgt - Print out information associated with an iscsit target instance
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * s Print associated session information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * c Print associated connection information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * a Print IP addresses with connection information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * t Print associated task information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * g Print associated TPG information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * p Print portals with TPG information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * b Print associated buffer information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * S Print recent state events and transitions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * R Print reference count audit data
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * v Verbose output about the connection
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tgt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t idc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int buffer = 0, task = 0, print_ip = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int tpgt = 0, conn = 0, sess = 0, portal = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int states = 0, rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t iscsit_global_addr, avl_addr, list_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(&idc, sizeof (idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_getopts(argc, argv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'a', MDB_OPT_SETBITS, TRUE, &print_ip,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'g', MDB_OPT_SETBITS, TRUE, &tpgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 's', MDB_OPT_SETBITS, TRUE, &sess,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'c', MDB_OPT_SETBITS, TRUE, &conn,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 't', MDB_OPT_SETBITS, TRUE, &task,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'p', MDB_OPT_SETBITS, TRUE, &portal,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) != argc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_USAGE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_tgt = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_print_ip = print_ip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_tpgt = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_portal = portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_sess = sess;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_conn = conn;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_task = task;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_buffer = buffer;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (DCMD_HDRSPEC(flags))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If no address was specified on the command line, we
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * print out all tgtions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'iscsit_global'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_target_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_tgt_walk_cb, &idc, avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("avl walk failed for global target tree");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_deleted_target_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_tgt_walk_cb,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &idc, list_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for deleted target list");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_tgt_impl(addr, &idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tpg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t idc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t iscsit_global_addr, avl_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(&idc, sizeof (idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_getopts(argc, argv,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) != argc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_USAGE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Always print tpgs and portals */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_tpg = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_portal = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (DCMD_HDRSPEC(flags))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If no address was specified on the command line, we
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * print out all tgtions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'iscsit_global'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_tpg_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_tpg_walk_cb, &idc, avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("avl walk failed for global target tree");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_tpg_impl(addr, &idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * ::iscsi_tpgt [-pR]
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Print tpgt information.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * R Print reference count audit data
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * p Print portal data
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_tpgt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t idc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t iscsit_global_addr, avl_addr, list_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill GElf_Sym sym;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0, portal = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill bzero(&idc, sizeof (idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_getopts(argc, argv,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'p', MDB_OPT_SETBITS, TRUE, &portal,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill NULL) != argc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_USAGE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_tpgt = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_portal = portal;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_rc_audit = rc_audit;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (DCMD_HDRSPEC(flags))
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If no address was specified on the command line,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * print out all tpgts
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!(flags & DCMD_ADDRSPEC)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to find symbol 'iscsit_global'");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsit_global_addr = (uintptr_t)sym.st_value;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill avl_addr = iscsit_global_addr +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsit_global_t, global_target_list);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("avl", iscsi_tgt_walk_cb, &idc, avl_addr) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("avl walk failed for global target tree");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill list_addr = iscsit_global_addr +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsit_global_t, global_deleted_target_list);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("list", iscsi_tgt_walk_cb,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill &idc, list_addr) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for deleted target list");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_tpgt_impl(addr, &idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * ::iscsi_sess [-ablmtvcSRIT]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsi_sess - Print out information associated with an iSCSI session
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * I Print only initiator sessions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * T Print only target sessions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * c Print associated connection information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * a Print IP addresses with connection information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * t Print associated task information
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * l Print associated lun information (with -I)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * m Print associated initiator command information (with -I)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * b Print associated buffer information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * S Print recent state events and transitions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * R Print reference count audit data
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * v Verbose output about the connection
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_sess(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t idc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int buffer = 0, task = 0, conn = 0, print_ip = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int states = 0, rc_audit = 0, commands = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int luns = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(&idc, sizeof (idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_getopts(argc, argv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'I', MDB_OPT_SETBITS, TRUE, &idc.idc_ini,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'T', MDB_OPT_SETBITS, TRUE, &idc.idc_tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'a', MDB_OPT_SETBITS, TRUE, &print_ip,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'c', MDB_OPT_SETBITS, TRUE, &conn,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 't', MDB_OPT_SETBITS, TRUE, &task,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'l', MDB_OPT_SETBITS, TRUE, &luns,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'm', MDB_OPT_SETBITS, TRUE, &commands,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) != argc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_USAGE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_sess = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_print_ip = print_ip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_conn = conn;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_task = task;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_cmd = commands;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_lun = luns;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_buffer = buffer;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (DCMD_HDRSPEC(flags))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If no address was specified on the command line, we
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * print out all sessions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_walk_all_sess(&idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_sess_impl(addr, &idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * ::iscsi_conn [-abmtvSRIT]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsi_conn - Print out information associated with an iSCSI connection
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * I Print only initiator connections
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * T Print only target connections
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * a Print IP addresses with connection information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * t Print associated task information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * b Print associated buffer information
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * m Print associated initiator commands (with -I)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * S Print recent state events and transitions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * R Print reference count audit data
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * v Verbose output about the connection
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_conn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t idc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int buffer = 0, task = 0, print_ip = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int states = 0, rc_audit = 0, commands = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(&idc, sizeof (idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_getopts(argc, argv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'I', MDB_OPT_SETBITS, TRUE, &idc.idc_ini,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'T', MDB_OPT_SETBITS, TRUE, &idc.idc_tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'a', MDB_OPT_SETBITS, TRUE, &print_ip,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 't', MDB_OPT_SETBITS, TRUE, &task,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'm', MDB_OPT_SETBITS, TRUE, &commands,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) != argc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_USAGE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_conn = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_print_ip = print_ip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_task = task;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_buffer = buffer;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_cmd = commands;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (DCMD_HDRSPEC(flags))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If no address was specified on the command line, we
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * print out all connections
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_walk_all_conn(&idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_conn_impl(addr, &idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * ::iscsi_svc [-vR]
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * iscsi_svc - Print out information associated with an iSCSI svc
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * R Print reference count audit data
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * v Verbose output about the service
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_svc(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t idc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill GElf_Sym sym;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t idm_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t svc_list_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill bzero(&idc, sizeof (iscsi_dcmd_ctrl_t));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_getopts(argc, argv,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill NULL) != argc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_USAGE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_svc = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_rc_audit = rc_audit;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (DCMD_HDRSPEC(flags)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!(flags & DCMD_ADDRSPEC)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_lookup_by_name("idm", &sym) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to find symbol 'idm'");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idm_addr = (uintptr_t)sym.st_value;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc_list_addr = idm_addr + offsetof(idm_global_t,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idm_tgt_svc_list);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("list", iscsi_svc_walk_cb, &idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc_list_addr) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for idm services");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_svc_impl(addr, &idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * ::iscsi_portal -R
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * iscsi_portal - Print out information associated with an iSCSI portal
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * R Print reference count audit data
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_portal(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t idc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill GElf_Sym sym;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsit_global_t iscsit_global;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t iscsit_global_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t tpg_avl_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill bzero(&idc, sizeof (iscsi_dcmd_ctrl_t));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_getopts(argc, argv,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill NULL) != argc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_USAGE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_rc_audit = rc_audit;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_portal = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (DCMD_HDRSPEC(flags)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!(flags & DCMD_ADDRSPEC)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to find symbol 'iscsit_global'");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsit_global_addr = (uintptr_t)sym.st_value;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* get and print the global default tpg */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&iscsit_global, sizeof (iscsit_global_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsit_global_addr) != sizeof (iscsit_global_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read iscsit_global_t");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_tpg_impl((uintptr_t)iscsit_global.global_default_tpg,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill &idc) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Walk the tpgs for the rest of the portals */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill tpg_avl_addr = iscsit_global_addr + offsetof(iscsit_global_t,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill global_tpg_list);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("avl", iscsi_tpg_walk_cb, &idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill tpg_avl_addr) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for global tpg tree");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_portal_impl(addr, &idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * ::iscsi_cmd -S
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * iscsi_cmd - Print out information associated with an iSCSI cmd
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill *
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * S Print state audit data
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_cmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t idc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_cmd_t cmd;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int states = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill bzero(&idc, sizeof (iscsi_dcmd_ctrl_t));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_getopts(argc, argv,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'S', MDB_OPT_SETBITS, TRUE, &states,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill NULL) != argc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_USAGE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_states = states;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_cmd = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.idc_ini = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (DCMD_HDRSPEC(flags)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!(flags & DCMD_ADDRSPEC)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_hba", iscsi_ini_hba_walk_cb,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill &idc, NULL) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi cmd hba list walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&cmd, sizeof (iscsi_cmd_t), addr) !=
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sizeof (iscsi_cmd_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_print_ini_cmd(addr, &cmd, &idc));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_hba_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_hba_t ih;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&ih, sizeof (ih), addr) != sizeof (ih)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("Invalid HBA\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_hba) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("iscsi_hba %p sessions: \n", addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_sess", iscsi_ini_sess_walk_cb, idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)ih.hba_sess_list) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi_sess_t walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ::iscsi_task [-bv]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsi_task - Print out information associated with an iSCSI task
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * b Print associated buffer information
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * S Print recent state events and transitions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * R Print reference count audit data
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * v Verbose output about the connection
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_task(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t idc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int buffer = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int states = 0, rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(&idc, sizeof (idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_getopts(argc, argv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) != argc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_USAGE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_conn = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_task = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_buffer = buffer;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (DCMD_HDRSPEC(flags))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If no address was specified on the command line, we
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * print out all connections
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_walk_all_conn(&idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_task_impl(addr, &idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ::iscsi_refcnt
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsi_refcnt - Dump an idm_refcnt_t structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_refcnt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_refcnt_impl(addr));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ::iscsi_states
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsi_states - Dump events and state transitions recoreded in an
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * idm_sm_audit_t structure
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_states(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!(flags & DCMD_ADDRSPEC)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (iscsi_sm_audit_impl(addr));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_walk_all_sess(iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t iscsit_global_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t avl_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t list_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap /* Initiator sessions */
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap if (idc->idc_ini) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Always print hba info on this path */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_hba = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_hba", iscsi_ini_hba_walk_cb,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc, NULL) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi cmd hba list walk failed");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return (DCMD_ERR);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap /* Target sessions */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk discovery sessions */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'iscsit_global'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_discovery_sessions);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_sess_walk_cb, idc, avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("avl walk failed for discovery sessions");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk targets printing all session info */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_target_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_tgt_walk_cb, idc, avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("avl walk failed for target/session tree");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk deleting targets printing all session info */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_deleted_target_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_tgt_walk_cb, idc, list_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for deleted target list");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_walk_all_conn(iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t idm_global_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t list_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk initiator connections */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("idm", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'idm'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_global_addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk connection list associated with the initiator */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = idm_global_addr + offsetof(idm_global_t, idm_ini_conn_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_conn_walk_cb, idc, list_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for initiator connections");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk connection list associated with the target */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = idm_global_addr + offsetof(idm_global_t, idm_tgt_conn_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_conn_walk_cb, idc, list_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for target service instances");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tpg_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_tpg_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tgt_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_tgt_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tpgt_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_tpgt_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_portal_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_portal_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_sess_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_sess_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_sess_conn_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_conn_t ict;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * This function is different from iscsi_conn_walk_cb because
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * we get an iscsit_conn_t instead of an idm_conn_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_conn_t, use to get idm_conn_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&ict, sizeof (iscsit_conn_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_conn_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_conn_impl((uintptr_t)ict.ict_ic, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_conn_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_conn_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_buffer_walk_cb(uintptr_t addr, const void *list_walker_data,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap void *idc_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* We don't particularly care about the list walker data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_buffer_impl(addr, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*ARGSUSED*/
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_svc_walk_cb(uintptr_t addr, const void *list_walker_data,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc_void)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc = idc_void;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc = iscsi_svc_impl(addr, idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*ARGSUSED*/
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_hba_walk_cb(uintptr_t addr, const void *vhba,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *idc_void) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc = idc_void;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc = iscsi_ini_hba_impl(addr, idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_sess_walk_cb(uintptr_t addr, const void *vsess, void *idc_void)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (vsess == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc = iscsi_print_ini_sess(addr, (iscsi_sess_t *)vsess,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (iscsi_dcmd_ctrl_t *)idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill/*ARGSUSED*/
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_conn_walk_cb(uintptr_t addr, const void *vconn, void *idc_void)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill const iscsi_conn_t *ict = vconn;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (vconn == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Look up the idm_conn_t in the iscsi_conn_t and call the general
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * connection handler.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc = iscsi_conn_impl((uintptr_t)ict->conn_ic,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (iscsi_dcmd_ctrl_t *)idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_lun_walk_cb(uintptr_t addr, const void *vlun, void *idc_void)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (vlun == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc = iscsi_print_ini_lun(addr, (iscsi_lun_t *)vlun,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (iscsi_dcmd_ctrl_t *)idc_void);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t avl_addr, rc_addr, states_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char tgt_name[MAX_ISCSI_NODENAMELEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int verbose, states, rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_tgt_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&tgt, sizeof (iscsit_tgt_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_tgt_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read target name if available
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((tgt.target_name == NULL) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (mdb_readstr(tgt_name, sizeof (tgt_name),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)tgt.target_name) == -1)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strcpy(tgt_name, "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Brief output
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tgt_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tgt_t.target_stmf_state
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tgt_t.target_sess_list.avl_numnodes (session count)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tgt_t.target_name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap verbose = idc->idc_verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states = idc->u.child.idc_states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_audit = idc->u.child.idc_rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* For now we will ignore the verbose flag */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print target data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%<u>%-19s %-4s %-8s%</u>\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iscsit_tgt_t", "Sess", "State");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%-19p %-4d %-8d\n", addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt.target_sess_list.avl_numnodes,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt.target_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf(" %s\n", tgt_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Indent and disable verbose for any child structures */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_verbose = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print states if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_tgt && states) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states_addr = addr + offsetof(iscsit_tgt_t, target_state_audit);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(target_state_audit):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print refcnt audit data if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_tgt && rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(target_sess_refcnt):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_addr = addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_tgt_t, target_sess_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(target_refcnt):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_addr = addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_tgt_t, target_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Any child objects to walk? */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tpgt || idc->u.child.idc_portal) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tgt) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk TPGT tree */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_tgt_t, target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_tpgt_walk_cb, idc,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("target tpgt list walk failed");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess || idc->u.child.idc_conn ||
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_task || idc->u.child.idc_buffer) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tgt || idc->u.child.idc_tpgt ||
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_portal) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk sess tree */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = addr + offsetof(iscsit_tgt_t, target_sess_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_sess_walk_cb, idc,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("target sess list walk failed");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* If tgts were handled decrease indent and reset header */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_verbose = verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tpgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t tpg;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t avl_addr, tpg_addr, rc_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_tpgt_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&tpgt, sizeof (iscsit_tpgt_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_tpgt_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg_addr = (uintptr_t)tpgt.tpgt_tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_tpg_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&tpg, sizeof (iscsit_tpg_t), tpg_addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_tpg_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_audit = idc->u.child.idc_rc_audit;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Brief output
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpgt_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpg_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpg_t.tpg_name
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpgt_t.tpgt_tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* For now we will ignore the verbose flag */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print target data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%<u>%-?s %-?s %-18s %-6s%</u>\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iscsit_tpgt_t", "iscsit_tpg_t", "Name", "Tag");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%?p %?p %-18s 0x%04x\n", addr, tpgt.tpgt_tpg,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg.tpg_name, tpgt.tpgt_tag);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(tpgt_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = addr + offsetof(iscsit_tpgt_t, tpgt_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_rc_audit = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Assume for now that anyone interested in TPGT wants to see the
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * portals as well. Enable idc_header for the portals.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_addr = tpg_addr + offsetof(iscsit_tpg_t, tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_portal_walk_cb, idc, avl_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("portal list walk failed");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_tpg_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t tpg;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t avl_addr, rc_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_audit = idc->u.child.idc_rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_tpg_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&tpg, sizeof (iscsit_tpg_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_tpg_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Brief output
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpgt_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpg_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpg_t.tpg_name
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_tpgt_t.tpgt_tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Print tpg data */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tpg) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_header) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%<u>%-?s %-18s%</u>\n",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iscsit_tpg_t", "Name");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%?p %-18s\n", addr, tpg.tpg_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(tpg_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = addr + offsetof(iscsit_tpg_t, tpg_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_rc_audit = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_portal) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tpg) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill avl_addr = addr + offsetof(iscsit_tpg_t, tpg_portal_list);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("avl", iscsi_portal_walk_cb, idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill avl_addr) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("portal list walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tpg) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_tpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_portal_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char portal_addr[PORTAL_STR_LEN];
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t rc_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_portal_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&portal, sizeof (iscsit_portal_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_portal_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print portal data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%<u>%-?s %-?s %-30s%</u>\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iscsit_portal_t", "idm_svc_t", "IP:Port");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(&portal.portal_addr, portal_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%?p %?p %s\n", addr, portal.portal_svc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill portal.portal_default ? "(Default)" : portal_addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(portal_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = addr + offsetof(iscsit_portal_t,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill portal_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_sess_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_sess_t ist;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_sess_t ini_sess;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t list_addr, states_addr, rc_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char ini_name[80];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char tgt_name[80];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int verbose, states, rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_ini) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if ((mdb_vread(&ini_sess, sizeof (iscsi_sess_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)addr)) != sizeof (iscsi_sess_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("Failed to read initiator session\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_print_ini_sess(addr, &ini_sess, idc) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read iscsit_sess_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&ist, sizeof (iscsit_sess_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_sess_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Brief output
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_sess_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_sess_t.ist_state/iscsit_sess_t.ist_ffp_conn_count
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_sess_t.ist_tsih
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * iscsit_sess_t.ist_initiator_name
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap verbose = idc->idc_verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states = idc->u.child.idc_states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_audit = idc->u.child.idc_rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_sess) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (verbose) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read initiator name if available
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ist.ist_initiator_name == NULL) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (mdb_readstr(ini_name, sizeof (ini_name),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)ist.ist_initiator_name) == -1)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strcpy(ini_name, "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read target name if available
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ist.ist_target_name == NULL) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (mdb_readstr(tgt_name, sizeof (tgt_name),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)ist.ist_target_name) == -1)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strcpy(tgt_name, "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Session %p\n", addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %d\n", "State",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %d\n", "Last State",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_last_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %d\n", "FFP Connections",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_ffp_conn_count);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %02x%02x%02x%02x%02x%02x\n", "ISID",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_isid[0], ist.ist_isid[1], ist.ist_isid[2],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_isid[3], ist.ist_isid[4], ist.ist_isid[5]);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: 0x%04x\n", "TSIH",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_tsih);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %s\n", "Initiator IQN",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %s\n", "Target IQN",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %08x\n", "ExpCmdSN",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_expcmdsn);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%16s: %08x\n", "MaxCmdSN",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_maxcmdsn);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_verbose = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print session data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%<u>%-?s %10s %-12s %-6s%</u>\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iscsit_sess_t", "State/Conn", "ISID",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "TSIH");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%?p %4d/%-4d %02x%02x%02x%02x%02x%02x "
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "0x%04x\n", addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_state, ist.ist_ffp_conn_count,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_isid[0], ist.ist_isid[1], ist.ist_isid[2],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_isid[3], ist.ist_isid[4], ist.ist_isid[5],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist.ist_tsih);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Indent for any child structures
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print states if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess && states) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states_addr = addr + offsetof(iscsit_sess_t, ist_state_audit);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(ist_state_audit):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Don't print state history for child objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print refcnt audit data if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess && rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(ist_refcnt):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_addr = addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_sess_t, ist_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Don't print audit data for child objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Any child objects to walk? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_conn || idc->u.child.idc_task ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_buffer) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If a session has been printed enable headers for
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * any child structs.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk conn list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = addr + offsetof(iscsit_sess_t, ist_conn_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_sess_conn_walk_cb, idc,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("session conn list walk failed");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* If a session was handled decrease indent and reset header. */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_verbose = verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_print_ini_sess(uintptr_t addr, iscsi_sess_t *sess,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int verbose, states;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t states_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill verbose = idc->idc_verbose;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill states = idc->u.child.idc_states;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!idc->idc_verbose) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_header) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%<u>%-?s %-4s %-8s%</u>\n",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iscsi_sess_t", "Type", "State");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%-19p %-4d %-8d\n", addr,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_type, sess->sess_state);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill } else {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Session %p\n", addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %d\n", "State",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_state);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %d\n", "Last State",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_prev_state);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %s\n", "Session Name",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_name);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %s\n", "Alias",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_alias);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %08x\n", "CmdSN",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_cmdsn);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %08x\n", "ExpCmdSN",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_expcmdsn);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %08x\n", "MaxCmdSN",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_maxcmdsn);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %p\n", "Pending Queue Head",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_queue_pending.head);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %p\n", "Completion Queue Head",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_queue_completion.head);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%22s: %p\n", "Connnection List Head",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sess->sess_conn_list);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_verbose = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Indent for any child structures */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_states) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill states_addr = (uintptr_t)addr +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsi_sess_t, sess_state_audit);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(sess_state_audit):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_states = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_lun && sess->sess_lun_list) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_lun", iscsi_ini_lun_walk_cb, idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)sess->sess_lun_list) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi_ini_lun walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* If requested print the cmds in the session queue */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_cmd) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* If any other structs printed enable header */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess || idc->u.child.idc_lun) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (sess->sess_queue_pending.head) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc, (uintptr_t)sess->sess_queue_pending.head)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for iscsi cmds");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (sess->sess_queue_completion.head) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc, (uintptr_t)sess->sess_queue_completion.head)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for iscsi cmds");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* If connections or cmds requested walk the connections */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn || idc->u.child.idc_cmd) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If idc_conn is not set don't enable header or the
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * commands may get extraneous headers.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_pwalk("iscsi_ini_conn", iscsi_ini_conn_walk_cb, idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)sess->sess_conn_list) == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi_ini_conn walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* If sessions were handled decrease indent and reset header */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_sess) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_states = states;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_verbose = verbose;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_conn_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t idm_global_addr, states_addr, rc_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t task_addr, task_ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_task_t idt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_conn_t ic;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsit_conn_t ict;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_conn_t ini_conn;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *conn_type;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int task_idx;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char laddr[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char raddr[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int verbose, states, rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Get pointer to task table
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("idm", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'idm'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_global_addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&task_ptr, sizeof (uintptr_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_global_addr + offsetof(idm_global_t, idm_taskid_table)) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (uintptr_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("Failed to read address of task table");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read idm_conn_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&ic, sizeof (idm_conn_t), addr) != sizeof (idm_conn_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If filter bits are set to only print targets or only initiators
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * skip entries of the other type.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!(idc->idc_ini && idc->idc_tgt) &&
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ((idc->idc_ini && (ic.ic_conn_type != CONN_TYPE_INI)) ||
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (idc->idc_tgt && (ic.ic_conn_type != CONN_TYPE_TGT)))) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap conn_type = (ic.ic_conn_type == CONN_TYPE_INI) ? "Ini" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ic.ic_conn_type == CONN_TYPE_TGT) ? "Tgt" : "Unk";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Brief output
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * idm_conn_t pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * idm_conn_t.ic_conn_type
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * idm_conn_t.ic_statet+idm_conn_t.ic_ffp
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap verbose = idc->idc_verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states = idc->u.child.idc_states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_audit = idc->u.child.idc_rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If targets(-T) and/or initiators (-I) are specifically requested,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * fetch the iscsit_conn_t and/or iscsi_conn_t struct as a sanity
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * check and for use below.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_tgt && IDM_CONN_ISTGT(&ic)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&ict, sizeof (iscsit_conn_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)ic.ic_handle) !=
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sizeof (iscsit_conn_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Failed to read target connection "
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "handle data\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_ini && IDM_CONN_ISINI(&ic)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&ini_conn, sizeof (iscsi_conn_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)ic.ic_handle) !=
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sizeof (iscsi_conn_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Failed to read initiator "
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "connection handle data\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_conn) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_verbose) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("IDM Conn %p\n", addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ic.ic_conn_type == CONN_TYPE_TGT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_print_iscsit_conn_data(&ic);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_print_ini_conn_data(&ic);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_verbose = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print connection data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%<u>%-?s %-6s %-10s %12s%</u>\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "idm_conn_t", "Type", "Transport",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "State/FFP");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%?p %-6s %-10s %6d/%-6d\n", addr, conn_type,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ic.ic_transport_type ==
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap IDM_TRANSPORT_TYPE_ISER) ? "ISER_IB" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ic.ic_transport_type ==
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap IDM_TRANSPORT_TYPE_SOCKETS) ? "SOCKETS" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "N/A",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ic.ic_state, ic.ic_ffp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_print_ip) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(&ic.ic_laddr, laddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(&ic.ic_raddr, raddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf(" L%s R%s\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap laddr, raddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Indent for any child structs */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print states if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn && states) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states_addr = addr + offsetof(idm_conn_t, ic_state_audit);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(ic_state_audit):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If targets are specifically requested show the
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * state audit for the target specific connection struct
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_tgt && IDM_CONN_ISTGT(&ic)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill states_addr = (uintptr_t)ic.ic_handle +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsit_conn_t, ict_login_sm) +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsit_conn_login_t, icl_state_audit);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(icl_state_audit):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If initiators are specifically requested show the
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * state audit for the initiator specific connection struct
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_ini && IDM_CONN_ISINI(&ic)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill states_addr = (uintptr_t)ic.ic_handle +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsi_conn_t, conn_state_audit);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(iscsi_conn_t "
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "conn_state_audit):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Don't print state history for child objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Print refcnt audit data for the connection struct if requested.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn && rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(ic_refcnt):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_addr = addr + offsetof(idm_conn_t, ic_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If targets are specifically requested show the
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Refcounts for the target specific connection struct
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_tgt && IDM_CONN_ISTGT(&ic)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(ict_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = (uintptr_t)ic.ic_handle +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsit_conn_t, ict_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(ict_dispatch_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = (uintptr_t)ic.ic_handle +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iscsit_conn_t, ict_dispatch_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Don't print audit data for child objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap task_idx = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_task || idc->u.child.idc_buffer) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill while (task_idx < IDM_TASKIDS_MAX) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read the next idm_task_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&task_addr, sizeof (uintptr_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap task_ptr) != sizeof (uintptr_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("Failed to read task pointer");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (task_addr == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap task_ptr += sizeof (uintptr_t);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap task_idx++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&idt, sizeof (idm_task_t), task_addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap != sizeof (idm_task_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("Failed to read task pointer");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (((uintptr_t)idt.idt_ic == addr) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (idt.idt_state != TASK_IDLE)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_i_task_impl(&idt, task_addr, idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("Failed to walk connection "
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "task tree");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap task_ptr += sizeof (uintptr_t);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap task_idx++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_ini && IDM_CONN_ISINI(&ic) && idc->u.child.idc_cmd) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn || idc->u.child.idc_task) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (ini_conn.conn_queue_active.head &&
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb, idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)ini_conn.conn_queue_active.head) == -1)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for iscsi cmds");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (ini_conn.conn_queue_idm_aborting.head &&
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb, idc,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)ini_conn.conn_queue_idm_aborting.head) == -1)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed for iscsi cmds");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * If connection information was handled unset header and
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * decrease indent
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_conn) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_verbose = verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_svc_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idm_svc_t svc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iser_svc_t iser_svc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t rc_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&svc, sizeof (idm_svc_t), addr) !=
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sizeof (idm_svc_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_svc) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_verbose) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Service %p\n", addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Port",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc.is_svc_req.sr_port);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Online",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc.is_online);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %p\n", "Socket Service",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc.is_so_svc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %p\n", "iSER Service",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc.is_iser_svc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill } else {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_header) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%<u>%-?s %-8s %-8s%</u>\n",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "idm_svc_t", "Port", "Online");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%?p %-8d %-8d\n", addr,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill svc.is_svc_req.sr_port, svc.is_online);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(is_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = addr + offsetof(idm_svc_t, is_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (svc.is_iser_svc != NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History"
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "(iser_svc is_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Sanity check the iser svc struct */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&iser_svc, sizeof (iser_svc_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)svc.is_iser_svc) !=
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sizeof (iser_svc_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = (uintptr_t)svc.is_iser_svc +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(iser_svc_t, is_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_print_iscsit_conn_data(idm_conn_t *ic)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_conn_t ict;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *csg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *nsg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_print_idm_conn_data(ic);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&ict, sizeof (iscsit_conn_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)ic->ic_handle) != sizeof (iscsit_conn_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("**Failed to read conn private data\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %p\n", "iSCSIT TGT Conn",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ic->ic_handle);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ict.ict_login_sm.icl_login_state != ILS_LOGIN_DONE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ict.ict_login_sm.icl_login_csg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case ISCSI_SECURITY_NEGOTIATION_STAGE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap csg = "Security";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case ISCSI_OP_PARMS_NEGOTIATION_STAGE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap csg = "Operational";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case ISCSI_FULL_FEATURE_PHASE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap csg = "FFP";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap csg = "Unknown";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ict.ict_login_sm.icl_login_nsg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case ISCSI_SECURITY_NEGOTIATION_STAGE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nsg = "Security";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case ISCSI_OP_PARMS_NEGOTIATION_STAGE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nsg = "Operational";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case ISCSI_FULL_FEATURE_PHASE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nsg = "FFP";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nsg = "Unknown";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d\n", "Login State",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_login_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d\n", "Login Last State",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_login_last_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %s\n", "CSG", csg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %s\n", "NSG", nsg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d\n", "Transit",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_login_transit >> 7);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %p\n", "Request nvlist",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_request_nvlist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %p\n", "Response nvlist",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_response_nvlist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %p\n", "Negotiated nvlist",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_negotiated_values);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ict.ict_login_sm.icl_login_state == ILS_LOGIN_ERROR) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%02x\n", "Error Class",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_login_resp_err_class);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%02x\n", "Error Detail",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ict.ict_login_sm.icl_login_resp_err_detail);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%04x\n", "CID", ict.ict_cid);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%08x\n", "StatSN", ict.ict_statsn);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic void
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_print_ini_conn_data(idm_conn_t *ic)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_conn_t ini_conn;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_print_idm_conn_data(ic);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(&ini_conn, sizeof (iscsi_conn_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)ic->ic_handle) != sizeof (iscsi_conn_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Failed to read conn private data\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %p\n", "iSCSI Ini Conn",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ic->ic_handle);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %p\n", "Parent Session",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_sess);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Conn State",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_state);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Last Conn State",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_prev_state);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Login Stage",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_current_stage);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Next Login Stage",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_next_stage);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: 0x%08x\n", "Expected StatSN",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_expstatsn);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %p\n", "Active Queue Head",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_queue_active.head);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%20s: %d\n", "Abort Queue Head",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ini_conn.conn_queue_idm_aborting.head);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_print_idm_conn_data(idm_conn_t *ic)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char laddr[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char raddr[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(&ic->ic_laddr, laddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(&ic->ic_raddr, raddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %s\n", "Conn Type",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((ic->ic_conn_type == CONN_TYPE_TGT) ? "Target" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((ic->ic_conn_type == CONN_TYPE_INI) ? "Initiator" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "Unknown")));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ic->ic_conn_type == CONN_TYPE_TGT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %p\n", "Svc. Binding",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ic->ic_svc_binding);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %s\n", "Transport",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ic->ic_transport_type == IDM_TRANSPORT_TYPE_ISER) ? "ISER_IB" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ic->ic_transport_type == IDM_TRANSPORT_TYPE_SOCKETS) ? "SOCKETS" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %s\n", "Local IP", laddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %s\n", "Remote IP", raddr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d\n", "State",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ic->ic_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d\n", "Last State",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ic->ic_last_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d %s\n", "Refcount",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ic->ic_refcnt.ir_refcnt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ic->ic_refcnt.ir_waiting == REF_NOWAIT) ? "" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((ic->ic_refcnt.ir_waiting == REF_WAIT_SYNC) ? "REF_WAIT_SYNC" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((ic->ic_refcnt.ir_waiting == REF_WAIT_ASYNC) ? "REF_WAIT_ASYNC" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "UNKNOWN")));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_i_task_impl(idm_task_t *idt, uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t list_addr, rc_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_conn_type_t conn_type;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int verbose, states, rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap conn_type = idm_conn_type((uintptr_t)idt->idt_ic);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap verbose = idc->idc_verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states = idc->u.child.idc_states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_audit = idc->u.child.idc_rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_task) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (verbose) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Task %p\n", addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (conn_type == CONN_TYPE_TGT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_print_iscsit_task_data(idt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print task data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf(
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap "%<u>%-?s %-16s %-4s %-8s %-8s%</u>\n",
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap "Tasks:", "State", "Ref",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (conn_type == CONN_TYPE_TGT ? "TTT" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (conn_type == CONN_TYPE_INI ? "ITT" :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "TT")), "Handle");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap mdb_printf("%?p %-16s %04x %08x %08x\n", addr,
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap idm_ts_name[idt->idt_state],
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap idt->idt_refcnt.ir_refcnt,
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap idt->idt_tt, idt->idt_client_handle);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_verbose = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print states if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#if 0
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (states) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap states_addr = addr + offsetof(idm_task_t, idt_state_audit);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(idt_state_audit):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Don't print state history for child objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print refcnt audit data if requested
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (rc_audit) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(idt_refcnt):\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc_addr = addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(idm_task_t, idt_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Don't print audit data for child objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Buffers are leaf objects and always get headers so the
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * user can discern between in and out buffers.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->u.child.idc_buffer) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk in buffer list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("In buffers:\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = addr + offsetof(idm_task_t, idt_inbufv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_buffer_walk_cb, idc, list_addr) ==
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for task in buffers");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Walk out buffer list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Out buffers:\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = addr + offsetof(idm_task_t, idt_outbufv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_buffer_walk_cb, idc, list_addr) ==
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for task out buffers\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_verbose = verbose;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_states = states;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_task_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_task_t idt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read idm_conn_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&idt, sizeof (idm_task_t), addr) != sizeof (idm_task_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_i_task_impl(&idt, addr, idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSI_CDB_INDENT 16
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_print_iscsit_task_data(idm_task_t *idt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_task_t itask;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t good_scsi_task = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task_t scsi_task;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&itask, sizeof (iscsit_task_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)idt->idt_private) != sizeof (iscsit_task_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("**Failed to read idt_private data\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&scsi_task, sizeof (scsi_task_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)itask.it_stmf_task) != sizeof (scsi_task_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap good_scsi_task = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap mdb_printf("%20s: %s(%d)\n", "State",
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap idt->idt_state > TASK_MAX_STATE ?
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap "UNKNOWN" : idm_ts_name[idt->idt_state],
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap idt->idt_state);
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap mdb_printf("%20s: %d/%d\n", "STMF abort/IDM aborted",
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap itask.it_stmf_abort, itask.it_aborted);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %p/%p/%p%s\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iscsit/STMF/LU", idt->idt_private,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap itask.it_stmf_task, good_scsi_task ? scsi_task.task_lu_private : 0,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap good_scsi_task ? "" : "**");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (good_scsi_task) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %08x/%08x\n", "ITT/TTT",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap itask.it_itt, itask.it_ttt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %08x\n", "CmdSN",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap itask.it_cmdsn);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %02x %02x %02x %02x %02x %02x %02x %02x\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "LU number",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_lun_no[0], scsi_task.task_lun_no[1],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_lun_no[2], scsi_task.task_lun_no[3],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_lun_no[4], scsi_task.task_lun_no[5],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_lun_no[6], scsi_task.task_lun_no[7]);
bf604c6405d5cbc4e94e3d0ecc9e6e074ed4ea67Peter Dunlap mdb_printf(" CDB (%d bytes):\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_cdb_length);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_inc_indent(ISCSI_CDB_INDENT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_dumpptr((uintptr_t)scsi_task.task_cdb,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_cdb_length,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MDB_DUMP_RELATIVE | MDB_DUMP_TRIM |
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MDB_DUMP_GROUP(1),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (mdb_dumpptr_cb_t)mdb_vread, NULL)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("** Invalid CDB addr (%p)\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_cdb);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_dec_indent(ISCSI_CDB_INDENT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: %d/%d\n", "STMF cur/max bufs",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_cur_nbufs,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_max_nbufs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%08x/0x%08x/0x%08x\n", "Bytes Exp/Cmd/Done",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_expected_xfer_length,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_cmd_xfer_length,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scsi_task.task_nbytes_transferred);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%x/0x%x\n", "TX-ini start/done",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idt->idt_tx_to_ini_start,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idt->idt_tx_to_ini_done);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%20s: 0x%x/0x%x\n", "RX-ini start/done",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idt->idt_rx_from_ini_start,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idt->idt_rx_from_ini_done);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_print_ini_lun(uintptr_t addr, const iscsi_lun_t *lun,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill{
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_lun) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_header) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%<u>%-?s %-5s %-10s%</u>\n",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iscsi_lun_t", "State", "Lun Number");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%?p %-5d %-10d\n", addr,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill lun->lun_state, lun->lun_num);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_print_ini_cmd(uintptr_t addr, const iscsi_cmd_t *cmd,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t states_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->idc_header) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%<u>%-?s %-?s %4s %6s/%-6s %-?s%</u>\n",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iscsi_cmd_t", "idm_task_t", "Type",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "State", "Prev", "iscsi_lun_t");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("%?p %?p %4d %6d/%-6d %?p\n",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill addr, cmd->cmd_itp, cmd->cmd_type, cmd->cmd_state,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill cmd->cmd_prev_state, cmd->cmd_lun);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Print states if requested
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_states) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill states_addr = addr + offsetof(iscsi_cmd_t, cmd_state_audit);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_inc_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("State History(cmd_state_audit):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_states = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (void) mdb_dec_indent(4);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (DCMD_OK);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_buffer_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_buf_t idb;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Read idm_buf_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&idb, sizeof (idm_buf_t), addr) != sizeof (idm_buf_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idc->idc_header) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%<u>%-?s %?s/%-8s %8s %8s %8s%</u>\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "idm_buf_t", "Mem Rgn", "Length",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "Rel Off", "Xfer Len", "Exp. Off");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->idc_header = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Print buffer data */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%?p %?p/%08x %8x %8x %08x\n", addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idb.idb_buf, idb.idb_buflen,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idb.idb_bufoffset, idb.idb_xfer_len,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idb.idb_exp_offset);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Buffers are leaf objects */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_refcnt_impl(uintptr_t addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_t refcnt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap refcnt_audit_buf_t *anb;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ctr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print refcnt info
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&refcnt, sizeof (idm_refcnt_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (idm_refcnt_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("read refcnt failed");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anb = &refcnt.ir_audit_buf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctr = anb->anb_max_index + 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anb->anb_index--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anb->anb_index &= anb->anb_max_index;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ctr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap refcnt_audit_record_t *anr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anr = anb->anb_records + anb->anb_index;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (anr->anr_depth) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char c[MDB_SYM_NAMLEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("\nRefCnt: %u\t", anr->anr_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (i = 0; i < anr->anr_depth; i++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_addr(anr->anr_stack[i],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MDB_SYM_FUZZY, c, sizeof (c),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%s+0x%1x", c,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anr->anr_stack[i] -
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)sym.st_value);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ++i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (i < anr->anr_depth) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_addr(anr->anr_stack[i],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MDB_SYM_FUZZY, c, sizeof (c),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ++i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("\n\t\t%s+0x%1x", c,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anr->anr_stack[i] -
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (uintptr_t)sym.st_value);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ++i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anb->anb_index--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap anb->anb_index &= anb->anb_max_index;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctr--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_sm_audit_impl(uintptr_t addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sm_audit_buf_t audit_buf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ctr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const char *event_name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const char *state_name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const char *new_state_name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char ts_string[40];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Print refcnt info
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&audit_buf, sizeof (sm_audit_buf_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (sm_audit_buf_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read audit buf");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctr = audit_buf.sab_max_index + 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap audit_buf.sab_index++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap audit_buf.sab_index &= audit_buf.sab_max_index;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ctr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sm_audit_record_t *sar;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sar = audit_buf.sab_records + audit_buf.sab_index;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_format_timestamp(ts_string, 40, &sar->sar_timestamp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (sar->sar_type) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAR_STATE_EVENT:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (sar->sar_sm_type) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_IDM_CONN:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_idm_conn_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap event_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_idm_conn_event(sar->sar_event);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_ISCSIT_TGT:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_tgt_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap event_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_tgt_event(sar->sar_event);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_ISCSIT_SESS:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_sess_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap event_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_sess_event(sar->sar_event);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_ISCSIT_LOGIN:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_login_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap event_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_login_event(sar->sar_event);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap case SAS_ISCSI_CMD:
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap state_name =
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_cmd_state(sar->sar_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap event_name=
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_cmd_event(sar->sar_event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap break;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap case SAS_ISCSI_SESS:
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap state_name =
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_sess_state(sar->sar_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap event_name=
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_sess_event(sar->sar_event);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap break;
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States case SAS_ISCSI_CONN:
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States state_name =
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States iscsi_iscsi_conn_state(sar->sar_state);
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States event_name=
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States iscsi_iscsi_conn_event(sar->sar_event);
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name = event_name = "N/A";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%s|%s (%d)\n\t%9s %s (%d) %p\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ts_string, state_name, sar->sar_state,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "Event", event_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sar->sar_event, sar->sar_event_info);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAR_STATE_CHANGE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (sar->sar_sm_type) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_IDM_CONN:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_idm_conn_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_idm_conn_state(sar->sar_new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_IDM_TASK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_idm_task_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_idm_task_state(sar->sar_new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_ISCSIT_TGT:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_tgt_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_tgt_state(sar->sar_new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_ISCSIT_SESS:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_sess_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_sess_state(sar->sar_new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case SAS_ISCSIT_LOGIN:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_login_state(sar->sar_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state_name =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_iscsit_login_state(
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sar->sar_new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap case SAS_ISCSI_CMD:
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap state_name =
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_cmd_state(sar->sar_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap new_state_name=
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_cmd_state(sar->sar_new_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap break;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap case SAS_ISCSI_SESS:
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap state_name =
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_sess_state(sar->sar_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap new_state_name=
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_sess_state(sar->sar_new_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap break;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap case SAS_ISCSI_CONN:
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap state_name =
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_conn_state(sar->sar_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap new_state_name=
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_conn_state(sar->sar_new_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap break;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap case SAS_ISCSI_LOGIN:
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap state_name =
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_login_state(sar->sar_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap new_state_name=
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_iscsi_login_state(sar->sar_new_state);
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("%s|%s (%d)\n\t%9s %s (%d)\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ts_string, state_name, sar->sar_state,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "New State", new_state_name, sar->sar_new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap state_name = new_state_name = "N/A";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap audit_buf.sab_index++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap audit_buf.sab_index &= audit_buf.sab_max_index;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctr--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_OK);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_idm_conn_event(unsigned int event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((event < CE_MAX_EVENT) ? idm_ce_name[event] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsit_tgt_event(unsigned int event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((event < TE_MAX_EVENT) ? iscsit_te_name[event] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsit_sess_event(unsigned int event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((event < SE_MAX_EVENT) ? iscsit_se_name[event] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsit_login_event(unsigned int event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((event < ILE_MAX_EVENT) ? iscsit_ile_name[event] : "N/A");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsi_cmd_event(unsigned int event)
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((event < ISCSI_CMD_EVENT_MAX) ?
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_cmd_event_names[event] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsi_sess_event(unsigned int event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((event < ISCSI_SESS_EVENT_MAX) ?
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_sess_event_names[event] : "N/A");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_idm_conn_state(unsigned int state)
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < CS_MAX_STATE) ? idm_cs_name[state] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United Statesstatic const char *
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United Statesiscsi_iscsi_conn_event(unsigned int event)
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States{
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States return ((event < CN_MAX) ? idm_cn_strings[event] : "N/A");
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States}
5f7d09c6770c7413ed11bfa981c6d50666ca0f4dPeter Cudhea - Sun Microsystems - Burlington, MA United States
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*ARGSUSED*/
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_idm_task_state(unsigned int state)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ("N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsit_tgt_state(unsigned int state)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < TS_MAX_STATE) ? iscsit_ts_name[state] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsit_sess_state(unsigned int state)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < SS_MAX_STATE) ? iscsit_ss_name[state] : "N/A");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsit_login_state(unsigned int state)
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < ILS_MAX_STATE) ? iscsit_ils_name[state] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsi_cmd_state(unsigned int state)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < ISCSI_CMD_STATE_MAX) ?
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_cmd_state_names[state] : "N/A");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsi_sess_state(unsigned int state)
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < ISCSI_SESS_STATE_MAX) ?
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap iscsi_sess_state_names[state] : "N/A");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsi_conn_state(unsigned int state)
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < ISCSI_CONN_STATE_MAX) ? iscsi_ics_name[state] : "N/A");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapstatic const char *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_iscsi_login_state(unsigned int state)
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap{
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap return ((state < LOGIN_MAX) ? iscsi_login_state_names[state] : "N/A");
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Retrieve connection type given a kernel address
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_conn_type_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapidm_conn_type(uintptr_t addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_conn_type_t result = 0; /* Unknown */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t idm_conn_type_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_conn_type_addr = addr + offsetof(idm_conn_t, ic_conn_type);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_vread(&result, sizeof (result), idm_conn_type_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Convert a sockaddr to the string representation, suitable for
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * storing in an nvlist or printing out in a list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapsa_to_str(struct sockaddr_storage *sa, char *buf)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char pbuf[7];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const char *bufp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in *sin;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in6 *sin6;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint16_t port;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!sa || !buf) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap buf[0] = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (sa->ss_family == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin = (struct sockaddr_in *)sa;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap bufp = iscsi_inet_ntop(AF_INET,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (const void *)&(sin->sin_addr.s_addr),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap buf, PORTAL_STR_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (bufp == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_nhconvert(&port, &sin->sin_port, sizeof (uint16_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (sa->ss_family == AF_INET6) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlcat(buf, "[", sizeof (buf));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin6 = (struct sockaddr_in6 *)sa;
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap bufp = iscsi_inet_ntop(AF_INET6,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (const void *)&sin6->sin6_addr.s6_addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &buf[1], PORTAL_STR_LEN - 1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (bufp == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlcat(buf, "]", PORTAL_STR_LEN);
c89a15d415257cb029ed5e5efc36d64a60667972Richard Lowe mdb_nhconvert(&port, &sin6->sin6_port, sizeof (uint16_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_snprintf(pbuf, sizeof (pbuf), ":%u", port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlcat(buf, pbuf, PORTAL_STR_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_format_timestamp(char *ts_str, int strlen, timespec_t *ts)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_snprintf(ts_str, strlen, "%Y:%03d:%03d:%03d", ts->tv_sec,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (ts->tv_nsec / 1000000) % 1000, (ts->tv_nsec / 1000) % 1000,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ts->tv_nsec % 1000);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Help information for the iscsi_isns dcmd
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_help(void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("iscsi_isns:\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_inc_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("-e: Print ESI information\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("-p: Print portal information\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("-s: Print iSNS server information\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("-t: Print target information\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("-v: Add verbosity to the other options' output\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("-R: Add Refcount information to '-t' output\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_esi_cb(uintptr_t addr, const void *walker_data, void *data)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap isns_esi_tinfo_t tinfo;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&tinfo, sizeof (isns_esi_tinfo_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (isns_esi_tinfo_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("ESI thread/thr did : 0x%p / %d\n", tinfo.esi_thread,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tinfo.esi_thread_did);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("ESI sonode : 0x%p\n", tinfo.esi_so);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("ESI port : %d\n", tinfo.esi_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("ESI thread running : %s\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (tinfo.esi_thread_running) ? "Yes" : "No");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_NEXT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_esi(iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap GElf_Sym sym;
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap uintptr_t addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap if (mdb_lookup_by_name("esi", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'esi_list'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap (void) iscsi_isns_esi_cb(addr, NULL, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_portal_cb(uintptr_t addr, const void *walker_data, void *data)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States isns_portal_t portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char portal_addr[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage *ss;
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap char ts_string[40];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (mdb_vread(&portal, sizeof (isns_portal_t), addr) !=
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States sizeof (isns_portal_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ss = &portal.portal_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(ss, portal_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Portal IP address ");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ss->ss_family == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("(v4): %s", portal_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("(v6): %s", portal_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (portal.portal_default == B_TRUE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf(" (Default portal)\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("\n");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (portal.portal_iscsit != NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("(Part of TPG: 0x%p)\n", portal.portal_iscsit);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States }
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States iscsi_format_timestamp(ts_string, 40, &portal.portal_esi_timestamp);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Portal ESI timestamp: %s\n\n", ts_string);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((portal.portal_iscsit != NULL) && (idc->idc_verbose)) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_inc_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_portal_impl((uintptr_t)portal.portal_iscsit, idc);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_NEXT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_portals(iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("All Active Portals:\n");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (mdb_lookup_by_name("isns_all_portals", &sym) == -1) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_warn("failed to find symbol 'isns_all_portals'");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States return (DCMD_ERR);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States }
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States portal_list = (uintptr_t)sym.st_value;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States idc->idc_header = 1;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (mdb_pwalk("avl", iscsi_isns_portal_cb, idc, portal_list) == -1) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_warn("avl walk failed for isns_all_portals");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States return (DCMD_ERR);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States }
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("\nPortals from TPGs:\n");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (mdb_lookup_by_name("isns_tpg_portals", &sym) == -1) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_warn("failed to find symbol 'isns_tpg_portals'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal_list = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (mdb_pwalk("avl", iscsi_isns_portal_cb, idc, portal_list) == -1) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_warn("avl walk failed for isns_tpg_portals");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_targets_cb(uintptr_t addr, const void *walker_data, void *data)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States isns_target_t itarget;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States int rc = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t rc_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&itarget, sizeof (isns_target_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (isns_target_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_audit = idc->u.child.idc_rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Target: %p\n", addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_inc_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Registered: %s\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (itarget.target_registered) ? "Yes" : "No");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Update needed: %s\n",
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States (itarget.target_update_needed) ? "Yes" : "No");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Target Info: %p\n", itarget.target_info);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Prevent target refcounts from showing through this path */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsi_tgt_impl((uintptr_t)itarget.target, idc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc->u.child.idc_rc_audit = rc_audit;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (idc->u.child.idc_rc_audit) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc_addr = (uintptr_t)itarget.target_info +
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill offsetof(isns_target_info_t, ti_refcnt);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_printf("Reference History(isns_target_info ti_refcnt):\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (iscsi_refcnt_impl(rc_addr) != 0) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (rc == DCMD_OK) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_NEXT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_targets(iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t isns_target_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("isns_target_list", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'isns_target_list'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap isns_target_list = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->u.child.idc_tgt = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("avl", iscsi_isns_targets_cb, idc,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap isns_target_list) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("avl walk failed for isns_target_list");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_servers_cb(uintptr_t addr, const void *walker_data, void *data)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_isns_svr_t server;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char server_addr[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage *ss;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap clock_t lbolt;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States uintptr_t avl_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_vread(&server, sizeof (iscsit_isns_svr_t), addr) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_isns_svr_t)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni if ((lbolt = (clock_t)mdb_get_lbolt()) == -1)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (WALK_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("iSNS server %p:\n", addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_inc_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ss = &server.svr_sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_to_str(ss, server_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("IP address ");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ss->ss_family == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("(v4): %s\n", server_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("(v6): %s\n", server_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("ESI Interval: %d seconds\n",
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States server.svr_esi_interval);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Last message: %d seconds ago\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((lbolt - server.svr_last_msg) / 100));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Client registered: %s\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (server.svr_registered) ? "Yes" : "No");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Retry Count: %d\n",
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States server.svr_retry_count);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Targets Changes Pending: %s\n",
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States (server.svr_targets_changed) ? "Yes" : "No");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Delete Pending: %s\n",
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States (server.svr_delete_needed) ? "Yes" : "No");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_printf("Replace-All Needed: %s\n",
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States (server.svr_reset_needed) ? "Yes" : "No");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (idc->idc_verbose) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States idc->idc_header = 1;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States idc->u.child.idc_tgt = 1;
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_inc_indent(2);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States avl_addr = addr + offsetof(iscsit_isns_svr_t,
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States svr_target_list);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States if (mdb_pwalk("avl", iscsi_isns_targets_cb, idc,
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States avl_addr) == -1) {
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_warn("avl walk failed for svr_target_list");
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States return (WALK_ERR);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States }
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States mdb_dec_indent(2);
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States }
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_dec_indent(4);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
bdbe8dc662f9700c12eafcbcceb5c724615278cfPeter Cudhea - Sun Microsystems - Burlington, MA United States return (WALK_NEXT);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns_servers(iscsi_dcmd_ctrl_t *idc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t iscsit_global_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uintptr_t list_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap GElf_Sym sym;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("failed to find symbol 'iscsit_global'");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc->idc_header = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_addr = iscsit_global_addr +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_global_t, global_isns_cfg.isns_svrs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_pwalk("list", iscsi_isns_servers_cb, idc, list_addr) == -1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("list walk failed for iSNS servers");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic int
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsi_isns(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsi_dcmd_ctrl_t idc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int portals = 0, esi = 0, targets = 0, verbose = 0, servers = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc_audit = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (flags & DCMD_ADDRSPEC) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_warn("iscsi_isns is only a global dcmd.");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(&idc, sizeof (idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (mdb_getopts(argc, argv,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'e', MDB_OPT_SETBITS, TRUE, &esi,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'p', MDB_OPT_SETBITS, TRUE, &portals,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 's', MDB_OPT_SETBITS, TRUE, &servers,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 't', MDB_OPT_SETBITS, TRUE, &targets,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &verbose,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) != argc)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_USAGE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((esi + portals + targets + servers) > 1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Only one of e, p, s, and t must be provided");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((esi | portals | targets | servers) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_printf("Exactly one of e, p, s, or t must be provided");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (DCMD_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idc.idc_verbose = verbose;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idc.u.child.idc_rc_audit = rc_audit;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (esi) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_isns_esi(&idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portals) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_isns_portals(&idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (servers) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_isns_servers(&idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (iscsi_isns_targets(&idc));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_sess_walk_init(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("<iscsi_sess_t addr>::walk iscsi_ini_sess");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_data = mdb_alloc(sizeof (iscsi_sess_t), UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!wsp->walk_data) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi_ini_sess walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_NEXT);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_sess_step(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int status;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(wsp->walk_data, sizeof (iscsi_sess_t), wsp->walk_addr)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill != sizeof (iscsi_sess_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read iscsi_sess_t at %p", wsp->walk_addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_cbdata);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_addr =
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)(((iscsi_sess_t *)wsp->walk_data)->sess_next);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (status);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_conn_walk_init(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("<iscsi_conn_t addr>::walk iscsi_ini_conn");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_data = mdb_alloc(sizeof (iscsi_conn_t), UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!wsp->walk_data) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi_ini_conn walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_NEXT);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_conn_step(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int status;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(wsp->walk_data, sizeof (iscsi_conn_t), wsp->walk_addr)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill != sizeof (iscsi_conn_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read iscsi_conn_t at %p", wsp->walk_addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_cbdata);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_addr =
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)(((iscsi_conn_t *)wsp->walk_data)->conn_next);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (status);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_lun_walk_init(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("<iscsi_lun_t addr>::walk iscsi_ini_lun");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_data = mdb_alloc(sizeof (iscsi_lun_t), UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!wsp->walk_data) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_NEXT);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_lun_step(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int status;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(wsp->walk_data, sizeof (iscsi_lun_t), wsp->walk_addr)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill != sizeof (iscsi_lun_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read iscsi_lun_t at %p", wsp->walk_addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_cbdata);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_addr =
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)(((iscsi_lun_t *)wsp->walk_data)->lun_next);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (status);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_cmd_walk_init(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("<iscsi_cmd_t addr>::walk iscsi_ini_cmd");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_data = mdb_alloc(sizeof (iscsi_cmd_t), UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!wsp->walk_data) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_NEXT);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_cmd_step(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int status;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(wsp->walk_data, sizeof (iscsi_cmd_t), wsp->walk_addr)
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill != sizeof (iscsi_cmd_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read iscsi_cmd_t at %p", wsp->walk_addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_cbdata);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_addr =
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)(((iscsi_cmd_t *)wsp->walk_data)->cmd_next);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (status);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_cmd_walk_cb(uintptr_t addr, const void *vcmd,
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill void *vidc) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill const iscsi_cmd_t *cmd = vcmd;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_dcmd_ctrl_t *idc = vidc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int rc;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (cmd == NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed. Null cmd");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill rc = iscsi_print_ini_cmd(addr, cmd, idc);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_hba_walk_init(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill uintptr_t state_addr, array_addr;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int array_size;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill struct i_ddi_soft_state *ss;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idm_hba_walk_info_t *hwi;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi = (idm_hba_walk_info_t *)mdb_zalloc(
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill sizeof (idm_hba_walk_info_t), UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!hwi) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("unable to allocate storage for iscsi_ini_hba walk");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (wsp->walk_addr != NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("iscsi_ini_hba only supports global walk");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill } else {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Read in the array and setup the walk struct.
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_readvar(&state_addr, "iscsi_state") == -1) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("state variable iscsi_state not found.\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("Is the driver loaded ?\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill ss = (struct i_ddi_soft_state *)mdb_alloc(sizeof (*ss),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(ss, sizeof (*ss), state_addr) != sizeof (*ss)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("Cannot read softstate struct "
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "(Invalid pointer?).\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Where to get the data */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill array_size = ss->n_items * (sizeof (void *));
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill array_addr = (uintptr_t)ss->array;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Where to put the data */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi->n_elements = ss->n_items;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi->array = mdb_alloc(array_size, UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (!hwi->array) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("list walk failed");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(hwi->array, array_size, array_addr) !=
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill array_size) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("Corrupted softstate struct.\n");
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_ERR);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi->cur_element = 0;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill wsp->walk_data = hwi;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_NEXT);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic int
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gilliscsi_ini_hba_step(mdb_walk_state_t *wsp) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill int status;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill idm_hba_walk_info_t *hwi = (idm_hba_walk_info_t *)wsp->walk_data;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill for (; hwi->cur_element < hwi->n_elements; hwi->cur_element++) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (hwi->array[hwi->cur_element] != NULL) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill break;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (hwi->cur_element >= hwi->n_elements) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi->data = (iscsi_hba_t *)mdb_alloc(sizeof (iscsi_hba_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill UM_SLEEP|UM_GC);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill if (mdb_vread(hwi->data, sizeof (iscsi_hba_t),
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill (uintptr_t)hwi->array[hwi->cur_element]) != sizeof (iscsi_hba_t)) {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill mdb_warn("failed to read iscsi_sess_t at %p", wsp->walk_addr);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (WALK_DONE);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill status = wsp->walk_callback((uintptr_t)hwi->array[hwi->cur_element],
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi->data, wsp->walk_cbdata);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill /* Increment cur_element for next iteration */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill hwi->cur_element++;
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill return (status);
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill}
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * iscsi_inet_ntop -- Convert an IPv4 or IPv6 address in binary form into
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * printable form, and return a pointer to that string. Caller should
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * provide a buffer of correct length to store string into.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Note: this routine is kernel version of inet_ntop. It has similar
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * format as iscsi_inet_ntop() defined in rfc2553. But it does not do
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * error handling operations exactly as rfc2553 defines. This function
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is used by kernel inet directory routines only for debugging.
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * This iscsi_inet_ntop() function, does not return NULL if third argument
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is NULL. The reason is simple that we don't want kernel to panic
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * as the output of this function is directly fed to ip<n>dbg macro.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Instead it uses a local buffer for destination address for
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * those calls which purposely pass NULL ptr for the destination
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * buffer. This function is thread-safe when the caller passes a non-
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * null buffer with the third argument.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define OK_16PTR(p) (!((uintptr_t)(p) & 0x1))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#if defined(__x86)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define OK_32PTR(p) OK_16PTR(p)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define OK_32PTR(p) (!((uintptr_t)(p) & 0x3))
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapchar *
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlapiscsi_inet_ntop(int af, const void *addr, char *buf, int addrlen)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap static char local_buf[PORTAL_STR_LEN];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap static char *err_buf1 = "<badaddr>";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap static char *err_buf2 = "<badfamily>";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in6_addr_t *v6addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uchar_t *v4addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *caddr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * We don't allow thread unsafe iscsi_inet_ntop calls, they
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * must pass a non-null buffer pointer. For DEBUG mode
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * we use the ASSERT() and for non-debug kernel it will
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * silently allow it for now. Someday we should remove
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the static buffer from this function.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(buf != NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (buf == NULL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap buf = local_buf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap buf[0] = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Let user know politely not to send NULL or unaligned addr */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (addr == NULL || !(OK_32PTR(addr))) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (err_buf1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define UC(b) (((int)b) & 0xff)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (af) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case AF_INET:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(addrlen >= INET_ADDRSTRLEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap v4addr = (uchar_t *)addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "%03d.%03d.%03d.%03d",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap UC(v4addr[0]), UC(v4addr[1]), UC(v4addr[2]), UC(v4addr[3]));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (buf);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case AF_INET6:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(addrlen >= INET6_ADDRSTRLEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap v6addr = (in6_addr_t *)addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (IN6_IS_ADDR_V4MAPPED(v6addr)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap caddr = (char *)addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "::ffff:%d.%d.%d.%d",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap UC(caddr[12]), UC(caddr[13]),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap UC(caddr[14]), UC(caddr[15]));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (IN6_IS_ADDR_V4COMPAT(v6addr)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap caddr = (char *)addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "::%d.%d.%d.%d",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap UC(caddr[12]), UC(caddr[13]), UC(caddr[14]),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap UC(caddr[15]));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (IN6_IS_ADDR_UNSPECIFIED(v6addr)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN, "::");
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap convert2ascii(buf, v6addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (buf);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (err_buf2);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#undef UC
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * v6 formats supported
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * General format xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The short hand notation :: is used for COMPAT addr
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Other forms : fe80::xxxx:xxxx:xxxx:xxxx
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapconvert2ascii(char *buf, const in6_addr_t *addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int hexdigits;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int head_zero = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int tail_zero = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* tempbuf must be big enough to hold ffff:\0 */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char tempbuf[6];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint16_t out_addr_component;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint16_t *addr_component;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap size_t len;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t first = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t med_zero = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap boolean_t end_zero = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_component = (uint16_t *)addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = buf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* First count if trailing zeroes higher in number */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (hexdigits = 0; hexdigits < 8; hexdigits++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*addr_component == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (hexdigits < 4)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap head_zero++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tail_zero++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_component++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_component = (uint16_t *)addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tail_zero > head_zero && (head_zero + tail_zero) != 7)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap end_zero = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (hexdigits = 0; hexdigits < 8; hexdigits++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* if entry is a 0 */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*addr_component == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!first && *(addr_component + 1) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (end_zero && (hexdigits < 4)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = '0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = ':';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * address starts with 0s ..
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * stick in leading ':' of pair
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (hexdigits == 0)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = ':';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* add another */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = ':';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap first = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap med_zero = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (first && med_zero) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (hexdigits == 7)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = ':';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_component++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = '0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ptr++ = ':';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_component++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (med_zero)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap med_zero = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tempbuf[0] = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mdb_nhconvert(&out_addr_component, addr_component,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (uint16_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) mdb_snprintf(tempbuf, 6, "%x:", out_addr_component);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap len = strlen(tempbuf);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bcopy(tempbuf, ptr, len);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr + len;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_component++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *--ptr = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * MDB module linkage information:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We declare a list of structures describing our dcmds, a list of structures
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * describing our walkers and a function named _mdb_init to return a pointer
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * to our module information.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const mdb_dcmd_t dcmds[] = {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_tgt", "[-agscptbSRv]",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iSCSI target information", iscsi_tgt },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_tpgt", "[-R]",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iSCSI target portal group tag information", iscsi_tpgt },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_tpg", "[-R]",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iSCSI target portal group information", iscsi_tpg },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_sess", "[-ablmtvcSRIT]",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iSCSI session information", iscsi_sess },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_conn", "[-abmtvSRIT]",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iSCSI connection information", iscsi_conn },
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap { "iscsi_task", "[-bSRv]",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iSCSI task information", iscsi_task },
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap { "iscsi_refcnt", "",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "print audit informtion for idm_refcnt_t", iscsi_refcnt },
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap { "iscsi_states", "",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "dump events and state transitions recorded in an\t"
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "\t\tidm_sm_audit_t structure", iscsi_states },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_isns", "[-epstvR]",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "print iscsit iSNS information", iscsi_isns, iscsi_isns_help },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_svc", "[-vR]",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iSCSI service information", iscsi_svc },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_portal", "[-R]",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iSCSI portal information", iscsi_portal },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_cmd", "[-S]",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "iSCSI command information (initiator only)", iscsi_cmd },
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap { NULL }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap};
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill * Basic walkers for the initiator linked lists
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gillstatic const mdb_walker_t walkers[] = {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_ini_hba", "global walk of the initiator iscsi_hba_t "
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill "list", iscsi_ini_hba_walk_init, iscsi_ini_hba_step, NULL},
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_ini_sess", "walk list of initiator iscsi_sess_t structures",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_ini_sess_walk_init, iscsi_ini_sess_step, NULL },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_ini_conn", "walk list of initiator iscsi_conn_t structures",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_ini_conn_walk_init, iscsi_ini_conn_step, NULL },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_ini_lun", "walk list of initiator iscsi_lun_t structures",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_ini_lun_walk_init, iscsi_ini_lun_step, NULL },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { "iscsi_ini_cmd", "walk list of initiator iscsi_cmd_t structures",
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill iscsi_ini_cmd_walk_init, iscsi_ini_cmd_step, NULL },
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill { NULL }
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill};
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic const mdb_modinfo_t modinfo = {
5819f75e225cf93d9c11f52e04ee71c2dcd0eca9Peter Gill MDB_API_VERSION, dcmds, walkers
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap};
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapconst mdb_modinfo_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap_mdb_init(void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (&modinfo);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}