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