xref: /onnv-gate/usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c (revision 13138:89c014c50a5f)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
2212508Samw@Sun.COM  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
235331Samw  */
245331Samw 
2512508Samw@Sun.COM #include <mdb/mdb_modapi.h>
2612508Samw@Sun.COM #include <mdb/mdb_ks.h>
279021Samw@Sun.COM #include <sys/thread.h>
289021Samw@Sun.COM #include <sys/taskq_impl.h>
295331Samw #include <smbsrv/smb_vops.h>
305331Samw #include <smbsrv/smb.h>
316139Sjb150015 #include <smbsrv/smb_ktypes.h>
325331Samw 
336432Sas200622 #define	SMB_DCMD_INDENT		2
346432Sas200622 #define	ACE_TYPE_TABLEN		(ACE_ALL_TYPES + 1)
356432Sas200622 #define	ACE_TYPE_ENTRY(_v_)	{_v_, #_v_}
366432Sas200622 #define	SMB_COM_ENTRY(_v_, _x_)	{#_v_, _x_}
376432Sas200622 
3812508Samw@Sun.COM #define	SMB_MDB_MAX_OPTS	9
396432Sas200622 
406432Sas200622 #define	SMB_OPT_SERVER		0x00000001
4112508Samw@Sun.COM #define	SMB_OPT_SESSION		0x00000002
4212508Samw@Sun.COM #define	SMB_OPT_REQUEST		0x00000004
4312508Samw@Sun.COM #define	SMB_OPT_USER		0x00000008
4412508Samw@Sun.COM #define	SMB_OPT_TREE		0x00000010
4512508Samw@Sun.COM #define	SMB_OPT_OFILE		0x00000020
4612508Samw@Sun.COM #define	SMB_OPT_ODIR		0x00000040
476432Sas200622 #define	SMB_OPT_WALK		0x00000100
486432Sas200622 #define	SMB_OPT_VERBOSE		0x00000200
496432Sas200622 #define	SMB_OPT_ALL_OBJ		0x000000FF
505331Samw 
516432Sas200622 /*
526432Sas200622  * Structure associating an ACE type to a string.
536432Sas200622  */
546432Sas200622 typedef struct {
556432Sas200622 	uint8_t		ace_type_value;
566432Sas200622 	const char	*ace_type_sting;
576432Sas200622 } ace_type_entry_t;
586432Sas200622 
596432Sas200622 /*
606432Sas200622  * Structure containing strings describing an SMB command.
616432Sas200622  */
626432Sas200622 typedef struct {
636432Sas200622 	const char	*smb_com;
646432Sas200622 	const char	*smb_andx;
656432Sas200622 } smb_com_entry_t;
666432Sas200622 
676432Sas200622 /*
686432Sas200622  * Structure describing an object to be expanded (displayed).
696432Sas200622  */
706432Sas200622 typedef struct {
716432Sas200622 	uint_t		ex_mask;
726432Sas200622 	size_t		ex_offset;
736432Sas200622 	const char	*ex_dcmd;
746432Sas200622 	const char	*ex_name;
756432Sas200622 } smb_exp_t;
765331Samw 
775331Samw /*
786432Sas200622  * List of supported options. Ther order has the match the bits SMB_OPT_xxx.
795331Samw  */
8012508Samw@Sun.COM typedef struct smb_mdb_opts {
8112508Samw@Sun.COM 	char		*o_name;
8212508Samw@Sun.COM 	uint32_t	o_value;
8312508Samw@Sun.COM } smb_mdb_opts_t;
8412508Samw@Sun.COM 
8512508Samw@Sun.COM static smb_mdb_opts_t smb_opts[SMB_MDB_MAX_OPTS] =
866139Sjb150015 {
8712508Samw@Sun.COM 	{ "-s", SMB_OPT_SERVER	},
8812508Samw@Sun.COM 	{ "-e", SMB_OPT_SESSION	},
8912508Samw@Sun.COM 	{ "-r", SMB_OPT_REQUEST	},
9012508Samw@Sun.COM 	{ "-u", SMB_OPT_USER	},
9112508Samw@Sun.COM 	{ "-t", SMB_OPT_TREE	},
9212508Samw@Sun.COM 	{ "-f", SMB_OPT_OFILE	},
9312508Samw@Sun.COM 	{ "-d", SMB_OPT_ODIR	},
9412508Samw@Sun.COM 	{ "-w", SMB_OPT_WALK	},
9512508Samw@Sun.COM 	{ "-v", SMB_OPT_VERBOSE	}
966432Sas200622 };
976139Sjb150015 
986432Sas200622 static smb_com_entry_t	smb_com[256] =
996139Sjb150015 {
1006432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE_DIRECTORY, "No"),
1016432Sas200622 	SMB_COM_ENTRY(SMB_COM_DELETE_DIRECTORY, "No"),
1026432Sas200622 	SMB_COM_ENTRY(SMB_COM_OPEN, "No"),
1036432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE, "No"),
1046432Sas200622 	SMB_COM_ENTRY(SMB_COM_CLOSE, "No"),
1056432Sas200622 	SMB_COM_ENTRY(SMB_COM_FLUSH, "No"),
1066432Sas200622 	SMB_COM_ENTRY(SMB_COM_DELETE, "No"),
1076432Sas200622 	SMB_COM_ENTRY(SMB_COM_RENAME, "No"),
1086432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_INFORMATION, "No"),
1096432Sas200622 	SMB_COM_ENTRY(SMB_COM_SET_INFORMATION, "No"),
1106432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ, "No"),
1116432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE, "No"),
1126432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOCK_BYTE_RANGE, "No"),
1136432Sas200622 	SMB_COM_ENTRY(SMB_COM_UNLOCK_BYTE_RANGE, "No"),
1146432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE_TEMPORARY, "No"),
1156432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE_NEW, "No"),
1166432Sas200622 	SMB_COM_ENTRY(SMB_COM_CHECK_DIRECTORY, "No"),
1176432Sas200622 	SMB_COM_ENTRY(SMB_COM_PROCESS_EXIT, "No"),
1186432Sas200622 	SMB_COM_ENTRY(SMB_COM_SEEK, "No"),
1196432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOCK_AND_READ, "No"),
1206432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_AND_UNLOCK, "No"),
1216432Sas200622 	SMB_COM_ENTRY(0x15, "?"),
1226432Sas200622 	SMB_COM_ENTRY(0x16, "?"),
1236432Sas200622 	SMB_COM_ENTRY(0x17, "?"),
1246432Sas200622 	SMB_COM_ENTRY(0x18, "?"),
1256432Sas200622 	SMB_COM_ENTRY(0x19, "?"),
1266432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_RAW, "No"),
1276432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_MPX, "No"),
1286432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_MPX_SECONDARY, "No"),
1296432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_RAW, "No"),
1306432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_MPX, "No"),
1316432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_MPX_SECONDARY, "No"),
1326432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_COMPLETE, "No"),
1336432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_SERVER, "No"),
1346432Sas200622 	SMB_COM_ENTRY(SMB_COM_SET_INFORMATION2, "No"),
1356432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_INFORMATION2, "No"),
1366432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOCKING_ANDX, "No"),
1376432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION, "No"),
1386432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION_SECONDARY, "No"),
1396432Sas200622 	SMB_COM_ENTRY(SMB_COM_IOCTL, "No"),
1406432Sas200622 	SMB_COM_ENTRY(SMB_COM_IOCTL_SECONDARY, "No"),
1416432Sas200622 	SMB_COM_ENTRY(SMB_COM_COPY, "No"),
1426432Sas200622 	SMB_COM_ENTRY(SMB_COM_MOVE, "No"),
1436432Sas200622 	SMB_COM_ENTRY(SMB_COM_ECHO, "No"),
1446432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_AND_CLOSE, "No"),
1456432Sas200622 	SMB_COM_ENTRY(SMB_COM_OPEN_ANDX, "No"),
1466432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_ANDX, "No"),
1476432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_ANDX, "No"),
1486432Sas200622 	SMB_COM_ENTRY(SMB_COM_NEW_FILE_SIZE, "No"),
1496432Sas200622 	SMB_COM_ENTRY(SMB_COM_CLOSE_AND_TREE_DISC, "No"),
1506432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION2, "No"),
1516432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION2_SECONDARY, "No"),
1526432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_CLOSE2, "No"),
1536432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_NOTIFY_CLOSE, "No"),
1546432Sas200622 	SMB_COM_ENTRY(0x36, "?"),
1556432Sas200622 	SMB_COM_ENTRY(0x37, "?"),
1566432Sas200622 	SMB_COM_ENTRY(0x38, "?"),
1576432Sas200622 	SMB_COM_ENTRY(0x39, "?"),
1586432Sas200622 	SMB_COM_ENTRY(0x3A, "?"),
1596432Sas200622 	SMB_COM_ENTRY(0x3B, "?"),
1606432Sas200622 	SMB_COM_ENTRY(0x3C, "?"),
1616432Sas200622 	SMB_COM_ENTRY(0x3D, "?"),
1626432Sas200622 	SMB_COM_ENTRY(0x3E, "?"),
1636432Sas200622 	SMB_COM_ENTRY(0x3F, "?"),
1646432Sas200622 	SMB_COM_ENTRY(0x40, "?"),
1656432Sas200622 	SMB_COM_ENTRY(0x41, "?"),
1666432Sas200622 	SMB_COM_ENTRY(0x42, "?"),
1676432Sas200622 	SMB_COM_ENTRY(0x43, "?"),
1686432Sas200622 	SMB_COM_ENTRY(0x44, "?"),
1696432Sas200622 	SMB_COM_ENTRY(0x45, "?"),
1706432Sas200622 	SMB_COM_ENTRY(0x46, "?"),
1716432Sas200622 	SMB_COM_ENTRY(0x47, "?"),
1726432Sas200622 	SMB_COM_ENTRY(0x48, "?"),
1736432Sas200622 	SMB_COM_ENTRY(0x49, "?"),
1746432Sas200622 	SMB_COM_ENTRY(0x4A, "?"),
1756432Sas200622 	SMB_COM_ENTRY(0x4B, "?"),
1766432Sas200622 	SMB_COM_ENTRY(0x4C, "?"),
1776432Sas200622 	SMB_COM_ENTRY(0x4D, "?"),
1786432Sas200622 	SMB_COM_ENTRY(0x4E, "?"),
1796432Sas200622 	SMB_COM_ENTRY(0x4F, "?"),
1806432Sas200622 	SMB_COM_ENTRY(0x50, "?"),
1816432Sas200622 	SMB_COM_ENTRY(0x51, "?"),
1826432Sas200622 	SMB_COM_ENTRY(0x52, "?"),
1836432Sas200622 	SMB_COM_ENTRY(0x53, "?"),
1846432Sas200622 	SMB_COM_ENTRY(0x54, "?"),
1856432Sas200622 	SMB_COM_ENTRY(0x55, "?"),
1866432Sas200622 	SMB_COM_ENTRY(0x56, "?"),
1876432Sas200622 	SMB_COM_ENTRY(0x57, "?"),
1886432Sas200622 	SMB_COM_ENTRY(0x58, "?"),
1896432Sas200622 	SMB_COM_ENTRY(0x59, "?"),
1906432Sas200622 	SMB_COM_ENTRY(0x5A, "?"),
1916432Sas200622 	SMB_COM_ENTRY(0x5B, "?"),
1926432Sas200622 	SMB_COM_ENTRY(0x5C, "?"),
1936432Sas200622 	SMB_COM_ENTRY(0x5D, "?"),
1946432Sas200622 	SMB_COM_ENTRY(0x5E, "?"),
1956432Sas200622 	SMB_COM_ENTRY(0x5F, "?"),
1966432Sas200622 	SMB_COM_ENTRY(0x60, "?"),
1976432Sas200622 	SMB_COM_ENTRY(0x61, "?"),
1986432Sas200622 	SMB_COM_ENTRY(0x62, "?"),
1996432Sas200622 	SMB_COM_ENTRY(0x63, "?"),
2006432Sas200622 	SMB_COM_ENTRY(0x64, "?"),
2016432Sas200622 	SMB_COM_ENTRY(0x65, "?"),
2026432Sas200622 	SMB_COM_ENTRY(0x66, "?"),
2036432Sas200622 	SMB_COM_ENTRY(0x67, "?"),
2046432Sas200622 	SMB_COM_ENTRY(0x68, "?"),
2056432Sas200622 	SMB_COM_ENTRY(0x69, "?"),
2066432Sas200622 	SMB_COM_ENTRY(0x6A, "?"),
2076432Sas200622 	SMB_COM_ENTRY(0x6B, "?"),
2086432Sas200622 	SMB_COM_ENTRY(0x6C, "?"),
2096432Sas200622 	SMB_COM_ENTRY(0x6D, "?"),
2106432Sas200622 	SMB_COM_ENTRY(0x6E, "?"),
2116432Sas200622 	SMB_COM_ENTRY(0x6F, "?"),
2126432Sas200622 	SMB_COM_ENTRY(SMB_COM_TREE_CONNECT, "No"),
2136432Sas200622 	SMB_COM_ENTRY(SMB_COM_TREE_DISCONNECT, "No"),
2146432Sas200622 	SMB_COM_ENTRY(SMB_COM_NEGOTIATE, "No"),
2156432Sas200622 	SMB_COM_ENTRY(SMB_COM_SESSION_SETUP_ANDX, "No"),
2166432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOGOFF_ANDX, "No"),
2176432Sas200622 	SMB_COM_ENTRY(SMB_COM_TREE_CONNECT_ANDX, "No"),
2186432Sas200622 	SMB_COM_ENTRY(0x76, "?"),
2196432Sas200622 	SMB_COM_ENTRY(0x77, "?"),
2206432Sas200622 	SMB_COM_ENTRY(0x78, "?"),
2216432Sas200622 	SMB_COM_ENTRY(0x79, "?"),
2226432Sas200622 	SMB_COM_ENTRY(0x7A, "?"),
2236432Sas200622 	SMB_COM_ENTRY(0x7B, "?"),
2246432Sas200622 	SMB_COM_ENTRY(0x7C, "?"),
2256432Sas200622 	SMB_COM_ENTRY(0x7D, "?"),
2266432Sas200622 	SMB_COM_ENTRY(0x7E, "?"),
2276432Sas200622 	SMB_COM_ENTRY(0x7F, "?"),
2286432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_INFORMATION_DISK, "No"),
2296432Sas200622 	SMB_COM_ENTRY(SMB_COM_SEARCH, "No"),
2306432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND, "No"),
2316432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_UNIQUE, "No"),
2326432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_CLOSE, "No"),
2336432Sas200622 	SMB_COM_ENTRY(0x85, "?"),
2346432Sas200622 	SMB_COM_ENTRY(0x86, "?"),
2356432Sas200622 	SMB_COM_ENTRY(0x87, "?"),
2366432Sas200622 	SMB_COM_ENTRY(0x88, "?"),
2376432Sas200622 	SMB_COM_ENTRY(0x89, "?"),
2386432Sas200622 	SMB_COM_ENTRY(0x8A, "?"),
2396432Sas200622 	SMB_COM_ENTRY(0x8B, "?"),
2406432Sas200622 	SMB_COM_ENTRY(0x8C, "?"),
2416432Sas200622 	SMB_COM_ENTRY(0x8D, "?"),
2426432Sas200622 	SMB_COM_ENTRY(0x8E, "?"),
2436432Sas200622 	SMB_COM_ENTRY(0x8F, "?"),
2446432Sas200622 	SMB_COM_ENTRY(0x90, "?"),
2456432Sas200622 	SMB_COM_ENTRY(0x91, "?"),
2466432Sas200622 	SMB_COM_ENTRY(0x92, "?"),
2476432Sas200622 	SMB_COM_ENTRY(0x93, "?"),
2486432Sas200622 	SMB_COM_ENTRY(0x94, "?"),
2496432Sas200622 	SMB_COM_ENTRY(0x95, "?"),
2506432Sas200622 	SMB_COM_ENTRY(0x96, "?"),
2516432Sas200622 	SMB_COM_ENTRY(0x97, "?"),
2526432Sas200622 	SMB_COM_ENTRY(0x98, "?"),
2536432Sas200622 	SMB_COM_ENTRY(0x99, "?"),
2546432Sas200622 	SMB_COM_ENTRY(0x9A, "?"),
2556432Sas200622 	SMB_COM_ENTRY(0x9B, "?"),
2566432Sas200622 	SMB_COM_ENTRY(0x9C, "?"),
2576432Sas200622 	SMB_COM_ENTRY(0x9D, "?"),
2586432Sas200622 	SMB_COM_ENTRY(0x9E, "?"),
2596432Sas200622 	SMB_COM_ENTRY(0x9F, "?"),
2606432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_TRANSACT, "No"),
2616432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_TRANSACT_SECONDARY, "No"),
2626432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_CREATE_ANDX, "No"),
2639021Samw@Sun.COM 	SMB_COM_ENTRY(0xA3, "?"),
2646432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_CANCEL, "No"),
2656432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_RENAME, "No"),
2666432Sas200622 	SMB_COM_ENTRY(0xA6, "?"),
2676432Sas200622 	SMB_COM_ENTRY(0xA7, "?"),
2686432Sas200622 	SMB_COM_ENTRY(0xA8, "?"),
2696432Sas200622 	SMB_COM_ENTRY(0xA9, "?"),
2706432Sas200622 	SMB_COM_ENTRY(0xAA, "?"),
2716432Sas200622 	SMB_COM_ENTRY(0xAB, "?"),
2726432Sas200622 	SMB_COM_ENTRY(0xAC, "?"),
2736432Sas200622 	SMB_COM_ENTRY(0xAD, "?"),
2746432Sas200622 	SMB_COM_ENTRY(0xAE, "?"),
2756432Sas200622 	SMB_COM_ENTRY(0xAF, "?"),
2766432Sas200622 	SMB_COM_ENTRY(0xB0, "?"),
2776432Sas200622 	SMB_COM_ENTRY(0xB1, "?"),
2786432Sas200622 	SMB_COM_ENTRY(0xB2, "?"),
2796432Sas200622 	SMB_COM_ENTRY(0xB3, "?"),
2806432Sas200622 	SMB_COM_ENTRY(0xB4, "?"),
2816432Sas200622 	SMB_COM_ENTRY(0xB5, "?"),
2826432Sas200622 	SMB_COM_ENTRY(0xB6, "?"),
2836432Sas200622 	SMB_COM_ENTRY(0xB7, "?"),
2846432Sas200622 	SMB_COM_ENTRY(0xB8, "?"),
2856432Sas200622 	SMB_COM_ENTRY(0xB9, "?"),
2866432Sas200622 	SMB_COM_ENTRY(0xBA, "?"),
2876432Sas200622 	SMB_COM_ENTRY(0xBB, "?"),
2886432Sas200622 	SMB_COM_ENTRY(0xBC, "?"),
2896432Sas200622 	SMB_COM_ENTRY(0xBD, "?"),
2906432Sas200622 	SMB_COM_ENTRY(0xBE, "?"),
2916432Sas200622 	SMB_COM_ENTRY(0xBF, "?"),
2926432Sas200622 	SMB_COM_ENTRY(SMB_COM_OPEN_PRINT_FILE, "No"),
2936432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_PRINT_FILE, "No"),
2946432Sas200622 	SMB_COM_ENTRY(SMB_COM_CLOSE_PRINT_FILE, "No"),
2956432Sas200622 	SMB_COM_ENTRY(SMB_COM_GET_PRINT_QUEUE, "No"),
2966432Sas200622 	SMB_COM_ENTRY(0xC4, "?"),
2976432Sas200622 	SMB_COM_ENTRY(0xC5, "?"),
2986432Sas200622 	SMB_COM_ENTRY(0xC6, "?"),
2996432Sas200622 	SMB_COM_ENTRY(0xC7, "?"),
3006432Sas200622 	SMB_COM_ENTRY(0xC8, "?"),
3016432Sas200622 	SMB_COM_ENTRY(0xC9, "?"),
3026432Sas200622 	SMB_COM_ENTRY(0xCA, "?"),
3036432Sas200622 	SMB_COM_ENTRY(0xCB, "?"),
3046432Sas200622 	SMB_COM_ENTRY(0xCC, "?"),
3056432Sas200622 	SMB_COM_ENTRY(0xCD, "?"),
3066432Sas200622 	SMB_COM_ENTRY(0xCE, "?"),
3076432Sas200622 	SMB_COM_ENTRY(0xCF, "?"),
3086432Sas200622 	SMB_COM_ENTRY(0xD0, "?"),
3096432Sas200622 	SMB_COM_ENTRY(0xD1, "?"),
3106432Sas200622 	SMB_COM_ENTRY(0xD2, "?"),
3116432Sas200622 	SMB_COM_ENTRY(0xD3, "?"),
3126432Sas200622 	SMB_COM_ENTRY(0xD4, "?"),
3136432Sas200622 	SMB_COM_ENTRY(0xD5, "?"),
3146432Sas200622 	SMB_COM_ENTRY(0xD6, "?"),
3156432Sas200622 	SMB_COM_ENTRY(0xD7, "?"),
3166432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_BULK, "No"),
3176432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_BULK, "No"),
3186432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_BULK_DATA, "No"),
3196432Sas200622 	SMB_COM_ENTRY(0xDB, "?"),
3206432Sas200622 	SMB_COM_ENTRY(0xDC, "?"),
3219021Samw@Sun.COM 	SMB_COM_ENTRY(0xDD, "?"),
3226432Sas200622 	SMB_COM_ENTRY(0xDE, "?"),
3236432Sas200622 	SMB_COM_ENTRY(0xDF, "?"),
3246432Sas200622 	SMB_COM_ENTRY(0xE0, "?"),
3256432Sas200622 	SMB_COM_ENTRY(0xE1, "?"),
3266432Sas200622 	SMB_COM_ENTRY(0xE2, "?"),
3276432Sas200622 	SMB_COM_ENTRY(0xE3, "?"),
3286432Sas200622 	SMB_COM_ENTRY(0xE4, "?"),
3296432Sas200622 	SMB_COM_ENTRY(0xE5, "?"),
3306432Sas200622 	SMB_COM_ENTRY(0xE6, "?"),
3316432Sas200622 	SMB_COM_ENTRY(0xE7, "?"),
3326432Sas200622 	SMB_COM_ENTRY(0xE8, "?"),
3336432Sas200622 	SMB_COM_ENTRY(0xE9, "?"),
3346432Sas200622 	SMB_COM_ENTRY(0xEA, "?"),
3356432Sas200622 	SMB_COM_ENTRY(0xEB, "?"),
3366432Sas200622 	SMB_COM_ENTRY(0xEC, "?"),
3376432Sas200622 	SMB_COM_ENTRY(0xED, "?"),
3386432Sas200622 	SMB_COM_ENTRY(0xEE, "?"),
3396432Sas200622 	SMB_COM_ENTRY(0xEF, "?"),
3406432Sas200622 	SMB_COM_ENTRY(0xF0, "?"),
3416432Sas200622 	SMB_COM_ENTRY(0xF1, "?"),
3426432Sas200622 	SMB_COM_ENTRY(0xF2, "?"),
3436432Sas200622 	SMB_COM_ENTRY(0xF3, "?"),
3446432Sas200622 	SMB_COM_ENTRY(0xF4, "?"),
3456432Sas200622 	SMB_COM_ENTRY(0xF5, "?"),
3466432Sas200622 	SMB_COM_ENTRY(0xF6, "?"),
3476432Sas200622 	SMB_COM_ENTRY(0xF7, "?"),
3486432Sas200622 	SMB_COM_ENTRY(0xF8, "?"),
3496432Sas200622 	SMB_COM_ENTRY(0xF9, "?"),
3506432Sas200622 	SMB_COM_ENTRY(0xFA, "?"),
3516432Sas200622 	SMB_COM_ENTRY(0xFB, "?"),
3526432Sas200622 	SMB_COM_ENTRY(0xFC, "?"),
3536432Sas200622 	SMB_COM_ENTRY(0xFD, "?"),
3546432Sas200622 	SMB_COM_ENTRY(0xFE, "?"),
3556432Sas200622 	SMB_COM_ENTRY(0xFF, "?")
3566432Sas200622 };
3576139Sjb150015 
3586432Sas200622 static int smb_dcmd_list(uintptr_t, uint_t, int, const mdb_arg_t *);
3596432Sas200622 static void smb_dcmd_list_help(void);
3606432Sas200622 static int smb_dcmd_server(uintptr_t, uint_t, int, const mdb_arg_t *);
3616432Sas200622 static void smb_dcmd_session_help(void);
3626432Sas200622 static int smb_dcmd_session(uintptr_t, uint_t, int, const mdb_arg_t *);
3636432Sas200622 static int smb_dcmd_request(uintptr_t, uint_t, int, const mdb_arg_t *);
3646432Sas200622 static void smb_dcmd_user_help(void);
3656432Sas200622 static int smb_dcmd_user(uintptr_t, uint_t, int, const mdb_arg_t *);
3666432Sas200622 static void smb_dcmd_tree_help(void);
3676432Sas200622 static int smb_dcmd_tree(uintptr_t, uint_t, int, const mdb_arg_t *);
3686432Sas200622 static int smb_dcmd_odir(uintptr_t, uint_t, int, const mdb_arg_t *);
3696432Sas200622 static int smb_dcmd_ofile(uintptr_t, uint_t, int, const mdb_arg_t *);
37012508Samw@Sun.COM static int smb_vfs(uintptr_t, uint_t, int, const mdb_arg_t *);
37112508Samw@Sun.COM static int smb_vfs_walk_init(mdb_walk_state_t *);
37212508Samw@Sun.COM static int smb_vfs_walk_step(mdb_walk_state_t *);
3736432Sas200622 static void smb_node_help(void);
3746432Sas200622 static int smb_node(uintptr_t, uint_t, int, const mdb_arg_t *);
3756432Sas200622 static int smb_node_walk_init(mdb_walk_state_t *);
3766432Sas200622 static int smb_node_walk_step(mdb_walk_state_t *);
3776432Sas200622 static int smb_lock(uintptr_t, uint_t, int, const mdb_arg_t *);
37812890SJoyce.McIntosh@Sun.COM static int smb_oplock(uintptr_t, uint_t, int, const mdb_arg_t *);
37912890SJoyce.McIntosh@Sun.COM static int smb_oplock_grant(uintptr_t, uint_t, int, const mdb_arg_t *);
3806432Sas200622 static int smb_ace(uintptr_t, uint_t, int, const mdb_arg_t *);
3816432Sas200622 static int smb_ace_walk_init(mdb_walk_state_t *);
3826432Sas200622 static int smb_ace_walk_step(mdb_walk_state_t *);
3836432Sas200622 static int smb_acl(uintptr_t, uint_t, int, const mdb_arg_t *);
3846432Sas200622 static int smb_sd(uintptr_t, uint_t, int, const mdb_arg_t *);
3856432Sas200622 static int smb_sid(uintptr_t, uint_t, int, const mdb_arg_t *);
3866432Sas200622 static int smb_sid_print(uintptr_t);
3876432Sas200622 static int smb_fssd(uintptr_t, uint_t, int, const mdb_arg_t *);
3886432Sas200622 static int smb_dcmd_getopt(uint_t *, int, const mdb_arg_t *);
3896432Sas200622 static int smb_dcmd_setopt(uint_t, int, mdb_arg_t *);
3906432Sas200622 static int smb_obj_expand(uintptr_t, uint_t, const smb_exp_t *, ulong_t);
3916432Sas200622 static int smb_obj_list(const char *, uint_t, uint_t);
3929021Samw@Sun.COM static int smb_worker_findstack(uintptr_t);
39312508Samw@Sun.COM static int smb_stats(uintptr_t, uint_t, int, const mdb_arg_t *);
3946139Sjb150015 
3956432Sas200622 /*
3966432Sas200622  * MDB module linkage information:
3976432Sas200622  *
3986432Sas200622  * We declare a list of structures describing our dcmds, a list of structures
3996432Sas200622  * describing our walkers and a function named _mdb_init to return a pointer
4006432Sas200622  * to our module information.
4016432Sas200622  */
4026432Sas200622 static const mdb_dcmd_t dcmds[] = {
4036432Sas200622 	{   "smblist",
4046432Sas200622 	    "[-seutfdwv]",
4056432Sas200622 	    "print tree of SMB objects",
4066432Sas200622 	    smb_dcmd_list,
4076432Sas200622 	    smb_dcmd_list_help },
4086432Sas200622 	{   "smbsrv",
4096432Sas200622 	    "[-seutfdwv]",
4106432Sas200622 	    "print smb_server information",
4116432Sas200622 	    smb_dcmd_server },
4126432Sas200622 	{   "smbvfs",
4136432Sas200622 	    "[-v]",
4146432Sas200622 	    "print smb_vfs information",
41512508Samw@Sun.COM 	    smb_vfs },
4166432Sas200622 	{   "smbnode",
4176432Sas200622 	    "?[-vps]",
4186432Sas200622 	    "print smb_node_t information",
4196432Sas200622 	    smb_node,
4206432Sas200622 	    smb_node_help },
4216432Sas200622 	{   "smbsess",
4226432Sas200622 	    "[-utfdwv]",
4236432Sas200622 	    "print smb_session_t information",
4246432Sas200622 	    smb_dcmd_session,
4256432Sas200622 	    smb_dcmd_session_help},
4266432Sas200622 	{   "smbreq",
4276432Sas200622 	    ":[-v]",
4286432Sas200622 	    "print smb_request_t information",
4296432Sas200622 	    smb_dcmd_request },
4306432Sas200622 	{   "smblock", ":[-v]",
4316432Sas200622 	    "print smb_lock_t information", smb_lock },
4326432Sas200622 	{   "smbuser",
4336432Sas200622 	    ":[-vdftq]",
4346432Sas200622 	    "print smb_user_t information",
4356432Sas200622 	    smb_dcmd_user,
4366432Sas200622 	    smb_dcmd_user_help },
4376432Sas200622 	{   "smbtree",
4386432Sas200622 	    ":[-vdf]",
4396432Sas200622 	    "print smb_tree_t information",
4406432Sas200622 	    smb_dcmd_tree,
4416432Sas200622 	    smb_dcmd_tree_help },
4426432Sas200622 	{   "smbodir",
4436432Sas200622 	    ":[-v]",
4446432Sas200622 	    "print smb_odir_t information",
4456432Sas200622 	    smb_dcmd_odir },
4466432Sas200622 	{   "smbofile",
4476432Sas200622 	    "[-v]",
44812890SJoyce.McIntosh@Sun.COM 	    "print smb_file_t information",
4496432Sas200622 	    smb_dcmd_ofile },
45012890SJoyce.McIntosh@Sun.COM 	{   "smboplock", NULL,
45112890SJoyce.McIntosh@Sun.COM 	    "print smb_oplock_t information", smb_oplock },
45212890SJoyce.McIntosh@Sun.COM 	{   "smboplockgrant", NULL,
45312890SJoyce.McIntosh@Sun.COM 	    "print smb_oplock_grant_t information", smb_oplock_grant },
45412508Samw@Sun.COM 	{   "smbstat", NULL,
45512508Samw@Sun.COM 	    "print all smb dispatched requests statistics",
45612508Samw@Sun.COM 	    smb_stats },
4576432Sas200622 	{   "smbace", "[-v]",
4586432Sas200622 	    "print smb_ace_t information", smb_ace },
4596432Sas200622 	{   "smbacl", "[-v]",
4606432Sas200622 	    "print smb_acl_t information", smb_acl },
4616432Sas200622 	{   "smbsid", "[-v]",
4626432Sas200622 	    "print smb_sid_t information", smb_sid },
4636432Sas200622 	{   "smbsd", "[-v]",
4646432Sas200622 	    "print smb_sd_t information", smb_sd },
4656432Sas200622 	{   "smbfssd", "[-v]",
4666432Sas200622 	    "print smb_fssd_t information", smb_fssd },
4676432Sas200622 	{ NULL }
4686432Sas200622 };
4695331Samw 
4706432Sas200622 static const mdb_walker_t walkers[] = {
4716432Sas200622 	{   "smbnode_walker",
4726432Sas200622 	    "walk list of smb_node_t structures",
4736432Sas200622 	    smb_node_walk_init,
4746432Sas200622 	    smb_node_walk_step,
4756432Sas200622 	    NULL,
4766432Sas200622 	    NULL },
47712508Samw@Sun.COM 	{   "smbvfs_walker",
47812508Samw@Sun.COM 	    "walk list of smb_vfs_t structures",
47912508Samw@Sun.COM 	    smb_vfs_walk_init,
48012508Samw@Sun.COM 	    smb_vfs_walk_step,
48112508Samw@Sun.COM 	    NULL,
48212508Samw@Sun.COM 	    NULL },
4836432Sas200622 	{   "smbace_walker",
4846432Sas200622 	    "walk list of smb_ace_t structures",
4856432Sas200622 	    smb_ace_walk_init,
4866432Sas200622 	    smb_ace_walk_step,
4876432Sas200622 	    NULL,
4886432Sas200622 	    NULL },
4896432Sas200622 	{ NULL }
4906432Sas200622 };
4915331Samw 
4926432Sas200622 static const mdb_modinfo_t modinfo = {
4936432Sas200622 	MDB_API_VERSION, dcmds, walkers
4946432Sas200622 };
4956432Sas200622 
4966432Sas200622 const mdb_modinfo_t *
_mdb_init(void)4976432Sas200622 _mdb_init(void)
4985331Samw {
4996432Sas200622 	return (&modinfo);
5005331Samw }
5015331Samw 
5025331Samw /*
5036432Sas200622  * *****************************************************************************
5046432Sas200622  * ****************************** Top level DCMD *******************************
5056432Sas200622  * *****************************************************************************
5065331Samw  */
5076432Sas200622 
5086432Sas200622 static void
smb_dcmd_list_help(void)5096432Sas200622 smb_dcmd_list_help(void)
5106432Sas200622 {
5116432Sas200622 	mdb_printf(
5126432Sas200622 	    "Displays the list of objects using an indented tree format.\n"
5136432Sas200622 	    "If no option is specified the entire tree is displayed\n\n");
5146432Sas200622 	(void) mdb_dec_indent(2);
5156432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
5166432Sas200622 	(void) mdb_inc_indent(2);
5176432Sas200622 	mdb_printf(
5186432Sas200622 	    "-v\tDisplay verbose information\n"
5196432Sas200622 	    "-s\tDisplay the list of servers\n"
5206432Sas200622 	    "-e\tDisplay the list of sessions\n"
5216432Sas200622 	    "-r\tDisplay the list of smb requests\n"
5226432Sas200622 	    "-u\tDisplay the list of users\n"
5236432Sas200622 	    "-t\tDisplay the list of trees\n"
5246432Sas200622 	    "-f\tDisplay the list of open files\n"
5256432Sas200622 	    "-d\tDisplay the list of open searches\n");
5266432Sas200622 }
5276432Sas200622 
5286432Sas200622 /*
5296432Sas200622  * ::smblist
5306432Sas200622  *
5316432Sas200622  * This function lists the objects specified on the command line. If no object
5326432Sas200622  * is specified the entire tree (server through ofile and odir) is displayed.
5336432Sas200622  *
5346432Sas200622  */
5356432Sas200622 /*ARGSUSED*/
5365331Samw static int
smb_dcmd_list(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)5376432Sas200622 smb_dcmd_list(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5385331Samw {
5395331Samw 	GElf_Sym	sym;
5406432Sas200622 	uint_t		opts = 0;
5416432Sas200622 	int		new_argc;
5426432Sas200622 	mdb_arg_t	new_argv[SMB_MDB_MAX_OPTS];
5436432Sas200622 
5446432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
5456432Sas200622 		return (DCMD_USAGE);
5466432Sas200622 
5476432Sas200622 	if (!(opts & ~(SMB_OPT_WALK | SMB_OPT_VERBOSE)))
5486432Sas200622 		opts |= SMB_OPT_ALL_OBJ;
5496432Sas200622 
5506432Sas200622 	opts |= SMB_OPT_WALK;
5516432Sas200622 
5526432Sas200622 	new_argc = smb_dcmd_setopt(opts, SMB_MDB_MAX_OPTS, new_argv);
5536432Sas200622 
5546432Sas200622 	if (mdb_lookup_by_name("smb_servers", &sym) == -1) {
5556432Sas200622 		mdb_warn("failed to find symbol smb_servers");
5566432Sas200622 		return (DCMD_ERR);
5576432Sas200622 	}
5586432Sas200622 
5596432Sas200622 	addr = (uintptr_t)sym.st_value + offsetof(smb_llist_t, ll_list);
5606432Sas200622 
5616432Sas200622 	if (mdb_pwalk_dcmd("list", "smbsrv", new_argc, new_argv, addr))
5626432Sas200622 		return (DCMD_ERR);
5636432Sas200622 	return (DCMD_OK);
5646432Sas200622 }
5656432Sas200622 
5666432Sas200622 /*
5676432Sas200622  * *****************************************************************************
5686432Sas200622  * ***************************** smb_server_t **********************************
5696432Sas200622  * *****************************************************************************
5706432Sas200622  */
5716432Sas200622 
5726432Sas200622 static const char *smb_server_state[SMB_SERVER_STATE_SENTINEL] =
5736432Sas200622 {
5746432Sas200622 	"CREATED",
5756432Sas200622 	"CONFIGURED",
5766432Sas200622 	"RUNNING",
57711963SAfshin.Ardakani@Sun.COM 	"STOPPING",
5786432Sas200622 	"DELETING"
5796432Sas200622 };
5806432Sas200622 
5816432Sas200622 /*
5826432Sas200622  * List of objects that can be expanded under a server structure.
5836432Sas200622  */
5846432Sas200622 static const smb_exp_t smb_server_exp[] =
5856432Sas200622 {
5866432Sas200622 	{ SMB_OPT_ALL_OBJ,
587*13138SJose.Borrego@Sun.COM 	    offsetof(smb_server_t, sv_nbt_daemon.ld_session_list.ll_list),
5886432Sas200622 	    "smbsess", "smb_session"},
5896432Sas200622 	{ SMB_OPT_ALL_OBJ,
590*13138SJose.Borrego@Sun.COM 	    offsetof(smb_server_t, sv_tcp_daemon.ld_session_list.ll_list),
5916432Sas200622 	    "smbsess", "smb_session"},
5926432Sas200622 	{ 0, 0, NULL, NULL }
5936432Sas200622 };
5946432Sas200622 
5956432Sas200622 /*
5966432Sas200622  * ::smbsrv
5976432Sas200622  *
5986432Sas200622  * smbsrv dcmd - Print out smb_server structures.
5996432Sas200622  */
6006432Sas200622 /*ARGSUSED*/
6016432Sas200622 static int
smb_dcmd_server(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)6026432Sas200622 smb_dcmd_server(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
6036432Sas200622 {
6046432Sas200622 	uint_t		opts;
6056432Sas200622 	ulong_t		indent = 0;
6065331Samw 
6076432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
6086432Sas200622 		return (DCMD_USAGE);
6096432Sas200622 
6106432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
6116432Sas200622 		return (smb_obj_list("smb_server", opts | SMB_OPT_SERVER,
6126432Sas200622 		    flags));
6136432Sas200622 
6146432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_SERVER)) ||
6156432Sas200622 	    !(opts & SMB_OPT_WALK)) {
6166432Sas200622 		smb_server_t	*sv;
6176432Sas200622 		const char	*state;
6186432Sas200622 
6196432Sas200622 		sv = mdb_alloc(sizeof (smb_server_t), UM_SLEEP | UM_GC);
6206432Sas200622 		if (mdb_vread(sv, sizeof (smb_server_t), addr) == -1) {
6216432Sas200622 			mdb_warn("failed to read smb_server at %p", addr);
6226432Sas200622 			return (DCMD_ERR);
6235331Samw 		}
6246432Sas200622 
6256432Sas200622 		indent = SMB_DCMD_INDENT;
6266432Sas200622 
6276432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
6286432Sas200622 			mdb_arg_t	argv;
6296432Sas200622 
6306432Sas200622 			argv.a_type = MDB_TYPE_STRING;
6316432Sas200622 			argv.a_un.a_str = "smb_server_t";
6326432Sas200622 			if (mdb_call_dcmd("print", addr, flags, 1, &argv))
6336432Sas200622 				return (DCMD_ERR);
6346432Sas200622 		} else {
6356432Sas200622 			if (DCMD_HDRSPEC(flags))
6366432Sas200622 				mdb_printf(
6376432Sas200622 				    "%<b>%<u>%-?s% "
6386432Sas200622 				    "%-4s% "
6396432Sas200622 				    "%-32s% "
64012508Samw@Sun.COM 				    "%</u>%</b>\n",
64112508Samw@Sun.COM 				    "SERVER", "ZONE", "STATE");
6426432Sas200622 
6436432Sas200622 			if (sv->sv_state >= SMB_SERVER_STATE_SENTINEL)
6446432Sas200622 				state = "UNKNOWN";
6456432Sas200622 			else
6466432Sas200622 				state = smb_server_state[sv->sv_state];
6476432Sas200622 
64812508Samw@Sun.COM 			mdb_printf("%-?p %-4d %-32s \n",
64912508Samw@Sun.COM 			    addr, sv->sv_zid, state);
6506432Sas200622 		}
6516432Sas200622 	}
6526432Sas200622 	if (smb_obj_expand(addr, opts, smb_server_exp, indent))
6536432Sas200622 		return (DCMD_ERR);
6546432Sas200622 	return (DCMD_OK);
6556432Sas200622 }
6566432Sas200622 
6576432Sas200622 /*
6586432Sas200622  * *****************************************************************************
6596432Sas200622  * ***************************** smb_session_t *********************************
6606432Sas200622  * *****************************************************************************
6616432Sas200622  */
6626432Sas200622 
6636432Sas200622 static const char *smb_session_state[SMB_SESSION_STATE_SENTINEL] =
6646432Sas200622 {
6656432Sas200622 	"INITIALIZED",
6666432Sas200622 	"DISCONNECTED",
6676432Sas200622 	"CONNECTED",
6686432Sas200622 	"ESTABLISHED",
6696432Sas200622 	"NEGOTIATED",
6706432Sas200622 	"OPLOCK_BREAKING",
6716432Sas200622 	"WRITE_RAW_ACTIVE",
67211963SAfshin.Ardakani@Sun.COM 	"READ_RAW_ACTIVE",
6736432Sas200622 	"TERMINATED"
6746432Sas200622 };
6756432Sas200622 
6766432Sas200622 /*
6776432Sas200622  * List of objects that can be expanded under a session structure.
6786432Sas200622  */
6796432Sas200622 static const smb_exp_t smb_session_exp[] =
6806432Sas200622 {
6816432Sas200622 	{ SMB_OPT_REQUEST,
6826432Sas200622 	    offsetof(smb_session_t, s_req_list.sl_list),
6836432Sas200622 	    "smbreq", "smb_request"},
6846432Sas200622 	{ SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_OFILE | SMB_OPT_ODIR,
6856432Sas200622 	    offsetof(smb_session_t, s_user_list.ll_list),
6866432Sas200622 	    "smbuser", "smb_user"},
6876432Sas200622 	{ 0, 0, NULL, NULL}
6886432Sas200622 };
6896432Sas200622 
6906432Sas200622 static void
smb_dcmd_session_help(void)6916432Sas200622 smb_dcmd_session_help(void)
6926432Sas200622 {
6936432Sas200622 	mdb_printf(
6946432Sas200622 	    "Display the contents of smb_session_t, with optional"
6956432Sas200622 	    " filtering.\n\n");
6966432Sas200622 	(void) mdb_dec_indent(2);
6976432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
6986432Sas200622 	(void) mdb_inc_indent(2);
6996432Sas200622 	mdb_printf(
7006432Sas200622 	    "-v\tDisplay verbose smb_session information\n"
7016432Sas200622 	    "-r\tDisplay the list of smb requests attached\n"
7026432Sas200622 	    "-u\tDisplay the list of users attached\n");
7036432Sas200622 }
7046432Sas200622 
7056432Sas200622 /*
7066432Sas200622  * ::smbsess
7076432Sas200622  *
7086432Sas200622  * smbsess dcmd - Print out the smb_session structure.
7096432Sas200622  */
7106432Sas200622 /*ARGSUSED*/
7116432Sas200622 static int
smb_dcmd_session(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)7126432Sas200622 smb_dcmd_session(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7136432Sas200622 {
7146432Sas200622 	uint_t		opts;
7156432Sas200622 	ulong_t		indent = 0;
7166432Sas200622 
7176432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
7186432Sas200622 		return (DCMD_USAGE);
7196432Sas200622 
7206432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
7216432Sas200622 		opts |= SMB_OPT_SESSION;
7226432Sas200622 		opts &= ~SMB_OPT_SERVER;
7236432Sas200622 		return (smb_obj_list("smb_session", opts, flags));
7246432Sas200622 	}
7256432Sas200622 
7266432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_SESSION)) ||
7276432Sas200622 	    !(opts & SMB_OPT_WALK)) {
7286432Sas200622 		smb_session_t	*se;
7296432Sas200622 		const char	*state;
7306432Sas200622 
7316432Sas200622 		indent = SMB_DCMD_INDENT;
7326432Sas200622 
7336432Sas200622 		se = mdb_alloc(sizeof (*se), UM_SLEEP | UM_GC);
7346432Sas200622 		if (mdb_vread(se, sizeof (*se), addr) == -1) {
7356432Sas200622 			mdb_warn("failed to read smb_session at %p", addr);
7366432Sas200622 			return (DCMD_ERR);
7376432Sas200622 		}
7386432Sas200622 		if (se->s_state >= SMB_SESSION_STATE_SENTINEL)
7396432Sas200622 			state = "INVALID";
7406432Sas200622 		else
7416432Sas200622 			state = smb_session_state[se->s_state];
7426432Sas200622 
7436432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
7446432Sas200622 			mdb_printf("%<b>%<u>SMB session information "
7456432Sas200622 			    "(%p): %</u>%</b>\n", addr);
7466432Sas200622 			mdb_printf("Client IP address: %I\n", se->ipaddr);
7476432Sas200622 			mdb_printf("Local IP Address: %I\n", se->local_ipaddr);
7486432Sas200622 			mdb_printf("Session KID: %u\n", se->s_kid);
7496432Sas200622 			mdb_printf("Workstation Name: %s\n",
7506432Sas200622 			    se->workstation);
7516432Sas200622 			mdb_printf("Session state: %u (%s)\n", se->s_state,
7526432Sas200622 			    state);
7536432Sas200622 			mdb_printf("Number of Users: %u\n",
7546432Sas200622 			    se->s_user_list.ll_count);
7556432Sas200622 			mdb_printf("Number of Trees: %u\n", se->s_tree_cnt);
7566432Sas200622 			mdb_printf("Number of Files: %u\n", se->s_file_cnt);
7576432Sas200622 			mdb_printf("Number of Shares: %u\n", se->s_dir_cnt);
7586432Sas200622 			mdb_printf("Number of active Transact.: %u\n\n",
7596432Sas200622 			    se->s_xa_list.ll_count);
7606432Sas200622 		} else {
7616432Sas200622 			if (DCMD_HDRSPEC(flags))
7626432Sas200622 				mdb_printf(
7636432Sas200622 				    "%<b>%<u>%-?s "
7646432Sas200622 				    "%-16s "
76512508Samw@Sun.COM 				    "%-16s %-16s%</u>%</b>\n",
7666432Sas200622 				    "SESSION", "CLIENT_IP_ADDR",
76712508Samw@Sun.COM 				    "LOCAL_IP_ADDR", "STATE");
7689021Samw@Sun.COM 
7696432Sas200622 			mdb_printf(
77012508Samw@Sun.COM 			    "%-?p %-16I %-16I %s\n", addr, se->ipaddr.a_ipv4,
77112508Samw@Sun.COM 			    se->local_ipaddr.a_ipv4, state);
7725331Samw 		}
7735331Samw 	}
7746432Sas200622 	if (smb_obj_expand(addr, opts, smb_session_exp, indent))
7756432Sas200622 		return (DCMD_ERR);
7766432Sas200622 	return (DCMD_OK);
7776432Sas200622 }
7785331Samw 
7796432Sas200622 /*
7806432Sas200622  * *****************************************************************************
7816432Sas200622  * **************************** smb_request_t **********************************
7826432Sas200622  * *****************************************************************************
7836432Sas200622  */
7846432Sas200622 
7856432Sas200622 static const char *smb_request_state[SMB_REQ_STATE_SENTINEL] =
7866432Sas200622 {
7876432Sas200622 	"FREE",
7886432Sas200622 	"INITIALIZING",
7896432Sas200622 	"SUBMITTED",
7906432Sas200622 	"ACTIVE",
7916432Sas200622 	"WAITING_EVENT",
7926432Sas200622 	"EVENT_OCCURRED",
7936432Sas200622 	"WAITING_LOCK",
7946432Sas200622 	"COMPLETED",
7956432Sas200622 	"CANCELED",
7966432Sas200622 	"CLEANED_UP"
7976432Sas200622 };
7986432Sas200622 
79912508Samw@Sun.COM #define	SMB_REQUEST_BANNER	\
80012508Samw@Sun.COM 	"%<b>%<u>%-?s %-?s %-14s %-14s %-16s %-32s%</u>%</b>\n"
80112508Samw@Sun.COM #define	SMB_REQUEST_FORMAT	\
80212890SJoyce.McIntosh@Sun.COM 	"%-?p %-?p %-14lld %-14lld %-16s %s\n"
80312508Samw@Sun.COM 
8046432Sas200622 static int
smb_dcmd_request(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)8056432Sas200622 smb_dcmd_request(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
8066432Sas200622 {
8076432Sas200622 	uint_t		opts;
8086432Sas200622 
8096432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
8106432Sas200622 		return (DCMD_USAGE);
8116432Sas200622 
8126432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
8136432Sas200622 		opts |= SMB_OPT_REQUEST;
8146432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_USER);
8156432Sas200622 		return (smb_obj_list("smb_request", opts, flags));
8166432Sas200622 	}
8176432Sas200622 
8186432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_REQUEST)) ||
8196432Sas200622 	    !(opts & SMB_OPT_WALK)) {
8206432Sas200622 		smb_request_t	*sr;
8216432Sas200622 		const char	*state;
82212508Samw@Sun.COM 		uint64_t	waiting;
82312508Samw@Sun.COM 		uint64_t	running;
8246432Sas200622 
8256432Sas200622 		sr = mdb_alloc(sizeof (*sr), UM_SLEEP | UM_GC);
8266432Sas200622 		if (mdb_vread(sr, sizeof (*sr), addr) == -1) {
8276432Sas200622 			mdb_warn("failed to read smb_request at %p", addr);
8286432Sas200622 			return (DCMD_ERR);
8296432Sas200622 		}
83012508Samw@Sun.COM 		if (sr->sr_magic != SMB_REQ_MAGIC) {
83112508Samw@Sun.COM 			mdb_warn("not an smb_request_t (%p)>", addr);
83212508Samw@Sun.COM 			return (DCMD_ERR);
83312508Samw@Sun.COM 		}
83412508Samw@Sun.COM 		waiting = 0;
83512508Samw@Sun.COM 		running = 0;
83612508Samw@Sun.COM 		if (sr->sr_time_submitted != 0) {
83712508Samw@Sun.COM 			if (sr->sr_time_active != 0) {
83812508Samw@Sun.COM 				waiting = sr->sr_time_active -
83912508Samw@Sun.COM 				    sr->sr_time_submitted;
84012508Samw@Sun.COM 				running = mdb_gethrtime() -
84112508Samw@Sun.COM 				    sr->sr_time_active;
84212508Samw@Sun.COM 			} else {
84312508Samw@Sun.COM 				waiting = mdb_gethrtime() -
84412508Samw@Sun.COM 				    sr->sr_time_submitted;
84512508Samw@Sun.COM 			}
84612508Samw@Sun.COM 		}
84712508Samw@Sun.COM 		waiting /= NANOSEC;
84812508Samw@Sun.COM 		running /= NANOSEC;
8496432Sas200622 
8506432Sas200622 		if (sr->sr_state >= SMB_REQ_STATE_SENTINEL)
8516432Sas200622 			state = "INVALID";
8526432Sas200622 		else
8536432Sas200622 			state = smb_request_state[sr->sr_state];
8546432Sas200622 
8556432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
8566432Sas200622 			mdb_printf(
8579021Samw@Sun.COM 			    "%</b>%</u>SMB request information (%p):"
8586432Sas200622 			    "%</u>%</b>\n\n", addr);
85912508Samw@Sun.COM 
86012508Samw@Sun.COM 			mdb_printf(
86112508Samw@Sun.COM 			    "first SMB COM: %u (%s)\n"
86212508Samw@Sun.COM 			    "current SMB COM: %u (%s)\n"
86312508Samw@Sun.COM 			    "state: %u (%s)\n"
86412508Samw@Sun.COM 			    "TID(tree): %u (%p)\n"
86512508Samw@Sun.COM 			    "UID(user): %u (%p)\n"
86612508Samw@Sun.COM 			    "FID(file): %u (%p)\n"
86712508Samw@Sun.COM 			    "PID: %u\n"
86812508Samw@Sun.COM 			    "MID: %u\n\n"
86912890SJoyce.McIntosh@Sun.COM 			    "waiting time: %lld\n"
87012890SJoyce.McIntosh@Sun.COM 			    "running time: %lld\n",
87112890SJoyce.McIntosh@Sun.COM 			    sr->first_smb_com,
87212890SJoyce.McIntosh@Sun.COM 			    smb_com[sr->first_smb_com].smb_com,
87312890SJoyce.McIntosh@Sun.COM 			    sr->smb_com,
87412890SJoyce.McIntosh@Sun.COM 			    smb_com[sr->smb_com].smb_com,
87512508Samw@Sun.COM 			    sr->sr_state, state,
87612508Samw@Sun.COM 			    sr->smb_tid, sr->tid_tree,
87712508Samw@Sun.COM 			    sr->smb_uid, sr->uid_user,
87812508Samw@Sun.COM 			    sr->smb_fid, sr->fid_ofile,
87912508Samw@Sun.COM 			    sr->smb_pid,
88012508Samw@Sun.COM 			    sr->smb_mid,
88112508Samw@Sun.COM 			    waiting,
88212508Samw@Sun.COM 			    running);
88312508Samw@Sun.COM 
8849021Samw@Sun.COM 			smb_worker_findstack((uintptr_t)sr->sr_worker);
8856432Sas200622 		} else {
8866432Sas200622 			if (DCMD_HDRSPEC(flags))
8876432Sas200622 				mdb_printf(
88812508Samw@Sun.COM 				    SMB_REQUEST_BANNER,
88912508Samw@Sun.COM 				    "ADDR",
89012508Samw@Sun.COM 				    "WORKER",
89112508Samw@Sun.COM 				    "WAITING(s)",
89212508Samw@Sun.COM 				    "RUNNING(s)",
89312508Samw@Sun.COM 				    "STATE",
89412508Samw@Sun.COM 				    "COMMAND");
8956432Sas200622 
89612508Samw@Sun.COM 			mdb_printf(SMB_REQUEST_FORMAT,
89712508Samw@Sun.COM 			    addr,
89812508Samw@Sun.COM 			    sr->sr_worker,
89912508Samw@Sun.COM 			    waiting,
90012508Samw@Sun.COM 			    running,
90112508Samw@Sun.COM 			    state,
90212890SJoyce.McIntosh@Sun.COM 			    smb_com[sr->smb_com].smb_com);
9036432Sas200622 		}
9046432Sas200622 	}
9056432Sas200622 	return (DCMD_OK);
9066432Sas200622 }
9076432Sas200622 
9086432Sas200622 /*
9096432Sas200622  * *****************************************************************************
9106432Sas200622  * ****************************** smb_user_t ***********************************
9116432Sas200622  * *****************************************************************************
9126432Sas200622  */
9136432Sas200622 
9146432Sas200622 static const char *smb_user_state[SMB_USER_STATE_SENTINEL] =
9156432Sas200622 {
9166432Sas200622 	"LOGGED_IN",
9176432Sas200622 	"LOGGING_OFF",
9186432Sas200622 	"LOGGED_OFF"
9196432Sas200622 };
9206432Sas200622 
9216432Sas200622 /*
9226432Sas200622  * List of objects that can be expanded under a user structure.
9236432Sas200622  */
9246432Sas200622 static const smb_exp_t smb_user_exp[] =
9256432Sas200622 {
9266432Sas200622 	{ SMB_OPT_TREE | SMB_OPT_OFILE | SMB_OPT_ODIR,
9276432Sas200622 	    offsetof(smb_user_t, u_tree_list.ll_list),
9286432Sas200622 	    "smbtree", "smb_tree"},
9296432Sas200622 	{ 0, 0, NULL, NULL}
9306432Sas200622 };
9316432Sas200622 
9326432Sas200622 static void
smb_dcmd_user_help(void)9336432Sas200622 smb_dcmd_user_help(void)
9346432Sas200622 {
9356432Sas200622 	mdb_printf(
9366432Sas200622 	    "Display the contents of smb_user_t, with optional filtering.\n\n");
9376432Sas200622 	(void) mdb_dec_indent(2);
9386432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
9396432Sas200622 	(void) mdb_inc_indent(2);
9406432Sas200622 	mdb_printf(
9416432Sas200622 	    "-v\tDisplay verbose smb_user information\n"
9426432Sas200622 	    "-d\tDisplay the list of smb_odirs attached\n"
9436432Sas200622 	    "-f\tDisplay the list of smb_ofiles attached\n"
9446432Sas200622 	    "-t\tDisplay the list of smb_trees attached\n");
9455331Samw }
9465331Samw 
9475331Samw static int
smb_dcmd_user(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)9486432Sas200622 smb_dcmd_user(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9495331Samw {
9506432Sas200622 	uint_t		opts;
9516432Sas200622 	ulong_t		indent = 0;
9526432Sas200622 
9536432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
9546432Sas200622 		return (DCMD_USAGE);
9556432Sas200622 
9566432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
9576432Sas200622 		opts |= SMB_OPT_USER;
9586432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST);
9596432Sas200622 		return (smb_obj_list("smb_user", opts, flags));
9606432Sas200622 	}
9616432Sas200622 
9626432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_USER)) ||
9636432Sas200622 	    !(opts & SMB_OPT_WALK)) {
9646432Sas200622 		smb_user_t	*user;
9656432Sas200622 		char		*account;
9666432Sas200622 
9676432Sas200622 		indent = SMB_DCMD_INDENT;
9686432Sas200622 
9696432Sas200622 		user = mdb_alloc(sizeof (*user), UM_SLEEP | UM_GC);
9706432Sas200622 		if (mdb_vread(user, sizeof (*user), addr) == -1) {
9716432Sas200622 			mdb_warn("failed to read smb_user at %p", addr);
9726432Sas200622 			return (DCMD_ERR);
9736432Sas200622 		}
9746432Sas200622 		account = mdb_zalloc(user->u_domain_len + user->u_name_len + 2,
9756432Sas200622 		    UM_SLEEP | UM_GC);
9766432Sas200622 
9776432Sas200622 		if (user->u_domain_len)
9786432Sas200622 			(void) mdb_vread(account, user->u_domain_len,
9796432Sas200622 			    (uintptr_t)user->u_domain);
9806432Sas200622 
9816432Sas200622 		strcat(account, "\\");
9826432Sas200622 
9836432Sas200622 		if (user->u_name_len)
9846432Sas200622 			(void) mdb_vread(account + strlen(account),
9856432Sas200622 			    user->u_name_len, (uintptr_t)user->u_name);
9866432Sas200622 
9876432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
9886432Sas200622 			const char	*state;
9896432Sas200622 
9906432Sas200622 			if (user->u_state >= SMB_USER_STATE_SENTINEL)
9916432Sas200622 				state = "INVALID";
9926432Sas200622 			else
9936432Sas200622 				state = smb_user_state[user->u_state];
9946432Sas200622 
9956432Sas200622 			mdb_printf("%<b>%<u>SMB user information (%p):"
9966432Sas200622 			    "%</u>%</b>\n", addr);
9976432Sas200622 			mdb_printf("UID: %u\n", user->u_uid);
9986432Sas200622 			mdb_printf("State: %d (%s)\n", user->u_state, state);
9996432Sas200622 			mdb_printf("Flags: 0x%08x\n", user->u_flags);
10006432Sas200622 			mdb_printf("Privileges: 0x%08x\n", user->u_privileges);
10016432Sas200622 			mdb_printf("Credential: %p\n", user->u_cred);
10026432Sas200622 			mdb_printf("Reference Count: %d\n", user->u_refcnt);
10036432Sas200622 			mdb_printf("User Account: %s\n\n", account);
10046432Sas200622 		} else {
10056432Sas200622 			if (DCMD_HDRSPEC(flags))
10066432Sas200622 				mdb_printf(
10076432Sas200622 				    "%<b>%<u>%?-s "
10086432Sas200622 				    "%-5s "
10096432Sas200622 				    "%-32s%</u>%</b>\n",
10106432Sas200622 				    "USER", "UID", "ACCOUNT");
10116432Sas200622 
10126432Sas200622 			mdb_printf("%-?p %-5u %-32s\n", addr, user->u_uid,
10136432Sas200622 			    account);
10146432Sas200622 		}
10156432Sas200622 	}
10166432Sas200622 	if (smb_obj_expand(addr, opts, smb_user_exp, indent))
10176432Sas200622 		return (DCMD_ERR);
10186432Sas200622 	return (DCMD_OK);
10195331Samw }
10205331Samw 
10215331Samw /*
10226432Sas200622  * *****************************************************************************
10236432Sas200622  * ****************************** smb_tree_t ***********************************
10246432Sas200622  * *****************************************************************************
10255331Samw  */
10266432Sas200622 
10276432Sas200622 static const char *smb_tree_state[SMB_TREE_STATE_SENTINEL] =
10286432Sas200622 {
10296432Sas200622 	"CONNECTED",
10306432Sas200622 	"DISCONNECTING",
10316432Sas200622 	"DISCONNECTED"
10326432Sas200622 };
10336432Sas200622 
10346432Sas200622 /*
10356432Sas200622  * List of objects that can be expanded under a tree structure.
10366432Sas200622  */
10376432Sas200622 static const smb_exp_t smb_tree_exp[] =
10385331Samw {
10396432Sas200622 	{ SMB_OPT_OFILE,
10406432Sas200622 	    offsetof(smb_tree_t, t_ofile_list.ll_list),
10416432Sas200622 	    "smbofile", "smb_ofile"},
10426432Sas200622 	{ SMB_OPT_ODIR,
10436432Sas200622 	    offsetof(smb_tree_t, t_odir_list.ll_list),
10446432Sas200622 	    "smbodir", "smb_odir"},
10456432Sas200622 	{ 0, 0, NULL, NULL}
10466432Sas200622 };
10475331Samw 
10486432Sas200622 static void
smb_dcmd_tree_help(void)10496432Sas200622 smb_dcmd_tree_help(void)
10506432Sas200622 {
10516432Sas200622 	mdb_printf(
10526432Sas200622 	    "Display the contents of smb_tree_t, with optional filtering.\n\n");
10536432Sas200622 	(void) mdb_dec_indent(2);
10546432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
10556432Sas200622 	(void) mdb_inc_indent(2);
10566432Sas200622 	mdb_printf(
10576432Sas200622 	    "-v\tDisplay verbose smb_tree information\n"
10586432Sas200622 	    "-d\tDisplay the list of smb_odirs attached\n"
10596432Sas200622 	    "-f\tDisplay the list of smb_ofiles attached\n");
10606432Sas200622 }
10616432Sas200622 
10626432Sas200622 static int
smb_dcmd_tree(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)10636432Sas200622 smb_dcmd_tree(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
10646432Sas200622 {
10656432Sas200622 	uint_t		opts;
10666432Sas200622 	ulong_t		indent = 0;
10676432Sas200622 
10686432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
10695331Samw 		return (DCMD_USAGE);
10705331Samw 
10716432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
10726432Sas200622 		opts |= SMB_OPT_TREE;
10736432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST |
10746432Sas200622 		    SMB_OPT_USER);
10756432Sas200622 		return (smb_obj_list("smb_tree", opts, flags));
10766139Sjb150015 	}
10775331Samw 
10786432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_TREE)) ||
10796432Sas200622 	    !(opts & SMB_OPT_WALK)) {
10806432Sas200622 		smb_tree_t	*tree;
10816432Sas200622 
10826432Sas200622 		indent = SMB_DCMD_INDENT;
10836139Sjb150015 
10846432Sas200622 		tree = mdb_alloc(sizeof (*tree), UM_SLEEP | UM_GC);
10856432Sas200622 		if (mdb_vread(tree, sizeof (*tree), addr) == -1) {
10866432Sas200622 			mdb_warn("failed to read smb_tree at %p", addr);
10876432Sas200622 			return (DCMD_ERR);
10886432Sas200622 		}
10896432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
10906432Sas200622 			const char	*state;
10916432Sas200622 
10926432Sas200622 			if (tree->t_state >= SMB_TREE_STATE_SENTINEL)
10936432Sas200622 				state = "INVALID";
10946432Sas200622 			else
10956432Sas200622 				state = smb_tree_state[tree->t_state];
10965331Samw 
10976432Sas200622 			mdb_printf("%<b>%<u>SMB tree information (%p):"
10986432Sas200622 			    "%</u>%</b>\n\n", addr);
10996432Sas200622 			mdb_printf("TID: %04x\n", tree->t_tid);
11006432Sas200622 			mdb_printf("State: %d (%s)\n", tree->t_state, state);
11017348SJose.Borrego@Sun.COM 			mdb_printf("Share: %s\n", tree->t_sharename);
11026432Sas200622 			mdb_printf("Resource: %s\n", tree->t_resource);
11037348SJose.Borrego@Sun.COM 			mdb_printf("Type: %s\n", tree->t_typename);
11047348SJose.Borrego@Sun.COM 			mdb_printf("Volume: %s\n", tree->t_volume);
11056432Sas200622 			mdb_printf("Umask: %04x\n", tree->t_umask);
11066432Sas200622 			mdb_printf("Flags: %08x\n", tree->t_flags);
11076432Sas200622 			mdb_printf("SMB Node: %llx\n", tree->t_snode);
11086432Sas200622 			mdb_printf("Reference Count: %d\n\n", tree->t_refcnt);
11096432Sas200622 		} else {
11106432Sas200622 			if (DCMD_HDRSPEC(flags))
11116432Sas200622 				mdb_printf(
11126432Sas200622 				    "%<b>%<u>%-?s %-5s %-16s %-32s%</u>%</b>\n",
11136432Sas200622 				    "TREE", "TID", "SHARE NAME", "RESOURCE");
11146432Sas200622 
11156432Sas200622 			mdb_printf("%-?p %-5u %-16s %-32s\n", addr,
11166432Sas200622 			    tree->t_tid, tree->t_sharename, tree->t_resource);
11176432Sas200622 		}
11185331Samw 	}
11196432Sas200622 	if (smb_obj_expand(addr, opts, smb_tree_exp, indent))
11206432Sas200622 		return (DCMD_ERR);
11215331Samw 	return (DCMD_OK);
11225331Samw }
11235331Samw 
11246432Sas200622 /*
11256432Sas200622  * *****************************************************************************
11266432Sas200622  * ****************************** smb_odir_t ***********************************
11276432Sas200622  * *****************************************************************************
11286432Sas200622  */
11296432Sas200622 
11306432Sas200622 static const char *smb_odir_state[SMB_ODIR_STATE_SENTINEL] =
11315331Samw {
11326432Sas200622 	"OPEN",
113311963SAfshin.Ardakani@Sun.COM 	"IN_USE",
11346432Sas200622 	"CLOSING",
11356432Sas200622 	"CLOSED"
11366432Sas200622 };
11375331Samw 
11386432Sas200622 static int
smb_dcmd_odir(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)11396432Sas200622 smb_dcmd_odir(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
11406432Sas200622 {
11416432Sas200622 	uint_t		opts;
11426432Sas200622 
11436432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
11446432Sas200622 		return (DCMD_USAGE);
11456432Sas200622 
11466432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
11476432Sas200622 		opts |= SMB_OPT_ODIR;
11486432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST |
11496432Sas200622 		    SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_OFILE);
11506432Sas200622 		return (smb_obj_list("smb_odir", opts, flags));
11515331Samw 	}
11525331Samw 
11536432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_ODIR)) ||
11546432Sas200622 	    !(opts & SMB_OPT_WALK)) {
11556432Sas200622 		smb_odir_t	*od;
11566432Sas200622 
11576432Sas200622 		od = mdb_alloc(sizeof (*od), UM_SLEEP | UM_GC);
11586432Sas200622 		if (mdb_vread(od, sizeof (*od), addr) == -1) {
11596432Sas200622 			mdb_warn("failed to read smb_odir at %p", addr);
11606432Sas200622 			return (DCMD_ERR);
11616432Sas200622 		}
11626432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
11636432Sas200622 			const char	*state;
11646432Sas200622 
11656432Sas200622 			if (od->d_state >= SMB_ODIR_STATE_SENTINEL)
11666432Sas200622 				state = "INVALID";
11676432Sas200622 			else
11686432Sas200622 				state = smb_odir_state[od->d_state];
11696432Sas200622 
11706432Sas200622 			mdb_printf(
11716432Sas200622 			    "%<b>%<u>SMB odir information (%p):%</u>%</b>\n\n",
11726432Sas200622 			    addr);
11736432Sas200622 			mdb_printf("State: %d (%s)\n", od->d_state, state);
11748670SJose.Borrego@Sun.COM 			mdb_printf("SID: %u\n", od->d_odid);
11756432Sas200622 			mdb_printf("Reference Count: %d\n", od->d_refcnt);
11766432Sas200622 			mdb_printf("Pattern: %s\n", od->d_pattern);
11778670SJose.Borrego@Sun.COM 			mdb_printf("SMB Node: %p\n\n", od->d_dnode);
11786432Sas200622 		} else {
11796432Sas200622 			if (DCMD_HDRSPEC(flags))
11806432Sas200622 				mdb_printf(
118110504SKeyur.Desai@Sun.COM 				    "%<b>%<u>%-?s "
11826432Sas200622 				    "%-5s "
11836432Sas200622 				    "%-?s "
118410504SKeyur.Desai@Sun.COM 				    "%-16s%</u>%</b>\n",
11856432Sas200622 				    "ODIR", "SID", "VNODE", "PATTERN");
11866432Sas200622 
118710504SKeyur.Desai@Sun.COM 			mdb_printf("%?p %-5u %-16p %s\n",
11888670SJose.Borrego@Sun.COM 			    addr, od->d_odid, od->d_dnode, od->d_pattern);
11895331Samw 		}
11905331Samw 	}
11916432Sas200622 	return (DCMD_OK);
11925331Samw }
11935331Samw 
11946432Sas200622 /*
11956432Sas200622  * *****************************************************************************
11966432Sas200622  * ****************************** smb_ofile_t **********************************
11976432Sas200622  * *****************************************************************************
11986432Sas200622  */
11996432Sas200622 
12006432Sas200622 static const char *smb_ofile_state[SMB_OFILE_STATE_SENTINEL] =
12016432Sas200622 {
12026432Sas200622 	"OPEN",
12036432Sas200622 	"CLOSING",
12046432Sas200622 	"CLOSED"
12056432Sas200622 };
12066432Sas200622 
12076432Sas200622 static int
smb_dcmd_ofile(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)12086432Sas200622 smb_dcmd_ofile(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
12096432Sas200622 {
12106432Sas200622 	uint_t		opts;
12116432Sas200622 
12126432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
12136432Sas200622 		return (DCMD_USAGE);
12146432Sas200622 
12156432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
12166432Sas200622 		opts |= SMB_OPT_OFILE;
12176432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST |
12186432Sas200622 		    SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_ODIR);
12196432Sas200622 		return (smb_obj_list("smb_ofile", opts, flags));
12206432Sas200622 	}
12216432Sas200622 
12226432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_OFILE)) ||
12236432Sas200622 	    !(opts & SMB_OPT_WALK)) {
12246432Sas200622 		smb_ofile_t	*of;
12256432Sas200622 
12266432Sas200622 		of = mdb_alloc(sizeof (*of), UM_SLEEP | UM_GC);
12276432Sas200622 		if (mdb_vread(of, sizeof (*of), addr) == -1) {
12286432Sas200622 			mdb_warn("failed to read smb_ofile at %p", addr);
12296432Sas200622 			return (DCMD_ERR);
12306432Sas200622 		}
12316432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
12326432Sas200622 			const char	*state;
12336432Sas200622 
12346432Sas200622 			if (of->f_state >= SMB_ODIR_STATE_SENTINEL)
12356432Sas200622 				state = "INVALID";
12366432Sas200622 			else
12376432Sas200622 				state = smb_ofile_state[of->f_state];
12386432Sas200622 
12396432Sas200622 			mdb_printf(
12406432Sas200622 			    "%<b>%<u>SMB ofile information (%p):%</u>%</b>\n\n",
12416432Sas200622 			    addr);
12426432Sas200622 			mdb_printf("FID: %u\n", of->f_fid);
12436432Sas200622 			mdb_printf("State: %d (%s)\n", of->f_state, state);
12446432Sas200622 			mdb_printf("SMB Node: %p\n", of->f_node);
12456432Sas200622 			mdb_printf("LLF Offset: 0x%llx (%s)\n",
12466432Sas200622 			    of->f_llf_pos,
12476432Sas200622 			    ((of->f_flags & SMB_OFLAGS_LLF_POS_VALID) ?
12486432Sas200622 			    "Valid" : "Invalid"));
12496432Sas200622 			mdb_printf("Flags: 0x%08x\n", of->f_flags);
12506432Sas200622 			mdb_printf("Credential: %p\n\n", of->f_cr);
12516432Sas200622 		} else {
12526432Sas200622 			if (DCMD_HDRSPEC(flags))
12536432Sas200622 				mdb_printf(
12546432Sas200622 				    "%<b>%<u>%-?s "
12556432Sas200622 				    "%-5s "
12566432Sas200622 				    "%-?s "
12576432Sas200622 				    "%-?s%</u>%</b>\n",
12586432Sas200622 				    "OFILE", "FID", "SMB NODE", "CRED");
12596432Sas200622 
12606432Sas200622 			mdb_printf("%?p %-5u %-p %p\n", addr,
12616432Sas200622 			    of->f_fid, of->f_node, of->f_cr);
12626432Sas200622 		}
12636432Sas200622 	}
12646432Sas200622 	return (DCMD_OK);
12656432Sas200622 }
12666432Sas200622 
12676432Sas200622 /*
12686432Sas200622  * *****************************************************************************
126912508Samw@Sun.COM  * ******************************** smb_vfs_t **********************************
127012508Samw@Sun.COM  * *****************************************************************************
127112508Samw@Sun.COM  */
127212508Samw@Sun.COM 
127312508Samw@Sun.COM /*
127412508Samw@Sun.COM  * ::smbvfs
127512508Samw@Sun.COM  *
127612508Samw@Sun.COM  * smbvfs dcmd - Prints out smb_vfs structures.
127712508Samw@Sun.COM  */
127812508Samw@Sun.COM /*ARGSUSED*/
127912508Samw@Sun.COM static int
smb_vfs(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)128012508Samw@Sun.COM smb_vfs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
128112508Samw@Sun.COM {
128212508Samw@Sun.COM 	int		verbose = FALSE;
128312508Samw@Sun.COM 	smb_vfs_t	*sf;
128412508Samw@Sun.COM 	vnode_t		*vn;
128512508Samw@Sun.COM 	char		*path;
128612508Samw@Sun.COM 
128712508Samw@Sun.COM 	if (mdb_getopts(argc, argv,
128812508Samw@Sun.COM 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
128912508Samw@Sun.COM 	    NULL) != argc)
129012508Samw@Sun.COM 		return (DCMD_USAGE);
129112508Samw@Sun.COM 
129212508Samw@Sun.COM 	/*
129312508Samw@Sun.COM 	 * If no smb_vfs address was specified on the command line, we can
129412508Samw@Sun.COM 	 * print out all smb_vfs by invoking the smb_vfs walker, using
129512508Samw@Sun.COM 	 * this dcmd itself as the callback.
129612508Samw@Sun.COM 	 */
129712508Samw@Sun.COM 	if (!(flags & DCMD_ADDRSPEC)) {
129812508Samw@Sun.COM 		if (mdb_walk_dcmd("smbvfs_walker", "smbvfs",
129912508Samw@Sun.COM 		    argc, argv) == -1) {
130012508Samw@Sun.COM 			mdb_warn("failed to walk 'smb_vfs'");
130112508Samw@Sun.COM 			return (DCMD_ERR);
130212508Samw@Sun.COM 		}
130312508Samw@Sun.COM 		return (DCMD_OK);
130412508Samw@Sun.COM 	}
130512508Samw@Sun.COM 
130612508Samw@Sun.COM 	if (DCMD_HDRSPEC(flags)) {
130712508Samw@Sun.COM 		mdb_printf(
130812508Samw@Sun.COM 		    "%<b>%<u>"
130912508Samw@Sun.COM 		    "%-?s "
131012508Samw@Sun.COM 		    "%-10s "
131112508Samw@Sun.COM 		    "%-16s "
131212508Samw@Sun.COM 		    "%-16s"
131312508Samw@Sun.COM 		    "%-s"
131412508Samw@Sun.COM 		    "%</u>%</b>\n",
131512508Samw@Sun.COM 		    "SMB_VFS", "REFCNT", "VFS", "VNODE", "ROOT");
131612508Samw@Sun.COM 	}
131712508Samw@Sun.COM 
131812508Samw@Sun.COM 	sf = mdb_alloc(sizeof (*sf), UM_SLEEP | UM_GC);
131912508Samw@Sun.COM 	if (mdb_vread(sf, sizeof (*sf), addr) == -1) {
132012508Samw@Sun.COM 		mdb_warn("failed to read smb_vfs at %p", addr);
132112508Samw@Sun.COM 		return (DCMD_ERR);
132212508Samw@Sun.COM 	}
132312508Samw@Sun.COM 
132412508Samw@Sun.COM 	vn = mdb_alloc(sizeof (*vn), UM_SLEEP | UM_GC);
132512508Samw@Sun.COM 	if (mdb_vread(vn, sizeof (*vn),
132612508Samw@Sun.COM 	    (uintptr_t)sf->sv_rootvp) == -1) {
132712508Samw@Sun.COM 		mdb_warn("failed to read vnode at %p", sf->sv_rootvp);
132812508Samw@Sun.COM 		return (DCMD_ERR);
132912508Samw@Sun.COM 	}
133012508Samw@Sun.COM 
133112508Samw@Sun.COM 	path = mdb_zalloc(MAXPATHLEN, UM_SLEEP | UM_GC);
133212508Samw@Sun.COM 	(void) mdb_vread(path, MAXPATHLEN, (uintptr_t)vn->v_path);
133312508Samw@Sun.COM 
133412508Samw@Sun.COM 	mdb_printf(
133512508Samw@Sun.COM 	    "%-?p %-10d %-?p %-?p %-s\n", addr, sf->sv_refcnt,
133612508Samw@Sun.COM 	    sf->sv_vfsp, sf->sv_rootvp, path);
133712508Samw@Sun.COM 
133812508Samw@Sun.COM 	return (DCMD_OK);
133912508Samw@Sun.COM }
134012508Samw@Sun.COM 
134112508Samw@Sun.COM /*
134212508Samw@Sun.COM  * Initialize the smb_vfs_t walker by reading the value of smb_export
134312508Samw@Sun.COM  * in the kernel's symbol table. Only global walk supported.
134412508Samw@Sun.COM  */
134512508Samw@Sun.COM static int
smb_vfs_walk_init(mdb_walk_state_t * wsp)134612508Samw@Sun.COM smb_vfs_walk_init(mdb_walk_state_t *wsp)
134712508Samw@Sun.COM {
134812508Samw@Sun.COM 	GElf_Sym	sym;
134912508Samw@Sun.COM 
135012508Samw@Sun.COM 	if (wsp->walk_addr != NULL) {
135112508Samw@Sun.COM 		mdb_printf("smb_vfs walk only supports global walks\n");
135212508Samw@Sun.COM 		return (WALK_ERR);
135312508Samw@Sun.COM 	}
135412508Samw@Sun.COM 
135512508Samw@Sun.COM 	if (mdb_lookup_by_name("smb_export", &sym) == -1) {
135612508Samw@Sun.COM 		mdb_warn("failed to find 'smb_export'");
135712508Samw@Sun.COM 		return (WALK_ERR);
135812508Samw@Sun.COM 	}
135912508Samw@Sun.COM 
136012508Samw@Sun.COM 	wsp->walk_addr = (uintptr_t)sym.st_value +
136112508Samw@Sun.COM 	    offsetof(smb_export_t, e_vfs_list) + offsetof(smb_llist_t, ll_list);
136212508Samw@Sun.COM 
136312508Samw@Sun.COM 	if (mdb_layered_walk("list", wsp) == -1) {
136412508Samw@Sun.COM 		mdb_warn("failed to walk list of VFS");
136512508Samw@Sun.COM 		return (WALK_ERR);
136612508Samw@Sun.COM 	}
136712508Samw@Sun.COM 
136812508Samw@Sun.COM 	return (WALK_NEXT);
136912508Samw@Sun.COM }
137012508Samw@Sun.COM 
137112508Samw@Sun.COM static int
smb_vfs_walk_step(mdb_walk_state_t * wsp)137212508Samw@Sun.COM smb_vfs_walk_step(mdb_walk_state_t *wsp)
137312508Samw@Sun.COM {
137412508Samw@Sun.COM 	return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer,
137512508Samw@Sun.COM 	    wsp->walk_cbdata));
137612508Samw@Sun.COM }
137712508Samw@Sun.COM 
137812508Samw@Sun.COM /*
137912508Samw@Sun.COM  * *****************************************************************************
13806432Sas200622  * ******************************* smb_node_t **********************************
13816432Sas200622  * *****************************************************************************
13826432Sas200622  */
13836432Sas200622 
13845331Samw static void
smb_node_help(void)13855331Samw smb_node_help(void)
13865331Samw {
13875331Samw 	mdb_printf(
13885331Samw 	    "Display the contents of smb_node_t, with optional filtering.\n\n");
13896432Sas200622 	(void) mdb_dec_indent(2);
13905331Samw 	mdb_printf("%<b>OPTIONS%</b>\n");
13916432Sas200622 	(void) mdb_inc_indent(2);
13925331Samw 	mdb_printf(
13935331Samw 	    "-v\tDisplay verbose smb_node information\n"
13945331Samw 	    "-p\tDisplay the full path of the vnode associated\n"
13955331Samw 	    "-s\tDisplay the stack of the last 16 calls that modified the "
13965331Samw 	    "reference\n\tcount\n");
13975331Samw }
13985331Samw 
13995331Samw /*
14006432Sas200622  * ::smbnode
14015331Samw  *
14025331Samw  * smb_node dcmd - Print out smb_node structure.
14035331Samw  */
14045331Samw static int
smb_node(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)14055331Samw smb_node(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
14065331Samw {
14075331Samw 	smb_node_t	node;
140812890SJoyce.McIntosh@Sun.COM 	int		rc;
14095331Samw 	int		verbose = FALSE;
14105331Samw 	int		print_full_path = FALSE;
14115331Samw 	int		stack_trace = FALSE;
14125331Samw 	vnode_t		vnode;
14135331Samw 	char		od_name[MAXNAMELEN];
14145331Samw 	char		path_name[1024];
141512890SJoyce.McIntosh@Sun.COM 	uintptr_t	list_addr, oplock_addr;
14165331Samw 
14175331Samw 	if (mdb_getopts(argc, argv,
14185331Samw 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
14195331Samw 	    'p', MDB_OPT_SETBITS, TRUE, &print_full_path,
14205331Samw 	    's', MDB_OPT_SETBITS, TRUE, &stack_trace,
14215331Samw 	    NULL) != argc)
14225331Samw 		return (DCMD_USAGE);
14235331Samw 
14245331Samw 	/*
14255331Samw 	 * If no smb_node address was specified on the command line, we can
14265331Samw 	 * print out all smb nodes by invoking the smb_node walker, using
14275331Samw 	 * this dcmd itself as the callback.
14285331Samw 	 */
14295331Samw 	if (!(flags & DCMD_ADDRSPEC)) {
14306432Sas200622 		if (mdb_walk_dcmd("smbnode_walker", "smbnode",
14315331Samw 		    argc, argv) == -1) {
14325331Samw 			mdb_warn("failed to walk 'smb_node'");
14335331Samw 			return (DCMD_ERR);
14345331Samw 		}
14355331Samw 		return (DCMD_OK);
14365331Samw 	}
14375331Samw 
14385331Samw 	/*
14395331Samw 	 * If this is the first invocation of the command, print a nice
14405331Samw 	 * header line for the output that will follow.
14415331Samw 	 */
14425331Samw 	if (DCMD_HDRSPEC(flags)) {
14436432Sas200622 		if (verbose) {
14446432Sas200622 			mdb_printf("%<b>%<u>SMB node information:%</u>%</b>\n");
14456432Sas200622 		} else {
14466432Sas200622 			mdb_printf(
14476432Sas200622 			    "%<b>%<u>%-?s "
14486432Sas200622 			    "%-?s "
14496432Sas200622 			    "%-18s "
14506432Sas200622 			    "%-6s "
14516432Sas200622 			    "%-6s "
145212890SJoyce.McIntosh@Sun.COM 			    "%-8s "
14536432Sas200622 			    "%-6s%</u>%</b>\n",
14546432Sas200622 			    "ADDR", "VP", "NODE-NAME", "OFILES", "LOCKS",
145512890SJoyce.McIntosh@Sun.COM 			    "OPLOCK", "REF");
14566432Sas200622 		}
14575331Samw 	}
14585331Samw 
14595331Samw 	/*
14606432Sas200622 	 * For each smb_node, we just need to read the smb_node_t struct, read
14616432Sas200622 	 * and then print out the following fields.
14625331Samw 	 */
14635331Samw 	if (mdb_vread(&node, sizeof (node), addr) == sizeof (node)) {
14646432Sas200622 		(void) mdb_snprintf(od_name, sizeof (od_name), "%s",
14656432Sas200622 		    node.od_name);
14665331Samw 		if (print_full_path) {
14675331Samw 			if (mdb_vread(&vnode, sizeof (vnode_t),
14686432Sas200622 			    (uintptr_t)node.vp) == sizeof (vnode_t)) {
14696432Sas200622 				if (mdb_readstr(path_name, sizeof (path_name),
14705331Samw 				    (uintptr_t)vnode.v_path) != 0) {
14715331Samw 					(void) mdb_snprintf(od_name,
14726432Sas200622 					    sizeof (od_name), "N/A");
14735331Samw 				}
14745331Samw 			}
14755331Samw 		}
14765331Samw 		if (verbose) {
14776432Sas200622 			mdb_printf("VP: %p\n", node.vp);
14786432Sas200622 			mdb_printf("Name: %s\n", od_name);
14796432Sas200622 			if (print_full_path)
14806432Sas200622 				mdb_printf("V-node Path: %s\n", path_name);
14816432Sas200622 			mdb_printf("Ofiles: %u\n", node.n_ofile_list.ll_count);
14826432Sas200622 			mdb_printf("Range Locks: %u\n",
14835331Samw 			    node.n_lock_list.ll_count);
14845331Samw 			if (node.n_lock_list.ll_count != 0) {
14855331Samw 				(void) mdb_inc_indent(SMB_DCMD_INDENT);
14865331Samw 				list_addr = addr +
14875331Samw 				    offsetof(smb_node_t, n_lock_list) +
14885331Samw 				    offsetof(smb_llist_t, ll_list);
14896432Sas200622 				if (mdb_pwalk_dcmd("list", "smblock", 0,
14906432Sas200622 				    NULL, list_addr)) {
14915331Samw 					mdb_warn("failed to walk node's active"
14925331Samw 					    " locks");
14935331Samw 				}
14945331Samw 				(void) mdb_dec_indent(SMB_DCMD_INDENT);
14955331Samw 			}
149612890SJoyce.McIntosh@Sun.COM 			if (node.n_oplock.ol_count == 0) {
149712890SJoyce.McIntosh@Sun.COM 				mdb_printf("Opportunistic Locks: 0\n");
149812890SJoyce.McIntosh@Sun.COM 			} else {
149912890SJoyce.McIntosh@Sun.COM 				oplock_addr =
150012890SJoyce.McIntosh@Sun.COM 				    addr + offsetof(smb_node_t, n_oplock);
150112890SJoyce.McIntosh@Sun.COM 				mdb_printf("Opportunistic Lock: %p\n",
150212890SJoyce.McIntosh@Sun.COM 				    oplock_addr);
150312890SJoyce.McIntosh@Sun.COM 				rc = mdb_call_dcmd("smboplock", oplock_addr,
150412890SJoyce.McIntosh@Sun.COM 				    flags, argc, argv);
150512890SJoyce.McIntosh@Sun.COM 				if (rc != DCMD_OK)
150612890SJoyce.McIntosh@Sun.COM 					return (rc);
150712890SJoyce.McIntosh@Sun.COM 			}
15086432Sas200622 			mdb_printf("Reference Count: %u\n\n", node.n_refcnt);
15095331Samw 		} else {
151012890SJoyce.McIntosh@Sun.COM 			mdb_printf("%-?p %-?p %-18s %-6d %-6d %-8d %-6d ",
15115331Samw 			    addr, node.vp, od_name, node.n_ofile_list.ll_count,
151212890SJoyce.McIntosh@Sun.COM 			    node.n_lock_list.ll_count,
151312890SJoyce.McIntosh@Sun.COM 			    node.n_oplock.ol_count, node.n_refcnt);
151412890SJoyce.McIntosh@Sun.COM 
15156432Sas200622 			if (print_full_path)
15166432Sas200622 				mdb_printf("\t%s\n", path_name);
15175331Samw 		}
15185331Samw 		if (stack_trace && node.n_audit_buf) {
15195331Samw 			int ctr;
15205331Samw 			smb_audit_buf_node_t *anb;
15215331Samw 
15225331Samw 			anb = mdb_alloc(sizeof (smb_audit_buf_node_t),
15236432Sas200622 			    UM_SLEEP | UM_GC);
15245331Samw 
15255331Samw 			if (mdb_vread(anb, sizeof (*anb),
15265331Samw 			    (uintptr_t)node.n_audit_buf) != sizeof (*anb)) {
15275331Samw 				mdb_warn("failed to read audit buffer");
15285331Samw 				return (DCMD_ERR);
15295331Samw 			}
15305331Samw 			ctr = anb->anb_max_index + 1;
15315331Samw 			anb->anb_index--;
15325331Samw 			anb->anb_index &= anb->anb_max_index;
15335331Samw 
15345331Samw 			while (ctr) {
15355331Samw 				smb_audit_record_node_t	*anr;
15365331Samw 
15375331Samw 				anr = anb->anb_records + anb->anb_index;
15385331Samw 
15395331Samw 				if (anr->anr_depth) {
15405331Samw 					char c[MDB_SYM_NAMLEN];
15415331Samw 					GElf_Sym sym;
15425331Samw 					int i;
15435331Samw 
15445331Samw 					mdb_printf("\nRefCnt: %u\t",
15455331Samw 					    anr->anr_refcnt);
15465331Samw 
15475331Samw 					for (i = 0;
15485331Samw 					    i < anr->anr_depth;
15495331Samw 					    i++) {
15505331Samw 						if (mdb_lookup_by_addr(
15515331Samw 						    anr->anr_stack[i],
15525331Samw 						    MDB_SYM_FUZZY,
15535331Samw 						    c, sizeof (c),
15545331Samw 						    &sym) == -1) {
15555331Samw 							continue;
15565331Samw 						}
15575331Samw 						mdb_printf("%s+0x%1x",
15585331Samw 						    c,
15595331Samw 						    anr->anr_stack[i] -
15605331Samw 						    (uintptr_t)sym.st_value);
15615331Samw 						++i;
15625331Samw 						break;
15635331Samw 					}
15645331Samw 
15655331Samw 					while (i < anr->anr_depth) {
15665331Samw 						if (mdb_lookup_by_addr(
15675331Samw 						    anr->anr_stack[i],
15685331Samw 						    MDB_SYM_FUZZY,
15695331Samw 						    c, sizeof (c),
15705331Samw 						    &sym) == -1) {
15715331Samw 							++i;
15725331Samw 							continue;
15735331Samw 						}
15745331Samw 						mdb_printf("\n\t\t%s+0x%1x",
15755331Samw 						    c,
15765331Samw 						    anr->anr_stack[i] -
15775331Samw 						    (uintptr_t)sym.st_value);
15785331Samw 						++i;
15795331Samw 					}
15805331Samw 					mdb_printf("\n");
15815331Samw 				}
15825331Samw 				anb->anb_index--;
15835331Samw 				anb->anb_index &= anb->anb_max_index;
15845331Samw 				ctr--;
15855331Samw 			}
15865331Samw 		}
15875331Samw 	} else {
15885331Samw 		mdb_warn("failed to read struct smb_node at %p", addr);
15895331Samw 		return (DCMD_ERR);
15905331Samw 	}
15915331Samw 
15925331Samw 	return (DCMD_OK);
15935331Samw }
15945331Samw 
15956432Sas200622 /*
15966432Sas200622  * Initialize the smb_node_t walker by reading the value of smb_node_hash_table
15976432Sas200622  * in the kernel's symbol table. Only global walk supported.
15986432Sas200622  */
15996432Sas200622 static int
smb_node_walk_init(mdb_walk_state_t * wsp)16006432Sas200622 smb_node_walk_init(mdb_walk_state_t *wsp)
16015331Samw {
16026432Sas200622 	GElf_Sym	sym;
16036432Sas200622 	int		i;
16046432Sas200622 	uintptr_t	node_hash_table_addr;
16056432Sas200622 
16066432Sas200622 	if (wsp->walk_addr == NULL) {
16076432Sas200622 		if (mdb_lookup_by_name("smb_node_hash_table", &sym) == -1) {
16086432Sas200622 			mdb_warn("failed to find 'smb_node_hash_table'");
16096432Sas200622 			return (WALK_ERR);
16106432Sas200622 		}
16116432Sas200622 		node_hash_table_addr = (uintptr_t)sym.st_value;
16126432Sas200622 	} else {
16136432Sas200622 		mdb_printf("smb_node walk only supports global walks\n");
16146432Sas200622 		return (WALK_ERR);
16156432Sas200622 	}
16166432Sas200622 
16176432Sas200622 	for (i = 0; i < SMBND_HASH_MASK + 1; i++) {
16186432Sas200622 		wsp->walk_addr = node_hash_table_addr +
16196432Sas200622 		    (i * sizeof (smb_llist_t)) + offsetof(smb_llist_t, ll_list);
16206432Sas200622 		if (mdb_layered_walk("list", wsp) == -1) {
16216432Sas200622 			mdb_warn("failed to walk 'list'");
16226432Sas200622 			return (WALK_ERR);
16236432Sas200622 		}
16246432Sas200622 	}
16256432Sas200622 
16266432Sas200622 	return (WALK_NEXT);
16276432Sas200622 }
16286432Sas200622 
16296432Sas200622 static int
smb_node_walk_step(mdb_walk_state_t * wsp)16306432Sas200622 smb_node_walk_step(mdb_walk_state_t *wsp)
16316432Sas200622 {
16326432Sas200622 	return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer,
16336432Sas200622 	    wsp->walk_cbdata));
16345331Samw }
16355331Samw 
16365331Samw /*
16376432Sas200622  * *****************************************************************************
16386432Sas200622  * ****************************** smb_lock_t ***********************************
16396432Sas200622  * *****************************************************************************
16405331Samw  */
16415331Samw 
16425331Samw static int
smb_lock(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)16435331Samw smb_lock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
16445331Samw {
16455331Samw 	smb_lock_t	lock;
16465331Samw 	int		verbose = FALSE;
16475331Samw 	uintptr_t	list_addr;
16485331Samw 	char		*lock_type;
16495331Samw 
16505331Samw 	if (mdb_getopts(argc, argv,
16515331Samw 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
16525331Samw 	    NULL) != argc)
16535331Samw 		return (DCMD_USAGE);
16545331Samw 
16555331Samw 	/*
16565331Samw 	 * An smb_lock_t address must be specified.
16575331Samw 	 */
16585331Samw 	if (!(flags & DCMD_ADDRSPEC))
16595331Samw 		return (DCMD_USAGE);
16605331Samw 
16615331Samw 	/*
16625331Samw 	 * If this is the first invocation of the command, print a nice
16635331Samw 	 * header line for the output that will follow.
16645331Samw 	 */
16655331Samw 	if (DCMD_HDRSPEC(flags)) {
16665331Samw 		if (verbose)
16675331Samw 			mdb_printf("SMB lock information:\n\n");
16685331Samw 		else
16695331Samw 			mdb_printf("%<u>%-?s %4s %16s %8s %9s%</u>\n",
16705331Samw 			    "Locks: ", "TYPE", "START", "LENGTH",
16715331Samw 			    "CONFLICTS");
16725331Samw 	}
16735331Samw 
16745331Samw 	if (mdb_vread(&lock, sizeof (lock), addr) == sizeof (lock)) {
16755331Samw 		switch (lock.l_type) {
16765331Samw 		case SMB_LOCK_TYPE_READWRITE:
16775331Samw 			lock_type = "RW";
16785331Samw 			break;
16795331Samw 		case SMB_LOCK_TYPE_READONLY:
16805331Samw 			lock_type = "RO";
16815331Samw 			break;
16825331Samw 		default:
16835331Samw 			lock_type = "N/A";
16845331Samw 			break;
16855331Samw 		}
16865331Samw 		if (verbose) {
16875331Samw 			mdb_printf("Type             :\t%s (%u)\n",
16885331Samw 			    lock_type, lock.l_type);
16895331Samw 			mdb_printf("Start            :\t%llx\n",
16905331Samw 			    lock.l_start);
16915331Samw 			mdb_printf("Length           :\t%lx\n",
16925331Samw 			    lock.l_length);
16935331Samw 			mdb_printf("Session          :\t%p\n",
16945331Samw 			    lock.l_session);
16955331Samw 			mdb_printf("File             :\t%p\n",
16965331Samw 			    lock.l_file);
16975331Samw 			mdb_printf("User ID          :\t%u\n",
16985331Samw 			    lock.l_uid);
16995331Samw 			mdb_printf("Process ID       :\t%u\n",
17005331Samw 			    lock.l_pid);
17015331Samw 			mdb_printf("Conflicts        :\t%u\n",
17025331Samw 			    lock.l_conflict_list.sl_count);
17035331Samw 			if (lock.l_conflict_list.sl_count != 0) {
17045331Samw 				(void) mdb_inc_indent(SMB_DCMD_INDENT);
17055331Samw 				list_addr = addr +
17065331Samw 				    offsetof(smb_lock_t, l_conflict_list) +
17075331Samw 				    offsetof(smb_slist_t, sl_list);
17085331Samw 				if (mdb_pwalk_dcmd("list", "smb_lock",
17095331Samw 				    0, NULL, list_addr)) {
17105331Samw 					mdb_warn("failed to walk conflict "
17115331Samw 					    "locks ");
17125331Samw 				}
17135331Samw 				(void) mdb_dec_indent(SMB_DCMD_INDENT);
17145331Samw 			}
17155331Samw 			mdb_printf("Blocked by       :\t%p\n",
17165331Samw 			    lock.l_blocked_by);
17175331Samw 			mdb_printf("Flags            :\t0x%x\n",
17185331Samw 			    lock.l_flags);
17195331Samw 			mdb_printf("\n");
17205331Samw 		} else {
17215331Samw 			mdb_printf("%?p %4s %16llx %08lx %9x", addr,
17225331Samw 			    lock_type, lock.l_start, lock.l_length,
17235331Samw 			    lock.l_conflict_list.sl_count);
17245331Samw 		}
17255331Samw 	} else {
17265331Samw 		mdb_warn("failed to read struct smb_request at %p", addr);
17275331Samw 		return (DCMD_ERR);
17285331Samw 	}
17295331Samw 
17305331Samw 	return (DCMD_OK);
17315331Samw }
17325331Samw 
17335331Samw /*
173412890SJoyce.McIntosh@Sun.COM  * *****************************************************************************
173512890SJoyce.McIntosh@Sun.COM  * ************************** smb_oplock_grant_t *******************************
173612890SJoyce.McIntosh@Sun.COM  * *****************************************************************************
173712890SJoyce.McIntosh@Sun.COM  */
173812890SJoyce.McIntosh@Sun.COM /*ARGSUSED*/
173912890SJoyce.McIntosh@Sun.COM static int
smb_oplock_grant(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)174012890SJoyce.McIntosh@Sun.COM smb_oplock_grant(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
174112890SJoyce.McIntosh@Sun.COM {
174212890SJoyce.McIntosh@Sun.COM 	smb_oplock_grant_t	grant;
174312890SJoyce.McIntosh@Sun.COM 	char			 *level;
174412890SJoyce.McIntosh@Sun.COM 
174512890SJoyce.McIntosh@Sun.COM 	if (!(flags & DCMD_ADDRSPEC))
174612890SJoyce.McIntosh@Sun.COM 		return (DCMD_USAGE);
174712890SJoyce.McIntosh@Sun.COM 
174812890SJoyce.McIntosh@Sun.COM 	/*
174912890SJoyce.McIntosh@Sun.COM 	 * If this is the first invocation of the command, print a nice
175012890SJoyce.McIntosh@Sun.COM 	 * header line for the output that will follow.
175112890SJoyce.McIntosh@Sun.COM 	 */
175212890SJoyce.McIntosh@Sun.COM 	if (DCMD_HDRSPEC(flags)) {
175312890SJoyce.McIntosh@Sun.COM 		mdb_printf("%<u>%-16s %-10s %-16s%</u>\n",
175412890SJoyce.McIntosh@Sun.COM 		    "Grants:", "LEVEL", "OFILE");
175512890SJoyce.McIntosh@Sun.COM 	}
175612890SJoyce.McIntosh@Sun.COM 
175712890SJoyce.McIntosh@Sun.COM 	if (mdb_vread(&grant, sizeof (grant), addr) == sizeof (grant)) {
175812890SJoyce.McIntosh@Sun.COM 		switch (grant.og_level) {
175912890SJoyce.McIntosh@Sun.COM 		case SMB_OPLOCK_EXCLUSIVE:
176012890SJoyce.McIntosh@Sun.COM 			level = "EXCLUSIVE";
176112890SJoyce.McIntosh@Sun.COM 			break;
176212890SJoyce.McIntosh@Sun.COM 		case SMB_OPLOCK_BATCH:
176312890SJoyce.McIntosh@Sun.COM 			level = "BATCH";
176412890SJoyce.McIntosh@Sun.COM 			break;
176512890SJoyce.McIntosh@Sun.COM 		case SMB_OPLOCK_LEVEL_II:
176612890SJoyce.McIntosh@Sun.COM 			level = "LEVEL_II";
176712890SJoyce.McIntosh@Sun.COM 			break;
176812890SJoyce.McIntosh@Sun.COM 		default:
176912890SJoyce.McIntosh@Sun.COM 			level = "UNKNOWN";
177012890SJoyce.McIntosh@Sun.COM 			break;
177112890SJoyce.McIntosh@Sun.COM 		}
177212890SJoyce.McIntosh@Sun.COM 
177312890SJoyce.McIntosh@Sun.COM 		mdb_printf("%-16p %-10s %-16p", addr, level, grant.og_ofile);
177412890SJoyce.McIntosh@Sun.COM 	}
177512890SJoyce.McIntosh@Sun.COM 	return (DCMD_OK);
177612890SJoyce.McIntosh@Sun.COM }
177712890SJoyce.McIntosh@Sun.COM 
177812890SJoyce.McIntosh@Sun.COM /*
177912890SJoyce.McIntosh@Sun.COM  * *****************************************************************************
178012890SJoyce.McIntosh@Sun.COM  * ***************************** smb_oplock_t **********************************
178112890SJoyce.McIntosh@Sun.COM  * *****************************************************************************
178212890SJoyce.McIntosh@Sun.COM  */
178312890SJoyce.McIntosh@Sun.COM /*ARGSUSED*/
178412890SJoyce.McIntosh@Sun.COM static int
smb_oplock(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)178512890SJoyce.McIntosh@Sun.COM smb_oplock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
178612890SJoyce.McIntosh@Sun.COM {
178712890SJoyce.McIntosh@Sun.COM 	smb_oplock_t	oplock;
178812890SJoyce.McIntosh@Sun.COM 	uintptr_t	list_addr;
178912890SJoyce.McIntosh@Sun.COM 
179012890SJoyce.McIntosh@Sun.COM 	if (!(flags & DCMD_ADDRSPEC))
179112890SJoyce.McIntosh@Sun.COM 		return (DCMD_USAGE);
179212890SJoyce.McIntosh@Sun.COM 
179312890SJoyce.McIntosh@Sun.COM 	if (mdb_vread(&oplock, sizeof (oplock), addr) != sizeof (oplock)) {
179412890SJoyce.McIntosh@Sun.COM 		mdb_warn("failed to read struct smb_oplock at %p", addr);
179512890SJoyce.McIntosh@Sun.COM 		return (DCMD_ERR);
179612890SJoyce.McIntosh@Sun.COM 	}
179712890SJoyce.McIntosh@Sun.COM 
179812890SJoyce.McIntosh@Sun.COM 	if (oplock.ol_count == 0)
179912890SJoyce.McIntosh@Sun.COM 		return (DCMD_OK);
180012890SJoyce.McIntosh@Sun.COM 
180112890SJoyce.McIntosh@Sun.COM 	(void) mdb_inc_indent(SMB_DCMD_INDENT);
180212890SJoyce.McIntosh@Sun.COM 	switch (oplock.ol_break) {
180312890SJoyce.McIntosh@Sun.COM 	case SMB_OPLOCK_BREAK_TO_NONE:
180412890SJoyce.McIntosh@Sun.COM 		mdb_printf("Break Pending: BREAK_TO_NONE\n");
180512890SJoyce.McIntosh@Sun.COM 		break;
180612890SJoyce.McIntosh@Sun.COM 	case SMB_OPLOCK_BREAK_TO_LEVEL_II:
180712890SJoyce.McIntosh@Sun.COM 		mdb_printf(
180812890SJoyce.McIntosh@Sun.COM 		    "Break Pending: BREAK_TO_LEVEL_II\n");
180912890SJoyce.McIntosh@Sun.COM 		break;
181012890SJoyce.McIntosh@Sun.COM 	default:
181112890SJoyce.McIntosh@Sun.COM 		break;
181212890SJoyce.McIntosh@Sun.COM 	}
181312890SJoyce.McIntosh@Sun.COM 
181412890SJoyce.McIntosh@Sun.COM 	list_addr = addr + offsetof(smb_oplock_t, ol_grants);
181512890SJoyce.McIntosh@Sun.COM 
181612890SJoyce.McIntosh@Sun.COM 	if (mdb_pwalk_dcmd("list", "smboplockgrant",
181712890SJoyce.McIntosh@Sun.COM 	    argc, argv, list_addr)) {
181812890SJoyce.McIntosh@Sun.COM 		mdb_warn("failed to walk oplock grants");
181912890SJoyce.McIntosh@Sun.COM 	}
182012890SJoyce.McIntosh@Sun.COM 
182112890SJoyce.McIntosh@Sun.COM 	(void) mdb_dec_indent(SMB_DCMD_INDENT);
182212890SJoyce.McIntosh@Sun.COM 
182312890SJoyce.McIntosh@Sun.COM 	return (DCMD_OK);
182412890SJoyce.McIntosh@Sun.COM }
182512890SJoyce.McIntosh@Sun.COM 
182612890SJoyce.McIntosh@Sun.COM /*
182712508Samw@Sun.COM  * ::smbstat
18285331Samw  *
182912508Samw@Sun.COM  * Prints SMB requests statistics.
18305331Samw  */
18315331Samw /*ARGSUSED*/
18325331Samw static int
smb_stats(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)18336432Sas200622 smb_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
18345331Samw {
183512508Samw@Sun.COM 	smb_server_t	*sv;
18365331Samw 
183712508Samw@Sun.COM 	if (!(flags & DCMD_ADDRSPEC))
18385331Samw 		return (DCMD_USAGE);
18395331Samw 
184012508Samw@Sun.COM 	sv = mdb_alloc(sizeof (*sv), UM_SLEEP | UM_GC);
184112508Samw@Sun.COM 	if (mdb_vread(sv, sizeof (*sv), addr) == -1) {
184212508Samw@Sun.COM 		mdb_warn("failed to read server object at %p", addr);
18435331Samw 		return (DCMD_ERR);
18445331Samw 	}
184512508Samw@Sun.COM 	if (sv->sv_magic != SMB_SERVER_MAGIC) {
184612508Samw@Sun.COM 		mdb_warn("not an smb_server_t (%p)>", addr);
18475331Samw 		return (DCMD_ERR);
18485331Samw 	}
184912508Samw@Sun.COM 	mdb_printf(
185012508Samw@Sun.COM 	    "\n%<b>  nbt   tcp users trees files pipes%</b>\n"
185112508Samw@Sun.COM 	    "%5d %5d %5d %5d %5d %5d\n",
185212508Samw@Sun.COM 	    sv->sv_nbt_sess,
185312508Samw@Sun.COM 	    sv->sv_tcp_sess,
185412508Samw@Sun.COM 	    sv->sv_users,
185512508Samw@Sun.COM 	    sv->sv_trees,
185612508Samw@Sun.COM 	    sv->sv_files,
185712508Samw@Sun.COM 	    sv->sv_pipes);
18585331Samw 
18595331Samw 	return (DCMD_OK);
18605331Samw }
18615331Samw 
18625331Samw /*
18636432Sas200622  * *****************************************************************************
18646432Sas200622  * ******************************** smb_ace_t **********************************
18656432Sas200622  * *****************************************************************************
18665331Samw  */
18676432Sas200622 static const ace_type_entry_t	ace_types[ACE_TYPE_TABLEN] =
18686432Sas200622 {
18696432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_ACE_TYPE),
18706432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_ACE_TYPE),
18716432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_ACE_TYPE),
18726432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_ACE_TYPE),
18736432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_COMPOUND_ACE_TYPE),
18746432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE),
18756432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_OBJECT_ACE_TYPE),
18766432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE),
18776432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE),
18786432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_CALLBACK_ACE_TYPE),
18796432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_CALLBACK_ACE_TYPE),
18806432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE),
18816432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE),
18826432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_CALLBACK_ACE_TYPE),
18836432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_CALLBACK_ACE_TYPE),
18846432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE),
18856432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE),
18866432Sas200622 	ACE_TYPE_ENTRY(0x11),
18876432Sas200622 	ACE_TYPE_ENTRY(0x12),
18886432Sas200622 	ACE_TYPE_ENTRY(0x13),
18896432Sas200622 	ACE_TYPE_ENTRY(0x14),
18906432Sas200622 	ACE_TYPE_ENTRY(0x15),
18916432Sas200622 	ACE_TYPE_ENTRY(0x16),
18926432Sas200622 	ACE_TYPE_ENTRY(0x17),
18936432Sas200622 	ACE_TYPE_ENTRY(0x18),
18946432Sas200622 	ACE_TYPE_ENTRY(0x19),
18956432Sas200622 	ACE_TYPE_ENTRY(0x1A),
18966432Sas200622 	ACE_TYPE_ENTRY(0x1B),
18976432Sas200622 	ACE_TYPE_ENTRY(0x1C),
18986432Sas200622 	ACE_TYPE_ENTRY(0x1D),
18996432Sas200622 	ACE_TYPE_ENTRY(0x1E),
19006432Sas200622 	ACE_TYPE_ENTRY(0x1F)
19016432Sas200622 };
19026432Sas200622 
19036432Sas200622 static const mdb_bitmask_t ace_flag_bits[] = {
19046432Sas200622 	{ "OBJECT_INHERIT_ACE", OBJECT_INHERIT_ACE, OBJECT_INHERIT_ACE },
19056432Sas200622 	{ "CONTAINER_INHERIT_ACE", CONTAINER_INHERIT_ACE,
19066432Sas200622 	    CONTAINER_INHERIT_ACE },
19076432Sas200622 	{ "NO_PROPOGATE_INHERIT_ACE", NO_PROPOGATE_INHERIT_ACE,
19086432Sas200622 	    NO_PROPOGATE_INHERIT_ACE },
19096432Sas200622 	{ "INHERIT_ONLY_ACE", INHERIT_ONLY_ACE, INHERIT_ONLY_ACE },
19106432Sas200622 	{ "INHERITED_ACE", INHERITED_ACE, INHERITED_ACE },
19116432Sas200622 	{ "SUCCESSFUL_ACCESS_ACE_FLAG", SUCCESSFUL_ACCESS_ACE_FLAG,
19126432Sas200622 	    SUCCESSFUL_ACCESS_ACE_FLAG },
19136432Sas200622 	{ "FAILED_ACCESS_ACE_FLAG", FAILED_ACCESS_ACE_FLAG,
19146432Sas200622 	    FAILED_ACCESS_ACE_FLAG },
19156432Sas200622 	{ NULL, 0, 0 }
19165331Samw };
19175331Samw 
19186432Sas200622 /*
19196432Sas200622  * ::smbace
19206432Sas200622  */
19216432Sas200622 static int
smb_ace(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)19226432Sas200622 smb_ace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
19236432Sas200622 {
19246432Sas200622 	smb_ace_t	ace;
19256432Sas200622 	int		verbose = FALSE;
19266432Sas200622 	const char	*ptr;
19276432Sas200622 	int		rc;
19286432Sas200622 
19296432Sas200622 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose,
19306432Sas200622 	    NULL) != argc)
19316432Sas200622 		return (DCMD_USAGE);
19326432Sas200622 
19336432Sas200622 	/*
19346432Sas200622 	 * An smb_ace address is required.
19356432Sas200622 	 */
19366432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
19376432Sas200622 		return (DCMD_USAGE);
19386432Sas200622 
19396432Sas200622 	if (mdb_vread(&ace, sizeof (ace), addr) != sizeof (ace)) {
19406432Sas200622 		mdb_warn("failed to read struct smb_ace at %p", addr);
19416432Sas200622 		return (DCMD_ERR);
19426432Sas200622 	}
19436432Sas200622 
19446432Sas200622 	if (verbose) {
19456432Sas200622 		if (ace.se_hdr.se_type < ACE_TYPE_TABLEN)
19466432Sas200622 			ptr = ace_types[ace.se_hdr.se_type].ace_type_sting;
19476432Sas200622 		else
19486432Sas200622 			ptr = "Unknown";
19496432Sas200622 
19506432Sas200622 		mdb_printf("ACE Type: 0x%02x (%s)\n", ace.se_hdr.se_type, ptr);
19516432Sas200622 		mdb_printf("ACE Flags: %b\n", (int)ace.se_hdr.se_flags,
19526432Sas200622 		    ace_flag_bits);
19536432Sas200622 		mdb_printf("ACE Wire Size: 0x%04x\n", ace.se_hdr.se_bsize);
19546432Sas200622 		mdb_printf("ACE Mask: 0x%08x\n", ace.se_mask);
19556432Sas200622 		mdb_printf("ACE SID: ");
19566432Sas200622 	} else {
19576432Sas200622 		if (DCMD_HDRSPEC(flags))
19586432Sas200622 			mdb_printf(
19596432Sas200622 			    "%<b>%<u>%?-s %-4s %-4s %-8s %s%</u>%</b>\n",
19606432Sas200622 			    "ACE", "TYPE", "FLAGS", "MASK", "SID");
19616432Sas200622 		mdb_printf("%?p 0x%02x 0x%02x 0x%08x ", addr,
19626432Sas200622 		    ace.se_hdr.se_type, ace.se_hdr.se_flags, ace.se_mask);
19636432Sas200622 	}
19646432Sas200622 	rc = smb_sid_print((uintptr_t)ace.se_sid);
19656432Sas200622 	mdb_printf("\n");
19666432Sas200622 	return (rc);
19676432Sas200622 }
19686432Sas200622 
19696432Sas200622 static int
smb_ace_walk_init(mdb_walk_state_t * wsp)19706432Sas200622 smb_ace_walk_init(mdb_walk_state_t *wsp)
19716432Sas200622 {
19726432Sas200622 	if (wsp->walk_addr == 0) {
19736432Sas200622 		mdb_printf("smb_ace walk only supports local walks\n");
19746432Sas200622 		return (WALK_ERR);
19756432Sas200622 	}
19766432Sas200622 
19776432Sas200622 	wsp->walk_addr += offsetof(smb_acl_t, sl_sorted);
19786432Sas200622 
19796432Sas200622 	if (mdb_layered_walk("list", wsp) == -1) {
19806432Sas200622 		mdb_warn("failed to walk list of ACEs");
19816432Sas200622 		return (WALK_ERR);
19826432Sas200622 	}
19836432Sas200622 
19846432Sas200622 	return (WALK_NEXT);
19856432Sas200622 }
19866432Sas200622 
19876432Sas200622 static int
smb_ace_walk_step(mdb_walk_state_t * wsp)19886432Sas200622 smb_ace_walk_step(mdb_walk_state_t *wsp)
19896432Sas200622 {
19906432Sas200622 	return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer,
19916432Sas200622 	    wsp->walk_cbdata));
19926432Sas200622 }
19936432Sas200622 
19946432Sas200622 /*
19956432Sas200622  * *****************************************************************************
19966432Sas200622  * ******************************** smb_acl_t **********************************
19976432Sas200622  * *****************************************************************************
19986432Sas200622  */
19996432Sas200622 
20006432Sas200622 /*
20016432Sas200622  * ::smbacl
20026432Sas200622  */
20036432Sas200622 static int
smb_acl(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)20046432Sas200622 smb_acl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
20056432Sas200622 {
20066432Sas200622 	smb_acl_t	acl;
20076432Sas200622 
20086432Sas200622 	/* An smb_acl address is required. */
20096432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
20106432Sas200622 		return (DCMD_USAGE);
20116432Sas200622 
20126432Sas200622 	if (mdb_vread(&acl, sizeof (acl), addr) != sizeof (acl)) {
20136432Sas200622 		mdb_warn("failed to read struct smb_acl at %p", addr);
20146432Sas200622 		return (DCMD_ERR);
20156432Sas200622 	}
20166432Sas200622 
20176432Sas200622 	mdb_printf("ACL Revision: %d\n", acl.sl_revision);
20186432Sas200622 	mdb_printf("ACL Size on Wire: %d\n", acl.sl_bsize);
20196432Sas200622 	mdb_printf("ACL Number of ACEs: %d\n", acl.sl_acecnt);
20206432Sas200622 
20216432Sas200622 	(void) mdb_inc_indent(SMB_DCMD_INDENT);
20226432Sas200622 	if (mdb_pwalk_dcmd("smbace_walker", "smbace", argc, argv, addr)) {
20236432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
20246432Sas200622 		mdb_warn("failed to walk list of ACEs for ACL %p", addr);
20256432Sas200622 		return (DCMD_ERR);
20266432Sas200622 	}
20276432Sas200622 	(void) mdb_dec_indent(SMB_DCMD_INDENT);
20286432Sas200622 	return (DCMD_OK);
20296432Sas200622 }
20306432Sas200622 
20316432Sas200622 /*
20326432Sas200622  * *****************************************************************************
20336432Sas200622  * ********************************* smb_sd_t **********************************
20346432Sas200622  * *****************************************************************************
20356432Sas200622  */
20366432Sas200622 
20376432Sas200622 /*
20386432Sas200622  * ::smbsd
20396432Sas200622  */
20406432Sas200622 static int
smb_sd(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)20416432Sas200622 smb_sd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
20426432Sas200622 {
20436432Sas200622 	smb_sd_t	sd;
20446432Sas200622 	int		rc;
20456432Sas200622 
20466432Sas200622 	/*
20476432Sas200622 	 * An smb_sid address is required.
20486432Sas200622 	 */
20496432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
20506432Sas200622 		return (DCMD_USAGE);
20516432Sas200622 
20526432Sas200622 	if (mdb_vread(&sd, sizeof (sd), addr) != sizeof (sd)) {
20536432Sas200622 		mdb_warn("failed to read struct smb_sd at %p", addr);
20546432Sas200622 		return (DCMD_ERR);
20556432Sas200622 	}
20566432Sas200622 
20576432Sas200622 	mdb_printf("SD Revision: %d\n", sd.sd_revision);
20586432Sas200622 	mdb_printf("SD Control: %04x\n", sd.sd_control);
20596432Sas200622 	if (sd.sd_control & SE_OWNER_DEFAULTED)
20606432Sas200622 		mdb_printf("\t    SE_OWNER_DEFAULTED\n");
20616432Sas200622 	if (sd.sd_control & SE_GROUP_DEFAULTED)
20626432Sas200622 		mdb_printf("\t    SE_GROUP_DEFAULTED\n");
20636432Sas200622 	if (sd.sd_control & SE_DACL_PRESENT)
20646432Sas200622 		mdb_printf("\t    SE_DACL_PRESENT\n");
20656432Sas200622 	if (sd.sd_control & SE_DACL_DEFAULTED)
20666432Sas200622 		mdb_printf("\t    SE_DACL_DEFAULTED\n");
20676432Sas200622 	if (sd.sd_control & SE_SACL_PRESENT)
20686432Sas200622 		mdb_printf("\t    SE_SACL_PRESENT\n");
20696432Sas200622 	if (sd.sd_control & SE_SACL_DEFAULTED)
20706432Sas200622 		mdb_printf("\t    SE_SACL_DEFAULTED\n");
20716432Sas200622 	if (sd.sd_control & SE_DACL_AUTO_INHERIT_REQ)
20726432Sas200622 		mdb_printf("\t    SE_DACL_AUTO_INHERIT_REQ\n");
20736432Sas200622 	if (sd.sd_control & SE_SACL_AUTO_INHERIT_REQ)
20746432Sas200622 		mdb_printf("\t    SE_SACL_AUTO_INHERIT_REQ\n");
20756432Sas200622 	if (sd.sd_control & SE_DACL_AUTO_INHERITED)
20766432Sas200622 		mdb_printf("\t    SE_DACL_AUTO_INHERITED\n");
20776432Sas200622 	if (sd.sd_control & SE_SACL_AUTO_INHERITED)
20786432Sas200622 		mdb_printf("\t    SE_SACL_AUTO_INHERITED\n");
20796432Sas200622 	if (sd.sd_control & SE_DACL_PROTECTED)
20806432Sas200622 		mdb_printf("\t    SE_DACL_PROTECTED\n");
20816432Sas200622 	if (sd.sd_control & SE_SACL_PROTECTED)
20826432Sas200622 		mdb_printf("\t    SE_SACL_PROTECTED\n");
20836432Sas200622 	if (sd.sd_control & SE_SELF_RELATIVE)
20846432Sas200622 		mdb_printf("\t    SE_SELF_RELATIVE\n");
20856432Sas200622 
20866432Sas200622 	mdb_printf("SID of Owner: ");
20876432Sas200622 	rc = smb_sid_print((uintptr_t)sd.sd_owner);
20886432Sas200622 	if (rc != DCMD_OK)
20896432Sas200622 		return (rc);
20906432Sas200622 	mdb_printf("\nSID of Group: ");
20916432Sas200622 	rc = smb_sid_print((uintptr_t)sd.sd_group);
20926432Sas200622 	if (rc != DCMD_OK)
20936432Sas200622 		return (rc);
20946432Sas200622 	mdb_printf("\n");
20956432Sas200622 
20966432Sas200622 	if (sd.sd_control & SE_SACL_PRESENT && sd.sd_sacl) {
20976432Sas200622 		mdb_printf("%<b>%<u>System ACL%</u>%</b>\n");
20986432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
20996432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)sd.sd_sacl, flags,
21006432Sas200622 		    argc, argv);
21016432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
21026432Sas200622 		if (rc != DCMD_OK)
21036432Sas200622 			return (rc);
21046432Sas200622 	}
21056432Sas200622 	if (sd.sd_control & SE_DACL_PRESENT && sd.sd_dacl) {
21066432Sas200622 		mdb_printf("%<b>%<u>Discretionary ACL%</u>%</b>\n");
21076432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
21086432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)sd.sd_dacl, flags,
21096432Sas200622 		    argc, argv);
21106432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
21116432Sas200622 		if (rc != DCMD_OK)
21126432Sas200622 			return (rc);
21136432Sas200622 	}
21146432Sas200622 
21156432Sas200622 	return (DCMD_OK);
21166432Sas200622 }
21176432Sas200622 
21186432Sas200622 /*
21196432Sas200622  * *****************************************************************************
21206432Sas200622  * ********************************* smb_sid_t *********************************
21216432Sas200622  * *****************************************************************************
21226432Sas200622  */
21236432Sas200622 
21246432Sas200622 /*
21256432Sas200622  * ::smbsid
21266432Sas200622  */
21276432Sas200622 /*ARGSUSED*/
21286432Sas200622 static int
smb_sid(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)21296432Sas200622 smb_sid(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
21306432Sas200622 {
21316432Sas200622 	/*
21326432Sas200622 	 * An smb_sid address is required.
21336432Sas200622 	 */
21346432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
21356432Sas200622 		return (DCMD_USAGE);
21365331Samw 
21376432Sas200622 	return (smb_sid_print(addr));
21386432Sas200622 }
21396432Sas200622 
21406432Sas200622 /*
21416432Sas200622  * smb_sid_print
21426432Sas200622  */
21436432Sas200622 static int
smb_sid_print(uintptr_t addr)21446432Sas200622 smb_sid_print(uintptr_t addr)
21456432Sas200622 {
21466432Sas200622 	smb_sid_t	sid;
21476432Sas200622 	smb_sid_t	*psid;
21486432Sas200622 	size_t		sid_size;
21496432Sas200622 	int		i;
21506432Sas200622 	uint64_t	authority;
21516432Sas200622 
21526432Sas200622 	sid_size = offsetof(smb_sid_t, sid_subauth);
21536432Sas200622 
21546432Sas200622 	if (mdb_vread(&sid, sid_size, addr) != sid_size) {
21556432Sas200622 		mdb_warn("failed to read struct smb_sid at %p", addr);
21566432Sas200622 		return (DCMD_ERR);
21576432Sas200622 	}
21586432Sas200622 
21596432Sas200622 	sid_size += sid.sid_subauthcnt * sizeof (sid.sid_subauth[0]);
21606432Sas200622 
21616432Sas200622 	psid = mdb_zalloc(sid_size, UM_SLEEP | UM_GC);
21626432Sas200622 	if (mdb_vread(psid, sid_size, addr) != sid_size) {
21636432Sas200622 		mdb_warn("failed to read struct smb_sid at %p", addr);
21646432Sas200622 		return (DCMD_ERR);
21656432Sas200622 	}
21666432Sas200622 
21676432Sas200622 	mdb_printf("S-%d", psid->sid_revision);
21686432Sas200622 	authority = 0;
21696432Sas200622 	for (i = 0; i < NT_SID_AUTH_MAX; i++) {
21706432Sas200622 		authority += ((uint64_t)psid->sid_authority[i]) <<
21716432Sas200622 		    (8 * (NT_SID_AUTH_MAX - 1) - i);
21726432Sas200622 	}
21736432Sas200622 	mdb_printf("-%ll", authority);
21746432Sas200622 
21756432Sas200622 	for (i = 0; i < psid->sid_subauthcnt; i++)
21766432Sas200622 		mdb_printf("-%d", psid->sid_subauth[i]);
21776432Sas200622 
21786432Sas200622 	return (DCMD_OK);
21796432Sas200622 }
21806432Sas200622 
21816432Sas200622 /*
21826432Sas200622  * *****************************************************************************
21836432Sas200622  * ********************************* smb_fssd_t ********************************
21846432Sas200622  * *****************************************************************************
21856432Sas200622  */
21866432Sas200622 
21876432Sas200622 /*
21886432Sas200622  * ::smbfssd
21896432Sas200622  */
21906432Sas200622 static int
smb_fssd(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)21916432Sas200622 smb_fssd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
21926432Sas200622 {
21936432Sas200622 	smb_fssd_t	fssd;
21946432Sas200622 	int		rc;
21956432Sas200622 
21966432Sas200622 	/*
21976432Sas200622 	 * An smb_fssd address is required.
21986432Sas200622 	 */
21996432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
22006432Sas200622 		return (DCMD_USAGE);
22016432Sas200622 
22026432Sas200622 	if (mdb_vread(&fssd, sizeof (fssd), addr) != sizeof (fssd)) {
22036432Sas200622 		mdb_warn("failed to read struct smb_fssd at %p", addr);
22046432Sas200622 		return (DCMD_ERR);
22056432Sas200622 	}
22066432Sas200622 
22076432Sas200622 	mdb_printf("FSSD secinfo: 0x%x\n", fssd.sd_secinfo);
22086432Sas200622 	if (fssd.sd_secinfo & SMB_OWNER_SECINFO)
22096432Sas200622 		mdb_printf("FSSD uid: %d\n", fssd.sd_uid);
22106432Sas200622 	if (fssd.sd_secinfo & SMB_GROUP_SECINFO)
22116432Sas200622 		mdb_printf("FSSD gid: %d\n", fssd.sd_gid);
22126432Sas200622 	if (fssd.sd_secinfo & SMB_SACL_SECINFO && fssd.sd_zsacl) {
22136432Sas200622 		mdb_printf("%<b>%<u>System ACL%</u>%</b>\n");
22146432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
22156432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)fssd.sd_zsacl, flags,
22166432Sas200622 		    argc, argv);
22176432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
22186432Sas200622 		if (rc != DCMD_OK)
22196432Sas200622 			return (rc);
22206432Sas200622 	}
22216432Sas200622 	if (fssd.sd_secinfo & SMB_DACL_SECINFO && fssd.sd_zdacl) {
22226432Sas200622 		mdb_printf("%<b>%<u>Discretionary ACL%</u>%</b>\n");
22236432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
22246432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)fssd.sd_zdacl, flags,
22256432Sas200622 		    argc, argv);
22266432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
22276432Sas200622 		if (rc != DCMD_OK)
22286432Sas200622 			return (rc);
22296432Sas200622 	}
22306432Sas200622 
22316432Sas200622 	return (DCMD_OK);
22326432Sas200622 }
22336432Sas200622 
22346432Sas200622 /*
22356432Sas200622  * *****************************************************************************
22366432Sas200622  * **************************** Utility Funcions *******************************
22376432Sas200622  * *****************************************************************************
22386432Sas200622  */
22395331Samw 
22406432Sas200622 /*
22416432Sas200622  * smb_dcmd_getopt
22426432Sas200622  *
22436432Sas200622  * This function analyzes the arguments passed in and sets the bit corresponding
22446432Sas200622  * to the options found in the opts variable.
22456432Sas200622  *
22466432Sas200622  * Return Value
22476432Sas200622  *
22486432Sas200622  *	-1	An error occured during the decoding
22496432Sas200622  *	0	The decoding was successful
22506432Sas200622  */
22516432Sas200622 static int
smb_dcmd_getopt(uint_t * opts,int argc,const mdb_arg_t * argv)22526432Sas200622 smb_dcmd_getopt(uint_t *opts, int argc, const mdb_arg_t *argv)
22536432Sas200622 {
22546432Sas200622 	*opts = 0;
22556432Sas200622 
22566432Sas200622 	if (mdb_getopts(argc, argv,
22576432Sas200622 	    's', MDB_OPT_SETBITS, SMB_OPT_SERVER, opts,
22586432Sas200622 	    'e', MDB_OPT_SETBITS, SMB_OPT_SESSION, opts,
22596432Sas200622 	    'r', MDB_OPT_SETBITS, SMB_OPT_REQUEST, opts,
22606432Sas200622 	    'u', MDB_OPT_SETBITS, SMB_OPT_USER, opts,
22616432Sas200622 	    't', MDB_OPT_SETBITS, SMB_OPT_TREE, opts,
22626432Sas200622 	    'f', MDB_OPT_SETBITS, SMB_OPT_OFILE, opts,
22636432Sas200622 	    'd', MDB_OPT_SETBITS, SMB_OPT_ODIR, opts,
22646432Sas200622 	    'w', MDB_OPT_SETBITS, SMB_OPT_WALK, opts,
22656432Sas200622 	    'v', MDB_OPT_SETBITS, SMB_OPT_VERBOSE, opts,
22666432Sas200622 	    NULL) != argc)
22676432Sas200622 		return (-1);
22686432Sas200622 
22696432Sas200622 	return (0);
22706432Sas200622 }
22716432Sas200622 
22726432Sas200622 /*
22736432Sas200622  * smb_dcmd_setopt
22746432Sas200622  *
22756432Sas200622  * This function set the arguments corresponding to the bits set in opts.
22766432Sas200622  *
22776432Sas200622  * Return Value
22786432Sas200622  *
22796432Sas200622  *	Number of arguments set.
22806432Sas200622  */
22816432Sas200622 static int
smb_dcmd_setopt(uint_t opts,int max_argc,mdb_arg_t * argv)22826432Sas200622 smb_dcmd_setopt(uint_t opts, int max_argc, mdb_arg_t *argv)
22835331Samw {
22846432Sas200622 	int	i;
22856432Sas200622 	int	argc = 0;
22866432Sas200622 
22876432Sas200622 	for (i = 0; i < SMB_MDB_MAX_OPTS; i++) {
228812508Samw@Sun.COM 		if ((opts & smb_opts[i].o_value) && (argc < max_argc)) {
22896432Sas200622 			argv->a_type = MDB_TYPE_STRING;
229012508Samw@Sun.COM 			argv->a_un.a_str = smb_opts[i].o_name;
22916432Sas200622 			argc++;
22926432Sas200622 			argv++;
22936432Sas200622 		}
22946432Sas200622 	}
22956432Sas200622 	return (argc);
22965331Samw }
22976432Sas200622 
22986432Sas200622 /*
22996432Sas200622  * smb_obj_expand
23006432Sas200622  */
23016432Sas200622 static int
smb_obj_expand(uintptr_t addr,uint_t opts,const smb_exp_t * x,ulong_t indent)23026432Sas200622 smb_obj_expand(uintptr_t addr, uint_t opts, const smb_exp_t *x, ulong_t indent)
23036432Sas200622 {
23046432Sas200622 	int		rc = 0;
23056432Sas200622 	int		argc;
23066432Sas200622 	mdb_arg_t	argv[SMB_MDB_MAX_OPTS];
23076432Sas200622 
23086432Sas200622 	argc = smb_dcmd_setopt(opts | SMB_OPT_WALK, SMB_MDB_MAX_OPTS, argv);
23096432Sas200622 
23106432Sas200622 	(void) mdb_inc_indent(indent);
23116432Sas200622 	while (x->ex_dcmd) {
23126432Sas200622 		if (x->ex_mask & opts) {
23136432Sas200622 			rc = mdb_pwalk_dcmd("list", x->ex_dcmd, argc, argv,
23146432Sas200622 			    addr + x->ex_offset);
23156432Sas200622 
23166432Sas200622 			if (rc) {
23176432Sas200622 				mdb_warn("failed to walk the list of %s in %p",
23186432Sas200622 				    x->ex_name, addr + x->ex_offset);
23196432Sas200622 				break;
23206432Sas200622 			}
23216432Sas200622 		}
23226432Sas200622 		x++;
23236432Sas200622 	}
23246432Sas200622 	(void) mdb_dec_indent(indent);
23256432Sas200622 	return (rc);
23266432Sas200622 }
23276432Sas200622 
23286432Sas200622 /*
23296432Sas200622  * smb_obj_list
23306432Sas200622  *
23316432Sas200622  * Function called by the DCMDs when no address is provided. It expands the
23326432Sas200622  * tree under the object type associated with the calling DCMD (based on the
23336432Sas200622  * flags passed in).
23346432Sas200622  *
23356432Sas200622  * Return Value
23366432Sas200622  *
23376432Sas200622  *	DCMD_OK
23386432Sas200622  *	DCMD_ERR
23396432Sas200622  */
23406432Sas200622 static int
smb_obj_list(const char * name,uint_t opts,uint_t flags)23416432Sas200622 smb_obj_list(const char *name, uint_t opts, uint_t flags)
23426432Sas200622 {
23436432Sas200622 	int		argc;
23446432Sas200622 	mdb_arg_t	argv[SMB_MDB_MAX_OPTS];
23456432Sas200622 
23466432Sas200622 	argc = smb_dcmd_setopt(opts, SMB_MDB_MAX_OPTS, argv);
23476432Sas200622 
23486432Sas200622 	if (mdb_call_dcmd("smblist", 0, flags, argc, argv)) {
23496432Sas200622 		mdb_warn("failed to list %s", name);
23506432Sas200622 		return (DCMD_ERR);
23516432Sas200622 	}
23526432Sas200622 	return (DCMD_OK);
23536432Sas200622 }
23549021Samw@Sun.COM 
23559021Samw@Sun.COM static int
smb_worker_findstack(uintptr_t addr)23569021Samw@Sun.COM smb_worker_findstack(uintptr_t addr)
23579021Samw@Sun.COM {
23589021Samw@Sun.COM 	kthread_t	t;
23599021Samw@Sun.COM 	taskq_t		tq;
23609021Samw@Sun.COM 	char		cmd[80];
23619021Samw@Sun.COM 	mdb_arg_t	cmdarg;
23629021Samw@Sun.COM 
23639021Samw@Sun.COM 	if (mdb_vread(&t, sizeof (kthread_t), addr) == -1) {
23649021Samw@Sun.COM 		mdb_warn("failed to read kthread_t at %p", addr);
23659021Samw@Sun.COM 		return (DCMD_ERR);
23669021Samw@Sun.COM 	}
23679021Samw@Sun.COM 
23689021Samw@Sun.COM 	if (mdb_vread(&tq, sizeof (taskq_t), (uintptr_t)t.t_taskq) == -1)
23699021Samw@Sun.COM 		tq.tq_name[0] = '\0';
23709021Samw@Sun.COM 
23719021Samw@Sun.COM 	mdb_inc_indent(2);
23729021Samw@Sun.COM 
23739021Samw@Sun.COM 	mdb_printf("PC: %a", t.t_pc);
23749021Samw@Sun.COM 	if (t.t_tid == 0) {
23759021Samw@Sun.COM 		if (tq.tq_name[0] != '\0')
23769021Samw@Sun.COM 			mdb_printf("    TASKQ: %s\n", tq.tq_name);
23779021Samw@Sun.COM 		else
23789021Samw@Sun.COM 			mdb_printf("    THREAD: %a()\n", t.t_startpc);
23799021Samw@Sun.COM 	}
23809021Samw@Sun.COM 
23819021Samw@Sun.COM 	mdb_snprintf(cmd, sizeof (cmd), "<.$c%d", 16);
23829021Samw@Sun.COM 	cmdarg.a_type = MDB_TYPE_STRING;
23839021Samw@Sun.COM 	cmdarg.a_un.a_str = cmd;
23849021Samw@Sun.COM 	(void) mdb_call_dcmd("findstack", addr, DCMD_ADDRSPEC, 1, &cmdarg);
23859021Samw@Sun.COM 	mdb_dec_indent(2);
23869021Samw@Sun.COM 	mdb_printf("\n");
23879021Samw@Sun.COM 	return (DCMD_OK);
23889021Samw@Sun.COM }
2389