smb_conn.h revision 10023:71bf38dba3d6
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 */
52typedef 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_1980		0x0010
85/*
86 * ^ This partition can't handle dates before 1980. It's probably a FAT
87 * partition but could be some other ancient FS type
88 */
89#define	SMBS_RESUMEKEYS		0x0020	/* must use resume keys */
90#define	SMBS_LONGNAMES		0x0040	/* share can use long names */
91/*
92 * Note: the common "obj" level uses this GONE flag by
93 * the name SMBO_GONE.  Keep this alias as a reminder.
94 */
95#define	SMBS_GONE		SMBO_GONE
96
97struct smb_rq;
98/* This declares struct smb_rqhead */
99TAILQ_HEAD(smb_rqhead, smb_rq);
100
101#define	SMB_NBTIMO	15
102#define	SMB_DEFRQTIMO	30	/* 30 for oplock revoke/writeback */
103#define	SMBWRTTIMO	60
104#define	SMBSSNSETUPTIMO	60
105#define	SMBNOREPLYWAIT (0)
106
107#define	SMB_DIALECT(vcp)	((vcp)->vc_sopt.sv_proto)
108
109/*
110 * Connection object
111 */
112
113#define	SMB_CO_LOCK(cp)		mutex_enter(&(cp)->co_lock)
114#define	SMB_CO_UNLOCK(cp)	mutex_exit(&(cp)->co_lock)
115
116/*
117 * Common part of smb_vc, smb_share
118 * Locking: co_lock protects most
119 * fields in this struct, except
120 * as noted below:
121 */
122struct smb_connobj {
123	kmutex_t		co_lock;
124	int			co_level;	/* SMBL_ */
125	int			co_flags;
126	int			co_usecount;
127
128	/* Note: must lock co_parent before child. */
129	struct smb_connobj	*co_parent;
130
131	/* this.co_lock protects the co_children list */
132	SLIST_HEAD(, smb_connobj) co_children;
133
134	/*
135	 * Linkage in parent's list of children.
136	 * Must hold parent.co_lock to traverse.
137	 */
138	SLIST_ENTRY(smb_connobj) co_next;
139
140	/* These two are set only at creation. */
141	void (*co_gone)(struct smb_connobj *);
142	void (*co_free)(struct smb_connobj *);
143};
144typedef struct smb_connobj smb_connobj_t;
145
146/*
147 * "Level" in the connection object hierarchy
148 */
149#define	SMBL_SM		0
150#define	SMBL_VC		1
151#define	SMBL_SHARE	2
152
153/*
154 * Virtual Circuit to a server (really connection + session).
155 * Yes, calling this a "Virtual Circuit" is confusining,
156 * because it has nothing to do with the SMB notion of a
157 * "Virtual Circuit".
158 */
159typedef struct smb_vc {
160	struct smb_connobj	vc_co;	/* keep first! See CPTOVC */
161	enum smbiod_state	vc_state;
162	kcondvar_t		vc_statechg;
163
164	zoneid_t		vc_zoneid;
165	uid_t			vc_owner;	/* Unix owner */
166	int			vc_genid;	/* "generation" ID */
167
168	int			vc_mackeylen;	/* length of MAC key */
169	uint8_t			*vc_mackey;	/* MAC key */
170
171	ksema_t			vc_sendlock;
172	struct smb_tran_desc	*vc_tdesc;	/* transport ops. vector */
173	void			*vc_tdata;	/* transport control block */
174
175	kcondvar_t		iod_idle; 	/* IOD thread idle CV */
176	krwlock_t		iod_rqlock;	/* iod_rqlist */
177	struct smb_rqhead	iod_rqlist;	/* list of outstanding reqs */
178	struct _kthread 	*iod_thr;	/* the IOD (reader) thread */
179	int			iod_flags;	/* see SMBIOD_* below */
180	int			iod_newrq;	/* send needed (iod_rqlock) */
181	int			iod_muxfull;	/* maxmux limit reached */
182
183	/* This is copied in/out when IOD enters/returns */
184	smbioc_ssn_work_t	vc_work;
185
186	/* session identity, etc. */
187	smbioc_ossn_t		vc_ssn;
188} smb_vc_t;
189
190#define	vc_lock		vc_co.co_lock
191#define	vc_flags	vc_co.co_flags
192
193/* defines for members in vc_ssn */
194#define	vc_owner	vc_ssn.ssn_owner
195#define	vc_srvname	vc_ssn.ssn_srvname
196#define	vc_srvaddr	vc_ssn.ssn_id.id_srvaddr
197#define	vc_domain	vc_ssn.ssn_id.id_domain
198#define	vc_username	vc_ssn.ssn_id.id_user
199#define	vc_vopt 	vc_ssn.ssn_vopt
200
201/* defines for members in vc_work */
202#define	vc_sopt		vc_work.wk_sopt
203#define	vc_maxmux	vc_work.wk_sopt.sv_maxmux
204#define	vc_tran_fd	vc_work.wk_iods.is_tran_fd
205#define	vc_hflags	vc_work.wk_iods.is_hflags
206#define	vc_hflags2	vc_work.wk_iods.is_hflags2
207#define	vc_smbuid	vc_work.wk_iods.is_smbuid
208#define	vc_next_mid	vc_work.wk_iods.is_next_mid
209#define	vc_txmax	vc_work.wk_iods.is_txmax
210#define	vc_rwmax	vc_work.wk_iods.is_rwmax
211#define	vc_rxmax	vc_work.wk_iods.is_rxmax
212#define	vc_wxmax	vc_work.wk_iods.is_wxmax
213#define	vc_ssn_key	vc_work.wk_iods.is_ssn_key
214#define	vc_next_seq	vc_work.wk_iods.is_next_seq
215#define	vc_u_mackey	vc_work.wk_iods.is_u_mackey
216#define	vc_u_maclen	vc_work.wk_iods.is_u_maclen
217
218#define	SMB_VC_LOCK(vcp)	mutex_enter(&(vcp)->vc_lock)
219#define	SMB_VC_UNLOCK(vcp)	mutex_exit(&(vcp)->vc_lock)
220
221#define	SMB_UNICODE_STRINGS(vcp)	((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE)
222
223/* Bits in iod_flags */
224#define	SMBIOD_RUNNING		0x0001
225#define	SMBIOD_SHUTDOWN		0x0002
226
227/*
228 * smb_share structure describes connection to the given SMB share (tree).
229 * Connection to share is always built on top of the VC.
230 */
231
232typedef struct smb_share {
233	struct smb_connobj ss_co;	/* keep first! See CPTOSS */
234	kcondvar_t	ss_conn_done;	/* wait for reconnect */
235	int		ss_conn_waiters;
236	int		ss_vcgenid;	/* check VC generation ID */
237	uint16_t	ss_tid;		/* TID */
238	uint16_t	ss_options;	/* option support bits */
239	smbioc_oshare_t ss_ioc;
240} smb_share_t;
241
242#define	ss_lock		ss_co.co_lock
243#define	ss_flags	ss_co.co_flags
244
245#define	ss_name		ss_ioc.sh_name
246#define	ss_pwlen	ss_ioc.sh_pwlen
247#define	ss_pass		ss_ioc.sh_pass
248#define	ss_type_req	ss_ioc.sh_type_req
249#define	ss_type_ret	ss_ioc.sh_type_ret
250
251#define	SMB_SS_LOCK(ssp)	mutex_enter(&(ssp)->ss_lock)
252#define	SMB_SS_UNLOCK(ssp)	mutex_exit(&(ssp)->ss_lock)
253
254#define	CPTOVC(cp)	((struct smb_vc *)((void *)(cp)))
255#define	VCTOCP(vcp)	(&(vcp)->vc_co)
256
257#define	CPTOSS(cp)	((struct smb_share *)((void *)(cp)))
258#define	SSTOVC(ssp)	CPTOVC(((ssp)->ss_co.co_parent))
259#define	SSTOCP(ssp)	(&(ssp)->ss_co)
260
261/*
262 * Call-back operations vector, so the netsmb module
263 * can notify smbfs about events affecting mounts.
264 * Installed in netsmb after smbfs loads.
265 */
266typedef struct smb_fscb {
267	/* Called when the VC has disconnected. */
268	void (*fscb_disconn)(smb_share_t *);
269	/* Called when the VC has reconnected. */
270	void (*fscb_connect)(smb_share_t *);
271	/* Called when the server becomes unresponsive. */
272	void (*fscb_down)(smb_share_t *);
273	/* Called when the server is responding again. */
274	void (*fscb_up)(smb_share_t *);
275} smb_fscb_t;
276/* Install the above vector, or pass NULL to clear it. */
277int smb_fscb_set(smb_fscb_t *);
278
279/*
280 * The driver per open instance object.
281 * Mostly used in: smb_dev.c, smb_usr.c
282 */
283typedef struct smb_dev {
284	int		sd_opened;	/* Opened or not */
285	int		sd_level;	/* Future use */
286	struct smb_vc	*sd_vc;		/* Reference to VC */
287	struct smb_share *sd_share;	/* Reference to share if any */
288	int		sd_vcgenid;	/* Generation of share or VC */
289	int		sd_poll;	/* Future use */
290	int		sd_seq;		/* Kind of minor number/instance no */
291	int		sd_flags;	/* State of connection */
292#define	NSMBFL_OPEN		0x0001
293#define	NSMBFL_IOD		0x0002
294	zoneid_t	zoneid;		/* Zone id */
295	dev_info_t	*smb_dip;	/* ptr to dev_info node */
296	void		*sd_devfs;	/* Dont know how to use this. but */
297	struct cred	*smb_cred;	/* per dev credentails. Future use */
298} smb_dev_t;
299
300extern const uint32_t nsmb_version;
301
302/*
303 * smb_dev.c
304 */
305int  smb_dev2share(int fd, struct smb_share **sspp);
306
307
308/*
309 * smb_usr.c
310 */
311int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags);
312int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags);
313
314int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
315int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
316int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr);
317
318int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *);
319int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd);
320
321int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *);
322int smb_usr_drop_tree(smb_dev_t *sdp, int cmd);
323
324int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
325int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags);
326
327
328/*
329 * IOD functions
330 */
331int  smb_iod_create(smb_vc_t *vcp);
332int  smb_iod_destroy(smb_vc_t *vcp);
333int  smb_iod_connect(smb_vc_t *vcp);
334int  smb_iod_disconnect(smb_vc_t *vcp);
335int  smb_iod_addrq(struct smb_rq *rqp);
336int  smb_iod_multirq(struct smb_rq *rqp);
337int  smb_iod_waitrq(struct smb_rq *rqp);
338int  smb_iod_removerq(struct smb_rq *rqp);
339void smb_iod_shutdown_share(smb_share_t *ssp);
340
341void smb_iod_sendall(smb_vc_t *);
342int smb_iod_recvall(smb_vc_t *);
343
344int smb_iod_vc_work(smb_vc_t *, cred_t *);
345int smb_iod_vc_idle(smb_vc_t *);
346int smb_iod_vc_rcfail(smb_vc_t *);
347int smb_iod_reconnect(smb_vc_t *);
348
349/*
350 * Session level functions
351 */
352int  smb_sm_init(void);
353int  smb_sm_idle(void);
354void smb_sm_done(void);
355
356/*
357 * VC level functions
358 */
359void smb_vc_hold(smb_vc_t *vcp);
360void smb_vc_rele(smb_vc_t *vcp);
361void smb_vc_kill(smb_vc_t *vcp);
362
363int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **);
364int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp);
365
366const char *smb_vc_getpass(smb_vc_t *vcp);
367uint16_t smb_vc_nextmid(smb_vc_t *vcp);
368void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers);
369
370typedef void (*walk_share_func_t)(smb_share_t *);
371void smb_vc_walkshares(struct smb_vc *,	walk_share_func_t);
372
373/*
374 * share level functions
375 */
376
377int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *,
378	smb_share_t **, smb_cred_t *);
379
380void smb_share_hold(smb_share_t *ssp);
381void smb_share_rele(smb_share_t *ssp);
382void smb_share_kill(smb_share_t *ssp);
383
384void smb_share_invalidate(smb_share_t *ssp);
385int  smb_share_tcon(smb_share_t *, smb_cred_t *);
386
387/*
388 * SMB protocol level functions
389 */
390int  smb_smb_echo(smb_vc_t *vcp, smb_cred_t *scred, int timo);
391int  smb_smb_treeconnect(smb_share_t *ssp, smb_cred_t *scred);
392int  smb_smb_treedisconnect(smb_share_t *ssp, smb_cred_t *scred);
393
394int smb_rwuio(smb_share_t *ssp, uint16_t fid, uio_rw_t rw,
395	uio_t *uiop, smb_cred_t *scred, int timo);
396
397#endif /* _SMB_CONN_H */
398