1a6d42e7dSPeter Dunlap /* 2a6d42e7dSPeter Dunlap * CDDL HEADER START 3a6d42e7dSPeter Dunlap * 4a6d42e7dSPeter Dunlap * The contents of this file are subject to the terms of the 5a6d42e7dSPeter Dunlap * Common Development and Distribution License (the "License"). 6a6d42e7dSPeter Dunlap * You may not use this file except in compliance with the License. 7a6d42e7dSPeter Dunlap * 8a6d42e7dSPeter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9a6d42e7dSPeter Dunlap * or http://www.opensolaris.org/os/licensing. 10a6d42e7dSPeter Dunlap * See the License for the specific language governing permissions 11a6d42e7dSPeter Dunlap * and limitations under the License. 12a6d42e7dSPeter Dunlap * 13a6d42e7dSPeter Dunlap * When distributing Covered Code, include this CDDL HEADER in each 14a6d42e7dSPeter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15a6d42e7dSPeter Dunlap * If applicable, add the following below this CDDL HEADER, with the 16a6d42e7dSPeter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying 17a6d42e7dSPeter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner] 18a6d42e7dSPeter Dunlap * 19a6d42e7dSPeter Dunlap * CDDL HEADER END 20a6d42e7dSPeter Dunlap */ 21a6d42e7dSPeter Dunlap /* 22*30e7468fSPeter Dunlap * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23a6d42e7dSPeter Dunlap * Use is subject to license terms. 24a6d42e7dSPeter Dunlap */ 25a6d42e7dSPeter Dunlap 26a6d42e7dSPeter Dunlap #include <sys/mdb_modapi.h> 27a6d42e7dSPeter Dunlap #include <sys/cpuvar.h> 28a6d42e7dSPeter Dunlap #include <sys/conf.h> 29a6d42e7dSPeter Dunlap #include <sys/file.h> 30a6d42e7dSPeter Dunlap #include <sys/types.h> 31a6d42e7dSPeter Dunlap #include <sys/taskq.h> 32a6d42e7dSPeter Dunlap #include <sys/sysmacros.h> 33a6d42e7dSPeter Dunlap #include <sys/socket.h> /* networking stuff */ 34a6d42e7dSPeter Dunlap #include <sys/strsubr.h> /* networking stuff */ 35a6d42e7dSPeter Dunlap #include <sys/nvpair.h> 36a6d42e7dSPeter Dunlap #include <sys/sunldi.h> 37a6d42e7dSPeter Dunlap #include <sys/stmf.h> 38a6d42e7dSPeter Dunlap #include <sys/stmf_ioctl.h> 39a6d42e7dSPeter Dunlap #include <sys/portif.h> 40a6d42e7dSPeter Dunlap 41a6d42e7dSPeter Dunlap #define IDM_CONN_SM_STRINGS 42bf604c64SPeter Dunlap #define IDM_TASK_SM_STRINGS 43a6d42e7dSPeter Dunlap #define ISCSIT_TGT_SM_STRINGS 44a6d42e7dSPeter Dunlap #define ISCSIT_SESS_SM_STRINGS 45a6d42e7dSPeter Dunlap #define ISCSIT_LOGIN_SM_STRINGS 46*30e7468fSPeter Dunlap #define ISCSI_SESS_SM_STRINGS 47*30e7468fSPeter Dunlap #define ISCSI_CMD_SM_STRINGS 48*30e7468fSPeter Dunlap #define ISCSI_ICS_NAMES 49*30e7468fSPeter Dunlap #define ISCSI_LOGIN_STATE_NAMES 50a6d42e7dSPeter Dunlap #include <sys/idm/idm.h> 51a6d42e7dSPeter Dunlap #include <iscsit.h> 52a6d42e7dSPeter Dunlap #include <iscsit_isns.h> 53*30e7468fSPeter Dunlap #include <iscsi.h> 54a6d42e7dSPeter Dunlap 55a6d42e7dSPeter Dunlap /* 56a6d42e7dSPeter Dunlap * We want to be able to print multiple levels of object hierarchy with a 57a6d42e7dSPeter Dunlap * single dcmd information, and preferably also exclude intermediate 58a6d42e7dSPeter Dunlap * levels if desired. For example some of the target objects have the 59a6d42e7dSPeter Dunlap * following relationship: 60a6d42e7dSPeter Dunlap * 61a6d42e7dSPeter Dunlap * target --> session --> connection --> task 62a6d42e7dSPeter Dunlap * 63a6d42e7dSPeter Dunlap * The session dcmd should allow the printing of all associated tasks for the 64a6d42e7dSPeter Dunlap * sessions without printing all the associated connections. To accomplish 65a6d42e7dSPeter Dunlap * this the following structure contains a bit for each object type. Dcmds 66a6d42e7dSPeter Dunlap * should invoked the functions for child objects if any bits are set 67a6d42e7dSPeter Dunlap * in iscsi_dcmd_ctrl_t but the functions for the child object should only 68a6d42e7dSPeter Dunlap * print data if their associated bit is set. 69a6d42e7dSPeter Dunlap * 70a6d42e7dSPeter Dunlap * Each dcmd should provide an external interface with the standard MDB API 71a6d42e7dSPeter Dunlap * and an internal interface that accepts iscsi_dcmd_ctrl_t. To display 72a6d42e7dSPeter Dunlap * child objects the dcmd calls the internal interface for the child object 73a6d42e7dSPeter Dunlap * directly. Dcmds invoked from the command line will, of course, call the 74a6d42e7dSPeter Dunlap * external interface. See iscsi_conn() and iscsi_conn_impl(). 75a6d42e7dSPeter Dunlap */ 76a6d42e7dSPeter Dunlap 77a6d42e7dSPeter Dunlap typedef struct { 78a6d42e7dSPeter Dunlap union { 79a6d42e7dSPeter Dunlap uint32_t idc_children; 80a6d42e7dSPeter Dunlap struct { 81a6d42e7dSPeter Dunlap uint32_t idc_tgt:1, 82a6d42e7dSPeter Dunlap idc_tpgt:1, 83a6d42e7dSPeter Dunlap idc_portal:1, 84a6d42e7dSPeter Dunlap idc_sess:1, 85a6d42e7dSPeter Dunlap idc_conn:1, 86a6d42e7dSPeter Dunlap idc_print_ip:1, 87a6d42e7dSPeter Dunlap idc_task:1, 88a6d42e7dSPeter Dunlap idc_buffer:1, 89a6d42e7dSPeter Dunlap idc_states:1, 90a6d42e7dSPeter Dunlap idc_rc_audit:1, 91a6d42e7dSPeter Dunlap idc_lun:1, 92a6d42e7dSPeter Dunlap idc_hba:1; 93a6d42e7dSPeter Dunlap } child; 94a6d42e7dSPeter Dunlap } u; 95a6d42e7dSPeter Dunlap boolean_t idc_ini; 96a6d42e7dSPeter Dunlap boolean_t idc_tgt; 97a6d42e7dSPeter Dunlap boolean_t idc_verbose; 98a6d42e7dSPeter Dunlap boolean_t idc_header; 99a6d42e7dSPeter Dunlap /* 100a6d42e7dSPeter Dunlap * Our connection dcmd code works off the global connection lists 101a6d42e7dSPeter Dunlap * in IDM since we want to know about connections even when they 102a6d42e7dSPeter Dunlap * have not progressed to the point that they have an associated 103a6d42e7dSPeter Dunlap * session. If we use "::iscsi_sess [-c]" then we only want to 104a6d42e7dSPeter Dunlap * see connections associated with particular session. To avoid 105a6d42e7dSPeter Dunlap * writing a separate set of code to print session-specific connection 106a6d42e7dSPeter Dunlap * the session code should set the sessions kernel address in the 107a6d42e7dSPeter Dunlap * following field. The connection code will then only print 108a6d42e7dSPeter Dunlap * connections that match. 109a6d42e7dSPeter Dunlap */ 110a6d42e7dSPeter Dunlap uintptr_t idc_assoc_session; 111a6d42e7dSPeter Dunlap } iscsi_dcmd_ctrl_t; 112a6d42e7dSPeter Dunlap 113a6d42e7dSPeter Dunlap static int iscsi_walk_all_sess(iscsi_dcmd_ctrl_t *idc); 114*30e7468fSPeter Dunlap static int iscsi_walk_ini_sessions(uintptr_t array_addr); 115a6d42e7dSPeter Dunlap static int iscsi_walk_all_conn(iscsi_dcmd_ctrl_t *idc); 116a6d42e7dSPeter Dunlap static int iscsi_tgt_walk_cb(uintptr_t addr, const void *list_walker_data, 117a6d42e7dSPeter Dunlap void *idc_void); 118a6d42e7dSPeter Dunlap static int iscsi_tpgt_walk_cb(uintptr_t addr, const void *list_walker_data, 119a6d42e7dSPeter Dunlap void *idc_void); 120a6d42e7dSPeter Dunlap static int iscsi_tpg_walk_cb(uintptr_t addr, const void *list_walker_data, 121a6d42e7dSPeter Dunlap void *idc_void); 122a6d42e7dSPeter Dunlap static int iscsi_portal_walk_cb(uintptr_t addr, const void *list_walker_data, 123a6d42e7dSPeter Dunlap void *idc_void); 124a6d42e7dSPeter Dunlap static int iscsi_sess_walk_cb(uintptr_t addr, const void *list_walker_data, 125a6d42e7dSPeter Dunlap void *idc_void); 126a6d42e7dSPeter Dunlap static int iscsi_conn_walk_cb(uintptr_t addr, const void *list_walker_data, 127a6d42e7dSPeter Dunlap void *idc_void); 128a6d42e7dSPeter Dunlap static int iscsi_buffer_walk_cb(uintptr_t addr, const void *list_walker_data, 129a6d42e7dSPeter Dunlap void *idc_void); 130a6d42e7dSPeter Dunlap static int iscsi_tgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 131a6d42e7dSPeter Dunlap static int iscsi_tpgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 132a6d42e7dSPeter Dunlap static int iscsi_tpg_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 133a6d42e7dSPeter Dunlap static int iscsi_portal_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 134a6d42e7dSPeter Dunlap static int iscsi_sess_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 135a6d42e7dSPeter Dunlap static int iscsi_conn_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 136a6d42e7dSPeter Dunlap static void iscsi_print_iscsit_conn_data(idm_conn_t *ict); 137a6d42e7dSPeter Dunlap static void iscsi_print_idm_conn_data(idm_conn_t *ict); 138a6d42e7dSPeter Dunlap static int iscsi_task_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 139a6d42e7dSPeter Dunlap static void iscsi_print_iscsit_task_data(idm_task_t *idt); 140a6d42e7dSPeter Dunlap static int iscsi_buffer_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc); 141a6d42e7dSPeter Dunlap static idm_conn_type_t idm_conn_type(uintptr_t addr); 142a6d42e7dSPeter Dunlap static int iscsi_i_task_impl(idm_task_t *idt, uintptr_t addr, 143a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc); 144a6d42e7dSPeter Dunlap static int iscsi_refcnt_impl(uintptr_t addr); 145a6d42e7dSPeter Dunlap static int iscsi_sm_audit_impl(uintptr_t addr); 146a6d42e7dSPeter Dunlap static int iscsi_isns(uintptr_t addr, uint_t flags, int argc, 147a6d42e7dSPeter Dunlap const mdb_arg_t *argv); 148a6d42e7dSPeter Dunlap 149*30e7468fSPeter Dunlap static const char *iscsi_idm_conn_event(unsigned int event); 150*30e7468fSPeter Dunlap static const char *iscsi_iscsit_tgt_event(unsigned int event); 151*30e7468fSPeter Dunlap static const char *iscsi_iscsit_sess_event(unsigned int event); 152*30e7468fSPeter Dunlap static const char *iscsi_iscsit_login_event(unsigned int event); 153*30e7468fSPeter Dunlap static const char *iscsi_iscsi_cmd_event(unsigned int event); 154*30e7468fSPeter Dunlap static const char *iscsi_iscsi_sess_event(unsigned int event); 155*30e7468fSPeter Dunlap static const char *iscsi_idm_conn_state(unsigned int state); 156*30e7468fSPeter Dunlap static const char *iscsi_idm_task_state(unsigned int state); 157*30e7468fSPeter Dunlap static const char *iscsi_iscsit_tgt_state(unsigned int state); 158*30e7468fSPeter Dunlap static const char *iscsi_iscsit_sess_state(unsigned int state); 159*30e7468fSPeter Dunlap static const char *iscsi_iscsit_login_state(unsigned int state); 160*30e7468fSPeter Dunlap static const char *iscsi_iscsi_cmd_state(unsigned int state); 161*30e7468fSPeter Dunlap static const char *iscsi_iscsi_sess_state(unsigned int state); 162*30e7468fSPeter Dunlap static const char *iscsi_iscsi_conn_state(unsigned int state); 163*30e7468fSPeter Dunlap static const char *iscsi_iscsi_login_state(unsigned int state); 164a6d42e7dSPeter Dunlap 165a6d42e7dSPeter Dunlap static void iscsi_format_timestamp(char *ts_str, int strlen, 166a6d42e7dSPeter Dunlap timespec_t *ts); 167*30e7468fSPeter Dunlap static char *iscsi_inet_ntop(int af, const void *addr, char *buf, int addrlen); 168a6d42e7dSPeter Dunlap static void convert2ascii(char *, const in6_addr_t *); 169a6d42e7dSPeter Dunlap static int sa_to_str(struct sockaddr_storage *sa, char *addr); 170a6d42e7dSPeter Dunlap static int iscsi_isns_portal_cb(uintptr_t addr, const void *walker_data, 171a6d42e7dSPeter Dunlap void *data); 172a6d42e7dSPeter Dunlap 173a6d42e7dSPeter Dunlap #define PORTAL_STR_LEN (INET6_ADDRSTRLEN + 7) 174a6d42e7dSPeter Dunlap 175a6d42e7dSPeter Dunlap /* 176a6d42e7dSPeter Dunlap * ::iscsi_tgt [-scatgpbSRv] 177a6d42e7dSPeter Dunlap * 178a6d42e7dSPeter Dunlap * iscsi_tgt - Print out information associated with an iscsit target instance 179a6d42e7dSPeter Dunlap * 180a6d42e7dSPeter Dunlap * s Print associated session information 181a6d42e7dSPeter Dunlap * c Print associated connection information 182a6d42e7dSPeter Dunlap * a Print IP addresses with connection information 183a6d42e7dSPeter Dunlap * t Print associated task information 184a6d42e7dSPeter Dunlap * g Print associated TPG information 185a6d42e7dSPeter Dunlap * p Print portals with TPG information 186a6d42e7dSPeter Dunlap * b Print associated buffer information 187a6d42e7dSPeter Dunlap * S Print recent state events and transitions 188a6d42e7dSPeter Dunlap * R Print reference count audit data 189a6d42e7dSPeter Dunlap * v Verbose output about the connection 190a6d42e7dSPeter Dunlap */ 191a6d42e7dSPeter Dunlap /*ARGSUSED*/ 192a6d42e7dSPeter Dunlap static int 193a6d42e7dSPeter Dunlap iscsi_tgt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 194a6d42e7dSPeter Dunlap { 195a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t idc; 196a6d42e7dSPeter Dunlap int buffer = 0, task = 0, print_ip = 0; 197a6d42e7dSPeter Dunlap int tpgt = 0, conn = 0, sess = 0, portal = 0; 198a6d42e7dSPeter Dunlap int states = 0, rc_audit = 0; 199a6d42e7dSPeter Dunlap uintptr_t iscsit_global_addr, avl_addr, list_addr; 200a6d42e7dSPeter Dunlap GElf_Sym sym; 201a6d42e7dSPeter Dunlap 202a6d42e7dSPeter Dunlap bzero(&idc, sizeof (idc)); 203a6d42e7dSPeter Dunlap if (mdb_getopts(argc, argv, 204a6d42e7dSPeter Dunlap 'a', MDB_OPT_SETBITS, TRUE, &print_ip, 205a6d42e7dSPeter Dunlap 'g', MDB_OPT_SETBITS, TRUE, &tpgt, 206a6d42e7dSPeter Dunlap 's', MDB_OPT_SETBITS, TRUE, &sess, 207a6d42e7dSPeter Dunlap 'c', MDB_OPT_SETBITS, TRUE, &conn, 208a6d42e7dSPeter Dunlap 't', MDB_OPT_SETBITS, TRUE, &task, 209a6d42e7dSPeter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer, 210a6d42e7dSPeter Dunlap 'p', MDB_OPT_SETBITS, TRUE, &portal, 211a6d42e7dSPeter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states, 212a6d42e7dSPeter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit, 213a6d42e7dSPeter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose, 214a6d42e7dSPeter Dunlap NULL) != argc) 215a6d42e7dSPeter Dunlap return (DCMD_USAGE); 216a6d42e7dSPeter Dunlap 217a6d42e7dSPeter Dunlap idc.u.child.idc_tgt = 1; 218a6d42e7dSPeter Dunlap idc.u.child.idc_print_ip = print_ip; 219a6d42e7dSPeter Dunlap idc.u.child.idc_tpgt = tpgt; 220a6d42e7dSPeter Dunlap idc.u.child.idc_portal = portal; 221a6d42e7dSPeter Dunlap idc.u.child.idc_sess = sess; 222a6d42e7dSPeter Dunlap idc.u.child.idc_conn = conn; 223a6d42e7dSPeter Dunlap idc.u.child.idc_task = task; 224a6d42e7dSPeter Dunlap idc.u.child.idc_buffer = buffer; 225a6d42e7dSPeter Dunlap idc.u.child.idc_states = states; 226a6d42e7dSPeter Dunlap idc.u.child.idc_rc_audit = rc_audit; 227a6d42e7dSPeter Dunlap 228a6d42e7dSPeter Dunlap if (DCMD_HDRSPEC(flags)) 229a6d42e7dSPeter Dunlap idc.idc_header = 1; 230a6d42e7dSPeter Dunlap 231a6d42e7dSPeter Dunlap /* 232a6d42e7dSPeter Dunlap * If no address was specified on the command line, we 233a6d42e7dSPeter Dunlap * print out all tgtions 234a6d42e7dSPeter Dunlap */ 235a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 236a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) { 237a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'iscsit_global'"); 238a6d42e7dSPeter Dunlap return (DCMD_ERR); 239a6d42e7dSPeter Dunlap } 240a6d42e7dSPeter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value; 241a6d42e7dSPeter Dunlap avl_addr = iscsit_global_addr + 242a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_target_list); 243a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_tgt_walk_cb, &idc, avl_addr) == -1) { 244a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for global target tree"); 245a6d42e7dSPeter Dunlap return (DCMD_ERR); 246a6d42e7dSPeter Dunlap } 247a6d42e7dSPeter Dunlap list_addr = iscsit_global_addr + 248a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_deleted_target_list); 249a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_tgt_walk_cb, 250a6d42e7dSPeter Dunlap &idc, list_addr) == -1) { 251a6d42e7dSPeter Dunlap mdb_warn("list walk failed for deleted target list"); 252a6d42e7dSPeter Dunlap return (DCMD_ERR); 253a6d42e7dSPeter Dunlap } 254a6d42e7dSPeter Dunlap return (DCMD_OK); 255a6d42e7dSPeter Dunlap } else { 256a6d42e7dSPeter Dunlap return (iscsi_tgt_impl(addr, &idc)); 257a6d42e7dSPeter Dunlap } 258a6d42e7dSPeter Dunlap /*NOTREACHED*/ 259a6d42e7dSPeter Dunlap } 260a6d42e7dSPeter Dunlap 261a6d42e7dSPeter Dunlap static int 262a6d42e7dSPeter Dunlap iscsi_tpg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 263a6d42e7dSPeter Dunlap { 264a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t idc; 265a6d42e7dSPeter Dunlap uintptr_t iscsit_global_addr, avl_addr; 266a6d42e7dSPeter Dunlap GElf_Sym sym; 267a6d42e7dSPeter Dunlap 268a6d42e7dSPeter Dunlap bzero(&idc, sizeof (idc)); 269a6d42e7dSPeter Dunlap if (mdb_getopts(argc, argv, 270a6d42e7dSPeter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose, 271a6d42e7dSPeter Dunlap NULL) != argc) 272a6d42e7dSPeter Dunlap return (DCMD_USAGE); 273a6d42e7dSPeter Dunlap 274a6d42e7dSPeter Dunlap idc.u.child.idc_portal = 1; /* Always print portals */ 275a6d42e7dSPeter Dunlap if (DCMD_HDRSPEC(flags)) 276a6d42e7dSPeter Dunlap idc.idc_header = 1; 277a6d42e7dSPeter Dunlap 278a6d42e7dSPeter Dunlap /* 279a6d42e7dSPeter Dunlap * If no address was specified on the command line, we 280a6d42e7dSPeter Dunlap * print out all tgtions 281a6d42e7dSPeter Dunlap */ 282a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 283a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) { 284a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'iscsit_global'"); 285a6d42e7dSPeter Dunlap return (DCMD_ERR); 286a6d42e7dSPeter Dunlap } 287a6d42e7dSPeter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value; 288a6d42e7dSPeter Dunlap avl_addr = iscsit_global_addr + 289a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_tpg_list); 290a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_tpg_walk_cb, &idc, avl_addr) == -1) { 291a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for global target tree"); 292a6d42e7dSPeter Dunlap return (DCMD_ERR); 293a6d42e7dSPeter Dunlap } 294a6d42e7dSPeter Dunlap return (DCMD_OK); 295a6d42e7dSPeter Dunlap } else { 296a6d42e7dSPeter Dunlap return (iscsi_tpg_impl(addr, &idc)); 297a6d42e7dSPeter Dunlap } 298a6d42e7dSPeter Dunlap /*NOTREACHED*/ 299a6d42e7dSPeter Dunlap } 300a6d42e7dSPeter Dunlap 301a6d42e7dSPeter Dunlap /* 302a6d42e7dSPeter Dunlap * ::iscsi_sess [-bctvIT] 303a6d42e7dSPeter Dunlap * 304a6d42e7dSPeter Dunlap * iscsi_sess - Print out information associated with an iSCSI session 305a6d42e7dSPeter Dunlap * 306a6d42e7dSPeter Dunlap * I Print only initiator sessions 307a6d42e7dSPeter Dunlap * T Print only target sessions 308a6d42e7dSPeter Dunlap * c Print associated connection information 309a6d42e7dSPeter Dunlap * a Print IP addresses with connection information 310a6d42e7dSPeter Dunlap * t Print associated task information 311a6d42e7dSPeter Dunlap * b Print associated buffer information 312a6d42e7dSPeter Dunlap * S Print recent state events and transitions 313a6d42e7dSPeter Dunlap * R Print reference count audit data 314a6d42e7dSPeter Dunlap * v Verbose output about the connection 315a6d42e7dSPeter Dunlap */ 316a6d42e7dSPeter Dunlap /*ARGSUSED*/ 317a6d42e7dSPeter Dunlap static int 318a6d42e7dSPeter Dunlap iscsi_sess(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 319a6d42e7dSPeter Dunlap { 320a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t idc; 321a6d42e7dSPeter Dunlap int buffer = 0, task = 0, conn = 0, print_ip = 0; 322a6d42e7dSPeter Dunlap int states = 0, rc_audit = 0; 323a6d42e7dSPeter Dunlap 324a6d42e7dSPeter Dunlap bzero(&idc, sizeof (idc)); 325a6d42e7dSPeter Dunlap if (mdb_getopts(argc, argv, 326a6d42e7dSPeter Dunlap 'I', MDB_OPT_SETBITS, TRUE, &idc.idc_ini, 327a6d42e7dSPeter Dunlap 'T', MDB_OPT_SETBITS, TRUE, &idc.idc_tgt, 328a6d42e7dSPeter Dunlap 'a', MDB_OPT_SETBITS, TRUE, &print_ip, 329a6d42e7dSPeter Dunlap 'c', MDB_OPT_SETBITS, TRUE, &conn, 330a6d42e7dSPeter Dunlap 't', MDB_OPT_SETBITS, TRUE, &task, 331a6d42e7dSPeter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer, 332a6d42e7dSPeter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states, 333a6d42e7dSPeter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit, 334a6d42e7dSPeter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose, 335a6d42e7dSPeter Dunlap NULL) != argc) 336a6d42e7dSPeter Dunlap return (DCMD_USAGE); 337a6d42e7dSPeter Dunlap 338a6d42e7dSPeter Dunlap idc.u.child.idc_sess = 1; 339a6d42e7dSPeter Dunlap idc.u.child.idc_print_ip = print_ip; 340a6d42e7dSPeter Dunlap idc.u.child.idc_conn = conn; 341a6d42e7dSPeter Dunlap idc.u.child.idc_task = task; 342a6d42e7dSPeter Dunlap idc.u.child.idc_buffer = buffer; 343a6d42e7dSPeter Dunlap idc.u.child.idc_states = states; 344a6d42e7dSPeter Dunlap idc.u.child.idc_rc_audit = rc_audit; 345a6d42e7dSPeter Dunlap if (DCMD_HDRSPEC(flags)) 346a6d42e7dSPeter Dunlap idc.idc_header = 1; 347a6d42e7dSPeter Dunlap 348a6d42e7dSPeter Dunlap /* 349a6d42e7dSPeter Dunlap * If no address was specified on the command line, we 350a6d42e7dSPeter Dunlap * print out all sessions 351a6d42e7dSPeter Dunlap */ 352a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 353a6d42e7dSPeter Dunlap return (iscsi_walk_all_sess(&idc)); 354a6d42e7dSPeter Dunlap } else { 355a6d42e7dSPeter Dunlap return (iscsi_sess_impl(addr, &idc)); 356a6d42e7dSPeter Dunlap } 357a6d42e7dSPeter Dunlap /*NOTREACHED*/ 358a6d42e7dSPeter Dunlap } 359a6d42e7dSPeter Dunlap 360a6d42e7dSPeter Dunlap 361a6d42e7dSPeter Dunlap 362a6d42e7dSPeter Dunlap /* 363a6d42e7dSPeter Dunlap * ::iscsi_conn [-btvIT] 364a6d42e7dSPeter Dunlap * 365a6d42e7dSPeter Dunlap * iscsi_conn - Print out information associated with an iSCSI connection 366a6d42e7dSPeter Dunlap * 367a6d42e7dSPeter Dunlap * I Print only initiator connections 368a6d42e7dSPeter Dunlap * T Print only target connections 369a6d42e7dSPeter Dunlap * a Print IP addresses with connection information 370a6d42e7dSPeter Dunlap * t Print associated task information 371a6d42e7dSPeter Dunlap * b Print associated buffer information 372a6d42e7dSPeter Dunlap * S Print recent state events and transitions 373a6d42e7dSPeter Dunlap * R Print reference count audit data 374a6d42e7dSPeter Dunlap * v Verbose output about the connection 375a6d42e7dSPeter Dunlap */ 376a6d42e7dSPeter Dunlap /*ARGSUSED*/ 377a6d42e7dSPeter Dunlap static int 378a6d42e7dSPeter Dunlap iscsi_conn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 379a6d42e7dSPeter Dunlap { 380a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t idc; 381a6d42e7dSPeter Dunlap int buffer = 0, task = 0, print_ip = 0; 382a6d42e7dSPeter Dunlap int states = 0, rc_audit = 0; 383a6d42e7dSPeter Dunlap 384a6d42e7dSPeter Dunlap bzero(&idc, sizeof (idc)); 385a6d42e7dSPeter Dunlap if (mdb_getopts(argc, argv, 386a6d42e7dSPeter Dunlap 'I', MDB_OPT_SETBITS, TRUE, &idc.idc_ini, 387a6d42e7dSPeter Dunlap 'T', MDB_OPT_SETBITS, TRUE, &idc.idc_tgt, 388a6d42e7dSPeter Dunlap 'a', MDB_OPT_SETBITS, TRUE, &print_ip, 389a6d42e7dSPeter Dunlap 't', MDB_OPT_SETBITS, TRUE, &task, 390a6d42e7dSPeter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer, 391a6d42e7dSPeter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states, 392a6d42e7dSPeter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit, 393a6d42e7dSPeter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose, 394a6d42e7dSPeter Dunlap NULL) != argc) 395a6d42e7dSPeter Dunlap return (DCMD_USAGE); 396a6d42e7dSPeter Dunlap 397a6d42e7dSPeter Dunlap idc.u.child.idc_conn = 1; 398a6d42e7dSPeter Dunlap idc.u.child.idc_print_ip = print_ip; 399a6d42e7dSPeter Dunlap idc.u.child.idc_task = task; 400a6d42e7dSPeter Dunlap idc.u.child.idc_buffer = buffer; 401a6d42e7dSPeter Dunlap idc.u.child.idc_states = states; 402a6d42e7dSPeter Dunlap idc.u.child.idc_rc_audit = rc_audit; 403a6d42e7dSPeter Dunlap if (DCMD_HDRSPEC(flags)) 404a6d42e7dSPeter Dunlap idc.idc_header = 1; 405a6d42e7dSPeter Dunlap 406a6d42e7dSPeter Dunlap /* 407a6d42e7dSPeter Dunlap * If no address was specified on the command line, we 408a6d42e7dSPeter Dunlap * print out all connections 409a6d42e7dSPeter Dunlap */ 410a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 411a6d42e7dSPeter Dunlap return (iscsi_walk_all_conn(&idc)); 412a6d42e7dSPeter Dunlap } else { 413a6d42e7dSPeter Dunlap return (iscsi_conn_impl(addr, &idc)); 414a6d42e7dSPeter Dunlap } 415a6d42e7dSPeter Dunlap /*NOTREACHED*/ 416a6d42e7dSPeter Dunlap } 417a6d42e7dSPeter Dunlap 418a6d42e7dSPeter Dunlap /* 419a6d42e7dSPeter Dunlap * ::iscsi_task [-bv] 420a6d42e7dSPeter Dunlap * 421a6d42e7dSPeter Dunlap * iscsi_task - Print out information associated with an iSCSI task 422a6d42e7dSPeter Dunlap * 423a6d42e7dSPeter Dunlap * b Print associated buffer information 424a6d42e7dSPeter Dunlap * S Print recent state events and transitions 425a6d42e7dSPeter Dunlap * R Print reference count audit data 426a6d42e7dSPeter Dunlap * v Verbose output about the connection 427a6d42e7dSPeter Dunlap */ 428a6d42e7dSPeter Dunlap /*ARGSUSED*/ 429a6d42e7dSPeter Dunlap static int 430a6d42e7dSPeter Dunlap iscsi_task(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 431a6d42e7dSPeter Dunlap { 432a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t idc; 433a6d42e7dSPeter Dunlap int buffer = 0; 434a6d42e7dSPeter Dunlap int states = 0, rc_audit = 0; 435a6d42e7dSPeter Dunlap 436a6d42e7dSPeter Dunlap bzero(&idc, sizeof (idc)); 437a6d42e7dSPeter Dunlap if (mdb_getopts(argc, argv, 438a6d42e7dSPeter Dunlap 'b', MDB_OPT_SETBITS, TRUE, &buffer, 439a6d42e7dSPeter Dunlap 'S', MDB_OPT_SETBITS, TRUE, &states, 440a6d42e7dSPeter Dunlap 'R', MDB_OPT_SETBITS, TRUE, &rc_audit, 441a6d42e7dSPeter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose, 442a6d42e7dSPeter Dunlap NULL) != argc) 443a6d42e7dSPeter Dunlap return (DCMD_USAGE); 444a6d42e7dSPeter Dunlap 445a6d42e7dSPeter Dunlap idc.u.child.idc_conn = 0; 446a6d42e7dSPeter Dunlap idc.u.child.idc_task = 1; 447a6d42e7dSPeter Dunlap idc.u.child.idc_buffer = buffer; 448a6d42e7dSPeter Dunlap idc.u.child.idc_states = states; 449a6d42e7dSPeter Dunlap idc.u.child.idc_rc_audit = rc_audit; 450a6d42e7dSPeter Dunlap if (DCMD_HDRSPEC(flags)) 451a6d42e7dSPeter Dunlap idc.idc_header = 1; 452a6d42e7dSPeter Dunlap 453a6d42e7dSPeter Dunlap /* 454a6d42e7dSPeter Dunlap * If no address was specified on the command line, we 455a6d42e7dSPeter Dunlap * print out all connections 456a6d42e7dSPeter Dunlap */ 457a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 458a6d42e7dSPeter Dunlap return (iscsi_walk_all_conn(&idc)); 459a6d42e7dSPeter Dunlap } else { 460a6d42e7dSPeter Dunlap return (iscsi_task_impl(addr, &idc)); 461a6d42e7dSPeter Dunlap } 462a6d42e7dSPeter Dunlap /*NOTREACHED*/ 463a6d42e7dSPeter Dunlap } 464a6d42e7dSPeter Dunlap 465a6d42e7dSPeter Dunlap /* 466a6d42e7dSPeter Dunlap * ::iscsi_refcnt 467a6d42e7dSPeter Dunlap * 468a6d42e7dSPeter Dunlap * iscsi_refcnt - Dump an idm_refcnt_t structure 469a6d42e7dSPeter Dunlap * 470a6d42e7dSPeter Dunlap */ 471a6d42e7dSPeter Dunlap /*ARGSUSED*/ 472a6d42e7dSPeter Dunlap static int 473a6d42e7dSPeter Dunlap iscsi_refcnt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 474a6d42e7dSPeter Dunlap { 475a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 476a6d42e7dSPeter Dunlap return (DCMD_ERR); 477a6d42e7dSPeter Dunlap } else { 478a6d42e7dSPeter Dunlap return (iscsi_refcnt_impl(addr)); 479a6d42e7dSPeter Dunlap } 480a6d42e7dSPeter Dunlap /*NOTREACHED*/ 481a6d42e7dSPeter Dunlap } 482a6d42e7dSPeter Dunlap 483a6d42e7dSPeter Dunlap /* 484a6d42e7dSPeter Dunlap * ::iscsi_states 485a6d42e7dSPeter Dunlap * 486a6d42e7dSPeter Dunlap * iscsi_states - Dump events and state transitions recoreded in an 487a6d42e7dSPeter Dunlap * idm_sm_audit_t structure 488a6d42e7dSPeter Dunlap * 489a6d42e7dSPeter Dunlap */ 490a6d42e7dSPeter Dunlap /*ARGSUSED*/ 491a6d42e7dSPeter Dunlap static int 492a6d42e7dSPeter Dunlap iscsi_states(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 493a6d42e7dSPeter Dunlap { 494a6d42e7dSPeter Dunlap if (!(flags & DCMD_ADDRSPEC)) { 495a6d42e7dSPeter Dunlap return (DCMD_ERR); 496a6d42e7dSPeter Dunlap } else { 497a6d42e7dSPeter Dunlap return (iscsi_sm_audit_impl(addr)); 498a6d42e7dSPeter Dunlap } 499a6d42e7dSPeter Dunlap /*NOTREACHED*/ 500a6d42e7dSPeter Dunlap } 501a6d42e7dSPeter Dunlap 502*30e7468fSPeter Dunlap /* 503*30e7468fSPeter Dunlap * Helper function to list all the initiator sessions 504*30e7468fSPeter Dunlap */ 505*30e7468fSPeter Dunlap static int 506*30e7468fSPeter Dunlap iscsi_walk_ini_sessions(uintptr_t array_vaddr) 507*30e7468fSPeter Dunlap { 508*30e7468fSPeter Dunlap iscsi_hba_t ihp; 509*30e7468fSPeter Dunlap int i; 510*30e7468fSPeter Dunlap int array_size; 511*30e7468fSPeter Dunlap struct i_ddi_soft_state *ss; 512*30e7468fSPeter Dunlap iscsi_sess_t *isp; 513*30e7468fSPeter Dunlap 514*30e7468fSPeter Dunlap ss = (struct i_ddi_soft_state *)mdb_alloc(sizeof (*ss), 515*30e7468fSPeter Dunlap UM_SLEEP|UM_GC); 516*30e7468fSPeter Dunlap if (mdb_vread(ss, sizeof (*ss), array_vaddr) != sizeof (*ss)) { 517*30e7468fSPeter Dunlap mdb_warn("Cannot read softstate struct (Invalid pointer?).\n"); 518*30e7468fSPeter Dunlap return (DCMD_ERR); 519*30e7468fSPeter Dunlap } 520*30e7468fSPeter Dunlap array_size = ss->n_items * (sizeof (void *)); 521*30e7468fSPeter Dunlap array_vaddr = (uintptr_t)ss->array; 522*30e7468fSPeter Dunlap ss->array = mdb_alloc(array_size, UM_SLEEP|UM_GC); 523*30e7468fSPeter Dunlap if (mdb_vread(ss->array, array_size, array_vaddr) != array_size) { 524*30e7468fSPeter Dunlap mdb_warn("Corrupted softstate struct.\n"); 525*30e7468fSPeter Dunlap return (DCMD_ERR); 526*30e7468fSPeter Dunlap } 527*30e7468fSPeter Dunlap for (i = 0; i < ss->n_items; i++) { 528*30e7468fSPeter Dunlap if (ss->array[i] == 0) 529*30e7468fSPeter Dunlap continue; 530*30e7468fSPeter Dunlap 531*30e7468fSPeter Dunlap if (mdb_vread(&ihp, sizeof (ihp), (uintptr_t)ss->array[i]) 532*30e7468fSPeter Dunlap != sizeof (ihp)) { 533*30e7468fSPeter Dunlap mdb_warn("Corrupted softstate struct.\n"); 534*30e7468fSPeter Dunlap return (DCMD_ERR); 535*30e7468fSPeter Dunlap } 536*30e7468fSPeter Dunlap mdb_printf("iscsi_hba %p sessions: \n", ihp); 537*30e7468fSPeter Dunlap mdb_printf("%<u>%-19s %-4s %-8s%</u>\n", 538*30e7468fSPeter Dunlap "Session", "Type", "State"); 539*30e7468fSPeter Dunlap for (isp = ihp.hba_sess_list; isp; ) { 540*30e7468fSPeter Dunlap iscsi_sess_t sess; 541*30e7468fSPeter Dunlap if ((mdb_vread(&sess, sizeof (iscsi_sess_t), 542*30e7468fSPeter Dunlap (uintptr_t)isp)) != sizeof (iscsi_sess_t)) { 543*30e7468fSPeter Dunlap mdb_warn("Failed to read session\n"); 544*30e7468fSPeter Dunlap return (DCMD_ERR); 545*30e7468fSPeter Dunlap } 546*30e7468fSPeter Dunlap mdb_printf("%-19p %-4d %-8d\n", isp, 547*30e7468fSPeter Dunlap sess.sess_type, 548*30e7468fSPeter Dunlap sess.sess_state); 549*30e7468fSPeter Dunlap isp = sess.sess_next; 550*30e7468fSPeter Dunlap } 551*30e7468fSPeter Dunlap } 552*30e7468fSPeter Dunlap return (DCMD_OK); 553*30e7468fSPeter Dunlap } 554*30e7468fSPeter Dunlap 555a6d42e7dSPeter Dunlap static int 556a6d42e7dSPeter Dunlap iscsi_walk_all_sess(iscsi_dcmd_ctrl_t *idc) 557a6d42e7dSPeter Dunlap { 558a6d42e7dSPeter Dunlap uintptr_t iscsit_global_addr; 559a6d42e7dSPeter Dunlap uintptr_t avl_addr; 560a6d42e7dSPeter Dunlap uintptr_t list_addr; 561a6d42e7dSPeter Dunlap GElf_Sym sym; 562*30e7468fSPeter Dunlap uintptr_t adr; 563*30e7468fSPeter Dunlap /* Initiator sessions */ 564*30e7468fSPeter Dunlap if (idc->idc_ini) { 565*30e7468fSPeter Dunlap if (mdb_readvar(&adr, "iscsi_state") == -1) { 566a6d42e7dSPeter Dunlap 567*30e7468fSPeter Dunlap mdb_warn("state variable iscsi_state not found.\n"); 568*30e7468fSPeter Dunlap mdb_warn("Is the driver loaded ?\n"); 569*30e7468fSPeter Dunlap return (DCMD_ERR); 570*30e7468fSPeter Dunlap } 571*30e7468fSPeter Dunlap return (iscsi_walk_ini_sessions(adr)); 572*30e7468fSPeter Dunlap } 573*30e7468fSPeter Dunlap /* Target sessions */ 574a6d42e7dSPeter Dunlap /* Walk discovery sessions */ 575a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) { 576a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'iscsit_global'"); 577a6d42e7dSPeter Dunlap return (DCMD_ERR); 578a6d42e7dSPeter Dunlap } 579a6d42e7dSPeter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value; 580a6d42e7dSPeter Dunlap avl_addr = iscsit_global_addr + 581a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_discovery_sessions); 582a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_sess_walk_cb, idc, avl_addr) == -1) { 583a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for discovery sessions"); 584a6d42e7dSPeter Dunlap return (DCMD_ERR); 585a6d42e7dSPeter Dunlap } 586a6d42e7dSPeter Dunlap 587a6d42e7dSPeter Dunlap /* Walk targets printing all session info */ 588a6d42e7dSPeter Dunlap avl_addr = iscsit_global_addr + 589a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_target_list); 590a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_tgt_walk_cb, idc, avl_addr) == -1) { 591a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for target/session tree"); 592a6d42e7dSPeter Dunlap return (DCMD_ERR); 593a6d42e7dSPeter Dunlap } 594a6d42e7dSPeter Dunlap 595a6d42e7dSPeter Dunlap /* Walk deleting targets printing all session info */ 596a6d42e7dSPeter Dunlap list_addr = iscsit_global_addr + 597a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_deleted_target_list); 598a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_tgt_walk_cb, idc, list_addr) == -1) { 599a6d42e7dSPeter Dunlap mdb_warn("list walk failed for deleted target list"); 600a6d42e7dSPeter Dunlap return (DCMD_ERR); 601a6d42e7dSPeter Dunlap } 602a6d42e7dSPeter Dunlap 603a6d42e7dSPeter Dunlap return (DCMD_OK); 604a6d42e7dSPeter Dunlap } 605a6d42e7dSPeter Dunlap 606a6d42e7dSPeter Dunlap static int 607a6d42e7dSPeter Dunlap iscsi_walk_all_conn(iscsi_dcmd_ctrl_t *idc) 608a6d42e7dSPeter Dunlap { 609a6d42e7dSPeter Dunlap uintptr_t idm_global_addr; 610a6d42e7dSPeter Dunlap uintptr_t list_addr; 611a6d42e7dSPeter Dunlap GElf_Sym sym; 612a6d42e7dSPeter Dunlap 613a6d42e7dSPeter Dunlap /* Walk initiator connections */ 614a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("idm", &sym) == -1) { 615a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'idm'"); 616a6d42e7dSPeter Dunlap return (DCMD_ERR); 617a6d42e7dSPeter Dunlap } 618a6d42e7dSPeter Dunlap idm_global_addr = (uintptr_t)sym.st_value; 619a6d42e7dSPeter Dunlap /* Walk connection list associated with the initiator */ 620a6d42e7dSPeter Dunlap list_addr = idm_global_addr + offsetof(idm_global_t, idm_ini_conn_list); 621a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_conn_walk_cb, idc, list_addr) == -1) { 622a6d42e7dSPeter Dunlap mdb_warn("list walk failed for initiator connections"); 623a6d42e7dSPeter Dunlap return (DCMD_ERR); 624a6d42e7dSPeter Dunlap } 625a6d42e7dSPeter Dunlap 626a6d42e7dSPeter Dunlap /* Walk connection list associated with the target */ 627a6d42e7dSPeter Dunlap list_addr = idm_global_addr + offsetof(idm_global_t, idm_tgt_conn_list); 628a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_conn_walk_cb, idc, list_addr) == -1) { 629a6d42e7dSPeter Dunlap mdb_warn("list walk failed for target service instances"); 630a6d42e7dSPeter Dunlap return (DCMD_ERR); 631a6d42e7dSPeter Dunlap } 632a6d42e7dSPeter Dunlap 633a6d42e7dSPeter Dunlap return (DCMD_OK); 634a6d42e7dSPeter Dunlap } 635a6d42e7dSPeter Dunlap 636a6d42e7dSPeter Dunlap /*ARGSUSED*/ 637a6d42e7dSPeter Dunlap static int 638a6d42e7dSPeter Dunlap iscsi_tpg_walk_cb(uintptr_t addr, const void *list_walker_data, 639a6d42e7dSPeter Dunlap void *idc_void) 640a6d42e7dSPeter Dunlap { 641a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 642a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 643a6d42e7dSPeter Dunlap int rc; 644a6d42e7dSPeter Dunlap 645a6d42e7dSPeter Dunlap rc = iscsi_tpg_impl(addr, idc); 646a6d42e7dSPeter Dunlap 647a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 648a6d42e7dSPeter Dunlap } 649a6d42e7dSPeter Dunlap 650a6d42e7dSPeter Dunlap /*ARGSUSED*/ 651a6d42e7dSPeter Dunlap static int 652a6d42e7dSPeter Dunlap iscsi_tgt_walk_cb(uintptr_t addr, const void *list_walker_data, 653a6d42e7dSPeter Dunlap void *idc_void) 654a6d42e7dSPeter Dunlap { 655a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 656a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 657a6d42e7dSPeter Dunlap int rc; 658a6d42e7dSPeter Dunlap 659a6d42e7dSPeter Dunlap rc = iscsi_tgt_impl(addr, idc); 660a6d42e7dSPeter Dunlap 661a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 662a6d42e7dSPeter Dunlap } 663a6d42e7dSPeter Dunlap 664a6d42e7dSPeter Dunlap /*ARGSUSED*/ 665a6d42e7dSPeter Dunlap static int 666a6d42e7dSPeter Dunlap iscsi_tpgt_walk_cb(uintptr_t addr, const void *list_walker_data, 667a6d42e7dSPeter Dunlap void *idc_void) 668a6d42e7dSPeter Dunlap { 669a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 670a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 671a6d42e7dSPeter Dunlap int rc; 672a6d42e7dSPeter Dunlap 673a6d42e7dSPeter Dunlap rc = iscsi_tpgt_impl(addr, idc); 674a6d42e7dSPeter Dunlap 675a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 676a6d42e7dSPeter Dunlap } 677a6d42e7dSPeter Dunlap 678a6d42e7dSPeter Dunlap /*ARGSUSED*/ 679a6d42e7dSPeter Dunlap static int 680a6d42e7dSPeter Dunlap iscsi_portal_walk_cb(uintptr_t addr, const void *list_walker_data, 681a6d42e7dSPeter Dunlap void *idc_void) 682a6d42e7dSPeter Dunlap { 683a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 684a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 685a6d42e7dSPeter Dunlap int rc; 686a6d42e7dSPeter Dunlap 687a6d42e7dSPeter Dunlap rc = iscsi_portal_impl(addr, idc); 688a6d42e7dSPeter Dunlap 689a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 690a6d42e7dSPeter Dunlap } 691a6d42e7dSPeter Dunlap 692a6d42e7dSPeter Dunlap /*ARGSUSED*/ 693a6d42e7dSPeter Dunlap static int 694a6d42e7dSPeter Dunlap iscsi_sess_walk_cb(uintptr_t addr, const void *list_walker_data, 695a6d42e7dSPeter Dunlap void *idc_void) 696a6d42e7dSPeter Dunlap { 697a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 698a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 699a6d42e7dSPeter Dunlap int rc; 700a6d42e7dSPeter Dunlap 701a6d42e7dSPeter Dunlap rc = iscsi_sess_impl(addr, idc); 702a6d42e7dSPeter Dunlap 703a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 704a6d42e7dSPeter Dunlap } 705a6d42e7dSPeter Dunlap 706a6d42e7dSPeter Dunlap /*ARGSUSED*/ 707a6d42e7dSPeter Dunlap static int 708a6d42e7dSPeter Dunlap iscsi_sess_conn_walk_cb(uintptr_t addr, const void *list_walker_data, 709a6d42e7dSPeter Dunlap void *idc_void) 710a6d42e7dSPeter Dunlap { 711a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 712a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 713a6d42e7dSPeter Dunlap iscsit_conn_t ict; 714a6d42e7dSPeter Dunlap int rc; 715a6d42e7dSPeter Dunlap 716a6d42e7dSPeter Dunlap /* 717a6d42e7dSPeter Dunlap * This function is different from iscsi_conn_walk_cb because 718a6d42e7dSPeter Dunlap * we get an iscsit_conn_t instead of an idm_conn_t 719a6d42e7dSPeter Dunlap * 720a6d42e7dSPeter Dunlap * Read iscsit_conn_t, use to get idm_conn_t pointer 721a6d42e7dSPeter Dunlap */ 722a6d42e7dSPeter Dunlap if (mdb_vread(&ict, sizeof (iscsit_conn_t), addr) != 723a6d42e7dSPeter Dunlap sizeof (iscsit_conn_t)) { 724a6d42e7dSPeter Dunlap return (DCMD_ERR); 725a6d42e7dSPeter Dunlap } 726a6d42e7dSPeter Dunlap rc = iscsi_conn_impl((uintptr_t)ict.ict_ic, idc); 727a6d42e7dSPeter Dunlap 728a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 729a6d42e7dSPeter Dunlap } 730a6d42e7dSPeter Dunlap 731a6d42e7dSPeter Dunlap /*ARGSUSED*/ 732a6d42e7dSPeter Dunlap static int 733a6d42e7dSPeter Dunlap iscsi_conn_walk_cb(uintptr_t addr, const void *list_walker_data, 734a6d42e7dSPeter Dunlap void *idc_void) 735a6d42e7dSPeter Dunlap { 736a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 737a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 738a6d42e7dSPeter Dunlap int rc; 739a6d42e7dSPeter Dunlap 740a6d42e7dSPeter Dunlap rc = iscsi_conn_impl(addr, idc); 741a6d42e7dSPeter Dunlap 742a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 743a6d42e7dSPeter Dunlap } 744a6d42e7dSPeter Dunlap 745a6d42e7dSPeter Dunlap /*ARGSUSED*/ 746a6d42e7dSPeter Dunlap static int 747a6d42e7dSPeter Dunlap iscsi_buffer_walk_cb(uintptr_t addr, const void *list_walker_data, 748a6d42e7dSPeter Dunlap void *idc_void) 749a6d42e7dSPeter Dunlap { 750a6d42e7dSPeter Dunlap /* We don't particularly care about the list walker data */ 751a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = idc_void; 752a6d42e7dSPeter Dunlap int rc; 753a6d42e7dSPeter Dunlap 754a6d42e7dSPeter Dunlap rc = iscsi_buffer_impl(addr, idc); 755a6d42e7dSPeter Dunlap 756a6d42e7dSPeter Dunlap return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR); 757a6d42e7dSPeter Dunlap } 758a6d42e7dSPeter Dunlap 759a6d42e7dSPeter Dunlap static int 760a6d42e7dSPeter Dunlap iscsi_tgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 761a6d42e7dSPeter Dunlap { 762a6d42e7dSPeter Dunlap iscsit_tgt_t tgt; 763a6d42e7dSPeter Dunlap uintptr_t avl_addr, rc_addr, states_addr; 764a6d42e7dSPeter Dunlap char tgt_name[MAX_ISCSI_NODENAMELEN]; 765a6d42e7dSPeter Dunlap int verbose, states, rc_audit; 766a6d42e7dSPeter Dunlap 767a6d42e7dSPeter Dunlap /* 768a6d42e7dSPeter Dunlap * Read iscsit_tgt_t 769a6d42e7dSPeter Dunlap */ 770a6d42e7dSPeter Dunlap if (mdb_vread(&tgt, sizeof (iscsit_tgt_t), addr) != 771a6d42e7dSPeter Dunlap sizeof (iscsit_tgt_t)) { 772a6d42e7dSPeter Dunlap return (DCMD_ERR); 773a6d42e7dSPeter Dunlap } 774a6d42e7dSPeter Dunlap 775a6d42e7dSPeter Dunlap /* 776a6d42e7dSPeter Dunlap * Read target name if available 777a6d42e7dSPeter Dunlap */ 778a6d42e7dSPeter Dunlap if ((tgt.target_name == NULL) || 779a6d42e7dSPeter Dunlap (mdb_readstr(tgt_name, sizeof (tgt_name), 780a6d42e7dSPeter Dunlap (uintptr_t)tgt.target_name) == -1)) { 781a6d42e7dSPeter Dunlap strcpy(tgt_name, "N/A"); 782a6d42e7dSPeter Dunlap } 783a6d42e7dSPeter Dunlap 784a6d42e7dSPeter Dunlap /* 785a6d42e7dSPeter Dunlap * Brief output 786a6d42e7dSPeter Dunlap * 787a6d42e7dSPeter Dunlap * iscsit_tgt_t pointer 788a6d42e7dSPeter Dunlap * iscsit_tgt_t.target_stmf_state 789a6d42e7dSPeter Dunlap * iscsit_tgt_t.target_sess_list.avl_numnodes (session count) 790a6d42e7dSPeter Dunlap * iscsit_tgt_t.target_name; 791a6d42e7dSPeter Dunlap */ 792a6d42e7dSPeter Dunlap 793a6d42e7dSPeter Dunlap verbose = idc->idc_verbose; 794a6d42e7dSPeter Dunlap states = idc->u.child.idc_states; 795a6d42e7dSPeter Dunlap rc_audit = idc->u.child.idc_rc_audit; 796a6d42e7dSPeter Dunlap 797a6d42e7dSPeter Dunlap /* For now we will ignore the verbose flag */ 798a6d42e7dSPeter Dunlap if (idc->u.child.idc_tgt) { 799a6d42e7dSPeter Dunlap /* Print target data */ 800a6d42e7dSPeter Dunlap if (idc->idc_header) { 801a6d42e7dSPeter Dunlap mdb_printf("%<u>%-19s %-4s %-8s%</u>\n", 802a6d42e7dSPeter Dunlap "iscsit_tgt_t", "Sess", "State"); 803a6d42e7dSPeter Dunlap } 804a6d42e7dSPeter Dunlap mdb_printf("%-19p %-4d %-8d\n", addr, 805a6d42e7dSPeter Dunlap tgt.target_sess_list.avl_numnodes, 806a6d42e7dSPeter Dunlap tgt.target_state); 807a6d42e7dSPeter Dunlap mdb_printf(" %s\n", tgt_name); 808a6d42e7dSPeter Dunlap } 809a6d42e7dSPeter Dunlap 810a6d42e7dSPeter Dunlap idc->idc_header = 0; 811a6d42e7dSPeter Dunlap idc->idc_verbose = 0; 812a6d42e7dSPeter Dunlap 813a6d42e7dSPeter Dunlap /* 814a6d42e7dSPeter Dunlap * Print states if requested 815a6d42e7dSPeter Dunlap */ 816a6d42e7dSPeter Dunlap if (idc->u.child.idc_tgt && states) { 817a6d42e7dSPeter Dunlap states_addr = addr + offsetof(iscsit_tgt_t, target_state_audit); 818a6d42e7dSPeter Dunlap 819a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 820a6d42e7dSPeter Dunlap mdb_printf("State History:\n"); 821a6d42e7dSPeter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) 822a6d42e7dSPeter Dunlap return (DCMD_ERR); 823a6d42e7dSPeter Dunlap idc->u.child.idc_states = 0; 824a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 825a6d42e7dSPeter Dunlap } 826a6d42e7dSPeter Dunlap 827a6d42e7dSPeter Dunlap /* 828a6d42e7dSPeter Dunlap * Print refcnt audit data if requested 829a6d42e7dSPeter Dunlap */ 830a6d42e7dSPeter Dunlap if (idc->u.child.idc_tgt && rc_audit) { 831a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 832a6d42e7dSPeter Dunlap mdb_printf("target_sess_refcnt:\n"); 833a6d42e7dSPeter Dunlap rc_addr = addr + 834a6d42e7dSPeter Dunlap offsetof(iscsit_tgt_t, target_sess_refcnt); 835a6d42e7dSPeter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) 836a6d42e7dSPeter Dunlap return (DCMD_ERR); 837a6d42e7dSPeter Dunlap 838a6d42e7dSPeter Dunlap mdb_printf("target_refcnt:\n"); 839a6d42e7dSPeter Dunlap rc_addr = addr + 840a6d42e7dSPeter Dunlap offsetof(iscsit_tgt_t, target_refcnt); 841a6d42e7dSPeter Dunlap 842a6d42e7dSPeter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) 843a6d42e7dSPeter Dunlap return (DCMD_ERR); 844a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = 0; 845a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 846a6d42e7dSPeter Dunlap } 847a6d42e7dSPeter Dunlap 848a6d42e7dSPeter Dunlap /* Any child objects to walk? */ 849a6d42e7dSPeter Dunlap if (idc->u.child.idc_tpgt || idc->u.child.idc_sess || 850a6d42e7dSPeter Dunlap idc->u.child.idc_conn || idc->u.child.idc_task || 851a6d42e7dSPeter Dunlap idc->u.child.idc_buffer) { 852a6d42e7dSPeter Dunlap /* Walk TPGT tree */ 853a6d42e7dSPeter Dunlap idc->idc_header = 1; 854a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 855a6d42e7dSPeter Dunlap avl_addr = addr + 856a6d42e7dSPeter Dunlap offsetof(iscsit_tgt_t, target_tpgt_list); 857a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_tpgt_walk_cb, idc, 858a6d42e7dSPeter Dunlap avl_addr) == -1) { 859a6d42e7dSPeter Dunlap mdb_warn("target tpgt list walk failed"); 860a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 861a6d42e7dSPeter Dunlap return (DCMD_ERR); 862a6d42e7dSPeter Dunlap } 863a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 864a6d42e7dSPeter Dunlap 865a6d42e7dSPeter Dunlap /* Walk sess tree */ 866a6d42e7dSPeter Dunlap idc->idc_header = 1; 867a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 868a6d42e7dSPeter Dunlap avl_addr = addr + offsetof(iscsit_tgt_t, target_sess_list); 869a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_sess_walk_cb, idc, 870a6d42e7dSPeter Dunlap avl_addr) == -1) { 871a6d42e7dSPeter Dunlap mdb_warn("target sess list walk failed"); 872a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 873a6d42e7dSPeter Dunlap return (DCMD_ERR); 874a6d42e7dSPeter Dunlap } 875a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 876a6d42e7dSPeter Dunlap 877a6d42e7dSPeter Dunlap idc->idc_header = 0; 878a6d42e7dSPeter Dunlap } 879a6d42e7dSPeter Dunlap 880a6d42e7dSPeter Dunlap idc->idc_verbose = verbose; 881a6d42e7dSPeter Dunlap idc->u.child.idc_states = states; 882a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = rc_audit; 883a6d42e7dSPeter Dunlap return (DCMD_OK); 884a6d42e7dSPeter Dunlap } 885a6d42e7dSPeter Dunlap 886a6d42e7dSPeter Dunlap static int 887a6d42e7dSPeter Dunlap iscsi_tpgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 888a6d42e7dSPeter Dunlap { 889a6d42e7dSPeter Dunlap iscsit_tpgt_t tpgt; 890a6d42e7dSPeter Dunlap iscsit_tpg_t tpg; 891a6d42e7dSPeter Dunlap uintptr_t avl_addr, tpg_addr; 892a6d42e7dSPeter Dunlap 893a6d42e7dSPeter Dunlap /* 894a6d42e7dSPeter Dunlap * Read iscsit_tpgt_t 895a6d42e7dSPeter Dunlap */ 896a6d42e7dSPeter Dunlap if (mdb_vread(&tpgt, sizeof (iscsit_tpgt_t), addr) != 897a6d42e7dSPeter Dunlap sizeof (iscsit_tpgt_t)) { 898a6d42e7dSPeter Dunlap return (DCMD_ERR); 899a6d42e7dSPeter Dunlap } 900a6d42e7dSPeter Dunlap 901a6d42e7dSPeter Dunlap tpg_addr = (uintptr_t)tpgt.tpgt_tpg; 902a6d42e7dSPeter Dunlap 903a6d42e7dSPeter Dunlap /* 904a6d42e7dSPeter Dunlap * Read iscsit_tpg_t 905a6d42e7dSPeter Dunlap */ 906a6d42e7dSPeter Dunlap if (mdb_vread(&tpg, sizeof (iscsit_tpg_t), tpg_addr) != 907a6d42e7dSPeter Dunlap sizeof (iscsit_tpg_t)) { 908a6d42e7dSPeter Dunlap return (DCMD_ERR); 909a6d42e7dSPeter Dunlap } 910a6d42e7dSPeter Dunlap 911a6d42e7dSPeter Dunlap /* 912a6d42e7dSPeter Dunlap * Brief output 913a6d42e7dSPeter Dunlap * 914a6d42e7dSPeter Dunlap * iscsit_tpgt_t pointer 915a6d42e7dSPeter Dunlap * iscsit_tpg_t pointer 916a6d42e7dSPeter Dunlap * iscsit_tpg_t.tpg_name 917a6d42e7dSPeter Dunlap * iscsit_tpgt_t.tpgt_tag; 918a6d42e7dSPeter Dunlap */ 919a6d42e7dSPeter Dunlap 920a6d42e7dSPeter Dunlap /* For now we will ignore the verbose flag */ 921a6d42e7dSPeter Dunlap if (idc->u.child.idc_tpgt) { 922a6d42e7dSPeter Dunlap /* Print target data */ 923a6d42e7dSPeter Dunlap if (idc->idc_header) { 924a6d42e7dSPeter Dunlap mdb_printf("%<u>%-?s %-?s %-18s %-6s%</u>\n", 925a6d42e7dSPeter Dunlap "iscsit_tpgt_t", "iscsit_tpg_t", "Name", "Tag"); 926a6d42e7dSPeter Dunlap } 927a6d42e7dSPeter Dunlap mdb_printf("%?p %?p %-18s 0x%04x\n", addr, tpgt.tpgt_tpg, 928a6d42e7dSPeter Dunlap tpg.tpg_name, tpgt.tpgt_tag); 929a6d42e7dSPeter Dunlap } 930a6d42e7dSPeter Dunlap 931a6d42e7dSPeter Dunlap /* 932a6d42e7dSPeter Dunlap * Assume for now that anyone interested in TPGT wants to see the 933a6d42e7dSPeter Dunlap * portals as well. 934a6d42e7dSPeter Dunlap */ 935a6d42e7dSPeter Dunlap idc->idc_header = 1; 936a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 937a6d42e7dSPeter Dunlap avl_addr = tpg_addr + offsetof(iscsit_tpg_t, tpg_portal_list); 938a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_portal_walk_cb, idc, avl_addr) == -1) { 939a6d42e7dSPeter Dunlap mdb_warn("portal list walk failed"); 940a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 941a6d42e7dSPeter Dunlap return (DCMD_ERR); 942a6d42e7dSPeter Dunlap } 943a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 944a6d42e7dSPeter Dunlap idc->idc_header = 0; 945a6d42e7dSPeter Dunlap 946a6d42e7dSPeter Dunlap return (DCMD_OK); 947a6d42e7dSPeter Dunlap } 948a6d42e7dSPeter Dunlap 949a6d42e7dSPeter Dunlap static int 950a6d42e7dSPeter Dunlap iscsi_tpg_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 951a6d42e7dSPeter Dunlap { 952a6d42e7dSPeter Dunlap iscsit_tpg_t tpg; 953a6d42e7dSPeter Dunlap uintptr_t avl_addr; 954a6d42e7dSPeter Dunlap 955a6d42e7dSPeter Dunlap /* 956a6d42e7dSPeter Dunlap * Read iscsit_tpg_t 957a6d42e7dSPeter Dunlap */ 958a6d42e7dSPeter Dunlap if (mdb_vread(&tpg, sizeof (iscsit_tpg_t), addr) != 959a6d42e7dSPeter Dunlap sizeof (iscsit_tpg_t)) { 960a6d42e7dSPeter Dunlap return (DCMD_ERR); 961a6d42e7dSPeter Dunlap } 962a6d42e7dSPeter Dunlap 963a6d42e7dSPeter Dunlap /* 964a6d42e7dSPeter Dunlap * Brief output 965a6d42e7dSPeter Dunlap * 966a6d42e7dSPeter Dunlap * iscsit_tpgt_t pointer 967a6d42e7dSPeter Dunlap * iscsit_tpg_t pointer 968a6d42e7dSPeter Dunlap * iscsit_tpg_t.tpg_name 969a6d42e7dSPeter Dunlap * iscsit_tpgt_t.tpgt_tag; 970a6d42e7dSPeter Dunlap */ 971a6d42e7dSPeter Dunlap 972a6d42e7dSPeter Dunlap /* For now we will ignore the verbose flag */ 973a6d42e7dSPeter Dunlap 974a6d42e7dSPeter Dunlap /* Print target data */ 975a6d42e7dSPeter Dunlap if (idc->idc_header) { 976a6d42e7dSPeter Dunlap mdb_printf("%<u>%-?s %-18s%</u>\n", 977a6d42e7dSPeter Dunlap "iscsit_tpg_t", "Name"); 978a6d42e7dSPeter Dunlap } 979a6d42e7dSPeter Dunlap mdb_printf("%?p %-18s\n", addr, tpg.tpg_name); 980a6d42e7dSPeter Dunlap 981a6d42e7dSPeter Dunlap 982a6d42e7dSPeter Dunlap /* 983a6d42e7dSPeter Dunlap * Assume for now that anyone interested in TPG wants to see the 984a6d42e7dSPeter Dunlap * portals as well. 985a6d42e7dSPeter Dunlap */ 986a6d42e7dSPeter Dunlap idc->idc_header = 1; 987a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 988a6d42e7dSPeter Dunlap avl_addr = addr + offsetof(iscsit_tpg_t, tpg_portal_list); 989a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_portal_walk_cb, idc, avl_addr) == -1) { 990a6d42e7dSPeter Dunlap mdb_warn("portal list walk failed"); 991a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 992a6d42e7dSPeter Dunlap return (DCMD_ERR); 993a6d42e7dSPeter Dunlap } 994a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 995a6d42e7dSPeter Dunlap idc->idc_header = 0; 996a6d42e7dSPeter Dunlap 997a6d42e7dSPeter Dunlap return (DCMD_OK); 998a6d42e7dSPeter Dunlap } 999a6d42e7dSPeter Dunlap 1000a6d42e7dSPeter Dunlap static int 1001a6d42e7dSPeter Dunlap iscsi_portal_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 1002a6d42e7dSPeter Dunlap { 1003a6d42e7dSPeter Dunlap iscsit_portal_t portal; 1004a6d42e7dSPeter Dunlap char portal_addr[PORTAL_STR_LEN]; 1005a6d42e7dSPeter Dunlap if (idc->u.child.idc_portal) { 1006a6d42e7dSPeter Dunlap /* 1007a6d42e7dSPeter Dunlap * Read iscsit_portal_t 1008a6d42e7dSPeter Dunlap */ 1009a6d42e7dSPeter Dunlap if (mdb_vread(&portal, sizeof (iscsit_portal_t), addr) != 1010a6d42e7dSPeter Dunlap sizeof (iscsit_portal_t)) { 1011a6d42e7dSPeter Dunlap return (DCMD_ERR); 1012a6d42e7dSPeter Dunlap } 1013a6d42e7dSPeter Dunlap 1014a6d42e7dSPeter Dunlap /* Print portal data */ 1015a6d42e7dSPeter Dunlap if (idc->idc_header) { 1016a6d42e7dSPeter Dunlap mdb_printf("%<u>%-?s %-?s %-30s%</u>\n", 1017a6d42e7dSPeter Dunlap "iscsit_portal_t", "idm_svc_t", "IP:Port"); 1018a6d42e7dSPeter Dunlap } 1019a6d42e7dSPeter Dunlap sa_to_str(&portal.portal_addr, portal_addr); 1020a6d42e7dSPeter Dunlap mdb_printf("%?p %?p %s\n", addr, portal.portal_svc, 1021a6d42e7dSPeter Dunlap portal_addr); 1022a6d42e7dSPeter Dunlap } 1023a6d42e7dSPeter Dunlap 1024a6d42e7dSPeter Dunlap return (DCMD_OK); 1025a6d42e7dSPeter Dunlap } 1026a6d42e7dSPeter Dunlap 1027a6d42e7dSPeter Dunlap static int 1028a6d42e7dSPeter Dunlap iscsi_sess_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 1029a6d42e7dSPeter Dunlap { 1030a6d42e7dSPeter Dunlap iscsit_sess_t ist; 1031a6d42e7dSPeter Dunlap uintptr_t list_addr, states_addr, rc_addr; 1032a6d42e7dSPeter Dunlap char ini_name[80]; 1033a6d42e7dSPeter Dunlap char tgt_name[80]; 1034a6d42e7dSPeter Dunlap int verbose, states, rc_audit; 1035a6d42e7dSPeter Dunlap 1036a6d42e7dSPeter Dunlap /* 1037a6d42e7dSPeter Dunlap * Read iscsit_sess_t 1038a6d42e7dSPeter Dunlap */ 1039a6d42e7dSPeter Dunlap if (mdb_vread(&ist, sizeof (iscsit_sess_t), addr) != 1040a6d42e7dSPeter Dunlap sizeof (iscsit_sess_t)) { 1041a6d42e7dSPeter Dunlap return (DCMD_ERR); 1042a6d42e7dSPeter Dunlap } 1043a6d42e7dSPeter Dunlap 1044a6d42e7dSPeter Dunlap /* 1045a6d42e7dSPeter Dunlap * Brief output 1046a6d42e7dSPeter Dunlap * 1047a6d42e7dSPeter Dunlap * iscsit_sess_t pointer 1048a6d42e7dSPeter Dunlap * iscsit_sess_t.ist_state/iscsit_sess_t.ist_ffp_conn_count 1049a6d42e7dSPeter Dunlap * iscsit_sess_t.ist_tsih 1050a6d42e7dSPeter Dunlap * iscsit_sess_t.ist_initiator_name 1051a6d42e7dSPeter Dunlap */ 1052a6d42e7dSPeter Dunlap 1053a6d42e7dSPeter Dunlap verbose = idc->idc_verbose; 1054a6d42e7dSPeter Dunlap states = idc->u.child.idc_states; 1055a6d42e7dSPeter Dunlap rc_audit = idc->u.child.idc_rc_audit; 1056a6d42e7dSPeter Dunlap 1057a6d42e7dSPeter Dunlap if (idc->u.child.idc_sess) { 1058a6d42e7dSPeter Dunlap if (verbose) { 1059a6d42e7dSPeter Dunlap /* 1060a6d42e7dSPeter Dunlap * Read initiator name if available 1061a6d42e7dSPeter Dunlap */ 1062a6d42e7dSPeter Dunlap if ((ist.ist_initiator_name == NULL) || 1063a6d42e7dSPeter Dunlap (mdb_readstr(ini_name, sizeof (ini_name), 1064a6d42e7dSPeter Dunlap (uintptr_t)ist.ist_initiator_name) == -1)) { 1065a6d42e7dSPeter Dunlap strcpy(ini_name, "N/A"); 1066a6d42e7dSPeter Dunlap } 1067a6d42e7dSPeter Dunlap 1068a6d42e7dSPeter Dunlap /* 1069a6d42e7dSPeter Dunlap * Read target name if available 1070a6d42e7dSPeter Dunlap */ 1071a6d42e7dSPeter Dunlap if ((ist.ist_target_name == NULL) || 1072a6d42e7dSPeter Dunlap (mdb_readstr(tgt_name, sizeof (tgt_name), 1073a6d42e7dSPeter Dunlap (uintptr_t)ist.ist_target_name) == -1)) { 1074a6d42e7dSPeter Dunlap strcpy(tgt_name, "N/A"); 1075a6d42e7dSPeter Dunlap } 1076a6d42e7dSPeter Dunlap 1077a6d42e7dSPeter Dunlap mdb_printf("Session %p\n", addr); 1078a6d42e7dSPeter Dunlap mdb_printf("%16s: %d\n", "State", 1079a6d42e7dSPeter Dunlap ist.ist_state); 1080a6d42e7dSPeter Dunlap mdb_printf("%16s: %d\n", "Last State", 1081a6d42e7dSPeter Dunlap ist.ist_last_state); 1082a6d42e7dSPeter Dunlap mdb_printf("%16s: %d\n", "FFP Connections", 1083a6d42e7dSPeter Dunlap ist.ist_ffp_conn_count); 1084a6d42e7dSPeter Dunlap mdb_printf("%16s: %02x%02x%02x%02x%02x%02x\n", "ISID", 1085a6d42e7dSPeter Dunlap ist.ist_isid[0], ist.ist_isid[1], ist.ist_isid[2], 1086a6d42e7dSPeter Dunlap ist.ist_isid[3], ist.ist_isid[4], ist.ist_isid[5]); 1087a6d42e7dSPeter Dunlap mdb_printf("%16s: 0x%04x\n", "TSIH", 1088a6d42e7dSPeter Dunlap ist.ist_tsih); 1089a6d42e7dSPeter Dunlap mdb_printf("%16s: %s\n", "Initiator IQN", 1090a6d42e7dSPeter Dunlap ini_name); 1091a6d42e7dSPeter Dunlap mdb_printf("%16s: %s\n", "Target IQN", 1092a6d42e7dSPeter Dunlap tgt_name); 1093a6d42e7dSPeter Dunlap mdb_printf("%16s: %08x\n", "ExpCmdSN", 1094a6d42e7dSPeter Dunlap ist.ist_expcmdsn); 1095a6d42e7dSPeter Dunlap mdb_printf("%16s: %08x\n", "MaxCmdSN", 1096a6d42e7dSPeter Dunlap ist.ist_maxcmdsn); 1097a6d42e7dSPeter Dunlap } else { 1098a6d42e7dSPeter Dunlap /* Print session data */ 1099a6d42e7dSPeter Dunlap if (idc->idc_header) { 1100a6d42e7dSPeter Dunlap mdb_printf("%<u>%-?s %10s %-12s %-6s%</u>\n", 1101a6d42e7dSPeter Dunlap "iscsit_sess_t", "State/Conn", "ISID", 1102a6d42e7dSPeter Dunlap "TSIH"); 1103a6d42e7dSPeter Dunlap } 1104a6d42e7dSPeter Dunlap mdb_printf("%?p %4d/%-4d %02x%02x%02x%02x%02x%02x " 1105a6d42e7dSPeter Dunlap "0x%04x\n", addr, 1106a6d42e7dSPeter Dunlap ist.ist_state, ist.ist_ffp_conn_count, 1107a6d42e7dSPeter Dunlap ist.ist_isid[0], ist.ist_isid[1], ist.ist_isid[2], 1108a6d42e7dSPeter Dunlap ist.ist_isid[3], ist.ist_isid[4], ist.ist_isid[5], 1109a6d42e7dSPeter Dunlap ist.ist_tsih); 1110a6d42e7dSPeter Dunlap } 1111a6d42e7dSPeter Dunlap idc->idc_header = 0; 1112a6d42e7dSPeter Dunlap } 1113a6d42e7dSPeter Dunlap 1114a6d42e7dSPeter Dunlap idc->idc_verbose = 0; 1115a6d42e7dSPeter Dunlap 1116a6d42e7dSPeter Dunlap /* 1117a6d42e7dSPeter Dunlap * Print states if requested 1118a6d42e7dSPeter Dunlap */ 1119a6d42e7dSPeter Dunlap if (states) { 1120a6d42e7dSPeter Dunlap states_addr = addr + offsetof(iscsit_sess_t, ist_state_audit); 1121a6d42e7dSPeter Dunlap 1122a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1123a6d42e7dSPeter Dunlap mdb_printf("State History:\n"); 1124a6d42e7dSPeter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) 1125a6d42e7dSPeter Dunlap return (DCMD_ERR); 1126a6d42e7dSPeter Dunlap 1127a6d42e7dSPeter Dunlap /* Don't print state history for child objects */ 1128a6d42e7dSPeter Dunlap idc->u.child.idc_states = 0; 1129a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1130a6d42e7dSPeter Dunlap } 1131a6d42e7dSPeter Dunlap 1132a6d42e7dSPeter Dunlap /* 1133a6d42e7dSPeter Dunlap * Print refcnt audit data if requested 1134a6d42e7dSPeter Dunlap */ 1135a6d42e7dSPeter Dunlap if (rc_audit) { 1136a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1137a6d42e7dSPeter Dunlap mdb_printf("Reference History:\n"); 1138a6d42e7dSPeter Dunlap rc_addr = addr + 1139a6d42e7dSPeter Dunlap offsetof(iscsit_sess_t, ist_refcnt); 1140a6d42e7dSPeter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) 1141a6d42e7dSPeter Dunlap return (DCMD_ERR); 1142a6d42e7dSPeter Dunlap 1143a6d42e7dSPeter Dunlap /* Don't print audit data for child objects */ 1144a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = 0; 1145a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1146a6d42e7dSPeter Dunlap } 1147a6d42e7dSPeter Dunlap 1148a6d42e7dSPeter Dunlap /* Any child objects to walk? */ 1149a6d42e7dSPeter Dunlap if (idc->u.child.idc_conn || idc->u.child.idc_task || 1150a6d42e7dSPeter Dunlap idc->u.child.idc_buffer) { 1151a6d42e7dSPeter Dunlap /* Walk conn list */ 1152a6d42e7dSPeter Dunlap idc->idc_header = 1; 1153a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1154a6d42e7dSPeter Dunlap list_addr = addr + offsetof(iscsit_sess_t, ist_conn_list); 1155a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_sess_conn_walk_cb, idc, 1156a6d42e7dSPeter Dunlap list_addr) == -1) { 1157a6d42e7dSPeter Dunlap mdb_warn("session conn list walk failed"); 1158a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1159a6d42e7dSPeter Dunlap return (DCMD_ERR); 1160a6d42e7dSPeter Dunlap } 1161a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1162a6d42e7dSPeter Dunlap idc->idc_header = 0; 1163a6d42e7dSPeter Dunlap } 1164a6d42e7dSPeter Dunlap 1165a6d42e7dSPeter Dunlap idc->idc_verbose = verbose; 1166a6d42e7dSPeter Dunlap idc->u.child.idc_states = states; 1167a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = rc_audit; 1168a6d42e7dSPeter Dunlap 1169a6d42e7dSPeter Dunlap return (DCMD_OK); 1170a6d42e7dSPeter Dunlap } 1171a6d42e7dSPeter Dunlap 1172a6d42e7dSPeter Dunlap static int 1173a6d42e7dSPeter Dunlap iscsi_conn_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 1174a6d42e7dSPeter Dunlap { 1175a6d42e7dSPeter Dunlap uintptr_t idm_global_addr, states_addr, rc_addr; 1176a6d42e7dSPeter Dunlap uintptr_t task_addr, task_ptr; 1177a6d42e7dSPeter Dunlap GElf_Sym sym; 1178a6d42e7dSPeter Dunlap idm_task_t idt; 1179a6d42e7dSPeter Dunlap idm_conn_t ic; 1180a6d42e7dSPeter Dunlap char *conn_type; 1181a6d42e7dSPeter Dunlap int task_idx; 1182a6d42e7dSPeter Dunlap char laddr[PORTAL_STR_LEN]; 1183a6d42e7dSPeter Dunlap char raddr[PORTAL_STR_LEN]; 1184a6d42e7dSPeter Dunlap int verbose, states, rc_audit; 1185a6d42e7dSPeter Dunlap 1186a6d42e7dSPeter Dunlap /* 1187a6d42e7dSPeter Dunlap * Get pointer to task table 1188a6d42e7dSPeter Dunlap */ 1189a6d42e7dSPeter Dunlap 1190a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("idm", &sym) == -1) { 1191a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'idm'"); 1192a6d42e7dSPeter Dunlap return (DCMD_ERR); 1193a6d42e7dSPeter Dunlap } 1194a6d42e7dSPeter Dunlap 1195a6d42e7dSPeter Dunlap idm_global_addr = (uintptr_t)sym.st_value; 1196a6d42e7dSPeter Dunlap 1197a6d42e7dSPeter Dunlap if (mdb_vread(&task_ptr, sizeof (uintptr_t), 1198a6d42e7dSPeter Dunlap idm_global_addr + offsetof(idm_global_t, idm_taskid_table)) != 1199a6d42e7dSPeter Dunlap sizeof (uintptr_t)) { 1200a6d42e7dSPeter Dunlap mdb_warn("Failed to read address of task table"); 1201a6d42e7dSPeter Dunlap return (DCMD_ERR); 1202a6d42e7dSPeter Dunlap } 1203a6d42e7dSPeter Dunlap 1204a6d42e7dSPeter Dunlap /* 1205a6d42e7dSPeter Dunlap * Read idm_conn_t 1206a6d42e7dSPeter Dunlap */ 1207a6d42e7dSPeter Dunlap if (mdb_vread(&ic, sizeof (idm_conn_t), addr) != sizeof (idm_conn_t)) { 1208a6d42e7dSPeter Dunlap return (DCMD_ERR); 1209a6d42e7dSPeter Dunlap } 1210a6d42e7dSPeter Dunlap conn_type = (ic.ic_conn_type == CONN_TYPE_INI) ? "Ini" : 1211a6d42e7dSPeter Dunlap (ic.ic_conn_type == CONN_TYPE_TGT) ? "Tgt" : "Unk"; 1212a6d42e7dSPeter Dunlap 1213a6d42e7dSPeter Dunlap /* 1214a6d42e7dSPeter Dunlap * Brief output 1215a6d42e7dSPeter Dunlap * 1216a6d42e7dSPeter Dunlap * idm_conn_t pointer 1217a6d42e7dSPeter Dunlap * idm_conn_t.ic_conn_type 1218a6d42e7dSPeter Dunlap * idm_conn_t.ic_statet+idm_conn_t.ic_ffp 1219a6d42e7dSPeter Dunlap */ 1220a6d42e7dSPeter Dunlap 1221a6d42e7dSPeter Dunlap verbose = idc->idc_verbose; 1222a6d42e7dSPeter Dunlap states = idc->u.child.idc_states; 1223a6d42e7dSPeter Dunlap rc_audit = idc->u.child.idc_rc_audit; 1224a6d42e7dSPeter Dunlap 1225a6d42e7dSPeter Dunlap if (idc->u.child.idc_conn) { 1226a6d42e7dSPeter Dunlap if (idc->idc_verbose) { 1227a6d42e7dSPeter Dunlap mdb_printf("IDM Conn %p\n", addr); 1228a6d42e7dSPeter Dunlap if (ic.ic_conn_type == CONN_TYPE_TGT) { 1229a6d42e7dSPeter Dunlap iscsi_print_iscsit_conn_data(&ic); 1230a6d42e7dSPeter Dunlap } else { 1231a6d42e7dSPeter Dunlap iscsi_print_idm_conn_data(&ic); 1232a6d42e7dSPeter Dunlap } 1233a6d42e7dSPeter Dunlap } else { 1234a6d42e7dSPeter Dunlap /* Print connection data */ 1235a6d42e7dSPeter Dunlap if (idc->idc_header) { 1236a6d42e7dSPeter Dunlap mdb_printf("%<u>%-?s %-6s %-10s %12s%</u>\n", 1237a6d42e7dSPeter Dunlap "idm_conn_t", "Type", "Transport", 1238a6d42e7dSPeter Dunlap "State/FFP"); 1239a6d42e7dSPeter Dunlap } 1240a6d42e7dSPeter Dunlap mdb_printf("%?p %-6s %-10s %6d/%-6d\n", addr, conn_type, 1241a6d42e7dSPeter Dunlap (ic.ic_transport_type == 1242a6d42e7dSPeter Dunlap IDM_TRANSPORT_TYPE_ISER) ? "ISER_IB" : 1243a6d42e7dSPeter Dunlap (ic.ic_transport_type == 1244a6d42e7dSPeter Dunlap IDM_TRANSPORT_TYPE_SOCKETS) ? "SOCKETS" : 1245a6d42e7dSPeter Dunlap "N/A", 1246a6d42e7dSPeter Dunlap ic.ic_state, ic.ic_ffp); 1247a6d42e7dSPeter Dunlap if (idc->u.child.idc_print_ip) { 1248a6d42e7dSPeter Dunlap sa_to_str(&ic.ic_laddr, laddr); 1249a6d42e7dSPeter Dunlap sa_to_str(&ic.ic_raddr, raddr); 1250a6d42e7dSPeter Dunlap mdb_printf(" L%s R%s\n", 1251a6d42e7dSPeter Dunlap laddr, raddr); 1252a6d42e7dSPeter Dunlap } 1253a6d42e7dSPeter Dunlap } 1254a6d42e7dSPeter Dunlap } 1255a6d42e7dSPeter Dunlap idc->idc_header = 0; 1256a6d42e7dSPeter Dunlap 1257a6d42e7dSPeter Dunlap idc->idc_verbose = 0; 1258a6d42e7dSPeter Dunlap 1259a6d42e7dSPeter Dunlap /* 1260a6d42e7dSPeter Dunlap * Print states if requested 1261a6d42e7dSPeter Dunlap */ 1262a6d42e7dSPeter Dunlap if (states) { 1263a6d42e7dSPeter Dunlap states_addr = addr + offsetof(idm_conn_t, ic_state_audit); 1264a6d42e7dSPeter Dunlap 1265a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1266a6d42e7dSPeter Dunlap mdb_printf("State History:\n"); 1267a6d42e7dSPeter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) 1268a6d42e7dSPeter Dunlap return (DCMD_ERR); 1269a6d42e7dSPeter Dunlap 1270a6d42e7dSPeter Dunlap /* Don't print state history for child objects */ 1271a6d42e7dSPeter Dunlap idc->u.child.idc_states = 0; 1272a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1273a6d42e7dSPeter Dunlap } 1274a6d42e7dSPeter Dunlap 1275a6d42e7dSPeter Dunlap /* 1276a6d42e7dSPeter Dunlap * Print refcnt audit data if requested 1277a6d42e7dSPeter Dunlap */ 1278a6d42e7dSPeter Dunlap if (rc_audit) { 1279a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1280a6d42e7dSPeter Dunlap mdb_printf("Reference History:\n"); 1281a6d42e7dSPeter Dunlap rc_addr = addr + offsetof(idm_conn_t, ic_refcnt); 1282a6d42e7dSPeter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) 1283a6d42e7dSPeter Dunlap return (DCMD_ERR); 1284a6d42e7dSPeter Dunlap 1285a6d42e7dSPeter Dunlap /* Don't print audit data for child objects */ 1286a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = 0; 1287a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1288a6d42e7dSPeter Dunlap } 1289a6d42e7dSPeter Dunlap 1290a6d42e7dSPeter Dunlap task_idx = 0; 1291a6d42e7dSPeter Dunlap 1292a6d42e7dSPeter Dunlap /* Any child objects to walk? */ 1293a6d42e7dSPeter Dunlap if (idc->u.child.idc_task || idc->u.child.idc_buffer) { 1294a6d42e7dSPeter Dunlap idc->idc_header = 1; 1295a6d42e7dSPeter Dunlap while (task_idx < IDM_TASKIDS_MAX) { 1296a6d42e7dSPeter Dunlap 1297a6d42e7dSPeter Dunlap /* 1298a6d42e7dSPeter Dunlap * Read the next idm_task_t 1299a6d42e7dSPeter Dunlap */ 1300a6d42e7dSPeter Dunlap 1301a6d42e7dSPeter Dunlap if (mdb_vread(&task_addr, sizeof (uintptr_t), 1302a6d42e7dSPeter Dunlap task_ptr) != sizeof (uintptr_t)) { 1303a6d42e7dSPeter Dunlap mdb_warn("Failed to read task pointer"); 1304a6d42e7dSPeter Dunlap return (DCMD_ERR); 1305a6d42e7dSPeter Dunlap } 1306a6d42e7dSPeter Dunlap 1307a6d42e7dSPeter Dunlap if (task_addr == NULL) { 1308a6d42e7dSPeter Dunlap task_ptr += sizeof (uintptr_t); 1309a6d42e7dSPeter Dunlap task_idx++; 1310a6d42e7dSPeter Dunlap continue; 1311a6d42e7dSPeter Dunlap } 1312a6d42e7dSPeter Dunlap 1313a6d42e7dSPeter Dunlap if (mdb_vread(&idt, sizeof (idm_task_t), task_addr) 1314a6d42e7dSPeter Dunlap != sizeof (idm_task_t)) { 1315a6d42e7dSPeter Dunlap mdb_warn("Failed to read task pointer"); 1316a6d42e7dSPeter Dunlap return (DCMD_ERR); 1317a6d42e7dSPeter Dunlap } 1318a6d42e7dSPeter Dunlap 1319a6d42e7dSPeter Dunlap if (((uintptr_t)idt.idt_ic == addr) && 1320a6d42e7dSPeter Dunlap (idt.idt_state != TASK_IDLE)) { 1321a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1322a6d42e7dSPeter Dunlap if (iscsi_i_task_impl(&idt, task_addr, idc) 1323a6d42e7dSPeter Dunlap == -1) { 1324a6d42e7dSPeter Dunlap mdb_warn("Failed to walk connection " 1325a6d42e7dSPeter Dunlap "task tree"); 1326a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1327a6d42e7dSPeter Dunlap return (DCMD_ERR); 1328a6d42e7dSPeter Dunlap } 1329a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1330a6d42e7dSPeter Dunlap } 1331a6d42e7dSPeter Dunlap 1332a6d42e7dSPeter Dunlap task_ptr += sizeof (uintptr_t); 1333a6d42e7dSPeter Dunlap task_idx++; 1334a6d42e7dSPeter Dunlap } 1335a6d42e7dSPeter Dunlap idc->idc_header = 0; 1336a6d42e7dSPeter Dunlap } 1337a6d42e7dSPeter Dunlap 1338a6d42e7dSPeter Dunlap idc->idc_verbose = verbose; 1339a6d42e7dSPeter Dunlap idc->u.child.idc_states = states; 1340a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = rc_audit; 1341a6d42e7dSPeter Dunlap 1342a6d42e7dSPeter Dunlap return (DCMD_OK); 1343a6d42e7dSPeter Dunlap } 1344a6d42e7dSPeter Dunlap 1345a6d42e7dSPeter Dunlap static void 1346a6d42e7dSPeter Dunlap iscsi_print_iscsit_conn_data(idm_conn_t *ic) 1347a6d42e7dSPeter Dunlap { 1348a6d42e7dSPeter Dunlap iscsit_conn_t ict; 1349a6d42e7dSPeter Dunlap char *csg; 1350a6d42e7dSPeter Dunlap char *nsg; 1351a6d42e7dSPeter Dunlap 1352a6d42e7dSPeter Dunlap iscsi_print_idm_conn_data(ic); 1353a6d42e7dSPeter Dunlap 1354a6d42e7dSPeter Dunlap if (mdb_vread(&ict, sizeof (iscsit_conn_t), 1355a6d42e7dSPeter Dunlap (uintptr_t)ic->ic_handle) != sizeof (iscsit_conn_t)) { 1356a6d42e7dSPeter Dunlap mdb_printf("**Failed to read conn private data\n"); 1357a6d42e7dSPeter Dunlap return; 1358a6d42e7dSPeter Dunlap } 1359a6d42e7dSPeter Dunlap 1360a6d42e7dSPeter Dunlap if (ict.ict_login_sm.icl_login_state != ILS_LOGIN_DONE) { 1361a6d42e7dSPeter Dunlap switch (ict.ict_login_sm.icl_login_csg) { 1362a6d42e7dSPeter Dunlap case ISCSI_SECURITY_NEGOTIATION_STAGE: 1363a6d42e7dSPeter Dunlap csg = "Security"; 1364a6d42e7dSPeter Dunlap break; 1365a6d42e7dSPeter Dunlap case ISCSI_OP_PARMS_NEGOTIATION_STAGE: 1366a6d42e7dSPeter Dunlap csg = "Operational"; 1367a6d42e7dSPeter Dunlap break; 1368a6d42e7dSPeter Dunlap case ISCSI_FULL_FEATURE_PHASE: 1369a6d42e7dSPeter Dunlap csg = "FFP"; 1370a6d42e7dSPeter Dunlap break; 1371a6d42e7dSPeter Dunlap default: 1372a6d42e7dSPeter Dunlap csg = "Unknown"; 1373a6d42e7dSPeter Dunlap } 1374a6d42e7dSPeter Dunlap switch (ict.ict_login_sm.icl_login_nsg) { 1375a6d42e7dSPeter Dunlap case ISCSI_SECURITY_NEGOTIATION_STAGE: 1376a6d42e7dSPeter Dunlap nsg = "Security"; 1377a6d42e7dSPeter Dunlap break; 1378a6d42e7dSPeter Dunlap case ISCSI_OP_PARMS_NEGOTIATION_STAGE: 1379a6d42e7dSPeter Dunlap nsg = "Operational"; 1380a6d42e7dSPeter Dunlap break; 1381a6d42e7dSPeter Dunlap case ISCSI_FULL_FEATURE_PHASE: 1382a6d42e7dSPeter Dunlap nsg = "FFP"; 1383a6d42e7dSPeter Dunlap break; 1384a6d42e7dSPeter Dunlap default: 1385a6d42e7dSPeter Dunlap nsg = "Unknown"; 1386a6d42e7dSPeter Dunlap } 1387a6d42e7dSPeter Dunlap mdb_printf("%20s: %d\n", "Login State", 1388a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_login_state); 1389a6d42e7dSPeter Dunlap mdb_printf("%20s: %d\n", "Login Last State", 1390a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_login_last_state); 1391a6d42e7dSPeter Dunlap mdb_printf("%20s: %s\n", "CSG", csg); 1392a6d42e7dSPeter Dunlap mdb_printf("%20s: %s\n", "NSG", nsg); 1393a6d42e7dSPeter Dunlap mdb_printf("%20s: %d\n", "Transit", 1394a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_login_transit >> 7); 1395a6d42e7dSPeter Dunlap mdb_printf("%20s: %p\n", "Request nvlist", 1396a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_request_nvlist); 1397a6d42e7dSPeter Dunlap mdb_printf("%20s: %p\n", "Response nvlist", 1398a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_response_nvlist); 1399a6d42e7dSPeter Dunlap mdb_printf("%20s: %p\n", "Negotiated nvlist", 1400a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_negotiated_values); 1401a6d42e7dSPeter Dunlap if (ict.ict_login_sm.icl_login_state == ILS_LOGIN_ERROR) { 1402a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%02x\n", "Error Class", 1403a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_login_resp_err_class); 1404a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%02x\n", "Error Detail", 1405a6d42e7dSPeter Dunlap ict.ict_login_sm.icl_login_resp_err_detail); 1406a6d42e7dSPeter Dunlap } 1407a6d42e7dSPeter Dunlap } 1408a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%04x\n", "CID", ict.ict_cid); 1409a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%08x\n", "StatSN", ict.ict_statsn); 1410a6d42e7dSPeter Dunlap } 1411a6d42e7dSPeter Dunlap 1412a6d42e7dSPeter Dunlap static void 1413a6d42e7dSPeter Dunlap iscsi_print_idm_conn_data(idm_conn_t *ic) 1414a6d42e7dSPeter Dunlap { 1415a6d42e7dSPeter Dunlap char laddr[PORTAL_STR_LEN]; 1416a6d42e7dSPeter Dunlap char raddr[PORTAL_STR_LEN]; 1417a6d42e7dSPeter Dunlap 1418a6d42e7dSPeter Dunlap sa_to_str(&ic->ic_laddr, laddr); 1419a6d42e7dSPeter Dunlap sa_to_str(&ic->ic_raddr, raddr); 1420a6d42e7dSPeter Dunlap 1421a6d42e7dSPeter Dunlap mdb_printf("%20s: %s\n", "Conn Type", 1422a6d42e7dSPeter Dunlap ((ic->ic_conn_type == CONN_TYPE_TGT) ? "Target" : 1423a6d42e7dSPeter Dunlap ((ic->ic_conn_type == CONN_TYPE_INI) ? "Initiator" : 1424a6d42e7dSPeter Dunlap "Unknown"))); 1425a6d42e7dSPeter Dunlap if (ic->ic_conn_type == CONN_TYPE_TGT) { 1426a6d42e7dSPeter Dunlap mdb_printf("%20s: %p\n", "Svc. Binding", 1427a6d42e7dSPeter Dunlap ic->ic_svc_binding); 1428a6d42e7dSPeter Dunlap } 1429a6d42e7dSPeter Dunlap mdb_printf("%20s: %s\n", "Transport", 1430a6d42e7dSPeter Dunlap (ic->ic_transport_type == IDM_TRANSPORT_TYPE_ISER) ? "ISER_IB" : 1431a6d42e7dSPeter Dunlap (ic->ic_transport_type == IDM_TRANSPORT_TYPE_SOCKETS) ? "SOCKETS" : 1432a6d42e7dSPeter Dunlap "N/A"); 1433a6d42e7dSPeter Dunlap 1434a6d42e7dSPeter Dunlap mdb_printf("%20s: %s\n", "Local IP", laddr); 1435a6d42e7dSPeter Dunlap mdb_printf("%20s: %s\n", "Remote IP", raddr); 1436a6d42e7dSPeter Dunlap mdb_printf("%20s: %d\n", "State", 1437a6d42e7dSPeter Dunlap ic->ic_state); 1438a6d42e7dSPeter Dunlap mdb_printf("%20s: %d\n", "Last State", 1439a6d42e7dSPeter Dunlap ic->ic_last_state); 1440a6d42e7dSPeter Dunlap mdb_printf("%20s: %d %s\n", "Refcount", 1441a6d42e7dSPeter Dunlap ic->ic_refcnt.ir_refcnt, 1442a6d42e7dSPeter Dunlap (ic->ic_refcnt.ir_waiting == REF_NOWAIT) ? "" : 1443a6d42e7dSPeter Dunlap ((ic->ic_refcnt.ir_waiting == REF_WAIT_SYNC) ? "REF_WAIT_SYNC" : 1444a6d42e7dSPeter Dunlap ((ic->ic_refcnt.ir_waiting == REF_WAIT_ASYNC) ? "REF_WAIT_ASYNC" : 1445a6d42e7dSPeter Dunlap "UNKNOWN"))); 1446a6d42e7dSPeter Dunlap } 1447a6d42e7dSPeter Dunlap 1448a6d42e7dSPeter Dunlap static int 1449a6d42e7dSPeter Dunlap iscsi_i_task_impl(idm_task_t *idt, uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 1450a6d42e7dSPeter Dunlap { 1451a6d42e7dSPeter Dunlap uintptr_t list_addr, rc_addr; 1452a6d42e7dSPeter Dunlap idm_conn_type_t conn_type; 1453a6d42e7dSPeter Dunlap int verbose, states, rc_audit; 1454a6d42e7dSPeter Dunlap 1455a6d42e7dSPeter Dunlap conn_type = idm_conn_type((uintptr_t)idt->idt_ic); 1456a6d42e7dSPeter Dunlap 1457a6d42e7dSPeter Dunlap verbose = idc->idc_verbose; 1458a6d42e7dSPeter Dunlap states = idc->u.child.idc_states; 1459a6d42e7dSPeter Dunlap rc_audit = idc->u.child.idc_rc_audit; 1460a6d42e7dSPeter Dunlap 1461a6d42e7dSPeter Dunlap if (idc->u.child.idc_task) { 1462a6d42e7dSPeter Dunlap if (verbose) { 1463a6d42e7dSPeter Dunlap mdb_printf("Task %p\n", addr); 1464a6d42e7dSPeter Dunlap (void) mdb_inc_indent(2); 1465a6d42e7dSPeter Dunlap if (conn_type == CONN_TYPE_TGT) { 1466a6d42e7dSPeter Dunlap iscsi_print_iscsit_task_data(idt); 1467a6d42e7dSPeter Dunlap } 1468a6d42e7dSPeter Dunlap (void) mdb_dec_indent(2); 1469a6d42e7dSPeter Dunlap } else { 1470a6d42e7dSPeter Dunlap /* Print task data */ 1471a6d42e7dSPeter Dunlap if (idc->idc_header) { 1472a6d42e7dSPeter Dunlap mdb_printf( 1473bf604c64SPeter Dunlap "%<u>%-?s %-16s %-4s %-8s %-8s%</u>\n", 1474bf604c64SPeter Dunlap "Tasks:", "State", "Ref", 1475a6d42e7dSPeter Dunlap (conn_type == CONN_TYPE_TGT ? "TTT" : 1476a6d42e7dSPeter Dunlap (conn_type == CONN_TYPE_INI ? "ITT" : 1477a6d42e7dSPeter Dunlap "TT")), "Handle"); 1478a6d42e7dSPeter Dunlap } 1479bf604c64SPeter Dunlap mdb_printf("%?p %-16s %04x %08x %08x\n", addr, 1480bf604c64SPeter Dunlap idm_ts_name[idt->idt_state], 1481bf604c64SPeter Dunlap idt->idt_refcnt.ir_refcnt, 1482bf604c64SPeter Dunlap idt->idt_tt, idt->idt_client_handle); 1483a6d42e7dSPeter Dunlap } 1484a6d42e7dSPeter Dunlap } 1485a6d42e7dSPeter Dunlap idc->idc_header = 0; 1486a6d42e7dSPeter Dunlap idc->idc_verbose = 0; 1487a6d42e7dSPeter Dunlap 1488a6d42e7dSPeter Dunlap /* 1489a6d42e7dSPeter Dunlap * Print states if requested 1490a6d42e7dSPeter Dunlap */ 1491a6d42e7dSPeter Dunlap #if 0 1492a6d42e7dSPeter Dunlap if (states) { 1493a6d42e7dSPeter Dunlap states_addr = addr + offsetof(idm_task_t, idt_state_audit); 1494a6d42e7dSPeter Dunlap 1495a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1496a6d42e7dSPeter Dunlap mdb_printf("State History:\n"); 1497a6d42e7dSPeter Dunlap if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) 1498a6d42e7dSPeter Dunlap return (DCMD_ERR); 1499a6d42e7dSPeter Dunlap 1500a6d42e7dSPeter Dunlap /* Don't print state history for child objects */ 1501a6d42e7dSPeter Dunlap idc->u.child.idc_states = 0; 1502a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1503a6d42e7dSPeter Dunlap } 1504a6d42e7dSPeter Dunlap #endif 1505a6d42e7dSPeter Dunlap 1506a6d42e7dSPeter Dunlap /* 1507a6d42e7dSPeter Dunlap * Print refcnt audit data if requested 1508a6d42e7dSPeter Dunlap */ 1509a6d42e7dSPeter Dunlap if (rc_audit) { 1510a6d42e7dSPeter Dunlap (void) mdb_inc_indent(4); 1511a6d42e7dSPeter Dunlap mdb_printf("Reference History:\n"); 1512a6d42e7dSPeter Dunlap rc_addr = addr + 1513a6d42e7dSPeter Dunlap offsetof(idm_task_t, idt_refcnt); 1514a6d42e7dSPeter Dunlap if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) 1515a6d42e7dSPeter Dunlap return (DCMD_ERR); 1516a6d42e7dSPeter Dunlap 1517a6d42e7dSPeter Dunlap /* Don't print audit data for child objects */ 1518a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = 0; 1519a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1520a6d42e7dSPeter Dunlap } 1521a6d42e7dSPeter Dunlap 1522a6d42e7dSPeter Dunlap 1523a6d42e7dSPeter Dunlap /* Buffers are leaf objects */ 1524a6d42e7dSPeter Dunlap if (idc->u.child.idc_buffer) { 1525a6d42e7dSPeter Dunlap /* Walk in buffer list */ 1526a6d42e7dSPeter Dunlap (void) mdb_inc_indent(2); 1527a6d42e7dSPeter Dunlap mdb_printf("In buffers:\n"); 1528a6d42e7dSPeter Dunlap idc->idc_header = 1; 1529a6d42e7dSPeter Dunlap (void) mdb_inc_indent(2); 1530a6d42e7dSPeter Dunlap list_addr = addr + offsetof(idm_task_t, idt_inbufv); 1531a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_buffer_walk_cb, idc, list_addr) == 1532a6d42e7dSPeter Dunlap -1) { 1533a6d42e7dSPeter Dunlap mdb_warn("list walk failed for task in buffers"); 1534a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1535a6d42e7dSPeter Dunlap return (DCMD_ERR); 1536a6d42e7dSPeter Dunlap } 1537a6d42e7dSPeter Dunlap (void) mdb_dec_indent(2); 1538a6d42e7dSPeter Dunlap /* Walk out buffer list */ 1539a6d42e7dSPeter Dunlap mdb_printf("Out buffers:\n"); 1540a6d42e7dSPeter Dunlap idc->idc_header = 1; 1541a6d42e7dSPeter Dunlap (void) mdb_inc_indent(2); 1542a6d42e7dSPeter Dunlap list_addr = addr + offsetof(idm_task_t, idt_outbufv); 1543a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_buffer_walk_cb, idc, list_addr) == 1544a6d42e7dSPeter Dunlap -1) { 1545a6d42e7dSPeter Dunlap mdb_warn("list walk failed for task out buffers\n"); 1546a6d42e7dSPeter Dunlap (void) mdb_dec_indent(2); 1547a6d42e7dSPeter Dunlap return (DCMD_ERR); 1548a6d42e7dSPeter Dunlap } 1549a6d42e7dSPeter Dunlap (void) mdb_dec_indent(4); 1550a6d42e7dSPeter Dunlap } 1551a6d42e7dSPeter Dunlap 1552a6d42e7dSPeter Dunlap idc->idc_verbose = verbose; 1553a6d42e7dSPeter Dunlap idc->u.child.idc_states = states; 1554a6d42e7dSPeter Dunlap idc->u.child.idc_rc_audit = rc_audit; 1555a6d42e7dSPeter Dunlap 1556a6d42e7dSPeter Dunlap return (DCMD_OK); 1557a6d42e7dSPeter Dunlap } 1558a6d42e7dSPeter Dunlap 1559a6d42e7dSPeter Dunlap static int 1560a6d42e7dSPeter Dunlap iscsi_task_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 1561a6d42e7dSPeter Dunlap { 1562a6d42e7dSPeter Dunlap idm_task_t idt; 1563a6d42e7dSPeter Dunlap 1564a6d42e7dSPeter Dunlap /* 1565a6d42e7dSPeter Dunlap * Read idm_conn_t 1566a6d42e7dSPeter Dunlap */ 1567a6d42e7dSPeter Dunlap if (mdb_vread(&idt, sizeof (idm_task_t), addr) != sizeof (idm_task_t)) { 1568a6d42e7dSPeter Dunlap return (DCMD_ERR); 1569a6d42e7dSPeter Dunlap } 1570a6d42e7dSPeter Dunlap 1571a6d42e7dSPeter Dunlap return (iscsi_i_task_impl(&idt, addr, idc)); 1572a6d42e7dSPeter Dunlap } 1573a6d42e7dSPeter Dunlap 1574a6d42e7dSPeter Dunlap #define ISCSI_CDB_INDENT 16 1575a6d42e7dSPeter Dunlap 1576a6d42e7dSPeter Dunlap static void 1577a6d42e7dSPeter Dunlap iscsi_print_iscsit_task_data(idm_task_t *idt) 1578a6d42e7dSPeter Dunlap { 1579a6d42e7dSPeter Dunlap iscsit_task_t itask; 1580a6d42e7dSPeter Dunlap boolean_t good_scsi_task = B_TRUE; 1581a6d42e7dSPeter Dunlap scsi_task_t scsi_task; 1582a6d42e7dSPeter Dunlap 1583a6d42e7dSPeter Dunlap if (mdb_vread(&itask, sizeof (iscsit_task_t), 1584a6d42e7dSPeter Dunlap (uintptr_t)idt->idt_private) != sizeof (iscsit_task_t)) { 1585a6d42e7dSPeter Dunlap mdb_printf("**Failed to read idt_private data\n"); 1586a6d42e7dSPeter Dunlap return; 1587a6d42e7dSPeter Dunlap } 1588a6d42e7dSPeter Dunlap 1589a6d42e7dSPeter Dunlap if (mdb_vread(&scsi_task, sizeof (scsi_task_t), 1590a6d42e7dSPeter Dunlap (uintptr_t)itask.it_stmf_task) != sizeof (scsi_task_t)) { 1591a6d42e7dSPeter Dunlap good_scsi_task = B_FALSE; 1592a6d42e7dSPeter Dunlap } 1593a6d42e7dSPeter Dunlap 1594bf604c64SPeter Dunlap mdb_printf("%20s: %s(%d)\n", "State", 1595bf604c64SPeter Dunlap idt->idt_state > TASK_MAX_STATE ? 1596bf604c64SPeter Dunlap "UNKNOWN" : idm_ts_name[idt->idt_state], 1597bf604c64SPeter Dunlap idt->idt_state); 1598bf604c64SPeter Dunlap mdb_printf("%20s: %d/%d\n", "STMF abort/IDM aborted", 1599bf604c64SPeter Dunlap itask.it_stmf_abort, itask.it_aborted); 1600a6d42e7dSPeter Dunlap mdb_printf("%20s: %p/%p/%p%s\n", 1601a6d42e7dSPeter Dunlap "iscsit/STMF/LU", idt->idt_private, 1602a6d42e7dSPeter Dunlap itask.it_stmf_task, good_scsi_task ? scsi_task.task_lu_private : 0, 1603a6d42e7dSPeter Dunlap good_scsi_task ? "" : "**"); 1604a6d42e7dSPeter Dunlap if (good_scsi_task) { 1605a6d42e7dSPeter Dunlap mdb_printf("%20s: %08x/%08x\n", "ITT/TTT", 1606a6d42e7dSPeter Dunlap itask.it_itt, itask.it_ttt); 1607a6d42e7dSPeter Dunlap mdb_printf("%20s: %08x\n", "CmdSN", 1608a6d42e7dSPeter Dunlap itask.it_cmdsn); 1609a6d42e7dSPeter Dunlap mdb_printf("%20s: %02x %02x %02x %02x %02x %02x %02x %02x\n", 1610a6d42e7dSPeter Dunlap "LU number", 1611a6d42e7dSPeter Dunlap scsi_task.task_lun_no[0], scsi_task.task_lun_no[1], 1612a6d42e7dSPeter Dunlap scsi_task.task_lun_no[2], scsi_task.task_lun_no[3], 1613a6d42e7dSPeter Dunlap scsi_task.task_lun_no[4], scsi_task.task_lun_no[5], 1614a6d42e7dSPeter Dunlap scsi_task.task_lun_no[6], scsi_task.task_lun_no[7]); 1615bf604c64SPeter Dunlap mdb_printf(" CDB (%d bytes):\n", 1616a6d42e7dSPeter Dunlap scsi_task.task_cdb_length); 1617a6d42e7dSPeter Dunlap (void) mdb_inc_indent(ISCSI_CDB_INDENT); 1618a6d42e7dSPeter Dunlap if (mdb_dumpptr((uintptr_t)scsi_task.task_cdb, 1619a6d42e7dSPeter Dunlap scsi_task.task_cdb_length, 1620a6d42e7dSPeter Dunlap MDB_DUMP_RELATIVE | MDB_DUMP_TRIM | 1621a6d42e7dSPeter Dunlap MDB_DUMP_GROUP(1), 1622a6d42e7dSPeter Dunlap (mdb_dumpptr_cb_t)mdb_vread, NULL)) { 1623a6d42e7dSPeter Dunlap mdb_printf("** Invalid CDB addr (%p)\n", 1624a6d42e7dSPeter Dunlap scsi_task.task_cdb); 1625a6d42e7dSPeter Dunlap } 1626a6d42e7dSPeter Dunlap (void) mdb_dec_indent(ISCSI_CDB_INDENT); 1627a6d42e7dSPeter Dunlap mdb_printf("%20s: %d/%d\n", "STMF cur/max bufs", 1628a6d42e7dSPeter Dunlap scsi_task.task_cur_nbufs, 1629a6d42e7dSPeter Dunlap scsi_task.task_max_nbufs); 1630a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%08x/0x%08x/0x%08x\n", "Bytes Exp/Cmd/Done", 1631a6d42e7dSPeter Dunlap scsi_task.task_expected_xfer_length, 1632a6d42e7dSPeter Dunlap scsi_task.task_cmd_xfer_length, 1633a6d42e7dSPeter Dunlap scsi_task.task_nbytes_transferred); 1634a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%x/0x%x\n", "TX-ini start/done", 1635a6d42e7dSPeter Dunlap idt->idt_tx_to_ini_start, 1636a6d42e7dSPeter Dunlap idt->idt_tx_to_ini_done); 1637a6d42e7dSPeter Dunlap mdb_printf("%20s: 0x%x/0x%x\n", "RX-ini start/done", 1638a6d42e7dSPeter Dunlap idt->idt_rx_from_ini_start, 1639a6d42e7dSPeter Dunlap idt->idt_rx_from_ini_done); 1640a6d42e7dSPeter Dunlap } 1641a6d42e7dSPeter Dunlap } 1642a6d42e7dSPeter Dunlap 1643a6d42e7dSPeter Dunlap static int 1644a6d42e7dSPeter Dunlap iscsi_buffer_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) 1645a6d42e7dSPeter Dunlap { 1646a6d42e7dSPeter Dunlap idm_buf_t idb; 1647a6d42e7dSPeter Dunlap 1648a6d42e7dSPeter Dunlap /* 1649a6d42e7dSPeter Dunlap * Read idm_buf_t 1650a6d42e7dSPeter Dunlap */ 1651a6d42e7dSPeter Dunlap if (mdb_vread(&idb, sizeof (idm_buf_t), addr) != sizeof (idm_buf_t)) { 1652a6d42e7dSPeter Dunlap return (DCMD_ERR); 1653a6d42e7dSPeter Dunlap } 1654a6d42e7dSPeter Dunlap 1655a6d42e7dSPeter Dunlap 1656a6d42e7dSPeter Dunlap if (idc->idc_header) { 1657a6d42e7dSPeter Dunlap mdb_printf("%<u>%-?s %?s/%-8s %8s %8s %8s%</u>\n", 1658a6d42e7dSPeter Dunlap "idm_buf_t", "Mem Rgn", "Length", 1659a6d42e7dSPeter Dunlap "Rel Off", "Xfer Len", "Exp. Off"); 1660a6d42e7dSPeter Dunlap } 1661a6d42e7dSPeter Dunlap idc->idc_header = 0; 1662a6d42e7dSPeter Dunlap 1663a6d42e7dSPeter Dunlap /* Print buffer data */ 1664a6d42e7dSPeter Dunlap mdb_printf("%?p %?p/%08x %8x %8x %08x\n", addr, 1665a6d42e7dSPeter Dunlap idb.idb_buf, idb.idb_buflen, 1666a6d42e7dSPeter Dunlap idb.idb_bufoffset, idb.idb_xfer_len, 1667a6d42e7dSPeter Dunlap idb.idb_exp_offset); 1668a6d42e7dSPeter Dunlap 1669a6d42e7dSPeter Dunlap 1670a6d42e7dSPeter Dunlap /* Buffers are leaf objects */ 1671a6d42e7dSPeter Dunlap 1672a6d42e7dSPeter Dunlap return (DCMD_OK); 1673a6d42e7dSPeter Dunlap } 1674a6d42e7dSPeter Dunlap 1675a6d42e7dSPeter Dunlap static int 1676a6d42e7dSPeter Dunlap iscsi_refcnt_impl(uintptr_t addr) 1677a6d42e7dSPeter Dunlap { 1678a6d42e7dSPeter Dunlap idm_refcnt_t refcnt; 1679a6d42e7dSPeter Dunlap refcnt_audit_buf_t *anb; 1680a6d42e7dSPeter Dunlap int ctr; 1681a6d42e7dSPeter Dunlap 1682a6d42e7dSPeter Dunlap /* 1683a6d42e7dSPeter Dunlap * Print refcnt info 1684a6d42e7dSPeter Dunlap */ 1685a6d42e7dSPeter Dunlap if (mdb_vread(&refcnt, sizeof (idm_refcnt_t), addr) != 1686a6d42e7dSPeter Dunlap sizeof (idm_refcnt_t)) { 1687a6d42e7dSPeter Dunlap return (DCMD_ERR); 1688a6d42e7dSPeter Dunlap } 1689a6d42e7dSPeter Dunlap 1690a6d42e7dSPeter Dunlap anb = &refcnt.ir_audit_buf; 1691a6d42e7dSPeter Dunlap 1692a6d42e7dSPeter Dunlap ctr = anb->anb_max_index + 1; 1693a6d42e7dSPeter Dunlap anb->anb_index--; 1694a6d42e7dSPeter Dunlap anb->anb_index &= anb->anb_max_index; 1695a6d42e7dSPeter Dunlap 1696a6d42e7dSPeter Dunlap while (ctr) { 1697a6d42e7dSPeter Dunlap refcnt_audit_record_t *anr; 1698a6d42e7dSPeter Dunlap 1699a6d42e7dSPeter Dunlap anr = anb->anb_records + anb->anb_index; 1700a6d42e7dSPeter Dunlap 1701a6d42e7dSPeter Dunlap if (anr->anr_depth) { 1702a6d42e7dSPeter Dunlap char c[MDB_SYM_NAMLEN]; 1703a6d42e7dSPeter Dunlap GElf_Sym sym; 1704a6d42e7dSPeter Dunlap int i; 1705a6d42e7dSPeter Dunlap 1706a6d42e7dSPeter Dunlap mdb_printf("\nRefCnt: %u\t", anr->anr_refcnt); 1707a6d42e7dSPeter Dunlap 1708a6d42e7dSPeter Dunlap for (i = 0; i < anr->anr_depth; i++) { 1709a6d42e7dSPeter Dunlap if (mdb_lookup_by_addr(anr->anr_stack[i], 1710a6d42e7dSPeter Dunlap MDB_SYM_FUZZY, c, sizeof (c), 1711a6d42e7dSPeter Dunlap &sym) == -1) { 1712a6d42e7dSPeter Dunlap continue; 1713a6d42e7dSPeter Dunlap } 1714a6d42e7dSPeter Dunlap mdb_printf("%s+0x%1x", c, 1715a6d42e7dSPeter Dunlap anr->anr_stack[i] - 1716a6d42e7dSPeter Dunlap (uintptr_t)sym.st_value); 1717a6d42e7dSPeter Dunlap ++i; 1718a6d42e7dSPeter Dunlap break; 1719a6d42e7dSPeter Dunlap } 1720a6d42e7dSPeter Dunlap 1721a6d42e7dSPeter Dunlap while (i < anr->anr_depth) { 1722a6d42e7dSPeter Dunlap if (mdb_lookup_by_addr(anr->anr_stack[i], 1723a6d42e7dSPeter Dunlap MDB_SYM_FUZZY, c, sizeof (c), 1724a6d42e7dSPeter Dunlap &sym) == -1) { 1725a6d42e7dSPeter Dunlap ++i; 1726a6d42e7dSPeter Dunlap continue; 1727a6d42e7dSPeter Dunlap } 1728a6d42e7dSPeter Dunlap mdb_printf("\n\t\t%s+0x%1x", c, 1729a6d42e7dSPeter Dunlap anr->anr_stack[i] - 1730a6d42e7dSPeter Dunlap (uintptr_t)sym.st_value); 1731a6d42e7dSPeter Dunlap ++i; 1732a6d42e7dSPeter Dunlap } 1733a6d42e7dSPeter Dunlap mdb_printf("\n"); 1734a6d42e7dSPeter Dunlap } 1735a6d42e7dSPeter Dunlap anb->anb_index--; 1736a6d42e7dSPeter Dunlap anb->anb_index &= anb->anb_max_index; 1737a6d42e7dSPeter Dunlap ctr--; 1738a6d42e7dSPeter Dunlap } 1739a6d42e7dSPeter Dunlap 1740a6d42e7dSPeter Dunlap return (DCMD_OK); 1741a6d42e7dSPeter Dunlap } 1742a6d42e7dSPeter Dunlap 1743a6d42e7dSPeter Dunlap static int 1744a6d42e7dSPeter Dunlap iscsi_sm_audit_impl(uintptr_t addr) 1745a6d42e7dSPeter Dunlap { 1746a6d42e7dSPeter Dunlap sm_audit_buf_t audit_buf; 1747a6d42e7dSPeter Dunlap int ctr; 1748a6d42e7dSPeter Dunlap const char *event_name; 1749a6d42e7dSPeter Dunlap const char *state_name; 1750a6d42e7dSPeter Dunlap const char *new_state_name; 1751a6d42e7dSPeter Dunlap char ts_string[40]; 1752a6d42e7dSPeter Dunlap /* 1753a6d42e7dSPeter Dunlap * Print refcnt info 1754a6d42e7dSPeter Dunlap */ 1755a6d42e7dSPeter Dunlap if (mdb_vread(&audit_buf, sizeof (sm_audit_buf_t), addr) != 1756a6d42e7dSPeter Dunlap sizeof (sm_audit_buf_t)) { 1757a6d42e7dSPeter Dunlap return (DCMD_ERR); 1758a6d42e7dSPeter Dunlap } 1759a6d42e7dSPeter Dunlap 1760a6d42e7dSPeter Dunlap ctr = audit_buf.sab_max_index + 1; 1761a6d42e7dSPeter Dunlap audit_buf.sab_index++; 1762a6d42e7dSPeter Dunlap audit_buf.sab_index &= audit_buf.sab_max_index; 1763a6d42e7dSPeter Dunlap 1764a6d42e7dSPeter Dunlap while (ctr) { 1765a6d42e7dSPeter Dunlap sm_audit_record_t *sar; 1766a6d42e7dSPeter Dunlap 1767a6d42e7dSPeter Dunlap sar = audit_buf.sab_records + audit_buf.sab_index; 1768a6d42e7dSPeter Dunlap 1769a6d42e7dSPeter Dunlap iscsi_format_timestamp(ts_string, 40, &sar->sar_timestamp); 1770a6d42e7dSPeter Dunlap 1771a6d42e7dSPeter Dunlap switch (sar->sar_type) { 1772a6d42e7dSPeter Dunlap case SAR_STATE_EVENT: 1773a6d42e7dSPeter Dunlap switch (sar->sar_sm_type) { 1774a6d42e7dSPeter Dunlap case SAS_IDM_CONN: 1775a6d42e7dSPeter Dunlap state_name = 1776a6d42e7dSPeter Dunlap iscsi_idm_conn_state(sar->sar_state); 1777a6d42e7dSPeter Dunlap event_name = 1778a6d42e7dSPeter Dunlap iscsi_idm_conn_event(sar->sar_event); 1779a6d42e7dSPeter Dunlap break; 1780a6d42e7dSPeter Dunlap case SAS_ISCSIT_TGT: 1781a6d42e7dSPeter Dunlap state_name = 1782a6d42e7dSPeter Dunlap iscsi_iscsit_tgt_state(sar->sar_state); 1783a6d42e7dSPeter Dunlap event_name = 1784a6d42e7dSPeter Dunlap iscsi_iscsit_tgt_event(sar->sar_event); 1785a6d42e7dSPeter Dunlap break; 1786a6d42e7dSPeter Dunlap case SAS_ISCSIT_SESS: 1787a6d42e7dSPeter Dunlap state_name = 1788a6d42e7dSPeter Dunlap iscsi_iscsit_sess_state(sar->sar_state); 1789a6d42e7dSPeter Dunlap event_name = 1790a6d42e7dSPeter Dunlap iscsi_iscsit_sess_event(sar->sar_event); 1791a6d42e7dSPeter Dunlap break; 1792a6d42e7dSPeter Dunlap case SAS_ISCSIT_LOGIN: 1793a6d42e7dSPeter Dunlap state_name = 1794a6d42e7dSPeter Dunlap iscsi_iscsit_login_state(sar->sar_state); 1795a6d42e7dSPeter Dunlap event_name = 1796a6d42e7dSPeter Dunlap iscsi_iscsit_login_event(sar->sar_event); 1797a6d42e7dSPeter Dunlap break; 1798*30e7468fSPeter Dunlap case SAS_ISCSI_CMD: 1799*30e7468fSPeter Dunlap state_name = 1800*30e7468fSPeter Dunlap iscsi_iscsi_cmd_state(sar->sar_state); 1801*30e7468fSPeter Dunlap event_name= 1802*30e7468fSPeter Dunlap iscsi_iscsi_cmd_event(sar->sar_event); 1803*30e7468fSPeter Dunlap break; 1804*30e7468fSPeter Dunlap case SAS_ISCSI_SESS: 1805*30e7468fSPeter Dunlap state_name = 1806*30e7468fSPeter Dunlap iscsi_iscsi_sess_state(sar->sar_state); 1807*30e7468fSPeter Dunlap event_name= 1808*30e7468fSPeter Dunlap iscsi_iscsi_sess_event(sar->sar_event); 1809*30e7468fSPeter Dunlap break; 1810a6d42e7dSPeter Dunlap default: 1811a6d42e7dSPeter Dunlap state_name = event_name = "N/A"; 1812a6d42e7dSPeter Dunlap break; 1813a6d42e7dSPeter Dunlap } 1814a6d42e7dSPeter Dunlap mdb_printf("%s|%s (%d)\n\t%9s %s (%d) %p\n", 1815a6d42e7dSPeter Dunlap ts_string, state_name, sar->sar_state, 1816a6d42e7dSPeter Dunlap "Event", event_name, 1817a6d42e7dSPeter Dunlap sar->sar_event, sar->sar_event_info); 1818a6d42e7dSPeter Dunlap 1819a6d42e7dSPeter Dunlap break; 1820a6d42e7dSPeter Dunlap case SAR_STATE_CHANGE: 1821a6d42e7dSPeter Dunlap switch (sar->sar_sm_type) { 1822a6d42e7dSPeter Dunlap case SAS_IDM_CONN: 1823a6d42e7dSPeter Dunlap state_name = 1824a6d42e7dSPeter Dunlap iscsi_idm_conn_state(sar->sar_state); 1825a6d42e7dSPeter Dunlap new_state_name = 1826a6d42e7dSPeter Dunlap iscsi_idm_conn_state(sar->sar_new_state); 1827a6d42e7dSPeter Dunlap break; 1828a6d42e7dSPeter Dunlap case SAS_IDM_TASK: 1829a6d42e7dSPeter Dunlap state_name = 1830a6d42e7dSPeter Dunlap iscsi_idm_task_state(sar->sar_state); 1831a6d42e7dSPeter Dunlap new_state_name = 1832a6d42e7dSPeter Dunlap iscsi_idm_task_state(sar->sar_new_state); 1833a6d42e7dSPeter Dunlap break; 1834a6d42e7dSPeter Dunlap case SAS_ISCSIT_TGT: 1835a6d42e7dSPeter Dunlap state_name = 1836a6d42e7dSPeter Dunlap iscsi_iscsit_tgt_state(sar->sar_state); 1837a6d42e7dSPeter Dunlap new_state_name = 1838a6d42e7dSPeter Dunlap iscsi_iscsit_tgt_state(sar->sar_new_state); 1839a6d42e7dSPeter Dunlap break; 1840a6d42e7dSPeter Dunlap case SAS_ISCSIT_SESS: 1841a6d42e7dSPeter Dunlap state_name = 1842a6d42e7dSPeter Dunlap iscsi_iscsit_sess_state(sar->sar_state); 1843a6d42e7dSPeter Dunlap new_state_name = 1844a6d42e7dSPeter Dunlap iscsi_iscsit_sess_state(sar->sar_new_state); 1845a6d42e7dSPeter Dunlap break; 1846a6d42e7dSPeter Dunlap case SAS_ISCSIT_LOGIN: 1847a6d42e7dSPeter Dunlap state_name = 1848a6d42e7dSPeter Dunlap iscsi_iscsit_login_state(sar->sar_state); 1849a6d42e7dSPeter Dunlap new_state_name = 1850a6d42e7dSPeter Dunlap iscsi_iscsit_login_state( 1851a6d42e7dSPeter Dunlap sar->sar_new_state); 1852a6d42e7dSPeter Dunlap break; 1853*30e7468fSPeter Dunlap case SAS_ISCSI_CMD: 1854*30e7468fSPeter Dunlap state_name = 1855*30e7468fSPeter Dunlap iscsi_iscsi_cmd_state(sar->sar_state); 1856*30e7468fSPeter Dunlap new_state_name= 1857*30e7468fSPeter Dunlap iscsi_iscsi_cmd_state(sar->sar_new_state); 1858*30e7468fSPeter Dunlap break; 1859*30e7468fSPeter Dunlap case SAS_ISCSI_SESS: 1860*30e7468fSPeter Dunlap state_name = 1861*30e7468fSPeter Dunlap iscsi_iscsi_sess_state(sar->sar_state); 1862*30e7468fSPeter Dunlap new_state_name= 1863*30e7468fSPeter Dunlap iscsi_iscsi_sess_state(sar->sar_new_state); 1864*30e7468fSPeter Dunlap break; 1865*30e7468fSPeter Dunlap case SAS_ISCSI_CONN: 1866*30e7468fSPeter Dunlap state_name = 1867*30e7468fSPeter Dunlap iscsi_iscsi_conn_state(sar->sar_state); 1868*30e7468fSPeter Dunlap new_state_name= 1869*30e7468fSPeter Dunlap iscsi_iscsi_conn_state(sar->sar_new_state); 1870*30e7468fSPeter Dunlap break; 1871*30e7468fSPeter Dunlap case SAS_ISCSI_LOGIN: 1872*30e7468fSPeter Dunlap state_name = 1873*30e7468fSPeter Dunlap iscsi_iscsi_login_state(sar->sar_state); 1874*30e7468fSPeter Dunlap new_state_name= 1875*30e7468fSPeter Dunlap iscsi_iscsi_login_state(sar->sar_new_state); 1876*30e7468fSPeter Dunlap break; 1877a6d42e7dSPeter Dunlap default: 1878a6d42e7dSPeter Dunlap break; 1879a6d42e7dSPeter Dunlap } 1880a6d42e7dSPeter Dunlap mdb_printf("%s|%s (%d)\n\t%9s %s (%d)\n", 1881a6d42e7dSPeter Dunlap ts_string, state_name, sar->sar_state, 1882a6d42e7dSPeter Dunlap "New State", new_state_name, sar->sar_new_state); 1883a6d42e7dSPeter Dunlap default: 1884a6d42e7dSPeter Dunlap state_name = new_state_name = "N/A"; 1885a6d42e7dSPeter Dunlap break; 1886a6d42e7dSPeter Dunlap } 1887a6d42e7dSPeter Dunlap 1888a6d42e7dSPeter Dunlap audit_buf.sab_index++; 1889a6d42e7dSPeter Dunlap audit_buf.sab_index &= audit_buf.sab_max_index; 1890a6d42e7dSPeter Dunlap ctr--; 1891a6d42e7dSPeter Dunlap } 1892a6d42e7dSPeter Dunlap 1893a6d42e7dSPeter Dunlap return (DCMD_OK); 1894a6d42e7dSPeter Dunlap } 1895a6d42e7dSPeter Dunlap 1896a6d42e7dSPeter Dunlap static const char * 1897*30e7468fSPeter Dunlap iscsi_idm_conn_event(unsigned int event) 1898a6d42e7dSPeter Dunlap { 1899*30e7468fSPeter Dunlap return ((event < CE_MAX_EVENT) ? idm_ce_name[event] : "N/A"); 1900a6d42e7dSPeter Dunlap } 1901a6d42e7dSPeter Dunlap 1902a6d42e7dSPeter Dunlap static const char * 1903*30e7468fSPeter Dunlap iscsi_iscsit_tgt_event(unsigned int event) 1904a6d42e7dSPeter Dunlap { 1905*30e7468fSPeter Dunlap return ((event < TE_MAX_EVENT) ? iscsit_te_name[event] : "N/A"); 1906a6d42e7dSPeter Dunlap } 1907a6d42e7dSPeter Dunlap 1908a6d42e7dSPeter Dunlap static const char * 1909*30e7468fSPeter Dunlap iscsi_iscsit_sess_event(unsigned int event) 1910a6d42e7dSPeter Dunlap { 1911*30e7468fSPeter Dunlap return ((event < SE_MAX_EVENT) ? iscsit_se_name[event] : "N/A"); 1912a6d42e7dSPeter Dunlap } 1913a6d42e7dSPeter Dunlap 1914a6d42e7dSPeter Dunlap static const char * 1915*30e7468fSPeter Dunlap iscsi_iscsit_login_event(unsigned int event) 1916a6d42e7dSPeter Dunlap { 1917*30e7468fSPeter Dunlap return ((event < ILE_MAX_EVENT) ? iscsit_ile_name[event] : "N/A"); 1918*30e7468fSPeter Dunlap } 1919a6d42e7dSPeter Dunlap 1920*30e7468fSPeter Dunlap static const char * 1921*30e7468fSPeter Dunlap iscsi_iscsi_cmd_event(unsigned int event) 1922*30e7468fSPeter Dunlap { 1923*30e7468fSPeter Dunlap return ((event < ISCSI_CMD_EVENT_MAX) ? 1924*30e7468fSPeter Dunlap iscsi_cmd_event_names[event] : "N/A"); 1925a6d42e7dSPeter Dunlap } 1926a6d42e7dSPeter Dunlap 1927a6d42e7dSPeter Dunlap static const char * 1928*30e7468fSPeter Dunlap iscsi_iscsi_sess_event(unsigned int event) 1929a6d42e7dSPeter Dunlap { 1930a6d42e7dSPeter Dunlap 1931*30e7468fSPeter Dunlap return ((event < ISCSI_SESS_EVENT_MAX) ? 1932*30e7468fSPeter Dunlap iscsi_sess_event_names[event] : "N/A"); 1933*30e7468fSPeter Dunlap } 1934a6d42e7dSPeter Dunlap 1935*30e7468fSPeter Dunlap static const char * 1936*30e7468fSPeter Dunlap iscsi_idm_conn_state(unsigned int state) 1937*30e7468fSPeter Dunlap { 1938*30e7468fSPeter Dunlap return ((state < CS_MAX_STATE) ? idm_cs_name[state] : "N/A"); 1939a6d42e7dSPeter Dunlap } 1940a6d42e7dSPeter Dunlap 1941a6d42e7dSPeter Dunlap /*ARGSUSED*/ 1942a6d42e7dSPeter Dunlap static const char * 1943*30e7468fSPeter Dunlap iscsi_idm_task_state(unsigned int state) 1944a6d42e7dSPeter Dunlap { 1945*30e7468fSPeter Dunlap return ("N/A"); 1946a6d42e7dSPeter Dunlap } 1947a6d42e7dSPeter Dunlap 1948a6d42e7dSPeter Dunlap static const char * 1949*30e7468fSPeter Dunlap iscsi_iscsit_tgt_state(unsigned int state) 1950a6d42e7dSPeter Dunlap { 1951*30e7468fSPeter Dunlap return ((state < TS_MAX_STATE) ? iscsit_ts_name[state] : "N/A"); 1952a6d42e7dSPeter Dunlap } 1953a6d42e7dSPeter Dunlap 1954a6d42e7dSPeter Dunlap static const char * 1955*30e7468fSPeter Dunlap iscsi_iscsit_sess_state(unsigned int state) 1956a6d42e7dSPeter Dunlap { 1957*30e7468fSPeter Dunlap return ((state < SS_MAX_STATE) ? iscsit_ss_name[state] : "N/A"); 1958*30e7468fSPeter Dunlap } 1959a6d42e7dSPeter Dunlap 1960*30e7468fSPeter Dunlap static const char * 1961*30e7468fSPeter Dunlap iscsi_iscsit_login_state(unsigned int state) 1962*30e7468fSPeter Dunlap { 1963*30e7468fSPeter Dunlap return ((state < ILS_MAX_STATE) ? iscsit_ils_name[state] : "N/A"); 1964a6d42e7dSPeter Dunlap } 1965a6d42e7dSPeter Dunlap 1966a6d42e7dSPeter Dunlap static const char * 1967*30e7468fSPeter Dunlap iscsi_iscsi_cmd_state(unsigned int state) 1968a6d42e7dSPeter Dunlap { 1969*30e7468fSPeter Dunlap return ((state < ISCSI_CMD_STATE_MAX) ? 1970*30e7468fSPeter Dunlap iscsi_cmd_state_names[state] : "N/A"); 1971*30e7468fSPeter Dunlap } 1972a6d42e7dSPeter Dunlap 1973*30e7468fSPeter Dunlap static const char * 1974*30e7468fSPeter Dunlap iscsi_iscsi_sess_state(unsigned int state) 1975*30e7468fSPeter Dunlap { 1976*30e7468fSPeter Dunlap return ((state < ISCSI_SESS_STATE_MAX) ? 1977*30e7468fSPeter Dunlap iscsi_sess_state_names[state] : "N/A"); 1978*30e7468fSPeter Dunlap } 1979a6d42e7dSPeter Dunlap 1980*30e7468fSPeter Dunlap static const char * 1981*30e7468fSPeter Dunlap iscsi_iscsi_conn_state(unsigned int state) 1982*30e7468fSPeter Dunlap { 1983*30e7468fSPeter Dunlap return ((state < ISCSI_CONN_STATE_MAX) ? iscsi_ics_name[state] : "N/A"); 1984a6d42e7dSPeter Dunlap } 1985a6d42e7dSPeter Dunlap 1986*30e7468fSPeter Dunlap static const char * 1987*30e7468fSPeter Dunlap iscsi_iscsi_login_state(unsigned int state) 1988*30e7468fSPeter Dunlap { 1989*30e7468fSPeter Dunlap return ((state < LOGIN_MAX) ? iscsi_login_state_names[state] : "N/A"); 1990*30e7468fSPeter Dunlap } 1991a6d42e7dSPeter Dunlap 1992a6d42e7dSPeter Dunlap 1993a6d42e7dSPeter Dunlap /* 1994a6d42e7dSPeter Dunlap * Retrieve connection type given a kernel address 1995a6d42e7dSPeter Dunlap */ 1996a6d42e7dSPeter Dunlap static idm_conn_type_t 1997a6d42e7dSPeter Dunlap idm_conn_type(uintptr_t addr) 1998a6d42e7dSPeter Dunlap { 1999a6d42e7dSPeter Dunlap idm_conn_type_t result = 0; /* Unknown */ 2000a6d42e7dSPeter Dunlap uintptr_t idm_conn_type_addr; 2001a6d42e7dSPeter Dunlap 2002a6d42e7dSPeter Dunlap idm_conn_type_addr = addr + offsetof(idm_conn_t, ic_conn_type); 2003a6d42e7dSPeter Dunlap (void) mdb_vread(&result, sizeof (result), idm_conn_type_addr); 2004a6d42e7dSPeter Dunlap 2005a6d42e7dSPeter Dunlap return (result); 2006a6d42e7dSPeter Dunlap } 2007a6d42e7dSPeter Dunlap 2008a6d42e7dSPeter Dunlap /* 2009a6d42e7dSPeter Dunlap * Convert a sockaddr to the string representation, suitable for 2010a6d42e7dSPeter Dunlap * storing in an nvlist or printing out in a list. 2011a6d42e7dSPeter Dunlap */ 2012a6d42e7dSPeter Dunlap static int 2013a6d42e7dSPeter Dunlap sa_to_str(struct sockaddr_storage *sa, char *buf) 2014a6d42e7dSPeter Dunlap { 2015a6d42e7dSPeter Dunlap char pbuf[7]; 2016a6d42e7dSPeter Dunlap const char *bufp; 2017a6d42e7dSPeter Dunlap struct sockaddr_in *sin; 2018a6d42e7dSPeter Dunlap struct sockaddr_in6 *sin6; 2019a6d42e7dSPeter Dunlap uint16_t port; 2020a6d42e7dSPeter Dunlap 2021a6d42e7dSPeter Dunlap if (!sa || !buf) { 2022a6d42e7dSPeter Dunlap return (EINVAL); 2023a6d42e7dSPeter Dunlap } 2024a6d42e7dSPeter Dunlap 2025a6d42e7dSPeter Dunlap buf[0] = '\0'; 2026a6d42e7dSPeter Dunlap 2027a6d42e7dSPeter Dunlap if (sa->ss_family == AF_INET) { 2028a6d42e7dSPeter Dunlap sin = (struct sockaddr_in *)sa; 2029*30e7468fSPeter Dunlap bufp = iscsi_inet_ntop(AF_INET, 2030a6d42e7dSPeter Dunlap (const void *)&(sin->sin_addr.s_addr), 2031a6d42e7dSPeter Dunlap buf, PORTAL_STR_LEN); 2032a6d42e7dSPeter Dunlap if (bufp == NULL) { 2033a6d42e7dSPeter Dunlap return (-1); 2034a6d42e7dSPeter Dunlap } 2035a6d42e7dSPeter Dunlap mdb_nhconvert(&port, &sin->sin_port, sizeof (uint16_t)); 2036a6d42e7dSPeter Dunlap } else if (sa->ss_family == AF_INET6) { 2037a6d42e7dSPeter Dunlap strlcat(buf, "[", sizeof (buf)); 2038a6d42e7dSPeter Dunlap sin6 = (struct sockaddr_in6 *)sa; 2039*30e7468fSPeter Dunlap bufp = iscsi_inet_ntop(AF_INET6, 2040a6d42e7dSPeter Dunlap (const void *)&sin6->sin6_addr.s6_addr, 2041a6d42e7dSPeter Dunlap &buf[1], PORTAL_STR_LEN - 1); 2042a6d42e7dSPeter Dunlap if (bufp == NULL) { 2043a6d42e7dSPeter Dunlap return (-1); 2044a6d42e7dSPeter Dunlap } 2045a6d42e7dSPeter Dunlap strlcat(buf, "]", PORTAL_STR_LEN); 2046a6d42e7dSPeter Dunlap mdb_nhconvert(&port, &sin->sin_port, sizeof (uint16_t)); 2047a6d42e7dSPeter Dunlap } else { 2048a6d42e7dSPeter Dunlap return (EINVAL); 2049a6d42e7dSPeter Dunlap } 2050a6d42e7dSPeter Dunlap 2051a6d42e7dSPeter Dunlap 2052a6d42e7dSPeter Dunlap mdb_snprintf(pbuf, sizeof (pbuf), ":%u", port); 2053a6d42e7dSPeter Dunlap strlcat(buf, pbuf, PORTAL_STR_LEN); 2054a6d42e7dSPeter Dunlap 2055a6d42e7dSPeter Dunlap return (0); 2056a6d42e7dSPeter Dunlap } 2057a6d42e7dSPeter Dunlap 2058a6d42e7dSPeter Dunlap 2059a6d42e7dSPeter Dunlap static void 2060a6d42e7dSPeter Dunlap iscsi_format_timestamp(char *ts_str, int strlen, timespec_t *ts) 2061a6d42e7dSPeter Dunlap { 2062a6d42e7dSPeter Dunlap mdb_snprintf(ts_str, strlen, "%Y:%03d:%03d:%03d", ts->tv_sec, 2063a6d42e7dSPeter Dunlap (ts->tv_nsec / 1000000) % 1000, (ts->tv_nsec / 1000) % 1000, 2064a6d42e7dSPeter Dunlap ts->tv_nsec % 1000); 2065a6d42e7dSPeter Dunlap } 2066a6d42e7dSPeter Dunlap 2067a6d42e7dSPeter Dunlap /* 2068a6d42e7dSPeter Dunlap * Help information for the iscsi_isns dcmd 2069a6d42e7dSPeter Dunlap */ 2070a6d42e7dSPeter Dunlap static void 2071a6d42e7dSPeter Dunlap iscsi_isns_help(void) 2072a6d42e7dSPeter Dunlap { 2073a6d42e7dSPeter Dunlap mdb_printf("iscsi_isns:\n"); 2074a6d42e7dSPeter Dunlap mdb_inc_indent(4); 2075a6d42e7dSPeter Dunlap mdb_printf("-e: Print ESI information\n"); 2076a6d42e7dSPeter Dunlap mdb_printf("-p: Print portal information\n"); 2077a6d42e7dSPeter Dunlap mdb_printf("-s: Print iSNS server information\n"); 2078a6d42e7dSPeter Dunlap mdb_printf("-t: Print target information\n"); 2079a6d42e7dSPeter Dunlap mdb_printf("-v: Add verbosity to the other options' output\n"); 2080a6d42e7dSPeter Dunlap mdb_dec_indent(4); 2081a6d42e7dSPeter Dunlap } 2082a6d42e7dSPeter Dunlap 2083a6d42e7dSPeter Dunlap /* ARGSUSED */ 2084a6d42e7dSPeter Dunlap static int 2085a6d42e7dSPeter Dunlap iscsi_isns_esi_cb(uintptr_t addr, const void *walker_data, void *data) 2086a6d42e7dSPeter Dunlap { 2087a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data; 2088a6d42e7dSPeter Dunlap isns_esi_tinfo_t tinfo; 2089a6d42e7dSPeter Dunlap 2090a6d42e7dSPeter Dunlap if (mdb_vread(&tinfo, sizeof (isns_esi_tinfo_t), addr) != 2091a6d42e7dSPeter Dunlap sizeof (isns_esi_tinfo_t)) { 2092a6d42e7dSPeter Dunlap return (WALK_ERR); 2093a6d42e7dSPeter Dunlap } 2094a6d42e7dSPeter Dunlap 2095a6d42e7dSPeter Dunlap mdb_printf("ESI portal : 0x%p\n", tinfo.esi_portal); 2096a6d42e7dSPeter Dunlap if (idc->idc_verbose) { 2097a6d42e7dSPeter Dunlap mdb_inc_indent(4); 2098a6d42e7dSPeter Dunlap iscsi_isns_portal_cb((uintptr_t)tinfo.esi_portal, NULL, data); 2099a6d42e7dSPeter Dunlap mdb_dec_indent(4); 2100a6d42e7dSPeter Dunlap } 2101a6d42e7dSPeter Dunlap mdb_printf("ESI thread/thr did : 0x%p / %d\n", tinfo.esi_thread, 2102a6d42e7dSPeter Dunlap tinfo.esi_thread_did); 2103a6d42e7dSPeter Dunlap mdb_printf("ESI sonode : 0x%p\n", tinfo.esi_so); 2104a6d42e7dSPeter Dunlap mdb_printf("ESI port : %d\n", tinfo.esi_port); 2105a6d42e7dSPeter Dunlap mdb_printf("ESI thread running : %s\n", 2106a6d42e7dSPeter Dunlap (tinfo.esi_thread_running) ? "Yes" : "No"); 2107a6d42e7dSPeter Dunlap if (!tinfo.esi_thread_running) { 2108a6d42e7dSPeter Dunlap mdb_printf("ESI thread failed : %s\n", 2109a6d42e7dSPeter Dunlap (tinfo.esi_thread_failed) ? "Yes" : "No"); 2110a6d42e7dSPeter Dunlap } 2111a6d42e7dSPeter Dunlap mdb_printf("ESI registered : %s\n\n", 2112a6d42e7dSPeter Dunlap (tinfo.esi_registered) ? "Yes" : "No"); 2113a6d42e7dSPeter Dunlap 2114a6d42e7dSPeter Dunlap return (WALK_NEXT); 2115a6d42e7dSPeter Dunlap } 2116a6d42e7dSPeter Dunlap 2117a6d42e7dSPeter Dunlap static int 2118a6d42e7dSPeter Dunlap iscsi_isns_esi(iscsi_dcmd_ctrl_t *idc) 2119a6d42e7dSPeter Dunlap { 2120a6d42e7dSPeter Dunlap GElf_Sym sym; 2121a6d42e7dSPeter Dunlap uintptr_t esi_list; 2122a6d42e7dSPeter Dunlap 2123a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("esi_list", &sym) == -1) { 2124a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'esi_list'"); 2125a6d42e7dSPeter Dunlap return (DCMD_ERR); 2126a6d42e7dSPeter Dunlap } 2127a6d42e7dSPeter Dunlap 2128a6d42e7dSPeter Dunlap esi_list = (uintptr_t)sym.st_value; 2129a6d42e7dSPeter Dunlap idc->idc_header = 1; 2130a6d42e7dSPeter Dunlap 2131a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_isns_esi_cb, idc, esi_list) == -1) { 2132a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for esi_list"); 2133a6d42e7dSPeter Dunlap return (DCMD_ERR); 2134a6d42e7dSPeter Dunlap } 2135a6d42e7dSPeter Dunlap 2136a6d42e7dSPeter Dunlap return (0); 2137a6d42e7dSPeter Dunlap } 2138a6d42e7dSPeter Dunlap 2139a6d42e7dSPeter Dunlap /* ARGSUSED */ 2140a6d42e7dSPeter Dunlap static int 2141a6d42e7dSPeter Dunlap iscsi_isns_portal_cb(uintptr_t addr, const void *walker_data, void *data) 2142a6d42e7dSPeter Dunlap { 2143a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data; 2144a6d42e7dSPeter Dunlap isns_portal_list_t portal; 2145a6d42e7dSPeter Dunlap char portal_addr[PORTAL_STR_LEN]; 2146a6d42e7dSPeter Dunlap struct sockaddr_storage *ss; 2147a6d42e7dSPeter Dunlap 2148a6d42e7dSPeter Dunlap if (mdb_vread(&portal, sizeof (isns_portal_list_t), addr) != 2149a6d42e7dSPeter Dunlap sizeof (isns_portal_list_t)) { 2150a6d42e7dSPeter Dunlap return (WALK_ERR); 2151a6d42e7dSPeter Dunlap } 2152a6d42e7dSPeter Dunlap 2153a6d42e7dSPeter Dunlap ss = &portal.portal_addr; 2154a6d42e7dSPeter Dunlap sa_to_str(ss, portal_addr); 2155a6d42e7dSPeter Dunlap mdb_printf("Portal IP address "); 2156a6d42e7dSPeter Dunlap 2157a6d42e7dSPeter Dunlap if (ss->ss_family == AF_INET) { 2158a6d42e7dSPeter Dunlap mdb_printf("(v4): %s", portal_addr); 2159a6d42e7dSPeter Dunlap } else { 2160a6d42e7dSPeter Dunlap mdb_printf("(v6): %s", portal_addr); 2161a6d42e7dSPeter Dunlap } 2162a6d42e7dSPeter Dunlap 2163a6d42e7dSPeter Dunlap if (portal.portal_iscsit == NULL) { 2164a6d42e7dSPeter Dunlap mdb_printf(" (Default portal)\n"); 2165a6d42e7dSPeter Dunlap } else { 2166a6d42e7dSPeter Dunlap mdb_printf("\n"); 2167a6d42e7dSPeter Dunlap } 2168a6d42e7dSPeter Dunlap 2169a6d42e7dSPeter Dunlap if ((portal.portal_iscsit != NULL) && (idc->idc_verbose)) { 2170a6d42e7dSPeter Dunlap iscsi_portal_impl((uintptr_t)portal.portal_iscsit, idc); 2171a6d42e7dSPeter Dunlap } 2172a6d42e7dSPeter Dunlap 2173a6d42e7dSPeter Dunlap mdb_printf("Portal ESI info: 0x%p\n\n", portal.portal_esi); 2174a6d42e7dSPeter Dunlap 2175a6d42e7dSPeter Dunlap return (WALK_NEXT); 2176a6d42e7dSPeter Dunlap } 2177a6d42e7dSPeter Dunlap 2178a6d42e7dSPeter Dunlap static int 2179a6d42e7dSPeter Dunlap iscsi_isns_portals(iscsi_dcmd_ctrl_t *idc) 2180a6d42e7dSPeter Dunlap { 2181a6d42e7dSPeter Dunlap GElf_Sym sym; 2182a6d42e7dSPeter Dunlap uintptr_t portal_list; 2183a6d42e7dSPeter Dunlap 2184a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("portal_list", &sym) == -1) { 2185a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'portal_list'"); 2186a6d42e7dSPeter Dunlap return (DCMD_ERR); 2187a6d42e7dSPeter Dunlap } 2188a6d42e7dSPeter Dunlap 2189a6d42e7dSPeter Dunlap portal_list = (uintptr_t)sym.st_value; 2190a6d42e7dSPeter Dunlap idc->idc_header = 1; 2191a6d42e7dSPeter Dunlap 2192a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_isns_portal_cb, idc, portal_list) == -1) { 2193a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for portal_list"); 2194a6d42e7dSPeter Dunlap return (DCMD_ERR); 2195a6d42e7dSPeter Dunlap } 2196a6d42e7dSPeter Dunlap 2197a6d42e7dSPeter Dunlap return (0); 2198a6d42e7dSPeter Dunlap } 2199a6d42e7dSPeter Dunlap 2200a6d42e7dSPeter Dunlap /* ARGSUSED */ 2201a6d42e7dSPeter Dunlap static int 2202a6d42e7dSPeter Dunlap iscsi_isns_targets_cb(uintptr_t addr, const void *walker_data, void *data) 2203a6d42e7dSPeter Dunlap { 2204a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data; 2205a6d42e7dSPeter Dunlap isns_target_t itarget; 2206a6d42e7dSPeter Dunlap int rc = 0; 2207a6d42e7dSPeter Dunlap 2208a6d42e7dSPeter Dunlap if (mdb_vread(&itarget, sizeof (isns_target_t), addr) != 2209a6d42e7dSPeter Dunlap sizeof (isns_target_t)) { 2210a6d42e7dSPeter Dunlap return (WALK_ERR); 2211a6d42e7dSPeter Dunlap } 2212a6d42e7dSPeter Dunlap 2213a6d42e7dSPeter Dunlap idc->idc_header = 1; 2214a6d42e7dSPeter Dunlap 2215a6d42e7dSPeter Dunlap mdb_printf("Target: %p\n", itarget.target); 2216a6d42e7dSPeter Dunlap mdb_inc_indent(4); 2217a6d42e7dSPeter Dunlap mdb_printf("Registered: %s\n", 2218a6d42e7dSPeter Dunlap (itarget.target_registered) ? "Yes" : "No"); 2219a6d42e7dSPeter Dunlap 2220a6d42e7dSPeter Dunlap rc = iscsi_tgt_impl((uintptr_t)itarget.target, idc); 2221a6d42e7dSPeter Dunlap 2222a6d42e7dSPeter Dunlap mdb_dec_indent(4); 2223a6d42e7dSPeter Dunlap 2224a6d42e7dSPeter Dunlap if (rc == DCMD_OK) { 2225a6d42e7dSPeter Dunlap return (WALK_NEXT); 2226a6d42e7dSPeter Dunlap } 2227a6d42e7dSPeter Dunlap 2228a6d42e7dSPeter Dunlap return (WALK_ERR); 2229a6d42e7dSPeter Dunlap } 2230a6d42e7dSPeter Dunlap 2231a6d42e7dSPeter Dunlap static int 2232a6d42e7dSPeter Dunlap iscsi_isns_targets(iscsi_dcmd_ctrl_t *idc) 2233a6d42e7dSPeter Dunlap { 2234a6d42e7dSPeter Dunlap GElf_Sym sym; 2235a6d42e7dSPeter Dunlap uintptr_t isns_target_list; 2236a6d42e7dSPeter Dunlap 2237a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("isns_target_list", &sym) == -1) { 2238a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'isns_target_list'"); 2239a6d42e7dSPeter Dunlap return (DCMD_ERR); 2240a6d42e7dSPeter Dunlap } 2241a6d42e7dSPeter Dunlap 2242a6d42e7dSPeter Dunlap isns_target_list = (uintptr_t)sym.st_value; 2243a6d42e7dSPeter Dunlap idc->idc_header = 1; 2244a6d42e7dSPeter Dunlap idc->u.child.idc_tgt = 1; 2245a6d42e7dSPeter Dunlap 2246a6d42e7dSPeter Dunlap if (mdb_pwalk("avl", iscsi_isns_targets_cb, idc, 2247a6d42e7dSPeter Dunlap isns_target_list) == -1) { 2248a6d42e7dSPeter Dunlap mdb_warn("avl walk failed for isns_target_list"); 2249a6d42e7dSPeter Dunlap return (DCMD_ERR); 2250a6d42e7dSPeter Dunlap } 2251a6d42e7dSPeter Dunlap 2252a6d42e7dSPeter Dunlap return (0); 2253a6d42e7dSPeter Dunlap } 2254a6d42e7dSPeter Dunlap 2255a6d42e7dSPeter Dunlap /* ARGSUSED */ 2256a6d42e7dSPeter Dunlap static int 2257a6d42e7dSPeter Dunlap iscsi_isns_servers_cb(uintptr_t addr, const void *walker_data, void *data) 2258a6d42e7dSPeter Dunlap { 2259a6d42e7dSPeter Dunlap GElf_Sym sym; 2260a6d42e7dSPeter Dunlap iscsit_isns_svr_t server; 2261a6d42e7dSPeter Dunlap char server_addr[PORTAL_STR_LEN]; 2262a6d42e7dSPeter Dunlap struct sockaddr_storage *ss; 2263a6d42e7dSPeter Dunlap clock_t lbolt; 2264a6d42e7dSPeter Dunlap 2265a6d42e7dSPeter Dunlap if (mdb_vread(&server, sizeof (iscsit_isns_svr_t), addr) != 2266a6d42e7dSPeter Dunlap sizeof (iscsit_isns_svr_t)) { 2267a6d42e7dSPeter Dunlap return (WALK_ERR); 2268a6d42e7dSPeter Dunlap } 2269a6d42e7dSPeter Dunlap 2270a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("lbolt", &sym) == -1) { 2271a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'lbolt'"); 2272a6d42e7dSPeter Dunlap return (DCMD_ERR); 2273a6d42e7dSPeter Dunlap } 2274a6d42e7dSPeter Dunlap 2275a6d42e7dSPeter Dunlap if (mdb_vread(&lbolt, sizeof (clock_t), sym.st_value) != 2276a6d42e7dSPeter Dunlap sizeof (clock_t)) { 2277a6d42e7dSPeter Dunlap return (WALK_ERR); 2278a6d42e7dSPeter Dunlap } 2279a6d42e7dSPeter Dunlap 2280a6d42e7dSPeter Dunlap mdb_printf("iSNS server %p:\n", addr); 2281a6d42e7dSPeter Dunlap mdb_inc_indent(4); 2282a6d42e7dSPeter Dunlap ss = &server.svr_sa; 2283a6d42e7dSPeter Dunlap sa_to_str(ss, server_addr); 2284a6d42e7dSPeter Dunlap 2285a6d42e7dSPeter Dunlap mdb_printf("IP address "); 2286a6d42e7dSPeter Dunlap if (ss->ss_family == AF_INET) { 2287a6d42e7dSPeter Dunlap mdb_printf("(v4): %s\n", server_addr); 2288a6d42e7dSPeter Dunlap } else { 2289a6d42e7dSPeter Dunlap mdb_printf("(v6): %s\n", server_addr); 2290a6d42e7dSPeter Dunlap } 2291a6d42e7dSPeter Dunlap 2292a6d42e7dSPeter Dunlap mdb_printf("Last ESI message : %d seconds ago\n", 2293a6d42e7dSPeter Dunlap ((lbolt - server.svr_last_msg) / 100)); 2294a6d42e7dSPeter Dunlap mdb_printf("Client registered: %s\n", 2295a6d42e7dSPeter Dunlap (server.svr_registered) ? "Yes" : "No"); 2296a6d42e7dSPeter Dunlap mdb_dec_indent(4); 2297a6d42e7dSPeter Dunlap 2298a6d42e7dSPeter Dunlap return (WALK_ERR); 2299a6d42e7dSPeter Dunlap } 2300a6d42e7dSPeter Dunlap 2301a6d42e7dSPeter Dunlap static int 2302a6d42e7dSPeter Dunlap iscsi_isns_servers(iscsi_dcmd_ctrl_t *idc) 2303a6d42e7dSPeter Dunlap { 2304a6d42e7dSPeter Dunlap uintptr_t iscsit_global_addr; 2305a6d42e7dSPeter Dunlap uintptr_t list_addr; 2306a6d42e7dSPeter Dunlap GElf_Sym sym; 2307a6d42e7dSPeter Dunlap 2308a6d42e7dSPeter Dunlap if (mdb_lookup_by_name("iscsit_global", &sym) == -1) { 2309a6d42e7dSPeter Dunlap mdb_warn("failed to find symbol 'iscsit_global'"); 2310a6d42e7dSPeter Dunlap return (DCMD_ERR); 2311a6d42e7dSPeter Dunlap } 2312a6d42e7dSPeter Dunlap 2313a6d42e7dSPeter Dunlap iscsit_global_addr = (uintptr_t)sym.st_value; 2314a6d42e7dSPeter Dunlap idc->idc_header = 1; 2315a6d42e7dSPeter Dunlap list_addr = iscsit_global_addr + 2316a6d42e7dSPeter Dunlap offsetof(iscsit_global_t, global_isns_cfg.isns_svrs); 2317a6d42e7dSPeter Dunlap 2318a6d42e7dSPeter Dunlap if (mdb_pwalk("list", iscsi_isns_servers_cb, idc, list_addr) == -1) { 2319a6d42e7dSPeter Dunlap mdb_warn("list walk failed for iSNS servers"); 2320a6d42e7dSPeter Dunlap return (DCMD_ERR); 2321a6d42e7dSPeter Dunlap } 2322a6d42e7dSPeter Dunlap 2323a6d42e7dSPeter Dunlap return (0); 2324a6d42e7dSPeter Dunlap } 2325a6d42e7dSPeter Dunlap 2326a6d42e7dSPeter Dunlap /* ARGSUSED */ 2327a6d42e7dSPeter Dunlap static int 2328a6d42e7dSPeter Dunlap iscsi_isns(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 2329a6d42e7dSPeter Dunlap { 2330a6d42e7dSPeter Dunlap iscsi_dcmd_ctrl_t idc; 2331a6d42e7dSPeter Dunlap int portals = 0, esi = 0, targets = 0, verbose = 0, servers = 0; 2332a6d42e7dSPeter Dunlap 2333a6d42e7dSPeter Dunlap if (flags & DCMD_ADDRSPEC) { 2334a6d42e7dSPeter Dunlap mdb_warn("iscsi_isns is only a global dcmd."); 2335a6d42e7dSPeter Dunlap return (DCMD_ERR); 2336a6d42e7dSPeter Dunlap } 2337a6d42e7dSPeter Dunlap 2338a6d42e7dSPeter Dunlap bzero(&idc, sizeof (idc)); 2339a6d42e7dSPeter Dunlap if (mdb_getopts(argc, argv, 2340a6d42e7dSPeter Dunlap 'e', MDB_OPT_SETBITS, TRUE, &esi, 2341a6d42e7dSPeter Dunlap 'p', MDB_OPT_SETBITS, TRUE, &portals, 2342a6d42e7dSPeter Dunlap 's', MDB_OPT_SETBITS, TRUE, &servers, 2343a6d42e7dSPeter Dunlap 't', MDB_OPT_SETBITS, TRUE, &targets, 2344a6d42e7dSPeter Dunlap 'v', MDB_OPT_SETBITS, TRUE, &verbose, 2345a6d42e7dSPeter Dunlap NULL) != argc) 2346a6d42e7dSPeter Dunlap return (DCMD_USAGE); 2347a6d42e7dSPeter Dunlap 2348a6d42e7dSPeter Dunlap if ((esi + portals + targets + servers) > 1) { 2349a6d42e7dSPeter Dunlap mdb_printf("Only one of e, p, s, and t must be provided"); 2350a6d42e7dSPeter Dunlap return (DCMD_ERR); 2351a6d42e7dSPeter Dunlap } 2352a6d42e7dSPeter Dunlap 2353a6d42e7dSPeter Dunlap if ((esi | portals | targets | servers) == 0) { 2354a6d42e7dSPeter Dunlap mdb_printf("Exactly one of e, p, s, or t must be provided"); 2355a6d42e7dSPeter Dunlap return (DCMD_ERR); 2356a6d42e7dSPeter Dunlap } 2357a6d42e7dSPeter Dunlap 2358a6d42e7dSPeter Dunlap idc.idc_verbose = verbose; 2359a6d42e7dSPeter Dunlap 2360a6d42e7dSPeter Dunlap if (esi) { 2361a6d42e7dSPeter Dunlap return (iscsi_isns_esi(&idc)); 2362a6d42e7dSPeter Dunlap } 2363a6d42e7dSPeter Dunlap 2364a6d42e7dSPeter Dunlap if (portals) { 2365a6d42e7dSPeter Dunlap return (iscsi_isns_portals(&idc)); 2366a6d42e7dSPeter Dunlap } 2367a6d42e7dSPeter Dunlap 2368a6d42e7dSPeter Dunlap if (servers) { 2369a6d42e7dSPeter Dunlap return (iscsi_isns_servers(&idc)); 2370a6d42e7dSPeter Dunlap } 2371a6d42e7dSPeter Dunlap 2372a6d42e7dSPeter Dunlap return (iscsi_isns_targets(&idc)); 2373a6d42e7dSPeter Dunlap } 2374a6d42e7dSPeter Dunlap 2375a6d42e7dSPeter Dunlap /* 2376*30e7468fSPeter Dunlap * iscsi_inet_ntop -- Convert an IPv4 or IPv6 address in binary form into 2377a6d42e7dSPeter Dunlap * printable form, and return a pointer to that string. Caller should 2378a6d42e7dSPeter Dunlap * provide a buffer of correct length to store string into. 2379a6d42e7dSPeter Dunlap * Note: this routine is kernel version of inet_ntop. It has similar 2380*30e7468fSPeter Dunlap * format as iscsi_inet_ntop() defined in rfc2553. But it does not do 2381a6d42e7dSPeter Dunlap * error handling operations exactly as rfc2553 defines. This function 2382a6d42e7dSPeter Dunlap * is used by kernel inet directory routines only for debugging. 2383*30e7468fSPeter Dunlap * This iscsi_inet_ntop() function, does not return NULL if third argument 2384a6d42e7dSPeter Dunlap * is NULL. The reason is simple that we don't want kernel to panic 2385a6d42e7dSPeter Dunlap * as the output of this function is directly fed to ip<n>dbg macro. 2386a6d42e7dSPeter Dunlap * Instead it uses a local buffer for destination address for 2387a6d42e7dSPeter Dunlap * those calls which purposely pass NULL ptr for the destination 2388a6d42e7dSPeter Dunlap * buffer. This function is thread-safe when the caller passes a non- 2389a6d42e7dSPeter Dunlap * null buffer with the third argument. 2390a6d42e7dSPeter Dunlap */ 2391a6d42e7dSPeter Dunlap /* ARGSUSED */ 2392a6d42e7dSPeter Dunlap 2393a6d42e7dSPeter Dunlap #define OK_16PTR(p) (!((uintptr_t)(p) & 0x1)) 2394a6d42e7dSPeter Dunlap #if defined(__x86) 2395a6d42e7dSPeter Dunlap #define OK_32PTR(p) OK_16PTR(p) 2396a6d42e7dSPeter Dunlap #else 2397a6d42e7dSPeter Dunlap #define OK_32PTR(p) (!((uintptr_t)(p) & 0x3)) 2398a6d42e7dSPeter Dunlap #endif 2399a6d42e7dSPeter Dunlap 2400a6d42e7dSPeter Dunlap char * 2401*30e7468fSPeter Dunlap iscsi_inet_ntop(int af, const void *addr, char *buf, int addrlen) 2402a6d42e7dSPeter Dunlap { 2403a6d42e7dSPeter Dunlap static char local_buf[PORTAL_STR_LEN]; 2404a6d42e7dSPeter Dunlap static char *err_buf1 = "<badaddr>"; 2405a6d42e7dSPeter Dunlap static char *err_buf2 = "<badfamily>"; 2406a6d42e7dSPeter Dunlap in6_addr_t *v6addr; 2407a6d42e7dSPeter Dunlap uchar_t *v4addr; 2408a6d42e7dSPeter Dunlap char *caddr; 2409a6d42e7dSPeter Dunlap 2410a6d42e7dSPeter Dunlap /* 2411*30e7468fSPeter Dunlap * We don't allow thread unsafe iscsi_inet_ntop calls, they 2412a6d42e7dSPeter Dunlap * must pass a non-null buffer pointer. For DEBUG mode 2413a6d42e7dSPeter Dunlap * we use the ASSERT() and for non-debug kernel it will 2414a6d42e7dSPeter Dunlap * silently allow it for now. Someday we should remove 2415a6d42e7dSPeter Dunlap * the static buffer from this function. 2416a6d42e7dSPeter Dunlap */ 2417a6d42e7dSPeter Dunlap 2418a6d42e7dSPeter Dunlap ASSERT(buf != NULL); 2419a6d42e7dSPeter Dunlap if (buf == NULL) 2420a6d42e7dSPeter Dunlap buf = local_buf; 2421a6d42e7dSPeter Dunlap buf[0] = '\0'; 2422a6d42e7dSPeter Dunlap 2423a6d42e7dSPeter Dunlap /* Let user know politely not to send NULL or unaligned addr */ 2424a6d42e7dSPeter Dunlap if (addr == NULL || !(OK_32PTR(addr))) { 2425a6d42e7dSPeter Dunlap return (err_buf1); 2426a6d42e7dSPeter Dunlap } 2427a6d42e7dSPeter Dunlap 2428a6d42e7dSPeter Dunlap 2429a6d42e7dSPeter Dunlap #define UC(b) (((int)b) & 0xff) 2430a6d42e7dSPeter Dunlap switch (af) { 2431a6d42e7dSPeter Dunlap case AF_INET: 2432a6d42e7dSPeter Dunlap ASSERT(addrlen >= INET_ADDRSTRLEN); 2433a6d42e7dSPeter Dunlap v4addr = (uchar_t *)addr; 2434a6d42e7dSPeter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN, 2435a6d42e7dSPeter Dunlap "%03d.%03d.%03d.%03d", 2436a6d42e7dSPeter Dunlap UC(v4addr[0]), UC(v4addr[1]), UC(v4addr[2]), UC(v4addr[3])); 2437a6d42e7dSPeter Dunlap return (buf); 2438a6d42e7dSPeter Dunlap 2439a6d42e7dSPeter Dunlap case AF_INET6: 2440a6d42e7dSPeter Dunlap ASSERT(addrlen >= INET6_ADDRSTRLEN); 2441a6d42e7dSPeter Dunlap v6addr = (in6_addr_t *)addr; 2442a6d42e7dSPeter Dunlap if (IN6_IS_ADDR_V4MAPPED(v6addr)) { 2443a6d42e7dSPeter Dunlap caddr = (char *)addr; 2444a6d42e7dSPeter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN, 2445a6d42e7dSPeter Dunlap "::ffff:%d.%d.%d.%d", 2446a6d42e7dSPeter Dunlap UC(caddr[12]), UC(caddr[13]), 2447a6d42e7dSPeter Dunlap UC(caddr[14]), UC(caddr[15])); 2448a6d42e7dSPeter Dunlap } else if (IN6_IS_ADDR_V4COMPAT(v6addr)) { 2449a6d42e7dSPeter Dunlap caddr = (char *)addr; 2450a6d42e7dSPeter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN, 2451a6d42e7dSPeter Dunlap "::%d.%d.%d.%d", 2452a6d42e7dSPeter Dunlap UC(caddr[12]), UC(caddr[13]), UC(caddr[14]), 2453a6d42e7dSPeter Dunlap UC(caddr[15])); 2454a6d42e7dSPeter Dunlap } else if (IN6_IS_ADDR_UNSPECIFIED(v6addr)) { 2455a6d42e7dSPeter Dunlap (void) mdb_snprintf(buf, INET6_ADDRSTRLEN, "::"); 2456a6d42e7dSPeter Dunlap } else { 2457a6d42e7dSPeter Dunlap convert2ascii(buf, v6addr); 2458a6d42e7dSPeter Dunlap } 2459a6d42e7dSPeter Dunlap return (buf); 2460a6d42e7dSPeter Dunlap 2461a6d42e7dSPeter Dunlap default: 2462a6d42e7dSPeter Dunlap return (err_buf2); 2463a6d42e7dSPeter Dunlap } 2464a6d42e7dSPeter Dunlap #undef UC 2465a6d42e7dSPeter Dunlap } 2466a6d42e7dSPeter Dunlap 2467a6d42e7dSPeter Dunlap /* 2468a6d42e7dSPeter Dunlap * 2469a6d42e7dSPeter Dunlap * v6 formats supported 2470a6d42e7dSPeter Dunlap * General format xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 2471a6d42e7dSPeter Dunlap * The short hand notation :: is used for COMPAT addr 2472a6d42e7dSPeter Dunlap * Other forms : fe80::xxxx:xxxx:xxxx:xxxx 2473a6d42e7dSPeter Dunlap */ 2474a6d42e7dSPeter Dunlap static void 2475a6d42e7dSPeter Dunlap convert2ascii(char *buf, const in6_addr_t *addr) 2476a6d42e7dSPeter Dunlap { 2477a6d42e7dSPeter Dunlap int hexdigits; 2478a6d42e7dSPeter Dunlap int head_zero = 0; 2479a6d42e7dSPeter Dunlap int tail_zero = 0; 2480a6d42e7dSPeter Dunlap /* tempbuf must be big enough to hold ffff:\0 */ 2481a6d42e7dSPeter Dunlap char tempbuf[6]; 2482a6d42e7dSPeter Dunlap char *ptr; 2483a6d42e7dSPeter Dunlap uint16_t out_addr_component; 2484a6d42e7dSPeter Dunlap uint16_t *addr_component; 2485a6d42e7dSPeter Dunlap size_t len; 2486a6d42e7dSPeter Dunlap boolean_t first = B_FALSE; 2487a6d42e7dSPeter Dunlap boolean_t med_zero = B_FALSE; 2488a6d42e7dSPeter Dunlap boolean_t end_zero = B_FALSE; 2489a6d42e7dSPeter Dunlap 2490a6d42e7dSPeter Dunlap addr_component = (uint16_t *)addr; 2491a6d42e7dSPeter Dunlap ptr = buf; 2492a6d42e7dSPeter Dunlap 2493a6d42e7dSPeter Dunlap /* First count if trailing zeroes higher in number */ 2494a6d42e7dSPeter Dunlap for (hexdigits = 0; hexdigits < 8; hexdigits++) { 2495a6d42e7dSPeter Dunlap if (*addr_component == 0) { 2496a6d42e7dSPeter Dunlap if (hexdigits < 4) 2497a6d42e7dSPeter Dunlap head_zero++; 2498a6d42e7dSPeter Dunlap else 2499a6d42e7dSPeter Dunlap tail_zero++; 2500a6d42e7dSPeter Dunlap } 2501a6d42e7dSPeter Dunlap addr_component++; 2502a6d42e7dSPeter Dunlap } 2503a6d42e7dSPeter Dunlap addr_component = (uint16_t *)addr; 2504a6d42e7dSPeter Dunlap if (tail_zero > head_zero && (head_zero + tail_zero) != 7) 2505a6d42e7dSPeter Dunlap end_zero = B_TRUE; 2506a6d42e7dSPeter Dunlap 2507a6d42e7dSPeter Dunlap for (hexdigits = 0; hexdigits < 8; hexdigits++) { 2508a6d42e7dSPeter Dunlap 2509a6d42e7dSPeter Dunlap /* if entry is a 0 */ 2510a6d42e7dSPeter Dunlap 2511a6d42e7dSPeter Dunlap if (*addr_component == 0) { 2512a6d42e7dSPeter Dunlap if (!first && *(addr_component + 1) == 0) { 2513a6d42e7dSPeter Dunlap if (end_zero && (hexdigits < 4)) { 2514a6d42e7dSPeter Dunlap *ptr++ = '0'; 2515a6d42e7dSPeter Dunlap *ptr++ = ':'; 2516a6d42e7dSPeter Dunlap } else { 2517a6d42e7dSPeter Dunlap /* 2518a6d42e7dSPeter Dunlap * address starts with 0s .. 2519a6d42e7dSPeter Dunlap * stick in leading ':' of pair 2520a6d42e7dSPeter Dunlap */ 2521a6d42e7dSPeter Dunlap if (hexdigits == 0) 2522a6d42e7dSPeter Dunlap *ptr++ = ':'; 2523a6d42e7dSPeter Dunlap /* add another */ 2524a6d42e7dSPeter Dunlap *ptr++ = ':'; 2525a6d42e7dSPeter Dunlap first = B_TRUE; 2526a6d42e7dSPeter Dunlap med_zero = B_TRUE; 2527a6d42e7dSPeter Dunlap } 2528a6d42e7dSPeter Dunlap } else if (first && med_zero) { 2529a6d42e7dSPeter Dunlap if (hexdigits == 7) 2530a6d42e7dSPeter Dunlap *ptr++ = ':'; 2531a6d42e7dSPeter Dunlap addr_component++; 2532a6d42e7dSPeter Dunlap continue; 2533a6d42e7dSPeter Dunlap } else { 2534a6d42e7dSPeter Dunlap *ptr++ = '0'; 2535a6d42e7dSPeter Dunlap *ptr++ = ':'; 2536a6d42e7dSPeter Dunlap } 2537a6d42e7dSPeter Dunlap addr_component++; 2538a6d42e7dSPeter Dunlap continue; 2539a6d42e7dSPeter Dunlap } 2540a6d42e7dSPeter Dunlap if (med_zero) 2541a6d42e7dSPeter Dunlap med_zero = B_FALSE; 2542a6d42e7dSPeter Dunlap 2543a6d42e7dSPeter Dunlap tempbuf[0] = '\0'; 2544a6d42e7dSPeter Dunlap mdb_nhconvert(&out_addr_component, addr_component, 2545a6d42e7dSPeter Dunlap sizeof (uint16_t)); 2546a6d42e7dSPeter Dunlap (void) mdb_snprintf(tempbuf, 6, "%x:", out_addr_component); 2547a6d42e7dSPeter Dunlap len = strlen(tempbuf); 2548a6d42e7dSPeter Dunlap bcopy(tempbuf, ptr, len); 2549a6d42e7dSPeter Dunlap ptr = ptr + len; 2550a6d42e7dSPeter Dunlap addr_component++; 2551a6d42e7dSPeter Dunlap } 2552a6d42e7dSPeter Dunlap *--ptr = '\0'; 2553a6d42e7dSPeter Dunlap } 2554a6d42e7dSPeter Dunlap 2555a6d42e7dSPeter Dunlap 2556a6d42e7dSPeter Dunlap /* 2557a6d42e7dSPeter Dunlap * MDB module linkage information: 2558a6d42e7dSPeter Dunlap * 2559a6d42e7dSPeter Dunlap * We declare a list of structures describing our dcmds, a list of structures 2560a6d42e7dSPeter Dunlap * describing our walkers and a function named _mdb_init to return a pointer 2561a6d42e7dSPeter Dunlap * to our module information. 2562a6d42e7dSPeter Dunlap */ 2563a6d42e7dSPeter Dunlap static const mdb_dcmd_t dcmds[] = { 2564a6d42e7dSPeter Dunlap { "iscsi_tgt", "[-agsctbSRv]", 2565a6d42e7dSPeter Dunlap "iSCSI target information", iscsi_tgt }, 2566a6d42e7dSPeter Dunlap { "iscsi_tpg", "[-v]", 2567a6d42e7dSPeter Dunlap "iSCSI target portal group information", iscsi_tpg }, 2568a6d42e7dSPeter Dunlap { "iscsi_sess", "[-abtvcSRIT]", 2569a6d42e7dSPeter Dunlap "iSCSI session information", iscsi_sess }, 2570a6d42e7dSPeter Dunlap { "iscsi_conn", "[-abtvSRIT]", 2571a6d42e7dSPeter Dunlap "iSCSI connection information", iscsi_conn }, 2572a6d42e7dSPeter Dunlap { "iscsi_task", "[-bSRv]", 2573a6d42e7dSPeter Dunlap "iSCSI task information", iscsi_task }, 2574a6d42e7dSPeter Dunlap { "iscsi_refcnt", "", 2575a6d42e7dSPeter Dunlap "Print audit informtion for idm_refcnt_t", iscsi_refcnt }, 2576a6d42e7dSPeter Dunlap { "iscsi_states", "", 2577a6d42e7dSPeter Dunlap "Dump events and state transitions recorded in an\t" 2578a6d42e7dSPeter Dunlap "\t\tidm_sm_audit_t structure", iscsi_states }, 2579a6d42e7dSPeter Dunlap { "iscsi_isns", "[-epstv]", 2580a6d42e7dSPeter Dunlap "Print iscsit iSNS information", iscsi_isns, iscsi_isns_help }, 2581a6d42e7dSPeter Dunlap { NULL } 2582a6d42e7dSPeter Dunlap }; 2583a6d42e7dSPeter Dunlap 2584a6d42e7dSPeter Dunlap /* 2585a6d42e7dSPeter Dunlap * No walkers for now. Initiator might need some since it doesn't use list_t 2586a6d42e7dSPeter Dunlap */ 2587a6d42e7dSPeter Dunlap 2588a6d42e7dSPeter Dunlap static const mdb_modinfo_t modinfo = { 2589a6d42e7dSPeter Dunlap MDB_API_VERSION, dcmds, NULL 2590a6d42e7dSPeter Dunlap }; 2591a6d42e7dSPeter Dunlap 2592a6d42e7dSPeter Dunlap const mdb_modinfo_t * 2593a6d42e7dSPeter Dunlap _mdb_init(void) 2594a6d42e7dSPeter Dunlap { 2595a6d42e7dSPeter Dunlap return (&modinfo); 2596a6d42e7dSPeter Dunlap } 2597