smb_conn.h revision 6294:badeeeccc579
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 2008 Sun Microsystems, Inc. All rights reserved. 37 * Use is subject to license terms. 38 */ 39 40#ifndef _SMB_CONN_H 41#define _SMB_CONN_H 42 43#pragma ident "%Z%%M% %I% %E% SMI" 44 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#ifndef _KERNEL 51#error "Not _KERNEL?" 52#endif 53 54/* 55 * Credentials of user/process for processing in the connection procedures 56 */ 57typedef struct smb_cred { 58 pid_t vc_pid; 59 cred_t *vc_ucred; 60} smb_cred_t; 61 62/* 63 * Common object flags 64 */ 65#define SMBO_GONE 0x1000000 66 67/* 68 * Bits in vc_flags (a.k.a. vc_co.co_flags) 69 * Many of these were duplicates of SMBVOPT_ flags 70 * and we now keep those too instead of merging 71 * them into vc_flags. 72 */ 73 74#define SMBV_LONGNAMES 0x0004 /* conn configured to use long names */ 75#define SMBV_ENCRYPT 0x0008 /* server demands encrypted password */ 76#define SMBV_WIN95 0x0010 /* used to apply bugfixes for this OS */ 77#define SMBV_NT4 0x0020 /* used when NT4 issues invalid resp */ 78#define SMBV_RECONNECTING 0x0040 /* conn in process of reconnection */ 79/* 0x0200 unused - was SMBV_FAILED */ 80#define SMBV_UNICODE 0x0400 /* conn configured to use Unicode */ 81#define SMBV_EXT_SEC 0x0800 /* conn to use extended security */ 82 83/* 84 * Note: the common "obj" level uses this GONE flag by 85 * the name SMBO_GONE. Keep this alias as a reminder. 86 */ 87#define SMBV_GONE SMBO_GONE 88 89/* 90 * bits in smb_share ss_flags (a.k.a. ss_co.co_flags) 91 */ 92#define SMBS_RECONNECTING 0x0002 93#define SMBS_CONNECTED 0x0004 94#define SMBS_TCON_WAIT 0x0008 95#define SMBS_1980 0x0010 96/* 97 * ^ This partition can't handle dates before 1980. It's probably a FAT 98 * partition but could be some other ancient FS type 99 */ 100#define SMBS_RESUMEKEYS 0x0010 /* must use resume keys */ 101/* 102 * Note: the common "obj" level uses this GONE flag by 103 * the name SMBO_GONE. Keep this alias as a reminder. 104 */ 105#define SMBS_GONE SMBO_GONE 106 107/* 108 * Negotiated protocol parameters 109 */ 110struct smb_sopt { 111 int sv_proto; 112 int16_t sv_tz; /* offset in min relative to UTC */ 113 uint32_t sv_maxtx; /* maximum transmit buf size */ 114 uchar_t sv_sm; /* security mode */ 115 uint16_t sv_maxmux; /* max number of outstanding rq's */ 116 uint16_t sv_maxvcs; /* max number of VCs */ 117 uint16_t sv_rawmode; 118 uint32_t sv_maxraw; /* maximum raw-buffer size */ 119 uint32_t sv_skey; /* session key */ 120 uint32_t sv_caps; /* capabilites SMB_CAP_ */ 121}; 122typedef struct smb_sopt smb_sopt_t; 123 124/* 125 * network IO daemon states 126 * really connection states. 127 */ 128enum smbiod_state { 129 SMBIOD_ST_NOTCONN, /* no connect request was made */ 130 SMBIOD_ST_RECONNECT, /* a [re]connect attempt is in progress */ 131 SMBIOD_ST_TRANACTIVE, /* transport level is up */ 132 SMBIOD_ST_NEGOACTIVE, /* completed negotiation */ 133 SMBIOD_ST_SSNSETUP, /* started (a) session setup */ 134 SMBIOD_ST_VCACTIVE, /* session established */ 135 SMBIOD_ST_DEAD /* connection broken, transport is down */ 136}; 137 138 139/* 140 * Info structures 141 */ 142#define SMB_INFO_NONE 0 143#define SMB_INFO_VC 2 144#define SMB_INFO_SHARE 3 145 146struct smb_vc_info { 147 int itype; 148 int usecount; 149 uid_t uid; /* user id of connection */ 150 gid_t gid; /* group of connection */ 151 mode_t mode; /* access mode */ 152 int flags; 153 enum smbiod_state iodstate; 154 struct smb_sopt sopt; 155 char srvname[SMB_MAXSRVNAMELEN+1]; 156 char vcname[128]; 157}; 158typedef struct smb_vc_info smb_vc_info_t; 159 160struct smb_share_info { 161 int itype; 162 int usecount; 163 ushort_t tid; /* TID */ 164 int type; /* share type */ 165 uid_t uid; /* user id of connection */ 166 gid_t gid; /* group of connection */ 167 mode_t mode; /* access mode */ 168 int flags; 169 char sname[128]; 170}; 171typedef struct smb_share_info smb_share_info_t; 172 173struct smb_rq; 174/* This declares struct smb_rqhead */ 175TAILQ_HEAD(smb_rqhead, smb_rq); 176 177#define SMB_NBTIMO 15 178#define SMB_DEFRQTIMO 30 /* 30 for oplock revoke/writeback */ 179#define SMBWRTTIMO 60 180#define SMBSSNSETUPTIMO 60 181#define SMBNOREPLYWAIT (0) 182 183#define SMB_DIALECT(vcp) ((vcp)->vc_sopt.sv_proto) 184 185/* 186 * Connection object 187 */ 188 189#define SMB_CO_LOCK(cp) mutex_enter(&(cp)->co_lock) 190#define SMB_CO_UNLOCK(cp) mutex_exit(&(cp)->co_lock) 191 192/* 193 * Common part of smb_vc, smb_share 194 * Locking: co_lock protects most 195 * fields in this struct, except 196 * as noted below: 197 */ 198struct smb_connobj { 199 kmutex_t co_lock; 200 int co_level; /* SMBL_ */ 201 int co_flags; 202 int co_usecount; 203 204 /* Note: must lock co_parent before child. */ 205 struct smb_connobj *co_parent; 206 207 /* this.co_lock protects the co_children list */ 208 SLIST_HEAD(, smb_connobj) co_children; 209 210 /* 211 * Linkage in parent's list of children. 212 * Must hold parent.co_lock to traverse. 213 */ 214 SLIST_ENTRY(smb_connobj) co_next; 215 216 /* These two are set only at creation. */ 217 void (*co_gone)(struct smb_connobj *); 218 void (*co_free)(struct smb_connobj *); 219}; 220typedef struct smb_connobj smb_connobj_t; 221 222/* 223 * Virtual Circuit (session) to a server. 224 * This is the most (over)complicated part of SMB protocol. 225 * For the user security level (usl), each session with different remote 226 * user name has its own VC. 227 * It is unclear however, should share security level (ssl) allow additional 228 * VCs, because user name is not used and can be the same. On other hand, 229 * multiple VCs allows us to create separate sessions to server on a per 230 * user basis. 231 */ 232 233typedef struct smb_vc { 234 struct smb_connobj vc_co; 235 enum smbiod_state vc_state; 236 kcondvar_t vc_statechg; 237 ksema_t vc_sendlock; 238 239 zoneid_t vc_zoneid; 240 char *vc_srvname; 241 struct sockaddr *vc_paddr; /* server addr */ 242 struct sockaddr *vc_laddr; /* local addr, if any */ 243 char *vc_domain; /* domain that defines username */ 244 char *vc_username; 245 char *vc_pass; /* password for usl case */ 246 uchar_t vc_lmhash[SMB_PWH_MAX]; 247 uchar_t vc_nthash[SMB_PWH_MAX]; 248 249 uint_t vc_timo; /* default request timeout */ 250 int vc_maxvcs; /* maximum number of VC per conn */ 251 252 void *vc_tolower; /* local charset */ 253 void *vc_toupper; /* local charset */ 254 void *vc_toserver; /* local charset to server one */ 255 void *vc_tolocal; /* server charset to local one */ 256 int vc_number; /* number of this VC from client side */ 257 int vc_genid; /* "generation ID" of this VC */ 258 uid_t vc_uid; /* user id of connection */ 259 gid_t vc_grp; /* group of connection */ 260 mode_t vc_mode; /* access mode */ 261 uint16_t vc_smbuid; /* auth. session ID from server */ 262 263 uint8_t vc_hflags; /* or'ed with flags in the smb header */ 264 uint16_t vc_hflags2; /* or'ed with flags in the smb header */ 265 void *vc_tdata; /* transport control block */ 266 struct smb_tran_desc *vc_tdesc; 267 int vc_chlen; /* actual challenge length */ 268 uchar_t vc_challenge[SMB_MAXCHALLENGELEN]; 269 uint16_t vc_mid; /* multiplex id */ 270 int vc_vopt; /* local options SMBVOPT_ */ 271 struct smb_sopt vc_sopt; /* server options */ 272 struct smb_cred vc_scred; /* used in reconnect procedure */ 273 int vc_txmax; /* max tx/rx packet size */ 274 int vc_rxmax; /* max readx data size */ 275 int vc_wxmax; /* max writex data size */ 276 277 /* Authentication tokens */ 278 size_t vc_intoklen; 279 caddr_t vc_intok; 280 size_t vc_outtoklen; 281 caddr_t vc_outtok; 282 size_t vc_negtoklen; 283 caddr_t vc_negtok; 284 285 /* 286 * These members used to be in struct smbiod, 287 * which has been eliminated. 288 */ 289 krwlock_t iod_rqlock; /* iod_rqlist */ 290 struct smb_rqhead iod_rqlist; /* list of outstanding reqs */ 291 struct _kthread *iod_thr; /* the IOD (reader) thread */ 292 kcondvar_t iod_exit; /* IOD thread termination */ 293 int iod_flags; /* see SMBIOD_* below */ 294 int iod_newrq; /* send needed (iod_rqlock) */ 295 int iod_muxfull; /* maxmux limit reached */ 296 uint_t iod_rqwaiting; /* count of waiting requests */ 297} smb_vc_t; 298 299#define vc_lock vc_co.co_lock 300#define vc_flags vc_co.co_flags 301#define vc_maxmux vc_sopt.sv_maxmux 302 303#define SMB_VC_LOCK(vcp) mutex_enter(&(vcp)->vc_lock) 304#define SMB_VC_UNLOCK(vcp) mutex_exit(&(vcp)->vc_lock) 305 306#define SMB_UNICODE_STRINGS(vcp) ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE) 307 308/* Bits in iod_flags */ 309#define SMBIOD_RUNNING 0x0001 310#define SMBIOD_SHUTDOWN 0x0002 311 312/* 313 * smb_share structure describes connection to the given SMB share (tree). 314 * Connection to share is always built on top of the VC. 315 */ 316 317typedef struct smb_share { 318 struct smb_connobj ss_co; 319 kcondvar_t ss_conn_done; /* wait for reconnect */ 320 int ss_conn_waiters; 321 char *ss_name; 322 char *ss_pass; /* share password, can be null */ 323 char *ss_fsname; 324 void *ss_mount; /* used for smb up/down */ 325 uint16_t ss_tid; /* TID */ 326 int ss_type; /* share type */ 327 mode_t ss_mode; /* access mode */ 328 int ss_vcgenid; /* check VC generation ID */ 329 uint32_t ss_maxfilenamelen; 330 int ss_sopt; /* local options SMBSOPT_ */ 331} smb_share_t; 332 333#define ss_lock ss_co.co_lock 334#define ss_flags ss_co.co_flags 335 336#define SMB_SS_LOCK(ssp) mutex_enter(&(ssp)->ss_lock) 337#define SMB_SS_UNLOCK(ssp) mutex_exit(&(ssp)->ss_lock) 338 339#define CPTOVC(cp) ((struct smb_vc *)(cp)) 340#define VCTOCP(vcp) (&(vcp)->vc_co) 341 342#define CPTOSS(cp) ((struct smb_share *)(cp)) 343#define SSTOVC(ssp) CPTOVC(((ssp)->ss_co.co_parent)) 344#define SSTOCP(ssp) (&(ssp)->ss_co) 345 346/* 347 * This is used internally to pass all the info about 348 * some VC that an ioctl caller is looking for. 349 */ 350struct smb_vcspec { 351 char *srvname; 352 struct sockaddr *sap; 353 struct sockaddr *lap; 354 int optflags; 355 char *domain; 356 char *username; 357 char *pass; 358 uid_t owner; 359 gid_t group; 360 mode_t mode; 361 mode_t rights; 362 char *localcs; 363 char *servercs; 364 size_t toklen; 365 caddr_t tok; 366}; 367typedef struct smb_vcspec smb_vcspec_t; 368 369/* 370 * This is used internally to pass all the info about 371 * some share that an ioctl caller is looking for. 372 */ 373struct smb_sharespec { 374 char *name; 375 char *pass; 376 mode_t mode; 377 mode_t rights; 378 uid_t owner; 379 gid_t group; 380 int stype; 381 int optflags; 382}; 383typedef struct smb_sharespec smb_sharespec_t; 384 385 386/* 387 * Call-back operations vector, so the netsmb module 388 * can notify smbfs about events affecting mounts. 389 * Installed in netsmb after smbfs loads. 390 */ 391/* #define NEED_SMBFS_CALLBACKS 1 */ 392#ifdef NEED_SMBFS_CALLBACKS 393typedef struct smb_fscb { 394 void (*fscb_dead)(smb_share_t *); 395 void (*fscb_down)(smb_share_t *); 396 void (*fscb_up)(smb_share_t *); 397} smb_fscb_t; 398/* Install the above vector, or pass NULL to clear it. */ 399int smb_fscb_set(smb_fscb_t *); 400#endif /* NEED_SMBFS_CALLBACKS */ 401 402/* 403 * IOD functions 404 */ 405int smb_iod_create(struct smb_vc *vcp); 406int smb_iod_destroy(struct smb_vc *vcp); 407int smb_iod_connect(struct smb_vc *vcp); 408int smb_iod_disconnect(struct smb_vc *vcp); 409int smb_iod_addrq(struct smb_rq *rqp); 410int smb_iod_multirq(struct smb_rq *rqp); 411int smb_iod_waitrq(struct smb_rq *rqp); 412int smb_iod_removerq(struct smb_rq *rqp); 413void smb_iod_shutdown_share(struct smb_share *ssp); 414void smb_iod_notify_down(struct smb_vc *vcp); 415void smb_iod_notify_up(struct smb_vc *vcp); 416 417/* 418 * Session level functions 419 */ 420int smb_sm_init(void); 421int smb_sm_idle(void); 422void smb_sm_done(void); 423 424int smb_sm_findvc(struct smb_vcspec *vcspec, 425 struct smb_cred *scred, struct smb_vc **vcpp); 426int smb_sm_negotiate(struct smb_vcspec *vcspec, 427 struct smb_cred *scred, struct smb_vc **vcpp); 428int smb_sm_ssnsetup(struct smb_vcspec *vcspec, 429 struct smb_cred *scred, struct smb_vc *vcp); 430int smb_sm_tcon(struct smb_sharespec *shspec, struct smb_cred *scred, 431 struct smb_vc *vcp, struct smb_share **sspp); 432 433/* 434 * VC level functions 435 */ 436int smb_vc_setup(struct smb_vcspec *vcspec, struct smb_cred *scred, 437 struct smb_vc *vcp, int is_ss); 438int smb_vc_create(struct smb_vcspec *vcspec, 439 struct smb_cred *scred, struct smb_vc **vcpp); 440int smb_vc_negotiate(struct smb_vc *vcp, struct smb_cred *scred); 441int smb_vc_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred); 442void smb_vc_hold(struct smb_vc *vcp); 443void smb_vc_rele(struct smb_vc *vcp); 444void smb_vc_kill(struct smb_vc *vcp); 445int smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *shspec, 446 struct smb_cred *scred, struct smb_share **sspp); 447const char *smb_vc_getpass(struct smb_vc *vcp); 448uint16_t smb_vc_nextmid(struct smb_vc *vcp); 449void *smb_vc_getipaddr(struct smb_vc *vcp, int *ipvers); 450 451/* 452 * share level functions 453 */ 454int smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec, 455 struct smb_cred *scred, struct smb_share **sspp); 456 457void smb_share_hold(struct smb_share *ssp); 458void smb_share_rele(struct smb_share *ssp); 459void smb_share_kill(struct smb_share *ssp); 460 461void smb_share_invalidate(struct smb_share *ssp); 462int smb_share_tcon(struct smb_share *ssp); 463int smb_share_valid(struct smb_share *ssp); 464const char *smb_share_getpass(struct smb_share *ssp); 465int smb_share_count(void); 466 467/* 468 * SMB protocol level functions 469 */ 470int smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred); 471int smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred); 472int smb_smb_ssnclose(struct smb_vc *vcp, struct smb_cred *scred); 473int smb_smb_treeconnect(struct smb_share *ssp, struct smb_cred *scred); 474int smb_smb_treedisconnect(struct smb_share *ssp, struct smb_cred *scred); 475int smb_smb_echo(struct smb_vc *vcp, struct smb_cred *scred, int timo); 476#ifdef APPLE 477int smb_smb_checkdir(struct smb_share *ssp, void *dnp, 478 char *name, int nmlen, struct smb_cred *scred); 479#endif 480int smb_rwuio(struct smb_share *ssp, uint16_t fid, uio_rw_t rw, 481 uio_t *uiop, struct smb_cred *scred, int timo); 482 483#endif /* _SMB_CONN_H */ 484