Home | History | Annotate | Download | only in netsmb
      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  */
     57 typedef 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  */
    110 struct 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 };
    122 typedef struct smb_sopt smb_sopt_t;
    123 
    124 /*
    125  * network IO daemon states
    126  * really connection states.
    127  */
    128 enum 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 
    146 struct 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 };
    158 typedef struct smb_vc_info smb_vc_info_t;
    159 
    160 struct 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 };
    171 typedef struct smb_share_info smb_share_info_t;
    172 
    173 struct smb_rq;
    174 /* This declares struct smb_rqhead */
    175 TAILQ_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  */
    198 struct 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 };
    220 typedef 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 
    233 typedef 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 
    317 typedef 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  */
    350 struct 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 };
    367 typedef 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  */
    373 struct 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 };
    383 typedef 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
    393 typedef 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. */
    399 int smb_fscb_set(smb_fscb_t *);
    400 #endif /* NEED_SMBFS_CALLBACKS */
    401 
    402 /*
    403  * IOD functions
    404  */
    405 int  smb_iod_create(struct smb_vc *vcp);
    406 int  smb_iod_destroy(struct smb_vc *vcp);
    407 int  smb_iod_connect(struct smb_vc *vcp);
    408 int  smb_iod_disconnect(struct smb_vc *vcp);
    409 int  smb_iod_addrq(struct smb_rq *rqp);
    410 int  smb_iod_multirq(struct smb_rq *rqp);
    411 int  smb_iod_waitrq(struct smb_rq *rqp);
    412 int  smb_iod_removerq(struct smb_rq *rqp);
    413 void smb_iod_shutdown_share(struct smb_share *ssp);
    414 void smb_iod_notify_down(struct smb_vc *vcp);
    415 void smb_iod_notify_up(struct smb_vc *vcp);
    416 
    417 /*
    418  * Session level functions
    419  */
    420 int  smb_sm_init(void);
    421 int  smb_sm_idle(void);
    422 void smb_sm_done(void);
    423 
    424 int  smb_sm_findvc(struct smb_vcspec *vcspec,
    425 	struct smb_cred *scred,	struct smb_vc **vcpp);
    426 int  smb_sm_negotiate(struct smb_vcspec *vcspec,
    427 	struct smb_cred *scred,	struct smb_vc **vcpp);
    428 int  smb_sm_ssnsetup(struct smb_vcspec *vcspec,
    429 	struct smb_cred *scred,	struct smb_vc *vcp);
    430 int  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  */
    436 int smb_vc_setup(struct smb_vcspec *vcspec, struct smb_cred *scred,
    437 	struct smb_vc *vcp, int is_ss);
    438 int  smb_vc_create(struct smb_vcspec *vcspec,
    439 	struct smb_cred *scred, struct smb_vc **vcpp);
    440 int  smb_vc_negotiate(struct smb_vc *vcp, struct smb_cred *scred);
    441 int  smb_vc_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred);
    442 void smb_vc_hold(struct smb_vc *vcp);
    443 void smb_vc_rele(struct smb_vc *vcp);
    444 void smb_vc_kill(struct smb_vc *vcp);
    445 int  smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *shspec,
    446 	struct smb_cred *scred, struct smb_share **sspp);
    447 const char *smb_vc_getpass(struct smb_vc *vcp);
    448 uint16_t smb_vc_nextmid(struct smb_vc *vcp);
    449 void *smb_vc_getipaddr(struct smb_vc *vcp, int *ipvers);
    450 
    451 /*
    452  * share level functions
    453  */
    454 int  smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec,
    455 	struct smb_cred *scred, struct smb_share **sspp);
    456 
    457 void smb_share_hold(struct smb_share *ssp);
    458 void smb_share_rele(struct smb_share *ssp);
    459 void smb_share_kill(struct smb_share *ssp);
    460 
    461 void smb_share_invalidate(struct smb_share *ssp);
    462 int  smb_share_tcon(struct smb_share *ssp);
    463 int  smb_share_valid(struct smb_share *ssp);
    464 const char *smb_share_getpass(struct smb_share *ssp);
    465 int  smb_share_count(void);
    466 
    467 /*
    468  * SMB protocol level functions
    469  */
    470 int  smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred);
    471 int  smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred);
    472 int  smb_smb_ssnclose(struct smb_vc *vcp, struct smb_cred *scred);
    473 int  smb_smb_treeconnect(struct smb_share *ssp, struct smb_cred *scred);
    474 int  smb_smb_treedisconnect(struct smb_share *ssp, struct smb_cred *scred);
    475 int  smb_smb_echo(struct smb_vc *vcp, struct smb_cred *scred, int timo);
    476 #ifdef APPLE
    477 int  smb_smb_checkdir(struct smb_share *ssp, void *dnp,
    478 	char *name, int nmlen, struct smb_cred *scred);
    479 #endif
    480 int 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