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 *); 378*12890SJoyce.McIntosh@Sun.COM static int smb_oplock(uintptr_t, uint_t, int, const mdb_arg_t *); 379*12890SJoyce.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]", 448*12890SJoyce.McIntosh@Sun.COM "print smb_file_t information", 4496432Sas200622 smb_dcmd_ofile }, 450*12890SJoyce.McIntosh@Sun.COM { "smboplock", NULL, 451*12890SJoyce.McIntosh@Sun.COM "print smb_oplock_t information", smb_oplock }, 452*12890SJoyce.McIntosh@Sun.COM { "smboplockgrant", NULL, 453*12890SJoyce.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 * 4976432Sas200622 _mdb_init(void) 4985331Samw { 4996432Sas200622 return (&modinfo); 5005331Samw } 5015331Samw 5025331Samw /* 5036432Sas200622 * ***************************************************************************** 5046432Sas200622 * ****************************** Top level DCMD ******************************* 5056432Sas200622 * ***************************************************************************** 5065331Samw */ 5076432Sas200622 5086432Sas200622 static 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 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, 5876432Sas200622 offsetof(smb_server_t, sv_nbt_daemon.ld_session_list.se_rdy.lst), 5886432Sas200622 "smbsess", "smb_session"}, 5896432Sas200622 { SMB_OPT_ALL_OBJ, 5906432Sas200622 offsetof(smb_server_t, sv_nbt_daemon.ld_session_list.se_act.lst), 5916432Sas200622 "smbsess", "smb_session"}, 5926432Sas200622 { SMB_OPT_ALL_OBJ, 5936432Sas200622 offsetof(smb_server_t, sv_tcp_daemon.ld_session_list.se_rdy.lst), 5946432Sas200622 "smbsess", "smb_session"}, 5956432Sas200622 { SMB_OPT_ALL_OBJ, 5966432Sas200622 offsetof(smb_server_t, sv_tcp_daemon.ld_session_list.se_act.lst), 5976432Sas200622 "smbsess", "smb_session"}, 5986432Sas200622 { 0, 0, NULL, NULL } 5996432Sas200622 }; 6006432Sas200622 6016432Sas200622 /* 6026432Sas200622 * ::smbsrv 6036432Sas200622 * 6046432Sas200622 * smbsrv dcmd - Print out smb_server structures. 6056432Sas200622 */ 6066432Sas200622 /*ARGSUSED*/ 6076432Sas200622 static int 6086432Sas200622 smb_dcmd_server(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 6096432Sas200622 { 6106432Sas200622 uint_t opts; 6116432Sas200622 ulong_t indent = 0; 6125331Samw 6136432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 6146432Sas200622 return (DCMD_USAGE); 6156432Sas200622 6166432Sas200622 if (!(flags & DCMD_ADDRSPEC)) 6176432Sas200622 return (smb_obj_list("smb_server", opts | SMB_OPT_SERVER, 6186432Sas200622 flags)); 6196432Sas200622 6206432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_SERVER)) || 6216432Sas200622 !(opts & SMB_OPT_WALK)) { 6226432Sas200622 smb_server_t *sv; 6236432Sas200622 const char *state; 6246432Sas200622 6256432Sas200622 sv = mdb_alloc(sizeof (smb_server_t), UM_SLEEP | UM_GC); 6266432Sas200622 if (mdb_vread(sv, sizeof (smb_server_t), addr) == -1) { 6276432Sas200622 mdb_warn("failed to read smb_server at %p", addr); 6286432Sas200622 return (DCMD_ERR); 6295331Samw } 6306432Sas200622 6316432Sas200622 indent = SMB_DCMD_INDENT; 6326432Sas200622 6336432Sas200622 if (opts & SMB_OPT_VERBOSE) { 6346432Sas200622 mdb_arg_t argv; 6356432Sas200622 6366432Sas200622 argv.a_type = MDB_TYPE_STRING; 6376432Sas200622 argv.a_un.a_str = "smb_server_t"; 6386432Sas200622 if (mdb_call_dcmd("print", addr, flags, 1, &argv)) 6396432Sas200622 return (DCMD_ERR); 6406432Sas200622 } else { 6416432Sas200622 if (DCMD_HDRSPEC(flags)) 6426432Sas200622 mdb_printf( 6436432Sas200622 "%<b>%<u>%-?s% " 6446432Sas200622 "%-4s% " 6456432Sas200622 "%-32s% " 64612508Samw@Sun.COM "%</u>%</b>\n", 64712508Samw@Sun.COM "SERVER", "ZONE", "STATE"); 6486432Sas200622 6496432Sas200622 if (sv->sv_state >= SMB_SERVER_STATE_SENTINEL) 6506432Sas200622 state = "UNKNOWN"; 6516432Sas200622 else 6526432Sas200622 state = smb_server_state[sv->sv_state]; 6536432Sas200622 65412508Samw@Sun.COM mdb_printf("%-?p %-4d %-32s \n", 65512508Samw@Sun.COM addr, sv->sv_zid, state); 6566432Sas200622 } 6576432Sas200622 } 6586432Sas200622 if (smb_obj_expand(addr, opts, smb_server_exp, indent)) 6596432Sas200622 return (DCMD_ERR); 6606432Sas200622 return (DCMD_OK); 6616432Sas200622 } 6626432Sas200622 6636432Sas200622 /* 6646432Sas200622 * ***************************************************************************** 6656432Sas200622 * ***************************** smb_session_t ********************************* 6666432Sas200622 * ***************************************************************************** 6676432Sas200622 */ 6686432Sas200622 6696432Sas200622 static const char *smb_session_state[SMB_SESSION_STATE_SENTINEL] = 6706432Sas200622 { 6716432Sas200622 "INITIALIZED", 6726432Sas200622 "DISCONNECTED", 6736432Sas200622 "CONNECTED", 6746432Sas200622 "ESTABLISHED", 6756432Sas200622 "NEGOTIATED", 6766432Sas200622 "OPLOCK_BREAKING", 6776432Sas200622 "WRITE_RAW_ACTIVE", 67811963SAfshin.Ardakani@Sun.COM "READ_RAW_ACTIVE", 6796432Sas200622 "TERMINATED" 6806432Sas200622 }; 6816432Sas200622 6826432Sas200622 /* 6836432Sas200622 * List of objects that can be expanded under a session structure. 6846432Sas200622 */ 6856432Sas200622 static const smb_exp_t smb_session_exp[] = 6866432Sas200622 { 6876432Sas200622 { SMB_OPT_REQUEST, 6886432Sas200622 offsetof(smb_session_t, s_req_list.sl_list), 6896432Sas200622 "smbreq", "smb_request"}, 6906432Sas200622 { SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_OFILE | SMB_OPT_ODIR, 6916432Sas200622 offsetof(smb_session_t, s_user_list.ll_list), 6926432Sas200622 "smbuser", "smb_user"}, 6936432Sas200622 { 0, 0, NULL, NULL} 6946432Sas200622 }; 6956432Sas200622 6966432Sas200622 static void 6976432Sas200622 smb_dcmd_session_help(void) 6986432Sas200622 { 6996432Sas200622 mdb_printf( 7006432Sas200622 "Display the contents of smb_session_t, with optional" 7016432Sas200622 " filtering.\n\n"); 7026432Sas200622 (void) mdb_dec_indent(2); 7036432Sas200622 mdb_printf("%<b>OPTIONS%</b>\n"); 7046432Sas200622 (void) mdb_inc_indent(2); 7056432Sas200622 mdb_printf( 7066432Sas200622 "-v\tDisplay verbose smb_session information\n" 7076432Sas200622 "-r\tDisplay the list of smb requests attached\n" 7086432Sas200622 "-u\tDisplay the list of users attached\n"); 7096432Sas200622 } 7106432Sas200622 7116432Sas200622 /* 7126432Sas200622 * ::smbsess 7136432Sas200622 * 7146432Sas200622 * smbsess dcmd - Print out the smb_session structure. 7156432Sas200622 */ 7166432Sas200622 /*ARGSUSED*/ 7176432Sas200622 static int 7186432Sas200622 smb_dcmd_session(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 7196432Sas200622 { 7206432Sas200622 uint_t opts; 7216432Sas200622 ulong_t indent = 0; 7226432Sas200622 7236432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 7246432Sas200622 return (DCMD_USAGE); 7256432Sas200622 7266432Sas200622 if (!(flags & DCMD_ADDRSPEC)) { 7276432Sas200622 opts |= SMB_OPT_SESSION; 7286432Sas200622 opts &= ~SMB_OPT_SERVER; 7296432Sas200622 return (smb_obj_list("smb_session", opts, flags)); 7306432Sas200622 } 7316432Sas200622 7326432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_SESSION)) || 7336432Sas200622 !(opts & SMB_OPT_WALK)) { 7346432Sas200622 smb_session_t *se; 7356432Sas200622 const char *state; 7366432Sas200622 7376432Sas200622 indent = SMB_DCMD_INDENT; 7386432Sas200622 7396432Sas200622 se = mdb_alloc(sizeof (*se), UM_SLEEP | UM_GC); 7406432Sas200622 if (mdb_vread(se, sizeof (*se), addr) == -1) { 7416432Sas200622 mdb_warn("failed to read smb_session at %p", addr); 7426432Sas200622 return (DCMD_ERR); 7436432Sas200622 } 7446432Sas200622 if (se->s_state >= SMB_SESSION_STATE_SENTINEL) 7456432Sas200622 state = "INVALID"; 7466432Sas200622 else 7476432Sas200622 state = smb_session_state[se->s_state]; 7486432Sas200622 7496432Sas200622 if (opts & SMB_OPT_VERBOSE) { 7506432Sas200622 mdb_printf("%<b>%<u>SMB session information " 7516432Sas200622 "(%p): %</u>%</b>\n", addr); 7526432Sas200622 mdb_printf("Client IP address: %I\n", se->ipaddr); 7536432Sas200622 mdb_printf("Local IP Address: %I\n", se->local_ipaddr); 7546432Sas200622 mdb_printf("Session KID: %u\n", se->s_kid); 7556432Sas200622 mdb_printf("Workstation Name: %s\n", 7566432Sas200622 se->workstation); 7576432Sas200622 mdb_printf("Session state: %u (%s)\n", se->s_state, 7586432Sas200622 state); 7596432Sas200622 mdb_printf("Number of Users: %u\n", 7606432Sas200622 se->s_user_list.ll_count); 7616432Sas200622 mdb_printf("Number of Trees: %u\n", se->s_tree_cnt); 7626432Sas200622 mdb_printf("Number of Files: %u\n", se->s_file_cnt); 7636432Sas200622 mdb_printf("Number of Shares: %u\n", se->s_dir_cnt); 7646432Sas200622 mdb_printf("Number of active Transact.: %u\n\n", 7656432Sas200622 se->s_xa_list.ll_count); 7666432Sas200622 } else { 7676432Sas200622 if (DCMD_HDRSPEC(flags)) 7686432Sas200622 mdb_printf( 7696432Sas200622 "%<b>%<u>%-?s " 7706432Sas200622 "%-16s " 77112508Samw@Sun.COM "%-16s %-16s%</u>%</b>\n", 7726432Sas200622 "SESSION", "CLIENT_IP_ADDR", 77312508Samw@Sun.COM "LOCAL_IP_ADDR", "STATE"); 7749021Samw@Sun.COM 7756432Sas200622 mdb_printf( 77612508Samw@Sun.COM "%-?p %-16I %-16I %s\n", addr, se->ipaddr.a_ipv4, 77712508Samw@Sun.COM se->local_ipaddr.a_ipv4, state); 7785331Samw } 7795331Samw } 7806432Sas200622 if (smb_obj_expand(addr, opts, smb_session_exp, indent)) 7816432Sas200622 return (DCMD_ERR); 7826432Sas200622 return (DCMD_OK); 7836432Sas200622 } 7845331Samw 7856432Sas200622 /* 7866432Sas200622 * ***************************************************************************** 7876432Sas200622 * **************************** smb_request_t ********************************** 7886432Sas200622 * ***************************************************************************** 7896432Sas200622 */ 7906432Sas200622 7916432Sas200622 static const char *smb_request_state[SMB_REQ_STATE_SENTINEL] = 7926432Sas200622 { 7936432Sas200622 "FREE", 7946432Sas200622 "INITIALIZING", 7956432Sas200622 "SUBMITTED", 7966432Sas200622 "ACTIVE", 7976432Sas200622 "WAITING_EVENT", 7986432Sas200622 "EVENT_OCCURRED", 7996432Sas200622 "WAITING_LOCK", 8006432Sas200622 "COMPLETED", 8016432Sas200622 "CANCELED", 8026432Sas200622 "CLEANED_UP" 8036432Sas200622 }; 8046432Sas200622 80512508Samw@Sun.COM #define SMB_REQUEST_BANNER \ 80612508Samw@Sun.COM "%<b>%<u>%-?s %-?s %-14s %-14s %-16s %-32s%</u>%</b>\n" 80712508Samw@Sun.COM #define SMB_REQUEST_FORMAT \ 808*12890SJoyce.McIntosh@Sun.COM "%-?p %-?p %-14lld %-14lld %-16s %s\n" 80912508Samw@Sun.COM 8106432Sas200622 static int 8116432Sas200622 smb_dcmd_request(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 8126432Sas200622 { 8136432Sas200622 uint_t opts; 8146432Sas200622 8156432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 8166432Sas200622 return (DCMD_USAGE); 8176432Sas200622 8186432Sas200622 if (!(flags & DCMD_ADDRSPEC)) { 8196432Sas200622 opts |= SMB_OPT_REQUEST; 8206432Sas200622 opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_USER); 8216432Sas200622 return (smb_obj_list("smb_request", opts, flags)); 8226432Sas200622 } 8236432Sas200622 8246432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_REQUEST)) || 8256432Sas200622 !(opts & SMB_OPT_WALK)) { 8266432Sas200622 smb_request_t *sr; 8276432Sas200622 const char *state; 82812508Samw@Sun.COM uint64_t waiting; 82912508Samw@Sun.COM uint64_t running; 8306432Sas200622 8316432Sas200622 sr = mdb_alloc(sizeof (*sr), UM_SLEEP | UM_GC); 8326432Sas200622 if (mdb_vread(sr, sizeof (*sr), addr) == -1) { 8336432Sas200622 mdb_warn("failed to read smb_request at %p", addr); 8346432Sas200622 return (DCMD_ERR); 8356432Sas200622 } 83612508Samw@Sun.COM if (sr->sr_magic != SMB_REQ_MAGIC) { 83712508Samw@Sun.COM mdb_warn("not an smb_request_t (%p)>", addr); 83812508Samw@Sun.COM return (DCMD_ERR); 83912508Samw@Sun.COM } 84012508Samw@Sun.COM waiting = 0; 84112508Samw@Sun.COM running = 0; 84212508Samw@Sun.COM if (sr->sr_time_submitted != 0) { 84312508Samw@Sun.COM if (sr->sr_time_active != 0) { 84412508Samw@Sun.COM waiting = sr->sr_time_active - 84512508Samw@Sun.COM sr->sr_time_submitted; 84612508Samw@Sun.COM running = mdb_gethrtime() - 84712508Samw@Sun.COM sr->sr_time_active; 84812508Samw@Sun.COM } else { 84912508Samw@Sun.COM waiting = mdb_gethrtime() - 85012508Samw@Sun.COM sr->sr_time_submitted; 85112508Samw@Sun.COM } 85212508Samw@Sun.COM } 85312508Samw@Sun.COM waiting /= NANOSEC; 85412508Samw@Sun.COM running /= NANOSEC; 8556432Sas200622 8566432Sas200622 if (sr->sr_state >= SMB_REQ_STATE_SENTINEL) 8576432Sas200622 state = "INVALID"; 8586432Sas200622 else 8596432Sas200622 state = smb_request_state[sr->sr_state]; 8606432Sas200622 8616432Sas200622 if (opts & SMB_OPT_VERBOSE) { 8626432Sas200622 mdb_printf( 8639021Samw@Sun.COM "%</b>%</u>SMB request information (%p):" 8646432Sas200622 "%</u>%</b>\n\n", addr); 86512508Samw@Sun.COM 86612508Samw@Sun.COM mdb_printf( 86712508Samw@Sun.COM "first SMB COM: %u (%s)\n" 86812508Samw@Sun.COM "current SMB COM: %u (%s)\n" 86912508Samw@Sun.COM "state: %u (%s)\n" 87012508Samw@Sun.COM "TID(tree): %u (%p)\n" 87112508Samw@Sun.COM "UID(user): %u (%p)\n" 87212508Samw@Sun.COM "FID(file): %u (%p)\n" 87312508Samw@Sun.COM "PID: %u\n" 87412508Samw@Sun.COM "MID: %u\n\n" 875*12890SJoyce.McIntosh@Sun.COM "waiting time: %lld\n" 876*12890SJoyce.McIntosh@Sun.COM "running time: %lld\n", 877*12890SJoyce.McIntosh@Sun.COM sr->first_smb_com, 878*12890SJoyce.McIntosh@Sun.COM smb_com[sr->first_smb_com].smb_com, 879*12890SJoyce.McIntosh@Sun.COM sr->smb_com, 880*12890SJoyce.McIntosh@Sun.COM smb_com[sr->smb_com].smb_com, 88112508Samw@Sun.COM sr->sr_state, state, 88212508Samw@Sun.COM sr->smb_tid, sr->tid_tree, 88312508Samw@Sun.COM sr->smb_uid, sr->uid_user, 88412508Samw@Sun.COM sr->smb_fid, sr->fid_ofile, 88512508Samw@Sun.COM sr->smb_pid, 88612508Samw@Sun.COM sr->smb_mid, 88712508Samw@Sun.COM waiting, 88812508Samw@Sun.COM running); 88912508Samw@Sun.COM 8909021Samw@Sun.COM smb_worker_findstack((uintptr_t)sr->sr_worker); 8916432Sas200622 } else { 8926432Sas200622 if (DCMD_HDRSPEC(flags)) 8936432Sas200622 mdb_printf( 89412508Samw@Sun.COM SMB_REQUEST_BANNER, 89512508Samw@Sun.COM "ADDR", 89612508Samw@Sun.COM "WORKER", 89712508Samw@Sun.COM "WAITING(s)", 89812508Samw@Sun.COM "RUNNING(s)", 89912508Samw@Sun.COM "STATE", 90012508Samw@Sun.COM "COMMAND"); 9016432Sas200622 90212508Samw@Sun.COM mdb_printf(SMB_REQUEST_FORMAT, 90312508Samw@Sun.COM addr, 90412508Samw@Sun.COM sr->sr_worker, 90512508Samw@Sun.COM waiting, 90612508Samw@Sun.COM running, 90712508Samw@Sun.COM state, 908*12890SJoyce.McIntosh@Sun.COM smb_com[sr->smb_com].smb_com); 9096432Sas200622 } 9106432Sas200622 } 9116432Sas200622 return (DCMD_OK); 9126432Sas200622 } 9136432Sas200622 9146432Sas200622 /* 9156432Sas200622 * ***************************************************************************** 9166432Sas200622 * ****************************** smb_user_t *********************************** 9176432Sas200622 * ***************************************************************************** 9186432Sas200622 */ 9196432Sas200622 9206432Sas200622 static const char *smb_user_state[SMB_USER_STATE_SENTINEL] = 9216432Sas200622 { 9226432Sas200622 "LOGGED_IN", 9236432Sas200622 "LOGGING_OFF", 9246432Sas200622 "LOGGED_OFF" 9256432Sas200622 }; 9266432Sas200622 9276432Sas200622 /* 9286432Sas200622 * List of objects that can be expanded under a user structure. 9296432Sas200622 */ 9306432Sas200622 static const smb_exp_t smb_user_exp[] = 9316432Sas200622 { 9326432Sas200622 { SMB_OPT_TREE | SMB_OPT_OFILE | SMB_OPT_ODIR, 9336432Sas200622 offsetof(smb_user_t, u_tree_list.ll_list), 9346432Sas200622 "smbtree", "smb_tree"}, 9356432Sas200622 { 0, 0, NULL, NULL} 9366432Sas200622 }; 9376432Sas200622 9386432Sas200622 static void 9396432Sas200622 smb_dcmd_user_help(void) 9406432Sas200622 { 9416432Sas200622 mdb_printf( 9426432Sas200622 "Display the contents of smb_user_t, with optional filtering.\n\n"); 9436432Sas200622 (void) mdb_dec_indent(2); 9446432Sas200622 mdb_printf("%<b>OPTIONS%</b>\n"); 9456432Sas200622 (void) mdb_inc_indent(2); 9466432Sas200622 mdb_printf( 9476432Sas200622 "-v\tDisplay verbose smb_user information\n" 9486432Sas200622 "-d\tDisplay the list of smb_odirs attached\n" 9496432Sas200622 "-f\tDisplay the list of smb_ofiles attached\n" 9506432Sas200622 "-t\tDisplay the list of smb_trees attached\n"); 9515331Samw } 9525331Samw 9535331Samw static int 9546432Sas200622 smb_dcmd_user(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 9555331Samw { 9566432Sas200622 uint_t opts; 9576432Sas200622 ulong_t indent = 0; 9586432Sas200622 9596432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 9606432Sas200622 return (DCMD_USAGE); 9616432Sas200622 9626432Sas200622 if (!(flags & DCMD_ADDRSPEC)) { 9636432Sas200622 opts |= SMB_OPT_USER; 9646432Sas200622 opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST); 9656432Sas200622 return (smb_obj_list("smb_user", opts, flags)); 9666432Sas200622 } 9676432Sas200622 9686432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_USER)) || 9696432Sas200622 !(opts & SMB_OPT_WALK)) { 9706432Sas200622 smb_user_t *user; 9716432Sas200622 char *account; 9726432Sas200622 9736432Sas200622 indent = SMB_DCMD_INDENT; 9746432Sas200622 9756432Sas200622 user = mdb_alloc(sizeof (*user), UM_SLEEP | UM_GC); 9766432Sas200622 if (mdb_vread(user, sizeof (*user), addr) == -1) { 9776432Sas200622 mdb_warn("failed to read smb_user at %p", addr); 9786432Sas200622 return (DCMD_ERR); 9796432Sas200622 } 9806432Sas200622 account = mdb_zalloc(user->u_domain_len + user->u_name_len + 2, 9816432Sas200622 UM_SLEEP | UM_GC); 9826432Sas200622 9836432Sas200622 if (user->u_domain_len) 9846432Sas200622 (void) mdb_vread(account, user->u_domain_len, 9856432Sas200622 (uintptr_t)user->u_domain); 9866432Sas200622 9876432Sas200622 strcat(account, "\\"); 9886432Sas200622 9896432Sas200622 if (user->u_name_len) 9906432Sas200622 (void) mdb_vread(account + strlen(account), 9916432Sas200622 user->u_name_len, (uintptr_t)user->u_name); 9926432Sas200622 9936432Sas200622 if (opts & SMB_OPT_VERBOSE) { 9946432Sas200622 const char *state; 9956432Sas200622 9966432Sas200622 if (user->u_state >= SMB_USER_STATE_SENTINEL) 9976432Sas200622 state = "INVALID"; 9986432Sas200622 else 9996432Sas200622 state = smb_user_state[user->u_state]; 10006432Sas200622 10016432Sas200622 mdb_printf("%<b>%<u>SMB user information (%p):" 10026432Sas200622 "%</u>%</b>\n", addr); 10036432Sas200622 mdb_printf("UID: %u\n", user->u_uid); 10046432Sas200622 mdb_printf("State: %d (%s)\n", user->u_state, state); 10056432Sas200622 mdb_printf("Flags: 0x%08x\n", user->u_flags); 10066432Sas200622 mdb_printf("Privileges: 0x%08x\n", user->u_privileges); 10076432Sas200622 mdb_printf("Credential: %p\n", user->u_cred); 10086432Sas200622 mdb_printf("Reference Count: %d\n", user->u_refcnt); 10096432Sas200622 mdb_printf("User Account: %s\n\n", account); 10106432Sas200622 } else { 10116432Sas200622 if (DCMD_HDRSPEC(flags)) 10126432Sas200622 mdb_printf( 10136432Sas200622 "%<b>%<u>%?-s " 10146432Sas200622 "%-5s " 10156432Sas200622 "%-32s%</u>%</b>\n", 10166432Sas200622 "USER", "UID", "ACCOUNT"); 10176432Sas200622 10186432Sas200622 mdb_printf("%-?p %-5u %-32s\n", addr, user->u_uid, 10196432Sas200622 account); 10206432Sas200622 } 10216432Sas200622 } 10226432Sas200622 if (smb_obj_expand(addr, opts, smb_user_exp, indent)) 10236432Sas200622 return (DCMD_ERR); 10246432Sas200622 return (DCMD_OK); 10255331Samw } 10265331Samw 10275331Samw /* 10286432Sas200622 * ***************************************************************************** 10296432Sas200622 * ****************************** smb_tree_t *********************************** 10306432Sas200622 * ***************************************************************************** 10315331Samw */ 10326432Sas200622 10336432Sas200622 static const char *smb_tree_state[SMB_TREE_STATE_SENTINEL] = 10346432Sas200622 { 10356432Sas200622 "CONNECTED", 10366432Sas200622 "DISCONNECTING", 10376432Sas200622 "DISCONNECTED" 10386432Sas200622 }; 10396432Sas200622 10406432Sas200622 /* 10416432Sas200622 * List of objects that can be expanded under a tree structure. 10426432Sas200622 */ 10436432Sas200622 static const smb_exp_t smb_tree_exp[] = 10445331Samw { 10456432Sas200622 { SMB_OPT_OFILE, 10466432Sas200622 offsetof(smb_tree_t, t_ofile_list.ll_list), 10476432Sas200622 "smbofile", "smb_ofile"}, 10486432Sas200622 { SMB_OPT_ODIR, 10496432Sas200622 offsetof(smb_tree_t, t_odir_list.ll_list), 10506432Sas200622 "smbodir", "smb_odir"}, 10516432Sas200622 { 0, 0, NULL, NULL} 10526432Sas200622 }; 10535331Samw 10546432Sas200622 static void 10556432Sas200622 smb_dcmd_tree_help(void) 10566432Sas200622 { 10576432Sas200622 mdb_printf( 10586432Sas200622 "Display the contents of smb_tree_t, with optional filtering.\n\n"); 10596432Sas200622 (void) mdb_dec_indent(2); 10606432Sas200622 mdb_printf("%<b>OPTIONS%</b>\n"); 10616432Sas200622 (void) mdb_inc_indent(2); 10626432Sas200622 mdb_printf( 10636432Sas200622 "-v\tDisplay verbose smb_tree information\n" 10646432Sas200622 "-d\tDisplay the list of smb_odirs attached\n" 10656432Sas200622 "-f\tDisplay the list of smb_ofiles attached\n"); 10666432Sas200622 } 10676432Sas200622 10686432Sas200622 static int 10696432Sas200622 smb_dcmd_tree(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 10706432Sas200622 { 10716432Sas200622 uint_t opts; 10726432Sas200622 ulong_t indent = 0; 10736432Sas200622 10746432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 10755331Samw return (DCMD_USAGE); 10765331Samw 10776432Sas200622 if (!(flags & DCMD_ADDRSPEC)) { 10786432Sas200622 opts |= SMB_OPT_TREE; 10796432Sas200622 opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST | 10806432Sas200622 SMB_OPT_USER); 10816432Sas200622 return (smb_obj_list("smb_tree", opts, flags)); 10826139Sjb150015 } 10835331Samw 10846432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_TREE)) || 10856432Sas200622 !(opts & SMB_OPT_WALK)) { 10866432Sas200622 smb_tree_t *tree; 10876432Sas200622 10886432Sas200622 indent = SMB_DCMD_INDENT; 10896139Sjb150015 10906432Sas200622 tree = mdb_alloc(sizeof (*tree), UM_SLEEP | UM_GC); 10916432Sas200622 if (mdb_vread(tree, sizeof (*tree), addr) == -1) { 10926432Sas200622 mdb_warn("failed to read smb_tree at %p", addr); 10936432Sas200622 return (DCMD_ERR); 10946432Sas200622 } 10956432Sas200622 if (opts & SMB_OPT_VERBOSE) { 10966432Sas200622 const char *state; 10976432Sas200622 10986432Sas200622 if (tree->t_state >= SMB_TREE_STATE_SENTINEL) 10996432Sas200622 state = "INVALID"; 11006432Sas200622 else 11016432Sas200622 state = smb_tree_state[tree->t_state]; 11025331Samw 11036432Sas200622 mdb_printf("%<b>%<u>SMB tree information (%p):" 11046432Sas200622 "%</u>%</b>\n\n", addr); 11056432Sas200622 mdb_printf("TID: %04x\n", tree->t_tid); 11066432Sas200622 mdb_printf("State: %d (%s)\n", tree->t_state, state); 11077348SJose.Borrego@Sun.COM mdb_printf("Share: %s\n", tree->t_sharename); 11086432Sas200622 mdb_printf("Resource: %s\n", tree->t_resource); 11097348SJose.Borrego@Sun.COM mdb_printf("Type: %s\n", tree->t_typename); 11107348SJose.Borrego@Sun.COM mdb_printf("Volume: %s\n", tree->t_volume); 11116432Sas200622 mdb_printf("Umask: %04x\n", tree->t_umask); 11126432Sas200622 mdb_printf("Flags: %08x\n", tree->t_flags); 11136432Sas200622 mdb_printf("SMB Node: %llx\n", tree->t_snode); 11146432Sas200622 mdb_printf("Reference Count: %d\n\n", tree->t_refcnt); 11156432Sas200622 } else { 11166432Sas200622 if (DCMD_HDRSPEC(flags)) 11176432Sas200622 mdb_printf( 11186432Sas200622 "%<b>%<u>%-?s %-5s %-16s %-32s%</u>%</b>\n", 11196432Sas200622 "TREE", "TID", "SHARE NAME", "RESOURCE"); 11206432Sas200622 11216432Sas200622 mdb_printf("%-?p %-5u %-16s %-32s\n", addr, 11226432Sas200622 tree->t_tid, tree->t_sharename, tree->t_resource); 11236432Sas200622 } 11245331Samw } 11256432Sas200622 if (smb_obj_expand(addr, opts, smb_tree_exp, indent)) 11266432Sas200622 return (DCMD_ERR); 11275331Samw return (DCMD_OK); 11285331Samw } 11295331Samw 11306432Sas200622 /* 11316432Sas200622 * ***************************************************************************** 11326432Sas200622 * ****************************** smb_odir_t *********************************** 11336432Sas200622 * ***************************************************************************** 11346432Sas200622 */ 11356432Sas200622 11366432Sas200622 static const char *smb_odir_state[SMB_ODIR_STATE_SENTINEL] = 11375331Samw { 11386432Sas200622 "OPEN", 113911963SAfshin.Ardakani@Sun.COM "IN_USE", 11406432Sas200622 "CLOSING", 11416432Sas200622 "CLOSED" 11426432Sas200622 }; 11435331Samw 11446432Sas200622 static int 11456432Sas200622 smb_dcmd_odir(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 11466432Sas200622 { 11476432Sas200622 uint_t opts; 11486432Sas200622 11496432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 11506432Sas200622 return (DCMD_USAGE); 11516432Sas200622 11526432Sas200622 if (!(flags & DCMD_ADDRSPEC)) { 11536432Sas200622 opts |= SMB_OPT_ODIR; 11546432Sas200622 opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST | 11556432Sas200622 SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_OFILE); 11566432Sas200622 return (smb_obj_list("smb_odir", opts, flags)); 11575331Samw } 11585331Samw 11596432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_ODIR)) || 11606432Sas200622 !(opts & SMB_OPT_WALK)) { 11616432Sas200622 smb_odir_t *od; 11626432Sas200622 11636432Sas200622 od = mdb_alloc(sizeof (*od), UM_SLEEP | UM_GC); 11646432Sas200622 if (mdb_vread(od, sizeof (*od), addr) == -1) { 11656432Sas200622 mdb_warn("failed to read smb_odir at %p", addr); 11666432Sas200622 return (DCMD_ERR); 11676432Sas200622 } 11686432Sas200622 if (opts & SMB_OPT_VERBOSE) { 11696432Sas200622 const char *state; 11706432Sas200622 11716432Sas200622 if (od->d_state >= SMB_ODIR_STATE_SENTINEL) 11726432Sas200622 state = "INVALID"; 11736432Sas200622 else 11746432Sas200622 state = smb_odir_state[od->d_state]; 11756432Sas200622 11766432Sas200622 mdb_printf( 11776432Sas200622 "%<b>%<u>SMB odir information (%p):%</u>%</b>\n\n", 11786432Sas200622 addr); 11796432Sas200622 mdb_printf("State: %d (%s)\n", od->d_state, state); 11808670SJose.Borrego@Sun.COM mdb_printf("SID: %u\n", od->d_odid); 11816432Sas200622 mdb_printf("Reference Count: %d\n", od->d_refcnt); 11826432Sas200622 mdb_printf("Pattern: %s\n", od->d_pattern); 11838670SJose.Borrego@Sun.COM mdb_printf("SMB Node: %p\n\n", od->d_dnode); 11846432Sas200622 } else { 11856432Sas200622 if (DCMD_HDRSPEC(flags)) 11866432Sas200622 mdb_printf( 118710504SKeyur.Desai@Sun.COM "%<b>%<u>%-?s " 11886432Sas200622 "%-5s " 11896432Sas200622 "%-?s " 119010504SKeyur.Desai@Sun.COM "%-16s%</u>%</b>\n", 11916432Sas200622 "ODIR", "SID", "VNODE", "PATTERN"); 11926432Sas200622 119310504SKeyur.Desai@Sun.COM mdb_printf("%?p %-5u %-16p %s\n", 11948670SJose.Borrego@Sun.COM addr, od->d_odid, od->d_dnode, od->d_pattern); 11955331Samw } 11965331Samw } 11976432Sas200622 return (DCMD_OK); 11985331Samw } 11995331Samw 12006432Sas200622 /* 12016432Sas200622 * ***************************************************************************** 12026432Sas200622 * ****************************** smb_ofile_t ********************************** 12036432Sas200622 * ***************************************************************************** 12046432Sas200622 */ 12056432Sas200622 12066432Sas200622 static const char *smb_ofile_state[SMB_OFILE_STATE_SENTINEL] = 12076432Sas200622 { 12086432Sas200622 "OPEN", 12096432Sas200622 "CLOSING", 12106432Sas200622 "CLOSED" 12116432Sas200622 }; 12126432Sas200622 12136432Sas200622 static int 12146432Sas200622 smb_dcmd_ofile(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 12156432Sas200622 { 12166432Sas200622 uint_t opts; 12176432Sas200622 12186432Sas200622 if (smb_dcmd_getopt(&opts, argc, argv)) 12196432Sas200622 return (DCMD_USAGE); 12206432Sas200622 12216432Sas200622 if (!(flags & DCMD_ADDRSPEC)) { 12226432Sas200622 opts |= SMB_OPT_OFILE; 12236432Sas200622 opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST | 12246432Sas200622 SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_ODIR); 12256432Sas200622 return (smb_obj_list("smb_ofile", opts, flags)); 12266432Sas200622 } 12276432Sas200622 12286432Sas200622 if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_OFILE)) || 12296432Sas200622 !(opts & SMB_OPT_WALK)) { 12306432Sas200622 smb_ofile_t *of; 12316432Sas200622 12326432Sas200622 of = mdb_alloc(sizeof (*of), UM_SLEEP | UM_GC); 12336432Sas200622 if (mdb_vread(of, sizeof (*of), addr) == -1) { 12346432Sas200622 mdb_warn("failed to read smb_ofile at %p", addr); 12356432Sas200622 return (DCMD_ERR); 12366432Sas200622 } 12376432Sas200622 if (opts & SMB_OPT_VERBOSE) { 12386432Sas200622 const char *state; 12396432Sas200622 12406432Sas200622 if (of->f_state >= SMB_ODIR_STATE_SENTINEL) 12416432Sas200622 state = "INVALID"; 12426432Sas200622 else 12436432Sas200622 state = smb_ofile_state[of->f_state]; 12446432Sas200622 12456432Sas200622 mdb_printf( 12466432Sas200622 "%<b>%<u>SMB ofile information (%p):%</u>%</b>\n\n", 12476432Sas200622 addr); 12486432Sas200622 mdb_printf("FID: %u\n", of->f_fid); 12496432Sas200622 mdb_printf("State: %d (%s)\n", of->f_state, state); 12506432Sas200622 mdb_printf("SMB Node: %p\n", of->f_node); 12516432Sas200622 mdb_printf("LLF Offset: 0x%llx (%s)\n", 12526432Sas200622 of->f_llf_pos, 12536432Sas200622 ((of->f_flags & SMB_OFLAGS_LLF_POS_VALID) ? 12546432Sas200622 "Valid" : "Invalid")); 12556432Sas200622 mdb_printf("Flags: 0x%08x\n", of->f_flags); 12566432Sas200622 mdb_printf("Credential: %p\n\n", of->f_cr); 12576432Sas200622 } else { 12586432Sas200622 if (DCMD_HDRSPEC(flags)) 12596432Sas200622 mdb_printf( 12606432Sas200622 "%<b>%<u>%-?s " 12616432Sas200622 "%-5s " 12626432Sas200622 "%-?s " 12636432Sas200622 "%-?s%</u>%</b>\n", 12646432Sas200622 "OFILE", "FID", "SMB NODE", "CRED"); 12656432Sas200622 12666432Sas200622 mdb_printf("%?p %-5u %-p %p\n", addr, 12676432Sas200622 of->f_fid, of->f_node, of->f_cr); 12686432Sas200622 } 12696432Sas200622 } 12706432Sas200622 return (DCMD_OK); 12716432Sas200622 } 12726432Sas200622 12736432Sas200622 /* 12746432Sas200622 * ***************************************************************************** 127512508Samw@Sun.COM * ******************************** smb_vfs_t ********************************** 127612508Samw@Sun.COM * ***************************************************************************** 127712508Samw@Sun.COM */ 127812508Samw@Sun.COM 127912508Samw@Sun.COM /* 128012508Samw@Sun.COM * ::smbvfs 128112508Samw@Sun.COM * 128212508Samw@Sun.COM * smbvfs dcmd - Prints out smb_vfs structures. 128312508Samw@Sun.COM */ 128412508Samw@Sun.COM /*ARGSUSED*/ 128512508Samw@Sun.COM static int 128612508Samw@Sun.COM smb_vfs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 128712508Samw@Sun.COM { 128812508Samw@Sun.COM int verbose = FALSE; 128912508Samw@Sun.COM smb_vfs_t *sf; 129012508Samw@Sun.COM vnode_t *vn; 129112508Samw@Sun.COM char *path; 129212508Samw@Sun.COM 129312508Samw@Sun.COM if (mdb_getopts(argc, argv, 129412508Samw@Sun.COM 'v', MDB_OPT_SETBITS, TRUE, &verbose, 129512508Samw@Sun.COM NULL) != argc) 129612508Samw@Sun.COM return (DCMD_USAGE); 129712508Samw@Sun.COM 129812508Samw@Sun.COM /* 129912508Samw@Sun.COM * If no smb_vfs address was specified on the command line, we can 130012508Samw@Sun.COM * print out all smb_vfs by invoking the smb_vfs walker, using 130112508Samw@Sun.COM * this dcmd itself as the callback. 130212508Samw@Sun.COM */ 130312508Samw@Sun.COM if (!(flags & DCMD_ADDRSPEC)) { 130412508Samw@Sun.COM if (mdb_walk_dcmd("smbvfs_walker", "smbvfs", 130512508Samw@Sun.COM argc, argv) == -1) { 130612508Samw@Sun.COM mdb_warn("failed to walk 'smb_vfs'"); 130712508Samw@Sun.COM return (DCMD_ERR); 130812508Samw@Sun.COM } 130912508Samw@Sun.COM return (DCMD_OK); 131012508Samw@Sun.COM } 131112508Samw@Sun.COM 131212508Samw@Sun.COM if (DCMD_HDRSPEC(flags)) { 131312508Samw@Sun.COM mdb_printf( 131412508Samw@Sun.COM "%<b>%<u>" 131512508Samw@Sun.COM "%-?s " 131612508Samw@Sun.COM "%-10s " 131712508Samw@Sun.COM "%-16s " 131812508Samw@Sun.COM "%-16s" 131912508Samw@Sun.COM "%-s" 132012508Samw@Sun.COM "%</u>%</b>\n", 132112508Samw@Sun.COM "SMB_VFS", "REFCNT", "VFS", "VNODE", "ROOT"); 132212508Samw@Sun.COM } 132312508Samw@Sun.COM 132412508Samw@Sun.COM sf = mdb_alloc(sizeof (*sf), UM_SLEEP | UM_GC); 132512508Samw@Sun.COM if (mdb_vread(sf, sizeof (*sf), addr) == -1) { 132612508Samw@Sun.COM mdb_warn("failed to read smb_vfs at %p", addr); 132712508Samw@Sun.COM return (DCMD_ERR); 132812508Samw@Sun.COM } 132912508Samw@Sun.COM 133012508Samw@Sun.COM vn = mdb_alloc(sizeof (*vn), UM_SLEEP | UM_GC); 133112508Samw@Sun.COM if (mdb_vread(vn, sizeof (*vn), 133212508Samw@Sun.COM (uintptr_t)sf->sv_rootvp) == -1) { 133312508Samw@Sun.COM mdb_warn("failed to read vnode at %p", sf->sv_rootvp); 133412508Samw@Sun.COM return (DCMD_ERR); 133512508Samw@Sun.COM } 133612508Samw@Sun.COM 133712508Samw@Sun.COM path = mdb_zalloc(MAXPATHLEN, UM_SLEEP | UM_GC); 133812508Samw@Sun.COM (void) mdb_vread(path, MAXPATHLEN, (uintptr_t)vn->v_path); 133912508Samw@Sun.COM 134012508Samw@Sun.COM mdb_printf( 134112508Samw@Sun.COM "%-?p %-10d %-?p %-?p %-s\n", addr, sf->sv_refcnt, 134212508Samw@Sun.COM sf->sv_vfsp, sf->sv_rootvp, path); 134312508Samw@Sun.COM 134412508Samw@Sun.COM return (DCMD_OK); 134512508Samw@Sun.COM } 134612508Samw@Sun.COM 134712508Samw@Sun.COM /* 134812508Samw@Sun.COM * Initialize the smb_vfs_t walker by reading the value of smb_export 134912508Samw@Sun.COM * in the kernel's symbol table. Only global walk supported. 135012508Samw@Sun.COM */ 135112508Samw@Sun.COM static int 135212508Samw@Sun.COM smb_vfs_walk_init(mdb_walk_state_t *wsp) 135312508Samw@Sun.COM { 135412508Samw@Sun.COM GElf_Sym sym; 135512508Samw@Sun.COM 135612508Samw@Sun.COM if (wsp->walk_addr != NULL) { 135712508Samw@Sun.COM mdb_printf("smb_vfs walk only supports global walks\n"); 135812508Samw@Sun.COM return (WALK_ERR); 135912508Samw@Sun.COM } 136012508Samw@Sun.COM 136112508Samw@Sun.COM if (mdb_lookup_by_name("smb_export", &sym) == -1) { 136212508Samw@Sun.COM mdb_warn("failed to find 'smb_export'"); 136312508Samw@Sun.COM return (WALK_ERR); 136412508Samw@Sun.COM } 136512508Samw@Sun.COM 136612508Samw@Sun.COM wsp->walk_addr = (uintptr_t)sym.st_value + 136712508Samw@Sun.COM offsetof(smb_export_t, e_vfs_list) + offsetof(smb_llist_t, ll_list); 136812508Samw@Sun.COM 136912508Samw@Sun.COM if (mdb_layered_walk("list", wsp) == -1) { 137012508Samw@Sun.COM mdb_warn("failed to walk list of VFS"); 137112508Samw@Sun.COM return (WALK_ERR); 137212508Samw@Sun.COM } 137312508Samw@Sun.COM 137412508Samw@Sun.COM return (WALK_NEXT); 137512508Samw@Sun.COM } 137612508Samw@Sun.COM 137712508Samw@Sun.COM static int 137812508Samw@Sun.COM smb_vfs_walk_step(mdb_walk_state_t *wsp) 137912508Samw@Sun.COM { 138012508Samw@Sun.COM return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer, 138112508Samw@Sun.COM wsp->walk_cbdata)); 138212508Samw@Sun.COM } 138312508Samw@Sun.COM 138412508Samw@Sun.COM /* 138512508Samw@Sun.COM * ***************************************************************************** 13866432Sas200622 * ******************************* smb_node_t ********************************** 13876432Sas200622 * ***************************************************************************** 13886432Sas200622 */ 13896432Sas200622 13905331Samw static void 13915331Samw smb_node_help(void) 13925331Samw { 13935331Samw mdb_printf( 13945331Samw "Display the contents of smb_node_t, with optional filtering.\n\n"); 13956432Sas200622 (void) mdb_dec_indent(2); 13965331Samw mdb_printf("%<b>OPTIONS%</b>\n"); 13976432Sas200622 (void) mdb_inc_indent(2); 13985331Samw mdb_printf( 13995331Samw "-v\tDisplay verbose smb_node information\n" 14005331Samw "-p\tDisplay the full path of the vnode associated\n" 14015331Samw "-s\tDisplay the stack of the last 16 calls that modified the " 14025331Samw "reference\n\tcount\n"); 14035331Samw } 14045331Samw 14055331Samw /* 14066432Sas200622 * ::smbnode 14075331Samw * 14085331Samw * smb_node dcmd - Print out smb_node structure. 14095331Samw */ 14105331Samw static int 14115331Samw smb_node(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 14125331Samw { 14135331Samw smb_node_t node; 1414*12890SJoyce.McIntosh@Sun.COM int rc; 14155331Samw int verbose = FALSE; 14165331Samw int print_full_path = FALSE; 14175331Samw int stack_trace = FALSE; 14185331Samw vnode_t vnode; 14195331Samw char od_name[MAXNAMELEN]; 14205331Samw char path_name[1024]; 1421*12890SJoyce.McIntosh@Sun.COM uintptr_t list_addr, oplock_addr; 14225331Samw 14235331Samw if (mdb_getopts(argc, argv, 14245331Samw 'v', MDB_OPT_SETBITS, TRUE, &verbose, 14255331Samw 'p', MDB_OPT_SETBITS, TRUE, &print_full_path, 14265331Samw 's', MDB_OPT_SETBITS, TRUE, &stack_trace, 14275331Samw NULL) != argc) 14285331Samw return (DCMD_USAGE); 14295331Samw 14305331Samw /* 14315331Samw * If no smb_node address was specified on the command line, we can 14325331Samw * print out all smb nodes by invoking the smb_node walker, using 14335331Samw * this dcmd itself as the callback. 14345331Samw */ 14355331Samw if (!(flags & DCMD_ADDRSPEC)) { 14366432Sas200622 if (mdb_walk_dcmd("smbnode_walker", "smbnode", 14375331Samw argc, argv) == -1) { 14385331Samw mdb_warn("failed to walk 'smb_node'"); 14395331Samw return (DCMD_ERR); 14405331Samw } 14415331Samw return (DCMD_OK); 14425331Samw } 14435331Samw 14445331Samw /* 14455331Samw * If this is the first invocation of the command, print a nice 14465331Samw * header line for the output that will follow. 14475331Samw */ 14485331Samw if (DCMD_HDRSPEC(flags)) { 14496432Sas200622 if (verbose) { 14506432Sas200622 mdb_printf("%<b>%<u>SMB node information:%</u>%</b>\n"); 14516432Sas200622 } else { 14526432Sas200622 mdb_printf( 14536432Sas200622 "%<b>%<u>%-?s " 14546432Sas200622 "%-?s " 14556432Sas200622 "%-18s " 14566432Sas200622 "%-6s " 14576432Sas200622 "%-6s " 1458*12890SJoyce.McIntosh@Sun.COM "%-8s " 14596432Sas200622 "%-6s%</u>%</b>\n", 14606432Sas200622 "ADDR", "VP", "NODE-NAME", "OFILES", "LOCKS", 1461*12890SJoyce.McIntosh@Sun.COM "OPLOCK", "REF"); 14626432Sas200622 } 14635331Samw } 14645331Samw 14655331Samw /* 14666432Sas200622 * For each smb_node, we just need to read the smb_node_t struct, read 14676432Sas200622 * and then print out the following fields. 14685331Samw */ 14695331Samw if (mdb_vread(&node, sizeof (node), addr) == sizeof (node)) { 14706432Sas200622 (void) mdb_snprintf(od_name, sizeof (od_name), "%s", 14716432Sas200622 node.od_name); 14725331Samw if (print_full_path) { 14735331Samw if (mdb_vread(&vnode, sizeof (vnode_t), 14746432Sas200622 (uintptr_t)node.vp) == sizeof (vnode_t)) { 14756432Sas200622 if (mdb_readstr(path_name, sizeof (path_name), 14765331Samw (uintptr_t)vnode.v_path) != 0) { 14775331Samw (void) mdb_snprintf(od_name, 14786432Sas200622 sizeof (od_name), "N/A"); 14795331Samw } 14805331Samw } 14815331Samw } 14825331Samw if (verbose) { 14836432Sas200622 mdb_printf("VP: %p\n", node.vp); 14846432Sas200622 mdb_printf("Name: %s\n", od_name); 14856432Sas200622 if (print_full_path) 14866432Sas200622 mdb_printf("V-node Path: %s\n", path_name); 14876432Sas200622 mdb_printf("Ofiles: %u\n", node.n_ofile_list.ll_count); 14886432Sas200622 mdb_printf("Range Locks: %u\n", 14895331Samw node.n_lock_list.ll_count); 14905331Samw if (node.n_lock_list.ll_count != 0) { 14915331Samw (void) mdb_inc_indent(SMB_DCMD_INDENT); 14925331Samw list_addr = addr + 14935331Samw offsetof(smb_node_t, n_lock_list) + 14945331Samw offsetof(smb_llist_t, ll_list); 14956432Sas200622 if (mdb_pwalk_dcmd("list", "smblock", 0, 14966432Sas200622 NULL, list_addr)) { 14975331Samw mdb_warn("failed to walk node's active" 14985331Samw " locks"); 14995331Samw } 15005331Samw (void) mdb_dec_indent(SMB_DCMD_INDENT); 15015331Samw } 1502*12890SJoyce.McIntosh@Sun.COM if (node.n_oplock.ol_count == 0) { 1503*12890SJoyce.McIntosh@Sun.COM mdb_printf("Opportunistic Locks: 0\n"); 1504*12890SJoyce.McIntosh@Sun.COM } else { 1505*12890SJoyce.McIntosh@Sun.COM oplock_addr = 1506*12890SJoyce.McIntosh@Sun.COM addr + offsetof(smb_node_t, n_oplock); 1507*12890SJoyce.McIntosh@Sun.COM mdb_printf("Opportunistic Lock: %p\n", 1508*12890SJoyce.McIntosh@Sun.COM oplock_addr); 1509*12890SJoyce.McIntosh@Sun.COM rc = mdb_call_dcmd("smboplock", oplock_addr, 1510*12890SJoyce.McIntosh@Sun.COM flags, argc, argv); 1511*12890SJoyce.McIntosh@Sun.COM if (rc != DCMD_OK) 1512*12890SJoyce.McIntosh@Sun.COM return (rc); 1513*12890SJoyce.McIntosh@Sun.COM } 15146432Sas200622 mdb_printf("Reference Count: %u\n\n", node.n_refcnt); 15155331Samw } else { 1516*12890SJoyce.McIntosh@Sun.COM mdb_printf("%-?p %-?p %-18s %-6d %-6d %-8d %-6d ", 15175331Samw addr, node.vp, od_name, node.n_ofile_list.ll_count, 1518*12890SJoyce.McIntosh@Sun.COM node.n_lock_list.ll_count, 1519*12890SJoyce.McIntosh@Sun.COM node.n_oplock.ol_count, node.n_refcnt); 1520*12890SJoyce.McIntosh@Sun.COM 15216432Sas200622 if (print_full_path) 15226432Sas200622 mdb_printf("\t%s\n", path_name); 15235331Samw } 15245331Samw if (stack_trace && node.n_audit_buf) { 15255331Samw int ctr; 15265331Samw smb_audit_buf_node_t *anb; 15275331Samw 15285331Samw anb = mdb_alloc(sizeof (smb_audit_buf_node_t), 15296432Sas200622 UM_SLEEP | UM_GC); 15305331Samw 15315331Samw if (mdb_vread(anb, sizeof (*anb), 15325331Samw (uintptr_t)node.n_audit_buf) != sizeof (*anb)) { 15335331Samw mdb_warn("failed to read audit buffer"); 15345331Samw return (DCMD_ERR); 15355331Samw } 15365331Samw ctr = anb->anb_max_index + 1; 15375331Samw anb->anb_index--; 15385331Samw anb->anb_index &= anb->anb_max_index; 15395331Samw 15405331Samw while (ctr) { 15415331Samw smb_audit_record_node_t *anr; 15425331Samw 15435331Samw anr = anb->anb_records + anb->anb_index; 15445331Samw 15455331Samw if (anr->anr_depth) { 15465331Samw char c[MDB_SYM_NAMLEN]; 15475331Samw GElf_Sym sym; 15485331Samw int i; 15495331Samw 15505331Samw mdb_printf("\nRefCnt: %u\t", 15515331Samw anr->anr_refcnt); 15525331Samw 15535331Samw for (i = 0; 15545331Samw i < anr->anr_depth; 15555331Samw i++) { 15565331Samw if (mdb_lookup_by_addr( 15575331Samw anr->anr_stack[i], 15585331Samw MDB_SYM_FUZZY, 15595331Samw c, sizeof (c), 15605331Samw &sym) == -1) { 15615331Samw continue; 15625331Samw } 15635331Samw mdb_printf("%s+0x%1x", 15645331Samw c, 15655331Samw anr->anr_stack[i] - 15665331Samw (uintptr_t)sym.st_value); 15675331Samw ++i; 15685331Samw break; 15695331Samw } 15705331Samw 15715331Samw while (i < anr->anr_depth) { 15725331Samw if (mdb_lookup_by_addr( 15735331Samw anr->anr_stack[i], 15745331Samw MDB_SYM_FUZZY, 15755331Samw c, sizeof (c), 15765331Samw &sym) == -1) { 15775331Samw ++i; 15785331Samw continue; 15795331Samw } 15805331Samw mdb_printf("\n\t\t%s+0x%1x", 15815331Samw c, 15825331Samw anr->anr_stack[i] - 15835331Samw (uintptr_t)sym.st_value); 15845331Samw ++i; 15855331Samw } 15865331Samw mdb_printf("\n"); 15875331Samw } 15885331Samw anb->anb_index--; 15895331Samw anb->anb_index &= anb->anb_max_index; 15905331Samw ctr--; 15915331Samw } 15925331Samw } 15935331Samw } else { 15945331Samw mdb_warn("failed to read struct smb_node at %p", addr); 15955331Samw return (DCMD_ERR); 15965331Samw } 15975331Samw 15985331Samw return (DCMD_OK); 15995331Samw } 16005331Samw 16016432Sas200622 /* 16026432Sas200622 * Initialize the smb_node_t walker by reading the value of smb_node_hash_table 16036432Sas200622 * in the kernel's symbol table. Only global walk supported. 16046432Sas200622 */ 16056432Sas200622 static int 16066432Sas200622 smb_node_walk_init(mdb_walk_state_t *wsp) 16075331Samw { 16086432Sas200622 GElf_Sym sym; 16096432Sas200622 int i; 16106432Sas200622 uintptr_t node_hash_table_addr; 16116432Sas200622 16126432Sas200622 if (wsp->walk_addr == NULL) { 16136432Sas200622 if (mdb_lookup_by_name("smb_node_hash_table", &sym) == -1) { 16146432Sas200622 mdb_warn("failed to find 'smb_node_hash_table'"); 16156432Sas200622 return (WALK_ERR); 16166432Sas200622 } 16176432Sas200622 node_hash_table_addr = (uintptr_t)sym.st_value; 16186432Sas200622 } else { 16196432Sas200622 mdb_printf("smb_node walk only supports global walks\n"); 16206432Sas200622 return (WALK_ERR); 16216432Sas200622 } 16226432Sas200622 16236432Sas200622 for (i = 0; i < SMBND_HASH_MASK + 1; i++) { 16246432Sas200622 wsp->walk_addr = node_hash_table_addr + 16256432Sas200622 (i * sizeof (smb_llist_t)) + offsetof(smb_llist_t, ll_list); 16266432Sas200622 if (mdb_layered_walk("list", wsp) == -1) { 16276432Sas200622 mdb_warn("failed to walk 'list'"); 16286432Sas200622 return (WALK_ERR); 16296432Sas200622 } 16306432Sas200622 } 16316432Sas200622 16326432Sas200622 return (WALK_NEXT); 16336432Sas200622 } 16346432Sas200622 16356432Sas200622 static int 16366432Sas200622 smb_node_walk_step(mdb_walk_state_t *wsp) 16376432Sas200622 { 16386432Sas200622 return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer, 16396432Sas200622 wsp->walk_cbdata)); 16405331Samw } 16415331Samw 16425331Samw /* 16436432Sas200622 * ***************************************************************************** 16446432Sas200622 * ****************************** smb_lock_t *********************************** 16456432Sas200622 * ***************************************************************************** 16465331Samw */ 16475331Samw 16485331Samw static int 16495331Samw smb_lock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 16505331Samw { 16515331Samw smb_lock_t lock; 16525331Samw int verbose = FALSE; 16535331Samw uintptr_t list_addr; 16545331Samw char *lock_type; 16555331Samw 16565331Samw if (mdb_getopts(argc, argv, 16575331Samw 'v', MDB_OPT_SETBITS, TRUE, &verbose, 16585331Samw NULL) != argc) 16595331Samw return (DCMD_USAGE); 16605331Samw 16615331Samw /* 16625331Samw * An smb_lock_t address must be specified. 16635331Samw */ 16645331Samw if (!(flags & DCMD_ADDRSPEC)) 16655331Samw return (DCMD_USAGE); 16665331Samw 16675331Samw /* 16685331Samw * If this is the first invocation of the command, print a nice 16695331Samw * header line for the output that will follow. 16705331Samw */ 16715331Samw if (DCMD_HDRSPEC(flags)) { 16725331Samw if (verbose) 16735331Samw mdb_printf("SMB lock information:\n\n"); 16745331Samw else 16755331Samw mdb_printf("%<u>%-?s %4s %16s %8s %9s%</u>\n", 16765331Samw "Locks: ", "TYPE", "START", "LENGTH", 16775331Samw "CONFLICTS"); 16785331Samw } 16795331Samw 16805331Samw if (mdb_vread(&lock, sizeof (lock), addr) == sizeof (lock)) { 16815331Samw switch (lock.l_type) { 16825331Samw case SMB_LOCK_TYPE_READWRITE: 16835331Samw lock_type = "RW"; 16845331Samw break; 16855331Samw case SMB_LOCK_TYPE_READONLY: 16865331Samw lock_type = "RO"; 16875331Samw break; 16885331Samw default: 16895331Samw lock_type = "N/A"; 16905331Samw break; 16915331Samw } 16925331Samw if (verbose) { 16935331Samw mdb_printf("Type :\t%s (%u)\n", 16945331Samw lock_type, lock.l_type); 16955331Samw mdb_printf("Start :\t%llx\n", 16965331Samw lock.l_start); 16975331Samw mdb_printf("Length :\t%lx\n", 16985331Samw lock.l_length); 16995331Samw mdb_printf("Session :\t%p\n", 17005331Samw lock.l_session); 17015331Samw mdb_printf("File :\t%p\n", 17025331Samw lock.l_file); 17035331Samw mdb_printf("User ID :\t%u\n", 17045331Samw lock.l_uid); 17055331Samw mdb_printf("Process ID :\t%u\n", 17065331Samw lock.l_pid); 17075331Samw mdb_printf("Conflicts :\t%u\n", 17085331Samw lock.l_conflict_list.sl_count); 17095331Samw if (lock.l_conflict_list.sl_count != 0) { 17105331Samw (void) mdb_inc_indent(SMB_DCMD_INDENT); 17115331Samw list_addr = addr + 17125331Samw offsetof(smb_lock_t, l_conflict_list) + 17135331Samw offsetof(smb_slist_t, sl_list); 17145331Samw if (mdb_pwalk_dcmd("list", "smb_lock", 17155331Samw 0, NULL, list_addr)) { 17165331Samw mdb_warn("failed to walk conflict " 17175331Samw "locks "); 17185331Samw } 17195331Samw (void) mdb_dec_indent(SMB_DCMD_INDENT); 17205331Samw } 17215331Samw mdb_printf("Blocked by :\t%p\n", 17225331Samw lock.l_blocked_by); 17235331Samw mdb_printf("Flags :\t0x%x\n", 17245331Samw lock.l_flags); 17255331Samw mdb_printf("\n"); 17265331Samw } else { 17275331Samw mdb_printf("%?p %4s %16llx %08lx %9x", addr, 17285331Samw lock_type, lock.l_start, lock.l_length, 17295331Samw lock.l_conflict_list.sl_count); 17305331Samw } 17315331Samw } else { 17325331Samw mdb_warn("failed to read struct smb_request at %p", addr); 17335331Samw return (DCMD_ERR); 17345331Samw } 17355331Samw 17365331Samw return (DCMD_OK); 17375331Samw } 17385331Samw 17395331Samw /* 1740*12890SJoyce.McIntosh@Sun.COM * ***************************************************************************** 1741*12890SJoyce.McIntosh@Sun.COM * ************************** smb_oplock_grant_t ******************************* 1742*12890SJoyce.McIntosh@Sun.COM * ***************************************************************************** 1743*12890SJoyce.McIntosh@Sun.COM */ 1744*12890SJoyce.McIntosh@Sun.COM /*ARGSUSED*/ 1745*12890SJoyce.McIntosh@Sun.COM static int 1746*12890SJoyce.McIntosh@Sun.COM smb_oplock_grant(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 1747*12890SJoyce.McIntosh@Sun.COM { 1748*12890SJoyce.McIntosh@Sun.COM smb_oplock_grant_t grant; 1749*12890SJoyce.McIntosh@Sun.COM char *level; 1750*12890SJoyce.McIntosh@Sun.COM 1751*12890SJoyce.McIntosh@Sun.COM if (!(flags & DCMD_ADDRSPEC)) 1752*12890SJoyce.McIntosh@Sun.COM return (DCMD_USAGE); 1753*12890SJoyce.McIntosh@Sun.COM 1754*12890SJoyce.McIntosh@Sun.COM /* 1755*12890SJoyce.McIntosh@Sun.COM * If this is the first invocation of the command, print a nice 1756*12890SJoyce.McIntosh@Sun.COM * header line for the output that will follow. 1757*12890SJoyce.McIntosh@Sun.COM */ 1758*12890SJoyce.McIntosh@Sun.COM if (DCMD_HDRSPEC(flags)) { 1759*12890SJoyce.McIntosh@Sun.COM mdb_printf("%<u>%-16s %-10s %-16s%</u>\n", 1760*12890SJoyce.McIntosh@Sun.COM "Grants:", "LEVEL", "OFILE"); 1761*12890SJoyce.McIntosh@Sun.COM } 1762*12890SJoyce.McIntosh@Sun.COM 1763*12890SJoyce.McIntosh@Sun.COM if (mdb_vread(&grant, sizeof (grant), addr) == sizeof (grant)) { 1764*12890SJoyce.McIntosh@Sun.COM switch (grant.og_level) { 1765*12890SJoyce.McIntosh@Sun.COM case SMB_OPLOCK_EXCLUSIVE: 1766*12890SJoyce.McIntosh@Sun.COM level = "EXCLUSIVE"; 1767*12890SJoyce.McIntosh@Sun.COM break; 1768*12890SJoyce.McIntosh@Sun.COM case SMB_OPLOCK_BATCH: 1769*12890SJoyce.McIntosh@Sun.COM level = "BATCH"; 1770*12890SJoyce.McIntosh@Sun.COM break; 1771*12890SJoyce.McIntosh@Sun.COM case SMB_OPLOCK_LEVEL_II: 1772*12890SJoyce.McIntosh@Sun.COM level = "LEVEL_II"; 1773*12890SJoyce.McIntosh@Sun.COM break; 1774*12890SJoyce.McIntosh@Sun.COM default: 1775*12890SJoyce.McIntosh@Sun.COM level = "UNKNOWN"; 1776*12890SJoyce.McIntosh@Sun.COM break; 1777*12890SJoyce.McIntosh@Sun.COM } 1778*12890SJoyce.McIntosh@Sun.COM 1779*12890SJoyce.McIntosh@Sun.COM mdb_printf("%-16p %-10s %-16p", addr, level, grant.og_ofile); 1780*12890SJoyce.McIntosh@Sun.COM } 1781*12890SJoyce.McIntosh@Sun.COM return (DCMD_OK); 1782*12890SJoyce.McIntosh@Sun.COM } 1783*12890SJoyce.McIntosh@Sun.COM 1784*12890SJoyce.McIntosh@Sun.COM /* 1785*12890SJoyce.McIntosh@Sun.COM * ***************************************************************************** 1786*12890SJoyce.McIntosh@Sun.COM * ***************************** smb_oplock_t ********************************** 1787*12890SJoyce.McIntosh@Sun.COM * ***************************************************************************** 1788*12890SJoyce.McIntosh@Sun.COM */ 1789*12890SJoyce.McIntosh@Sun.COM /*ARGSUSED*/ 1790*12890SJoyce.McIntosh@Sun.COM static int 1791*12890SJoyce.McIntosh@Sun.COM smb_oplock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 1792*12890SJoyce.McIntosh@Sun.COM { 1793*12890SJoyce.McIntosh@Sun.COM smb_oplock_t oplock; 1794*12890SJoyce.McIntosh@Sun.COM uintptr_t list_addr; 1795*12890SJoyce.McIntosh@Sun.COM 1796*12890SJoyce.McIntosh@Sun.COM if (!(flags & DCMD_ADDRSPEC)) 1797*12890SJoyce.McIntosh@Sun.COM return (DCMD_USAGE); 1798*12890SJoyce.McIntosh@Sun.COM 1799*12890SJoyce.McIntosh@Sun.COM if (mdb_vread(&oplock, sizeof (oplock), addr) != sizeof (oplock)) { 1800*12890SJoyce.McIntosh@Sun.COM mdb_warn("failed to read struct smb_oplock at %p", addr); 1801*12890SJoyce.McIntosh@Sun.COM return (DCMD_ERR); 1802*12890SJoyce.McIntosh@Sun.COM } 1803*12890SJoyce.McIntosh@Sun.COM 1804*12890SJoyce.McIntosh@Sun.COM if (oplock.ol_count == 0) 1805*12890SJoyce.McIntosh@Sun.COM return (DCMD_OK); 1806*12890SJoyce.McIntosh@Sun.COM 1807*12890SJoyce.McIntosh@Sun.COM (void) mdb_inc_indent(SMB_DCMD_INDENT); 1808*12890SJoyce.McIntosh@Sun.COM switch (oplock.ol_break) { 1809*12890SJoyce.McIntosh@Sun.COM case SMB_OPLOCK_BREAK_TO_NONE: 1810*12890SJoyce.McIntosh@Sun.COM mdb_printf("Break Pending: BREAK_TO_NONE\n"); 1811*12890SJoyce.McIntosh@Sun.COM break; 1812*12890SJoyce.McIntosh@Sun.COM case SMB_OPLOCK_BREAK_TO_LEVEL_II: 1813*12890SJoyce.McIntosh@Sun.COM mdb_printf( 1814*12890SJoyce.McIntosh@Sun.COM "Break Pending: BREAK_TO_LEVEL_II\n"); 1815*12890SJoyce.McIntosh@Sun.COM break; 1816*12890SJoyce.McIntosh@Sun.COM default: 1817*12890SJoyce.McIntosh@Sun.COM break; 1818*12890SJoyce.McIntosh@Sun.COM } 1819*12890SJoyce.McIntosh@Sun.COM 1820*12890SJoyce.McIntosh@Sun.COM list_addr = addr + offsetof(smb_oplock_t, ol_grants); 1821*12890SJoyce.McIntosh@Sun.COM 1822*12890SJoyce.McIntosh@Sun.COM if (mdb_pwalk_dcmd("list", "smboplockgrant", 1823*12890SJoyce.McIntosh@Sun.COM argc, argv, list_addr)) { 1824*12890SJoyce.McIntosh@Sun.COM mdb_warn("failed to walk oplock grants"); 1825*12890SJoyce.McIntosh@Sun.COM } 1826*12890SJoyce.McIntosh@Sun.COM 1827*12890SJoyce.McIntosh@Sun.COM (void) mdb_dec_indent(SMB_DCMD_INDENT); 1828*12890SJoyce.McIntosh@Sun.COM 1829*12890SJoyce.McIntosh@Sun.COM return (DCMD_OK); 1830*12890SJoyce.McIntosh@Sun.COM } 1831*12890SJoyce.McIntosh@Sun.COM 1832*12890SJoyce.McIntosh@Sun.COM /* 183312508Samw@Sun.COM * ::smbstat 18345331Samw * 183512508Samw@Sun.COM * Prints SMB requests statistics. 18365331Samw */ 18375331Samw /*ARGSUSED*/ 18385331Samw static int 18396432Sas200622 smb_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 18405331Samw { 184112508Samw@Sun.COM smb_server_t *sv; 18425331Samw 184312508Samw@Sun.COM if (!(flags & DCMD_ADDRSPEC)) 18445331Samw return (DCMD_USAGE); 18455331Samw 184612508Samw@Sun.COM sv = mdb_alloc(sizeof (*sv), UM_SLEEP | UM_GC); 184712508Samw@Sun.COM if (mdb_vread(sv, sizeof (*sv), addr) == -1) { 184812508Samw@Sun.COM mdb_warn("failed to read server object at %p", addr); 18495331Samw return (DCMD_ERR); 18505331Samw } 185112508Samw@Sun.COM if (sv->sv_magic != SMB_SERVER_MAGIC) { 185212508Samw@Sun.COM mdb_warn("not an smb_server_t (%p)>", addr); 18535331Samw return (DCMD_ERR); 18545331Samw } 185512508Samw@Sun.COM mdb_printf( 185612508Samw@Sun.COM "\n%<b> nbt tcp users trees files pipes%</b>\n" 185712508Samw@Sun.COM "%5d %5d %5d %5d %5d %5d\n", 185812508Samw@Sun.COM sv->sv_nbt_sess, 185912508Samw@Sun.COM sv->sv_tcp_sess, 186012508Samw@Sun.COM sv->sv_users, 186112508Samw@Sun.COM sv->sv_trees, 186212508Samw@Sun.COM sv->sv_files, 186312508Samw@Sun.COM sv->sv_pipes); 18645331Samw 18655331Samw return (DCMD_OK); 18665331Samw } 18675331Samw 18685331Samw /* 18696432Sas200622 * ***************************************************************************** 18706432Sas200622 * ******************************** smb_ace_t ********************************** 18716432Sas200622 * ***************************************************************************** 18725331Samw */ 18736432Sas200622 static const ace_type_entry_t ace_types[ACE_TYPE_TABLEN] = 18746432Sas200622 { 18756432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_ACE_TYPE), 18766432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_ACE_TYPE), 18776432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_ACE_TYPE), 18786432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_ACE_TYPE), 18796432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_COMPOUND_ACE_TYPE), 18806432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE), 18816432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_OBJECT_ACE_TYPE), 18826432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE), 18836432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE), 18846432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_CALLBACK_ACE_TYPE), 18856432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_CALLBACK_ACE_TYPE), 18866432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE), 18876432Sas200622 ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE), 18886432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_CALLBACK_ACE_TYPE), 18896432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_CALLBACK_ACE_TYPE), 18906432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE), 18916432Sas200622 ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE), 18926432Sas200622 ACE_TYPE_ENTRY(0x11), 18936432Sas200622 ACE_TYPE_ENTRY(0x12), 18946432Sas200622 ACE_TYPE_ENTRY(0x13), 18956432Sas200622 ACE_TYPE_ENTRY(0x14), 18966432Sas200622 ACE_TYPE_ENTRY(0x15), 18976432Sas200622 ACE_TYPE_ENTRY(0x16), 18986432Sas200622 ACE_TYPE_ENTRY(0x17), 18996432Sas200622 ACE_TYPE_ENTRY(0x18), 19006432Sas200622 ACE_TYPE_ENTRY(0x19), 19016432Sas200622 ACE_TYPE_ENTRY(0x1A), 19026432Sas200622 ACE_TYPE_ENTRY(0x1B), 19036432Sas200622 ACE_TYPE_ENTRY(0x1C), 19046432Sas200622 ACE_TYPE_ENTRY(0x1D), 19056432Sas200622 ACE_TYPE_ENTRY(0x1E), 19066432Sas200622 ACE_TYPE_ENTRY(0x1F) 19076432Sas200622 }; 19086432Sas200622 19096432Sas200622 static const mdb_bitmask_t ace_flag_bits[] = { 19106432Sas200622 { "OBJECT_INHERIT_ACE", OBJECT_INHERIT_ACE, OBJECT_INHERIT_ACE }, 19116432Sas200622 { "CONTAINER_INHERIT_ACE", CONTAINER_INHERIT_ACE, 19126432Sas200622 CONTAINER_INHERIT_ACE }, 19136432Sas200622 { "NO_PROPOGATE_INHERIT_ACE", NO_PROPOGATE_INHERIT_ACE, 19146432Sas200622 NO_PROPOGATE_INHERIT_ACE }, 19156432Sas200622 { "INHERIT_ONLY_ACE", INHERIT_ONLY_ACE, INHERIT_ONLY_ACE }, 19166432Sas200622 { "INHERITED_ACE", INHERITED_ACE, INHERITED_ACE }, 19176432Sas200622 { "SUCCESSFUL_ACCESS_ACE_FLAG", SUCCESSFUL_ACCESS_ACE_FLAG, 19186432Sas200622 SUCCESSFUL_ACCESS_ACE_FLAG }, 19196432Sas200622 { "FAILED_ACCESS_ACE_FLAG", FAILED_ACCESS_ACE_FLAG, 19206432Sas200622 FAILED_ACCESS_ACE_FLAG }, 19216432Sas200622 { NULL, 0, 0 } 19225331Samw }; 19235331Samw 19246432Sas200622 /* 19256432Sas200622 * ::smbace 19266432Sas200622 */ 19276432Sas200622 static int 19286432Sas200622 smb_ace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 19296432Sas200622 { 19306432Sas200622 smb_ace_t ace; 19316432Sas200622 int verbose = FALSE; 19326432Sas200622 const char *ptr; 19336432Sas200622 int rc; 19346432Sas200622 19356432Sas200622 if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose, 19366432Sas200622 NULL) != argc) 19376432Sas200622 return (DCMD_USAGE); 19386432Sas200622 19396432Sas200622 /* 19406432Sas200622 * An smb_ace address is required. 19416432Sas200622 */ 19426432Sas200622 if (!(flags & DCMD_ADDRSPEC)) 19436432Sas200622 return (DCMD_USAGE); 19446432Sas200622 19456432Sas200622 if (mdb_vread(&ace, sizeof (ace), addr) != sizeof (ace)) { 19466432Sas200622 mdb_warn("failed to read struct smb_ace at %p", addr); 19476432Sas200622 return (DCMD_ERR); 19486432Sas200622 } 19496432Sas200622 19506432Sas200622 if (verbose) { 19516432Sas200622 if (ace.se_hdr.se_type < ACE_TYPE_TABLEN) 19526432Sas200622 ptr = ace_types[ace.se_hdr.se_type].ace_type_sting; 19536432Sas200622 else 19546432Sas200622 ptr = "Unknown"; 19556432Sas200622 19566432Sas200622 mdb_printf("ACE Type: 0x%02x (%s)\n", ace.se_hdr.se_type, ptr); 19576432Sas200622 mdb_printf("ACE Flags: %b\n", (int)ace.se_hdr.se_flags, 19586432Sas200622 ace_flag_bits); 19596432Sas200622 mdb_printf("ACE Wire Size: 0x%04x\n", ace.se_hdr.se_bsize); 19606432Sas200622 mdb_printf("ACE Mask: 0x%08x\n", ace.se_mask); 19616432Sas200622 mdb_printf("ACE SID: "); 19626432Sas200622 } else { 19636432Sas200622 if (DCMD_HDRSPEC(flags)) 19646432Sas200622 mdb_printf( 19656432Sas200622 "%<b>%<u>%?-s %-4s %-4s %-8s %s%</u>%</b>\n", 19666432Sas200622 "ACE", "TYPE", "FLAGS", "MASK", "SID"); 19676432Sas200622 mdb_printf("%?p 0x%02x 0x%02x 0x%08x ", addr, 19686432Sas200622 ace.se_hdr.se_type, ace.se_hdr.se_flags, ace.se_mask); 19696432Sas200622 } 19706432Sas200622 rc = smb_sid_print((uintptr_t)ace.se_sid); 19716432Sas200622 mdb_printf("\n"); 19726432Sas200622 return (rc); 19736432Sas200622 } 19746432Sas200622 19756432Sas200622 static int 19766432Sas200622 smb_ace_walk_init(mdb_walk_state_t *wsp) 19776432Sas200622 { 19786432Sas200622 if (wsp->walk_addr == 0) { 19796432Sas200622 mdb_printf("smb_ace walk only supports local walks\n"); 19806432Sas200622 return (WALK_ERR); 19816432Sas200622 } 19826432Sas200622 19836432Sas200622 wsp->walk_addr += offsetof(smb_acl_t, sl_sorted); 19846432Sas200622 19856432Sas200622 if (mdb_layered_walk("list", wsp) == -1) { 19866432Sas200622 mdb_warn("failed to walk list of ACEs"); 19876432Sas200622 return (WALK_ERR); 19886432Sas200622 } 19896432Sas200622 19906432Sas200622 return (WALK_NEXT); 19916432Sas200622 } 19926432Sas200622 19936432Sas200622 static int 19946432Sas200622 smb_ace_walk_step(mdb_walk_state_t *wsp) 19956432Sas200622 { 19966432Sas200622 return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer, 19976432Sas200622 wsp->walk_cbdata)); 19986432Sas200622 } 19996432Sas200622 20006432Sas200622 /* 20016432Sas200622 * ***************************************************************************** 20026432Sas200622 * ******************************** smb_acl_t ********************************** 20036432Sas200622 * ***************************************************************************** 20046432Sas200622 */ 20056432Sas200622 20066432Sas200622 /* 20076432Sas200622 * ::smbacl 20086432Sas200622 */ 20096432Sas200622 static int 20106432Sas200622 smb_acl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 20116432Sas200622 { 20126432Sas200622 smb_acl_t acl; 20136432Sas200622 20146432Sas200622 /* An smb_acl address is required. */ 20156432Sas200622 if (!(flags & DCMD_ADDRSPEC)) 20166432Sas200622 return (DCMD_USAGE); 20176432Sas200622 20186432Sas200622 if (mdb_vread(&acl, sizeof (acl), addr) != sizeof (acl)) { 20196432Sas200622 mdb_warn("failed to read struct smb_acl at %p", addr); 20206432Sas200622 return (DCMD_ERR); 20216432Sas200622 } 20226432Sas200622 20236432Sas200622 mdb_printf("ACL Revision: %d\n", acl.sl_revision); 20246432Sas200622 mdb_printf("ACL Size on Wire: %d\n", acl.sl_bsize); 20256432Sas200622 mdb_printf("ACL Number of ACEs: %d\n", acl.sl_acecnt); 20266432Sas200622 20276432Sas200622 (void) mdb_inc_indent(SMB_DCMD_INDENT); 20286432Sas200622 if (mdb_pwalk_dcmd("smbace_walker", "smbace", argc, argv, addr)) { 20296432Sas200622 (void) mdb_dec_indent(SMB_DCMD_INDENT); 20306432Sas200622 mdb_warn("failed to walk list of ACEs for ACL %p", addr); 20316432Sas200622 return (DCMD_ERR); 20326432Sas200622 } 20336432Sas200622 (void) mdb_dec_indent(SMB_DCMD_INDENT); 20346432Sas200622 return (DCMD_OK); 20356432Sas200622 } 20366432Sas200622 20376432Sas200622 /* 20386432Sas200622 * ***************************************************************************** 20396432Sas200622 * ********************************* smb_sd_t ********************************** 20406432Sas200622 * ***************************************************************************** 20416432Sas200622 */ 20426432Sas200622 20436432Sas200622 /* 20446432Sas200622 * ::smbsd 20456432Sas200622 */ 20466432Sas200622 static int 20476432Sas200622 smb_sd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 20486432Sas200622 { 20496432Sas200622 smb_sd_t sd; 20506432Sas200622 int rc; 20516432Sas200622 20526432Sas200622 /* 20536432Sas200622 * An smb_sid address is required. 20546432Sas200622 */ 20556432Sas200622 if (!(flags & DCMD_ADDRSPEC)) 20566432Sas200622 return (DCMD_USAGE); 20576432Sas200622 20586432Sas200622 if (mdb_vread(&sd, sizeof (sd), addr) != sizeof (sd)) { 20596432Sas200622 mdb_warn("failed to read struct smb_sd at %p", addr); 20606432Sas200622 return (DCMD_ERR); 20616432Sas200622 } 20626432Sas200622 20636432Sas200622 mdb_printf("SD Revision: %d\n", sd.sd_revision); 20646432Sas200622 mdb_printf("SD Control: %04x\n", sd.sd_control); 20656432Sas200622 if (sd.sd_control & SE_OWNER_DEFAULTED) 20666432Sas200622 mdb_printf("\t SE_OWNER_DEFAULTED\n"); 20676432Sas200622 if (sd.sd_control & SE_GROUP_DEFAULTED) 20686432Sas200622 mdb_printf("\t SE_GROUP_DEFAULTED\n"); 20696432Sas200622 if (sd.sd_control & SE_DACL_PRESENT) 20706432Sas200622 mdb_printf("\t SE_DACL_PRESENT\n"); 20716432Sas200622 if (sd.sd_control & SE_DACL_DEFAULTED) 20726432Sas200622 mdb_printf("\t SE_DACL_DEFAULTED\n"); 20736432Sas200622 if (sd.sd_control & SE_SACL_PRESENT) 20746432Sas200622 mdb_printf("\t SE_SACL_PRESENT\n"); 20756432Sas200622 if (sd.sd_control & SE_SACL_DEFAULTED) 20766432Sas200622 mdb_printf("\t SE_SACL_DEFAULTED\n"); 20776432Sas200622 if (sd.sd_control & SE_DACL_AUTO_INHERIT_REQ) 20786432Sas200622 mdb_printf("\t SE_DACL_AUTO_INHERIT_REQ\n"); 20796432Sas200622 if (sd.sd_control & SE_SACL_AUTO_INHERIT_REQ) 20806432Sas200622 mdb_printf("\t SE_SACL_AUTO_INHERIT_REQ\n"); 20816432Sas200622 if (sd.sd_control & SE_DACL_AUTO_INHERITED) 20826432Sas200622 mdb_printf("\t SE_DACL_AUTO_INHERITED\n"); 20836432Sas200622 if (sd.sd_control & SE_SACL_AUTO_INHERITED) 20846432Sas200622 mdb_printf("\t SE_SACL_AUTO_INHERITED\n"); 20856432Sas200622 if (sd.sd_control & SE_DACL_PROTECTED) 20866432Sas200622 mdb_printf("\t SE_DACL_PROTECTED\n"); 20876432Sas200622 if (sd.sd_control & SE_SACL_PROTECTED) 20886432Sas200622 mdb_printf("\t SE_SACL_PROTECTED\n"); 20896432Sas200622 if (sd.sd_control & SE_SELF_RELATIVE) 20906432Sas200622 mdb_printf("\t SE_SELF_RELATIVE\n"); 20916432Sas200622 20926432Sas200622 mdb_printf("SID of Owner: "); 20936432Sas200622 rc = smb_sid_print((uintptr_t)sd.sd_owner); 20946432Sas200622 if (rc != DCMD_OK) 20956432Sas200622 return (rc); 20966432Sas200622 mdb_printf("\nSID of Group: "); 20976432Sas200622 rc = smb_sid_print((uintptr_t)sd.sd_group); 20986432Sas200622 if (rc != DCMD_OK) 20996432Sas200622 return (rc); 21006432Sas200622 mdb_printf("\n"); 21016432Sas200622 21026432Sas200622 if (sd.sd_control & SE_SACL_PRESENT && sd.sd_sacl) { 21036432Sas200622 mdb_printf("%<b>%<u>System ACL%</u>%</b>\n"); 21046432Sas200622 (void) mdb_inc_indent(SMB_DCMD_INDENT); 21056432Sas200622 rc = mdb_call_dcmd("smbacl", (uintptr_t)sd.sd_sacl, flags, 21066432Sas200622 argc, argv); 21076432Sas200622 (void) mdb_dec_indent(SMB_DCMD_INDENT); 21086432Sas200622 if (rc != DCMD_OK) 21096432Sas200622 return (rc); 21106432Sas200622 } 21116432Sas200622 if (sd.sd_control & SE_DACL_PRESENT && sd.sd_dacl) { 21126432Sas200622 mdb_printf("%<b>%<u>Discretionary ACL%</u>%</b>\n"); 21136432Sas200622 (void) mdb_inc_indent(SMB_DCMD_INDENT); 21146432Sas200622 rc = mdb_call_dcmd("smbacl", (uintptr_t)sd.sd_dacl, flags, 21156432Sas200622 argc, argv); 21166432Sas200622 (void) mdb_dec_indent(SMB_DCMD_INDENT); 21176432Sas200622 if (rc != DCMD_OK) 21186432Sas200622 return (rc); 21196432Sas200622 } 21206432Sas200622 21216432Sas200622 return (DCMD_OK); 21226432Sas200622 } 21236432Sas200622 21246432Sas200622 /* 21256432Sas200622 * ***************************************************************************** 21266432Sas200622 * ********************************* smb_sid_t ********************************* 21276432Sas200622 * ***************************************************************************** 21286432Sas200622 */ 21296432Sas200622 21306432Sas200622 /* 21316432Sas200622 * ::smbsid 21326432Sas200622 */ 21336432Sas200622 /*ARGSUSED*/ 21346432Sas200622 static int 21356432Sas200622 smb_sid(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 21366432Sas200622 { 21376432Sas200622 /* 21386432Sas200622 * An smb_sid address is required. 21396432Sas200622 */ 21406432Sas200622 if (!(flags & DCMD_ADDRSPEC)) 21416432Sas200622 return (DCMD_USAGE); 21425331Samw 21436432Sas200622 return (smb_sid_print(addr)); 21446432Sas200622 } 21456432Sas200622 21466432Sas200622 /* 21476432Sas200622 * smb_sid_print 21486432Sas200622 */ 21496432Sas200622 static int 21506432Sas200622 smb_sid_print(uintptr_t addr) 21516432Sas200622 { 21526432Sas200622 smb_sid_t sid; 21536432Sas200622 smb_sid_t *psid; 21546432Sas200622 size_t sid_size; 21556432Sas200622 int i; 21566432Sas200622 uint64_t authority; 21576432Sas200622 21586432Sas200622 sid_size = offsetof(smb_sid_t, sid_subauth); 21596432Sas200622 21606432Sas200622 if (mdb_vread(&sid, sid_size, addr) != sid_size) { 21616432Sas200622 mdb_warn("failed to read struct smb_sid at %p", addr); 21626432Sas200622 return (DCMD_ERR); 21636432Sas200622 } 21646432Sas200622 21656432Sas200622 sid_size += sid.sid_subauthcnt * sizeof (sid.sid_subauth[0]); 21666432Sas200622 21676432Sas200622 psid = mdb_zalloc(sid_size, UM_SLEEP | UM_GC); 21686432Sas200622 if (mdb_vread(psid, sid_size, addr) != sid_size) { 21696432Sas200622 mdb_warn("failed to read struct smb_sid at %p", addr); 21706432Sas200622 return (DCMD_ERR); 21716432Sas200622 } 21726432Sas200622 21736432Sas200622 mdb_printf("S-%d", psid->sid_revision); 21746432Sas200622 authority = 0; 21756432Sas200622 for (i = 0; i < NT_SID_AUTH_MAX; i++) { 21766432Sas200622 authority += ((uint64_t)psid->sid_authority[i]) << 21776432Sas200622 (8 * (NT_SID_AUTH_MAX - 1) - i); 21786432Sas200622 } 21796432Sas200622 mdb_printf("-%ll", authority); 21806432Sas200622 21816432Sas200622 for (i = 0; i < psid->sid_subauthcnt; i++) 21826432Sas200622 mdb_printf("-%d", psid->sid_subauth[i]); 21836432Sas200622 21846432Sas200622 return (DCMD_OK); 21856432Sas200622 } 21866432Sas200622 21876432Sas200622 /* 21886432Sas200622 * ***************************************************************************** 21896432Sas200622 * ********************************* smb_fssd_t ******************************** 21906432Sas200622 * ***************************************************************************** 21916432Sas200622 */ 21926432Sas200622 21936432Sas200622 /* 21946432Sas200622 * ::smbfssd 21956432Sas200622 */ 21966432Sas200622 static int 21976432Sas200622 smb_fssd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 21986432Sas200622 { 21996432Sas200622 smb_fssd_t fssd; 22006432Sas200622 int rc; 22016432Sas200622 22026432Sas200622 /* 22036432Sas200622 * An smb_fssd address is required. 22046432Sas200622 */ 22056432Sas200622 if (!(flags & DCMD_ADDRSPEC)) 22066432Sas200622 return (DCMD_USAGE); 22076432Sas200622 22086432Sas200622 if (mdb_vread(&fssd, sizeof (fssd), addr) != sizeof (fssd)) { 22096432Sas200622 mdb_warn("failed to read struct smb_fssd at %p", addr); 22106432Sas200622 return (DCMD_ERR); 22116432Sas200622 } 22126432Sas200622 22136432Sas200622 mdb_printf("FSSD secinfo: 0x%x\n", fssd.sd_secinfo); 22146432Sas200622 if (fssd.sd_secinfo & SMB_OWNER_SECINFO) 22156432Sas200622 mdb_printf("FSSD uid: %d\n", fssd.sd_uid); 22166432Sas200622 if (fssd.sd_secinfo & SMB_GROUP_SECINFO) 22176432Sas200622 mdb_printf("FSSD gid: %d\n", fssd.sd_gid); 22186432Sas200622 if (fssd.sd_secinfo & SMB_SACL_SECINFO && fssd.sd_zsacl) { 22196432Sas200622 mdb_printf("%<b>%<u>System ACL%</u>%</b>\n"); 22206432Sas200622 (void) mdb_inc_indent(SMB_DCMD_INDENT); 22216432Sas200622 rc = mdb_call_dcmd("smbacl", (uintptr_t)fssd.sd_zsacl, flags, 22226432Sas200622 argc, argv); 22236432Sas200622 (void) mdb_dec_indent(SMB_DCMD_INDENT); 22246432Sas200622 if (rc != DCMD_OK) 22256432Sas200622 return (rc); 22266432Sas200622 } 22276432Sas200622 if (fssd.sd_secinfo & SMB_DACL_SECINFO && fssd.sd_zdacl) { 22286432Sas200622 mdb_printf("%<b>%<u>Discretionary ACL%</u>%</b>\n"); 22296432Sas200622 (void) mdb_inc_indent(SMB_DCMD_INDENT); 22306432Sas200622 rc = mdb_call_dcmd("smbacl", (uintptr_t)fssd.sd_zdacl, flags, 22316432Sas200622 argc, argv); 22326432Sas200622 (void) mdb_dec_indent(SMB_DCMD_INDENT); 22336432Sas200622 if (rc != DCMD_OK) 22346432Sas200622 return (rc); 22356432Sas200622 } 22366432Sas200622 22376432Sas200622 return (DCMD_OK); 22386432Sas200622 } 22396432Sas200622 22406432Sas200622 /* 22416432Sas200622 * ***************************************************************************** 22426432Sas200622 * **************************** Utility Funcions ******************************* 22436432Sas200622 * ***************************************************************************** 22446432Sas200622 */ 22455331Samw 22466432Sas200622 /* 22476432Sas200622 * smb_dcmd_getopt 22486432Sas200622 * 22496432Sas200622 * This function analyzes the arguments passed in and sets the bit corresponding 22506432Sas200622 * to the options found in the opts variable. 22516432Sas200622 * 22526432Sas200622 * Return Value 22536432Sas200622 * 22546432Sas200622 * -1 An error occured during the decoding 22556432Sas200622 * 0 The decoding was successful 22566432Sas200622 */ 22576432Sas200622 static int 22586432Sas200622 smb_dcmd_getopt(uint_t *opts, int argc, const mdb_arg_t *argv) 22596432Sas200622 { 22606432Sas200622 *opts = 0; 22616432Sas200622 22626432Sas200622 if (mdb_getopts(argc, argv, 22636432Sas200622 's', MDB_OPT_SETBITS, SMB_OPT_SERVER, opts, 22646432Sas200622 'e', MDB_OPT_SETBITS, SMB_OPT_SESSION, opts, 22656432Sas200622 'r', MDB_OPT_SETBITS, SMB_OPT_REQUEST, opts, 22666432Sas200622 'u', MDB_OPT_SETBITS, SMB_OPT_USER, opts, 22676432Sas200622 't', MDB_OPT_SETBITS, SMB_OPT_TREE, opts, 22686432Sas200622 'f', MDB_OPT_SETBITS, SMB_OPT_OFILE, opts, 22696432Sas200622 'd', MDB_OPT_SETBITS, SMB_OPT_ODIR, opts, 22706432Sas200622 'w', MDB_OPT_SETBITS, SMB_OPT_WALK, opts, 22716432Sas200622 'v', MDB_OPT_SETBITS, SMB_OPT_VERBOSE, opts, 22726432Sas200622 NULL) != argc) 22736432Sas200622 return (-1); 22746432Sas200622 22756432Sas200622 return (0); 22766432Sas200622 } 22776432Sas200622 22786432Sas200622 /* 22796432Sas200622 * smb_dcmd_setopt 22806432Sas200622 * 22816432Sas200622 * This function set the arguments corresponding to the bits set in opts. 22826432Sas200622 * 22836432Sas200622 * Return Value 22846432Sas200622 * 22856432Sas200622 * Number of arguments set. 22866432Sas200622 */ 22876432Sas200622 static int 22886432Sas200622 smb_dcmd_setopt(uint_t opts, int max_argc, mdb_arg_t *argv) 22895331Samw { 22906432Sas200622 int i; 22916432Sas200622 int argc = 0; 22926432Sas200622 22936432Sas200622 for (i = 0; i < SMB_MDB_MAX_OPTS; i++) { 229412508Samw@Sun.COM if ((opts & smb_opts[i].o_value) && (argc < max_argc)) { 22956432Sas200622 argv->a_type = MDB_TYPE_STRING; 229612508Samw@Sun.COM argv->a_un.a_str = smb_opts[i].o_name; 22976432Sas200622 argc++; 22986432Sas200622 argv++; 22996432Sas200622 } 23006432Sas200622 } 23016432Sas200622 return (argc); 23025331Samw } 23036432Sas200622 23046432Sas200622 /* 23056432Sas200622 * smb_obj_expand 23066432Sas200622 */ 23076432Sas200622 static int 23086432Sas200622 smb_obj_expand(uintptr_t addr, uint_t opts, const smb_exp_t *x, ulong_t indent) 23096432Sas200622 { 23106432Sas200622 int rc = 0; 23116432Sas200622 int argc; 23126432Sas200622 mdb_arg_t argv[SMB_MDB_MAX_OPTS]; 23136432Sas200622 23146432Sas200622 argc = smb_dcmd_setopt(opts | SMB_OPT_WALK, SMB_MDB_MAX_OPTS, argv); 23156432Sas200622 23166432Sas200622 (void) mdb_inc_indent(indent); 23176432Sas200622 while (x->ex_dcmd) { 23186432Sas200622 if (x->ex_mask & opts) { 23196432Sas200622 rc = mdb_pwalk_dcmd("list", x->ex_dcmd, argc, argv, 23206432Sas200622 addr + x->ex_offset); 23216432Sas200622 23226432Sas200622 if (rc) { 23236432Sas200622 mdb_warn("failed to walk the list of %s in %p", 23246432Sas200622 x->ex_name, addr + x->ex_offset); 23256432Sas200622 break; 23266432Sas200622 } 23276432Sas200622 } 23286432Sas200622 x++; 23296432Sas200622 } 23306432Sas200622 (void) mdb_dec_indent(indent); 23316432Sas200622 return (rc); 23326432Sas200622 } 23336432Sas200622 23346432Sas200622 /* 23356432Sas200622 * smb_obj_list 23366432Sas200622 * 23376432Sas200622 * Function called by the DCMDs when no address is provided. It expands the 23386432Sas200622 * tree under the object type associated with the calling DCMD (based on the 23396432Sas200622 * flags passed in). 23406432Sas200622 * 23416432Sas200622 * Return Value 23426432Sas200622 * 23436432Sas200622 * DCMD_OK 23446432Sas200622 * DCMD_ERR 23456432Sas200622 */ 23466432Sas200622 static int 23476432Sas200622 smb_obj_list(const char *name, uint_t opts, uint_t flags) 23486432Sas200622 { 23496432Sas200622 int argc; 23506432Sas200622 mdb_arg_t argv[SMB_MDB_MAX_OPTS]; 23516432Sas200622 23526432Sas200622 argc = smb_dcmd_setopt(opts, SMB_MDB_MAX_OPTS, argv); 23536432Sas200622 23546432Sas200622 if (mdb_call_dcmd("smblist", 0, flags, argc, argv)) { 23556432Sas200622 mdb_warn("failed to list %s", name); 23566432Sas200622 return (DCMD_ERR); 23576432Sas200622 } 23586432Sas200622 return (DCMD_OK); 23596432Sas200622 } 23609021Samw@Sun.COM 23619021Samw@Sun.COM static int 23629021Samw@Sun.COM smb_worker_findstack(uintptr_t addr) 23639021Samw@Sun.COM { 23649021Samw@Sun.COM kthread_t t; 23659021Samw@Sun.COM taskq_t tq; 23669021Samw@Sun.COM char cmd[80]; 23679021Samw@Sun.COM mdb_arg_t cmdarg; 23689021Samw@Sun.COM 23699021Samw@Sun.COM if (mdb_vread(&t, sizeof (kthread_t), addr) == -1) { 23709021Samw@Sun.COM mdb_warn("failed to read kthread_t at %p", addr); 23719021Samw@Sun.COM return (DCMD_ERR); 23729021Samw@Sun.COM } 23739021Samw@Sun.COM 23749021Samw@Sun.COM if (mdb_vread(&tq, sizeof (taskq_t), (uintptr_t)t.t_taskq) == -1) 23759021Samw@Sun.COM tq.tq_name[0] = '\0'; 23769021Samw@Sun.COM 23779021Samw@Sun.COM mdb_inc_indent(2); 23789021Samw@Sun.COM 23799021Samw@Sun.COM mdb_printf("PC: %a", t.t_pc); 23809021Samw@Sun.COM if (t.t_tid == 0) { 23819021Samw@Sun.COM if (tq.tq_name[0] != '\0') 23829021Samw@Sun.COM mdb_printf(" TASKQ: %s\n", tq.tq_name); 23839021Samw@Sun.COM else 23849021Samw@Sun.COM mdb_printf(" THREAD: %a()\n", t.t_startpc); 23859021Samw@Sun.COM } 23869021Samw@Sun.COM 23879021Samw@Sun.COM mdb_snprintf(cmd, sizeof (cmd), "<.$c%d", 16); 23889021Samw@Sun.COM cmdarg.a_type = MDB_TYPE_STRING; 23899021Samw@Sun.COM cmdarg.a_un.a_str = cmd; 23909021Samw@Sun.COM (void) mdb_call_dcmd("findstack", addr, DCMD_ADDRSPEC, 1, &cmdarg); 23919021Samw@Sun.COM mdb_dec_indent(2); 23929021Samw@Sun.COM mdb_printf("\n"); 23939021Samw@Sun.COM return (DCMD_OK); 23949021Samw@Sun.COM } 2395