1 /* 2 * Copyright (c) 2000-2001 Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Boris Popov. 16 * 4. Neither the name of the author nor the names of any co-contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * $Id: smb_conn.h,v 1.32.42.1 2005/05/27 02:35:29 lindak Exp $ 33 */ 34 35 /* 36 * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 37 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 38 * Use is subject to license terms. 39 */ 40 41 #ifndef _SMB_CONN_H 42 #define _SMB_CONN_H 43 44 #include <sys/dditypes.h> 45 #include <sys/t_lock.h> 46 #include <sys/queue.h> /* for SLIST below */ 47 #include <sys/uio.h> 48 #include <netsmb/smb_dev.h> 49 50 /* 51 * Credentials of user/process for processing in the connection procedures 52 */ 53 typedef struct smb_cred { 54 struct cred *scr_cred; 55 } smb_cred_t; 56 57 /* 58 * Common object flags 59 */ 60 #define SMBO_GONE 0x1000000 61 62 /* 63 * Bits in vc_flags (a.k.a. vc_co.co_flags) 64 * Many of these were duplicates of SMBVOPT_ flags 65 * and we now keep those too instead of merging 66 * them into vc_flags. 67 */ 68 69 #define SMBV_WIN95 0x0010 /* used to apply bugfixes for this OS */ 70 #define SMBV_NT4 0x0020 /* used when NT4 issues invalid resp */ 71 #define SMBV_UNICODE 0x0040 /* conn configured to use Unicode */ 72 73 /* 74 * Note: the common "obj" level uses this GONE flag by 75 * the name SMBO_GONE. Keep this alias as a reminder. 76 */ 77 #define SMBV_GONE SMBO_GONE 78 79 /* 80 * bits in smb_share ss_flags (a.k.a. ss_co.co_flags) 81 */ 82 #define SMBS_RECONNECTING 0x0002 83 #define SMBS_CONNECTED 0x0004 84 #define SMBS_TCON_WAIT 0x0008 85 #define SMBS_FST_FAT 0x0010 /* share FS Type is FAT */ 86 /* 87 * Note: the common "obj" level uses this GONE flag by 88 * the name SMBO_GONE. Keep this alias as a reminder. 89 */ 90 #define SMBS_GONE SMBO_GONE 91 92 struct smb_rq; 93 /* This declares struct smb_rqhead */ 94 TAILQ_HEAD(smb_rqhead, smb_rq); 95 96 #define SMB_NBTIMO 15 97 #define SMB_DEFRQTIMO 30 /* 30 for oplock revoke/writeback */ 98 #define SMBWRTTIMO 60 99 #define SMBSSNSETUPTIMO 60 100 #define SMBNOREPLYWAIT (0) 101 102 #define SMB_DIALECT(vcp) ((vcp)->vc_sopt.sv_proto) 103 104 /* 105 * Connection object 106 */ 107 108 #define SMB_CO_LOCK(cp) mutex_enter(&(cp)->co_lock) 109 #define SMB_CO_UNLOCK(cp) mutex_exit(&(cp)->co_lock) 110 111 /* 112 * Common part of smb_vc, smb_share 113 * Locking: co_lock protects most 114 * fields in this struct, except 115 * as noted below: 116 */ 117 struct smb_connobj { 118 kmutex_t co_lock; 119 int co_level; /* SMBL_ */ 120 int co_flags; 121 int co_usecount; 122 123 /* Note: must lock co_parent before child. */ 124 struct smb_connobj *co_parent; 125 126 /* this.co_lock protects the co_children list */ 127 SLIST_HEAD(, smb_connobj) co_children; 128 129 /* 130 * Linkage in parent's list of children. 131 * Must hold parent.co_lock to traverse. 132 */ 133 SLIST_ENTRY(smb_connobj) co_next; 134 135 /* These two are set only at creation. */ 136 void (*co_gone)(struct smb_connobj *); 137 void (*co_free)(struct smb_connobj *); 138 }; 139 typedef struct smb_connobj smb_connobj_t; 140 141 /* 142 * "Level" in the connection object hierarchy 143 */ 144 #define SMBL_SM 0 145 #define SMBL_VC 1 146 #define SMBL_SHARE 2 147 148 /* 149 * Virtual Circuit to a server (really connection + session). 150 * Yes, calling this a "Virtual Circuit" is confusining, 151 * because it has nothing to do with the SMB notion of a 152 * "Virtual Circuit". 153 */ 154 typedef struct smb_vc { 155 struct smb_connobj vc_co; /* keep first! See CPTOVC */ 156 enum smbiod_state vc_state; 157 kcondvar_t vc_statechg; 158 159 zoneid_t vc_zoneid; 160 uid_t vc_owner; /* Unix owner */ 161 int vc_genid; /* "generation" ID */ 162 163 int vc_mackeylen; /* length of MAC key */ 164 uint8_t *vc_mackey; /* MAC key */ 165 166 ksema_t vc_sendlock; 167 struct smb_tran_desc *vc_tdesc; /* transport ops. vector */ 168 void *vc_tdata; /* transport control block */ 169 170 kcondvar_t iod_idle; /* IOD thread idle CV */ 171 krwlock_t iod_rqlock; /* iod_rqlist */ 172 struct smb_rqhead iod_rqlist; /* list of outstanding reqs */ 173 struct _kthread *iod_thr; /* the IOD (reader) thread */ 174 int iod_flags; /* see SMBIOD_* below */ 175 int iod_newrq; /* send needed (iod_rqlock) */ 176 int iod_muxfull; /* maxmux limit reached */ 177 178 /* This is copied in/out when IOD enters/returns */ 179 smbioc_ssn_work_t vc_work; 180 181 /* session identity, etc. */ 182 smbioc_ossn_t vc_ssn; 183 } smb_vc_t; 184 185 #define vc_lock vc_co.co_lock 186 #define vc_flags vc_co.co_flags 187 188 /* defines for members in vc_ssn */ 189 #define vc_owner vc_ssn.ssn_owner 190 #define vc_srvname vc_ssn.ssn_srvname 191 #define vc_srvaddr vc_ssn.ssn_id.id_srvaddr 192 #define vc_domain vc_ssn.ssn_id.id_domain 193 #define vc_username vc_ssn.ssn_id.id_user 194 #define vc_vopt vc_ssn.ssn_vopt 195 196 /* defines for members in vc_work */ 197 #define vc_sopt vc_work.wk_sopt 198 #define vc_maxmux vc_work.wk_sopt.sv_maxmux 199 #define vc_tran_fd vc_work.wk_iods.is_tran_fd 200 #define vc_hflags vc_work.wk_iods.is_hflags 201 #define vc_hflags2 vc_work.wk_iods.is_hflags2 202 #define vc_smbuid vc_work.wk_iods.is_smbuid 203 #define vc_next_mid vc_work.wk_iods.is_next_mid 204 #define vc_txmax vc_work.wk_iods.is_txmax 205 #define vc_rwmax vc_work.wk_iods.is_rwmax 206 #define vc_rxmax vc_work.wk_iods.is_rxmax 207 #define vc_wxmax vc_work.wk_iods.is_wxmax 208 #define vc_ssn_key vc_work.wk_iods.is_ssn_key 209 #define vc_next_seq vc_work.wk_iods.is_next_seq 210 #define vc_u_mackey vc_work.wk_iods.is_u_mackey 211 #define vc_u_maclen vc_work.wk_iods.is_u_maclen 212 213 #define SMB_VC_LOCK(vcp) mutex_enter(&(vcp)->vc_lock) 214 #define SMB_VC_UNLOCK(vcp) mutex_exit(&(vcp)->vc_lock) 215 216 #define SMB_UNICODE_STRINGS(vcp) ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE) 217 218 /* Bits in iod_flags */ 219 #define SMBIOD_RUNNING 0x0001 220 #define SMBIOD_SHUTDOWN 0x0002 221 222 /* 223 * smb_share structure describes connection to the given SMB share (tree). 224 * Connection to share is always built on top of the VC. 225 */ 226 227 typedef struct smb_share { 228 struct smb_connobj ss_co; /* keep first! See CPTOSS */ 229 kcondvar_t ss_conn_done; /* wait for reconnect */ 230 int ss_conn_waiters; 231 int ss_vcgenid; /* check VC generation ID */ 232 uint16_t ss_tid; /* TID */ 233 uint16_t ss_options; /* option support bits */ 234 smbioc_oshare_t ss_ioc; 235 } smb_share_t; 236 237 #define ss_lock ss_co.co_lock 238 #define ss_flags ss_co.co_flags 239 240 #define ss_use ss_ioc.sh_use 241 #define ss_type ss_ioc.sh_type 242 #define ss_name ss_ioc.sh_name 243 #define ss_pass ss_ioc.sh_pass 244 245 #define SMB_SS_LOCK(ssp) mutex_enter(&(ssp)->ss_lock) 246 #define SMB_SS_UNLOCK(ssp) mutex_exit(&(ssp)->ss_lock) 247 248 #define CPTOVC(cp) ((struct smb_vc *)((void *)(cp))) 249 #define VCTOCP(vcp) (&(vcp)->vc_co) 250 251 #define CPTOSS(cp) ((struct smb_share *)((void *)(cp))) 252 #define SSTOVC(ssp) CPTOVC(((ssp)->ss_co.co_parent)) 253 #define SSTOCP(ssp) (&(ssp)->ss_co) 254 255 /* 256 * Call-back operations vector, so the netsmb module 257 * can notify smbfs about events affecting mounts. 258 * Installed in netsmb after smbfs loads. 259 */ 260 typedef struct smb_fscb { 261 /* Called when the VC has disconnected. */ 262 void (*fscb_disconn)(smb_share_t *); 263 /* Called when the VC has reconnected. */ 264 void (*fscb_connect)(smb_share_t *); 265 /* Called when the server becomes unresponsive. */ 266 void (*fscb_down)(smb_share_t *); 267 /* Called when the server is responding again. */ 268 void (*fscb_up)(smb_share_t *); 269 } smb_fscb_t; 270 /* Install the above vector, or pass NULL to clear it. */ 271 void smb_fscb_set(smb_fscb_t *); 272 273 /* 274 * The driver per open instance object. 275 * Mostly used in: smb_dev.c, smb_usr.c 276 */ 277 typedef struct smb_dev { 278 kmutex_t sd_lock; 279 struct smb_vc *sd_vc; /* Reference to VC */ 280 struct smb_share *sd_share; /* Reference to share if any */ 281 int sd_level; /* SMBL_VC, ... */ 282 int sd_vcgenid; /* Generation of share or VC */ 283 int sd_poll; /* Future use */ 284 int sd_flags; /* State of connection */ 285 #define NSMBFL_OPEN 0x0001 286 #define NSMBFL_IOD 0x0002 287 #define NSMBFL_IOCTL 0x0004 288 int sd_smbfid; /* library read/write */ 289 zoneid_t zoneid; /* Zone id */ 290 } smb_dev_t; 291 292 extern const uint32_t nsmb_version; 293 294 /* 295 * smb_dev.c 296 */ 297 int smb_dev2share(int fd, struct smb_share **sspp); 298 299 300 /* 301 * smb_usr.c 302 */ 303 int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags); 304 int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags); 305 int smb_usr_dup_dev(smb_dev_t *sdp, intptr_t arg, int flags); 306 307 int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr); 308 int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr); 309 310 int smb_usr_closefh(smb_dev_t *, cred_t *); 311 int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr); 312 int smb_usr_ntcreate(smb_dev_t *, intptr_t, int, cred_t *); 313 int smb_usr_printjob(smb_dev_t *, intptr_t, int, cred_t *); 314 315 int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *); 316 int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd); 317 318 int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *); 319 int smb_usr_drop_tree(smb_dev_t *sdp, int cmd); 320 321 int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr); 322 int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags); 323 324 325 /* 326 * IOD functions 327 */ 328 int smb_iod_create(smb_vc_t *vcp); 329 int smb_iod_destroy(smb_vc_t *vcp); 330 int smb_iod_connect(smb_vc_t *vcp); 331 void smb_iod_disconnect(smb_vc_t *vcp); 332 int smb_iod_addrq(struct smb_rq *rqp); 333 int smb_iod_multirq(struct smb_rq *rqp); 334 int smb_iod_waitrq(struct smb_rq *rqp); 335 void smb_iod_removerq(struct smb_rq *rqp); 336 void smb_iod_shutdown_share(smb_share_t *ssp); 337 338 void smb_iod_sendall(smb_vc_t *); 339 int smb_iod_recvall(smb_vc_t *); 340 341 int smb_iod_vc_work(smb_vc_t *, cred_t *); 342 int smb_iod_vc_idle(smb_vc_t *); 343 int smb_iod_vc_rcfail(smb_vc_t *); 344 int smb_iod_reconnect(smb_vc_t *); 345 346 /* 347 * Session level functions 348 */ 349 int smb_sm_init(void); 350 int smb_sm_idle(void); 351 void smb_sm_done(void); 352 353 /* 354 * VC level functions 355 */ 356 void smb_vc_hold(smb_vc_t *vcp); 357 void smb_vc_rele(smb_vc_t *vcp); 358 void smb_vc_kill(smb_vc_t *vcp); 359 360 int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **); 361 int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp); 362 363 const char *smb_vc_getpass(smb_vc_t *vcp); 364 uint16_t smb_vc_nextmid(smb_vc_t *vcp); 365 void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers); 366 367 typedef void (*walk_share_func_t)(smb_share_t *); 368 void smb_vc_walkshares(struct smb_vc *, walk_share_func_t); 369 370 /* 371 * share level functions 372 */ 373 374 int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *, 375 smb_share_t **, smb_cred_t *); 376 377 void smb_share_hold(smb_share_t *ssp); 378 void smb_share_rele(smb_share_t *ssp); 379 void smb_share_kill(smb_share_t *ssp); 380 381 void smb_share_invalidate(smb_share_t *ssp); 382 int smb_share_tcon(smb_share_t *, smb_cred_t *); 383 384 #endif /* _SMB_CONN_H */ 385