17978SPeter.Dunlap@Sun.COM /*
27978SPeter.Dunlap@Sun.COM * CDDL HEADER START
37978SPeter.Dunlap@Sun.COM *
47978SPeter.Dunlap@Sun.COM * The contents of this file are subject to the terms of the
57978SPeter.Dunlap@Sun.COM * Common Development and Distribution License (the "License").
67978SPeter.Dunlap@Sun.COM * You may not use this file except in compliance with the License.
77978SPeter.Dunlap@Sun.COM *
87978SPeter.Dunlap@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97978SPeter.Dunlap@Sun.COM * or http://www.opensolaris.org/os/licensing.
107978SPeter.Dunlap@Sun.COM * See the License for the specific language governing permissions
117978SPeter.Dunlap@Sun.COM * and limitations under the License.
127978SPeter.Dunlap@Sun.COM *
137978SPeter.Dunlap@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
147978SPeter.Dunlap@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157978SPeter.Dunlap@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
167978SPeter.Dunlap@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
177978SPeter.Dunlap@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
187978SPeter.Dunlap@Sun.COM *
197978SPeter.Dunlap@Sun.COM * CDDL HEADER END
207978SPeter.Dunlap@Sun.COM */
217978SPeter.Dunlap@Sun.COM /*
22*12114SPeter.Gill@Sun.COM * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
237978SPeter.Dunlap@Sun.COM */
247978SPeter.Dunlap@Sun.COM
2511066Srafael.vanoni@sun.com #include <mdb/mdb_modapi.h>
2611066Srafael.vanoni@sun.com #include <mdb/mdb_ks.h>
2711066Srafael.vanoni@sun.com
287978SPeter.Dunlap@Sun.COM #include <sys/cpuvar.h>
297978SPeter.Dunlap@Sun.COM #include <sys/conf.h>
307978SPeter.Dunlap@Sun.COM #include <sys/file.h>
317978SPeter.Dunlap@Sun.COM #include <sys/types.h>
327978SPeter.Dunlap@Sun.COM #include <sys/taskq.h>
337978SPeter.Dunlap@Sun.COM #include <sys/sysmacros.h>
347978SPeter.Dunlap@Sun.COM #include <sys/socket.h> /* networking stuff */
357978SPeter.Dunlap@Sun.COM #include <sys/strsubr.h> /* networking stuff */
367978SPeter.Dunlap@Sun.COM #include <sys/nvpair.h>
377978SPeter.Dunlap@Sun.COM #include <sys/sunldi.h>
387978SPeter.Dunlap@Sun.COM #include <sys/stmf.h>
397978SPeter.Dunlap@Sun.COM #include <sys/stmf_ioctl.h>
407978SPeter.Dunlap@Sun.COM #include <sys/portif.h>
417978SPeter.Dunlap@Sun.COM
427978SPeter.Dunlap@Sun.COM #define IDM_CONN_SM_STRINGS
438062SPeter.Dunlap@Sun.COM #define IDM_TASK_SM_STRINGS
447978SPeter.Dunlap@Sun.COM #define ISCSIT_TGT_SM_STRINGS
457978SPeter.Dunlap@Sun.COM #define ISCSIT_SESS_SM_STRINGS
467978SPeter.Dunlap@Sun.COM #define ISCSIT_LOGIN_SM_STRINGS
479162SPeter.Dunlap@Sun.COM #define ISCSI_SESS_SM_STRINGS
489162SPeter.Dunlap@Sun.COM #define ISCSI_CMD_SM_STRINGS
499162SPeter.Dunlap@Sun.COM #define ISCSI_ICS_NAMES
509162SPeter.Dunlap@Sun.COM #define ISCSI_LOGIN_STATE_NAMES
5110766SPeter.Cudhea@Sun.COM #define IDM_CN_NOTIFY_STRINGS
527978SPeter.Dunlap@Sun.COM #include <sys/idm/idm.h>
5310156SZhang.Yi@Sun.COM #include <iscsi.h>
547978SPeter.Dunlap@Sun.COM #include <iscsit.h>
557978SPeter.Dunlap@Sun.COM #include <iscsit_isns.h>
56*12114SPeter.Gill@Sun.COM #include <sys/ib/clients/iser/iser.h>
577978SPeter.Dunlap@Sun.COM
587978SPeter.Dunlap@Sun.COM /*
597978SPeter.Dunlap@Sun.COM * We want to be able to print multiple levels of object hierarchy with a
607978SPeter.Dunlap@Sun.COM * single dcmd information, and preferably also exclude intermediate
617978SPeter.Dunlap@Sun.COM * levels if desired. For example some of the target objects have the
627978SPeter.Dunlap@Sun.COM * following relationship:
637978SPeter.Dunlap@Sun.COM *
647978SPeter.Dunlap@Sun.COM * target --> session --> connection --> task
657978SPeter.Dunlap@Sun.COM *
667978SPeter.Dunlap@Sun.COM * The session dcmd should allow the printing of all associated tasks for the
677978SPeter.Dunlap@Sun.COM * sessions without printing all the associated connections. To accomplish
687978SPeter.Dunlap@Sun.COM * this the following structure contains a bit for each object type. Dcmds
69*12114SPeter.Gill@Sun.COM * should invoke the functions for child objects if any bits are set
707978SPeter.Dunlap@Sun.COM * in iscsi_dcmd_ctrl_t but the functions for the child object should only
71*12114SPeter.Gill@Sun.COM * print data if their associated bit is set. Each object type should print
72*12114SPeter.Gill@Sun.COM * a header for its first occurrence or if it is being printed as a child
73*12114SPeter.Gill@Sun.COM * object for the first occurrence under each parent. For the model to follow
74*12114SPeter.Gill@Sun.COM * see how idc->idc_header is handled in iscsi_sess_impl.
757978SPeter.Dunlap@Sun.COM *
767978SPeter.Dunlap@Sun.COM * Each dcmd should provide an external interface with the standard MDB API
777978SPeter.Dunlap@Sun.COM * and an internal interface that accepts iscsi_dcmd_ctrl_t. To display
787978SPeter.Dunlap@Sun.COM * child objects the dcmd calls the internal interface for the child object
797978SPeter.Dunlap@Sun.COM * directly. Dcmds invoked from the command line will, of course, call the
807978SPeter.Dunlap@Sun.COM * external interface. See iscsi_conn() and iscsi_conn_impl().
817978SPeter.Dunlap@Sun.COM */
827978SPeter.Dunlap@Sun.COM
837978SPeter.Dunlap@Sun.COM typedef struct {
847978SPeter.Dunlap@Sun.COM union {
857978SPeter.Dunlap@Sun.COM uint32_t idc_children;
867978SPeter.Dunlap@Sun.COM struct {
877978SPeter.Dunlap@Sun.COM uint32_t idc_tgt:1,
88*12114SPeter.Gill@Sun.COM idc_tpg:1,
897978SPeter.Dunlap@Sun.COM idc_tpgt:1,
907978SPeter.Dunlap@Sun.COM idc_portal:1,
917978SPeter.Dunlap@Sun.COM idc_sess:1,
927978SPeter.Dunlap@Sun.COM idc_conn:1,
93*12114SPeter.Gill@Sun.COM idc_svc:1,
947978SPeter.Dunlap@Sun.COM idc_print_ip:1,
957978SPeter.Dunlap@Sun.COM idc_task:1,
967978SPeter.Dunlap@Sun.COM idc_buffer:1,
977978SPeter.Dunlap@Sun.COM idc_states:1,
987978SPeter.Dunlap@Sun.COM idc_rc_audit:1,
997978SPeter.Dunlap@Sun.COM idc_lun:1,
100*12114SPeter.Gill@Sun.COM idc_hba:1,
101*12114SPeter.Gill@Sun.COM idc_cmd:1;
1027978SPeter.Dunlap@Sun.COM } child;
1037978SPeter.Dunlap@Sun.COM } u;
1047978SPeter.Dunlap@Sun.COM boolean_t idc_ini;
1057978SPeter.Dunlap@Sun.COM boolean_t idc_tgt;
1067978SPeter.Dunlap@Sun.COM boolean_t idc_verbose;
1077978SPeter.Dunlap@Sun.COM boolean_t idc_header;
1087978SPeter.Dunlap@Sun.COM /*
1097978SPeter.Dunlap@Sun.COM * Our connection dcmd code works off the global connection lists
1107978SPeter.Dunlap@Sun.COM * in IDM since we want to know about connections even when they
1117978SPeter.Dunlap@Sun.COM * have not progressed to the point that they have an associated
1127978SPeter.Dunlap@Sun.COM * session. If we use "::iscsi_sess [-c]" then we only want to
1137978SPeter.Dunlap@Sun.COM * see connections associated with particular session. To avoid
1147978SPeter.Dunlap@Sun.COM * writing a separate set of code to print session-specific connection
1157978SPeter.Dunlap@Sun.COM * the session code should set the sessions kernel address in the
1167978SPeter.Dunlap@Sun.COM * following field. The connection code will then only print
1177978SPeter.Dunlap@Sun.COM * connections that match.
1187978SPeter.Dunlap@Sun.COM */
1197978SPeter.Dunlap@Sun.COM uintptr_t idc_assoc_session;
1207978SPeter.Dunlap@Sun.COM } iscsi_dcmd_ctrl_t;
1217978SPeter.Dunlap@Sun.COM
122*12114SPeter.Gill@Sun.COM typedef struct idm_hba_walk_info {
123*12114SPeter.Gill@Sun.COM void **array;
124*12114SPeter.Gill@Sun.COM int n_elements;
125*12114SPeter.Gill@Sun.COM int cur_element;
126*12114SPeter.Gill@Sun.COM void *data;
127*12114SPeter.Gill@Sun.COM } idm_hba_walk_info_t;
128*12114SPeter.Gill@Sun.COM
1297978SPeter.Dunlap@Sun.COM static int iscsi_walk_all_sess(iscsi_dcmd_ctrl_t *idc);
1307978SPeter.Dunlap@Sun.COM static int iscsi_walk_all_conn(iscsi_dcmd_ctrl_t *idc);
1317978SPeter.Dunlap@Sun.COM static int iscsi_tgt_walk_cb(uintptr_t addr, const void *list_walker_data,
1327978SPeter.Dunlap@Sun.COM void *idc_void);
1337978SPeter.Dunlap@Sun.COM static int iscsi_tpgt_walk_cb(uintptr_t addr, const void *list_walker_data,
1347978SPeter.Dunlap@Sun.COM void *idc_void);
1357978SPeter.Dunlap@Sun.COM static int iscsi_tpg_walk_cb(uintptr_t addr, const void *list_walker_data,
1367978SPeter.Dunlap@Sun.COM void *idc_void);
1377978SPeter.Dunlap@Sun.COM static int iscsi_portal_walk_cb(uintptr_t addr, const void *list_walker_data,
1387978SPeter.Dunlap@Sun.COM void *idc_void);
1397978SPeter.Dunlap@Sun.COM static int iscsi_sess_walk_cb(uintptr_t addr, const void *list_walker_data,
1407978SPeter.Dunlap@Sun.COM void *idc_void);
1417978SPeter.Dunlap@Sun.COM static int iscsi_conn_walk_cb(uintptr_t addr, const void *list_walker_data,
1427978SPeter.Dunlap@Sun.COM void *idc_void);
1437978SPeter.Dunlap@Sun.COM static int iscsi_buffer_walk_cb(uintptr_t addr, const void *list_walker_data,
1447978SPeter.Dunlap@Sun.COM void *idc_void);
145*12114SPeter.Gill@Sun.COM static int iscsi_svc_walk_cb(uintptr_t addr, const void *list_walker_data,
146*12114SPeter.Gill@Sun.COM void *idc_void);
147*12114SPeter.Gill@Sun.COM static int iscsi_ini_hba_walk_cb(uintptr_t addr, const void *vhba,
148*12114SPeter.Gill@Sun.COM void *idc_void);
149*12114SPeter.Gill@Sun.COM static int iscsi_ini_sess_walk_cb(uintptr_t addr, const void *vsess,
150*12114SPeter.Gill@Sun.COM void *idc);
151*12114SPeter.Gill@Sun.COM static int iscsi_ini_conn_walk_cb(uintptr_t addr, const void *vconn,
152*12114SPeter.Gill@Sun.COM void *idc_void);
153*12114SPeter.Gill@Sun.COM static int iscsi_ini_lun_walk_cb(uintptr_t addr, const void *vlun,
154*12114SPeter.Gill@Sun.COM void *idc_void);
155*12114SPeter.Gill@Sun.COM static int iscsi_ini_cmd_walk_cb(uintptr_t addr, const void *vcmd,
156*12114SPeter.Gill@Sun.COM void *idc);
1577978SPeter.Dunlap@Sun.COM static int iscsi_tgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1587978SPeter.Dunlap@Sun.COM static int iscsi_tpgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1597978SPeter.Dunlap@Sun.COM static int iscsi_tpg_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1607978SPeter.Dunlap@Sun.COM static int iscsi_portal_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1617978SPeter.Dunlap@Sun.COM static int iscsi_sess_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1627978SPeter.Dunlap@Sun.COM static int iscsi_conn_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1637978SPeter.Dunlap@Sun.COM static void iscsi_print_iscsit_conn_data(idm_conn_t *ict);
164*12114SPeter.Gill@Sun.COM static void iscsi_print_ini_conn_data(idm_conn_t *ict);
1657978SPeter.Dunlap@Sun.COM static void iscsi_print_idm_conn_data(idm_conn_t *ict);
1667978SPeter.Dunlap@Sun.COM static int iscsi_task_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1677978SPeter.Dunlap@Sun.COM static void iscsi_print_iscsit_task_data(idm_task_t *idt);
1687978SPeter.Dunlap@Sun.COM static int iscsi_buffer_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
1697978SPeter.Dunlap@Sun.COM static idm_conn_type_t idm_conn_type(uintptr_t addr);
1707978SPeter.Dunlap@Sun.COM static int iscsi_i_task_impl(idm_task_t *idt, uintptr_t addr,
1717978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc);
1727978SPeter.Dunlap@Sun.COM static int iscsi_refcnt_impl(uintptr_t addr);
1737978SPeter.Dunlap@Sun.COM static int iscsi_sm_audit_impl(uintptr_t addr);
1747978SPeter.Dunlap@Sun.COM static int iscsi_isns(uintptr_t addr, uint_t flags, int argc,
1757978SPeter.Dunlap@Sun.COM const mdb_arg_t *argv);
176*12114SPeter.Gill@Sun.COM static int iscsi_svc_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
177*12114SPeter.Gill@Sun.COM static int iscsi_ini_hba_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc);
178*12114SPeter.Gill@Sun.COM static int iscsi_print_ini_sess(uintptr_t addr, iscsi_sess_t *sess,
179*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc);
180*12114SPeter.Gill@Sun.COM static int iscsi_print_ini_lun(uintptr_t addr, const iscsi_lun_t *lun,
181*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc);
182*12114SPeter.Gill@Sun.COM static int iscsi_print_ini_cmd(uintptr_t addr, const iscsi_cmd_t *cmd,
183*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc);
184*12114SPeter.Gill@Sun.COM static int iscsi_ini_sess_walk_init(mdb_walk_state_t *wsp);
185*12114SPeter.Gill@Sun.COM static int iscsi_ini_sess_step(mdb_walk_state_t *wsp);
186*12114SPeter.Gill@Sun.COM static int iscsi_ini_conn_walk_init(mdb_walk_state_t *wsp);
187*12114SPeter.Gill@Sun.COM static int iscsi_ini_conn_step(mdb_walk_state_t *wsp);
188*12114SPeter.Gill@Sun.COM static int iscsi_ini_lun_walk_init(mdb_walk_state_t *wsp);
189*12114SPeter.Gill@Sun.COM static int iscsi_ini_lun_step(mdb_walk_state_t *wsp);
190*12114SPeter.Gill@Sun.COM static int iscsi_ini_cmd_walk_init(mdb_walk_state_t *wsp);
191*12114SPeter.Gill@Sun.COM static int iscsi_ini_cmd_step(mdb_walk_state_t *wsp);
1929162SPeter.Dunlap@Sun.COM static const char *iscsi_idm_conn_event(unsigned int event);
1939162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsit_tgt_event(unsigned int event);
1949162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsit_sess_event(unsigned int event);
1959162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsit_login_event(unsigned int event);
1969162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsi_cmd_event(unsigned int event);
1979162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsi_sess_event(unsigned int event);
1989162SPeter.Dunlap@Sun.COM static const char *iscsi_idm_conn_state(unsigned int state);
1999162SPeter.Dunlap@Sun.COM static const char *iscsi_idm_task_state(unsigned int state);
2009162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsit_tgt_state(unsigned int state);
2019162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsit_sess_state(unsigned int state);
2029162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsit_login_state(unsigned int state);
2039162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsi_cmd_state(unsigned int state);
2049162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsi_sess_state(unsigned int state);
2059162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsi_conn_state(unsigned int state);
20610766SPeter.Cudhea@Sun.COM static const char *iscsi_iscsi_conn_event(unsigned int event);
2079162SPeter.Dunlap@Sun.COM static const char *iscsi_iscsi_login_state(unsigned int state);
2087978SPeter.Dunlap@Sun.COM
2097978SPeter.Dunlap@Sun.COM static void iscsi_format_timestamp(char *ts_str, int strlen,
2107978SPeter.Dunlap@Sun.COM timespec_t *ts);
2119162SPeter.Dunlap@Sun.COM static char *iscsi_inet_ntop(int af, const void *addr, char *buf, int addrlen);
2127978SPeter.Dunlap@Sun.COM static void convert2ascii(char *, const in6_addr_t *);
2137978SPeter.Dunlap@Sun.COM static int sa_to_str(struct sockaddr_storage *sa, char *addr);
2149373SPeter.Dunlap@Sun.COM static int iscsi_isns_esi_cb(uintptr_t addr, const void *walker_data,
2159373SPeter.Dunlap@Sun.COM void *data);
2167978SPeter.Dunlap@Sun.COM static int iscsi_isns_portal_cb(uintptr_t addr, const void *walker_data,
2177978SPeter.Dunlap@Sun.COM void *data);
2187978SPeter.Dunlap@Sun.COM
2197978SPeter.Dunlap@Sun.COM #define PORTAL_STR_LEN (INET6_ADDRSTRLEN + 7)
2207978SPeter.Dunlap@Sun.COM
2217978SPeter.Dunlap@Sun.COM /*
2227978SPeter.Dunlap@Sun.COM * ::iscsi_tgt [-scatgpbSRv]
2237978SPeter.Dunlap@Sun.COM *
2247978SPeter.Dunlap@Sun.COM * iscsi_tgt - Print out information associated with an iscsit target instance
2257978SPeter.Dunlap@Sun.COM *
2267978SPeter.Dunlap@Sun.COM * s Print associated session information
2277978SPeter.Dunlap@Sun.COM * c Print associated connection information
2287978SPeter.Dunlap@Sun.COM * a Print IP addresses with connection information
2297978SPeter.Dunlap@Sun.COM * t Print associated task information
2307978SPeter.Dunlap@Sun.COM * g Print associated TPG information
2317978SPeter.Dunlap@Sun.COM * p Print portals with TPG information
2327978SPeter.Dunlap@Sun.COM * b Print associated buffer information
2337978SPeter.Dunlap@Sun.COM * S Print recent state events and transitions
2347978SPeter.Dunlap@Sun.COM * R Print reference count audit data
2357978SPeter.Dunlap@Sun.COM * v Verbose output about the connection
2367978SPeter.Dunlap@Sun.COM */
2377978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
2387978SPeter.Dunlap@Sun.COM static int
iscsi_tgt(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)2397978SPeter.Dunlap@Sun.COM iscsi_tgt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
2407978SPeter.Dunlap@Sun.COM {
2417978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t idc;
2427978SPeter.Dunlap@Sun.COM int buffer = 0, task = 0, print_ip = 0;
2437978SPeter.Dunlap@Sun.COM int tpgt = 0, conn = 0, sess = 0, portal = 0;
2447978SPeter.Dunlap@Sun.COM int states = 0, rc_audit = 0;
2457978SPeter.Dunlap@Sun.COM uintptr_t iscsit_global_addr, avl_addr, list_addr;
2467978SPeter.Dunlap@Sun.COM GElf_Sym sym;
2477978SPeter.Dunlap@Sun.COM
2487978SPeter.Dunlap@Sun.COM bzero(&idc, sizeof (idc));
2497978SPeter.Dunlap@Sun.COM if (mdb_getopts(argc, argv,
2507978SPeter.Dunlap@Sun.COM 'a', MDB_OPT_SETBITS, TRUE, &print_ip,
2517978SPeter.Dunlap@Sun.COM 'g', MDB_OPT_SETBITS, TRUE, &tpgt,
2527978SPeter.Dunlap@Sun.COM 's', MDB_OPT_SETBITS, TRUE, &sess,
2537978SPeter.Dunlap@Sun.COM 'c', MDB_OPT_SETBITS, TRUE, &conn,
2547978SPeter.Dunlap@Sun.COM 't', MDB_OPT_SETBITS, TRUE, &task,
2557978SPeter.Dunlap@Sun.COM 'b', MDB_OPT_SETBITS, TRUE, &buffer,
2567978SPeter.Dunlap@Sun.COM 'p', MDB_OPT_SETBITS, TRUE, &portal,
2577978SPeter.Dunlap@Sun.COM 'S', MDB_OPT_SETBITS, TRUE, &states,
2587978SPeter.Dunlap@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
2597978SPeter.Dunlap@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
2607978SPeter.Dunlap@Sun.COM NULL) != argc)
2617978SPeter.Dunlap@Sun.COM return (DCMD_USAGE);
2627978SPeter.Dunlap@Sun.COM
2637978SPeter.Dunlap@Sun.COM idc.u.child.idc_tgt = 1;
2647978SPeter.Dunlap@Sun.COM idc.u.child.idc_print_ip = print_ip;
2657978SPeter.Dunlap@Sun.COM idc.u.child.idc_tpgt = tpgt;
2667978SPeter.Dunlap@Sun.COM idc.u.child.idc_portal = portal;
2677978SPeter.Dunlap@Sun.COM idc.u.child.idc_sess = sess;
2687978SPeter.Dunlap@Sun.COM idc.u.child.idc_conn = conn;
2697978SPeter.Dunlap@Sun.COM idc.u.child.idc_task = task;
2707978SPeter.Dunlap@Sun.COM idc.u.child.idc_buffer = buffer;
2717978SPeter.Dunlap@Sun.COM idc.u.child.idc_states = states;
2727978SPeter.Dunlap@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
2737978SPeter.Dunlap@Sun.COM
2747978SPeter.Dunlap@Sun.COM if (DCMD_HDRSPEC(flags))
2757978SPeter.Dunlap@Sun.COM idc.idc_header = 1;
2767978SPeter.Dunlap@Sun.COM
2777978SPeter.Dunlap@Sun.COM /*
2787978SPeter.Dunlap@Sun.COM * If no address was specified on the command line, we
2797978SPeter.Dunlap@Sun.COM * print out all tgtions
2807978SPeter.Dunlap@Sun.COM */
2817978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
2827978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
2837978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'iscsit_global'");
2847978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
2857978SPeter.Dunlap@Sun.COM }
2867978SPeter.Dunlap@Sun.COM iscsit_global_addr = (uintptr_t)sym.st_value;
2877978SPeter.Dunlap@Sun.COM avl_addr = iscsit_global_addr +
2887978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_target_list);
2897978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_tgt_walk_cb, &idc, avl_addr) == -1) {
2907978SPeter.Dunlap@Sun.COM mdb_warn("avl walk failed for global target tree");
2917978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
2927978SPeter.Dunlap@Sun.COM }
2937978SPeter.Dunlap@Sun.COM list_addr = iscsit_global_addr +
2947978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_deleted_target_list);
2957978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_tgt_walk_cb,
2967978SPeter.Dunlap@Sun.COM &idc, list_addr) == -1) {
2977978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for deleted target list");
2987978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
2997978SPeter.Dunlap@Sun.COM }
3007978SPeter.Dunlap@Sun.COM return (DCMD_OK);
3017978SPeter.Dunlap@Sun.COM }
302*12114SPeter.Gill@Sun.COM return (iscsi_tgt_impl(addr, &idc));
3037978SPeter.Dunlap@Sun.COM }
3047978SPeter.Dunlap@Sun.COM
3057978SPeter.Dunlap@Sun.COM static int
iscsi_tpg(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)3067978SPeter.Dunlap@Sun.COM iscsi_tpg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3077978SPeter.Dunlap@Sun.COM {
3087978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t idc;
3097978SPeter.Dunlap@Sun.COM uintptr_t iscsit_global_addr, avl_addr;
3107978SPeter.Dunlap@Sun.COM GElf_Sym sym;
311*12114SPeter.Gill@Sun.COM int rc_audit = 0;
3127978SPeter.Dunlap@Sun.COM
3137978SPeter.Dunlap@Sun.COM bzero(&idc, sizeof (idc));
3147978SPeter.Dunlap@Sun.COM if (mdb_getopts(argc, argv,
315*12114SPeter.Gill@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
3167978SPeter.Dunlap@Sun.COM NULL) != argc)
3177978SPeter.Dunlap@Sun.COM return (DCMD_USAGE);
3187978SPeter.Dunlap@Sun.COM
319*12114SPeter.Gill@Sun.COM /* Always print tpgs and portals */
320*12114SPeter.Gill@Sun.COM idc.u.child.idc_tpg = 1;
321*12114SPeter.Gill@Sun.COM idc.u.child.idc_portal = 1;
322*12114SPeter.Gill@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
3237978SPeter.Dunlap@Sun.COM if (DCMD_HDRSPEC(flags))
3247978SPeter.Dunlap@Sun.COM idc.idc_header = 1;
3257978SPeter.Dunlap@Sun.COM
3267978SPeter.Dunlap@Sun.COM /*
3277978SPeter.Dunlap@Sun.COM * If no address was specified on the command line, we
3287978SPeter.Dunlap@Sun.COM * print out all tgtions
3297978SPeter.Dunlap@Sun.COM */
3307978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
3317978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
3327978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'iscsit_global'");
3337978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
3347978SPeter.Dunlap@Sun.COM }
3357978SPeter.Dunlap@Sun.COM iscsit_global_addr = (uintptr_t)sym.st_value;
3367978SPeter.Dunlap@Sun.COM avl_addr = iscsit_global_addr +
3377978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_tpg_list);
3387978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_tpg_walk_cb, &idc, avl_addr) == -1) {
3397978SPeter.Dunlap@Sun.COM mdb_warn("avl walk failed for global target tree");
3407978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
3417978SPeter.Dunlap@Sun.COM }
3427978SPeter.Dunlap@Sun.COM return (DCMD_OK);
3437978SPeter.Dunlap@Sun.COM }
344*12114SPeter.Gill@Sun.COM return (iscsi_tpg_impl(addr, &idc));
3457978SPeter.Dunlap@Sun.COM }
3467978SPeter.Dunlap@Sun.COM
3477978SPeter.Dunlap@Sun.COM /*
348*12114SPeter.Gill@Sun.COM * ::iscsi_tpgt [-pR]
349*12114SPeter.Gill@Sun.COM *
350*12114SPeter.Gill@Sun.COM * Print tpgt information.
351*12114SPeter.Gill@Sun.COM * R Print reference count audit data
352*12114SPeter.Gill@Sun.COM * p Print portal data
353*12114SPeter.Gill@Sun.COM */
354*12114SPeter.Gill@Sun.COM static int
iscsi_tpgt(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)355*12114SPeter.Gill@Sun.COM iscsi_tpgt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
356*12114SPeter.Gill@Sun.COM {
357*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t idc;
358*12114SPeter.Gill@Sun.COM uintptr_t iscsit_global_addr, avl_addr, list_addr;
359*12114SPeter.Gill@Sun.COM GElf_Sym sym;
360*12114SPeter.Gill@Sun.COM int rc_audit = 0, portal = 0;
361*12114SPeter.Gill@Sun.COM
362*12114SPeter.Gill@Sun.COM bzero(&idc, sizeof (idc));
363*12114SPeter.Gill@Sun.COM if (mdb_getopts(argc, argv,
364*12114SPeter.Gill@Sun.COM 'p', MDB_OPT_SETBITS, TRUE, &portal,
365*12114SPeter.Gill@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
366*12114SPeter.Gill@Sun.COM NULL) != argc)
367*12114SPeter.Gill@Sun.COM return (DCMD_USAGE);
368*12114SPeter.Gill@Sun.COM
369*12114SPeter.Gill@Sun.COM idc.u.child.idc_tpgt = 1;
370*12114SPeter.Gill@Sun.COM idc.u.child.idc_portal = portal;
371*12114SPeter.Gill@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
372*12114SPeter.Gill@Sun.COM if (DCMD_HDRSPEC(flags))
373*12114SPeter.Gill@Sun.COM idc.idc_header = 1;
374*12114SPeter.Gill@Sun.COM
375*12114SPeter.Gill@Sun.COM /*
376*12114SPeter.Gill@Sun.COM * If no address was specified on the command line,
377*12114SPeter.Gill@Sun.COM * print out all tpgts
378*12114SPeter.Gill@Sun.COM */
379*12114SPeter.Gill@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
380*12114SPeter.Gill@Sun.COM if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
381*12114SPeter.Gill@Sun.COM mdb_warn("failed to find symbol 'iscsit_global'");
382*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
383*12114SPeter.Gill@Sun.COM }
384*12114SPeter.Gill@Sun.COM iscsit_global_addr = (uintptr_t)sym.st_value;
385*12114SPeter.Gill@Sun.COM avl_addr = iscsit_global_addr +
386*12114SPeter.Gill@Sun.COM offsetof(iscsit_global_t, global_target_list);
387*12114SPeter.Gill@Sun.COM if (mdb_pwalk("avl", iscsi_tgt_walk_cb, &idc, avl_addr) == -1) {
388*12114SPeter.Gill@Sun.COM mdb_warn("avl walk failed for global target tree");
389*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
390*12114SPeter.Gill@Sun.COM }
391*12114SPeter.Gill@Sun.COM list_addr = iscsit_global_addr +
392*12114SPeter.Gill@Sun.COM offsetof(iscsit_global_t, global_deleted_target_list);
393*12114SPeter.Gill@Sun.COM if (mdb_pwalk("list", iscsi_tgt_walk_cb,
394*12114SPeter.Gill@Sun.COM &idc, list_addr) == -1) {
395*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for deleted target list");
396*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
397*12114SPeter.Gill@Sun.COM }
398*12114SPeter.Gill@Sun.COM return (DCMD_OK);
399*12114SPeter.Gill@Sun.COM }
400*12114SPeter.Gill@Sun.COM return (iscsi_tpgt_impl(addr, &idc));
401*12114SPeter.Gill@Sun.COM }
402*12114SPeter.Gill@Sun.COM
403*12114SPeter.Gill@Sun.COM /*
404*12114SPeter.Gill@Sun.COM * ::iscsi_sess [-ablmtvcSRIT]
4057978SPeter.Dunlap@Sun.COM *
4067978SPeter.Dunlap@Sun.COM * iscsi_sess - Print out information associated with an iSCSI session
4077978SPeter.Dunlap@Sun.COM *
4087978SPeter.Dunlap@Sun.COM * I Print only initiator sessions
4097978SPeter.Dunlap@Sun.COM * T Print only target sessions
4107978SPeter.Dunlap@Sun.COM * c Print associated connection information
4117978SPeter.Dunlap@Sun.COM * a Print IP addresses with connection information
4127978SPeter.Dunlap@Sun.COM * t Print associated task information
413*12114SPeter.Gill@Sun.COM * l Print associated lun information (with -I)
414*12114SPeter.Gill@Sun.COM * m Print associated initiator command information (with -I)
4157978SPeter.Dunlap@Sun.COM * b Print associated buffer information
4167978SPeter.Dunlap@Sun.COM * S Print recent state events and transitions
4177978SPeter.Dunlap@Sun.COM * R Print reference count audit data
4187978SPeter.Dunlap@Sun.COM * v Verbose output about the connection
4197978SPeter.Dunlap@Sun.COM */
4207978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
4217978SPeter.Dunlap@Sun.COM static int
iscsi_sess(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)4227978SPeter.Dunlap@Sun.COM iscsi_sess(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4237978SPeter.Dunlap@Sun.COM {
4247978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t idc;
4257978SPeter.Dunlap@Sun.COM int buffer = 0, task = 0, conn = 0, print_ip = 0;
426*12114SPeter.Gill@Sun.COM int states = 0, rc_audit = 0, commands = 0;
427*12114SPeter.Gill@Sun.COM int luns = 0;
4287978SPeter.Dunlap@Sun.COM
4297978SPeter.Dunlap@Sun.COM bzero(&idc, sizeof (idc));
4307978SPeter.Dunlap@Sun.COM if (mdb_getopts(argc, argv,
4317978SPeter.Dunlap@Sun.COM 'I', MDB_OPT_SETBITS, TRUE, &idc.idc_ini,
4327978SPeter.Dunlap@Sun.COM 'T', MDB_OPT_SETBITS, TRUE, &idc.idc_tgt,
4337978SPeter.Dunlap@Sun.COM 'a', MDB_OPT_SETBITS, TRUE, &print_ip,
4347978SPeter.Dunlap@Sun.COM 'c', MDB_OPT_SETBITS, TRUE, &conn,
4357978SPeter.Dunlap@Sun.COM 't', MDB_OPT_SETBITS, TRUE, &task,
436*12114SPeter.Gill@Sun.COM 'l', MDB_OPT_SETBITS, TRUE, &luns,
437*12114SPeter.Gill@Sun.COM 'm', MDB_OPT_SETBITS, TRUE, &commands,
4387978SPeter.Dunlap@Sun.COM 'b', MDB_OPT_SETBITS, TRUE, &buffer,
4397978SPeter.Dunlap@Sun.COM 'S', MDB_OPT_SETBITS, TRUE, &states,
4407978SPeter.Dunlap@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
4417978SPeter.Dunlap@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
4427978SPeter.Dunlap@Sun.COM NULL) != argc)
4437978SPeter.Dunlap@Sun.COM return (DCMD_USAGE);
4447978SPeter.Dunlap@Sun.COM
4457978SPeter.Dunlap@Sun.COM idc.u.child.idc_sess = 1;
4467978SPeter.Dunlap@Sun.COM idc.u.child.idc_print_ip = print_ip;
4477978SPeter.Dunlap@Sun.COM idc.u.child.idc_conn = conn;
4487978SPeter.Dunlap@Sun.COM idc.u.child.idc_task = task;
449*12114SPeter.Gill@Sun.COM idc.u.child.idc_cmd = commands;
450*12114SPeter.Gill@Sun.COM idc.u.child.idc_lun = luns;
4517978SPeter.Dunlap@Sun.COM idc.u.child.idc_buffer = buffer;
4527978SPeter.Dunlap@Sun.COM idc.u.child.idc_states = states;
4537978SPeter.Dunlap@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
4547978SPeter.Dunlap@Sun.COM if (DCMD_HDRSPEC(flags))
4557978SPeter.Dunlap@Sun.COM idc.idc_header = 1;
4567978SPeter.Dunlap@Sun.COM
4577978SPeter.Dunlap@Sun.COM /*
4587978SPeter.Dunlap@Sun.COM * If no address was specified on the command line, we
4597978SPeter.Dunlap@Sun.COM * print out all sessions
4607978SPeter.Dunlap@Sun.COM */
4617978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
4627978SPeter.Dunlap@Sun.COM return (iscsi_walk_all_sess(&idc));
4637978SPeter.Dunlap@Sun.COM }
464*12114SPeter.Gill@Sun.COM return (iscsi_sess_impl(addr, &idc));
4657978SPeter.Dunlap@Sun.COM }
4667978SPeter.Dunlap@Sun.COM
4677978SPeter.Dunlap@Sun.COM
4687978SPeter.Dunlap@Sun.COM
4697978SPeter.Dunlap@Sun.COM /*
470*12114SPeter.Gill@Sun.COM * ::iscsi_conn [-abmtvSRIT]
4717978SPeter.Dunlap@Sun.COM *
4727978SPeter.Dunlap@Sun.COM * iscsi_conn - Print out information associated with an iSCSI connection
4737978SPeter.Dunlap@Sun.COM *
4747978SPeter.Dunlap@Sun.COM * I Print only initiator connections
4757978SPeter.Dunlap@Sun.COM * T Print only target connections
4767978SPeter.Dunlap@Sun.COM * a Print IP addresses with connection information
4777978SPeter.Dunlap@Sun.COM * t Print associated task information
4787978SPeter.Dunlap@Sun.COM * b Print associated buffer information
479*12114SPeter.Gill@Sun.COM * m Print associated initiator commands (with -I)
4807978SPeter.Dunlap@Sun.COM * S Print recent state events and transitions
4817978SPeter.Dunlap@Sun.COM * R Print reference count audit data
4827978SPeter.Dunlap@Sun.COM * v Verbose output about the connection
4837978SPeter.Dunlap@Sun.COM */
4847978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
4857978SPeter.Dunlap@Sun.COM static int
iscsi_conn(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)4867978SPeter.Dunlap@Sun.COM iscsi_conn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4877978SPeter.Dunlap@Sun.COM {
4887978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t idc;
4897978SPeter.Dunlap@Sun.COM int buffer = 0, task = 0, print_ip = 0;
490*12114SPeter.Gill@Sun.COM int states = 0, rc_audit = 0, commands = 0;
4917978SPeter.Dunlap@Sun.COM
4927978SPeter.Dunlap@Sun.COM bzero(&idc, sizeof (idc));
4937978SPeter.Dunlap@Sun.COM if (mdb_getopts(argc, argv,
4947978SPeter.Dunlap@Sun.COM 'I', MDB_OPT_SETBITS, TRUE, &idc.idc_ini,
4957978SPeter.Dunlap@Sun.COM 'T', MDB_OPT_SETBITS, TRUE, &idc.idc_tgt,
4967978SPeter.Dunlap@Sun.COM 'a', MDB_OPT_SETBITS, TRUE, &print_ip,
4977978SPeter.Dunlap@Sun.COM 't', MDB_OPT_SETBITS, TRUE, &task,
4987978SPeter.Dunlap@Sun.COM 'b', MDB_OPT_SETBITS, TRUE, &buffer,
499*12114SPeter.Gill@Sun.COM 'm', MDB_OPT_SETBITS, TRUE, &commands,
5007978SPeter.Dunlap@Sun.COM 'S', MDB_OPT_SETBITS, TRUE, &states,
5017978SPeter.Dunlap@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
5027978SPeter.Dunlap@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
5037978SPeter.Dunlap@Sun.COM NULL) != argc)
5047978SPeter.Dunlap@Sun.COM return (DCMD_USAGE);
5057978SPeter.Dunlap@Sun.COM
5067978SPeter.Dunlap@Sun.COM idc.u.child.idc_conn = 1;
5077978SPeter.Dunlap@Sun.COM idc.u.child.idc_print_ip = print_ip;
5087978SPeter.Dunlap@Sun.COM idc.u.child.idc_task = task;
5097978SPeter.Dunlap@Sun.COM idc.u.child.idc_buffer = buffer;
510*12114SPeter.Gill@Sun.COM idc.u.child.idc_cmd = commands;
5117978SPeter.Dunlap@Sun.COM idc.u.child.idc_states = states;
5127978SPeter.Dunlap@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
5137978SPeter.Dunlap@Sun.COM if (DCMD_HDRSPEC(flags))
5147978SPeter.Dunlap@Sun.COM idc.idc_header = 1;
5157978SPeter.Dunlap@Sun.COM
5167978SPeter.Dunlap@Sun.COM /*
5177978SPeter.Dunlap@Sun.COM * If no address was specified on the command line, we
5187978SPeter.Dunlap@Sun.COM * print out all connections
5197978SPeter.Dunlap@Sun.COM */
5207978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
5217978SPeter.Dunlap@Sun.COM return (iscsi_walk_all_conn(&idc));
522*12114SPeter.Gill@Sun.COM }
523*12114SPeter.Gill@Sun.COM return (iscsi_conn_impl(addr, &idc));
524*12114SPeter.Gill@Sun.COM }
525*12114SPeter.Gill@Sun.COM
526*12114SPeter.Gill@Sun.COM
527*12114SPeter.Gill@Sun.COM /*
528*12114SPeter.Gill@Sun.COM * ::iscsi_svc [-vR]
529*12114SPeter.Gill@Sun.COM *
530*12114SPeter.Gill@Sun.COM * iscsi_svc - Print out information associated with an iSCSI svc
531*12114SPeter.Gill@Sun.COM *
532*12114SPeter.Gill@Sun.COM * R Print reference count audit data
533*12114SPeter.Gill@Sun.COM * v Verbose output about the service
534*12114SPeter.Gill@Sun.COM */
535*12114SPeter.Gill@Sun.COM static int
iscsi_svc(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)536*12114SPeter.Gill@Sun.COM iscsi_svc(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
537*12114SPeter.Gill@Sun.COM {
538*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t idc;
539*12114SPeter.Gill@Sun.COM GElf_Sym sym;
540*12114SPeter.Gill@Sun.COM uintptr_t idm_addr;
541*12114SPeter.Gill@Sun.COM uintptr_t svc_list_addr;
542*12114SPeter.Gill@Sun.COM int rc_audit = 0;
543*12114SPeter.Gill@Sun.COM
544*12114SPeter.Gill@Sun.COM bzero(&idc, sizeof (iscsi_dcmd_ctrl_t));
545*12114SPeter.Gill@Sun.COM
546*12114SPeter.Gill@Sun.COM if (mdb_getopts(argc, argv,
547*12114SPeter.Gill@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
548*12114SPeter.Gill@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
549*12114SPeter.Gill@Sun.COM NULL) != argc)
550*12114SPeter.Gill@Sun.COM return (DCMD_USAGE);
551*12114SPeter.Gill@Sun.COM
552*12114SPeter.Gill@Sun.COM idc.u.child.idc_svc = 1;
553*12114SPeter.Gill@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
554*12114SPeter.Gill@Sun.COM if (DCMD_HDRSPEC(flags)) {
555*12114SPeter.Gill@Sun.COM idc.idc_header = 1;
556*12114SPeter.Gill@Sun.COM }
557*12114SPeter.Gill@Sun.COM
558*12114SPeter.Gill@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
559*12114SPeter.Gill@Sun.COM if (mdb_lookup_by_name("idm", &sym) == -1) {
560*12114SPeter.Gill@Sun.COM mdb_warn("failed to find symbol 'idm'");
561*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
562*12114SPeter.Gill@Sun.COM }
563*12114SPeter.Gill@Sun.COM idm_addr = (uintptr_t)sym.st_value;
564*12114SPeter.Gill@Sun.COM svc_list_addr = idm_addr + offsetof(idm_global_t,
565*12114SPeter.Gill@Sun.COM idm_tgt_svc_list);
566*12114SPeter.Gill@Sun.COM
567*12114SPeter.Gill@Sun.COM if (mdb_pwalk("list", iscsi_svc_walk_cb, &idc,
568*12114SPeter.Gill@Sun.COM svc_list_addr) == -1) {
569*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for idm services");
570*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
571*12114SPeter.Gill@Sun.COM }
572*12114SPeter.Gill@Sun.COM return (DCMD_OK);
573*12114SPeter.Gill@Sun.COM }
574*12114SPeter.Gill@Sun.COM return (iscsi_svc_impl(addr, &idc));
575*12114SPeter.Gill@Sun.COM }
576*12114SPeter.Gill@Sun.COM
577*12114SPeter.Gill@Sun.COM /*
578*12114SPeter.Gill@Sun.COM * ::iscsi_portal -R
579*12114SPeter.Gill@Sun.COM *
580*12114SPeter.Gill@Sun.COM * iscsi_portal - Print out information associated with an iSCSI portal
581*12114SPeter.Gill@Sun.COM *
582*12114SPeter.Gill@Sun.COM * R Print reference count audit data
583*12114SPeter.Gill@Sun.COM */
584*12114SPeter.Gill@Sun.COM static int
iscsi_portal(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)585*12114SPeter.Gill@Sun.COM iscsi_portal(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
586*12114SPeter.Gill@Sun.COM {
587*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t idc;
588*12114SPeter.Gill@Sun.COM GElf_Sym sym;
589*12114SPeter.Gill@Sun.COM iscsit_global_t iscsit_global;
590*12114SPeter.Gill@Sun.COM uintptr_t iscsit_global_addr;
591*12114SPeter.Gill@Sun.COM uintptr_t tpg_avl_addr;
592*12114SPeter.Gill@Sun.COM int rc_audit = 0;
593*12114SPeter.Gill@Sun.COM
594*12114SPeter.Gill@Sun.COM bzero(&idc, sizeof (iscsi_dcmd_ctrl_t));
595*12114SPeter.Gill@Sun.COM
596*12114SPeter.Gill@Sun.COM if (mdb_getopts(argc, argv,
597*12114SPeter.Gill@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
598*12114SPeter.Gill@Sun.COM NULL) != argc)
599*12114SPeter.Gill@Sun.COM return (DCMD_USAGE);
600*12114SPeter.Gill@Sun.COM
601*12114SPeter.Gill@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
602*12114SPeter.Gill@Sun.COM idc.u.child.idc_portal = 1;
603*12114SPeter.Gill@Sun.COM if (DCMD_HDRSPEC(flags)) {
604*12114SPeter.Gill@Sun.COM idc.idc_header = 1;
605*12114SPeter.Gill@Sun.COM }
606*12114SPeter.Gill@Sun.COM
607*12114SPeter.Gill@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
608*12114SPeter.Gill@Sun.COM if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
609*12114SPeter.Gill@Sun.COM mdb_warn("failed to find symbol 'iscsit_global'");
610*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
611*12114SPeter.Gill@Sun.COM }
612*12114SPeter.Gill@Sun.COM
613*12114SPeter.Gill@Sun.COM iscsit_global_addr = (uintptr_t)sym.st_value;
614*12114SPeter.Gill@Sun.COM
615*12114SPeter.Gill@Sun.COM /* get and print the global default tpg */
616*12114SPeter.Gill@Sun.COM if (mdb_vread(&iscsit_global, sizeof (iscsit_global_t),
617*12114SPeter.Gill@Sun.COM iscsit_global_addr) != sizeof (iscsit_global_t)) {
618*12114SPeter.Gill@Sun.COM mdb_warn("failed to read iscsit_global_t");
619*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
620*12114SPeter.Gill@Sun.COM }
621*12114SPeter.Gill@Sun.COM if (iscsi_tpg_impl((uintptr_t)iscsit_global.global_default_tpg,
622*12114SPeter.Gill@Sun.COM &idc) != DCMD_OK) {
623*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
624*12114SPeter.Gill@Sun.COM }
625*12114SPeter.Gill@Sun.COM
626*12114SPeter.Gill@Sun.COM /* Walk the tpgs for the rest of the portals */
627*12114SPeter.Gill@Sun.COM tpg_avl_addr = iscsit_global_addr + offsetof(iscsit_global_t,
628*12114SPeter.Gill@Sun.COM global_tpg_list);
629*12114SPeter.Gill@Sun.COM if (mdb_pwalk("avl", iscsi_tpg_walk_cb, &idc,
630*12114SPeter.Gill@Sun.COM tpg_avl_addr) == -1) {
631*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for global tpg tree");
632*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
633*12114SPeter.Gill@Sun.COM }
634*12114SPeter.Gill@Sun.COM return (DCMD_OK);
635*12114SPeter.Gill@Sun.COM }
636*12114SPeter.Gill@Sun.COM return (iscsi_portal_impl(addr, &idc));
637*12114SPeter.Gill@Sun.COM }
638*12114SPeter.Gill@Sun.COM
639*12114SPeter.Gill@Sun.COM
640*12114SPeter.Gill@Sun.COM /*
641*12114SPeter.Gill@Sun.COM * ::iscsi_cmd -S
642*12114SPeter.Gill@Sun.COM *
643*12114SPeter.Gill@Sun.COM * iscsi_cmd - Print out information associated with an iSCSI cmd
644*12114SPeter.Gill@Sun.COM *
645*12114SPeter.Gill@Sun.COM * S Print state audit data
646*12114SPeter.Gill@Sun.COM */
647*12114SPeter.Gill@Sun.COM static int
iscsi_cmd(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)648*12114SPeter.Gill@Sun.COM iscsi_cmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
649*12114SPeter.Gill@Sun.COM {
650*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t idc;
651*12114SPeter.Gill@Sun.COM iscsi_cmd_t cmd;
652*12114SPeter.Gill@Sun.COM int states = 0;
653*12114SPeter.Gill@Sun.COM
654*12114SPeter.Gill@Sun.COM bzero(&idc, sizeof (iscsi_dcmd_ctrl_t));
655*12114SPeter.Gill@Sun.COM
656*12114SPeter.Gill@Sun.COM if (mdb_getopts(argc, argv,
657*12114SPeter.Gill@Sun.COM 'S', MDB_OPT_SETBITS, TRUE, &states,
658*12114SPeter.Gill@Sun.COM NULL) != argc)
659*12114SPeter.Gill@Sun.COM return (DCMD_USAGE);
660*12114SPeter.Gill@Sun.COM
661*12114SPeter.Gill@Sun.COM idc.u.child.idc_states = states;
662*12114SPeter.Gill@Sun.COM idc.u.child.idc_cmd = 1;
663*12114SPeter.Gill@Sun.COM idc.idc_ini = 1;
664*12114SPeter.Gill@Sun.COM if (DCMD_HDRSPEC(flags)) {
665*12114SPeter.Gill@Sun.COM idc.idc_header = 1;
666*12114SPeter.Gill@Sun.COM }
667*12114SPeter.Gill@Sun.COM
668*12114SPeter.Gill@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
669*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_hba", iscsi_ini_hba_walk_cb,
670*12114SPeter.Gill@Sun.COM &idc, NULL) == -1) {
671*12114SPeter.Gill@Sun.COM mdb_warn("iscsi cmd hba list walk failed");
672*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
673*12114SPeter.Gill@Sun.COM }
6747978SPeter.Dunlap@Sun.COM } else {
675*12114SPeter.Gill@Sun.COM if (mdb_vread(&cmd, sizeof (iscsi_cmd_t), addr) !=
676*12114SPeter.Gill@Sun.COM sizeof (iscsi_cmd_t)) {
677*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
678*12114SPeter.Gill@Sun.COM }
679*12114SPeter.Gill@Sun.COM return (iscsi_print_ini_cmd(addr, &cmd, &idc));
6807978SPeter.Dunlap@Sun.COM }
681*12114SPeter.Gill@Sun.COM return (DCMD_OK);
682*12114SPeter.Gill@Sun.COM }
683*12114SPeter.Gill@Sun.COM
684*12114SPeter.Gill@Sun.COM
685*12114SPeter.Gill@Sun.COM static int
iscsi_ini_hba_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)686*12114SPeter.Gill@Sun.COM iscsi_ini_hba_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc) {
687*12114SPeter.Gill@Sun.COM iscsi_hba_t ih;
688*12114SPeter.Gill@Sun.COM
689*12114SPeter.Gill@Sun.COM if (mdb_vread(&ih, sizeof (ih), addr) != sizeof (ih)) {
690*12114SPeter.Gill@Sun.COM mdb_warn("Invalid HBA\n");
691*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
692*12114SPeter.Gill@Sun.COM }
693*12114SPeter.Gill@Sun.COM
694*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_hba) {
695*12114SPeter.Gill@Sun.COM mdb_printf("iscsi_hba %p sessions: \n", addr);
696*12114SPeter.Gill@Sun.COM }
697*12114SPeter.Gill@Sun.COM
698*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_sess", iscsi_ini_sess_walk_cb, idc,
699*12114SPeter.Gill@Sun.COM (uintptr_t)ih.hba_sess_list) == -1) {
700*12114SPeter.Gill@Sun.COM mdb_warn("iscsi_sess_t walk failed");
701*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
702*12114SPeter.Gill@Sun.COM }
703*12114SPeter.Gill@Sun.COM return (DCMD_OK);
7047978SPeter.Dunlap@Sun.COM }
7057978SPeter.Dunlap@Sun.COM
7067978SPeter.Dunlap@Sun.COM /*
7077978SPeter.Dunlap@Sun.COM * ::iscsi_task [-bv]
7087978SPeter.Dunlap@Sun.COM *
7097978SPeter.Dunlap@Sun.COM * iscsi_task - Print out information associated with an iSCSI task
7107978SPeter.Dunlap@Sun.COM *
7117978SPeter.Dunlap@Sun.COM * b Print associated buffer information
7127978SPeter.Dunlap@Sun.COM * S Print recent state events and transitions
7137978SPeter.Dunlap@Sun.COM * R Print reference count audit data
7147978SPeter.Dunlap@Sun.COM * v Verbose output about the connection
7157978SPeter.Dunlap@Sun.COM */
7167978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
7177978SPeter.Dunlap@Sun.COM static int
iscsi_task(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)7187978SPeter.Dunlap@Sun.COM iscsi_task(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7197978SPeter.Dunlap@Sun.COM {
7207978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t idc;
7217978SPeter.Dunlap@Sun.COM int buffer = 0;
7227978SPeter.Dunlap@Sun.COM int states = 0, rc_audit = 0;
7237978SPeter.Dunlap@Sun.COM
7247978SPeter.Dunlap@Sun.COM bzero(&idc, sizeof (idc));
7257978SPeter.Dunlap@Sun.COM if (mdb_getopts(argc, argv,
7267978SPeter.Dunlap@Sun.COM 'b', MDB_OPT_SETBITS, TRUE, &buffer,
7277978SPeter.Dunlap@Sun.COM 'S', MDB_OPT_SETBITS, TRUE, &states,
7287978SPeter.Dunlap@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
7297978SPeter.Dunlap@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &idc.idc_verbose,
7307978SPeter.Dunlap@Sun.COM NULL) != argc)
7317978SPeter.Dunlap@Sun.COM return (DCMD_USAGE);
7327978SPeter.Dunlap@Sun.COM
7337978SPeter.Dunlap@Sun.COM idc.u.child.idc_conn = 0;
7347978SPeter.Dunlap@Sun.COM idc.u.child.idc_task = 1;
7357978SPeter.Dunlap@Sun.COM idc.u.child.idc_buffer = buffer;
7367978SPeter.Dunlap@Sun.COM idc.u.child.idc_states = states;
7377978SPeter.Dunlap@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
7387978SPeter.Dunlap@Sun.COM if (DCMD_HDRSPEC(flags))
7397978SPeter.Dunlap@Sun.COM idc.idc_header = 1;
7407978SPeter.Dunlap@Sun.COM
7417978SPeter.Dunlap@Sun.COM /*
7427978SPeter.Dunlap@Sun.COM * If no address was specified on the command line, we
7437978SPeter.Dunlap@Sun.COM * print out all connections
7447978SPeter.Dunlap@Sun.COM */
7457978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
7467978SPeter.Dunlap@Sun.COM return (iscsi_walk_all_conn(&idc));
7477978SPeter.Dunlap@Sun.COM }
748*12114SPeter.Gill@Sun.COM return (iscsi_task_impl(addr, &idc));
7497978SPeter.Dunlap@Sun.COM }
7507978SPeter.Dunlap@Sun.COM
7517978SPeter.Dunlap@Sun.COM /*
7527978SPeter.Dunlap@Sun.COM * ::iscsi_refcnt
7537978SPeter.Dunlap@Sun.COM *
7547978SPeter.Dunlap@Sun.COM * iscsi_refcnt - Dump an idm_refcnt_t structure
7557978SPeter.Dunlap@Sun.COM *
7567978SPeter.Dunlap@Sun.COM */
7577978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
7587978SPeter.Dunlap@Sun.COM static int
iscsi_refcnt(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)7597978SPeter.Dunlap@Sun.COM iscsi_refcnt(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7607978SPeter.Dunlap@Sun.COM {
7617978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
7627978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
7637978SPeter.Dunlap@Sun.COM }
764*12114SPeter.Gill@Sun.COM return (iscsi_refcnt_impl(addr));
7657978SPeter.Dunlap@Sun.COM }
7667978SPeter.Dunlap@Sun.COM
7677978SPeter.Dunlap@Sun.COM /*
7687978SPeter.Dunlap@Sun.COM * ::iscsi_states
7697978SPeter.Dunlap@Sun.COM *
7707978SPeter.Dunlap@Sun.COM * iscsi_states - Dump events and state transitions recoreded in an
7717978SPeter.Dunlap@Sun.COM * idm_sm_audit_t structure
7727978SPeter.Dunlap@Sun.COM *
7737978SPeter.Dunlap@Sun.COM */
7747978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
7757978SPeter.Dunlap@Sun.COM static int
iscsi_states(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)7767978SPeter.Dunlap@Sun.COM iscsi_states(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7777978SPeter.Dunlap@Sun.COM {
7787978SPeter.Dunlap@Sun.COM if (!(flags & DCMD_ADDRSPEC)) {
7797978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
7807978SPeter.Dunlap@Sun.COM }
781*12114SPeter.Gill@Sun.COM return (iscsi_sm_audit_impl(addr));
7827978SPeter.Dunlap@Sun.COM }
7837978SPeter.Dunlap@Sun.COM
7849162SPeter.Dunlap@Sun.COM
7857978SPeter.Dunlap@Sun.COM static int
iscsi_walk_all_sess(iscsi_dcmd_ctrl_t * idc)7867978SPeter.Dunlap@Sun.COM iscsi_walk_all_sess(iscsi_dcmd_ctrl_t *idc)
7877978SPeter.Dunlap@Sun.COM {
7887978SPeter.Dunlap@Sun.COM uintptr_t iscsit_global_addr;
7897978SPeter.Dunlap@Sun.COM uintptr_t avl_addr;
7907978SPeter.Dunlap@Sun.COM uintptr_t list_addr;
7917978SPeter.Dunlap@Sun.COM GElf_Sym sym;
792*12114SPeter.Gill@Sun.COM
7939162SPeter.Dunlap@Sun.COM /* Initiator sessions */
7949162SPeter.Dunlap@Sun.COM if (idc->idc_ini) {
795*12114SPeter.Gill@Sun.COM /* Always print hba info on this path */
796*12114SPeter.Gill@Sun.COM idc->u.child.idc_hba = 1;
797*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_hba", iscsi_ini_hba_walk_cb,
798*12114SPeter.Gill@Sun.COM idc, NULL) == -1) {
799*12114SPeter.Gill@Sun.COM mdb_warn("iscsi cmd hba list walk failed");
8009162SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8019162SPeter.Dunlap@Sun.COM }
802*12114SPeter.Gill@Sun.COM return (DCMD_OK);
8039162SPeter.Dunlap@Sun.COM }
804*12114SPeter.Gill@Sun.COM
8059162SPeter.Dunlap@Sun.COM /* Target sessions */
8067978SPeter.Dunlap@Sun.COM /* Walk discovery sessions */
8077978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
8087978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'iscsit_global'");
8097978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8107978SPeter.Dunlap@Sun.COM }
8117978SPeter.Dunlap@Sun.COM iscsit_global_addr = (uintptr_t)sym.st_value;
8127978SPeter.Dunlap@Sun.COM avl_addr = iscsit_global_addr +
8137978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_discovery_sessions);
8147978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_sess_walk_cb, idc, avl_addr) == -1) {
8157978SPeter.Dunlap@Sun.COM mdb_warn("avl walk failed for discovery sessions");
8167978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8177978SPeter.Dunlap@Sun.COM }
8187978SPeter.Dunlap@Sun.COM
8197978SPeter.Dunlap@Sun.COM /* Walk targets printing all session info */
8207978SPeter.Dunlap@Sun.COM avl_addr = iscsit_global_addr +
8217978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_target_list);
8227978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_tgt_walk_cb, idc, avl_addr) == -1) {
8237978SPeter.Dunlap@Sun.COM mdb_warn("avl walk failed for target/session tree");
8247978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8257978SPeter.Dunlap@Sun.COM }
8267978SPeter.Dunlap@Sun.COM
8277978SPeter.Dunlap@Sun.COM /* Walk deleting targets printing all session info */
8287978SPeter.Dunlap@Sun.COM list_addr = iscsit_global_addr +
8297978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_deleted_target_list);
8307978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_tgt_walk_cb, idc, list_addr) == -1) {
8317978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for deleted target list");
8327978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8337978SPeter.Dunlap@Sun.COM }
8347978SPeter.Dunlap@Sun.COM
8357978SPeter.Dunlap@Sun.COM return (DCMD_OK);
8367978SPeter.Dunlap@Sun.COM }
8377978SPeter.Dunlap@Sun.COM
8387978SPeter.Dunlap@Sun.COM static int
iscsi_walk_all_conn(iscsi_dcmd_ctrl_t * idc)8397978SPeter.Dunlap@Sun.COM iscsi_walk_all_conn(iscsi_dcmd_ctrl_t *idc)
8407978SPeter.Dunlap@Sun.COM {
8417978SPeter.Dunlap@Sun.COM uintptr_t idm_global_addr;
8427978SPeter.Dunlap@Sun.COM uintptr_t list_addr;
8437978SPeter.Dunlap@Sun.COM GElf_Sym sym;
8447978SPeter.Dunlap@Sun.COM
8457978SPeter.Dunlap@Sun.COM /* Walk initiator connections */
8467978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("idm", &sym) == -1) {
8477978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'idm'");
8487978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8497978SPeter.Dunlap@Sun.COM }
8507978SPeter.Dunlap@Sun.COM idm_global_addr = (uintptr_t)sym.st_value;
8517978SPeter.Dunlap@Sun.COM /* Walk connection list associated with the initiator */
8527978SPeter.Dunlap@Sun.COM list_addr = idm_global_addr + offsetof(idm_global_t, idm_ini_conn_list);
8537978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_conn_walk_cb, idc, list_addr) == -1) {
8547978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for initiator connections");
8557978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8567978SPeter.Dunlap@Sun.COM }
8577978SPeter.Dunlap@Sun.COM
8587978SPeter.Dunlap@Sun.COM /* Walk connection list associated with the target */
8597978SPeter.Dunlap@Sun.COM list_addr = idm_global_addr + offsetof(idm_global_t, idm_tgt_conn_list);
8607978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_conn_walk_cb, idc, list_addr) == -1) {
8617978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for target service instances");
8627978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
8637978SPeter.Dunlap@Sun.COM }
8647978SPeter.Dunlap@Sun.COM
8657978SPeter.Dunlap@Sun.COM return (DCMD_OK);
8667978SPeter.Dunlap@Sun.COM }
8677978SPeter.Dunlap@Sun.COM
8687978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
8697978SPeter.Dunlap@Sun.COM static int
iscsi_tpg_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)8707978SPeter.Dunlap@Sun.COM iscsi_tpg_walk_cb(uintptr_t addr, const void *list_walker_data,
8717978SPeter.Dunlap@Sun.COM void *idc_void)
8727978SPeter.Dunlap@Sun.COM {
8737978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
8747978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
8757978SPeter.Dunlap@Sun.COM int rc;
8767978SPeter.Dunlap@Sun.COM
8777978SPeter.Dunlap@Sun.COM rc = iscsi_tpg_impl(addr, idc);
8787978SPeter.Dunlap@Sun.COM
8797978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
8807978SPeter.Dunlap@Sun.COM }
8817978SPeter.Dunlap@Sun.COM
8827978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
8837978SPeter.Dunlap@Sun.COM static int
iscsi_tgt_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)8847978SPeter.Dunlap@Sun.COM iscsi_tgt_walk_cb(uintptr_t addr, const void *list_walker_data,
8857978SPeter.Dunlap@Sun.COM void *idc_void)
8867978SPeter.Dunlap@Sun.COM {
8877978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
8887978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
8897978SPeter.Dunlap@Sun.COM int rc;
8907978SPeter.Dunlap@Sun.COM
8917978SPeter.Dunlap@Sun.COM rc = iscsi_tgt_impl(addr, idc);
8927978SPeter.Dunlap@Sun.COM
8937978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
8947978SPeter.Dunlap@Sun.COM }
8957978SPeter.Dunlap@Sun.COM
8967978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
8977978SPeter.Dunlap@Sun.COM static int
iscsi_tpgt_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)8987978SPeter.Dunlap@Sun.COM iscsi_tpgt_walk_cb(uintptr_t addr, const void *list_walker_data,
8997978SPeter.Dunlap@Sun.COM void *idc_void)
9007978SPeter.Dunlap@Sun.COM {
9017978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
9027978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
9037978SPeter.Dunlap@Sun.COM int rc;
9047978SPeter.Dunlap@Sun.COM
9057978SPeter.Dunlap@Sun.COM rc = iscsi_tpgt_impl(addr, idc);
9067978SPeter.Dunlap@Sun.COM
9077978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
9087978SPeter.Dunlap@Sun.COM }
9097978SPeter.Dunlap@Sun.COM
9107978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
9117978SPeter.Dunlap@Sun.COM static int
iscsi_portal_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)9127978SPeter.Dunlap@Sun.COM iscsi_portal_walk_cb(uintptr_t addr, const void *list_walker_data,
9137978SPeter.Dunlap@Sun.COM void *idc_void)
9147978SPeter.Dunlap@Sun.COM {
9157978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
9167978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
9177978SPeter.Dunlap@Sun.COM int rc;
9187978SPeter.Dunlap@Sun.COM
9197978SPeter.Dunlap@Sun.COM rc = iscsi_portal_impl(addr, idc);
9207978SPeter.Dunlap@Sun.COM
9217978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
9227978SPeter.Dunlap@Sun.COM }
9237978SPeter.Dunlap@Sun.COM
9247978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
9257978SPeter.Dunlap@Sun.COM static int
iscsi_sess_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)9267978SPeter.Dunlap@Sun.COM iscsi_sess_walk_cb(uintptr_t addr, const void *list_walker_data,
9277978SPeter.Dunlap@Sun.COM void *idc_void)
9287978SPeter.Dunlap@Sun.COM {
9297978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
9307978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
9317978SPeter.Dunlap@Sun.COM int rc;
9327978SPeter.Dunlap@Sun.COM
9337978SPeter.Dunlap@Sun.COM rc = iscsi_sess_impl(addr, idc);
9347978SPeter.Dunlap@Sun.COM
9357978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
9367978SPeter.Dunlap@Sun.COM }
9377978SPeter.Dunlap@Sun.COM
9387978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
9397978SPeter.Dunlap@Sun.COM static int
iscsi_sess_conn_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)9407978SPeter.Dunlap@Sun.COM iscsi_sess_conn_walk_cb(uintptr_t addr, const void *list_walker_data,
9417978SPeter.Dunlap@Sun.COM void *idc_void)
9427978SPeter.Dunlap@Sun.COM {
9437978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
9447978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
9457978SPeter.Dunlap@Sun.COM iscsit_conn_t ict;
9467978SPeter.Dunlap@Sun.COM int rc;
9477978SPeter.Dunlap@Sun.COM
9487978SPeter.Dunlap@Sun.COM /*
9497978SPeter.Dunlap@Sun.COM * This function is different from iscsi_conn_walk_cb because
9507978SPeter.Dunlap@Sun.COM * we get an iscsit_conn_t instead of an idm_conn_t
9517978SPeter.Dunlap@Sun.COM *
9527978SPeter.Dunlap@Sun.COM * Read iscsit_conn_t, use to get idm_conn_t pointer
9537978SPeter.Dunlap@Sun.COM */
9547978SPeter.Dunlap@Sun.COM if (mdb_vread(&ict, sizeof (iscsit_conn_t), addr) !=
9557978SPeter.Dunlap@Sun.COM sizeof (iscsit_conn_t)) {
9567978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
9577978SPeter.Dunlap@Sun.COM }
9587978SPeter.Dunlap@Sun.COM rc = iscsi_conn_impl((uintptr_t)ict.ict_ic, idc);
9597978SPeter.Dunlap@Sun.COM
9607978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
9617978SPeter.Dunlap@Sun.COM }
9627978SPeter.Dunlap@Sun.COM
9637978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
9647978SPeter.Dunlap@Sun.COM static int
iscsi_conn_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)9657978SPeter.Dunlap@Sun.COM iscsi_conn_walk_cb(uintptr_t addr, const void *list_walker_data,
9667978SPeter.Dunlap@Sun.COM void *idc_void)
9677978SPeter.Dunlap@Sun.COM {
9687978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
9697978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
9707978SPeter.Dunlap@Sun.COM int rc;
9717978SPeter.Dunlap@Sun.COM
9727978SPeter.Dunlap@Sun.COM rc = iscsi_conn_impl(addr, idc);
9737978SPeter.Dunlap@Sun.COM
9747978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
9757978SPeter.Dunlap@Sun.COM }
9767978SPeter.Dunlap@Sun.COM
9777978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
9787978SPeter.Dunlap@Sun.COM static int
iscsi_buffer_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)9797978SPeter.Dunlap@Sun.COM iscsi_buffer_walk_cb(uintptr_t addr, const void *list_walker_data,
9807978SPeter.Dunlap@Sun.COM void *idc_void)
9817978SPeter.Dunlap@Sun.COM {
9827978SPeter.Dunlap@Sun.COM /* We don't particularly care about the list walker data */
9837978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
9847978SPeter.Dunlap@Sun.COM int rc;
9857978SPeter.Dunlap@Sun.COM
9867978SPeter.Dunlap@Sun.COM rc = iscsi_buffer_impl(addr, idc);
9877978SPeter.Dunlap@Sun.COM
9887978SPeter.Dunlap@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
9897978SPeter.Dunlap@Sun.COM }
9907978SPeter.Dunlap@Sun.COM
991*12114SPeter.Gill@Sun.COM /*ARGSUSED*/
992*12114SPeter.Gill@Sun.COM static int
iscsi_svc_walk_cb(uintptr_t addr,const void * list_walker_data,void * idc_void)993*12114SPeter.Gill@Sun.COM iscsi_svc_walk_cb(uintptr_t addr, const void *list_walker_data,
994*12114SPeter.Gill@Sun.COM void *idc_void)
995*12114SPeter.Gill@Sun.COM {
996*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
997*12114SPeter.Gill@Sun.COM int rc;
998*12114SPeter.Gill@Sun.COM
999*12114SPeter.Gill@Sun.COM rc = iscsi_svc_impl(addr, idc);
1000*12114SPeter.Gill@Sun.COM
1001*12114SPeter.Gill@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
1002*12114SPeter.Gill@Sun.COM }
1003*12114SPeter.Gill@Sun.COM
1004*12114SPeter.Gill@Sun.COM /*ARGSUSED*/
1005*12114SPeter.Gill@Sun.COM static int
iscsi_ini_hba_walk_cb(uintptr_t addr,const void * vhba,void * idc_void)1006*12114SPeter.Gill@Sun.COM iscsi_ini_hba_walk_cb(uintptr_t addr, const void *vhba,
1007*12114SPeter.Gill@Sun.COM void *idc_void) {
1008*12114SPeter.Gill@Sun.COM
1009*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc = idc_void;
1010*12114SPeter.Gill@Sun.COM int rc;
1011*12114SPeter.Gill@Sun.COM
1012*12114SPeter.Gill@Sun.COM rc = iscsi_ini_hba_impl(addr, idc);
1013*12114SPeter.Gill@Sun.COM
1014*12114SPeter.Gill@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
1015*12114SPeter.Gill@Sun.COM }
1016*12114SPeter.Gill@Sun.COM
1017*12114SPeter.Gill@Sun.COM static int
iscsi_ini_sess_walk_cb(uintptr_t addr,const void * vsess,void * idc_void)1018*12114SPeter.Gill@Sun.COM iscsi_ini_sess_walk_cb(uintptr_t addr, const void *vsess, void *idc_void)
1019*12114SPeter.Gill@Sun.COM {
1020*12114SPeter.Gill@Sun.COM int rc;
1021*12114SPeter.Gill@Sun.COM
1022*12114SPeter.Gill@Sun.COM if (vsess == NULL) {
1023*12114SPeter.Gill@Sun.COM return (WALK_ERR);
1024*12114SPeter.Gill@Sun.COM }
1025*12114SPeter.Gill@Sun.COM
1026*12114SPeter.Gill@Sun.COM rc = iscsi_print_ini_sess(addr, (iscsi_sess_t *)vsess,
1027*12114SPeter.Gill@Sun.COM (iscsi_dcmd_ctrl_t *)idc_void);
1028*12114SPeter.Gill@Sun.COM
1029*12114SPeter.Gill@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
1030*12114SPeter.Gill@Sun.COM }
1031*12114SPeter.Gill@Sun.COM
1032*12114SPeter.Gill@Sun.COM /*ARGSUSED*/
1033*12114SPeter.Gill@Sun.COM static int
iscsi_ini_conn_walk_cb(uintptr_t addr,const void * vconn,void * idc_void)1034*12114SPeter.Gill@Sun.COM iscsi_ini_conn_walk_cb(uintptr_t addr, const void *vconn, void *idc_void)
1035*12114SPeter.Gill@Sun.COM {
1036*12114SPeter.Gill@Sun.COM const iscsi_conn_t *ict = vconn;
1037*12114SPeter.Gill@Sun.COM int rc;
1038*12114SPeter.Gill@Sun.COM
1039*12114SPeter.Gill@Sun.COM if (vconn == NULL) {
1040*12114SPeter.Gill@Sun.COM return (WALK_ERR);
1041*12114SPeter.Gill@Sun.COM }
1042*12114SPeter.Gill@Sun.COM
1043*12114SPeter.Gill@Sun.COM /*
1044*12114SPeter.Gill@Sun.COM * Look up the idm_conn_t in the iscsi_conn_t and call the general
1045*12114SPeter.Gill@Sun.COM * connection handler.
1046*12114SPeter.Gill@Sun.COM */
1047*12114SPeter.Gill@Sun.COM rc = iscsi_conn_impl((uintptr_t)ict->conn_ic,
1048*12114SPeter.Gill@Sun.COM (iscsi_dcmd_ctrl_t *)idc_void);
1049*12114SPeter.Gill@Sun.COM
1050*12114SPeter.Gill@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
1051*12114SPeter.Gill@Sun.COM }
1052*12114SPeter.Gill@Sun.COM
1053*12114SPeter.Gill@Sun.COM static int
iscsi_ini_lun_walk_cb(uintptr_t addr,const void * vlun,void * idc_void)1054*12114SPeter.Gill@Sun.COM iscsi_ini_lun_walk_cb(uintptr_t addr, const void *vlun, void *idc_void)
1055*12114SPeter.Gill@Sun.COM {
1056*12114SPeter.Gill@Sun.COM int rc;
1057*12114SPeter.Gill@Sun.COM
1058*12114SPeter.Gill@Sun.COM if (vlun == NULL) {
1059*12114SPeter.Gill@Sun.COM return (WALK_ERR);
1060*12114SPeter.Gill@Sun.COM }
1061*12114SPeter.Gill@Sun.COM
1062*12114SPeter.Gill@Sun.COM rc = iscsi_print_ini_lun(addr, (iscsi_lun_t *)vlun,
1063*12114SPeter.Gill@Sun.COM (iscsi_dcmd_ctrl_t *)idc_void);
1064*12114SPeter.Gill@Sun.COM
1065*12114SPeter.Gill@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
1066*12114SPeter.Gill@Sun.COM }
1067*12114SPeter.Gill@Sun.COM
1068*12114SPeter.Gill@Sun.COM
10697978SPeter.Dunlap@Sun.COM static int
iscsi_tgt_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)10707978SPeter.Dunlap@Sun.COM iscsi_tgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
10717978SPeter.Dunlap@Sun.COM {
10727978SPeter.Dunlap@Sun.COM iscsit_tgt_t tgt;
10737978SPeter.Dunlap@Sun.COM uintptr_t avl_addr, rc_addr, states_addr;
10747978SPeter.Dunlap@Sun.COM char tgt_name[MAX_ISCSI_NODENAMELEN];
10757978SPeter.Dunlap@Sun.COM int verbose, states, rc_audit;
10767978SPeter.Dunlap@Sun.COM
10777978SPeter.Dunlap@Sun.COM /*
10787978SPeter.Dunlap@Sun.COM * Read iscsit_tgt_t
10797978SPeter.Dunlap@Sun.COM */
10807978SPeter.Dunlap@Sun.COM if (mdb_vread(&tgt, sizeof (iscsit_tgt_t), addr) !=
10817978SPeter.Dunlap@Sun.COM sizeof (iscsit_tgt_t)) {
10827978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
10837978SPeter.Dunlap@Sun.COM }
10847978SPeter.Dunlap@Sun.COM
10857978SPeter.Dunlap@Sun.COM /*
10867978SPeter.Dunlap@Sun.COM * Read target name if available
10877978SPeter.Dunlap@Sun.COM */
10887978SPeter.Dunlap@Sun.COM if ((tgt.target_name == NULL) ||
10897978SPeter.Dunlap@Sun.COM (mdb_readstr(tgt_name, sizeof (tgt_name),
10907978SPeter.Dunlap@Sun.COM (uintptr_t)tgt.target_name) == -1)) {
10917978SPeter.Dunlap@Sun.COM strcpy(tgt_name, "N/A");
10927978SPeter.Dunlap@Sun.COM }
10937978SPeter.Dunlap@Sun.COM
10947978SPeter.Dunlap@Sun.COM /*
10957978SPeter.Dunlap@Sun.COM * Brief output
10967978SPeter.Dunlap@Sun.COM *
10977978SPeter.Dunlap@Sun.COM * iscsit_tgt_t pointer
10987978SPeter.Dunlap@Sun.COM * iscsit_tgt_t.target_stmf_state
10997978SPeter.Dunlap@Sun.COM * iscsit_tgt_t.target_sess_list.avl_numnodes (session count)
11007978SPeter.Dunlap@Sun.COM * iscsit_tgt_t.target_name;
11017978SPeter.Dunlap@Sun.COM */
11027978SPeter.Dunlap@Sun.COM
11037978SPeter.Dunlap@Sun.COM verbose = idc->idc_verbose;
11047978SPeter.Dunlap@Sun.COM states = idc->u.child.idc_states;
11057978SPeter.Dunlap@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
11067978SPeter.Dunlap@Sun.COM
11077978SPeter.Dunlap@Sun.COM /* For now we will ignore the verbose flag */
11087978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_tgt) {
11097978SPeter.Dunlap@Sun.COM /* Print target data */
11107978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
11117978SPeter.Dunlap@Sun.COM mdb_printf("%<u>%-19s %-4s %-8s%</u>\n",
11127978SPeter.Dunlap@Sun.COM "iscsit_tgt_t", "Sess", "State");
11137978SPeter.Dunlap@Sun.COM }
11147978SPeter.Dunlap@Sun.COM mdb_printf("%-19p %-4d %-8d\n", addr,
11157978SPeter.Dunlap@Sun.COM tgt.target_sess_list.avl_numnodes,
11167978SPeter.Dunlap@Sun.COM tgt.target_state);
11177978SPeter.Dunlap@Sun.COM mdb_printf(" %s\n", tgt_name);
1118*12114SPeter.Gill@Sun.COM
1119*12114SPeter.Gill@Sun.COM /* Indent and disable verbose for any child structures */
1120*12114SPeter.Gill@Sun.COM mdb_inc_indent(4);
1121*12114SPeter.Gill@Sun.COM idc->idc_verbose = 0;
11227978SPeter.Dunlap@Sun.COM }
11237978SPeter.Dunlap@Sun.COM
11247978SPeter.Dunlap@Sun.COM /*
11257978SPeter.Dunlap@Sun.COM * Print states if requested
11267978SPeter.Dunlap@Sun.COM */
11277978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_tgt && states) {
11287978SPeter.Dunlap@Sun.COM states_addr = addr + offsetof(iscsit_tgt_t, target_state_audit);
11297978SPeter.Dunlap@Sun.COM
1130*12114SPeter.Gill@Sun.COM mdb_printf("State History(target_state_audit):\n");
11317978SPeter.Dunlap@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
11327978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
11337978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = 0;
11347978SPeter.Dunlap@Sun.COM }
11357978SPeter.Dunlap@Sun.COM
11367978SPeter.Dunlap@Sun.COM /*
11377978SPeter.Dunlap@Sun.COM * Print refcnt audit data if requested
11387978SPeter.Dunlap@Sun.COM */
11397978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_tgt && rc_audit) {
1140*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(target_sess_refcnt):\n");
11417978SPeter.Dunlap@Sun.COM rc_addr = addr +
11427978SPeter.Dunlap@Sun.COM offsetof(iscsit_tgt_t, target_sess_refcnt);
11437978SPeter.Dunlap@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
11447978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
11457978SPeter.Dunlap@Sun.COM
1146*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(target_refcnt):\n");
11477978SPeter.Dunlap@Sun.COM rc_addr = addr +
11487978SPeter.Dunlap@Sun.COM offsetof(iscsit_tgt_t, target_refcnt);
11497978SPeter.Dunlap@Sun.COM
11507978SPeter.Dunlap@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
11517978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
11527978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = 0;
11537978SPeter.Dunlap@Sun.COM }
11547978SPeter.Dunlap@Sun.COM
11557978SPeter.Dunlap@Sun.COM /* Any child objects to walk? */
1156*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tpgt || idc->u.child.idc_portal) {
1157*12114SPeter.Gill@Sun.COM
1158*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tgt) {
1159*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1160*12114SPeter.Gill@Sun.COM }
1161*12114SPeter.Gill@Sun.COM
11627978SPeter.Dunlap@Sun.COM /* Walk TPGT tree */
11637978SPeter.Dunlap@Sun.COM avl_addr = addr +
11647978SPeter.Dunlap@Sun.COM offsetof(iscsit_tgt_t, target_tpgt_list);
11657978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_tpgt_walk_cb, idc,
11667978SPeter.Dunlap@Sun.COM avl_addr) == -1) {
11677978SPeter.Dunlap@Sun.COM mdb_warn("target tpgt list walk failed");
11687978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
11697978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
11707978SPeter.Dunlap@Sun.COM }
1171*12114SPeter.Gill@Sun.COM }
1172*12114SPeter.Gill@Sun.COM
1173*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess || idc->u.child.idc_conn ||
1174*12114SPeter.Gill@Sun.COM idc->u.child.idc_task || idc->u.child.idc_buffer) {
1175*12114SPeter.Gill@Sun.COM
1176*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tgt || idc->u.child.idc_tpgt ||
1177*12114SPeter.Gill@Sun.COM idc->u.child.idc_portal) {
1178*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1179*12114SPeter.Gill@Sun.COM }
11807978SPeter.Dunlap@Sun.COM
11817978SPeter.Dunlap@Sun.COM /* Walk sess tree */
11827978SPeter.Dunlap@Sun.COM avl_addr = addr + offsetof(iscsit_tgt_t, target_sess_list);
11837978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_sess_walk_cb, idc,
11847978SPeter.Dunlap@Sun.COM avl_addr) == -1) {
11857978SPeter.Dunlap@Sun.COM mdb_warn("target sess list walk failed");
11867978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
11877978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
11887978SPeter.Dunlap@Sun.COM }
1189*12114SPeter.Gill@Sun.COM }
1190*12114SPeter.Gill@Sun.COM
1191*12114SPeter.Gill@Sun.COM /* If tgts were handled decrease indent and reset header */
1192*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tgt) {
11937978SPeter.Dunlap@Sun.COM idc->idc_header = 0;
1194*12114SPeter.Gill@Sun.COM mdb_dec_indent(4);
11957978SPeter.Dunlap@Sun.COM }
11967978SPeter.Dunlap@Sun.COM
11977978SPeter.Dunlap@Sun.COM idc->idc_verbose = verbose;
11987978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = states;
11997978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
12007978SPeter.Dunlap@Sun.COM return (DCMD_OK);
12017978SPeter.Dunlap@Sun.COM }
12027978SPeter.Dunlap@Sun.COM
12037978SPeter.Dunlap@Sun.COM static int
iscsi_tpgt_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)12047978SPeter.Dunlap@Sun.COM iscsi_tpgt_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
12057978SPeter.Dunlap@Sun.COM {
12067978SPeter.Dunlap@Sun.COM iscsit_tpgt_t tpgt;
12077978SPeter.Dunlap@Sun.COM iscsit_tpg_t tpg;
1208*12114SPeter.Gill@Sun.COM uintptr_t avl_addr, tpg_addr, rc_addr;
1209*12114SPeter.Gill@Sun.COM int rc_audit;
12107978SPeter.Dunlap@Sun.COM
12117978SPeter.Dunlap@Sun.COM /*
12127978SPeter.Dunlap@Sun.COM * Read iscsit_tpgt_t
12137978SPeter.Dunlap@Sun.COM */
12147978SPeter.Dunlap@Sun.COM if (mdb_vread(&tpgt, sizeof (iscsit_tpgt_t), addr) !=
12157978SPeter.Dunlap@Sun.COM sizeof (iscsit_tpgt_t)) {
12167978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
12177978SPeter.Dunlap@Sun.COM }
12187978SPeter.Dunlap@Sun.COM
12197978SPeter.Dunlap@Sun.COM tpg_addr = (uintptr_t)tpgt.tpgt_tpg;
12207978SPeter.Dunlap@Sun.COM
12217978SPeter.Dunlap@Sun.COM /*
12227978SPeter.Dunlap@Sun.COM * Read iscsit_tpg_t
12237978SPeter.Dunlap@Sun.COM */
12247978SPeter.Dunlap@Sun.COM if (mdb_vread(&tpg, sizeof (iscsit_tpg_t), tpg_addr) !=
12257978SPeter.Dunlap@Sun.COM sizeof (iscsit_tpg_t)) {
12267978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
12277978SPeter.Dunlap@Sun.COM }
12287978SPeter.Dunlap@Sun.COM
1229*12114SPeter.Gill@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
1230*12114SPeter.Gill@Sun.COM
12317978SPeter.Dunlap@Sun.COM /*
12327978SPeter.Dunlap@Sun.COM * Brief output
12337978SPeter.Dunlap@Sun.COM *
12347978SPeter.Dunlap@Sun.COM * iscsit_tpgt_t pointer
12357978SPeter.Dunlap@Sun.COM * iscsit_tpg_t pointer
12367978SPeter.Dunlap@Sun.COM * iscsit_tpg_t.tpg_name
12377978SPeter.Dunlap@Sun.COM * iscsit_tpgt_t.tpgt_tag;
12387978SPeter.Dunlap@Sun.COM */
12397978SPeter.Dunlap@Sun.COM
12407978SPeter.Dunlap@Sun.COM /* For now we will ignore the verbose flag */
12417978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_tpgt) {
12427978SPeter.Dunlap@Sun.COM /* Print target data */
12437978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
12447978SPeter.Dunlap@Sun.COM mdb_printf("%<u>%-?s %-?s %-18s %-6s%</u>\n",
12457978SPeter.Dunlap@Sun.COM "iscsit_tpgt_t", "iscsit_tpg_t", "Name", "Tag");
12467978SPeter.Dunlap@Sun.COM }
12477978SPeter.Dunlap@Sun.COM mdb_printf("%?p %?p %-18s 0x%04x\n", addr, tpgt.tpgt_tpg,
12487978SPeter.Dunlap@Sun.COM tpg.tpg_name, tpgt.tpgt_tag);
1249*12114SPeter.Gill@Sun.COM
1250*12114SPeter.Gill@Sun.COM if (rc_audit) {
1251*12114SPeter.Gill@Sun.COM (void) mdb_inc_indent(4);
1252*12114SPeter.Gill@Sun.COM
1253*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(tpgt_refcnt):\n");
1254*12114SPeter.Gill@Sun.COM rc_addr = addr + offsetof(iscsit_tpgt_t, tpgt_refcnt);
1255*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
1256*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1257*12114SPeter.Gill@Sun.COM
1258*12114SPeter.Gill@Sun.COM idc->u.child.idc_rc_audit = 0;
1259*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
1260*12114SPeter.Gill@Sun.COM }
12617978SPeter.Dunlap@Sun.COM }
12627978SPeter.Dunlap@Sun.COM
12637978SPeter.Dunlap@Sun.COM /*
12647978SPeter.Dunlap@Sun.COM * Assume for now that anyone interested in TPGT wants to see the
1265*12114SPeter.Gill@Sun.COM * portals as well. Enable idc_header for the portals.
12667978SPeter.Dunlap@Sun.COM */
12677978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
12687978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(4);
12697978SPeter.Dunlap@Sun.COM avl_addr = tpg_addr + offsetof(iscsit_tpg_t, tpg_portal_list);
12707978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_portal_walk_cb, idc, avl_addr) == -1) {
12717978SPeter.Dunlap@Sun.COM mdb_warn("portal list walk failed");
12727978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
12737978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
12747978SPeter.Dunlap@Sun.COM }
12757978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
12767978SPeter.Dunlap@Sun.COM idc->idc_header = 0;
12777978SPeter.Dunlap@Sun.COM
1278*12114SPeter.Gill@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
12797978SPeter.Dunlap@Sun.COM return (DCMD_OK);
12807978SPeter.Dunlap@Sun.COM }
12817978SPeter.Dunlap@Sun.COM
12827978SPeter.Dunlap@Sun.COM static int
iscsi_tpg_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)12837978SPeter.Dunlap@Sun.COM iscsi_tpg_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
12847978SPeter.Dunlap@Sun.COM {
12857978SPeter.Dunlap@Sun.COM iscsit_tpg_t tpg;
1286*12114SPeter.Gill@Sun.COM uintptr_t avl_addr, rc_addr;
1287*12114SPeter.Gill@Sun.COM int rc_audit = 0;
1288*12114SPeter.Gill@Sun.COM
1289*12114SPeter.Gill@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
12907978SPeter.Dunlap@Sun.COM
12917978SPeter.Dunlap@Sun.COM /*
12927978SPeter.Dunlap@Sun.COM * Read iscsit_tpg_t
12937978SPeter.Dunlap@Sun.COM */
12947978SPeter.Dunlap@Sun.COM if (mdb_vread(&tpg, sizeof (iscsit_tpg_t), addr) !=
12957978SPeter.Dunlap@Sun.COM sizeof (iscsit_tpg_t)) {
12967978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
12977978SPeter.Dunlap@Sun.COM }
12987978SPeter.Dunlap@Sun.COM
12997978SPeter.Dunlap@Sun.COM /*
13007978SPeter.Dunlap@Sun.COM * Brief output
13017978SPeter.Dunlap@Sun.COM *
13027978SPeter.Dunlap@Sun.COM * iscsit_tpgt_t pointer
13037978SPeter.Dunlap@Sun.COM * iscsit_tpg_t pointer
13047978SPeter.Dunlap@Sun.COM * iscsit_tpg_t.tpg_name
13057978SPeter.Dunlap@Sun.COM * iscsit_tpgt_t.tpgt_tag;
13067978SPeter.Dunlap@Sun.COM */
13077978SPeter.Dunlap@Sun.COM
1308*12114SPeter.Gill@Sun.COM /* Print tpg data */
1309*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tpg) {
1310*12114SPeter.Gill@Sun.COM if (idc->idc_header) {
1311*12114SPeter.Gill@Sun.COM mdb_printf("%<u>%-?s %-18s%</u>\n",
1312*12114SPeter.Gill@Sun.COM "iscsit_tpg_t", "Name");
1313*12114SPeter.Gill@Sun.COM }
1314*12114SPeter.Gill@Sun.COM mdb_printf("%?p %-18s\n", addr, tpg.tpg_name);
1315*12114SPeter.Gill@Sun.COM
1316*12114SPeter.Gill@Sun.COM (void) mdb_inc_indent(4);
1317*12114SPeter.Gill@Sun.COM
1318*12114SPeter.Gill@Sun.COM if (rc_audit) {
1319*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(tpg_refcnt):\n");
1320*12114SPeter.Gill@Sun.COM rc_addr = addr + offsetof(iscsit_tpg_t, tpg_refcnt);
1321*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
1322*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1323*12114SPeter.Gill@Sun.COM }
1324*12114SPeter.Gill@Sun.COM idc->u.child.idc_rc_audit = 0;
1325*12114SPeter.Gill@Sun.COM }
13267978SPeter.Dunlap@Sun.COM }
1327*12114SPeter.Gill@Sun.COM
1328*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_portal) {
1329*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tpg) {
1330*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1331*12114SPeter.Gill@Sun.COM }
1332*12114SPeter.Gill@Sun.COM
1333*12114SPeter.Gill@Sun.COM avl_addr = addr + offsetof(iscsit_tpg_t, tpg_portal_list);
1334*12114SPeter.Gill@Sun.COM if (mdb_pwalk("avl", iscsi_portal_walk_cb, idc,
1335*12114SPeter.Gill@Sun.COM avl_addr) == -1) {
1336*12114SPeter.Gill@Sun.COM mdb_warn("portal list walk failed");
1337*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tpg) {
1338*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
1339*12114SPeter.Gill@Sun.COM }
1340*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1341*12114SPeter.Gill@Sun.COM }
1342*12114SPeter.Gill@Sun.COM }
1343*12114SPeter.Gill@Sun.COM
1344*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_tpg) {
13457978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
1346*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
13477978SPeter.Dunlap@Sun.COM }
1348*12114SPeter.Gill@Sun.COM
1349*12114SPeter.Gill@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
13507978SPeter.Dunlap@Sun.COM return (DCMD_OK);
13517978SPeter.Dunlap@Sun.COM }
13527978SPeter.Dunlap@Sun.COM
13537978SPeter.Dunlap@Sun.COM static int
iscsi_portal_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)13547978SPeter.Dunlap@Sun.COM iscsi_portal_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
13557978SPeter.Dunlap@Sun.COM {
13567978SPeter.Dunlap@Sun.COM iscsit_portal_t portal;
13577978SPeter.Dunlap@Sun.COM char portal_addr[PORTAL_STR_LEN];
1358*12114SPeter.Gill@Sun.COM uintptr_t rc_addr;
1359*12114SPeter.Gill@Sun.COM
13607978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_portal) {
13617978SPeter.Dunlap@Sun.COM /*
13627978SPeter.Dunlap@Sun.COM * Read iscsit_portal_t
13637978SPeter.Dunlap@Sun.COM */
13647978SPeter.Dunlap@Sun.COM if (mdb_vread(&portal, sizeof (iscsit_portal_t), addr) !=
13657978SPeter.Dunlap@Sun.COM sizeof (iscsit_portal_t)) {
13667978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
13677978SPeter.Dunlap@Sun.COM }
13687978SPeter.Dunlap@Sun.COM
13697978SPeter.Dunlap@Sun.COM /* Print portal data */
13707978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
13717978SPeter.Dunlap@Sun.COM mdb_printf("%<u>%-?s %-?s %-30s%</u>\n",
13727978SPeter.Dunlap@Sun.COM "iscsit_portal_t", "idm_svc_t", "IP:Port");
1373*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
13747978SPeter.Dunlap@Sun.COM }
13757978SPeter.Dunlap@Sun.COM sa_to_str(&portal.portal_addr, portal_addr);
13767978SPeter.Dunlap@Sun.COM mdb_printf("%?p %?p %s\n", addr, portal.portal_svc,
1377*12114SPeter.Gill@Sun.COM portal.portal_default ? "(Default)" : portal_addr);
1378*12114SPeter.Gill@Sun.COM
1379*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_rc_audit) {
1380*12114SPeter.Gill@Sun.COM (void) mdb_inc_indent(4);
1381*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(portal_refcnt):\n");
1382*12114SPeter.Gill@Sun.COM rc_addr = addr + offsetof(iscsit_portal_t,
1383*12114SPeter.Gill@Sun.COM portal_refcnt);
1384*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
1385*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1386*12114SPeter.Gill@Sun.COM }
1387*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
1388*12114SPeter.Gill@Sun.COM }
13897978SPeter.Dunlap@Sun.COM }
13907978SPeter.Dunlap@Sun.COM
13917978SPeter.Dunlap@Sun.COM return (DCMD_OK);
13927978SPeter.Dunlap@Sun.COM }
13937978SPeter.Dunlap@Sun.COM
13947978SPeter.Dunlap@Sun.COM static int
iscsi_sess_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)13957978SPeter.Dunlap@Sun.COM iscsi_sess_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
13967978SPeter.Dunlap@Sun.COM {
13977978SPeter.Dunlap@Sun.COM iscsit_sess_t ist;
1398*12114SPeter.Gill@Sun.COM iscsi_sess_t ini_sess;
13997978SPeter.Dunlap@Sun.COM uintptr_t list_addr, states_addr, rc_addr;
14007978SPeter.Dunlap@Sun.COM char ini_name[80];
14017978SPeter.Dunlap@Sun.COM char tgt_name[80];
14027978SPeter.Dunlap@Sun.COM int verbose, states, rc_audit;
14037978SPeter.Dunlap@Sun.COM
1404*12114SPeter.Gill@Sun.COM if (idc->idc_ini) {
1405*12114SPeter.Gill@Sun.COM if ((mdb_vread(&ini_sess, sizeof (iscsi_sess_t),
1406*12114SPeter.Gill@Sun.COM (uintptr_t)addr)) != sizeof (iscsi_sess_t)) {
1407*12114SPeter.Gill@Sun.COM mdb_warn("Failed to read initiator session\n");
1408*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1409*12114SPeter.Gill@Sun.COM }
1410*12114SPeter.Gill@Sun.COM if (iscsi_print_ini_sess(addr, &ini_sess, idc) != DCMD_OK) {
1411*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1412*12114SPeter.Gill@Sun.COM }
1413*12114SPeter.Gill@Sun.COM return (DCMD_OK);
1414*12114SPeter.Gill@Sun.COM }
14157978SPeter.Dunlap@Sun.COM /*
14167978SPeter.Dunlap@Sun.COM * Read iscsit_sess_t
14177978SPeter.Dunlap@Sun.COM */
14187978SPeter.Dunlap@Sun.COM if (mdb_vread(&ist, sizeof (iscsit_sess_t), addr) !=
14197978SPeter.Dunlap@Sun.COM sizeof (iscsit_sess_t)) {
14207978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
14217978SPeter.Dunlap@Sun.COM }
14227978SPeter.Dunlap@Sun.COM
14237978SPeter.Dunlap@Sun.COM /*
14247978SPeter.Dunlap@Sun.COM * Brief output
14257978SPeter.Dunlap@Sun.COM *
14267978SPeter.Dunlap@Sun.COM * iscsit_sess_t pointer
14277978SPeter.Dunlap@Sun.COM * iscsit_sess_t.ist_state/iscsit_sess_t.ist_ffp_conn_count
14287978SPeter.Dunlap@Sun.COM * iscsit_sess_t.ist_tsih
14297978SPeter.Dunlap@Sun.COM * iscsit_sess_t.ist_initiator_name
14307978SPeter.Dunlap@Sun.COM */
14317978SPeter.Dunlap@Sun.COM
14327978SPeter.Dunlap@Sun.COM verbose = idc->idc_verbose;
14337978SPeter.Dunlap@Sun.COM states = idc->u.child.idc_states;
14347978SPeter.Dunlap@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
14357978SPeter.Dunlap@Sun.COM
14367978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_sess) {
14377978SPeter.Dunlap@Sun.COM if (verbose) {
14387978SPeter.Dunlap@Sun.COM /*
14397978SPeter.Dunlap@Sun.COM * Read initiator name if available
14407978SPeter.Dunlap@Sun.COM */
14417978SPeter.Dunlap@Sun.COM if ((ist.ist_initiator_name == NULL) ||
14427978SPeter.Dunlap@Sun.COM (mdb_readstr(ini_name, sizeof (ini_name),
14437978SPeter.Dunlap@Sun.COM (uintptr_t)ist.ist_initiator_name) == -1)) {
14447978SPeter.Dunlap@Sun.COM strcpy(ini_name, "N/A");
14457978SPeter.Dunlap@Sun.COM }
14467978SPeter.Dunlap@Sun.COM
14477978SPeter.Dunlap@Sun.COM /*
14487978SPeter.Dunlap@Sun.COM * Read target name if available
14497978SPeter.Dunlap@Sun.COM */
14507978SPeter.Dunlap@Sun.COM if ((ist.ist_target_name == NULL) ||
14517978SPeter.Dunlap@Sun.COM (mdb_readstr(tgt_name, sizeof (tgt_name),
14527978SPeter.Dunlap@Sun.COM (uintptr_t)ist.ist_target_name) == -1)) {
14537978SPeter.Dunlap@Sun.COM strcpy(tgt_name, "N/A");
14547978SPeter.Dunlap@Sun.COM }
14557978SPeter.Dunlap@Sun.COM
14567978SPeter.Dunlap@Sun.COM mdb_printf("Session %p\n", addr);
14577978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %d\n", "State",
14587978SPeter.Dunlap@Sun.COM ist.ist_state);
14597978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %d\n", "Last State",
14607978SPeter.Dunlap@Sun.COM ist.ist_last_state);
14617978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %d\n", "FFP Connections",
14627978SPeter.Dunlap@Sun.COM ist.ist_ffp_conn_count);
14637978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %02x%02x%02x%02x%02x%02x\n", "ISID",
14647978SPeter.Dunlap@Sun.COM ist.ist_isid[0], ist.ist_isid[1], ist.ist_isid[2],
14657978SPeter.Dunlap@Sun.COM ist.ist_isid[3], ist.ist_isid[4], ist.ist_isid[5]);
14667978SPeter.Dunlap@Sun.COM mdb_printf("%16s: 0x%04x\n", "TSIH",
14677978SPeter.Dunlap@Sun.COM ist.ist_tsih);
14687978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %s\n", "Initiator IQN",
14697978SPeter.Dunlap@Sun.COM ini_name);
14707978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %s\n", "Target IQN",
14717978SPeter.Dunlap@Sun.COM tgt_name);
14727978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %08x\n", "ExpCmdSN",
14737978SPeter.Dunlap@Sun.COM ist.ist_expcmdsn);
14747978SPeter.Dunlap@Sun.COM mdb_printf("%16s: %08x\n", "MaxCmdSN",
14757978SPeter.Dunlap@Sun.COM ist.ist_maxcmdsn);
1476*12114SPeter.Gill@Sun.COM
1477*12114SPeter.Gill@Sun.COM idc->idc_verbose = 0;
14787978SPeter.Dunlap@Sun.COM } else {
14797978SPeter.Dunlap@Sun.COM /* Print session data */
14807978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
14817978SPeter.Dunlap@Sun.COM mdb_printf("%<u>%-?s %10s %-12s %-6s%</u>\n",
14827978SPeter.Dunlap@Sun.COM "iscsit_sess_t", "State/Conn", "ISID",
14837978SPeter.Dunlap@Sun.COM "TSIH");
14847978SPeter.Dunlap@Sun.COM }
14857978SPeter.Dunlap@Sun.COM mdb_printf("%?p %4d/%-4d %02x%02x%02x%02x%02x%02x "
14867978SPeter.Dunlap@Sun.COM "0x%04x\n", addr,
14877978SPeter.Dunlap@Sun.COM ist.ist_state, ist.ist_ffp_conn_count,
14887978SPeter.Dunlap@Sun.COM ist.ist_isid[0], ist.ist_isid[1], ist.ist_isid[2],
14897978SPeter.Dunlap@Sun.COM ist.ist_isid[3], ist.ist_isid[4], ist.ist_isid[5],
14907978SPeter.Dunlap@Sun.COM ist.ist_tsih);
14917978SPeter.Dunlap@Sun.COM }
1492*12114SPeter.Gill@Sun.COM
1493*12114SPeter.Gill@Sun.COM /*
1494*12114SPeter.Gill@Sun.COM * Indent for any child structures
1495*12114SPeter.Gill@Sun.COM */
1496*12114SPeter.Gill@Sun.COM (void) mdb_inc_indent(4);
14977978SPeter.Dunlap@Sun.COM }
14987978SPeter.Dunlap@Sun.COM
14997978SPeter.Dunlap@Sun.COM /*
15007978SPeter.Dunlap@Sun.COM * Print states if requested
15017978SPeter.Dunlap@Sun.COM */
1502*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess && states) {
15037978SPeter.Dunlap@Sun.COM states_addr = addr + offsetof(iscsit_sess_t, ist_state_audit);
15047978SPeter.Dunlap@Sun.COM
1505*12114SPeter.Gill@Sun.COM mdb_printf("State History(ist_state_audit):\n");
15067978SPeter.Dunlap@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
15077978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
15087978SPeter.Dunlap@Sun.COM
15097978SPeter.Dunlap@Sun.COM /* Don't print state history for child objects */
15107978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = 0;
15117978SPeter.Dunlap@Sun.COM }
15127978SPeter.Dunlap@Sun.COM
15137978SPeter.Dunlap@Sun.COM /*
15147978SPeter.Dunlap@Sun.COM * Print refcnt audit data if requested
15157978SPeter.Dunlap@Sun.COM */
1516*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess && rc_audit) {
1517*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(ist_refcnt):\n");
15187978SPeter.Dunlap@Sun.COM rc_addr = addr +
15197978SPeter.Dunlap@Sun.COM offsetof(iscsit_sess_t, ist_refcnt);
15207978SPeter.Dunlap@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
15217978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
15227978SPeter.Dunlap@Sun.COM
15237978SPeter.Dunlap@Sun.COM /* Don't print audit data for child objects */
15247978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = 0;
15257978SPeter.Dunlap@Sun.COM }
15267978SPeter.Dunlap@Sun.COM
15277978SPeter.Dunlap@Sun.COM /* Any child objects to walk? */
15287978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_conn || idc->u.child.idc_task ||
15297978SPeter.Dunlap@Sun.COM idc->u.child.idc_buffer) {
1530*12114SPeter.Gill@Sun.COM /*
1531*12114SPeter.Gill@Sun.COM * If a session has been printed enable headers for
1532*12114SPeter.Gill@Sun.COM * any child structs.
1533*12114SPeter.Gill@Sun.COM */
1534*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess) {
1535*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1536*12114SPeter.Gill@Sun.COM }
1537*12114SPeter.Gill@Sun.COM
15387978SPeter.Dunlap@Sun.COM /* Walk conn list */
15397978SPeter.Dunlap@Sun.COM list_addr = addr + offsetof(iscsit_sess_t, ist_conn_list);
15407978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_sess_conn_walk_cb, idc,
15417978SPeter.Dunlap@Sun.COM list_addr) == -1) {
15427978SPeter.Dunlap@Sun.COM mdb_warn("session conn list walk failed");
15437978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
15447978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
15457978SPeter.Dunlap@Sun.COM }
1546*12114SPeter.Gill@Sun.COM }
1547*12114SPeter.Gill@Sun.COM
1548*12114SPeter.Gill@Sun.COM /* If a session was handled decrease indent and reset header. */
1549*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess) {
15507978SPeter.Dunlap@Sun.COM idc->idc_header = 0;
1551*12114SPeter.Gill@Sun.COM mdb_dec_indent(4);
15527978SPeter.Dunlap@Sun.COM }
15537978SPeter.Dunlap@Sun.COM
15547978SPeter.Dunlap@Sun.COM idc->idc_verbose = verbose;
15557978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = states;
15567978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
15577978SPeter.Dunlap@Sun.COM
15587978SPeter.Dunlap@Sun.COM return (DCMD_OK);
15597978SPeter.Dunlap@Sun.COM }
15607978SPeter.Dunlap@Sun.COM
15617978SPeter.Dunlap@Sun.COM static int
iscsi_print_ini_sess(uintptr_t addr,iscsi_sess_t * sess,iscsi_dcmd_ctrl_t * idc)1562*12114SPeter.Gill@Sun.COM iscsi_print_ini_sess(uintptr_t addr, iscsi_sess_t *sess,
1563*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc)
1564*12114SPeter.Gill@Sun.COM {
1565*12114SPeter.Gill@Sun.COM
1566*12114SPeter.Gill@Sun.COM int verbose, states;
1567*12114SPeter.Gill@Sun.COM uintptr_t states_addr;
1568*12114SPeter.Gill@Sun.COM
1569*12114SPeter.Gill@Sun.COM verbose = idc->idc_verbose;
1570*12114SPeter.Gill@Sun.COM states = idc->u.child.idc_states;
1571*12114SPeter.Gill@Sun.COM
1572*12114SPeter.Gill@Sun.COM
1573*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess) {
1574*12114SPeter.Gill@Sun.COM if (!idc->idc_verbose) {
1575*12114SPeter.Gill@Sun.COM if (idc->idc_header) {
1576*12114SPeter.Gill@Sun.COM mdb_printf("%<u>%-?s %-4s %-8s%</u>\n",
1577*12114SPeter.Gill@Sun.COM "iscsi_sess_t", "Type", "State");
1578*12114SPeter.Gill@Sun.COM }
1579*12114SPeter.Gill@Sun.COM mdb_printf("%-19p %-4d %-8d\n", addr,
1580*12114SPeter.Gill@Sun.COM sess->sess_type, sess->sess_state);
1581*12114SPeter.Gill@Sun.COM } else {
1582*12114SPeter.Gill@Sun.COM mdb_printf("Session %p\n", addr);
1583*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %d\n", "State",
1584*12114SPeter.Gill@Sun.COM sess->sess_state);
1585*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %d\n", "Last State",
1586*12114SPeter.Gill@Sun.COM sess->sess_prev_state);
1587*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %s\n", "Session Name",
1588*12114SPeter.Gill@Sun.COM sess->sess_name);
1589*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %s\n", "Alias",
1590*12114SPeter.Gill@Sun.COM sess->sess_alias);
1591*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %08x\n", "CmdSN",
1592*12114SPeter.Gill@Sun.COM sess->sess_cmdsn);
1593*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %08x\n", "ExpCmdSN",
1594*12114SPeter.Gill@Sun.COM sess->sess_expcmdsn);
1595*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %08x\n", "MaxCmdSN",
1596*12114SPeter.Gill@Sun.COM sess->sess_maxcmdsn);
1597*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %p\n", "Pending Queue Head",
1598*12114SPeter.Gill@Sun.COM sess->sess_queue_pending.head);
1599*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %p\n", "Completion Queue Head",
1600*12114SPeter.Gill@Sun.COM sess->sess_queue_completion.head);
1601*12114SPeter.Gill@Sun.COM mdb_printf("%22s: %p\n", "Connnection List Head",
1602*12114SPeter.Gill@Sun.COM sess->sess_conn_list);
1603*12114SPeter.Gill@Sun.COM
1604*12114SPeter.Gill@Sun.COM idc->idc_verbose = 0;
1605*12114SPeter.Gill@Sun.COM }
1606*12114SPeter.Gill@Sun.COM
1607*12114SPeter.Gill@Sun.COM /* Indent for any child structures */
1608*12114SPeter.Gill@Sun.COM mdb_inc_indent(4);
1609*12114SPeter.Gill@Sun.COM
1610*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_states) {
1611*12114SPeter.Gill@Sun.COM states_addr = (uintptr_t)addr +
1612*12114SPeter.Gill@Sun.COM offsetof(iscsi_sess_t, sess_state_audit);
1613*12114SPeter.Gill@Sun.COM
1614*12114SPeter.Gill@Sun.COM mdb_printf("State History(sess_state_audit):\n");
1615*12114SPeter.Gill@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) {
1616*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
1617*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1618*12114SPeter.Gill@Sun.COM }
1619*12114SPeter.Gill@Sun.COM idc->u.child.idc_states = 0;
1620*12114SPeter.Gill@Sun.COM }
1621*12114SPeter.Gill@Sun.COM }
1622*12114SPeter.Gill@Sun.COM
1623*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_lun && sess->sess_lun_list) {
1624*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess) {
1625*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1626*12114SPeter.Gill@Sun.COM }
1627*12114SPeter.Gill@Sun.COM
1628*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_lun", iscsi_ini_lun_walk_cb, idc,
1629*12114SPeter.Gill@Sun.COM (uintptr_t)sess->sess_lun_list) == -1) {
1630*12114SPeter.Gill@Sun.COM mdb_warn("iscsi_ini_lun walk failed");
1631*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
1632*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1633*12114SPeter.Gill@Sun.COM }
1634*12114SPeter.Gill@Sun.COM }
1635*12114SPeter.Gill@Sun.COM
1636*12114SPeter.Gill@Sun.COM
1637*12114SPeter.Gill@Sun.COM /* If requested print the cmds in the session queue */
1638*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_cmd) {
1639*12114SPeter.Gill@Sun.COM
1640*12114SPeter.Gill@Sun.COM /* If any other structs printed enable header */
1641*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess || idc->u.child.idc_lun) {
1642*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1643*12114SPeter.Gill@Sun.COM }
1644*12114SPeter.Gill@Sun.COM
1645*12114SPeter.Gill@Sun.COM if (sess->sess_queue_pending.head) {
1646*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb,
1647*12114SPeter.Gill@Sun.COM idc, (uintptr_t)sess->sess_queue_pending.head)
1648*12114SPeter.Gill@Sun.COM == -1) {
1649*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for iscsi cmds");
1650*12114SPeter.Gill@Sun.COM }
1651*12114SPeter.Gill@Sun.COM }
1652*12114SPeter.Gill@Sun.COM if (sess->sess_queue_completion.head) {
1653*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb,
1654*12114SPeter.Gill@Sun.COM idc, (uintptr_t)sess->sess_queue_completion.head)
1655*12114SPeter.Gill@Sun.COM == -1) {
1656*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for iscsi cmds");
1657*12114SPeter.Gill@Sun.COM }
1658*12114SPeter.Gill@Sun.COM }
1659*12114SPeter.Gill@Sun.COM }
1660*12114SPeter.Gill@Sun.COM
1661*12114SPeter.Gill@Sun.COM /* If connections or cmds requested walk the connections */
1662*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn || idc->u.child.idc_cmd) {
1663*12114SPeter.Gill@Sun.COM /*
1664*12114SPeter.Gill@Sun.COM * If idc_conn is not set don't enable header or the
1665*12114SPeter.Gill@Sun.COM * commands may get extraneous headers.
1666*12114SPeter.Gill@Sun.COM */
1667*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn) {
1668*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1669*12114SPeter.Gill@Sun.COM }
1670*12114SPeter.Gill@Sun.COM if (mdb_pwalk("iscsi_ini_conn", iscsi_ini_conn_walk_cb, idc,
1671*12114SPeter.Gill@Sun.COM (uintptr_t)sess->sess_conn_list) == -1) {
1672*12114SPeter.Gill@Sun.COM mdb_warn("iscsi_ini_conn walk failed");
1673*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1674*12114SPeter.Gill@Sun.COM }
1675*12114SPeter.Gill@Sun.COM }
1676*12114SPeter.Gill@Sun.COM
1677*12114SPeter.Gill@Sun.COM /* If sessions were handled decrease indent and reset header */
1678*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_sess) {
1679*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
1680*12114SPeter.Gill@Sun.COM mdb_dec_indent(4);
1681*12114SPeter.Gill@Sun.COM }
1682*12114SPeter.Gill@Sun.COM
1683*12114SPeter.Gill@Sun.COM idc->u.child.idc_states = states;
1684*12114SPeter.Gill@Sun.COM idc->idc_verbose = verbose;
1685*12114SPeter.Gill@Sun.COM return (DCMD_OK);
1686*12114SPeter.Gill@Sun.COM }
1687*12114SPeter.Gill@Sun.COM
1688*12114SPeter.Gill@Sun.COM
1689*12114SPeter.Gill@Sun.COM static int
iscsi_conn_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)16907978SPeter.Dunlap@Sun.COM iscsi_conn_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
16917978SPeter.Dunlap@Sun.COM {
16927978SPeter.Dunlap@Sun.COM uintptr_t idm_global_addr, states_addr, rc_addr;
16937978SPeter.Dunlap@Sun.COM uintptr_t task_addr, task_ptr;
16947978SPeter.Dunlap@Sun.COM GElf_Sym sym;
16957978SPeter.Dunlap@Sun.COM idm_task_t idt;
16967978SPeter.Dunlap@Sun.COM idm_conn_t ic;
1697*12114SPeter.Gill@Sun.COM iscsit_conn_t ict;
1698*12114SPeter.Gill@Sun.COM iscsi_conn_t ini_conn;
16997978SPeter.Dunlap@Sun.COM char *conn_type;
17007978SPeter.Dunlap@Sun.COM int task_idx;
17017978SPeter.Dunlap@Sun.COM char laddr[PORTAL_STR_LEN];
17027978SPeter.Dunlap@Sun.COM char raddr[PORTAL_STR_LEN];
17037978SPeter.Dunlap@Sun.COM int verbose, states, rc_audit;
17047978SPeter.Dunlap@Sun.COM
17057978SPeter.Dunlap@Sun.COM /*
17067978SPeter.Dunlap@Sun.COM * Get pointer to task table
17077978SPeter.Dunlap@Sun.COM */
17087978SPeter.Dunlap@Sun.COM
17097978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("idm", &sym) == -1) {
17107978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'idm'");
17117978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
17127978SPeter.Dunlap@Sun.COM }
17137978SPeter.Dunlap@Sun.COM
17147978SPeter.Dunlap@Sun.COM idm_global_addr = (uintptr_t)sym.st_value;
17157978SPeter.Dunlap@Sun.COM
17167978SPeter.Dunlap@Sun.COM if (mdb_vread(&task_ptr, sizeof (uintptr_t),
17177978SPeter.Dunlap@Sun.COM idm_global_addr + offsetof(idm_global_t, idm_taskid_table)) !=
17187978SPeter.Dunlap@Sun.COM sizeof (uintptr_t)) {
17197978SPeter.Dunlap@Sun.COM mdb_warn("Failed to read address of task table");
17207978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
17217978SPeter.Dunlap@Sun.COM }
17227978SPeter.Dunlap@Sun.COM
17237978SPeter.Dunlap@Sun.COM /*
17247978SPeter.Dunlap@Sun.COM * Read idm_conn_t
17257978SPeter.Dunlap@Sun.COM */
17267978SPeter.Dunlap@Sun.COM if (mdb_vread(&ic, sizeof (idm_conn_t), addr) != sizeof (idm_conn_t)) {
17277978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
17287978SPeter.Dunlap@Sun.COM }
1729*12114SPeter.Gill@Sun.COM
1730*12114SPeter.Gill@Sun.COM /*
1731*12114SPeter.Gill@Sun.COM * If filter bits are set to only print targets or only initiators
1732*12114SPeter.Gill@Sun.COM * skip entries of the other type.
1733*12114SPeter.Gill@Sun.COM */
1734*12114SPeter.Gill@Sun.COM if (!(idc->idc_ini && idc->idc_tgt) &&
1735*12114SPeter.Gill@Sun.COM ((idc->idc_ini && (ic.ic_conn_type != CONN_TYPE_INI)) ||
1736*12114SPeter.Gill@Sun.COM (idc->idc_tgt && (ic.ic_conn_type != CONN_TYPE_TGT)))) {
1737*12114SPeter.Gill@Sun.COM return (DCMD_OK);
1738*12114SPeter.Gill@Sun.COM }
1739*12114SPeter.Gill@Sun.COM
1740*12114SPeter.Gill@Sun.COM
17417978SPeter.Dunlap@Sun.COM conn_type = (ic.ic_conn_type == CONN_TYPE_INI) ? "Ini" :
17427978SPeter.Dunlap@Sun.COM (ic.ic_conn_type == CONN_TYPE_TGT) ? "Tgt" : "Unk";
17437978SPeter.Dunlap@Sun.COM
17447978SPeter.Dunlap@Sun.COM /*
17457978SPeter.Dunlap@Sun.COM * Brief output
17467978SPeter.Dunlap@Sun.COM *
17477978SPeter.Dunlap@Sun.COM * idm_conn_t pointer
17487978SPeter.Dunlap@Sun.COM * idm_conn_t.ic_conn_type
17497978SPeter.Dunlap@Sun.COM * idm_conn_t.ic_statet+idm_conn_t.ic_ffp
17507978SPeter.Dunlap@Sun.COM */
17517978SPeter.Dunlap@Sun.COM
17527978SPeter.Dunlap@Sun.COM verbose = idc->idc_verbose;
17537978SPeter.Dunlap@Sun.COM states = idc->u.child.idc_states;
17547978SPeter.Dunlap@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
17557978SPeter.Dunlap@Sun.COM
1756*12114SPeter.Gill@Sun.COM /*
1757*12114SPeter.Gill@Sun.COM * If targets(-T) and/or initiators (-I) are specifically requested,
1758*12114SPeter.Gill@Sun.COM * fetch the iscsit_conn_t and/or iscsi_conn_t struct as a sanity
1759*12114SPeter.Gill@Sun.COM * check and for use below.
1760*12114SPeter.Gill@Sun.COM */
1761*12114SPeter.Gill@Sun.COM if (idc->idc_tgt && IDM_CONN_ISTGT(&ic)) {
1762*12114SPeter.Gill@Sun.COM if (mdb_vread(&ict, sizeof (iscsit_conn_t),
1763*12114SPeter.Gill@Sun.COM (uintptr_t)ic.ic_handle) !=
1764*12114SPeter.Gill@Sun.COM sizeof (iscsit_conn_t)) {
1765*12114SPeter.Gill@Sun.COM mdb_printf("Failed to read target connection "
1766*12114SPeter.Gill@Sun.COM "handle data\n");
1767*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1768*12114SPeter.Gill@Sun.COM }
1769*12114SPeter.Gill@Sun.COM }
1770*12114SPeter.Gill@Sun.COM
1771*12114SPeter.Gill@Sun.COM if (idc->idc_ini && IDM_CONN_ISINI(&ic)) {
1772*12114SPeter.Gill@Sun.COM if (mdb_vread(&ini_conn, sizeof (iscsi_conn_t),
1773*12114SPeter.Gill@Sun.COM (uintptr_t)ic.ic_handle) !=
1774*12114SPeter.Gill@Sun.COM sizeof (iscsi_conn_t)) {
1775*12114SPeter.Gill@Sun.COM mdb_printf("Failed to read initiator "
1776*12114SPeter.Gill@Sun.COM "connection handle data\n");
1777*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1778*12114SPeter.Gill@Sun.COM }
1779*12114SPeter.Gill@Sun.COM }
1780*12114SPeter.Gill@Sun.COM
17817978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_conn) {
17827978SPeter.Dunlap@Sun.COM if (idc->idc_verbose) {
17837978SPeter.Dunlap@Sun.COM mdb_printf("IDM Conn %p\n", addr);
17847978SPeter.Dunlap@Sun.COM if (ic.ic_conn_type == CONN_TYPE_TGT) {
17857978SPeter.Dunlap@Sun.COM iscsi_print_iscsit_conn_data(&ic);
17867978SPeter.Dunlap@Sun.COM } else {
1787*12114SPeter.Gill@Sun.COM iscsi_print_ini_conn_data(&ic);
17887978SPeter.Dunlap@Sun.COM }
1789*12114SPeter.Gill@Sun.COM idc->idc_verbose = 0;
17907978SPeter.Dunlap@Sun.COM } else {
17917978SPeter.Dunlap@Sun.COM /* Print connection data */
17927978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
17937978SPeter.Dunlap@Sun.COM mdb_printf("%<u>%-?s %-6s %-10s %12s%</u>\n",
17947978SPeter.Dunlap@Sun.COM "idm_conn_t", "Type", "Transport",
17957978SPeter.Dunlap@Sun.COM "State/FFP");
17967978SPeter.Dunlap@Sun.COM }
17977978SPeter.Dunlap@Sun.COM mdb_printf("%?p %-6s %-10s %6d/%-6d\n", addr, conn_type,
17987978SPeter.Dunlap@Sun.COM (ic.ic_transport_type ==
17997978SPeter.Dunlap@Sun.COM IDM_TRANSPORT_TYPE_ISER) ? "ISER_IB" :
18007978SPeter.Dunlap@Sun.COM (ic.ic_transport_type ==
18017978SPeter.Dunlap@Sun.COM IDM_TRANSPORT_TYPE_SOCKETS) ? "SOCKETS" :
18027978SPeter.Dunlap@Sun.COM "N/A",
18037978SPeter.Dunlap@Sun.COM ic.ic_state, ic.ic_ffp);
18047978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_print_ip) {
18057978SPeter.Dunlap@Sun.COM sa_to_str(&ic.ic_laddr, laddr);
18067978SPeter.Dunlap@Sun.COM sa_to_str(&ic.ic_raddr, raddr);
18077978SPeter.Dunlap@Sun.COM mdb_printf(" L%s R%s\n",
18087978SPeter.Dunlap@Sun.COM laddr, raddr);
18097978SPeter.Dunlap@Sun.COM }
18107978SPeter.Dunlap@Sun.COM }
1811*12114SPeter.Gill@Sun.COM
1812*12114SPeter.Gill@Sun.COM /* Indent for any child structs */
1813*12114SPeter.Gill@Sun.COM mdb_inc_indent(4);
18147978SPeter.Dunlap@Sun.COM }
18157978SPeter.Dunlap@Sun.COM
18167978SPeter.Dunlap@Sun.COM /*
18177978SPeter.Dunlap@Sun.COM * Print states if requested
18187978SPeter.Dunlap@Sun.COM */
1819*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn && states) {
18207978SPeter.Dunlap@Sun.COM states_addr = addr + offsetof(idm_conn_t, ic_state_audit);
18217978SPeter.Dunlap@Sun.COM
1822*12114SPeter.Gill@Sun.COM mdb_printf("State History(ic_state_audit):\n");
18237978SPeter.Dunlap@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
18247978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
18257978SPeter.Dunlap@Sun.COM
1826*12114SPeter.Gill@Sun.COM /*
1827*12114SPeter.Gill@Sun.COM * If targets are specifically requested show the
1828*12114SPeter.Gill@Sun.COM * state audit for the target specific connection struct
1829*12114SPeter.Gill@Sun.COM */
1830*12114SPeter.Gill@Sun.COM if (idc->idc_tgt && IDM_CONN_ISTGT(&ic)) {
1831*12114SPeter.Gill@Sun.COM states_addr = (uintptr_t)ic.ic_handle +
1832*12114SPeter.Gill@Sun.COM offsetof(iscsit_conn_t, ict_login_sm) +
1833*12114SPeter.Gill@Sun.COM offsetof(iscsit_conn_login_t, icl_state_audit);
1834*12114SPeter.Gill@Sun.COM
1835*12114SPeter.Gill@Sun.COM mdb_printf("State History(icl_state_audit):\n");
1836*12114SPeter.Gill@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) {
1837*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1838*12114SPeter.Gill@Sun.COM }
1839*12114SPeter.Gill@Sun.COM }
1840*12114SPeter.Gill@Sun.COM
1841*12114SPeter.Gill@Sun.COM /*
1842*12114SPeter.Gill@Sun.COM * If initiators are specifically requested show the
1843*12114SPeter.Gill@Sun.COM * state audit for the initiator specific connection struct
1844*12114SPeter.Gill@Sun.COM */
1845*12114SPeter.Gill@Sun.COM if (idc->idc_ini && IDM_CONN_ISINI(&ic)) {
1846*12114SPeter.Gill@Sun.COM states_addr = (uintptr_t)ic.ic_handle +
1847*12114SPeter.Gill@Sun.COM offsetof(iscsi_conn_t, conn_state_audit);
1848*12114SPeter.Gill@Sun.COM
1849*12114SPeter.Gill@Sun.COM mdb_printf("State History(iscsi_conn_t "
1850*12114SPeter.Gill@Sun.COM "conn_state_audit):\n");
1851*12114SPeter.Gill@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK) {
1852*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1853*12114SPeter.Gill@Sun.COM }
1854*12114SPeter.Gill@Sun.COM }
1855*12114SPeter.Gill@Sun.COM
18567978SPeter.Dunlap@Sun.COM /* Don't print state history for child objects */
18577978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = 0;
18587978SPeter.Dunlap@Sun.COM }
18597978SPeter.Dunlap@Sun.COM
18607978SPeter.Dunlap@Sun.COM /*
1861*12114SPeter.Gill@Sun.COM * Print refcnt audit data for the connection struct if requested.
18627978SPeter.Dunlap@Sun.COM */
1863*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn && rc_audit) {
1864*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(ic_refcnt):\n");
18657978SPeter.Dunlap@Sun.COM rc_addr = addr + offsetof(idm_conn_t, ic_refcnt);
18667978SPeter.Dunlap@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
18677978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
18687978SPeter.Dunlap@Sun.COM
1869*12114SPeter.Gill@Sun.COM /*
1870*12114SPeter.Gill@Sun.COM * If targets are specifically requested show the
1871*12114SPeter.Gill@Sun.COM * Refcounts for the target specific connection struct
1872*12114SPeter.Gill@Sun.COM */
1873*12114SPeter.Gill@Sun.COM if (idc->idc_tgt && IDM_CONN_ISTGT(&ic)) {
1874*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(ict_refcnt):\n");
1875*12114SPeter.Gill@Sun.COM rc_addr = (uintptr_t)ic.ic_handle +
1876*12114SPeter.Gill@Sun.COM offsetof(iscsit_conn_t, ict_refcnt);
1877*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
1878*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1879*12114SPeter.Gill@Sun.COM }
1880*12114SPeter.Gill@Sun.COM
1881*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(ict_dispatch_refcnt):\n");
1882*12114SPeter.Gill@Sun.COM rc_addr = (uintptr_t)ic.ic_handle +
1883*12114SPeter.Gill@Sun.COM offsetof(iscsit_conn_t, ict_dispatch_refcnt);
1884*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
1885*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1886*12114SPeter.Gill@Sun.COM }
1887*12114SPeter.Gill@Sun.COM }
1888*12114SPeter.Gill@Sun.COM
18897978SPeter.Dunlap@Sun.COM /* Don't print audit data for child objects */
18907978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = 0;
18917978SPeter.Dunlap@Sun.COM }
18927978SPeter.Dunlap@Sun.COM
18937978SPeter.Dunlap@Sun.COM task_idx = 0;
18947978SPeter.Dunlap@Sun.COM
18957978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_task || idc->u.child.idc_buffer) {
1896*12114SPeter.Gill@Sun.COM
1897*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn) {
1898*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1899*12114SPeter.Gill@Sun.COM }
1900*12114SPeter.Gill@Sun.COM
19017978SPeter.Dunlap@Sun.COM while (task_idx < IDM_TASKIDS_MAX) {
19027978SPeter.Dunlap@Sun.COM /*
19037978SPeter.Dunlap@Sun.COM * Read the next idm_task_t
19047978SPeter.Dunlap@Sun.COM */
19057978SPeter.Dunlap@Sun.COM if (mdb_vread(&task_addr, sizeof (uintptr_t),
19067978SPeter.Dunlap@Sun.COM task_ptr) != sizeof (uintptr_t)) {
19077978SPeter.Dunlap@Sun.COM mdb_warn("Failed to read task pointer");
19087978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
19097978SPeter.Dunlap@Sun.COM }
19107978SPeter.Dunlap@Sun.COM
19117978SPeter.Dunlap@Sun.COM if (task_addr == NULL) {
19127978SPeter.Dunlap@Sun.COM task_ptr += sizeof (uintptr_t);
19137978SPeter.Dunlap@Sun.COM task_idx++;
19147978SPeter.Dunlap@Sun.COM continue;
19157978SPeter.Dunlap@Sun.COM }
19167978SPeter.Dunlap@Sun.COM
19177978SPeter.Dunlap@Sun.COM if (mdb_vread(&idt, sizeof (idm_task_t), task_addr)
19187978SPeter.Dunlap@Sun.COM != sizeof (idm_task_t)) {
19197978SPeter.Dunlap@Sun.COM mdb_warn("Failed to read task pointer");
19207978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
19217978SPeter.Dunlap@Sun.COM }
19227978SPeter.Dunlap@Sun.COM
19237978SPeter.Dunlap@Sun.COM if (((uintptr_t)idt.idt_ic == addr) &&
19247978SPeter.Dunlap@Sun.COM (idt.idt_state != TASK_IDLE)) {
19257978SPeter.Dunlap@Sun.COM if (iscsi_i_task_impl(&idt, task_addr, idc)
19267978SPeter.Dunlap@Sun.COM == -1) {
19277978SPeter.Dunlap@Sun.COM mdb_warn("Failed to walk connection "
19287978SPeter.Dunlap@Sun.COM "task tree");
19297978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
19307978SPeter.Dunlap@Sun.COM }
19317978SPeter.Dunlap@Sun.COM }
19327978SPeter.Dunlap@Sun.COM
19337978SPeter.Dunlap@Sun.COM task_ptr += sizeof (uintptr_t);
19347978SPeter.Dunlap@Sun.COM task_idx++;
19357978SPeter.Dunlap@Sun.COM }
1936*12114SPeter.Gill@Sun.COM }
1937*12114SPeter.Gill@Sun.COM
1938*12114SPeter.Gill@Sun.COM if (idc->idc_ini && IDM_CONN_ISINI(&ic) && idc->u.child.idc_cmd) {
1939*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn || idc->u.child.idc_task) {
1940*12114SPeter.Gill@Sun.COM idc->idc_header = 1;
1941*12114SPeter.Gill@Sun.COM }
1942*12114SPeter.Gill@Sun.COM if (ini_conn.conn_queue_active.head &&
1943*12114SPeter.Gill@Sun.COM (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb, idc,
1944*12114SPeter.Gill@Sun.COM (uintptr_t)ini_conn.conn_queue_active.head) == -1)) {
1945*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for iscsi cmds");
1946*12114SPeter.Gill@Sun.COM }
1947*12114SPeter.Gill@Sun.COM if (ini_conn.conn_queue_idm_aborting.head &&
1948*12114SPeter.Gill@Sun.COM (mdb_pwalk("iscsi_ini_cmd", iscsi_ini_cmd_walk_cb, idc,
1949*12114SPeter.Gill@Sun.COM (uintptr_t)ini_conn.conn_queue_idm_aborting.head) == -1)) {
1950*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed for iscsi cmds");
1951*12114SPeter.Gill@Sun.COM }
1952*12114SPeter.Gill@Sun.COM }
1953*12114SPeter.Gill@Sun.COM
1954*12114SPeter.Gill@Sun.COM /*
1955*12114SPeter.Gill@Sun.COM * If connection information was handled unset header and
1956*12114SPeter.Gill@Sun.COM * decrease indent
1957*12114SPeter.Gill@Sun.COM */
1958*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_conn) {
19597978SPeter.Dunlap@Sun.COM idc->idc_header = 0;
1960*12114SPeter.Gill@Sun.COM mdb_dec_indent(4);
19617978SPeter.Dunlap@Sun.COM }
19627978SPeter.Dunlap@Sun.COM
19637978SPeter.Dunlap@Sun.COM idc->idc_verbose = verbose;
19647978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = states;
19657978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
19667978SPeter.Dunlap@Sun.COM
19677978SPeter.Dunlap@Sun.COM return (DCMD_OK);
19687978SPeter.Dunlap@Sun.COM }
19697978SPeter.Dunlap@Sun.COM
1970*12114SPeter.Gill@Sun.COM static int
iscsi_svc_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)1971*12114SPeter.Gill@Sun.COM iscsi_svc_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
1972*12114SPeter.Gill@Sun.COM {
1973*12114SPeter.Gill@Sun.COM idm_svc_t svc;
1974*12114SPeter.Gill@Sun.COM iser_svc_t iser_svc;
1975*12114SPeter.Gill@Sun.COM uintptr_t rc_addr;
1976*12114SPeter.Gill@Sun.COM
1977*12114SPeter.Gill@Sun.COM if (mdb_vread(&svc, sizeof (idm_svc_t), addr) !=
1978*12114SPeter.Gill@Sun.COM sizeof (idm_svc_t)) {
1979*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
1980*12114SPeter.Gill@Sun.COM }
1981*12114SPeter.Gill@Sun.COM
1982*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_svc) {
1983*12114SPeter.Gill@Sun.COM if (idc->idc_verbose) {
1984*12114SPeter.Gill@Sun.COM mdb_printf("Service %p\n", addr);
1985*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Port",
1986*12114SPeter.Gill@Sun.COM svc.is_svc_req.sr_port);
1987*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Online",
1988*12114SPeter.Gill@Sun.COM svc.is_online);
1989*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %p\n", "Socket Service",
1990*12114SPeter.Gill@Sun.COM svc.is_so_svc);
1991*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %p\n", "iSER Service",
1992*12114SPeter.Gill@Sun.COM svc.is_iser_svc);
1993*12114SPeter.Gill@Sun.COM } else {
1994*12114SPeter.Gill@Sun.COM if (idc->idc_header) {
1995*12114SPeter.Gill@Sun.COM mdb_printf("%<u>%-?s %-8s %-8s%</u>\n",
1996*12114SPeter.Gill@Sun.COM "idm_svc_t", "Port", "Online");
1997*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
1998*12114SPeter.Gill@Sun.COM }
1999*12114SPeter.Gill@Sun.COM
2000*12114SPeter.Gill@Sun.COM mdb_printf("%?p %-8d %-8d\n", addr,
2001*12114SPeter.Gill@Sun.COM svc.is_svc_req.sr_port, svc.is_online);
2002*12114SPeter.Gill@Sun.COM }
2003*12114SPeter.Gill@Sun.COM
2004*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_rc_audit) {
2005*12114SPeter.Gill@Sun.COM (void) mdb_inc_indent(4);
2006*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(is_refcnt):\n");
2007*12114SPeter.Gill@Sun.COM rc_addr = addr + offsetof(idm_svc_t, is_refcnt);
2008*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
2009*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
2010*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
2011*12114SPeter.Gill@Sun.COM }
2012*12114SPeter.Gill@Sun.COM
2013*12114SPeter.Gill@Sun.COM if (svc.is_iser_svc != NULL) {
2014*12114SPeter.Gill@Sun.COM mdb_printf("Reference History"
2015*12114SPeter.Gill@Sun.COM "(iser_svc is_refcnt):\n");
2016*12114SPeter.Gill@Sun.COM
2017*12114SPeter.Gill@Sun.COM /* Sanity check the iser svc struct */
2018*12114SPeter.Gill@Sun.COM if (mdb_vread(&iser_svc, sizeof (iser_svc_t),
2019*12114SPeter.Gill@Sun.COM (uintptr_t)svc.is_iser_svc) !=
2020*12114SPeter.Gill@Sun.COM sizeof (iser_svc_t)) {
2021*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
2022*12114SPeter.Gill@Sun.COM }
2023*12114SPeter.Gill@Sun.COM
2024*12114SPeter.Gill@Sun.COM rc_addr = (uintptr_t)svc.is_iser_svc +
2025*12114SPeter.Gill@Sun.COM offsetof(iser_svc_t, is_refcnt);
2026*12114SPeter.Gill@Sun.COM
2027*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK) {
2028*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
2029*12114SPeter.Gill@Sun.COM }
2030*12114SPeter.Gill@Sun.COM }
2031*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
2032*12114SPeter.Gill@Sun.COM }
2033*12114SPeter.Gill@Sun.COM }
2034*12114SPeter.Gill@Sun.COM return (DCMD_OK);
2035*12114SPeter.Gill@Sun.COM }
2036*12114SPeter.Gill@Sun.COM
20377978SPeter.Dunlap@Sun.COM static void
iscsi_print_iscsit_conn_data(idm_conn_t * ic)20387978SPeter.Dunlap@Sun.COM iscsi_print_iscsit_conn_data(idm_conn_t *ic)
20397978SPeter.Dunlap@Sun.COM {
20407978SPeter.Dunlap@Sun.COM iscsit_conn_t ict;
20417978SPeter.Dunlap@Sun.COM char *csg;
20427978SPeter.Dunlap@Sun.COM char *nsg;
20437978SPeter.Dunlap@Sun.COM
20447978SPeter.Dunlap@Sun.COM iscsi_print_idm_conn_data(ic);
20457978SPeter.Dunlap@Sun.COM
20467978SPeter.Dunlap@Sun.COM if (mdb_vread(&ict, sizeof (iscsit_conn_t),
20477978SPeter.Dunlap@Sun.COM (uintptr_t)ic->ic_handle) != sizeof (iscsit_conn_t)) {
20487978SPeter.Dunlap@Sun.COM mdb_printf("**Failed to read conn private data\n");
20497978SPeter.Dunlap@Sun.COM return;
20507978SPeter.Dunlap@Sun.COM }
20517978SPeter.Dunlap@Sun.COM
2052*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %p\n", "iSCSIT TGT Conn",
2053*12114SPeter.Gill@Sun.COM ic->ic_handle);
2054*12114SPeter.Gill@Sun.COM
20557978SPeter.Dunlap@Sun.COM if (ict.ict_login_sm.icl_login_state != ILS_LOGIN_DONE) {
20567978SPeter.Dunlap@Sun.COM switch (ict.ict_login_sm.icl_login_csg) {
20577978SPeter.Dunlap@Sun.COM case ISCSI_SECURITY_NEGOTIATION_STAGE:
20587978SPeter.Dunlap@Sun.COM csg = "Security";
20597978SPeter.Dunlap@Sun.COM break;
20607978SPeter.Dunlap@Sun.COM case ISCSI_OP_PARMS_NEGOTIATION_STAGE:
20617978SPeter.Dunlap@Sun.COM csg = "Operational";
20627978SPeter.Dunlap@Sun.COM break;
20637978SPeter.Dunlap@Sun.COM case ISCSI_FULL_FEATURE_PHASE:
20647978SPeter.Dunlap@Sun.COM csg = "FFP";
20657978SPeter.Dunlap@Sun.COM break;
20667978SPeter.Dunlap@Sun.COM default:
20677978SPeter.Dunlap@Sun.COM csg = "Unknown";
20687978SPeter.Dunlap@Sun.COM }
20697978SPeter.Dunlap@Sun.COM switch (ict.ict_login_sm.icl_login_nsg) {
20707978SPeter.Dunlap@Sun.COM case ISCSI_SECURITY_NEGOTIATION_STAGE:
20717978SPeter.Dunlap@Sun.COM nsg = "Security";
20727978SPeter.Dunlap@Sun.COM break;
20737978SPeter.Dunlap@Sun.COM case ISCSI_OP_PARMS_NEGOTIATION_STAGE:
20747978SPeter.Dunlap@Sun.COM nsg = "Operational";
20757978SPeter.Dunlap@Sun.COM break;
20767978SPeter.Dunlap@Sun.COM case ISCSI_FULL_FEATURE_PHASE:
20777978SPeter.Dunlap@Sun.COM nsg = "FFP";
20787978SPeter.Dunlap@Sun.COM break;
20797978SPeter.Dunlap@Sun.COM default:
20807978SPeter.Dunlap@Sun.COM nsg = "Unknown";
20817978SPeter.Dunlap@Sun.COM }
20827978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d\n", "Login State",
20837978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_login_state);
20847978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d\n", "Login Last State",
20857978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_login_last_state);
20867978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s\n", "CSG", csg);
20877978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s\n", "NSG", nsg);
20887978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d\n", "Transit",
20897978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_login_transit >> 7);
20907978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %p\n", "Request nvlist",
20917978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_request_nvlist);
20927978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %p\n", "Response nvlist",
20937978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_response_nvlist);
20947978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %p\n", "Negotiated nvlist",
20957978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_negotiated_values);
20967978SPeter.Dunlap@Sun.COM if (ict.ict_login_sm.icl_login_state == ILS_LOGIN_ERROR) {
20977978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%02x\n", "Error Class",
20987978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_login_resp_err_class);
20997978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%02x\n", "Error Detail",
21007978SPeter.Dunlap@Sun.COM ict.ict_login_sm.icl_login_resp_err_detail);
21017978SPeter.Dunlap@Sun.COM }
21027978SPeter.Dunlap@Sun.COM }
21037978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%04x\n", "CID", ict.ict_cid);
21047978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%08x\n", "StatSN", ict.ict_statsn);
21057978SPeter.Dunlap@Sun.COM }
21067978SPeter.Dunlap@Sun.COM
21077978SPeter.Dunlap@Sun.COM static void
iscsi_print_ini_conn_data(idm_conn_t * ic)2108*12114SPeter.Gill@Sun.COM iscsi_print_ini_conn_data(idm_conn_t *ic)
2109*12114SPeter.Gill@Sun.COM {
2110*12114SPeter.Gill@Sun.COM iscsi_conn_t ini_conn;
2111*12114SPeter.Gill@Sun.COM
2112*12114SPeter.Gill@Sun.COM iscsi_print_idm_conn_data(ic);
2113*12114SPeter.Gill@Sun.COM
2114*12114SPeter.Gill@Sun.COM if (mdb_vread(&ini_conn, sizeof (iscsi_conn_t),
2115*12114SPeter.Gill@Sun.COM (uintptr_t)ic->ic_handle) != sizeof (iscsi_conn_t)) {
2116*12114SPeter.Gill@Sun.COM mdb_printf("Failed to read conn private data\n");
2117*12114SPeter.Gill@Sun.COM return;
2118*12114SPeter.Gill@Sun.COM }
2119*12114SPeter.Gill@Sun.COM
2120*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %p\n", "iSCSI Ini Conn",
2121*12114SPeter.Gill@Sun.COM ic->ic_handle);
2122*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %p\n", "Parent Session",
2123*12114SPeter.Gill@Sun.COM ini_conn.conn_sess);
2124*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Conn State",
2125*12114SPeter.Gill@Sun.COM ini_conn.conn_state);
2126*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Last Conn State",
2127*12114SPeter.Gill@Sun.COM ini_conn.conn_prev_state);
2128*12114SPeter.Gill@Sun.COM
2129*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Login Stage",
2130*12114SPeter.Gill@Sun.COM ini_conn.conn_current_stage);
2131*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Next Login Stage",
2132*12114SPeter.Gill@Sun.COM ini_conn.conn_next_stage);
2133*12114SPeter.Gill@Sun.COM
2134*12114SPeter.Gill@Sun.COM mdb_printf("%20s: 0x%08x\n", "Expected StatSN",
2135*12114SPeter.Gill@Sun.COM ini_conn.conn_expstatsn);
2136*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %p\n", "Active Queue Head",
2137*12114SPeter.Gill@Sun.COM ini_conn.conn_queue_active.head);
2138*12114SPeter.Gill@Sun.COM mdb_printf("%20s: %d\n", "Abort Queue Head",
2139*12114SPeter.Gill@Sun.COM ini_conn.conn_queue_idm_aborting.head);
2140*12114SPeter.Gill@Sun.COM }
2141*12114SPeter.Gill@Sun.COM
2142*12114SPeter.Gill@Sun.COM static void
iscsi_print_idm_conn_data(idm_conn_t * ic)21437978SPeter.Dunlap@Sun.COM iscsi_print_idm_conn_data(idm_conn_t *ic)
21447978SPeter.Dunlap@Sun.COM {
21457978SPeter.Dunlap@Sun.COM char laddr[PORTAL_STR_LEN];
21467978SPeter.Dunlap@Sun.COM char raddr[PORTAL_STR_LEN];
21477978SPeter.Dunlap@Sun.COM
21487978SPeter.Dunlap@Sun.COM sa_to_str(&ic->ic_laddr, laddr);
21497978SPeter.Dunlap@Sun.COM sa_to_str(&ic->ic_raddr, raddr);
21507978SPeter.Dunlap@Sun.COM
21517978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s\n", "Conn Type",
21527978SPeter.Dunlap@Sun.COM ((ic->ic_conn_type == CONN_TYPE_TGT) ? "Target" :
21537978SPeter.Dunlap@Sun.COM ((ic->ic_conn_type == CONN_TYPE_INI) ? "Initiator" :
21547978SPeter.Dunlap@Sun.COM "Unknown")));
21557978SPeter.Dunlap@Sun.COM if (ic->ic_conn_type == CONN_TYPE_TGT) {
21567978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %p\n", "Svc. Binding",
21577978SPeter.Dunlap@Sun.COM ic->ic_svc_binding);
21587978SPeter.Dunlap@Sun.COM }
21597978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s\n", "Transport",
21607978SPeter.Dunlap@Sun.COM (ic->ic_transport_type == IDM_TRANSPORT_TYPE_ISER) ? "ISER_IB" :
21617978SPeter.Dunlap@Sun.COM (ic->ic_transport_type == IDM_TRANSPORT_TYPE_SOCKETS) ? "SOCKETS" :
21627978SPeter.Dunlap@Sun.COM "N/A");
21637978SPeter.Dunlap@Sun.COM
21647978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s\n", "Local IP", laddr);
21657978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s\n", "Remote IP", raddr);
21667978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d\n", "State",
21677978SPeter.Dunlap@Sun.COM ic->ic_state);
21687978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d\n", "Last State",
21697978SPeter.Dunlap@Sun.COM ic->ic_last_state);
21707978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d %s\n", "Refcount",
21717978SPeter.Dunlap@Sun.COM ic->ic_refcnt.ir_refcnt,
21727978SPeter.Dunlap@Sun.COM (ic->ic_refcnt.ir_waiting == REF_NOWAIT) ? "" :
21737978SPeter.Dunlap@Sun.COM ((ic->ic_refcnt.ir_waiting == REF_WAIT_SYNC) ? "REF_WAIT_SYNC" :
21747978SPeter.Dunlap@Sun.COM ((ic->ic_refcnt.ir_waiting == REF_WAIT_ASYNC) ? "REF_WAIT_ASYNC" :
21757978SPeter.Dunlap@Sun.COM "UNKNOWN")));
21767978SPeter.Dunlap@Sun.COM }
21777978SPeter.Dunlap@Sun.COM
21787978SPeter.Dunlap@Sun.COM static int
iscsi_i_task_impl(idm_task_t * idt,uintptr_t addr,iscsi_dcmd_ctrl_t * idc)21797978SPeter.Dunlap@Sun.COM iscsi_i_task_impl(idm_task_t *idt, uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
21807978SPeter.Dunlap@Sun.COM {
21817978SPeter.Dunlap@Sun.COM uintptr_t list_addr, rc_addr;
21827978SPeter.Dunlap@Sun.COM idm_conn_type_t conn_type;
21837978SPeter.Dunlap@Sun.COM int verbose, states, rc_audit;
21847978SPeter.Dunlap@Sun.COM
21857978SPeter.Dunlap@Sun.COM conn_type = idm_conn_type((uintptr_t)idt->idt_ic);
21867978SPeter.Dunlap@Sun.COM
21877978SPeter.Dunlap@Sun.COM verbose = idc->idc_verbose;
21887978SPeter.Dunlap@Sun.COM states = idc->u.child.idc_states;
21897978SPeter.Dunlap@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
21907978SPeter.Dunlap@Sun.COM
21917978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_task) {
21927978SPeter.Dunlap@Sun.COM if (verbose) {
21937978SPeter.Dunlap@Sun.COM mdb_printf("Task %p\n", addr);
21947978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(2);
21957978SPeter.Dunlap@Sun.COM if (conn_type == CONN_TYPE_TGT) {
21967978SPeter.Dunlap@Sun.COM iscsi_print_iscsit_task_data(idt);
21977978SPeter.Dunlap@Sun.COM }
21987978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(2);
21997978SPeter.Dunlap@Sun.COM } else {
22007978SPeter.Dunlap@Sun.COM /* Print task data */
22017978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
22027978SPeter.Dunlap@Sun.COM mdb_printf(
22038062SPeter.Dunlap@Sun.COM "%<u>%-?s %-16s %-4s %-8s %-8s%</u>\n",
22048062SPeter.Dunlap@Sun.COM "Tasks:", "State", "Ref",
22057978SPeter.Dunlap@Sun.COM (conn_type == CONN_TYPE_TGT ? "TTT" :
22067978SPeter.Dunlap@Sun.COM (conn_type == CONN_TYPE_INI ? "ITT" :
22077978SPeter.Dunlap@Sun.COM "TT")), "Handle");
22087978SPeter.Dunlap@Sun.COM }
22098062SPeter.Dunlap@Sun.COM mdb_printf("%?p %-16s %04x %08x %08x\n", addr,
22108062SPeter.Dunlap@Sun.COM idm_ts_name[idt->idt_state],
22118062SPeter.Dunlap@Sun.COM idt->idt_refcnt.ir_refcnt,
22128062SPeter.Dunlap@Sun.COM idt->idt_tt, idt->idt_client_handle);
22137978SPeter.Dunlap@Sun.COM }
22147978SPeter.Dunlap@Sun.COM }
22157978SPeter.Dunlap@Sun.COM idc->idc_header = 0;
22167978SPeter.Dunlap@Sun.COM idc->idc_verbose = 0;
22177978SPeter.Dunlap@Sun.COM
22187978SPeter.Dunlap@Sun.COM /*
22197978SPeter.Dunlap@Sun.COM * Print states if requested
22207978SPeter.Dunlap@Sun.COM */
22217978SPeter.Dunlap@Sun.COM #if 0
22227978SPeter.Dunlap@Sun.COM if (states) {
22237978SPeter.Dunlap@Sun.COM states_addr = addr + offsetof(idm_task_t, idt_state_audit);
22247978SPeter.Dunlap@Sun.COM
22257978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(4);
2226*12114SPeter.Gill@Sun.COM mdb_printf("State History(idt_state_audit):\n");
22277978SPeter.Dunlap@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
22287978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
22297978SPeter.Dunlap@Sun.COM
22307978SPeter.Dunlap@Sun.COM /* Don't print state history for child objects */
22317978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = 0;
22327978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
22337978SPeter.Dunlap@Sun.COM }
22347978SPeter.Dunlap@Sun.COM #endif
22357978SPeter.Dunlap@Sun.COM
22367978SPeter.Dunlap@Sun.COM /*
22377978SPeter.Dunlap@Sun.COM * Print refcnt audit data if requested
22387978SPeter.Dunlap@Sun.COM */
22397978SPeter.Dunlap@Sun.COM if (rc_audit) {
22407978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(4);
2241*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(idt_refcnt):\n");
22427978SPeter.Dunlap@Sun.COM rc_addr = addr +
22437978SPeter.Dunlap@Sun.COM offsetof(idm_task_t, idt_refcnt);
22447978SPeter.Dunlap@Sun.COM if (iscsi_refcnt_impl(rc_addr) != DCMD_OK)
22457978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
22467978SPeter.Dunlap@Sun.COM
22477978SPeter.Dunlap@Sun.COM /* Don't print audit data for child objects */
22487978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = 0;
22497978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
22507978SPeter.Dunlap@Sun.COM }
22517978SPeter.Dunlap@Sun.COM
22527978SPeter.Dunlap@Sun.COM
2253*12114SPeter.Gill@Sun.COM /*
2254*12114SPeter.Gill@Sun.COM * Buffers are leaf objects and always get headers so the
2255*12114SPeter.Gill@Sun.COM * user can discern between in and out buffers.
2256*12114SPeter.Gill@Sun.COM */
22577978SPeter.Dunlap@Sun.COM if (idc->u.child.idc_buffer) {
22587978SPeter.Dunlap@Sun.COM /* Walk in buffer list */
22597978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(2);
22607978SPeter.Dunlap@Sun.COM mdb_printf("In buffers:\n");
22617978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
22627978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(2);
22637978SPeter.Dunlap@Sun.COM list_addr = addr + offsetof(idm_task_t, idt_inbufv);
22647978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_buffer_walk_cb, idc, list_addr) ==
22657978SPeter.Dunlap@Sun.COM -1) {
22667978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for task in buffers");
22677978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
22687978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
22697978SPeter.Dunlap@Sun.COM }
22707978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(2);
22717978SPeter.Dunlap@Sun.COM /* Walk out buffer list */
22727978SPeter.Dunlap@Sun.COM mdb_printf("Out buffers:\n");
22737978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
22747978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(2);
22757978SPeter.Dunlap@Sun.COM list_addr = addr + offsetof(idm_task_t, idt_outbufv);
22767978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_buffer_walk_cb, idc, list_addr) ==
22777978SPeter.Dunlap@Sun.COM -1) {
22787978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for task out buffers\n");
22797978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(2);
22807978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
22817978SPeter.Dunlap@Sun.COM }
22827978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(4);
22837978SPeter.Dunlap@Sun.COM }
22847978SPeter.Dunlap@Sun.COM
22857978SPeter.Dunlap@Sun.COM idc->idc_verbose = verbose;
22867978SPeter.Dunlap@Sun.COM idc->u.child.idc_states = states;
22877978SPeter.Dunlap@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
22887978SPeter.Dunlap@Sun.COM
22897978SPeter.Dunlap@Sun.COM return (DCMD_OK);
22907978SPeter.Dunlap@Sun.COM }
22917978SPeter.Dunlap@Sun.COM
22927978SPeter.Dunlap@Sun.COM static int
iscsi_task_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)22937978SPeter.Dunlap@Sun.COM iscsi_task_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
22947978SPeter.Dunlap@Sun.COM {
22957978SPeter.Dunlap@Sun.COM idm_task_t idt;
22967978SPeter.Dunlap@Sun.COM
22977978SPeter.Dunlap@Sun.COM /*
22987978SPeter.Dunlap@Sun.COM * Read idm_conn_t
22997978SPeter.Dunlap@Sun.COM */
23007978SPeter.Dunlap@Sun.COM if (mdb_vread(&idt, sizeof (idm_task_t), addr) != sizeof (idm_task_t)) {
23017978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
23027978SPeter.Dunlap@Sun.COM }
23037978SPeter.Dunlap@Sun.COM
23047978SPeter.Dunlap@Sun.COM return (iscsi_i_task_impl(&idt, addr, idc));
23057978SPeter.Dunlap@Sun.COM }
23067978SPeter.Dunlap@Sun.COM
23077978SPeter.Dunlap@Sun.COM #define ISCSI_CDB_INDENT 16
23087978SPeter.Dunlap@Sun.COM
23097978SPeter.Dunlap@Sun.COM static void
iscsi_print_iscsit_task_data(idm_task_t * idt)23107978SPeter.Dunlap@Sun.COM iscsi_print_iscsit_task_data(idm_task_t *idt)
23117978SPeter.Dunlap@Sun.COM {
23127978SPeter.Dunlap@Sun.COM iscsit_task_t itask;
23137978SPeter.Dunlap@Sun.COM boolean_t good_scsi_task = B_TRUE;
23147978SPeter.Dunlap@Sun.COM scsi_task_t scsi_task;
23157978SPeter.Dunlap@Sun.COM
23167978SPeter.Dunlap@Sun.COM if (mdb_vread(&itask, sizeof (iscsit_task_t),
23177978SPeter.Dunlap@Sun.COM (uintptr_t)idt->idt_private) != sizeof (iscsit_task_t)) {
23187978SPeter.Dunlap@Sun.COM mdb_printf("**Failed to read idt_private data\n");
23197978SPeter.Dunlap@Sun.COM return;
23207978SPeter.Dunlap@Sun.COM }
23217978SPeter.Dunlap@Sun.COM
23227978SPeter.Dunlap@Sun.COM if (mdb_vread(&scsi_task, sizeof (scsi_task_t),
23237978SPeter.Dunlap@Sun.COM (uintptr_t)itask.it_stmf_task) != sizeof (scsi_task_t)) {
23247978SPeter.Dunlap@Sun.COM good_scsi_task = B_FALSE;
23257978SPeter.Dunlap@Sun.COM }
23267978SPeter.Dunlap@Sun.COM
23278062SPeter.Dunlap@Sun.COM mdb_printf("%20s: %s(%d)\n", "State",
23288062SPeter.Dunlap@Sun.COM idt->idt_state > TASK_MAX_STATE ?
23298062SPeter.Dunlap@Sun.COM "UNKNOWN" : idm_ts_name[idt->idt_state],
23308062SPeter.Dunlap@Sun.COM idt->idt_state);
23318062SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d/%d\n", "STMF abort/IDM aborted",
23328062SPeter.Dunlap@Sun.COM itask.it_stmf_abort, itask.it_aborted);
23337978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %p/%p/%p%s\n",
23347978SPeter.Dunlap@Sun.COM "iscsit/STMF/LU", idt->idt_private,
23357978SPeter.Dunlap@Sun.COM itask.it_stmf_task, good_scsi_task ? scsi_task.task_lu_private : 0,
23367978SPeter.Dunlap@Sun.COM good_scsi_task ? "" : "**");
23377978SPeter.Dunlap@Sun.COM if (good_scsi_task) {
23387978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %08x/%08x\n", "ITT/TTT",
23397978SPeter.Dunlap@Sun.COM itask.it_itt, itask.it_ttt);
23407978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %08x\n", "CmdSN",
23417978SPeter.Dunlap@Sun.COM itask.it_cmdsn);
23427978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %02x %02x %02x %02x %02x %02x %02x %02x\n",
23437978SPeter.Dunlap@Sun.COM "LU number",
23447978SPeter.Dunlap@Sun.COM scsi_task.task_lun_no[0], scsi_task.task_lun_no[1],
23457978SPeter.Dunlap@Sun.COM scsi_task.task_lun_no[2], scsi_task.task_lun_no[3],
23467978SPeter.Dunlap@Sun.COM scsi_task.task_lun_no[4], scsi_task.task_lun_no[5],
23477978SPeter.Dunlap@Sun.COM scsi_task.task_lun_no[6], scsi_task.task_lun_no[7]);
23488062SPeter.Dunlap@Sun.COM mdb_printf(" CDB (%d bytes):\n",
23497978SPeter.Dunlap@Sun.COM scsi_task.task_cdb_length);
23507978SPeter.Dunlap@Sun.COM (void) mdb_inc_indent(ISCSI_CDB_INDENT);
23517978SPeter.Dunlap@Sun.COM if (mdb_dumpptr((uintptr_t)scsi_task.task_cdb,
23527978SPeter.Dunlap@Sun.COM scsi_task.task_cdb_length,
23537978SPeter.Dunlap@Sun.COM MDB_DUMP_RELATIVE | MDB_DUMP_TRIM |
23547978SPeter.Dunlap@Sun.COM MDB_DUMP_GROUP(1),
23557978SPeter.Dunlap@Sun.COM (mdb_dumpptr_cb_t)mdb_vread, NULL)) {
23567978SPeter.Dunlap@Sun.COM mdb_printf("** Invalid CDB addr (%p)\n",
23577978SPeter.Dunlap@Sun.COM scsi_task.task_cdb);
23587978SPeter.Dunlap@Sun.COM }
23597978SPeter.Dunlap@Sun.COM (void) mdb_dec_indent(ISCSI_CDB_INDENT);
23607978SPeter.Dunlap@Sun.COM mdb_printf("%20s: %d/%d\n", "STMF cur/max bufs",
23617978SPeter.Dunlap@Sun.COM scsi_task.task_cur_nbufs,
23627978SPeter.Dunlap@Sun.COM scsi_task.task_max_nbufs);
23637978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%08x/0x%08x/0x%08x\n", "Bytes Exp/Cmd/Done",
23647978SPeter.Dunlap@Sun.COM scsi_task.task_expected_xfer_length,
23657978SPeter.Dunlap@Sun.COM scsi_task.task_cmd_xfer_length,
23667978SPeter.Dunlap@Sun.COM scsi_task.task_nbytes_transferred);
23677978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%x/0x%x\n", "TX-ini start/done",
23687978SPeter.Dunlap@Sun.COM idt->idt_tx_to_ini_start,
23697978SPeter.Dunlap@Sun.COM idt->idt_tx_to_ini_done);
23707978SPeter.Dunlap@Sun.COM mdb_printf("%20s: 0x%x/0x%x\n", "RX-ini start/done",
23717978SPeter.Dunlap@Sun.COM idt->idt_rx_from_ini_start,
23727978SPeter.Dunlap@Sun.COM idt->idt_rx_from_ini_done);
23737978SPeter.Dunlap@Sun.COM }
23747978SPeter.Dunlap@Sun.COM }
23757978SPeter.Dunlap@Sun.COM
23767978SPeter.Dunlap@Sun.COM static int
iscsi_print_ini_lun(uintptr_t addr,const iscsi_lun_t * lun,iscsi_dcmd_ctrl_t * idc)2377*12114SPeter.Gill@Sun.COM iscsi_print_ini_lun(uintptr_t addr, const iscsi_lun_t *lun,
2378*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc)
2379*12114SPeter.Gill@Sun.COM {
2380*12114SPeter.Gill@Sun.COM
2381*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_lun) {
2382*12114SPeter.Gill@Sun.COM if (idc->idc_header) {
2383*12114SPeter.Gill@Sun.COM mdb_printf("%<u>%-?s %-5s %-10s%</u>\n",
2384*12114SPeter.Gill@Sun.COM "iscsi_lun_t", "State", "Lun Number");
2385*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
2386*12114SPeter.Gill@Sun.COM }
2387*12114SPeter.Gill@Sun.COM mdb_printf("%?p %-5d %-10d\n", addr,
2388*12114SPeter.Gill@Sun.COM lun->lun_state, lun->lun_num);
2389*12114SPeter.Gill@Sun.COM }
2390*12114SPeter.Gill@Sun.COM return (DCMD_OK);
2391*12114SPeter.Gill@Sun.COM }
2392*12114SPeter.Gill@Sun.COM
2393*12114SPeter.Gill@Sun.COM static int
iscsi_print_ini_cmd(uintptr_t addr,const iscsi_cmd_t * cmd,iscsi_dcmd_ctrl_t * idc)2394*12114SPeter.Gill@Sun.COM iscsi_print_ini_cmd(uintptr_t addr, const iscsi_cmd_t *cmd,
2395*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc) {
2396*12114SPeter.Gill@Sun.COM
2397*12114SPeter.Gill@Sun.COM uintptr_t states_addr;
2398*12114SPeter.Gill@Sun.COM
2399*12114SPeter.Gill@Sun.COM if (idc->idc_header) {
2400*12114SPeter.Gill@Sun.COM mdb_printf("%<u>%-?s %-?s %4s %6s/%-6s %-?s%</u>\n",
2401*12114SPeter.Gill@Sun.COM "iscsi_cmd_t", "idm_task_t", "Type",
2402*12114SPeter.Gill@Sun.COM "State", "Prev", "iscsi_lun_t");
2403*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
2404*12114SPeter.Gill@Sun.COM }
2405*12114SPeter.Gill@Sun.COM
2406*12114SPeter.Gill@Sun.COM mdb_printf("%?p %?p %4d %6d/%-6d %?p\n",
2407*12114SPeter.Gill@Sun.COM addr, cmd->cmd_itp, cmd->cmd_type, cmd->cmd_state,
2408*12114SPeter.Gill@Sun.COM cmd->cmd_prev_state, cmd->cmd_lun);
2409*12114SPeter.Gill@Sun.COM
2410*12114SPeter.Gill@Sun.COM /*
2411*12114SPeter.Gill@Sun.COM * Print states if requested
2412*12114SPeter.Gill@Sun.COM */
2413*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_states) {
2414*12114SPeter.Gill@Sun.COM states_addr = addr + offsetof(iscsi_cmd_t, cmd_state_audit);
2415*12114SPeter.Gill@Sun.COM
2416*12114SPeter.Gill@Sun.COM (void) mdb_inc_indent(4);
2417*12114SPeter.Gill@Sun.COM mdb_printf("State History(cmd_state_audit):\n");
2418*12114SPeter.Gill@Sun.COM if (iscsi_sm_audit_impl(states_addr) != DCMD_OK)
2419*12114SPeter.Gill@Sun.COM return (DCMD_ERR);
2420*12114SPeter.Gill@Sun.COM idc->u.child.idc_states = 0;
2421*12114SPeter.Gill@Sun.COM (void) mdb_dec_indent(4);
2422*12114SPeter.Gill@Sun.COM }
2423*12114SPeter.Gill@Sun.COM return (DCMD_OK);
2424*12114SPeter.Gill@Sun.COM }
2425*12114SPeter.Gill@Sun.COM
2426*12114SPeter.Gill@Sun.COM static int
iscsi_buffer_impl(uintptr_t addr,iscsi_dcmd_ctrl_t * idc)24277978SPeter.Dunlap@Sun.COM iscsi_buffer_impl(uintptr_t addr, iscsi_dcmd_ctrl_t *idc)
24287978SPeter.Dunlap@Sun.COM {
24297978SPeter.Dunlap@Sun.COM idm_buf_t idb;
24307978SPeter.Dunlap@Sun.COM
24317978SPeter.Dunlap@Sun.COM /*
24327978SPeter.Dunlap@Sun.COM * Read idm_buf_t
24337978SPeter.Dunlap@Sun.COM */
24347978SPeter.Dunlap@Sun.COM if (mdb_vread(&idb, sizeof (idm_buf_t), addr) != sizeof (idm_buf_t)) {
24357978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
24367978SPeter.Dunlap@Sun.COM }
24377978SPeter.Dunlap@Sun.COM
24387978SPeter.Dunlap@Sun.COM
24397978SPeter.Dunlap@Sun.COM if (idc->idc_header) {
24407978SPeter.Dunlap@Sun.COM mdb_printf("%<u>%-?s %?s/%-8s %8s %8s %8s%</u>\n",
24417978SPeter.Dunlap@Sun.COM "idm_buf_t", "Mem Rgn", "Length",
24427978SPeter.Dunlap@Sun.COM "Rel Off", "Xfer Len", "Exp. Off");
2443*12114SPeter.Gill@Sun.COM idc->idc_header = 0;
24447978SPeter.Dunlap@Sun.COM }
24457978SPeter.Dunlap@Sun.COM
24467978SPeter.Dunlap@Sun.COM /* Print buffer data */
24477978SPeter.Dunlap@Sun.COM mdb_printf("%?p %?p/%08x %8x %8x %08x\n", addr,
24487978SPeter.Dunlap@Sun.COM idb.idb_buf, idb.idb_buflen,
24497978SPeter.Dunlap@Sun.COM idb.idb_bufoffset, idb.idb_xfer_len,
24507978SPeter.Dunlap@Sun.COM idb.idb_exp_offset);
24517978SPeter.Dunlap@Sun.COM
24527978SPeter.Dunlap@Sun.COM
24537978SPeter.Dunlap@Sun.COM /* Buffers are leaf objects */
24547978SPeter.Dunlap@Sun.COM
24557978SPeter.Dunlap@Sun.COM return (DCMD_OK);
24567978SPeter.Dunlap@Sun.COM }
24577978SPeter.Dunlap@Sun.COM
24587978SPeter.Dunlap@Sun.COM static int
iscsi_refcnt_impl(uintptr_t addr)24597978SPeter.Dunlap@Sun.COM iscsi_refcnt_impl(uintptr_t addr)
24607978SPeter.Dunlap@Sun.COM {
24617978SPeter.Dunlap@Sun.COM idm_refcnt_t refcnt;
24627978SPeter.Dunlap@Sun.COM refcnt_audit_buf_t *anb;
24637978SPeter.Dunlap@Sun.COM int ctr;
24647978SPeter.Dunlap@Sun.COM
24657978SPeter.Dunlap@Sun.COM /*
24667978SPeter.Dunlap@Sun.COM * Print refcnt info
24677978SPeter.Dunlap@Sun.COM */
24687978SPeter.Dunlap@Sun.COM if (mdb_vread(&refcnt, sizeof (idm_refcnt_t), addr) !=
24697978SPeter.Dunlap@Sun.COM sizeof (idm_refcnt_t)) {
2470*12114SPeter.Gill@Sun.COM mdb_warn("read refcnt failed");
24717978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
24727978SPeter.Dunlap@Sun.COM }
24737978SPeter.Dunlap@Sun.COM
24747978SPeter.Dunlap@Sun.COM anb = &refcnt.ir_audit_buf;
24757978SPeter.Dunlap@Sun.COM
24767978SPeter.Dunlap@Sun.COM ctr = anb->anb_max_index + 1;
24777978SPeter.Dunlap@Sun.COM anb->anb_index--;
24787978SPeter.Dunlap@Sun.COM anb->anb_index &= anb->anb_max_index;
24797978SPeter.Dunlap@Sun.COM
24807978SPeter.Dunlap@Sun.COM while (ctr) {
24817978SPeter.Dunlap@Sun.COM refcnt_audit_record_t *anr;
24827978SPeter.Dunlap@Sun.COM
24837978SPeter.Dunlap@Sun.COM anr = anb->anb_records + anb->anb_index;
24847978SPeter.Dunlap@Sun.COM
24857978SPeter.Dunlap@Sun.COM if (anr->anr_depth) {
24867978SPeter.Dunlap@Sun.COM char c[MDB_SYM_NAMLEN];
24877978SPeter.Dunlap@Sun.COM GElf_Sym sym;
24887978SPeter.Dunlap@Sun.COM int i;
24897978SPeter.Dunlap@Sun.COM
24907978SPeter.Dunlap@Sun.COM mdb_printf("\nRefCnt: %u\t", anr->anr_refcnt);
24917978SPeter.Dunlap@Sun.COM
24927978SPeter.Dunlap@Sun.COM for (i = 0; i < anr->anr_depth; i++) {
24937978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_addr(anr->anr_stack[i],
24947978SPeter.Dunlap@Sun.COM MDB_SYM_FUZZY, c, sizeof (c),
24957978SPeter.Dunlap@Sun.COM &sym) == -1) {
24967978SPeter.Dunlap@Sun.COM continue;
24977978SPeter.Dunlap@Sun.COM }
24987978SPeter.Dunlap@Sun.COM mdb_printf("%s+0x%1x", c,
24997978SPeter.Dunlap@Sun.COM anr->anr_stack[i] -
25007978SPeter.Dunlap@Sun.COM (uintptr_t)sym.st_value);
25017978SPeter.Dunlap@Sun.COM ++i;
25027978SPeter.Dunlap@Sun.COM break;
25037978SPeter.Dunlap@Sun.COM }
25047978SPeter.Dunlap@Sun.COM
25057978SPeter.Dunlap@Sun.COM while (i < anr->anr_depth) {
25067978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_addr(anr->anr_stack[i],
25077978SPeter.Dunlap@Sun.COM MDB_SYM_FUZZY, c, sizeof (c),
25087978SPeter.Dunlap@Sun.COM &sym) == -1) {
25097978SPeter.Dunlap@Sun.COM ++i;
25107978SPeter.Dunlap@Sun.COM continue;
25117978SPeter.Dunlap@Sun.COM }
25127978SPeter.Dunlap@Sun.COM mdb_printf("\n\t\t%s+0x%1x", c,
25137978SPeter.Dunlap@Sun.COM anr->anr_stack[i] -
25147978SPeter.Dunlap@Sun.COM (uintptr_t)sym.st_value);
25157978SPeter.Dunlap@Sun.COM ++i;
25167978SPeter.Dunlap@Sun.COM }
25177978SPeter.Dunlap@Sun.COM mdb_printf("\n");
25187978SPeter.Dunlap@Sun.COM }
25197978SPeter.Dunlap@Sun.COM anb->anb_index--;
25207978SPeter.Dunlap@Sun.COM anb->anb_index &= anb->anb_max_index;
25217978SPeter.Dunlap@Sun.COM ctr--;
25227978SPeter.Dunlap@Sun.COM }
25237978SPeter.Dunlap@Sun.COM
25247978SPeter.Dunlap@Sun.COM return (DCMD_OK);
25257978SPeter.Dunlap@Sun.COM }
25267978SPeter.Dunlap@Sun.COM
25277978SPeter.Dunlap@Sun.COM static int
iscsi_sm_audit_impl(uintptr_t addr)25287978SPeter.Dunlap@Sun.COM iscsi_sm_audit_impl(uintptr_t addr)
25297978SPeter.Dunlap@Sun.COM {
25307978SPeter.Dunlap@Sun.COM sm_audit_buf_t audit_buf;
25317978SPeter.Dunlap@Sun.COM int ctr;
25327978SPeter.Dunlap@Sun.COM const char *event_name;
25337978SPeter.Dunlap@Sun.COM const char *state_name;
25347978SPeter.Dunlap@Sun.COM const char *new_state_name;
25357978SPeter.Dunlap@Sun.COM char ts_string[40];
25367978SPeter.Dunlap@Sun.COM /*
25377978SPeter.Dunlap@Sun.COM * Print refcnt info
25387978SPeter.Dunlap@Sun.COM */
25397978SPeter.Dunlap@Sun.COM if (mdb_vread(&audit_buf, sizeof (sm_audit_buf_t), addr) !=
25407978SPeter.Dunlap@Sun.COM sizeof (sm_audit_buf_t)) {
2541*12114SPeter.Gill@Sun.COM mdb_warn("failed to read audit buf");
25427978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
25437978SPeter.Dunlap@Sun.COM }
25447978SPeter.Dunlap@Sun.COM
25457978SPeter.Dunlap@Sun.COM ctr = audit_buf.sab_max_index + 1;
25467978SPeter.Dunlap@Sun.COM audit_buf.sab_index++;
25477978SPeter.Dunlap@Sun.COM audit_buf.sab_index &= audit_buf.sab_max_index;
25487978SPeter.Dunlap@Sun.COM
25497978SPeter.Dunlap@Sun.COM while (ctr) {
25507978SPeter.Dunlap@Sun.COM sm_audit_record_t *sar;
25517978SPeter.Dunlap@Sun.COM
25527978SPeter.Dunlap@Sun.COM sar = audit_buf.sab_records + audit_buf.sab_index;
25537978SPeter.Dunlap@Sun.COM
25547978SPeter.Dunlap@Sun.COM iscsi_format_timestamp(ts_string, 40, &sar->sar_timestamp);
25557978SPeter.Dunlap@Sun.COM
25567978SPeter.Dunlap@Sun.COM switch (sar->sar_type) {
25577978SPeter.Dunlap@Sun.COM case SAR_STATE_EVENT:
25587978SPeter.Dunlap@Sun.COM switch (sar->sar_sm_type) {
25597978SPeter.Dunlap@Sun.COM case SAS_IDM_CONN:
25607978SPeter.Dunlap@Sun.COM state_name =
25617978SPeter.Dunlap@Sun.COM iscsi_idm_conn_state(sar->sar_state);
25627978SPeter.Dunlap@Sun.COM event_name =
25637978SPeter.Dunlap@Sun.COM iscsi_idm_conn_event(sar->sar_event);
25647978SPeter.Dunlap@Sun.COM break;
25657978SPeter.Dunlap@Sun.COM case SAS_ISCSIT_TGT:
25667978SPeter.Dunlap@Sun.COM state_name =
25677978SPeter.Dunlap@Sun.COM iscsi_iscsit_tgt_state(sar->sar_state);
25687978SPeter.Dunlap@Sun.COM event_name =
25697978SPeter.Dunlap@Sun.COM iscsi_iscsit_tgt_event(sar->sar_event);
25707978SPeter.Dunlap@Sun.COM break;
25717978SPeter.Dunlap@Sun.COM case SAS_ISCSIT_SESS:
25727978SPeter.Dunlap@Sun.COM state_name =
25737978SPeter.Dunlap@Sun.COM iscsi_iscsit_sess_state(sar->sar_state);
25747978SPeter.Dunlap@Sun.COM event_name =
25757978SPeter.Dunlap@Sun.COM iscsi_iscsit_sess_event(sar->sar_event);
25767978SPeter.Dunlap@Sun.COM break;
25777978SPeter.Dunlap@Sun.COM case SAS_ISCSIT_LOGIN:
25787978SPeter.Dunlap@Sun.COM state_name =
25797978SPeter.Dunlap@Sun.COM iscsi_iscsit_login_state(sar->sar_state);
25807978SPeter.Dunlap@Sun.COM event_name =
25817978SPeter.Dunlap@Sun.COM iscsi_iscsit_login_event(sar->sar_event);
25827978SPeter.Dunlap@Sun.COM break;
25839162SPeter.Dunlap@Sun.COM case SAS_ISCSI_CMD:
25849162SPeter.Dunlap@Sun.COM state_name =
25859162SPeter.Dunlap@Sun.COM iscsi_iscsi_cmd_state(sar->sar_state);
25869162SPeter.Dunlap@Sun.COM event_name=
25879162SPeter.Dunlap@Sun.COM iscsi_iscsi_cmd_event(sar->sar_event);
25889162SPeter.Dunlap@Sun.COM break;
25899162SPeter.Dunlap@Sun.COM case SAS_ISCSI_SESS:
25909162SPeter.Dunlap@Sun.COM state_name =
25919162SPeter.Dunlap@Sun.COM iscsi_iscsi_sess_state(sar->sar_state);
25929162SPeter.Dunlap@Sun.COM event_name=
25939162SPeter.Dunlap@Sun.COM iscsi_iscsi_sess_event(sar->sar_event);
25949162SPeter.Dunlap@Sun.COM break;
259510766SPeter.Cudhea@Sun.COM case SAS_ISCSI_CONN:
259610766SPeter.Cudhea@Sun.COM state_name =
259710766SPeter.Cudhea@Sun.COM iscsi_iscsi_conn_state(sar->sar_state);
259810766SPeter.Cudhea@Sun.COM event_name=
259910766SPeter.Cudhea@Sun.COM iscsi_iscsi_conn_event(sar->sar_event);
260010766SPeter.Cudhea@Sun.COM break;
26017978SPeter.Dunlap@Sun.COM default:
26027978SPeter.Dunlap@Sun.COM state_name = event_name = "N/A";
26037978SPeter.Dunlap@Sun.COM break;
26047978SPeter.Dunlap@Sun.COM }
26057978SPeter.Dunlap@Sun.COM mdb_printf("%s|%s (%d)\n\t%9s %s (%d) %p\n",
26067978SPeter.Dunlap@Sun.COM ts_string, state_name, sar->sar_state,
26077978SPeter.Dunlap@Sun.COM "Event", event_name,
26087978SPeter.Dunlap@Sun.COM sar->sar_event, sar->sar_event_info);
26097978SPeter.Dunlap@Sun.COM
26107978SPeter.Dunlap@Sun.COM break;
26117978SPeter.Dunlap@Sun.COM case SAR_STATE_CHANGE:
26127978SPeter.Dunlap@Sun.COM switch (sar->sar_sm_type) {
26137978SPeter.Dunlap@Sun.COM case SAS_IDM_CONN:
26147978SPeter.Dunlap@Sun.COM state_name =
26157978SPeter.Dunlap@Sun.COM iscsi_idm_conn_state(sar->sar_state);
26167978SPeter.Dunlap@Sun.COM new_state_name =
26177978SPeter.Dunlap@Sun.COM iscsi_idm_conn_state(sar->sar_new_state);
26187978SPeter.Dunlap@Sun.COM break;
26197978SPeter.Dunlap@Sun.COM case SAS_IDM_TASK:
26207978SPeter.Dunlap@Sun.COM state_name =
26217978SPeter.Dunlap@Sun.COM iscsi_idm_task_state(sar->sar_state);
26227978SPeter.Dunlap@Sun.COM new_state_name =
26237978SPeter.Dunlap@Sun.COM iscsi_idm_task_state(sar->sar_new_state);
26247978SPeter.Dunlap@Sun.COM break;
26257978SPeter.Dunlap@Sun.COM case SAS_ISCSIT_TGT:
26267978SPeter.Dunlap@Sun.COM state_name =
26277978SPeter.Dunlap@Sun.COM iscsi_iscsit_tgt_state(sar->sar_state);
26287978SPeter.Dunlap@Sun.COM new_state_name =
26297978SPeter.Dunlap@Sun.COM iscsi_iscsit_tgt_state(sar->sar_new_state);
26307978SPeter.Dunlap@Sun.COM break;
26317978SPeter.Dunlap@Sun.COM case SAS_ISCSIT_SESS:
26327978SPeter.Dunlap@Sun.COM state_name =
26337978SPeter.Dunlap@Sun.COM iscsi_iscsit_sess_state(sar->sar_state);
26347978SPeter.Dunlap@Sun.COM new_state_name =
26357978SPeter.Dunlap@Sun.COM iscsi_iscsit_sess_state(sar->sar_new_state);
26367978SPeter.Dunlap@Sun.COM break;
26377978SPeter.Dunlap@Sun.COM case SAS_ISCSIT_LOGIN:
26387978SPeter.Dunlap@Sun.COM state_name =
26397978SPeter.Dunlap@Sun.COM iscsi_iscsit_login_state(sar->sar_state);
26407978SPeter.Dunlap@Sun.COM new_state_name =
26417978SPeter.Dunlap@Sun.COM iscsi_iscsit_login_state(
26427978SPeter.Dunlap@Sun.COM sar->sar_new_state);
26437978SPeter.Dunlap@Sun.COM break;
26449162SPeter.Dunlap@Sun.COM case SAS_ISCSI_CMD:
26459162SPeter.Dunlap@Sun.COM state_name =
26469162SPeter.Dunlap@Sun.COM iscsi_iscsi_cmd_state(sar->sar_state);
26479162SPeter.Dunlap@Sun.COM new_state_name=
26489162SPeter.Dunlap@Sun.COM iscsi_iscsi_cmd_state(sar->sar_new_state);
26499162SPeter.Dunlap@Sun.COM break;
26509162SPeter.Dunlap@Sun.COM case SAS_ISCSI_SESS:
26519162SPeter.Dunlap@Sun.COM state_name =
26529162SPeter.Dunlap@Sun.COM iscsi_iscsi_sess_state(sar->sar_state);
26539162SPeter.Dunlap@Sun.COM new_state_name=
26549162SPeter.Dunlap@Sun.COM iscsi_iscsi_sess_state(sar->sar_new_state);
26559162SPeter.Dunlap@Sun.COM break;
26569162SPeter.Dunlap@Sun.COM case SAS_ISCSI_CONN:
26579162SPeter.Dunlap@Sun.COM state_name =
26589162SPeter.Dunlap@Sun.COM iscsi_iscsi_conn_state(sar->sar_state);
26599162SPeter.Dunlap@Sun.COM new_state_name=
26609162SPeter.Dunlap@Sun.COM iscsi_iscsi_conn_state(sar->sar_new_state);
26619162SPeter.Dunlap@Sun.COM break;
26629162SPeter.Dunlap@Sun.COM case SAS_ISCSI_LOGIN:
26639162SPeter.Dunlap@Sun.COM state_name =
26649162SPeter.Dunlap@Sun.COM iscsi_iscsi_login_state(sar->sar_state);
26659162SPeter.Dunlap@Sun.COM new_state_name=
26669162SPeter.Dunlap@Sun.COM iscsi_iscsi_login_state(sar->sar_new_state);
26679162SPeter.Dunlap@Sun.COM break;
26687978SPeter.Dunlap@Sun.COM default:
26697978SPeter.Dunlap@Sun.COM break;
26707978SPeter.Dunlap@Sun.COM }
26717978SPeter.Dunlap@Sun.COM mdb_printf("%s|%s (%d)\n\t%9s %s (%d)\n",
26727978SPeter.Dunlap@Sun.COM ts_string, state_name, sar->sar_state,
26737978SPeter.Dunlap@Sun.COM "New State", new_state_name, sar->sar_new_state);
26747978SPeter.Dunlap@Sun.COM default:
26757978SPeter.Dunlap@Sun.COM state_name = new_state_name = "N/A";
26767978SPeter.Dunlap@Sun.COM break;
26777978SPeter.Dunlap@Sun.COM }
26787978SPeter.Dunlap@Sun.COM
26797978SPeter.Dunlap@Sun.COM audit_buf.sab_index++;
26807978SPeter.Dunlap@Sun.COM audit_buf.sab_index &= audit_buf.sab_max_index;
26817978SPeter.Dunlap@Sun.COM ctr--;
26827978SPeter.Dunlap@Sun.COM }
26837978SPeter.Dunlap@Sun.COM
26847978SPeter.Dunlap@Sun.COM return (DCMD_OK);
26857978SPeter.Dunlap@Sun.COM }
26867978SPeter.Dunlap@Sun.COM
26877978SPeter.Dunlap@Sun.COM static const char *
iscsi_idm_conn_event(unsigned int event)26889162SPeter.Dunlap@Sun.COM iscsi_idm_conn_event(unsigned int event)
26897978SPeter.Dunlap@Sun.COM {
26909162SPeter.Dunlap@Sun.COM return ((event < CE_MAX_EVENT) ? idm_ce_name[event] : "N/A");
26917978SPeter.Dunlap@Sun.COM }
26927978SPeter.Dunlap@Sun.COM
26937978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsit_tgt_event(unsigned int event)26949162SPeter.Dunlap@Sun.COM iscsi_iscsit_tgt_event(unsigned int event)
26957978SPeter.Dunlap@Sun.COM {
26969162SPeter.Dunlap@Sun.COM return ((event < TE_MAX_EVENT) ? iscsit_te_name[event] : "N/A");
26979162SPeter.Dunlap@Sun.COM }
26987978SPeter.Dunlap@Sun.COM
26999162SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsit_sess_event(unsigned int event)27009162SPeter.Dunlap@Sun.COM iscsi_iscsit_sess_event(unsigned int event)
27019162SPeter.Dunlap@Sun.COM {
27029162SPeter.Dunlap@Sun.COM return ((event < SE_MAX_EVENT) ? iscsit_se_name[event] : "N/A");
27037978SPeter.Dunlap@Sun.COM }
27047978SPeter.Dunlap@Sun.COM
27057978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsit_login_event(unsigned int event)27069162SPeter.Dunlap@Sun.COM iscsi_iscsit_login_event(unsigned int event)
27077978SPeter.Dunlap@Sun.COM {
27089162SPeter.Dunlap@Sun.COM return ((event < ILE_MAX_EVENT) ? iscsit_ile_name[event] : "N/A");
27097978SPeter.Dunlap@Sun.COM }
27107978SPeter.Dunlap@Sun.COM
27117978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsi_cmd_event(unsigned int event)27129162SPeter.Dunlap@Sun.COM iscsi_iscsi_cmd_event(unsigned int event)
27137978SPeter.Dunlap@Sun.COM {
27149162SPeter.Dunlap@Sun.COM return ((event < ISCSI_CMD_EVENT_MAX) ?
27159162SPeter.Dunlap@Sun.COM iscsi_cmd_event_names[event] : "N/A");
27167978SPeter.Dunlap@Sun.COM }
27177978SPeter.Dunlap@Sun.COM
27187978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsi_sess_event(unsigned int event)27199162SPeter.Dunlap@Sun.COM iscsi_iscsi_sess_event(unsigned int event)
27207978SPeter.Dunlap@Sun.COM {
27217978SPeter.Dunlap@Sun.COM
27229162SPeter.Dunlap@Sun.COM return ((event < ISCSI_SESS_EVENT_MAX) ?
27239162SPeter.Dunlap@Sun.COM iscsi_sess_event_names[event] : "N/A");
27249162SPeter.Dunlap@Sun.COM }
27257978SPeter.Dunlap@Sun.COM
27269162SPeter.Dunlap@Sun.COM static const char *
iscsi_idm_conn_state(unsigned int state)27279162SPeter.Dunlap@Sun.COM iscsi_idm_conn_state(unsigned int state)
27289162SPeter.Dunlap@Sun.COM {
27299162SPeter.Dunlap@Sun.COM return ((state < CS_MAX_STATE) ? idm_cs_name[state] : "N/A");
27307978SPeter.Dunlap@Sun.COM }
27317978SPeter.Dunlap@Sun.COM
273210766SPeter.Cudhea@Sun.COM static const char *
iscsi_iscsi_conn_event(unsigned int event)273310766SPeter.Cudhea@Sun.COM iscsi_iscsi_conn_event(unsigned int event)
273410766SPeter.Cudhea@Sun.COM {
273510766SPeter.Cudhea@Sun.COM
273610766SPeter.Cudhea@Sun.COM return ((event < CN_MAX) ? idm_cn_strings[event] : "N/A");
273710766SPeter.Cudhea@Sun.COM }
273810766SPeter.Cudhea@Sun.COM
27397978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
27407978SPeter.Dunlap@Sun.COM static const char *
iscsi_idm_task_state(unsigned int state)27419162SPeter.Dunlap@Sun.COM iscsi_idm_task_state(unsigned int state)
27427978SPeter.Dunlap@Sun.COM {
27439162SPeter.Dunlap@Sun.COM return ("N/A");
27447978SPeter.Dunlap@Sun.COM }
27457978SPeter.Dunlap@Sun.COM
27467978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsit_tgt_state(unsigned int state)27479162SPeter.Dunlap@Sun.COM iscsi_iscsit_tgt_state(unsigned int state)
27487978SPeter.Dunlap@Sun.COM {
27499162SPeter.Dunlap@Sun.COM return ((state < TS_MAX_STATE) ? iscsit_ts_name[state] : "N/A");
27509162SPeter.Dunlap@Sun.COM }
27517978SPeter.Dunlap@Sun.COM
27529162SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsit_sess_state(unsigned int state)27539162SPeter.Dunlap@Sun.COM iscsi_iscsit_sess_state(unsigned int state)
27549162SPeter.Dunlap@Sun.COM {
27559162SPeter.Dunlap@Sun.COM return ((state < SS_MAX_STATE) ? iscsit_ss_name[state] : "N/A");
27569162SPeter.Dunlap@Sun.COM }
27577978SPeter.Dunlap@Sun.COM
27589162SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsit_login_state(unsigned int state)27599162SPeter.Dunlap@Sun.COM iscsi_iscsit_login_state(unsigned int state)
27609162SPeter.Dunlap@Sun.COM {
27619162SPeter.Dunlap@Sun.COM return ((state < ILS_MAX_STATE) ? iscsit_ils_name[state] : "N/A");
27627978SPeter.Dunlap@Sun.COM }
27637978SPeter.Dunlap@Sun.COM
27647978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsi_cmd_state(unsigned int state)27659162SPeter.Dunlap@Sun.COM iscsi_iscsi_cmd_state(unsigned int state)
27667978SPeter.Dunlap@Sun.COM {
27679162SPeter.Dunlap@Sun.COM return ((state < ISCSI_CMD_STATE_MAX) ?
27689162SPeter.Dunlap@Sun.COM iscsi_cmd_state_names[state] : "N/A");
27697978SPeter.Dunlap@Sun.COM }
27707978SPeter.Dunlap@Sun.COM
27717978SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsi_sess_state(unsigned int state)27729162SPeter.Dunlap@Sun.COM iscsi_iscsi_sess_state(unsigned int state)
27737978SPeter.Dunlap@Sun.COM {
27749162SPeter.Dunlap@Sun.COM return ((state < ISCSI_SESS_STATE_MAX) ?
27759162SPeter.Dunlap@Sun.COM iscsi_sess_state_names[state] : "N/A");
27767978SPeter.Dunlap@Sun.COM }
27777978SPeter.Dunlap@Sun.COM
27789162SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsi_conn_state(unsigned int state)27799162SPeter.Dunlap@Sun.COM iscsi_iscsi_conn_state(unsigned int state)
27809162SPeter.Dunlap@Sun.COM {
27819162SPeter.Dunlap@Sun.COM return ((state < ISCSI_CONN_STATE_MAX) ? iscsi_ics_name[state] : "N/A");
27829162SPeter.Dunlap@Sun.COM }
27839162SPeter.Dunlap@Sun.COM
27849162SPeter.Dunlap@Sun.COM static const char *
iscsi_iscsi_login_state(unsigned int state)27859162SPeter.Dunlap@Sun.COM iscsi_iscsi_login_state(unsigned int state)
27869162SPeter.Dunlap@Sun.COM {
27879162SPeter.Dunlap@Sun.COM return ((state < LOGIN_MAX) ? iscsi_login_state_names[state] : "N/A");
27889162SPeter.Dunlap@Sun.COM }
27897978SPeter.Dunlap@Sun.COM
27907978SPeter.Dunlap@Sun.COM
27917978SPeter.Dunlap@Sun.COM /*
27927978SPeter.Dunlap@Sun.COM * Retrieve connection type given a kernel address
27937978SPeter.Dunlap@Sun.COM */
27947978SPeter.Dunlap@Sun.COM static idm_conn_type_t
idm_conn_type(uintptr_t addr)27957978SPeter.Dunlap@Sun.COM idm_conn_type(uintptr_t addr)
27967978SPeter.Dunlap@Sun.COM {
27977978SPeter.Dunlap@Sun.COM idm_conn_type_t result = 0; /* Unknown */
27987978SPeter.Dunlap@Sun.COM uintptr_t idm_conn_type_addr;
27997978SPeter.Dunlap@Sun.COM
28007978SPeter.Dunlap@Sun.COM idm_conn_type_addr = addr + offsetof(idm_conn_t, ic_conn_type);
28017978SPeter.Dunlap@Sun.COM (void) mdb_vread(&result, sizeof (result), idm_conn_type_addr);
28027978SPeter.Dunlap@Sun.COM
28037978SPeter.Dunlap@Sun.COM return (result);
28047978SPeter.Dunlap@Sun.COM }
28057978SPeter.Dunlap@Sun.COM
28067978SPeter.Dunlap@Sun.COM /*
28077978SPeter.Dunlap@Sun.COM * Convert a sockaddr to the string representation, suitable for
28087978SPeter.Dunlap@Sun.COM * storing in an nvlist or printing out in a list.
28097978SPeter.Dunlap@Sun.COM */
28107978SPeter.Dunlap@Sun.COM static int
sa_to_str(struct sockaddr_storage * sa,char * buf)28117978SPeter.Dunlap@Sun.COM sa_to_str(struct sockaddr_storage *sa, char *buf)
28127978SPeter.Dunlap@Sun.COM {
28137978SPeter.Dunlap@Sun.COM char pbuf[7];
28147978SPeter.Dunlap@Sun.COM const char *bufp;
28157978SPeter.Dunlap@Sun.COM struct sockaddr_in *sin;
28167978SPeter.Dunlap@Sun.COM struct sockaddr_in6 *sin6;
28177978SPeter.Dunlap@Sun.COM uint16_t port;
28187978SPeter.Dunlap@Sun.COM
28197978SPeter.Dunlap@Sun.COM if (!sa || !buf) {
28207978SPeter.Dunlap@Sun.COM return (EINVAL);
28217978SPeter.Dunlap@Sun.COM }
28227978SPeter.Dunlap@Sun.COM
28237978SPeter.Dunlap@Sun.COM buf[0] = '\0';
28247978SPeter.Dunlap@Sun.COM
28257978SPeter.Dunlap@Sun.COM if (sa->ss_family == AF_INET) {
28267978SPeter.Dunlap@Sun.COM sin = (struct sockaddr_in *)sa;
28279162SPeter.Dunlap@Sun.COM bufp = iscsi_inet_ntop(AF_INET,
28287978SPeter.Dunlap@Sun.COM (const void *)&(sin->sin_addr.s_addr),
28297978SPeter.Dunlap@Sun.COM buf, PORTAL_STR_LEN);
28307978SPeter.Dunlap@Sun.COM if (bufp == NULL) {
28317978SPeter.Dunlap@Sun.COM return (-1);
28327978SPeter.Dunlap@Sun.COM }
28337978SPeter.Dunlap@Sun.COM mdb_nhconvert(&port, &sin->sin_port, sizeof (uint16_t));
28347978SPeter.Dunlap@Sun.COM } else if (sa->ss_family == AF_INET6) {
28357978SPeter.Dunlap@Sun.COM strlcat(buf, "[", sizeof (buf));
28367978SPeter.Dunlap@Sun.COM sin6 = (struct sockaddr_in6 *)sa;
28379162SPeter.Dunlap@Sun.COM bufp = iscsi_inet_ntop(AF_INET6,
28387978SPeter.Dunlap@Sun.COM (const void *)&sin6->sin6_addr.s6_addr,
28397978SPeter.Dunlap@Sun.COM &buf[1], PORTAL_STR_LEN - 1);
28407978SPeter.Dunlap@Sun.COM if (bufp == NULL) {
28417978SPeter.Dunlap@Sun.COM return (-1);
28427978SPeter.Dunlap@Sun.COM }
28437978SPeter.Dunlap@Sun.COM strlcat(buf, "]", PORTAL_STR_LEN);
28447978SPeter.Dunlap@Sun.COM mdb_nhconvert(&port, &sin->sin_port, sizeof (uint16_t));
28457978SPeter.Dunlap@Sun.COM } else {
28467978SPeter.Dunlap@Sun.COM return (EINVAL);
28477978SPeter.Dunlap@Sun.COM }
28487978SPeter.Dunlap@Sun.COM
28497978SPeter.Dunlap@Sun.COM
28507978SPeter.Dunlap@Sun.COM mdb_snprintf(pbuf, sizeof (pbuf), ":%u", port);
28517978SPeter.Dunlap@Sun.COM strlcat(buf, pbuf, PORTAL_STR_LEN);
28527978SPeter.Dunlap@Sun.COM
28537978SPeter.Dunlap@Sun.COM return (0);
28547978SPeter.Dunlap@Sun.COM }
28557978SPeter.Dunlap@Sun.COM
28567978SPeter.Dunlap@Sun.COM
28577978SPeter.Dunlap@Sun.COM static void
iscsi_format_timestamp(char * ts_str,int strlen,timespec_t * ts)28587978SPeter.Dunlap@Sun.COM iscsi_format_timestamp(char *ts_str, int strlen, timespec_t *ts)
28597978SPeter.Dunlap@Sun.COM {
28607978SPeter.Dunlap@Sun.COM mdb_snprintf(ts_str, strlen, "%Y:%03d:%03d:%03d", ts->tv_sec,
28617978SPeter.Dunlap@Sun.COM (ts->tv_nsec / 1000000) % 1000, (ts->tv_nsec / 1000) % 1000,
28627978SPeter.Dunlap@Sun.COM ts->tv_nsec % 1000);
28637978SPeter.Dunlap@Sun.COM }
28647978SPeter.Dunlap@Sun.COM
28657978SPeter.Dunlap@Sun.COM /*
28667978SPeter.Dunlap@Sun.COM * Help information for the iscsi_isns dcmd
28677978SPeter.Dunlap@Sun.COM */
28687978SPeter.Dunlap@Sun.COM static void
iscsi_isns_help(void)28697978SPeter.Dunlap@Sun.COM iscsi_isns_help(void)
28707978SPeter.Dunlap@Sun.COM {
28717978SPeter.Dunlap@Sun.COM mdb_printf("iscsi_isns:\n");
28727978SPeter.Dunlap@Sun.COM mdb_inc_indent(4);
28737978SPeter.Dunlap@Sun.COM mdb_printf("-e: Print ESI information\n");
28747978SPeter.Dunlap@Sun.COM mdb_printf("-p: Print portal information\n");
28757978SPeter.Dunlap@Sun.COM mdb_printf("-s: Print iSNS server information\n");
28767978SPeter.Dunlap@Sun.COM mdb_printf("-t: Print target information\n");
28777978SPeter.Dunlap@Sun.COM mdb_printf("-v: Add verbosity to the other options' output\n");
2878*12114SPeter.Gill@Sun.COM mdb_printf("-R: Add Refcount information to '-t' output\n");
28797978SPeter.Dunlap@Sun.COM mdb_dec_indent(4);
28807978SPeter.Dunlap@Sun.COM }
28817978SPeter.Dunlap@Sun.COM
28827978SPeter.Dunlap@Sun.COM /* ARGSUSED */
28837978SPeter.Dunlap@Sun.COM static int
iscsi_isns_esi_cb(uintptr_t addr,const void * walker_data,void * data)28847978SPeter.Dunlap@Sun.COM iscsi_isns_esi_cb(uintptr_t addr, const void *walker_data, void *data)
28857978SPeter.Dunlap@Sun.COM {
28867978SPeter.Dunlap@Sun.COM isns_esi_tinfo_t tinfo;
28877978SPeter.Dunlap@Sun.COM
28887978SPeter.Dunlap@Sun.COM if (mdb_vread(&tinfo, sizeof (isns_esi_tinfo_t), addr) !=
28897978SPeter.Dunlap@Sun.COM sizeof (isns_esi_tinfo_t)) {
28907978SPeter.Dunlap@Sun.COM return (WALK_ERR);
28917978SPeter.Dunlap@Sun.COM }
28927978SPeter.Dunlap@Sun.COM
28937978SPeter.Dunlap@Sun.COM mdb_printf("ESI thread/thr did : 0x%p / %d\n", tinfo.esi_thread,
28947978SPeter.Dunlap@Sun.COM tinfo.esi_thread_did);
28957978SPeter.Dunlap@Sun.COM mdb_printf("ESI sonode : 0x%p\n", tinfo.esi_so);
28967978SPeter.Dunlap@Sun.COM mdb_printf("ESI port : %d\n", tinfo.esi_port);
28977978SPeter.Dunlap@Sun.COM mdb_printf("ESI thread running : %s\n",
28987978SPeter.Dunlap@Sun.COM (tinfo.esi_thread_running) ? "Yes" : "No");
28997978SPeter.Dunlap@Sun.COM
29007978SPeter.Dunlap@Sun.COM return (WALK_NEXT);
29017978SPeter.Dunlap@Sun.COM }
29027978SPeter.Dunlap@Sun.COM
29037978SPeter.Dunlap@Sun.COM static int
iscsi_isns_esi(iscsi_dcmd_ctrl_t * idc)29047978SPeter.Dunlap@Sun.COM iscsi_isns_esi(iscsi_dcmd_ctrl_t *idc)
29057978SPeter.Dunlap@Sun.COM {
29069373SPeter.Dunlap@Sun.COM GElf_Sym sym;
29079373SPeter.Dunlap@Sun.COM uintptr_t addr;
29087978SPeter.Dunlap@Sun.COM
29099373SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("esi", &sym) == -1) {
29107978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'esi_list'");
29117978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
29127978SPeter.Dunlap@Sun.COM }
29139373SPeter.Dunlap@Sun.COM addr = (uintptr_t)sym.st_value;
29147978SPeter.Dunlap@Sun.COM
29159373SPeter.Dunlap@Sun.COM idc->idc_header = 1;
29169373SPeter.Dunlap@Sun.COM (void) iscsi_isns_esi_cb(addr, NULL, idc);
29177978SPeter.Dunlap@Sun.COM
29187978SPeter.Dunlap@Sun.COM return (0);
29197978SPeter.Dunlap@Sun.COM }
29207978SPeter.Dunlap@Sun.COM
29217978SPeter.Dunlap@Sun.COM /* ARGSUSED */
29227978SPeter.Dunlap@Sun.COM static int
iscsi_isns_portal_cb(uintptr_t addr,const void * walker_data,void * data)29237978SPeter.Dunlap@Sun.COM iscsi_isns_portal_cb(uintptr_t addr, const void *walker_data, void *data)
29247978SPeter.Dunlap@Sun.COM {
29257978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data;
292610505SPeter.Cudhea@Sun.COM isns_portal_t portal;
29277978SPeter.Dunlap@Sun.COM char portal_addr[PORTAL_STR_LEN];
29287978SPeter.Dunlap@Sun.COM struct sockaddr_storage *ss;
29299373SPeter.Dunlap@Sun.COM char ts_string[40];
29307978SPeter.Dunlap@Sun.COM
293110505SPeter.Cudhea@Sun.COM if (mdb_vread(&portal, sizeof (isns_portal_t), addr) !=
293210505SPeter.Cudhea@Sun.COM sizeof (isns_portal_t)) {
29337978SPeter.Dunlap@Sun.COM return (WALK_ERR);
29347978SPeter.Dunlap@Sun.COM }
29357978SPeter.Dunlap@Sun.COM
29367978SPeter.Dunlap@Sun.COM ss = &portal.portal_addr;
29377978SPeter.Dunlap@Sun.COM sa_to_str(ss, portal_addr);
29387978SPeter.Dunlap@Sun.COM mdb_printf("Portal IP address ");
29397978SPeter.Dunlap@Sun.COM
29407978SPeter.Dunlap@Sun.COM if (ss->ss_family == AF_INET) {
29417978SPeter.Dunlap@Sun.COM mdb_printf("(v4): %s", portal_addr);
29427978SPeter.Dunlap@Sun.COM } else {
29437978SPeter.Dunlap@Sun.COM mdb_printf("(v6): %s", portal_addr);
29447978SPeter.Dunlap@Sun.COM }
29457978SPeter.Dunlap@Sun.COM
294610505SPeter.Cudhea@Sun.COM if (portal.portal_default == B_TRUE) {
29477978SPeter.Dunlap@Sun.COM mdb_printf(" (Default portal)\n");
29487978SPeter.Dunlap@Sun.COM } else {
29497978SPeter.Dunlap@Sun.COM mdb_printf("\n");
29507978SPeter.Dunlap@Sun.COM }
295110505SPeter.Cudhea@Sun.COM if (portal.portal_iscsit != NULL) {
2952*12114SPeter.Gill@Sun.COM mdb_printf("(Part of TPG: 0x%p)\n", portal.portal_iscsit);
29537978SPeter.Dunlap@Sun.COM }
29547978SPeter.Dunlap@Sun.COM
29559373SPeter.Dunlap@Sun.COM iscsi_format_timestamp(ts_string, 40, &portal.portal_esi_timestamp);
2956*12114SPeter.Gill@Sun.COM mdb_printf("Portal ESI timestamp: %s\n\n", ts_string);
29577978SPeter.Dunlap@Sun.COM
295810505SPeter.Cudhea@Sun.COM if ((portal.portal_iscsit != NULL) && (idc->idc_verbose)) {
295910505SPeter.Cudhea@Sun.COM mdb_inc_indent(4);
296010505SPeter.Cudhea@Sun.COM iscsi_portal_impl((uintptr_t)portal.portal_iscsit, idc);
296110505SPeter.Cudhea@Sun.COM mdb_dec_indent(4);
296210505SPeter.Cudhea@Sun.COM }
296310505SPeter.Cudhea@Sun.COM
296410505SPeter.Cudhea@Sun.COM
29657978SPeter.Dunlap@Sun.COM return (WALK_NEXT);
29667978SPeter.Dunlap@Sun.COM }
29677978SPeter.Dunlap@Sun.COM
29687978SPeter.Dunlap@Sun.COM static int
iscsi_isns_portals(iscsi_dcmd_ctrl_t * idc)29697978SPeter.Dunlap@Sun.COM iscsi_isns_portals(iscsi_dcmd_ctrl_t *idc)
29707978SPeter.Dunlap@Sun.COM {
29717978SPeter.Dunlap@Sun.COM GElf_Sym sym;
29727978SPeter.Dunlap@Sun.COM uintptr_t portal_list;
29737978SPeter.Dunlap@Sun.COM
297410505SPeter.Cudhea@Sun.COM mdb_printf("All Active Portals:\n");
297510505SPeter.Cudhea@Sun.COM
297610505SPeter.Cudhea@Sun.COM if (mdb_lookup_by_name("isns_all_portals", &sym) == -1) {
297710505SPeter.Cudhea@Sun.COM mdb_warn("failed to find symbol 'isns_all_portals'");
29787978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
29797978SPeter.Dunlap@Sun.COM }
29807978SPeter.Dunlap@Sun.COM
29817978SPeter.Dunlap@Sun.COM portal_list = (uintptr_t)sym.st_value;
29827978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
29837978SPeter.Dunlap@Sun.COM
298410505SPeter.Cudhea@Sun.COM if (mdb_pwalk("avl", iscsi_isns_portal_cb, idc, portal_list) == -1) {
298510505SPeter.Cudhea@Sun.COM mdb_warn("avl walk failed for isns_all_portals");
298610505SPeter.Cudhea@Sun.COM return (DCMD_ERR);
298710505SPeter.Cudhea@Sun.COM }
298810505SPeter.Cudhea@Sun.COM mdb_printf("\nPortals from TPGs:\n");
298910505SPeter.Cudhea@Sun.COM
299010505SPeter.Cudhea@Sun.COM if (mdb_lookup_by_name("isns_tpg_portals", &sym) == -1) {
299110505SPeter.Cudhea@Sun.COM mdb_warn("failed to find symbol 'isns_tpg_portals'");
29927978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
29937978SPeter.Dunlap@Sun.COM }
29947978SPeter.Dunlap@Sun.COM
299510505SPeter.Cudhea@Sun.COM portal_list = (uintptr_t)sym.st_value;
299610505SPeter.Cudhea@Sun.COM idc->idc_header = 1;
299710505SPeter.Cudhea@Sun.COM
299810505SPeter.Cudhea@Sun.COM if (mdb_pwalk("avl", iscsi_isns_portal_cb, idc, portal_list) == -1) {
299910505SPeter.Cudhea@Sun.COM mdb_warn("avl walk failed for isns_tpg_portals");
300010505SPeter.Cudhea@Sun.COM return (DCMD_ERR);
300110505SPeter.Cudhea@Sun.COM }
300210505SPeter.Cudhea@Sun.COM
300310505SPeter.Cudhea@Sun.COM
30047978SPeter.Dunlap@Sun.COM return (0);
30057978SPeter.Dunlap@Sun.COM }
30067978SPeter.Dunlap@Sun.COM
30077978SPeter.Dunlap@Sun.COM /* ARGSUSED */
30087978SPeter.Dunlap@Sun.COM static int
iscsi_isns_targets_cb(uintptr_t addr,const void * walker_data,void * data)30097978SPeter.Dunlap@Sun.COM iscsi_isns_targets_cb(uintptr_t addr, const void *walker_data, void *data)
30107978SPeter.Dunlap@Sun.COM {
301110505SPeter.Cudhea@Sun.COM iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data;
301210505SPeter.Cudhea@Sun.COM isns_target_t itarget;
301310505SPeter.Cudhea@Sun.COM int rc = 0;
3014*12114SPeter.Gill@Sun.COM int rc_audit = 0;
3015*12114SPeter.Gill@Sun.COM uintptr_t rc_addr;
30167978SPeter.Dunlap@Sun.COM
30177978SPeter.Dunlap@Sun.COM if (mdb_vread(&itarget, sizeof (isns_target_t), addr) !=
30187978SPeter.Dunlap@Sun.COM sizeof (isns_target_t)) {
30197978SPeter.Dunlap@Sun.COM return (WALK_ERR);
30207978SPeter.Dunlap@Sun.COM }
30217978SPeter.Dunlap@Sun.COM
30227978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
3023*12114SPeter.Gill@Sun.COM rc_audit = idc->u.child.idc_rc_audit;
30247978SPeter.Dunlap@Sun.COM
302510505SPeter.Cudhea@Sun.COM mdb_printf("Target: %p\n", addr);
30267978SPeter.Dunlap@Sun.COM mdb_inc_indent(4);
30277978SPeter.Dunlap@Sun.COM mdb_printf("Registered: %s\n",
30287978SPeter.Dunlap@Sun.COM (itarget.target_registered) ? "Yes" : "No");
302910505SPeter.Cudhea@Sun.COM mdb_printf("Update needed: %s\n",
303010505SPeter.Cudhea@Sun.COM (itarget.target_update_needed) ? "Yes" : "No");
303110505SPeter.Cudhea@Sun.COM mdb_printf("Target Info: %p\n", itarget.target_info);
30327978SPeter.Dunlap@Sun.COM
3033*12114SPeter.Gill@Sun.COM /* Prevent target refcounts from showing through this path */
3034*12114SPeter.Gill@Sun.COM idc->u.child.idc_rc_audit = 0;
30357978SPeter.Dunlap@Sun.COM rc = iscsi_tgt_impl((uintptr_t)itarget.target, idc);
30367978SPeter.Dunlap@Sun.COM
3037*12114SPeter.Gill@Sun.COM idc->u.child.idc_rc_audit = rc_audit;
3038*12114SPeter.Gill@Sun.COM if (idc->u.child.idc_rc_audit) {
3039*12114SPeter.Gill@Sun.COM rc_addr = (uintptr_t)itarget.target_info +
3040*12114SPeter.Gill@Sun.COM offsetof(isns_target_info_t, ti_refcnt);
3041*12114SPeter.Gill@Sun.COM
3042*12114SPeter.Gill@Sun.COM mdb_printf("Reference History(isns_target_info ti_refcnt):\n");
3043*12114SPeter.Gill@Sun.COM if (iscsi_refcnt_impl(rc_addr) != 0) {
3044*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3045*12114SPeter.Gill@Sun.COM }
3046*12114SPeter.Gill@Sun.COM }
3047*12114SPeter.Gill@Sun.COM
30487978SPeter.Dunlap@Sun.COM mdb_dec_indent(4);
30497978SPeter.Dunlap@Sun.COM
30507978SPeter.Dunlap@Sun.COM if (rc == DCMD_OK) {
30517978SPeter.Dunlap@Sun.COM return (WALK_NEXT);
30527978SPeter.Dunlap@Sun.COM }
30537978SPeter.Dunlap@Sun.COM
30547978SPeter.Dunlap@Sun.COM return (WALK_ERR);
30557978SPeter.Dunlap@Sun.COM }
30567978SPeter.Dunlap@Sun.COM
30577978SPeter.Dunlap@Sun.COM static int
iscsi_isns_targets(iscsi_dcmd_ctrl_t * idc)30587978SPeter.Dunlap@Sun.COM iscsi_isns_targets(iscsi_dcmd_ctrl_t *idc)
30597978SPeter.Dunlap@Sun.COM {
30607978SPeter.Dunlap@Sun.COM GElf_Sym sym;
30617978SPeter.Dunlap@Sun.COM uintptr_t isns_target_list;
30627978SPeter.Dunlap@Sun.COM
30637978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("isns_target_list", &sym) == -1) {
30647978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'isns_target_list'");
30657978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
30667978SPeter.Dunlap@Sun.COM }
30677978SPeter.Dunlap@Sun.COM
30687978SPeter.Dunlap@Sun.COM isns_target_list = (uintptr_t)sym.st_value;
30697978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
30707978SPeter.Dunlap@Sun.COM idc->u.child.idc_tgt = 1;
30717978SPeter.Dunlap@Sun.COM
30727978SPeter.Dunlap@Sun.COM if (mdb_pwalk("avl", iscsi_isns_targets_cb, idc,
30737978SPeter.Dunlap@Sun.COM isns_target_list) == -1) {
30747978SPeter.Dunlap@Sun.COM mdb_warn("avl walk failed for isns_target_list");
30757978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
30767978SPeter.Dunlap@Sun.COM }
30777978SPeter.Dunlap@Sun.COM
30787978SPeter.Dunlap@Sun.COM return (0);
30797978SPeter.Dunlap@Sun.COM }
30807978SPeter.Dunlap@Sun.COM
30817978SPeter.Dunlap@Sun.COM /* ARGSUSED */
30827978SPeter.Dunlap@Sun.COM static int
iscsi_isns_servers_cb(uintptr_t addr,const void * walker_data,void * data)30837978SPeter.Dunlap@Sun.COM iscsi_isns_servers_cb(uintptr_t addr, const void *walker_data, void *data)
30847978SPeter.Dunlap@Sun.COM {
30857978SPeter.Dunlap@Sun.COM iscsit_isns_svr_t server;
30867978SPeter.Dunlap@Sun.COM char server_addr[PORTAL_STR_LEN];
30877978SPeter.Dunlap@Sun.COM struct sockaddr_storage *ss;
30887978SPeter.Dunlap@Sun.COM clock_t lbolt;
308910505SPeter.Cudhea@Sun.COM iscsi_dcmd_ctrl_t *idc = (iscsi_dcmd_ctrl_t *)data;
309010505SPeter.Cudhea@Sun.COM uintptr_t avl_addr;
30917978SPeter.Dunlap@Sun.COM
30927978SPeter.Dunlap@Sun.COM if (mdb_vread(&server, sizeof (iscsit_isns_svr_t), addr) !=
30937978SPeter.Dunlap@Sun.COM sizeof (iscsit_isns_svr_t)) {
30947978SPeter.Dunlap@Sun.COM return (WALK_ERR);
30957978SPeter.Dunlap@Sun.COM }
30967978SPeter.Dunlap@Sun.COM
309711066Srafael.vanoni@sun.com if ((lbolt = (clock_t)mdb_get_lbolt()) == -1)
30987978SPeter.Dunlap@Sun.COM return (WALK_ERR);
30997978SPeter.Dunlap@Sun.COM
31007978SPeter.Dunlap@Sun.COM mdb_printf("iSNS server %p:\n", addr);
31017978SPeter.Dunlap@Sun.COM mdb_inc_indent(4);
31027978SPeter.Dunlap@Sun.COM ss = &server.svr_sa;
31037978SPeter.Dunlap@Sun.COM sa_to_str(ss, server_addr);
31047978SPeter.Dunlap@Sun.COM
31057978SPeter.Dunlap@Sun.COM mdb_printf("IP address ");
31067978SPeter.Dunlap@Sun.COM if (ss->ss_family == AF_INET) {
31077978SPeter.Dunlap@Sun.COM mdb_printf("(v4): %s\n", server_addr);
31087978SPeter.Dunlap@Sun.COM } else {
31097978SPeter.Dunlap@Sun.COM mdb_printf("(v6): %s\n", server_addr);
31107978SPeter.Dunlap@Sun.COM }
31117978SPeter.Dunlap@Sun.COM
311210505SPeter.Cudhea@Sun.COM mdb_printf("ESI Interval: %d seconds\n",
311310505SPeter.Cudhea@Sun.COM server.svr_esi_interval);
311410505SPeter.Cudhea@Sun.COM mdb_printf("Last message: %d seconds ago\n",
31157978SPeter.Dunlap@Sun.COM ((lbolt - server.svr_last_msg) / 100));
31167978SPeter.Dunlap@Sun.COM mdb_printf("Client registered: %s\n",
31177978SPeter.Dunlap@Sun.COM (server.svr_registered) ? "Yes" : "No");
311810505SPeter.Cudhea@Sun.COM mdb_printf("Retry Count: %d\n",
311910505SPeter.Cudhea@Sun.COM server.svr_retry_count);
312010505SPeter.Cudhea@Sun.COM mdb_printf("Targets Changes Pending: %s\n",
312110505SPeter.Cudhea@Sun.COM (server.svr_targets_changed) ? "Yes" : "No");
312210505SPeter.Cudhea@Sun.COM mdb_printf("Delete Pending: %s\n",
312310505SPeter.Cudhea@Sun.COM (server.svr_delete_needed) ? "Yes" : "No");
312410505SPeter.Cudhea@Sun.COM mdb_printf("Replace-All Needed: %s\n",
312510505SPeter.Cudhea@Sun.COM (server.svr_reset_needed) ? "Yes" : "No");
312610505SPeter.Cudhea@Sun.COM
312710505SPeter.Cudhea@Sun.COM if (idc->idc_verbose) {
312810505SPeter.Cudhea@Sun.COM idc->idc_header = 1;
312910505SPeter.Cudhea@Sun.COM idc->u.child.idc_tgt = 1;
313010505SPeter.Cudhea@Sun.COM
313110505SPeter.Cudhea@Sun.COM mdb_inc_indent(2);
313210505SPeter.Cudhea@Sun.COM avl_addr = addr + offsetof(iscsit_isns_svr_t,
313310505SPeter.Cudhea@Sun.COM svr_target_list);
313410505SPeter.Cudhea@Sun.COM if (mdb_pwalk("avl", iscsi_isns_targets_cb, idc,
313510505SPeter.Cudhea@Sun.COM avl_addr) == -1) {
313610505SPeter.Cudhea@Sun.COM mdb_warn("avl walk failed for svr_target_list");
313710505SPeter.Cudhea@Sun.COM return (WALK_ERR);
313810505SPeter.Cudhea@Sun.COM }
313910505SPeter.Cudhea@Sun.COM mdb_dec_indent(2);
314010505SPeter.Cudhea@Sun.COM }
314110505SPeter.Cudhea@Sun.COM
31427978SPeter.Dunlap@Sun.COM mdb_dec_indent(4);
31437978SPeter.Dunlap@Sun.COM
314410505SPeter.Cudhea@Sun.COM return (WALK_NEXT);
31457978SPeter.Dunlap@Sun.COM }
31467978SPeter.Dunlap@Sun.COM
31477978SPeter.Dunlap@Sun.COM static int
iscsi_isns_servers(iscsi_dcmd_ctrl_t * idc)31487978SPeter.Dunlap@Sun.COM iscsi_isns_servers(iscsi_dcmd_ctrl_t *idc)
31497978SPeter.Dunlap@Sun.COM {
31507978SPeter.Dunlap@Sun.COM uintptr_t iscsit_global_addr;
31517978SPeter.Dunlap@Sun.COM uintptr_t list_addr;
31527978SPeter.Dunlap@Sun.COM GElf_Sym sym;
31537978SPeter.Dunlap@Sun.COM
31547978SPeter.Dunlap@Sun.COM if (mdb_lookup_by_name("iscsit_global", &sym) == -1) {
31557978SPeter.Dunlap@Sun.COM mdb_warn("failed to find symbol 'iscsit_global'");
31567978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
31577978SPeter.Dunlap@Sun.COM }
31587978SPeter.Dunlap@Sun.COM
31597978SPeter.Dunlap@Sun.COM iscsit_global_addr = (uintptr_t)sym.st_value;
31607978SPeter.Dunlap@Sun.COM idc->idc_header = 1;
31617978SPeter.Dunlap@Sun.COM list_addr = iscsit_global_addr +
31627978SPeter.Dunlap@Sun.COM offsetof(iscsit_global_t, global_isns_cfg.isns_svrs);
31637978SPeter.Dunlap@Sun.COM
31647978SPeter.Dunlap@Sun.COM if (mdb_pwalk("list", iscsi_isns_servers_cb, idc, list_addr) == -1) {
31657978SPeter.Dunlap@Sun.COM mdb_warn("list walk failed for iSNS servers");
31667978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
31677978SPeter.Dunlap@Sun.COM }
31687978SPeter.Dunlap@Sun.COM
31697978SPeter.Dunlap@Sun.COM return (0);
31707978SPeter.Dunlap@Sun.COM }
31717978SPeter.Dunlap@Sun.COM
31727978SPeter.Dunlap@Sun.COM /* ARGSUSED */
31737978SPeter.Dunlap@Sun.COM static int
iscsi_isns(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)31747978SPeter.Dunlap@Sun.COM iscsi_isns(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
31757978SPeter.Dunlap@Sun.COM {
31767978SPeter.Dunlap@Sun.COM iscsi_dcmd_ctrl_t idc;
31777978SPeter.Dunlap@Sun.COM int portals = 0, esi = 0, targets = 0, verbose = 0, servers = 0;
3178*12114SPeter.Gill@Sun.COM int rc_audit = 0;
31797978SPeter.Dunlap@Sun.COM
31807978SPeter.Dunlap@Sun.COM if (flags & DCMD_ADDRSPEC) {
31817978SPeter.Dunlap@Sun.COM mdb_warn("iscsi_isns is only a global dcmd.");
31827978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
31837978SPeter.Dunlap@Sun.COM }
31847978SPeter.Dunlap@Sun.COM
31857978SPeter.Dunlap@Sun.COM bzero(&idc, sizeof (idc));
31867978SPeter.Dunlap@Sun.COM if (mdb_getopts(argc, argv,
31877978SPeter.Dunlap@Sun.COM 'e', MDB_OPT_SETBITS, TRUE, &esi,
31887978SPeter.Dunlap@Sun.COM 'p', MDB_OPT_SETBITS, TRUE, &portals,
31897978SPeter.Dunlap@Sun.COM 's', MDB_OPT_SETBITS, TRUE, &servers,
31907978SPeter.Dunlap@Sun.COM 't', MDB_OPT_SETBITS, TRUE, &targets,
31917978SPeter.Dunlap@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &verbose,
3192*12114SPeter.Gill@Sun.COM 'R', MDB_OPT_SETBITS, TRUE, &rc_audit,
31937978SPeter.Dunlap@Sun.COM NULL) != argc)
31947978SPeter.Dunlap@Sun.COM return (DCMD_USAGE);
31957978SPeter.Dunlap@Sun.COM
31967978SPeter.Dunlap@Sun.COM if ((esi + portals + targets + servers) > 1) {
31977978SPeter.Dunlap@Sun.COM mdb_printf("Only one of e, p, s, and t must be provided");
31987978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
31997978SPeter.Dunlap@Sun.COM }
32007978SPeter.Dunlap@Sun.COM
32017978SPeter.Dunlap@Sun.COM if ((esi | portals | targets | servers) == 0) {
32027978SPeter.Dunlap@Sun.COM mdb_printf("Exactly one of e, p, s, or t must be provided");
32037978SPeter.Dunlap@Sun.COM return (DCMD_ERR);
32047978SPeter.Dunlap@Sun.COM }
32057978SPeter.Dunlap@Sun.COM
32067978SPeter.Dunlap@Sun.COM idc.idc_verbose = verbose;
3207*12114SPeter.Gill@Sun.COM idc.u.child.idc_rc_audit = rc_audit;
32087978SPeter.Dunlap@Sun.COM
32097978SPeter.Dunlap@Sun.COM if (esi) {
32107978SPeter.Dunlap@Sun.COM return (iscsi_isns_esi(&idc));
32117978SPeter.Dunlap@Sun.COM }
32127978SPeter.Dunlap@Sun.COM
32137978SPeter.Dunlap@Sun.COM if (portals) {
32147978SPeter.Dunlap@Sun.COM return (iscsi_isns_portals(&idc));
32157978SPeter.Dunlap@Sun.COM }
32167978SPeter.Dunlap@Sun.COM
32177978SPeter.Dunlap@Sun.COM if (servers) {
32187978SPeter.Dunlap@Sun.COM return (iscsi_isns_servers(&idc));
32197978SPeter.Dunlap@Sun.COM }
32207978SPeter.Dunlap@Sun.COM
32217978SPeter.Dunlap@Sun.COM return (iscsi_isns_targets(&idc));
32227978SPeter.Dunlap@Sun.COM }
32237978SPeter.Dunlap@Sun.COM
3224*12114SPeter.Gill@Sun.COM static int
iscsi_ini_sess_walk_init(mdb_walk_state_t * wsp)3225*12114SPeter.Gill@Sun.COM iscsi_ini_sess_walk_init(mdb_walk_state_t *wsp) {
3226*12114SPeter.Gill@Sun.COM
3227*12114SPeter.Gill@Sun.COM
3228*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3229*12114SPeter.Gill@Sun.COM mdb_warn("<iscsi_sess_t addr>::walk iscsi_ini_sess");
3230*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3231*12114SPeter.Gill@Sun.COM }
3232*12114SPeter.Gill@Sun.COM
3233*12114SPeter.Gill@Sun.COM wsp->walk_data = mdb_alloc(sizeof (iscsi_sess_t), UM_SLEEP|UM_GC);
3234*12114SPeter.Gill@Sun.COM if (!wsp->walk_data) {
3235*12114SPeter.Gill@Sun.COM mdb_warn("iscsi_ini_sess walk failed");
3236*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3237*12114SPeter.Gill@Sun.COM }
3238*12114SPeter.Gill@Sun.COM
3239*12114SPeter.Gill@Sun.COM return (WALK_NEXT);
3240*12114SPeter.Gill@Sun.COM }
3241*12114SPeter.Gill@Sun.COM
3242*12114SPeter.Gill@Sun.COM static int
iscsi_ini_sess_step(mdb_walk_state_t * wsp)3243*12114SPeter.Gill@Sun.COM iscsi_ini_sess_step(mdb_walk_state_t *wsp) {
3244*12114SPeter.Gill@Sun.COM int status;
3245*12114SPeter.Gill@Sun.COM
3246*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3247*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3248*12114SPeter.Gill@Sun.COM }
3249*12114SPeter.Gill@Sun.COM
3250*12114SPeter.Gill@Sun.COM if (mdb_vread(wsp->walk_data, sizeof (iscsi_sess_t), wsp->walk_addr)
3251*12114SPeter.Gill@Sun.COM != sizeof (iscsi_sess_t)) {
3252*12114SPeter.Gill@Sun.COM mdb_warn("failed to read iscsi_sess_t at %p", wsp->walk_addr);
3253*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3254*12114SPeter.Gill@Sun.COM }
3255*12114SPeter.Gill@Sun.COM
3256*12114SPeter.Gill@Sun.COM status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
3257*12114SPeter.Gill@Sun.COM wsp->walk_cbdata);
3258*12114SPeter.Gill@Sun.COM
3259*12114SPeter.Gill@Sun.COM wsp->walk_addr =
3260*12114SPeter.Gill@Sun.COM (uintptr_t)(((iscsi_sess_t *)wsp->walk_data)->sess_next);
3261*12114SPeter.Gill@Sun.COM
3262*12114SPeter.Gill@Sun.COM return (status);
3263*12114SPeter.Gill@Sun.COM }
3264*12114SPeter.Gill@Sun.COM
3265*12114SPeter.Gill@Sun.COM static int
iscsi_ini_conn_walk_init(mdb_walk_state_t * wsp)3266*12114SPeter.Gill@Sun.COM iscsi_ini_conn_walk_init(mdb_walk_state_t *wsp) {
3267*12114SPeter.Gill@Sun.COM
3268*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3269*12114SPeter.Gill@Sun.COM mdb_warn("<iscsi_conn_t addr>::walk iscsi_ini_conn");
3270*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3271*12114SPeter.Gill@Sun.COM }
3272*12114SPeter.Gill@Sun.COM
3273*12114SPeter.Gill@Sun.COM wsp->walk_data = mdb_alloc(sizeof (iscsi_conn_t), UM_SLEEP|UM_GC);
3274*12114SPeter.Gill@Sun.COM if (!wsp->walk_data) {
3275*12114SPeter.Gill@Sun.COM mdb_warn("iscsi_ini_conn walk failed");
3276*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3277*12114SPeter.Gill@Sun.COM }
3278*12114SPeter.Gill@Sun.COM
3279*12114SPeter.Gill@Sun.COM return (WALK_NEXT);
3280*12114SPeter.Gill@Sun.COM }
3281*12114SPeter.Gill@Sun.COM
3282*12114SPeter.Gill@Sun.COM static int
iscsi_ini_conn_step(mdb_walk_state_t * wsp)3283*12114SPeter.Gill@Sun.COM iscsi_ini_conn_step(mdb_walk_state_t *wsp) {
3284*12114SPeter.Gill@Sun.COM int status;
3285*12114SPeter.Gill@Sun.COM
3286*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3287*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3288*12114SPeter.Gill@Sun.COM }
3289*12114SPeter.Gill@Sun.COM
3290*12114SPeter.Gill@Sun.COM if (mdb_vread(wsp->walk_data, sizeof (iscsi_conn_t), wsp->walk_addr)
3291*12114SPeter.Gill@Sun.COM != sizeof (iscsi_conn_t)) {
3292*12114SPeter.Gill@Sun.COM mdb_warn("failed to read iscsi_conn_t at %p", wsp->walk_addr);
3293*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3294*12114SPeter.Gill@Sun.COM }
3295*12114SPeter.Gill@Sun.COM
3296*12114SPeter.Gill@Sun.COM
3297*12114SPeter.Gill@Sun.COM status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
3298*12114SPeter.Gill@Sun.COM wsp->walk_cbdata);
3299*12114SPeter.Gill@Sun.COM
3300*12114SPeter.Gill@Sun.COM wsp->walk_addr =
3301*12114SPeter.Gill@Sun.COM (uintptr_t)(((iscsi_conn_t *)wsp->walk_data)->conn_next);
3302*12114SPeter.Gill@Sun.COM
3303*12114SPeter.Gill@Sun.COM return (status);
3304*12114SPeter.Gill@Sun.COM }
3305*12114SPeter.Gill@Sun.COM
3306*12114SPeter.Gill@Sun.COM static int
iscsi_ini_lun_walk_init(mdb_walk_state_t * wsp)3307*12114SPeter.Gill@Sun.COM iscsi_ini_lun_walk_init(mdb_walk_state_t *wsp) {
3308*12114SPeter.Gill@Sun.COM
3309*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3310*12114SPeter.Gill@Sun.COM mdb_warn("<iscsi_lun_t addr>::walk iscsi_ini_lun");
3311*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3312*12114SPeter.Gill@Sun.COM }
3313*12114SPeter.Gill@Sun.COM
3314*12114SPeter.Gill@Sun.COM wsp->walk_data = mdb_alloc(sizeof (iscsi_lun_t), UM_SLEEP|UM_GC);
3315*12114SPeter.Gill@Sun.COM if (!wsp->walk_data) {
3316*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3317*12114SPeter.Gill@Sun.COM }
3318*12114SPeter.Gill@Sun.COM
3319*12114SPeter.Gill@Sun.COM return (WALK_NEXT);
3320*12114SPeter.Gill@Sun.COM }
3321*12114SPeter.Gill@Sun.COM
3322*12114SPeter.Gill@Sun.COM static int
iscsi_ini_lun_step(mdb_walk_state_t * wsp)3323*12114SPeter.Gill@Sun.COM iscsi_ini_lun_step(mdb_walk_state_t *wsp) {
3324*12114SPeter.Gill@Sun.COM int status;
3325*12114SPeter.Gill@Sun.COM
3326*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3327*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3328*12114SPeter.Gill@Sun.COM }
3329*12114SPeter.Gill@Sun.COM
3330*12114SPeter.Gill@Sun.COM if (mdb_vread(wsp->walk_data, sizeof (iscsi_lun_t), wsp->walk_addr)
3331*12114SPeter.Gill@Sun.COM != sizeof (iscsi_lun_t)) {
3332*12114SPeter.Gill@Sun.COM mdb_warn("failed to read iscsi_lun_t at %p", wsp->walk_addr);
3333*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3334*12114SPeter.Gill@Sun.COM }
3335*12114SPeter.Gill@Sun.COM
3336*12114SPeter.Gill@Sun.COM status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
3337*12114SPeter.Gill@Sun.COM wsp->walk_cbdata);
3338*12114SPeter.Gill@Sun.COM
3339*12114SPeter.Gill@Sun.COM wsp->walk_addr =
3340*12114SPeter.Gill@Sun.COM (uintptr_t)(((iscsi_lun_t *)wsp->walk_data)->lun_next);
3341*12114SPeter.Gill@Sun.COM
3342*12114SPeter.Gill@Sun.COM return (status);
3343*12114SPeter.Gill@Sun.COM }
3344*12114SPeter.Gill@Sun.COM
3345*12114SPeter.Gill@Sun.COM static int
iscsi_ini_cmd_walk_init(mdb_walk_state_t * wsp)3346*12114SPeter.Gill@Sun.COM iscsi_ini_cmd_walk_init(mdb_walk_state_t *wsp) {
3347*12114SPeter.Gill@Sun.COM
3348*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3349*12114SPeter.Gill@Sun.COM mdb_warn("<iscsi_cmd_t addr>::walk iscsi_ini_cmd");
3350*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3351*12114SPeter.Gill@Sun.COM }
3352*12114SPeter.Gill@Sun.COM
3353*12114SPeter.Gill@Sun.COM wsp->walk_data = mdb_alloc(sizeof (iscsi_cmd_t), UM_SLEEP|UM_GC);
3354*12114SPeter.Gill@Sun.COM if (!wsp->walk_data) {
3355*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3356*12114SPeter.Gill@Sun.COM }
3357*12114SPeter.Gill@Sun.COM
3358*12114SPeter.Gill@Sun.COM return (WALK_NEXT);
3359*12114SPeter.Gill@Sun.COM }
3360*12114SPeter.Gill@Sun.COM
3361*12114SPeter.Gill@Sun.COM static int
iscsi_ini_cmd_step(mdb_walk_state_t * wsp)3362*12114SPeter.Gill@Sun.COM iscsi_ini_cmd_step(mdb_walk_state_t *wsp) {
3363*12114SPeter.Gill@Sun.COM int status;
3364*12114SPeter.Gill@Sun.COM
3365*12114SPeter.Gill@Sun.COM if (wsp->walk_addr == NULL) {
3366*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3367*12114SPeter.Gill@Sun.COM }
3368*12114SPeter.Gill@Sun.COM
3369*12114SPeter.Gill@Sun.COM if (mdb_vread(wsp->walk_data, sizeof (iscsi_cmd_t), wsp->walk_addr)
3370*12114SPeter.Gill@Sun.COM != sizeof (iscsi_cmd_t)) {
3371*12114SPeter.Gill@Sun.COM mdb_warn("failed to read iscsi_cmd_t at %p", wsp->walk_addr);
3372*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3373*12114SPeter.Gill@Sun.COM }
3374*12114SPeter.Gill@Sun.COM
3375*12114SPeter.Gill@Sun.COM status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
3376*12114SPeter.Gill@Sun.COM wsp->walk_cbdata);
3377*12114SPeter.Gill@Sun.COM
3378*12114SPeter.Gill@Sun.COM wsp->walk_addr =
3379*12114SPeter.Gill@Sun.COM (uintptr_t)(((iscsi_cmd_t *)wsp->walk_data)->cmd_next);
3380*12114SPeter.Gill@Sun.COM
3381*12114SPeter.Gill@Sun.COM return (status);
3382*12114SPeter.Gill@Sun.COM }
3383*12114SPeter.Gill@Sun.COM
3384*12114SPeter.Gill@Sun.COM static int
iscsi_ini_cmd_walk_cb(uintptr_t addr,const void * vcmd,void * vidc)3385*12114SPeter.Gill@Sun.COM iscsi_ini_cmd_walk_cb(uintptr_t addr, const void *vcmd,
3386*12114SPeter.Gill@Sun.COM void *vidc) {
3387*12114SPeter.Gill@Sun.COM
3388*12114SPeter.Gill@Sun.COM const iscsi_cmd_t *cmd = vcmd;
3389*12114SPeter.Gill@Sun.COM iscsi_dcmd_ctrl_t *idc = vidc;
3390*12114SPeter.Gill@Sun.COM int rc;
3391*12114SPeter.Gill@Sun.COM
3392*12114SPeter.Gill@Sun.COM if (cmd == NULL) {
3393*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed. Null cmd");
3394*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3395*12114SPeter.Gill@Sun.COM }
3396*12114SPeter.Gill@Sun.COM
3397*12114SPeter.Gill@Sun.COM rc = iscsi_print_ini_cmd(addr, cmd, idc);
3398*12114SPeter.Gill@Sun.COM
3399*12114SPeter.Gill@Sun.COM return ((rc == DCMD_OK) ? WALK_NEXT : WALK_ERR);
3400*12114SPeter.Gill@Sun.COM }
3401*12114SPeter.Gill@Sun.COM
3402*12114SPeter.Gill@Sun.COM static int
iscsi_ini_hba_walk_init(mdb_walk_state_t * wsp)3403*12114SPeter.Gill@Sun.COM iscsi_ini_hba_walk_init(mdb_walk_state_t *wsp) {
3404*12114SPeter.Gill@Sun.COM uintptr_t state_addr, array_addr;
3405*12114SPeter.Gill@Sun.COM int array_size;
3406*12114SPeter.Gill@Sun.COM struct i_ddi_soft_state *ss;
3407*12114SPeter.Gill@Sun.COM idm_hba_walk_info_t *hwi;
3408*12114SPeter.Gill@Sun.COM
3409*12114SPeter.Gill@Sun.COM
3410*12114SPeter.Gill@Sun.COM hwi = (idm_hba_walk_info_t *)mdb_zalloc(
3411*12114SPeter.Gill@Sun.COM sizeof (idm_hba_walk_info_t), UM_SLEEP|UM_GC);
3412*12114SPeter.Gill@Sun.COM
3413*12114SPeter.Gill@Sun.COM if (!hwi) {
3414*12114SPeter.Gill@Sun.COM mdb_warn("unable to allocate storage for iscsi_ini_hba walk");
3415*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3416*12114SPeter.Gill@Sun.COM }
3417*12114SPeter.Gill@Sun.COM
3418*12114SPeter.Gill@Sun.COM if (wsp->walk_addr != NULL) {
3419*12114SPeter.Gill@Sun.COM mdb_warn("iscsi_ini_hba only supports global walk");
3420*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3421*12114SPeter.Gill@Sun.COM } else {
3422*12114SPeter.Gill@Sun.COM
3423*12114SPeter.Gill@Sun.COM /*
3424*12114SPeter.Gill@Sun.COM * Read in the array and setup the walk struct.
3425*12114SPeter.Gill@Sun.COM */
3426*12114SPeter.Gill@Sun.COM if (mdb_readvar(&state_addr, "iscsi_state") == -1) {
3427*12114SPeter.Gill@Sun.COM mdb_warn("state variable iscsi_state not found.\n");
3428*12114SPeter.Gill@Sun.COM mdb_warn("Is the driver loaded ?\n");
3429*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3430*12114SPeter.Gill@Sun.COM }
3431*12114SPeter.Gill@Sun.COM
3432*12114SPeter.Gill@Sun.COM ss = (struct i_ddi_soft_state *)mdb_alloc(sizeof (*ss),
3433*12114SPeter.Gill@Sun.COM UM_SLEEP|UM_GC);
3434*12114SPeter.Gill@Sun.COM if (mdb_vread(ss, sizeof (*ss), state_addr) != sizeof (*ss)) {
3435*12114SPeter.Gill@Sun.COM mdb_warn("Cannot read softstate struct "
3436*12114SPeter.Gill@Sun.COM "(Invalid pointer?).\n");
3437*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3438*12114SPeter.Gill@Sun.COM }
3439*12114SPeter.Gill@Sun.COM
3440*12114SPeter.Gill@Sun.COM /* Where to get the data */
3441*12114SPeter.Gill@Sun.COM array_size = ss->n_items * (sizeof (void *));
3442*12114SPeter.Gill@Sun.COM array_addr = (uintptr_t)ss->array;
3443*12114SPeter.Gill@Sun.COM
3444*12114SPeter.Gill@Sun.COM /* Where to put the data */
3445*12114SPeter.Gill@Sun.COM hwi->n_elements = ss->n_items;
3446*12114SPeter.Gill@Sun.COM hwi->array = mdb_alloc(array_size, UM_SLEEP|UM_GC);
3447*12114SPeter.Gill@Sun.COM if (!hwi->array) {
3448*12114SPeter.Gill@Sun.COM mdb_warn("list walk failed");
3449*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3450*12114SPeter.Gill@Sun.COM }
3451*12114SPeter.Gill@Sun.COM if (mdb_vread(hwi->array, array_size, array_addr) !=
3452*12114SPeter.Gill@Sun.COM array_size) {
3453*12114SPeter.Gill@Sun.COM mdb_warn("Corrupted softstate struct.\n");
3454*12114SPeter.Gill@Sun.COM return (WALK_ERR);
3455*12114SPeter.Gill@Sun.COM }
3456*12114SPeter.Gill@Sun.COM hwi->cur_element = 0;
3457*12114SPeter.Gill@Sun.COM wsp->walk_data = hwi;
3458*12114SPeter.Gill@Sun.COM }
3459*12114SPeter.Gill@Sun.COM
3460*12114SPeter.Gill@Sun.COM return (WALK_NEXT);
3461*12114SPeter.Gill@Sun.COM }
3462*12114SPeter.Gill@Sun.COM
3463*12114SPeter.Gill@Sun.COM static int
iscsi_ini_hba_step(mdb_walk_state_t * wsp)3464*12114SPeter.Gill@Sun.COM iscsi_ini_hba_step(mdb_walk_state_t *wsp) {
3465*12114SPeter.Gill@Sun.COM int status;
3466*12114SPeter.Gill@Sun.COM idm_hba_walk_info_t *hwi = (idm_hba_walk_info_t *)wsp->walk_data;
3467*12114SPeter.Gill@Sun.COM
3468*12114SPeter.Gill@Sun.COM for (; hwi->cur_element < hwi->n_elements; hwi->cur_element++) {
3469*12114SPeter.Gill@Sun.COM if (hwi->array[hwi->cur_element] != NULL) {
3470*12114SPeter.Gill@Sun.COM break;
3471*12114SPeter.Gill@Sun.COM }
3472*12114SPeter.Gill@Sun.COM }
3473*12114SPeter.Gill@Sun.COM if (hwi->cur_element >= hwi->n_elements) {
3474*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3475*12114SPeter.Gill@Sun.COM }
3476*12114SPeter.Gill@Sun.COM
3477*12114SPeter.Gill@Sun.COM hwi->data = (iscsi_hba_t *)mdb_alloc(sizeof (iscsi_hba_t),
3478*12114SPeter.Gill@Sun.COM UM_SLEEP|UM_GC);
3479*12114SPeter.Gill@Sun.COM if (mdb_vread(hwi->data, sizeof (iscsi_hba_t),
3480*12114SPeter.Gill@Sun.COM (uintptr_t)hwi->array[hwi->cur_element]) != sizeof (iscsi_hba_t)) {
3481*12114SPeter.Gill@Sun.COM mdb_warn("failed to read iscsi_sess_t at %p", wsp->walk_addr);
3482*12114SPeter.Gill@Sun.COM return (WALK_DONE);
3483*12114SPeter.Gill@Sun.COM }
3484*12114SPeter.Gill@Sun.COM
3485*12114SPeter.Gill@Sun.COM
3486*12114SPeter.Gill@Sun.COM status = wsp->walk_callback((uintptr_t)hwi->array[hwi->cur_element],
3487*12114SPeter.Gill@Sun.COM hwi->data, wsp->walk_cbdata);
3488*12114SPeter.Gill@Sun.COM
3489*12114SPeter.Gill@Sun.COM /* Increment cur_element for next iteration */
3490*12114SPeter.Gill@Sun.COM hwi->cur_element++;
3491*12114SPeter.Gill@Sun.COM
3492*12114SPeter.Gill@Sun.COM return (status);
3493*12114SPeter.Gill@Sun.COM }
3494*12114SPeter.Gill@Sun.COM
34957978SPeter.Dunlap@Sun.COM /*
34969162SPeter.Dunlap@Sun.COM * iscsi_inet_ntop -- Convert an IPv4 or IPv6 address in binary form into
34977978SPeter.Dunlap@Sun.COM * printable form, and return a pointer to that string. Caller should
34987978SPeter.Dunlap@Sun.COM * provide a buffer of correct length to store string into.
34997978SPeter.Dunlap@Sun.COM * Note: this routine is kernel version of inet_ntop. It has similar
35009162SPeter.Dunlap@Sun.COM * format as iscsi_inet_ntop() defined in rfc2553. But it does not do
35017978SPeter.Dunlap@Sun.COM * error handling operations exactly as rfc2553 defines. This function
35027978SPeter.Dunlap@Sun.COM * is used by kernel inet directory routines only for debugging.
35039162SPeter.Dunlap@Sun.COM * This iscsi_inet_ntop() function, does not return NULL if third argument
35047978SPeter.Dunlap@Sun.COM * is NULL. The reason is simple that we don't want kernel to panic
35057978SPeter.Dunlap@Sun.COM * as the output of this function is directly fed to ip<n>dbg macro.
35067978SPeter.Dunlap@Sun.COM * Instead it uses a local buffer for destination address for
35077978SPeter.Dunlap@Sun.COM * those calls which purposely pass NULL ptr for the destination
35087978SPeter.Dunlap@Sun.COM * buffer. This function is thread-safe when the caller passes a non-
35097978SPeter.Dunlap@Sun.COM * null buffer with the third argument.
35107978SPeter.Dunlap@Sun.COM */
35117978SPeter.Dunlap@Sun.COM /* ARGSUSED */
35127978SPeter.Dunlap@Sun.COM
35137978SPeter.Dunlap@Sun.COM #define OK_16PTR(p) (!((uintptr_t)(p) & 0x1))
35147978SPeter.Dunlap@Sun.COM #if defined(__x86)
35157978SPeter.Dunlap@Sun.COM #define OK_32PTR(p) OK_16PTR(p)
35167978SPeter.Dunlap@Sun.COM #else
35177978SPeter.Dunlap@Sun.COM #define OK_32PTR(p) (!((uintptr_t)(p) & 0x3))
35187978SPeter.Dunlap@Sun.COM #endif
35197978SPeter.Dunlap@Sun.COM
35207978SPeter.Dunlap@Sun.COM char *
iscsi_inet_ntop(int af,const void * addr,char * buf,int addrlen)35219162SPeter.Dunlap@Sun.COM iscsi_inet_ntop(int af, const void *addr, char *buf, int addrlen)
35227978SPeter.Dunlap@Sun.COM {
35237978SPeter.Dunlap@Sun.COM static char local_buf[PORTAL_STR_LEN];
35247978SPeter.Dunlap@Sun.COM static char *err_buf1 = "<badaddr>";
35257978SPeter.Dunlap@Sun.COM static char *err_buf2 = "<badfamily>";
35267978SPeter.Dunlap@Sun.COM in6_addr_t *v6addr;
35277978SPeter.Dunlap@Sun.COM uchar_t *v4addr;
35287978SPeter.Dunlap@Sun.COM char *caddr;
35297978SPeter.Dunlap@Sun.COM
35307978SPeter.Dunlap@Sun.COM /*
35319162SPeter.Dunlap@Sun.COM * We don't allow thread unsafe iscsi_inet_ntop calls, they
35327978SPeter.Dunlap@Sun.COM * must pass a non-null buffer pointer. For DEBUG mode
35337978SPeter.Dunlap@Sun.COM * we use the ASSERT() and for non-debug kernel it will
35347978SPeter.Dunlap@Sun.COM * silently allow it for now. Someday we should remove
35357978SPeter.Dunlap@Sun.COM * the static buffer from this function.
35367978SPeter.Dunlap@Sun.COM */
35377978SPeter.Dunlap@Sun.COM
35387978SPeter.Dunlap@Sun.COM ASSERT(buf != NULL);
35397978SPeter.Dunlap@Sun.COM if (buf == NULL)
35407978SPeter.Dunlap@Sun.COM buf = local_buf;
35417978SPeter.Dunlap@Sun.COM buf[0] = '\0';
35427978SPeter.Dunlap@Sun.COM
35437978SPeter.Dunlap@Sun.COM /* Let user know politely not to send NULL or unaligned addr */
35447978SPeter.Dunlap@Sun.COM if (addr == NULL || !(OK_32PTR(addr))) {
35457978SPeter.Dunlap@Sun.COM return (err_buf1);
35467978SPeter.Dunlap@Sun.COM }
35477978SPeter.Dunlap@Sun.COM
35487978SPeter.Dunlap@Sun.COM
35497978SPeter.Dunlap@Sun.COM #define UC(b) (((int)b) & 0xff)
35507978SPeter.Dunlap@Sun.COM switch (af) {
35517978SPeter.Dunlap@Sun.COM case AF_INET:
35527978SPeter.Dunlap@Sun.COM ASSERT(addrlen >= INET_ADDRSTRLEN);
35537978SPeter.Dunlap@Sun.COM v4addr = (uchar_t *)addr;
35547978SPeter.Dunlap@Sun.COM (void) mdb_snprintf(buf, INET6_ADDRSTRLEN,
35557978SPeter.Dunlap@Sun.COM "%03d.%03d.%03d.%03d",
35567978SPeter.Dunlap@Sun.COM UC(v4addr[0]), UC(v4addr[1]), UC(v4addr[2]), UC(v4addr[3]));
35577978SPeter.Dunlap@Sun.COM return (buf);
35587978SPeter.Dunlap@Sun.COM
35597978SPeter.Dunlap@Sun.COM case AF_INET6:
35607978SPeter.Dunlap@Sun.COM ASSERT(addrlen >= INET6_ADDRSTRLEN);
35617978SPeter.Dunlap@Sun.COM v6addr = (in6_addr_t *)addr;
35627978SPeter.Dunlap@Sun.COM if (IN6_IS_ADDR_V4MAPPED(v6addr)) {
35637978SPeter.Dunlap@Sun.COM caddr = (char *)addr;
35647978SPeter.Dunlap@Sun.COM (void) mdb_snprintf(buf, INET6_ADDRSTRLEN,
35657978SPeter.Dunlap@Sun.COM "::ffff:%d.%d.%d.%d",
35667978SPeter.Dunlap@Sun.COM UC(caddr[12]), UC(caddr[13]),
35677978SPeter.Dunlap@Sun.COM UC(caddr[14]), UC(caddr[15]));
35687978SPeter.Dunlap@Sun.COM } else if (IN6_IS_ADDR_V4COMPAT(v6addr)) {
35697978SPeter.Dunlap@Sun.COM caddr = (char *)addr;
35707978SPeter.Dunlap@Sun.COM (void) mdb_snprintf(buf, INET6_ADDRSTRLEN,
35717978SPeter.Dunlap@Sun.COM "::%d.%d.%d.%d",
35727978SPeter.Dunlap@Sun.COM UC(caddr[12]), UC(caddr[13]), UC(caddr[14]),
35737978SPeter.Dunlap@Sun.COM UC(caddr[15]));
35747978SPeter.Dunlap@Sun.COM } else if (IN6_IS_ADDR_UNSPECIFIED(v6addr)) {
35757978SPeter.Dunlap@Sun.COM (void) mdb_snprintf(buf, INET6_ADDRSTRLEN, "::");
35767978SPeter.Dunlap@Sun.COM } else {
35777978SPeter.Dunlap@Sun.COM convert2ascii(buf, v6addr);
35787978SPeter.Dunlap@Sun.COM }
35797978SPeter.Dunlap@Sun.COM return (buf);
35807978SPeter.Dunlap@Sun.COM
35817978SPeter.Dunlap@Sun.COM default:
35827978SPeter.Dunlap@Sun.COM return (err_buf2);
35837978SPeter.Dunlap@Sun.COM }
35847978SPeter.Dunlap@Sun.COM #undef UC
35857978SPeter.Dunlap@Sun.COM }
35867978SPeter.Dunlap@Sun.COM
35877978SPeter.Dunlap@Sun.COM /*
35887978SPeter.Dunlap@Sun.COM *
35897978SPeter.Dunlap@Sun.COM * v6 formats supported
35907978SPeter.Dunlap@Sun.COM * General format xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
35917978SPeter.Dunlap@Sun.COM * The short hand notation :: is used for COMPAT addr
35927978SPeter.Dunlap@Sun.COM * Other forms : fe80::xxxx:xxxx:xxxx:xxxx
35937978SPeter.Dunlap@Sun.COM */
35947978SPeter.Dunlap@Sun.COM static void
convert2ascii(char * buf,const in6_addr_t * addr)35957978SPeter.Dunlap@Sun.COM convert2ascii(char *buf, const in6_addr_t *addr)
35967978SPeter.Dunlap@Sun.COM {
35977978SPeter.Dunlap@Sun.COM int hexdigits;
35987978SPeter.Dunlap@Sun.COM int head_zero = 0;
35997978SPeter.Dunlap@Sun.COM int tail_zero = 0;
36007978SPeter.Dunlap@Sun.COM /* tempbuf must be big enough to hold ffff:\0 */
36017978SPeter.Dunlap@Sun.COM char tempbuf[6];
36027978SPeter.Dunlap@Sun.COM char *ptr;
36037978SPeter.Dunlap@Sun.COM uint16_t out_addr_component;
36047978SPeter.Dunlap@Sun.COM uint16_t *addr_component;
36057978SPeter.Dunlap@Sun.COM size_t len;
36067978SPeter.Dunlap@Sun.COM boolean_t first = B_FALSE;
36077978SPeter.Dunlap@Sun.COM boolean_t med_zero = B_FALSE;
36087978SPeter.Dunlap@Sun.COM boolean_t end_zero = B_FALSE;
36097978SPeter.Dunlap@Sun.COM
36107978SPeter.Dunlap@Sun.COM addr_component = (uint16_t *)addr;
36117978SPeter.Dunlap@Sun.COM ptr = buf;
36127978SPeter.Dunlap@Sun.COM
36137978SPeter.Dunlap@Sun.COM /* First count if trailing zeroes higher in number */
36147978SPeter.Dunlap@Sun.COM for (hexdigits = 0; hexdigits < 8; hexdigits++) {
36157978SPeter.Dunlap@Sun.COM if (*addr_component == 0) {
36167978SPeter.Dunlap@Sun.COM if (hexdigits < 4)
36177978SPeter.Dunlap@Sun.COM head_zero++;
36187978SPeter.Dunlap@Sun.COM else
36197978SPeter.Dunlap@Sun.COM tail_zero++;
36207978SPeter.Dunlap@Sun.COM }
36217978SPeter.Dunlap@Sun.COM addr_component++;
36227978SPeter.Dunlap@Sun.COM }
36237978SPeter.Dunlap@Sun.COM addr_component = (uint16_t *)addr;
36247978SPeter.Dunlap@Sun.COM if (tail_zero > head_zero && (head_zero + tail_zero) != 7)
36257978SPeter.Dunlap@Sun.COM end_zero = B_TRUE;
36267978SPeter.Dunlap@Sun.COM
36277978SPeter.Dunlap@Sun.COM for (hexdigits = 0; hexdigits < 8; hexdigits++) {
36287978SPeter.Dunlap@Sun.COM
36297978SPeter.Dunlap@Sun.COM /* if entry is a 0 */
36307978SPeter.Dunlap@Sun.COM
36317978SPeter.Dunlap@Sun.COM if (*addr_component == 0) {
36327978SPeter.Dunlap@Sun.COM if (!first && *(addr_component + 1) == 0) {
36337978SPeter.Dunlap@Sun.COM if (end_zero && (hexdigits < 4)) {
36347978SPeter.Dunlap@Sun.COM *ptr++ = '0';
36357978SPeter.Dunlap@Sun.COM *ptr++ = ':';
36367978SPeter.Dunlap@Sun.COM } else {
36377978SPeter.Dunlap@Sun.COM /*
36387978SPeter.Dunlap@Sun.COM * address starts with 0s ..
36397978SPeter.Dunlap@Sun.COM * stick in leading ':' of pair
36407978SPeter.Dunlap@Sun.COM */
36417978SPeter.Dunlap@Sun.COM if (hexdigits == 0)
36427978SPeter.Dunlap@Sun.COM *ptr++ = ':';
36437978SPeter.Dunlap@Sun.COM /* add another */
36447978SPeter.Dunlap@Sun.COM *ptr++ = ':';
36457978SPeter.Dunlap@Sun.COM first = B_TRUE;
36467978SPeter.Dunlap@Sun.COM med_zero = B_TRUE;
36477978SPeter.Dunlap@Sun.COM }
36487978SPeter.Dunlap@Sun.COM } else if (first && med_zero) {
36497978SPeter.Dunlap@Sun.COM if (hexdigits == 7)
36507978SPeter.Dunlap@Sun.COM *ptr++ = ':';
36517978SPeter.Dunlap@Sun.COM addr_component++;
36527978SPeter.Dunlap@Sun.COM continue;
36537978SPeter.Dunlap@Sun.COM } else {
36547978SPeter.Dunlap@Sun.COM *ptr++ = '0';
36557978SPeter.Dunlap@Sun.COM *ptr++ = ':';
36567978SPeter.Dunlap@Sun.COM }
36577978SPeter.Dunlap@Sun.COM addr_component++;
36587978SPeter.Dunlap@Sun.COM continue;
36597978SPeter.Dunlap@Sun.COM }
36607978SPeter.Dunlap@Sun.COM if (med_zero)
36617978SPeter.Dunlap@Sun.COM med_zero = B_FALSE;
36627978SPeter.Dunlap@Sun.COM
36637978SPeter.Dunlap@Sun.COM tempbuf[0] = '\0';
36647978SPeter.Dunlap@Sun.COM mdb_nhconvert(&out_addr_component, addr_component,
36657978SPeter.Dunlap@Sun.COM sizeof (uint16_t));
36667978SPeter.Dunlap@Sun.COM (void) mdb_snprintf(tempbuf, 6, "%x:", out_addr_component);
36677978SPeter.Dunlap@Sun.COM len = strlen(tempbuf);
36687978SPeter.Dunlap@Sun.COM bcopy(tempbuf, ptr, len);
36697978SPeter.Dunlap@Sun.COM ptr = ptr + len;
36707978SPeter.Dunlap@Sun.COM addr_component++;
36717978SPeter.Dunlap@Sun.COM }
36727978SPeter.Dunlap@Sun.COM *--ptr = '\0';
36737978SPeter.Dunlap@Sun.COM }
36747978SPeter.Dunlap@Sun.COM
36757978SPeter.Dunlap@Sun.COM /*
36767978SPeter.Dunlap@Sun.COM * MDB module linkage information:
36777978SPeter.Dunlap@Sun.COM *
36787978SPeter.Dunlap@Sun.COM * We declare a list of structures describing our dcmds, a list of structures
36797978SPeter.Dunlap@Sun.COM * describing our walkers and a function named _mdb_init to return a pointer
36807978SPeter.Dunlap@Sun.COM * to our module information.
36817978SPeter.Dunlap@Sun.COM */
36827978SPeter.Dunlap@Sun.COM static const mdb_dcmd_t dcmds[] = {
3683*12114SPeter.Gill@Sun.COM { "iscsi_tgt", "[-agscptbSRv]",
36847978SPeter.Dunlap@Sun.COM "iSCSI target information", iscsi_tgt },
3685*12114SPeter.Gill@Sun.COM { "iscsi_tpgt", "[-R]",
3686*12114SPeter.Gill@Sun.COM "iSCSI target portal group tag information", iscsi_tpgt },
3687*12114SPeter.Gill@Sun.COM { "iscsi_tpg", "[-R]",
36887978SPeter.Dunlap@Sun.COM "iSCSI target portal group information", iscsi_tpg },
3689*12114SPeter.Gill@Sun.COM { "iscsi_sess", "[-ablmtvcSRIT]",
36907978SPeter.Dunlap@Sun.COM "iSCSI session information", iscsi_sess },
3691*12114SPeter.Gill@Sun.COM { "iscsi_conn", "[-abmtvSRIT]",
36927978SPeter.Dunlap@Sun.COM "iSCSI connection information", iscsi_conn },
36937978SPeter.Dunlap@Sun.COM { "iscsi_task", "[-bSRv]",
36947978SPeter.Dunlap@Sun.COM "iSCSI task information", iscsi_task },
36957978SPeter.Dunlap@Sun.COM { "iscsi_refcnt", "",
3696*12114SPeter.Gill@Sun.COM "print audit informtion for idm_refcnt_t", iscsi_refcnt },
36977978SPeter.Dunlap@Sun.COM { "iscsi_states", "",
3698*12114SPeter.Gill@Sun.COM "dump events and state transitions recorded in an\t"
36997978SPeter.Dunlap@Sun.COM "\t\tidm_sm_audit_t structure", iscsi_states },
3700*12114SPeter.Gill@Sun.COM { "iscsi_isns", "[-epstvR]",
3701*12114SPeter.Gill@Sun.COM "print iscsit iSNS information", iscsi_isns, iscsi_isns_help },
3702*12114SPeter.Gill@Sun.COM { "iscsi_svc", "[-vR]",
3703*12114SPeter.Gill@Sun.COM "iSCSI service information", iscsi_svc },
3704*12114SPeter.Gill@Sun.COM { "iscsi_portal", "[-R]",
3705*12114SPeter.Gill@Sun.COM "iSCSI portal information", iscsi_portal },
3706*12114SPeter.Gill@Sun.COM { "iscsi_cmd", "[-S]",
3707*12114SPeter.Gill@Sun.COM "iSCSI command information (initiator only)", iscsi_cmd },
37087978SPeter.Dunlap@Sun.COM { NULL }
37097978SPeter.Dunlap@Sun.COM };
37107978SPeter.Dunlap@Sun.COM
37117978SPeter.Dunlap@Sun.COM /*
3712*12114SPeter.Gill@Sun.COM * Basic walkers for the initiator linked lists
37137978SPeter.Dunlap@Sun.COM */
3714*12114SPeter.Gill@Sun.COM static const mdb_walker_t walkers[] = {
3715*12114SPeter.Gill@Sun.COM { "iscsi_ini_hba", "global walk of the initiator iscsi_hba_t "
3716*12114SPeter.Gill@Sun.COM "list", iscsi_ini_hba_walk_init, iscsi_ini_hba_step, NULL},
3717*12114SPeter.Gill@Sun.COM { "iscsi_ini_sess", "walk list of initiator iscsi_sess_t structures",
3718*12114SPeter.Gill@Sun.COM iscsi_ini_sess_walk_init, iscsi_ini_sess_step, NULL },
3719*12114SPeter.Gill@Sun.COM { "iscsi_ini_conn", "walk list of initiator iscsi_conn_t structures",
3720*12114SPeter.Gill@Sun.COM iscsi_ini_conn_walk_init, iscsi_ini_conn_step, NULL },
3721*12114SPeter.Gill@Sun.COM { "iscsi_ini_lun", "walk list of initiator iscsi_lun_t structures",
3722*12114SPeter.Gill@Sun.COM iscsi_ini_lun_walk_init, iscsi_ini_lun_step, NULL },
3723*12114SPeter.Gill@Sun.COM { "iscsi_ini_cmd", "walk list of initiator iscsi_cmd_t structures",
3724*12114SPeter.Gill@Sun.COM iscsi_ini_cmd_walk_init, iscsi_ini_cmd_step, NULL },
3725*12114SPeter.Gill@Sun.COM { NULL }
3726*12114SPeter.Gill@Sun.COM };
37277978SPeter.Dunlap@Sun.COM
37287978SPeter.Dunlap@Sun.COM static const mdb_modinfo_t modinfo = {
3729*12114SPeter.Gill@Sun.COM MDB_API_VERSION, dcmds, walkers
37307978SPeter.Dunlap@Sun.COM };
37317978SPeter.Dunlap@Sun.COM
37327978SPeter.Dunlap@Sun.COM const mdb_modinfo_t *
_mdb_init(void)37337978SPeter.Dunlap@Sun.COM _mdb_init(void)
37347978SPeter.Dunlap@Sun.COM {
37357978SPeter.Dunlap@Sun.COM return (&modinfo);
37367978SPeter.Dunlap@Sun.COM }
3737