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 2009 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 #include <sys/dditypes.h>
     44 #include <sys/t_lock.h>
     45 #include <sys/queue.h> /* for SLIST below */
     46 #include <sys/uio.h>
     47 #include <netsmb/smb_dev.h>
     48 
     49 /*
     50  * Credentials of user/process for processing in the connection procedures
     51  */
     52 typedef struct smb_cred {
     53 	struct cred *scr_cred;
     54 } smb_cred_t;
     55 
     56 /*
     57  * Common object flags
     58  */
     59 #define	SMBO_GONE		0x1000000
     60 
     61 /*
     62  * Bits in vc_flags (a.k.a. vc_co.co_flags)
     63  * Many of these were duplicates of SMBVOPT_ flags
     64  * and we now keep those too instead of merging
     65  * them into vc_flags.
     66  */
     67 
     68 #define	SMBV_WIN95		0x0010	/* used to apply bugfixes for this OS */
     69 #define	SMBV_NT4		0x0020	/* used when NT4 issues invalid resp */
     70 #define	SMBV_UNICODE		0x0040	/* conn configured to use Unicode */
     71 
     72 /*
     73  * Note: the common "obj" level uses this GONE flag by
     74  * the name SMBO_GONE.  Keep this alias as a reminder.
     75  */
     76 #define	SMBV_GONE		SMBO_GONE
     77 
     78 /*
     79  * bits in smb_share ss_flags (a.k.a. ss_co.co_flags)
     80  */
     81 #define	SMBS_RECONNECTING	0x0002
     82 #define	SMBS_CONNECTED		0x0004
     83 #define	SMBS_TCON_WAIT		0x0008
     84 #define	SMBS_FST_FAT		0x0010	/* share FS Type is FAT */
     85 /*
     86  * Note: the common "obj" level uses this GONE flag by
     87  * the name SMBO_GONE.  Keep this alias as a reminder.
     88  */
     89 #define	SMBS_GONE		SMBO_GONE
     90 
     91 struct smb_rq;
     92 /* This declares struct smb_rqhead */
     93 TAILQ_HEAD(smb_rqhead, smb_rq);
     94 
     95 #define	SMB_NBTIMO	15
     96 #define	SMB_DEFRQTIMO	30	/* 30 for oplock revoke/writeback */
     97 #define	SMBWRTTIMO	60
     98 #define	SMBSSNSETUPTIMO	60
     99 #define	SMBNOREPLYWAIT (0)
    100 
    101 #define	SMB_DIALECT(vcp)	((vcp)->vc_sopt.sv_proto)
    102 
    103 /*
    104  * Connection object
    105  */
    106 
    107 #define	SMB_CO_LOCK(cp)		mutex_enter(&(cp)->co_lock)
    108 #define	SMB_CO_UNLOCK(cp)	mutex_exit(&(cp)->co_lock)
    109 
    110 /*
    111  * Common part of smb_vc, smb_share
    112  * Locking: co_lock protects most
    113  * fields in this struct, except
    114  * as noted below:
    115  */
    116 struct smb_connobj {
    117 	kmutex_t		co_lock;
    118 	int			co_level;	/* SMBL_ */
    119 	int			co_flags;
    120 	int			co_usecount;
    121 
    122 	/* Note: must lock co_parent before child. */
    123 	struct smb_connobj	*co_parent;
    124 
    125 	/* this.co_lock protects the co_children list */
    126 	SLIST_HEAD(, smb_connobj) co_children;
    127 
    128 	/*
    129 	 * Linkage in parent's list of children.
    130 	 * Must hold parent.co_lock to traverse.
    131 	 */
    132 	SLIST_ENTRY(smb_connobj) co_next;
    133 
    134 	/* These two are set only at creation. */
    135 	void (*co_gone)(struct smb_connobj *);
    136 	void (*co_free)(struct smb_connobj *);
    137 };
    138 typedef struct smb_connobj smb_connobj_t;
    139 
    140 /*
    141  * "Level" in the connection object hierarchy
    142  */
    143 #define	SMBL_SM		0
    144 #define	SMBL_VC		1
    145 #define	SMBL_SHARE	2
    146 
    147 /*
    148  * Virtual Circuit to a server (really connection + session).
    149  * Yes, calling this a "Virtual Circuit" is confusining,
    150  * because it has nothing to do with the SMB notion of a
    151  * "Virtual Circuit".
    152  */
    153 typedef struct smb_vc {
    154 	struct smb_connobj	vc_co;	/* keep first! See CPTOVC */
    155 	enum smbiod_state	vc_state;
    156 	kcondvar_t		vc_statechg;
    157 
    158 	zoneid_t		vc_zoneid;
    159 	uid_t			vc_owner;	/* Unix owner */
    160 	int			vc_genid;	/* "generation" ID */
    161 
    162 	int			vc_mackeylen;	/* length of MAC key */
    163 	uint8_t			*vc_mackey;	/* MAC key */
    164 
    165 	ksema_t			vc_sendlock;
    166 	struct smb_tran_desc	*vc_tdesc;	/* transport ops. vector */
    167 	void			*vc_tdata;	/* transport control block */
    168 
    169 	kcondvar_t		iod_idle; 	/* IOD thread idle CV */
    170 	krwlock_t		iod_rqlock;	/* iod_rqlist */
    171 	struct smb_rqhead	iod_rqlist;	/* list of outstanding reqs */
    172 	struct _kthread 	*iod_thr;	/* the IOD (reader) thread */
    173 	int			iod_flags;	/* see SMBIOD_* below */
    174 	int			iod_newrq;	/* send needed (iod_rqlock) */
    175 	int			iod_muxfull;	/* maxmux limit reached */
    176 
    177 	/* This is copied in/out when IOD enters/returns */
    178 	smbioc_ssn_work_t	vc_work;
    179 
    180 	/* session identity, etc. */
    181 	smbioc_ossn_t		vc_ssn;
    182 } smb_vc_t;
    183 
    184 #define	vc_lock		vc_co.co_lock
    185 #define	vc_flags	vc_co.co_flags
    186 
    187 /* defines for members in vc_ssn */
    188 #define	vc_owner	vc_ssn.ssn_owner
    189 #define	vc_srvname	vc_ssn.ssn_srvname
    190 #define	vc_srvaddr	vc_ssn.ssn_id.id_srvaddr
    191 #define	vc_domain	vc_ssn.ssn_id.id_domain
    192 #define	vc_username	vc_ssn.ssn_id.id_user
    193 #define	vc_vopt 	vc_ssn.ssn_vopt
    194 
    195 /* defines for members in vc_work */
    196 #define	vc_sopt		vc_work.wk_sopt
    197 #define	vc_maxmux	vc_work.wk_sopt.sv_maxmux
    198 #define	vc_tran_fd	vc_work.wk_iods.is_tran_fd
    199 #define	vc_hflags	vc_work.wk_iods.is_hflags
    200 #define	vc_hflags2	vc_work.wk_iods.is_hflags2
    201 #define	vc_smbuid	vc_work.wk_iods.is_smbuid
    202 #define	vc_next_mid	vc_work.wk_iods.is_next_mid
    203 #define	vc_txmax	vc_work.wk_iods.is_txmax
    204 #define	vc_rwmax	vc_work.wk_iods.is_rwmax
    205 #define	vc_rxmax	vc_work.wk_iods.is_rxmax
    206 #define	vc_wxmax	vc_work.wk_iods.is_wxmax
    207 #define	vc_ssn_key	vc_work.wk_iods.is_ssn_key
    208 #define	vc_next_seq	vc_work.wk_iods.is_next_seq
    209 #define	vc_u_mackey	vc_work.wk_iods.is_u_mackey
    210 #define	vc_u_maclen	vc_work.wk_iods.is_u_maclen
    211 
    212 #define	SMB_VC_LOCK(vcp)	mutex_enter(&(vcp)->vc_lock)
    213 #define	SMB_VC_UNLOCK(vcp)	mutex_exit(&(vcp)->vc_lock)
    214 
    215 #define	SMB_UNICODE_STRINGS(vcp)	((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE)
    216 
    217 /* Bits in iod_flags */
    218 #define	SMBIOD_RUNNING		0x0001
    219 #define	SMBIOD_SHUTDOWN		0x0002
    220 
    221 /*
    222  * smb_share structure describes connection to the given SMB share (tree).
    223  * Connection to share is always built on top of the VC.
    224  */
    225 
    226 typedef struct smb_share {
    227 	struct smb_connobj ss_co;	/* keep first! See CPTOSS */
    228 	kcondvar_t	ss_conn_done;	/* wait for reconnect */
    229 	int		ss_conn_waiters;
    230 	int		ss_vcgenid;	/* check VC generation ID */
    231 	uint16_t	ss_tid;		/* TID */
    232 	uint16_t	ss_options;	/* option support bits */
    233 	smbioc_oshare_t ss_ioc;
    234 } smb_share_t;
    235 
    236 #define	ss_lock		ss_co.co_lock
    237 #define	ss_flags	ss_co.co_flags
    238 
    239 #define	ss_name		ss_ioc.sh_name
    240 #define	ss_pwlen	ss_ioc.sh_pwlen
    241 #define	ss_pass		ss_ioc.sh_pass
    242 #define	ss_type_req	ss_ioc.sh_type_req
    243 #define	ss_type_ret	ss_ioc.sh_type_ret
    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 	int		sd_opened;	/* Opened or not */
    279 	int		sd_level;	/* Future use */
    280 	struct smb_vc	*sd_vc;		/* Reference to VC */
    281 	struct smb_share *sd_share;	/* Reference to share if any */
    282 	int		sd_vcgenid;	/* Generation of share or VC */
    283 	int		sd_poll;	/* Future use */
    284 	int		sd_seq;		/* Kind of minor number/instance no */
    285 	int		sd_flags;	/* State of connection */
    286 #define	NSMBFL_OPEN		0x0001
    287 #define	NSMBFL_IOD		0x0002
    288 	zoneid_t	zoneid;		/* Zone id */
    289 	dev_info_t	*smb_dip;	/* ptr to dev_info node */
    290 	void		*sd_devfs;	/* Dont know how to use this. but */
    291 	struct cred	*smb_cred;	/* per dev credentails. Future use */
    292 } smb_dev_t;
    293 
    294 extern const uint32_t nsmb_version;
    295 
    296 /*
    297  * smb_dev.c
    298  */
    299 int  smb_dev2share(int fd, struct smb_share **sspp);
    300 
    301 
    302 /*
    303  * smb_usr.c
    304  */
    305 int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags);
    306 int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags);
    307 
    308 int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
    309 int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
    310 int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr);
    311 
    312 int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *);
    313 int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd);
    314 
    315 int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *);
    316 int smb_usr_drop_tree(smb_dev_t *sdp, int cmd);
    317 
    318 int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
    319 int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags);
    320 
    321 
    322 /*
    323  * IOD functions
    324  */
    325 int  smb_iod_create(smb_vc_t *vcp);
    326 int  smb_iod_destroy(smb_vc_t *vcp);
    327 int  smb_iod_connect(smb_vc_t *vcp);
    328 void smb_iod_disconnect(smb_vc_t *vcp);
    329 int  smb_iod_addrq(struct smb_rq *rqp);
    330 int  smb_iod_multirq(struct smb_rq *rqp);
    331 int  smb_iod_waitrq(struct smb_rq *rqp);
    332 void smb_iod_removerq(struct smb_rq *rqp);
    333 void smb_iod_shutdown_share(smb_share_t *ssp);
    334 
    335 void smb_iod_sendall(smb_vc_t *);
    336 int smb_iod_recvall(smb_vc_t *);
    337 
    338 int smb_iod_vc_work(smb_vc_t *, cred_t *);
    339 int smb_iod_vc_idle(smb_vc_t *);
    340 int smb_iod_vc_rcfail(smb_vc_t *);
    341 int smb_iod_reconnect(smb_vc_t *);
    342 
    343 /*
    344  * Session level functions
    345  */
    346 int  smb_sm_init(void);
    347 int  smb_sm_idle(void);
    348 void smb_sm_done(void);
    349 
    350 /*
    351  * VC level functions
    352  */
    353 void smb_vc_hold(smb_vc_t *vcp);
    354 void smb_vc_rele(smb_vc_t *vcp);
    355 void smb_vc_kill(smb_vc_t *vcp);
    356 
    357 int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **);
    358 int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp);
    359 
    360 const char *smb_vc_getpass(smb_vc_t *vcp);
    361 uint16_t smb_vc_nextmid(smb_vc_t *vcp);
    362 void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers);
    363 
    364 typedef void (*walk_share_func_t)(smb_share_t *);
    365 void smb_vc_walkshares(struct smb_vc *,	walk_share_func_t);
    366 
    367 /*
    368  * share level functions
    369  */
    370 
    371 int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *,
    372 	smb_share_t **, smb_cred_t *);
    373 
    374 void smb_share_hold(smb_share_t *ssp);
    375 void smb_share_rele(smb_share_t *ssp);
    376 void smb_share_kill(smb_share_t *ssp);
    377 
    378 void smb_share_invalidate(smb_share_t *ssp);
    379 int  smb_share_tcon(smb_share_t *, smb_cred_t *);
    380 
    381 /*
    382  * SMB protocol level functions
    383  */
    384 int  smb_smb_echo(smb_vc_t *vcp, smb_cred_t *scred, int timo);
    385 int  smb_smb_treeconnect(smb_share_t *ssp, smb_cred_t *scred);
    386 int  smb_smb_treedisconnect(smb_share_t *ssp, smb_cred_t *scred);
    387 
    388 int smb_rwuio(smb_share_t *ssp, uint16_t fid, uio_rw_t rw,
    389 	uio_t *uiop, smb_cred_t *scred, int timo);
    390 
    391 #endif /* _SMB_CONN_H */
    392