14bff34e3Sthurlow /*
24bff34e3Sthurlow  * Copyright (c) 2000-2001 Boris Popov
34bff34e3Sthurlow  * All rights reserved.
44bff34e3Sthurlow  *
54bff34e3Sthurlow  * Redistribution and use in source and binary forms, with or without
64bff34e3Sthurlow  * modification, are permitted provided that the following conditions
74bff34e3Sthurlow  * are met:
84bff34e3Sthurlow  * 1. Redistributions of source code must retain the above copyright
94bff34e3Sthurlow  *    notice, this list of conditions and the following disclaimer.
104bff34e3Sthurlow  * 2. Redistributions in binary form must reproduce the above copyright
114bff34e3Sthurlow  *    notice, this list of conditions and the following disclaimer in the
124bff34e3Sthurlow  *    documentation and/or other materials provided with the distribution.
134bff34e3Sthurlow  * 3. All advertising materials mentioning features or use of this software
144bff34e3Sthurlow  *    must display the following acknowledgement:
154bff34e3Sthurlow  *    This product includes software developed by Boris Popov.
164bff34e3Sthurlow  * 4. Neither the name of the author nor the names of any co-contributors
174bff34e3Sthurlow  *    may be used to endorse or promote products derived from this software
184bff34e3Sthurlow  *    without specific prior written permission.
194bff34e3Sthurlow  *
204bff34e3Sthurlow  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
214bff34e3Sthurlow  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
224bff34e3Sthurlow  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
234bff34e3Sthurlow  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
244bff34e3Sthurlow  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
254bff34e3Sthurlow  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
264bff34e3Sthurlow  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
274bff34e3Sthurlow  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
284bff34e3Sthurlow  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
294bff34e3Sthurlow  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
304bff34e3Sthurlow  * SUCH DAMAGE.
314bff34e3Sthurlow  *
324bff34e3Sthurlow  * $Id: smb_conn.h,v 1.32.42.1 2005/05/27 02:35:29 lindak Exp $
334bff34e3Sthurlow  */
344bff34e3Sthurlow 
354bff34e3Sthurlow /*
36613a2f6bSGordon Ross  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
374bff34e3Sthurlow  * Use is subject to license terms.
38*40c0e231SGordon Ross  *
39*40c0e231SGordon Ross  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
404bff34e3Sthurlow  */
414bff34e3Sthurlow 
424bff34e3Sthurlow #ifndef _SMB_CONN_H
434bff34e3Sthurlow #define	_SMB_CONN_H
444bff34e3Sthurlow 
45613a2f6bSGordon Ross #include <sys/dditypes.h>
464bff34e3Sthurlow #include <sys/t_lock.h>
474bff34e3Sthurlow #include <sys/queue.h> /* for SLIST below */
484bff34e3Sthurlow #include <sys/uio.h>
494bff34e3Sthurlow #include <netsmb/smb_dev.h>
504bff34e3Sthurlow 
514bff34e3Sthurlow /*
524bff34e3Sthurlow  * Credentials of user/process for processing in the connection procedures
534bff34e3Sthurlow  */
544bff34e3Sthurlow typedef struct smb_cred {
55613a2f6bSGordon Ross 	struct cred *scr_cred;
564bff34e3Sthurlow } smb_cred_t;
574bff34e3Sthurlow 
584bff34e3Sthurlow /*
594bff34e3Sthurlow  * Common object flags
604bff34e3Sthurlow  */
614bff34e3Sthurlow #define	SMBO_GONE		0x1000000
624bff34e3Sthurlow 
634bff34e3Sthurlow /*
644bff34e3Sthurlow  * Bits in vc_flags (a.k.a. vc_co.co_flags)
65*40c0e231SGordon Ross  * Note: SMBO_GONE is also in vc_flags
664bff34e3Sthurlow  */
679c9af259SGordon Ross #define	SMBV_UNICODE		0x0040	/* conn configured to use Unicode */
68*40c0e231SGordon Ross #define	SMBV_EXT_SEC		0x0080	/* conn to use extended security */
69*40c0e231SGordon Ross #define	SMBV_WILL_SIGN		0x0100	/* negotiated signing */
704bff34e3Sthurlow 
714bff34e3Sthurlow /*
724bff34e3Sthurlow  * Note: the common "obj" level uses this GONE flag by
734bff34e3Sthurlow  * the name SMBO_GONE.  Keep this alias as a reminder.
744bff34e3Sthurlow  */
75613a2f6bSGordon Ross #define	SMBV_GONE		SMBO_GONE
764bff34e3Sthurlow 
774bff34e3Sthurlow /*
784bff34e3Sthurlow  * bits in smb_share ss_flags (a.k.a. ss_co.co_flags)
794bff34e3Sthurlow  */
804bff34e3Sthurlow #define	SMBS_RECONNECTING	0x0002
814bff34e3Sthurlow #define	SMBS_CONNECTED		0x0004
824bff34e3Sthurlow #define	SMBS_TCON_WAIT		0x0008
8302d09e03SGordon Ross #define	SMBS_FST_FAT		0x0010	/* share FS Type is FAT */
844bff34e3Sthurlow /*
854bff34e3Sthurlow  * Note: the common "obj" level uses this GONE flag by
864bff34e3Sthurlow  * the name SMBO_GONE.  Keep this alias as a reminder.
874bff34e3Sthurlow  */
88613a2f6bSGordon Ross #define	SMBS_GONE		SMBO_GONE
894bff34e3Sthurlow 
904bff34e3Sthurlow struct smb_rq;
914bff34e3Sthurlow /* This declares struct smb_rqhead */
924bff34e3Sthurlow TAILQ_HEAD(smb_rqhead, smb_rq);
934bff34e3Sthurlow 
944bff34e3Sthurlow #define	SMB_NBTIMO	15
954bff34e3Sthurlow #define	SMB_DEFRQTIMO	30	/* 30 for oplock revoke/writeback */
964bff34e3Sthurlow #define	SMBWRTTIMO	60
974bff34e3Sthurlow #define	SMBSSNSETUPTIMO	60
984bff34e3Sthurlow #define	SMBNOREPLYWAIT (0)
994bff34e3Sthurlow 
1004bff34e3Sthurlow #define	SMB_DIALECT(vcp)	((vcp)->vc_sopt.sv_proto)
1014bff34e3Sthurlow 
1024bff34e3Sthurlow /*
1034bff34e3Sthurlow  * Connection object
1044bff34e3Sthurlow  */
1054bff34e3Sthurlow 
1064bff34e3Sthurlow #define	SMB_CO_LOCK(cp)		mutex_enter(&(cp)->co_lock)
1074bff34e3Sthurlow #define	SMB_CO_UNLOCK(cp)	mutex_exit(&(cp)->co_lock)
1084bff34e3Sthurlow 
1094bff34e3Sthurlow /*
1104bff34e3Sthurlow  * Common part of smb_vc, smb_share
1114bff34e3Sthurlow  * Locking: co_lock protects most
1124bff34e3Sthurlow  * fields in this struct, except
1134bff34e3Sthurlow  * as noted below:
1144bff34e3Sthurlow  */
1154bff34e3Sthurlow struct smb_connobj {
1164bff34e3Sthurlow 	kmutex_t		co_lock;
1174bff34e3Sthurlow 	int			co_level;	/* SMBL_ */
1184bff34e3Sthurlow 	int			co_flags;
1194bff34e3Sthurlow 	int			co_usecount;
1204bff34e3Sthurlow 
1214bff34e3Sthurlow 	/* Note: must lock co_parent before child. */
1224bff34e3Sthurlow 	struct smb_connobj	*co_parent;
1234bff34e3Sthurlow 
1244bff34e3Sthurlow 	/* this.co_lock protects the co_children list */
1254bff34e3Sthurlow 	SLIST_HEAD(, smb_connobj) co_children;
1264bff34e3Sthurlow 
1274bff34e3Sthurlow 	/*
1284bff34e3Sthurlow 	 * Linkage in parent's list of children.
1294bff34e3Sthurlow 	 * Must hold parent.co_lock to traverse.
1304bff34e3Sthurlow 	 */
1314bff34e3Sthurlow 	SLIST_ENTRY(smb_connobj) co_next;
1324bff34e3Sthurlow 
1334bff34e3Sthurlow 	/* These two are set only at creation. */
1344bff34e3Sthurlow 	void (*co_gone)(struct smb_connobj *);
1354bff34e3Sthurlow 	void (*co_free)(struct smb_connobj *);
1364bff34e3Sthurlow };
1374bff34e3Sthurlow typedef struct smb_connobj smb_connobj_t;
1384bff34e3Sthurlow 
1394bff34e3Sthurlow /*
140613a2f6bSGordon Ross  * "Level" in the connection object hierarchy
1414bff34e3Sthurlow  */
142613a2f6bSGordon Ross #define	SMBL_SM		0
143613a2f6bSGordon Ross #define	SMBL_VC		1
144613a2f6bSGordon Ross #define	SMBL_SHARE	2
1454bff34e3Sthurlow 
146*40c0e231SGordon Ross /*
147*40c0e231SGordon Ross  * SMB1 Negotiated protocol parameters
148*40c0e231SGordon Ross  */
149*40c0e231SGordon Ross struct smb_sopt {
150*40c0e231SGordon Ross 	int16_t		sv_proto;	/* protocol dialect */
151*40c0e231SGordon Ross 	uchar_t		sv_sm;		/* security mode */
152*40c0e231SGordon Ross 	int16_t		sv_tz;		/* offset in min relative to UTC */
153*40c0e231SGordon Ross 	uint16_t	sv_maxmux;	/* max number of outstanding rq's */
154*40c0e231SGordon Ross 	uint16_t	sv_maxvcs;	/* max number of VCs */
155*40c0e231SGordon Ross 	uint16_t	sv_rawmode;
156*40c0e231SGordon Ross 	uint32_t	sv_maxtx;	/* maximum transmit buf size */
157*40c0e231SGordon Ross 	uint32_t	sv_maxraw;	/* maximum raw-buffer size */
158*40c0e231SGordon Ross 	uint32_t	sv_skey;	/* session key */
159*40c0e231SGordon Ross 	uint32_t	sv_caps;	/* capabilites SMB_CAP_ */
160*40c0e231SGordon Ross };
161*40c0e231SGordon Ross typedef struct smb_sopt smb_sopt_t;
162*40c0e231SGordon Ross 
163*40c0e231SGordon Ross /*
164*40c0e231SGordon Ross  * SMB1 I/O Deamon state
165*40c0e231SGordon Ross  */
166*40c0e231SGordon Ross struct smb_iods {
167*40c0e231SGordon Ross 	uint8_t		is_hflags;	/* SMB header flags */
168*40c0e231SGordon Ross 	uint16_t	is_hflags2;	/* SMB header flags2 */
169*40c0e231SGordon Ross 	uint16_t	is_smbuid;	/* SMB header UID */
170*40c0e231SGordon Ross 	uint16_t	is_next_mid;	/* SMB header MID */
171*40c0e231SGordon Ross 	uint32_t	is_txmax;	/* max tx/rx packet size */
172*40c0e231SGordon Ross 	uint32_t	is_rwmax;	/* max read/write data size */
173*40c0e231SGordon Ross 	uint32_t	is_rxmax;	/* max readx data size */
174*40c0e231SGordon Ross 	uint32_t	is_wxmax;	/* max writex data size */
175*40c0e231SGordon Ross 	/* Signing state */
176*40c0e231SGordon Ross 	uint32_t	is_next_seq;	/* my next sequence number */
177*40c0e231SGordon Ross 
178*40c0e231SGordon Ross };
179*40c0e231SGordon Ross typedef struct smb_iods smb_iods_t;
180*40c0e231SGordon Ross 
181613a2f6bSGordon Ross /*
182613a2f6bSGordon Ross  * Virtual Circuit to a server (really connection + session).
183613a2f6bSGordon Ross  * Yes, calling this a "Virtual Circuit" is confusining,
184613a2f6bSGordon Ross  * because it has nothing to do with the SMB notion of a
185613a2f6bSGordon Ross  * "Virtual Circuit".
186613a2f6bSGordon Ross  */
1874bff34e3Sthurlow typedef struct smb_vc {
188613a2f6bSGordon Ross 	struct smb_connobj	vc_co;	/* keep first! See CPTOVC */
189613a2f6bSGordon Ross 	enum smbiod_state	vc_state;
190613a2f6bSGordon Ross 	kcondvar_t		vc_statechg;
1914bff34e3Sthurlow 
192613a2f6bSGordon Ross 	zoneid_t		vc_zoneid;
193613a2f6bSGordon Ross 	uid_t			vc_owner;	/* Unix owner */
194613a2f6bSGordon Ross 	int			vc_genid;	/* "generation" ID */
195613a2f6bSGordon Ross 
196*40c0e231SGordon Ross 	int			vc_mackeylen;	/* MAC key length */
197*40c0e231SGordon Ross 	int			vc_ssnkeylen;	/* session key length */
198*40c0e231SGordon Ross 	uint8_t			*vc_mackey;	/* MAC key buffer */
199*40c0e231SGordon Ross 	uint8_t			*vc_ssnkey;	/* session key buffer */
200613a2f6bSGordon Ross 
201613a2f6bSGordon Ross 	ksema_t			vc_sendlock;
202613a2f6bSGordon Ross 	struct smb_tran_desc	*vc_tdesc;	/* transport ops. vector */
203613a2f6bSGordon Ross 	void			*vc_tdata;	/* transport control block */
204613a2f6bSGordon Ross 
205*40c0e231SGordon Ross 	kcondvar_t		iod_idle;	/* IOD thread idle CV */
206613a2f6bSGordon Ross 	krwlock_t		iod_rqlock;	/* iod_rqlist */
2074bff34e3Sthurlow 	struct smb_rqhead	iod_rqlist;	/* list of outstanding reqs */
208*40c0e231SGordon Ross 	struct _kthread		*iod_thr;	/* the IOD (reader) thread */
2094bff34e3Sthurlow 	int			iod_flags;	/* see SMBIOD_* below */
2104bff34e3Sthurlow 	int			iod_newrq;	/* send needed (iod_rqlock) */
2114bff34e3Sthurlow 	int			iod_muxfull;	/* maxmux limit reached */
212613a2f6bSGordon Ross 
213*40c0e231SGordon Ross 	smb_iods_t		vc_iods;
214*40c0e231SGordon Ross 	smb_sopt_t		vc_sopt;
215*40c0e231SGordon Ross 
216613a2f6bSGordon Ross 	/* This is copied in/out when IOD enters/returns */
217613a2f6bSGordon Ross 	smbioc_ssn_work_t	vc_work;
218613a2f6bSGordon Ross 
219613a2f6bSGordon Ross 	/* session identity, etc. */
220613a2f6bSGordon Ross 	smbioc_ossn_t		vc_ssn;
2214bff34e3Sthurlow } smb_vc_t;
2224bff34e3Sthurlow 
2234bff34e3Sthurlow #define	vc_lock		vc_co.co_lock
2244bff34e3Sthurlow #define	vc_flags	vc_co.co_flags
225613a2f6bSGordon Ross 
226613a2f6bSGordon Ross /* defines for members in vc_ssn */
227613a2f6bSGordon Ross #define	vc_owner	vc_ssn.ssn_owner
228613a2f6bSGordon Ross #define	vc_srvname	vc_ssn.ssn_srvname
229613a2f6bSGordon Ross #define	vc_srvaddr	vc_ssn.ssn_id.id_srvaddr
230613a2f6bSGordon Ross #define	vc_domain	vc_ssn.ssn_id.id_domain
231613a2f6bSGordon Ross #define	vc_username	vc_ssn.ssn_id.id_user
232*40c0e231SGordon Ross #define	vc_vopt		vc_ssn.ssn_vopt
233613a2f6bSGordon Ross 
234613a2f6bSGordon Ross /* defines for members in vc_work */
235*40c0e231SGordon Ross 
236*40c0e231SGordon Ross /* defines for members in vc_sopt ? */
237*40c0e231SGordon Ross #define	vc_maxmux	vc_sopt.sv_maxmux
238*40c0e231SGordon Ross 
239*40c0e231SGordon Ross /* defines for members in vc_iods */
240*40c0e231SGordon Ross #define	vc_hflags	vc_iods.is_hflags
241*40c0e231SGordon Ross #define	vc_hflags2	vc_iods.is_hflags2
242*40c0e231SGordon Ross #define	vc_smbuid	vc_iods.is_smbuid
243*40c0e231SGordon Ross #define	vc_next_mid	vc_iods.is_next_mid
244*40c0e231SGordon Ross #define	vc_txmax	vc_iods.is_txmax
245*40c0e231SGordon Ross #define	vc_rwmax	vc_iods.is_rwmax
246*40c0e231SGordon Ross #define	vc_rxmax	vc_iods.is_rxmax
247*40c0e231SGordon Ross #define	vc_wxmax	vc_iods.is_wxmax
248*40c0e231SGordon Ross #define	vc_next_seq	vc_iods.is_next_seq
2494bff34e3Sthurlow 
2504bff34e3Sthurlow #define	SMB_VC_LOCK(vcp)	mutex_enter(&(vcp)->vc_lock)
2514bff34e3Sthurlow #define	SMB_VC_UNLOCK(vcp)	mutex_exit(&(vcp)->vc_lock)
2524bff34e3Sthurlow 
2534bff34e3Sthurlow #define	SMB_UNICODE_STRINGS(vcp)	((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE)
2544bff34e3Sthurlow 
2554bff34e3Sthurlow /* Bits in iod_flags */
2564bff34e3Sthurlow #define	SMBIOD_RUNNING		0x0001
2574bff34e3Sthurlow #define	SMBIOD_SHUTDOWN		0x0002
2584bff34e3Sthurlow 
2594bff34e3Sthurlow /*
2604bff34e3Sthurlow  * smb_share structure describes connection to the given SMB share (tree).
2614bff34e3Sthurlow  * Connection to share is always built on top of the VC.
2624bff34e3Sthurlow  */
2634bff34e3Sthurlow 
2644bff34e3Sthurlow typedef struct smb_share {
265613a2f6bSGordon Ross 	struct smb_connobj ss_co;	/* keep first! See CPTOSS */
2664bff34e3Sthurlow 	kcondvar_t	ss_conn_done;	/* wait for reconnect */
2674bff34e3Sthurlow 	int		ss_conn_waiters;
2684bff34e3Sthurlow 	int		ss_vcgenid;	/* check VC generation ID */
269613a2f6bSGordon Ross 	uint16_t	ss_tid;		/* TID */
270613a2f6bSGordon Ross 	uint16_t	ss_options;	/* option support bits */
271613a2f6bSGordon Ross 	smbioc_oshare_t ss_ioc;
2724bff34e3Sthurlow } smb_share_t;
2734bff34e3Sthurlow 
2744bff34e3Sthurlow #define	ss_lock		ss_co.co_lock
2754bff34e3Sthurlow #define	ss_flags	ss_co.co_flags
2764bff34e3Sthurlow 
277430b4c46SGordon Ross #define	ss_use		ss_ioc.sh_use
278430b4c46SGordon Ross #define	ss_type		ss_ioc.sh_type
279613a2f6bSGordon Ross #define	ss_name		ss_ioc.sh_name
280613a2f6bSGordon Ross #define	ss_pass		ss_ioc.sh_pass
281613a2f6bSGordon Ross 
2824bff34e3Sthurlow #define	SMB_SS_LOCK(ssp)	mutex_enter(&(ssp)->ss_lock)
2834bff34e3Sthurlow #define	SMB_SS_UNLOCK(ssp)	mutex_exit(&(ssp)->ss_lock)
2844bff34e3Sthurlow 
285613a2f6bSGordon Ross #define	CPTOVC(cp)	((struct smb_vc *)((void *)(cp)))
2864bff34e3Sthurlow #define	VCTOCP(vcp)	(&(vcp)->vc_co)
2874bff34e3Sthurlow 
288613a2f6bSGordon Ross #define	CPTOSS(cp)	((struct smb_share *)((void *)(cp)))
2894bff34e3Sthurlow #define	SSTOVC(ssp)	CPTOVC(((ssp)->ss_co.co_parent))
2904bff34e3Sthurlow #define	SSTOCP(ssp)	(&(ssp)->ss_co)
2914bff34e3Sthurlow 
2924bff34e3Sthurlow /*
2934bff34e3Sthurlow  * Call-back operations vector, so the netsmb module
2944bff34e3Sthurlow  * can notify smbfs about events affecting mounts.
2954bff34e3Sthurlow  * Installed in netsmb after smbfs loads.
2964bff34e3Sthurlow  */
2974bff34e3Sthurlow typedef struct smb_fscb {
298613a2f6bSGordon Ross 	/* Called when the VC has disconnected. */
299613a2f6bSGordon Ross 	void (*fscb_disconn)(smb_share_t *);
300613a2f6bSGordon Ross 	/* Called when the VC has reconnected. */
301613a2f6bSGordon Ross 	void (*fscb_connect)(smb_share_t *);
302613a2f6bSGordon Ross 	/* Called when the server becomes unresponsive. */
3034bff34e3Sthurlow 	void (*fscb_down)(smb_share_t *);
304613a2f6bSGordon Ross 	/* Called when the server is responding again. */
3054bff34e3Sthurlow 	void (*fscb_up)(smb_share_t *);
3064bff34e3Sthurlow } smb_fscb_t;
3074bff34e3Sthurlow /* Install the above vector, or pass NULL to clear it. */
30802d09e03SGordon Ross void smb_fscb_set(smb_fscb_t *);
309613a2f6bSGordon Ross 
310613a2f6bSGordon Ross /*
311613a2f6bSGordon Ross  * The driver per open instance object.
312613a2f6bSGordon Ross  * Mostly used in: smb_dev.c, smb_usr.c
313613a2f6bSGordon Ross  */
314613a2f6bSGordon Ross typedef struct smb_dev {
315216041c4SGordon Ross 	kmutex_t	sd_lock;
316613a2f6bSGordon Ross 	struct smb_vc	*sd_vc;		/* Reference to VC */
317613a2f6bSGordon Ross 	struct smb_share *sd_share;	/* Reference to share if any */
318430b4c46SGordon Ross 	int		sd_level;	/* SMBL_VC, ... */
319613a2f6bSGordon Ross 	int		sd_vcgenid;	/* Generation of share or VC */
320613a2f6bSGordon Ross 	int		sd_poll;	/* Future use */
321613a2f6bSGordon Ross 	int		sd_flags;	/* State of connection */
322613a2f6bSGordon Ross #define	NSMBFL_OPEN		0x0001
323613a2f6bSGordon Ross #define	NSMBFL_IOD		0x0002
324216041c4SGordon Ross #define	NSMBFL_IOCTL		0x0004
325430b4c46SGordon Ross 	int		sd_smbfid;	/* library read/write */
326613a2f6bSGordon Ross 	zoneid_t	zoneid;		/* Zone id */
327613a2f6bSGordon Ross } smb_dev_t;
328613a2f6bSGordon Ross 
329613a2f6bSGordon Ross extern const uint32_t nsmb_version;
330613a2f6bSGordon Ross 
331613a2f6bSGordon Ross /*
332613a2f6bSGordon Ross  * smb_dev.c
333613a2f6bSGordon Ross  */
334613a2f6bSGordon Ross int  smb_dev2share(int fd, struct smb_share **sspp);
335613a2f6bSGordon Ross 
336613a2f6bSGordon Ross 
337613a2f6bSGordon Ross /*
338613a2f6bSGordon Ross  * smb_usr.c
339613a2f6bSGordon Ross  */
340*40c0e231SGordon Ross int smb_usr_ioctl(smb_dev_t *, int, intptr_t, int, cred_t *);
341*40c0e231SGordon Ross 
342613a2f6bSGordon Ross int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags);
343613a2f6bSGordon Ross int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags);
344430b4c46SGordon Ross int smb_usr_dup_dev(smb_dev_t *sdp, intptr_t arg, int flags);
345613a2f6bSGordon Ross 
346613a2f6bSGordon Ross int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
347613a2f6bSGordon Ross int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
348430b4c46SGordon Ross 
349430b4c46SGordon Ross int smb_usr_closefh(smb_dev_t *, cred_t *);
350613a2f6bSGordon Ross int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr);
351430b4c46SGordon Ross int smb_usr_ntcreate(smb_dev_t *, intptr_t, int, cred_t *);
352430b4c46SGordon Ross int smb_usr_printjob(smb_dev_t *, intptr_t, int, cred_t *);
353613a2f6bSGordon Ross 
354613a2f6bSGordon Ross int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *);
355613a2f6bSGordon Ross int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd);
356613a2f6bSGordon Ross 
357613a2f6bSGordon Ross int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *);
358613a2f6bSGordon Ross int smb_usr_drop_tree(smb_dev_t *sdp, int cmd);
359613a2f6bSGordon Ross 
360613a2f6bSGordon Ross int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
361*40c0e231SGordon Ross int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags,
362*40c0e231SGordon Ross     cred_t *cr);
363*40c0e231SGordon Ross 
364*40c0e231SGordon Ross int smb_pkey_ioctl(int, intptr_t, int, cred_t *);
365613a2f6bSGordon Ross 
3664bff34e3Sthurlow 
3674bff34e3Sthurlow /*
3684bff34e3Sthurlow  * IOD functions
3694bff34e3Sthurlow  */
370613a2f6bSGordon Ross int  smb_iod_create(smb_vc_t *vcp);
371613a2f6bSGordon Ross int  smb_iod_destroy(smb_vc_t *vcp);
37202d09e03SGordon Ross void smb_iod_disconnect(smb_vc_t *vcp);
3734bff34e3Sthurlow int  smb_iod_addrq(struct smb_rq *rqp);
3744bff34e3Sthurlow int  smb_iod_multirq(struct smb_rq *rqp);
3754bff34e3Sthurlow int  smb_iod_waitrq(struct smb_rq *rqp);
37602d09e03SGordon Ross void smb_iod_removerq(struct smb_rq *rqp);
377*40c0e231SGordon Ross int  smb_iod_sendrecv(struct smb_rq *, int);
378613a2f6bSGordon Ross void smb_iod_shutdown_share(smb_share_t *ssp);
379613a2f6bSGordon Ross 
380613a2f6bSGordon Ross void smb_iod_sendall(smb_vc_t *);
381*40c0e231SGordon Ross int smb_iod_recvall(smb_vc_t *, boolean_t);
382613a2f6bSGordon Ross 
383*40c0e231SGordon Ross int nsmb_iod_connect(smb_vc_t *vcp);
384*40c0e231SGordon Ross int nsmb_iod_negotiate(smb_vc_t *vcp, cred_t *cr);
385*40c0e231SGordon Ross int nsmb_iod_ssnsetup(smb_vc_t *vcp, cred_t *cr);
386*40c0e231SGordon Ross int smb_iod_vc_work(smb_vc_t *, int, cred_t *);
387613a2f6bSGordon Ross int smb_iod_vc_idle(smb_vc_t *);
388613a2f6bSGordon Ross int smb_iod_vc_rcfail(smb_vc_t *);
389613a2f6bSGordon Ross int smb_iod_reconnect(smb_vc_t *);
3904bff34e3Sthurlow 
3914bff34e3Sthurlow /*
3924bff34e3Sthurlow  * Session level functions
3934bff34e3Sthurlow  */
3944bff34e3Sthurlow int  smb_sm_init(void);
3954bff34e3Sthurlow int  smb_sm_idle(void);
3964bff34e3Sthurlow void smb_sm_done(void);
3974bff34e3Sthurlow 
3984bff34e3Sthurlow /*
3994bff34e3Sthurlow  * VC level functions
4004bff34e3Sthurlow  */
401613a2f6bSGordon Ross void smb_vc_hold(smb_vc_t *vcp);
402613a2f6bSGordon Ross void smb_vc_rele(smb_vc_t *vcp);
403613a2f6bSGordon Ross void smb_vc_kill(smb_vc_t *vcp);
404613a2f6bSGordon Ross 
405613a2f6bSGordon Ross int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **);
406613a2f6bSGordon Ross int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp);
407613a2f6bSGordon Ross 
408613a2f6bSGordon Ross const char *smb_vc_getpass(smb_vc_t *vcp);
409613a2f6bSGordon Ross uint16_t smb_vc_nextmid(smb_vc_t *vcp);
410613a2f6bSGordon Ross void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers);
411613a2f6bSGordon Ross 
412613a2f6bSGordon Ross typedef void (*walk_share_func_t)(smb_share_t *);
413613a2f6bSGordon Ross void smb_vc_walkshares(struct smb_vc *,	walk_share_func_t);
4144bff34e3Sthurlow 
4154bff34e3Sthurlow /*
4164bff34e3Sthurlow  * share level functions
4174bff34e3Sthurlow  */
4184bff34e3Sthurlow 
419613a2f6bSGordon Ross int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *,
420613a2f6bSGordon Ross 	smb_share_t **, smb_cred_t *);
421613a2f6bSGordon Ross 
422613a2f6bSGordon Ross void smb_share_hold(smb_share_t *ssp);
423613a2f6bSGordon Ross void smb_share_rele(smb_share_t *ssp);
424613a2f6bSGordon Ross void smb_share_kill(smb_share_t *ssp);
4254bff34e3Sthurlow 
426613a2f6bSGordon Ross void smb_share_invalidate(smb_share_t *ssp);
427613a2f6bSGordon Ross int  smb_share_tcon(smb_share_t *, smb_cred_t *);
4284bff34e3Sthurlow 
4294bff34e3Sthurlow #endif /* _SMB_CONN_H */
430