1b819cea2SGordon Ross /* 2b819cea2SGordon Ross * CDDL HEADER START 3b819cea2SGordon Ross * 4b819cea2SGordon Ross * The contents of this file are subject to the terms of the 5b819cea2SGordon Ross * Common Development and Distribution License (the "License"). 6b819cea2SGordon Ross * You may not use this file except in compliance with the License. 7b819cea2SGordon Ross * 8b819cea2SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9b819cea2SGordon Ross * or http://www.opensolaris.org/os/licensing. 10b819cea2SGordon Ross * See the License for the specific language governing permissions 11b819cea2SGordon Ross * and limitations under the License. 12b819cea2SGordon Ross * 13b819cea2SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each 14b819cea2SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15b819cea2SGordon Ross * If applicable, add the following below this CDDL HEADER, with the 16b819cea2SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying 17b819cea2SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner] 18b819cea2SGordon Ross * 19b819cea2SGordon Ross * CDDL HEADER END 20b819cea2SGordon Ross */ 21b819cea2SGordon Ross /* 22b819cea2SGordon Ross * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 23b819cea2SGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 24b819cea2SGordon Ross */ 25b819cea2SGordon Ross 26b819cea2SGordon Ross #include <sys/types.h> 27b819cea2SGordon Ross #include <sys/ddi.h> 28b819cea2SGordon Ross #include <sys/modctl.h> 29b819cea2SGordon Ross #include <sys/cred.h> 30b819cea2SGordon Ross #include <sys/disp.h> 31b819cea2SGordon Ross #include <sys/ioccom.h> 32b819cea2SGordon Ross #include <sys/policy.h> 33b819cea2SGordon Ross #include <sys/cmn_err.h> 34b819cea2SGordon Ross #include <smbsrv/smb_kproto.h> 35b819cea2SGordon Ross #include <smbsrv/smb_ioctl.h> 36b819cea2SGordon Ross 37b819cea2SGordon Ross /* 38b819cea2SGordon Ross * ***************************************************************************** 39b819cea2SGordon Ross * ****************************** Global Variables ***************************** 40b819cea2SGordon Ross * ***************************************************************************** 41b819cea2SGordon Ross * 42b819cea2SGordon Ross * These variables can only be changed through the /etc/system file. 43b819cea2SGordon Ross */ 44b819cea2SGordon Ross 45b819cea2SGordon Ross /* 46b819cea2SGordon Ross * Maximum buffer size for NT: configurable based on the client environment. 47b819cea2SGordon Ross * IR104720 Experiments with Windows 2000 indicate that we achieve better 48b819cea2SGordon Ross * SmbWriteX performance with a buffer size of 64KB instead of the 37KB used 49b819cea2SGordon Ross * with Windows NT4.0. Previous experiments with NT4.0 resulted in directory 50b819cea2SGordon Ross * listing problems so this buffer size is configurable based on the end-user 51b819cea2SGordon Ross * environment. When in doubt use 37KB. 52b819cea2SGordon Ross * 53b819cea2SGordon Ross * smb_raw_mode: read_raw and write_raw supported (1) or NOT supported (0). 54b819cea2SGordon Ross */ 55b819cea2SGordon Ross int smb_maxbufsize = SMB_NT_MAXBUF; 56b819cea2SGordon Ross int smb_oplock_levelII = 1; 57b819cea2SGordon Ross int smb_oplock_timeout = OPLOCK_STD_TIMEOUT; 58b819cea2SGordon Ross int smb_oplock_min_timeout = OPLOCK_MIN_TIMEOUT; 59b819cea2SGordon Ross int smb_flush_required = 1; 60b819cea2SGordon Ross int smb_dirsymlink_enable = 1; 61b819cea2SGordon Ross int smb_sign_debug = 0; 62b819cea2SGordon Ross int smb_raw_mode = 0; 63b819cea2SGordon Ross int smb_shortnames = 1; 64b819cea2SGordon Ross uint_t smb_audit_flags = 65b819cea2SGordon Ross #ifdef DEBUG 66b819cea2SGordon Ross SMB_AUDIT_NODE; 67b819cea2SGordon Ross #else 68b819cea2SGordon Ross 0; 69b819cea2SGordon Ross #endif 70b819cea2SGordon Ross 71b819cea2SGordon Ross /* 72b819cea2SGordon Ross * Maximum number of simultaneous authentication, share mapping, pipe open 73b819cea2SGordon Ross * requests to be processed. 74b819cea2SGordon Ross */ 75b819cea2SGordon Ross int smb_ssetup_threshold = 256; 76b819cea2SGordon Ross int smb_tcon_threshold = 1024; 77b819cea2SGordon Ross int smb_opipe_threshold = 1024; 78b819cea2SGordon Ross 79b819cea2SGordon Ross /* 80b819cea2SGordon Ross * Number of milliseconds that a request will be stalled if it comes in after 81b819cea2SGordon Ross * the maximum number of inflight operations are being proccessed. 82b819cea2SGordon Ross */ 83b819cea2SGordon Ross int smb_ssetup_timeout = (30 * 1000); 84b819cea2SGordon Ross int smb_tcon_timeout = (30 * 1000); 85b819cea2SGordon Ross int smb_opipe_timeout = (30 * 1000); 86b819cea2SGordon Ross 87b819cea2SGordon Ross int smb_threshold_debug = 0; 88b819cea2SGordon Ross 89b819cea2SGordon Ross /* 90b819cea2SGordon Ross * Thread priorities used in smbsrv. Our threads spend most of their time 91b819cea2SGordon Ross * blocked on various conditions. However, if the system gets heavy load, 92b819cea2SGordon Ross * the scheduler has to choose an order to run these. We want the order: 93b819cea2SGordon Ross * (a) timers, (b) notifications, (c) workers, (d) receivers (and etc.) 94b819cea2SGordon Ross * where notifications are oplock and change notify work. Aside from this 95b819cea2SGordon Ross * relative ordering, smbsrv threads should run with a priority close to 96b819cea2SGordon Ross * that of normal user-space threads (thus minclsyspri below), just like 97b819cea2SGordon Ross * NFS and other "file service" kinds of processing. 98b819cea2SGordon Ross */ 99b819cea2SGordon Ross int smbsrv_base_pri = MINCLSYSPRI; 100b819cea2SGordon Ross int smbsrv_listen_pri = MINCLSYSPRI; 101b819cea2SGordon Ross int smbsrv_receive_pri = MINCLSYSPRI; 102b819cea2SGordon Ross int smbsrv_worker_pri = MINCLSYSPRI + 1; 103b819cea2SGordon Ross int smbsrv_notify_pri = MINCLSYSPRI + 2; 104b819cea2SGordon Ross int smbsrv_timer_pri = MINCLSYSPRI + 5; 105b819cea2SGordon Ross 106b819cea2SGordon Ross /* 107b819cea2SGordon Ross * These are the (open,close,ioctl) entry points into this 108b819cea2SGordon Ross * (fake) "driver". They are declared in smb_ioctl.h 109b819cea2SGordon Ross */ 110b819cea2SGordon Ross 111b819cea2SGordon Ross static int g_init_done = 0; 112b819cea2SGordon Ross 113b819cea2SGordon Ross int fksmbsrv_vfs_init(void); 114b819cea2SGordon Ross 115b819cea2SGordon Ross int 116b819cea2SGordon Ross fksmbsrv_drv_open(void) 117b819cea2SGordon Ross { 118b819cea2SGordon Ross int rc; 119b819cea2SGordon Ross 120b819cea2SGordon Ross if (g_init_done == 0) { 121b819cea2SGordon Ross if ((rc = fksmbsrv_vfs_init()) != 0) { 122b819cea2SGordon Ross cmn_err(CE_WARN, "fksmbsrv_vfs_init, rc=%d", rc); 123b819cea2SGordon Ross return (rc); 124b819cea2SGordon Ross } 125b819cea2SGordon Ross if ((rc = smb_server_g_init()) != 0) { 126b819cea2SGordon Ross cmn_err(CE_WARN, "smb_server_g_init, rc=%d", rc); 127b819cea2SGordon Ross return (rc); 128b819cea2SGordon Ross } 129b819cea2SGordon Ross g_init_done = 1; 130b819cea2SGordon Ross } 131b819cea2SGordon Ross 132b819cea2SGordon Ross rc = smb_server_create(); 133b819cea2SGordon Ross return (rc); 134b819cea2SGordon Ross } 135b819cea2SGordon Ross 136b819cea2SGordon Ross int 137b819cea2SGordon Ross fksmbsrv_drv_close(void) 138b819cea2SGordon Ross { 139b819cea2SGordon Ross int rc; 140b819cea2SGordon Ross 141b819cea2SGordon Ross rc = smb_server_delete(); 142b819cea2SGordon Ross 143b819cea2SGordon Ross if (g_init_done != 0) { 144*a90cf9f2SGordon Ross smb_server_g_fini(); 145b819cea2SGordon Ross g_init_done = 0; 146b819cea2SGordon Ross } 147b819cea2SGordon Ross 148b819cea2SGordon Ross return (rc); 149b819cea2SGordon Ross } 150b819cea2SGordon Ross 151b819cea2SGordon Ross /* 152b819cea2SGordon Ross * This is the primary entry point into this library, called by 153b819cea2SGordon Ross * fksmbd (user-level debug version of smbsrv). 154b819cea2SGordon Ross */ 155b819cea2SGordon Ross int 156b819cea2SGordon Ross fksmbsrv_drv_ioctl(int cmd, void *varg) 157b819cea2SGordon Ross { 158b819cea2SGordon Ross smb_ioc_t *ioc = varg; 159b819cea2SGordon Ross int rc = 0; 160b819cea2SGordon Ross 161b819cea2SGordon Ross switch (cmd) { 162b819cea2SGordon Ross case SMB_IOC_CONFIG: 163b819cea2SGordon Ross rc = smb_server_configure(&ioc->ioc_cfg); 164b819cea2SGordon Ross break; 165b819cea2SGordon Ross case SMB_IOC_START: 166b819cea2SGordon Ross rc = smb_server_start(&ioc->ioc_start); 167b819cea2SGordon Ross break; 168b819cea2SGordon Ross case SMB_IOC_STOP: 169b819cea2SGordon Ross rc = smb_server_stop(); 170b819cea2SGordon Ross break; 171b819cea2SGordon Ross case SMB_IOC_EVENT: 172b819cea2SGordon Ross rc = smb_server_notify_event(&ioc->ioc_event); 173b819cea2SGordon Ross break; 174b819cea2SGordon Ross case SMB_IOC_GMTOFF: 175b819cea2SGordon Ross rc = smb_server_set_gmtoff(&ioc->ioc_gmt); 176b819cea2SGordon Ross break; 177b819cea2SGordon Ross case SMB_IOC_SHARE: 178b819cea2SGordon Ross rc = smb_kshare_export_list(&ioc->ioc_share); 179b819cea2SGordon Ross break; 180b819cea2SGordon Ross case SMB_IOC_UNSHARE: 181b819cea2SGordon Ross rc = smb_kshare_unexport_list(&ioc->ioc_share); 182b819cea2SGordon Ross break; 183b819cea2SGordon Ross case SMB_IOC_SHAREINFO: 184b819cea2SGordon Ross rc = smb_kshare_info(&ioc->ioc_shareinfo); 185b819cea2SGordon Ross break; 186b819cea2SGordon Ross case SMB_IOC_NUMOPEN: 187b819cea2SGordon Ross rc = smb_server_numopen(&ioc->ioc_opennum); 188b819cea2SGordon Ross break; 189b819cea2SGordon Ross case SMB_IOC_SVCENUM: 190b819cea2SGordon Ross rc = smb_server_enum(&ioc->ioc_svcenum); 191b819cea2SGordon Ross break; 192b819cea2SGordon Ross case SMB_IOC_SESSION_CLOSE: 193b819cea2SGordon Ross rc = smb_server_session_close(&ioc->ioc_session); 194b819cea2SGordon Ross break; 195b819cea2SGordon Ross case SMB_IOC_FILE_CLOSE: 196b819cea2SGordon Ross rc = smb_server_file_close(&ioc->ioc_fileid); 197b819cea2SGordon Ross break; 198b819cea2SGordon Ross case SMB_IOC_SPOOLDOC: 199b819cea2SGordon Ross rc = smb_server_spooldoc(&ioc->ioc_spooldoc); 200b819cea2SGordon Ross break; 201b819cea2SGordon Ross default: 202b819cea2SGordon Ross rc = ENOTTY; 203b819cea2SGordon Ross break; 204b819cea2SGordon Ross } 205b819cea2SGordon Ross 206b819cea2SGordon Ross return (rc); 207b819cea2SGordon Ross } 208b819cea2SGordon Ross 209b819cea2SGordon Ross /* 210b819cea2SGordon Ross * This function intentionally does nothing. It's used only to 211b819cea2SGordon Ross * force libfksmbsrv to load when fksmbd starts so one can set 212b819cea2SGordon Ross * breakpoints etc. without debugger "force load" tricks. 213b819cea2SGordon Ross */ 214b819cea2SGordon Ross void 215b819cea2SGordon Ross fksmbsrv_drv_load(void) 216b819cea2SGordon Ross { 217b819cea2SGordon Ross } 218