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.
3840c0e231SGordon Ross  *
39*adee6784SGordon Ross  * Portions Copyright (C) 2001 - 2013 Apple Inc. All rights reserved.
4040c0e231SGordon Ross  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
414bff34e3Sthurlow  */
424bff34e3Sthurlow 
434bff34e3Sthurlow #ifndef _SMB_CONN_H
444bff34e3Sthurlow #define	_SMB_CONN_H
454bff34e3Sthurlow 
46613a2f6bSGordon Ross #include <sys/dditypes.h>
474bff34e3Sthurlow #include <sys/t_lock.h>
484bff34e3Sthurlow #include <sys/queue.h> /* for SLIST below */
494bff34e3Sthurlow #include <sys/uio.h>
504bff34e3Sthurlow #include <netsmb/smb_dev.h>
51*adee6784SGordon Ross #include "smb_signing.h"
524bff34e3Sthurlow 
534bff34e3Sthurlow /*
544bff34e3Sthurlow  * Credentials of user/process for processing in the connection procedures
554bff34e3Sthurlow  */
564bff34e3Sthurlow typedef struct smb_cred {
57613a2f6bSGordon Ross 	struct cred *scr_cred;
584bff34e3Sthurlow } smb_cred_t;
594bff34e3Sthurlow 
604bff34e3Sthurlow /*
614bff34e3Sthurlow  * Common object flags
624bff34e3Sthurlow  */
634bff34e3Sthurlow #define	SMBO_GONE		0x1000000
644bff34e3Sthurlow 
654bff34e3Sthurlow /*
664bff34e3Sthurlow  * Bits in vc_flags (a.k.a. vc_co.co_flags)
6740c0e231SGordon Ross  * Note: SMBO_GONE is also in vc_flags
684bff34e3Sthurlow  */
699c9af259SGordon Ross #define	SMBV_UNICODE		0x0040	/* conn configured to use Unicode */
7040c0e231SGordon Ross #define	SMBV_EXT_SEC		0x0080	/* conn to use extended security */
71*adee6784SGordon Ross #define	SMBV_SIGNING		0x0100	/* negotiated signing */
72*adee6784SGordon Ross #define	SMBV_SMB2		0x0200	/* VC using SMB 2 or 3 */
73*adee6784SGordon Ross #define	SMBV_HAS_FILEIDS	0x0400	/* Use File IDs for hash and inode numbers */
74*adee6784SGordon Ross #define	SMBV_NO_WRITE_THRU	0x0800	/* Can't use ... */
754bff34e3Sthurlow 
764bff34e3Sthurlow /*
774bff34e3Sthurlow  * Note: the common "obj" level uses this GONE flag by
784bff34e3Sthurlow  * the name SMBO_GONE.  Keep this alias as a reminder.
794bff34e3Sthurlow  */
80613a2f6bSGordon Ross #define	SMBV_GONE		SMBO_GONE
814bff34e3Sthurlow 
824bff34e3Sthurlow /*
834bff34e3Sthurlow  * bits in smb_share ss_flags (a.k.a. ss_co.co_flags)
844bff34e3Sthurlow  */
854bff34e3Sthurlow #define	SMBS_RECONNECTING	0x0002
864bff34e3Sthurlow #define	SMBS_CONNECTED		0x0004
874bff34e3Sthurlow #define	SMBS_TCON_WAIT		0x0008
8802d09e03SGordon Ross #define	SMBS_FST_FAT		0x0010	/* share FS Type is FAT */
894bff34e3Sthurlow /*
904bff34e3Sthurlow  * Note: the common "obj" level uses this GONE flag by
914bff34e3Sthurlow  * the name SMBO_GONE.  Keep this alias as a reminder.
924bff34e3Sthurlow  */
93613a2f6bSGordon Ross #define	SMBS_GONE		SMBO_GONE
944bff34e3Sthurlow 
95*adee6784SGordon Ross /*
96*adee6784SGordon Ross  * bits in smb_fh fh_flags (a.k.a. ss_co.co_flags)
97*adee6784SGordon Ross  */
98*adee6784SGordon Ross #define	SMBFH_VALID		0x0002	/* FID is valid */
99*adee6784SGordon Ross /*
100*adee6784SGordon Ross  * Note: the common "obj" level uses this GONE flag by
101*adee6784SGordon Ross  * the name SMBO_GONE.  Keep this alias as a reminder.
102*adee6784SGordon Ross  */
103*adee6784SGordon Ross #define	SMBFH_GONE		SMBO_GONE
104*adee6784SGordon Ross 
1054bff34e3Sthurlow struct smb_rq;
1064bff34e3Sthurlow /* This declares struct smb_rqhead */
1074bff34e3Sthurlow TAILQ_HEAD(smb_rqhead, smb_rq);
1084bff34e3Sthurlow 
1094bff34e3Sthurlow #define	SMB_NBTIMO	15
1104bff34e3Sthurlow #define	SMB_DEFRQTIMO	30	/* 30 for oplock revoke/writeback */
1114bff34e3Sthurlow #define	SMBWRTTIMO	60
1124bff34e3Sthurlow #define	SMBSSNSETUPTIMO	60
1134bff34e3Sthurlow #define	SMBNOREPLYWAIT (0)
1144bff34e3Sthurlow 
1154bff34e3Sthurlow #define	SMB_DIALECT(vcp)	((vcp)->vc_sopt.sv_proto)
1164bff34e3Sthurlow 
1174bff34e3Sthurlow /*
1184bff34e3Sthurlow  * Connection object
1194bff34e3Sthurlow  */
1204bff34e3Sthurlow 
1214bff34e3Sthurlow #define	SMB_CO_LOCK(cp)		mutex_enter(&(cp)->co_lock)
1224bff34e3Sthurlow #define	SMB_CO_UNLOCK(cp)	mutex_exit(&(cp)->co_lock)
1234bff34e3Sthurlow 
1244bff34e3Sthurlow /*
1254bff34e3Sthurlow  * Common part of smb_vc, smb_share
1264bff34e3Sthurlow  * Locking: co_lock protects most
1274bff34e3Sthurlow  * fields in this struct, except
1284bff34e3Sthurlow  * as noted below:
1294bff34e3Sthurlow  */
1304bff34e3Sthurlow struct smb_connobj {
1314bff34e3Sthurlow 	kmutex_t		co_lock;
1324bff34e3Sthurlow 	int			co_level;	/* SMBL_ */
1334bff34e3Sthurlow 	int			co_flags;
1344bff34e3Sthurlow 	int			co_usecount;
1354bff34e3Sthurlow 
1364bff34e3Sthurlow 	/* Note: must lock co_parent before child. */
1374bff34e3Sthurlow 	struct smb_connobj	*co_parent;
1384bff34e3Sthurlow 
1394bff34e3Sthurlow 	/* this.co_lock protects the co_children list */
1404bff34e3Sthurlow 	SLIST_HEAD(, smb_connobj) co_children;
1414bff34e3Sthurlow 
1424bff34e3Sthurlow 	/*
1434bff34e3Sthurlow 	 * Linkage in parent's list of children.
1444bff34e3Sthurlow 	 * Must hold parent.co_lock to traverse.
1454bff34e3Sthurlow 	 */
1464bff34e3Sthurlow 	SLIST_ENTRY(smb_connobj) co_next;
1474bff34e3Sthurlow 
1484bff34e3Sthurlow 	/* These two are set only at creation. */
1494bff34e3Sthurlow 	void (*co_gone)(struct smb_connobj *);
1504bff34e3Sthurlow 	void (*co_free)(struct smb_connobj *);
1514bff34e3Sthurlow };
1524bff34e3Sthurlow typedef struct smb_connobj smb_connobj_t;
1534bff34e3Sthurlow 
1544bff34e3Sthurlow /*
155613a2f6bSGordon Ross  * "Level" in the connection object hierarchy
1564bff34e3Sthurlow  */
157*adee6784SGordon Ross enum smbco_level {
158*adee6784SGordon Ross 	SMBL_SM = 0,
159*adee6784SGordon Ross 	SMBL_VC = 1,
160*adee6784SGordon Ross 	SMBL_SHARE = 2,
161*adee6784SGordon Ross 	SMBL_FH = 3
162*adee6784SGordon Ross };
1634bff34e3Sthurlow 
16440c0e231SGordon Ross /*
16540c0e231SGordon Ross  * SMB1 Negotiated protocol parameters
16640c0e231SGordon Ross  */
16740c0e231SGordon Ross struct smb_sopt {
16840c0e231SGordon Ross 	int16_t		sv_proto;	/* protocol dialect */
16940c0e231SGordon Ross 	uchar_t		sv_sm;		/* security mode */
17040c0e231SGordon Ross 	int16_t		sv_tz;		/* offset in min relative to UTC */
17140c0e231SGordon Ross 	uint16_t	sv_maxmux;	/* max number of outstanding rq's */
17240c0e231SGordon Ross 	uint16_t	sv_maxvcs;	/* max number of VCs */
17340c0e231SGordon Ross 	uint16_t	sv_rawmode;
17440c0e231SGordon Ross 	uint32_t	sv_maxtx;	/* maximum transmit buf size */
17540c0e231SGordon Ross 	uint32_t	sv_maxraw;	/* maximum raw-buffer size */
17640c0e231SGordon Ross 	uint32_t	sv_skey;	/* session key */
17740c0e231SGordon Ross 	uint32_t	sv_caps;	/* capabilites SMB_CAP_ */
178*adee6784SGordon Ross 
179*adee6784SGordon Ross 	/* SMB2+ fields */
180*adee6784SGordon Ross 	uint32_t	sv2_sessflags;	/* final session setup reply flags */
181*adee6784SGordon Ross 	uint16_t	sv2_dialect;	/* dialect (non zero for SMB 2/3 */
182*adee6784SGordon Ross 	uint32_t	sv2_capabilities;	/* capabilities */
183*adee6784SGordon Ross 	uint32_t	sv2_maxtransact;	/* max transact size */
184*adee6784SGordon Ross 	uint32_t	sv2_maxread;	/* max read size */
185*adee6784SGordon Ross 	uint32_t	sv2_maxwrite;	/* max write size */
186*adee6784SGordon Ross 	uint8_t		sv2_guid[16];	/* GUID */
187*adee6784SGordon Ross 	uint16_t	sv2_security_mode;	/* security mode */
18840c0e231SGordon Ross };
18940c0e231SGordon Ross typedef struct smb_sopt smb_sopt_t;
19040c0e231SGordon Ross 
19140c0e231SGordon Ross /*
19240c0e231SGordon Ross  * SMB1 I/O Deamon state
19340c0e231SGordon Ross  */
19440c0e231SGordon Ross struct smb_iods {
19540c0e231SGordon Ross 	uint8_t		is_hflags;	/* SMB header flags */
19640c0e231SGordon Ross 	uint16_t	is_hflags2;	/* SMB header flags2 */
19740c0e231SGordon Ross 	uint16_t	is_smbuid;	/* SMB header UID */
19840c0e231SGordon Ross 	uint16_t	is_next_mid;	/* SMB header MID */
19940c0e231SGordon Ross 	uint32_t	is_txmax;	/* max tx/rx packet size */
20040c0e231SGordon Ross 	uint32_t	is_rwmax;	/* max read/write data size */
20140c0e231SGordon Ross 	uint32_t	is_rxmax;	/* max readx data size */
20240c0e231SGordon Ross 	uint32_t	is_wxmax;	/* max writex data size */
20340c0e231SGordon Ross 	/* Signing state */
20440c0e231SGordon Ross 	uint32_t	is_next_seq;	/* my next sequence number */
20540c0e231SGordon Ross 
20640c0e231SGordon Ross };
20740c0e231SGordon Ross typedef struct smb_iods smb_iods_t;
20840c0e231SGordon Ross 
209613a2f6bSGordon Ross /*
210613a2f6bSGordon Ross  * Virtual Circuit to a server (really connection + session).
211613a2f6bSGordon Ross  * Yes, calling this a "Virtual Circuit" is confusining,
212613a2f6bSGordon Ross  * because it has nothing to do with the SMB notion of a
213613a2f6bSGordon Ross  * "Virtual Circuit".
214613a2f6bSGordon Ross  */
2154bff34e3Sthurlow typedef struct smb_vc {
216613a2f6bSGordon Ross 	struct smb_connobj	vc_co;	/* keep first! See CPTOVC */
217613a2f6bSGordon Ross 	enum smbiod_state	vc_state;
218613a2f6bSGordon Ross 	kcondvar_t		vc_statechg;
2194bff34e3Sthurlow 
220613a2f6bSGordon Ross 	zoneid_t		vc_zoneid;
221613a2f6bSGordon Ross 	uid_t			vc_owner;	/* Unix owner */
222613a2f6bSGordon Ross 	int			vc_genid;	/* "generation" ID */
223613a2f6bSGordon Ross 
22440c0e231SGordon Ross 	int			vc_mackeylen;	/* MAC key length */
22540c0e231SGordon Ross 	int			vc_ssnkeylen;	/* session key length */
22640c0e231SGordon Ross 	uint8_t			*vc_mackey;	/* MAC key buffer */
22740c0e231SGordon Ross 	uint8_t			*vc_ssnkey;	/* session key buffer */
228*adee6784SGordon Ross 	smb_sign_mech_t		vc_signmech;
229613a2f6bSGordon Ross 
230613a2f6bSGordon Ross 	struct smb_tran_desc	*vc_tdesc;	/* transport ops. vector */
231613a2f6bSGordon Ross 	void			*vc_tdata;	/* transport control block */
232613a2f6bSGordon Ross 
233*adee6784SGordon Ross 	/* SMB2+ fields */
234*adee6784SGordon Ross 	uint64_t	vc2_oldest_message_id;
235*adee6784SGordon Ross 	uint64_t	vc2_next_message_id;
236*adee6784SGordon Ross 	uint64_t	vc2_limit_message_id;
237*adee6784SGordon Ross 	uint64_t	vc2_session_id;		/* session id */
238*adee6784SGordon Ross 	uint64_t	vc2_prev_session_id;	/* for reconnect */
239*adee6784SGordon Ross 	uint32_t	vc2_lease_key;		/* lease key gen */
240*adee6784SGordon Ross 
24140c0e231SGordon Ross 	kcondvar_t		iod_idle;	/* IOD thread idle CV */
242613a2f6bSGordon Ross 	krwlock_t		iod_rqlock;	/* iod_rqlist */
243*adee6784SGordon Ross 	struct smb_rqhead	iod_rqlist;	/* list of active reqs */
24440c0e231SGordon Ross 	struct _kthread		*iod_thr;	/* the IOD (reader) thread */
2454bff34e3Sthurlow 	int			iod_flags;	/* see SMBIOD_* below */
246*adee6784SGordon Ross 	uint_t			iod_muxcnt;	/* num. active requests */
247*adee6784SGordon Ross 	uint_t			iod_muxwant;	/* waiting to be active */
248*adee6784SGordon Ross 	kcondvar_t		iod_muxwait;
249*adee6784SGordon Ross 	boolean_t		iod_noresp;	/* Logged "not responding" */
250613a2f6bSGordon Ross 
25140c0e231SGordon Ross 	smb_iods_t		vc_iods;
25240c0e231SGordon Ross 	smb_sopt_t		vc_sopt;
25340c0e231SGordon Ross 
254613a2f6bSGordon Ross 	/* This is copied in/out when IOD enters/returns */
255613a2f6bSGordon Ross 	smbioc_ssn_work_t	vc_work;
256613a2f6bSGordon Ross 
257613a2f6bSGordon Ross 	/* session identity, etc. */
258613a2f6bSGordon Ross 	smbioc_ossn_t		vc_ssn;
2594bff34e3Sthurlow } smb_vc_t;
2604bff34e3Sthurlow 
2614bff34e3Sthurlow #define	vc_lock		vc_co.co_lock
2624bff34e3Sthurlow #define	vc_flags	vc_co.co_flags
263613a2f6bSGordon Ross 
264613a2f6bSGordon Ross /* defines for members in vc_ssn */
265613a2f6bSGordon Ross #define	vc_owner	vc_ssn.ssn_owner
266*adee6784SGordon Ross #define	vc_vopt		vc_ssn.ssn_vopt
267*adee6784SGordon Ross #define	vc_minver	vc_ssn.ssn_minver
268*adee6784SGordon Ross #define	vc_maxver	vc_ssn.ssn_maxver
269613a2f6bSGordon Ross #define	vc_srvname	vc_ssn.ssn_srvname
270613a2f6bSGordon Ross #define	vc_srvaddr	vc_ssn.ssn_id.id_srvaddr
271613a2f6bSGordon Ross #define	vc_domain	vc_ssn.ssn_id.id_domain
272613a2f6bSGordon Ross #define	vc_username	vc_ssn.ssn_id.id_user
273613a2f6bSGordon Ross 
274613a2f6bSGordon Ross /* defines for members in vc_work */
275*adee6784SGordon Ross #define	vc_cl_guid	vc_work.wk_cl_guid
27640c0e231SGordon Ross 
27740c0e231SGordon Ross /* defines for members in vc_sopt ? */
27840c0e231SGordon Ross #define	vc_maxmux	vc_sopt.sv_maxmux
27940c0e231SGordon Ross 
28040c0e231SGordon Ross /* defines for members in vc_iods */
28140c0e231SGordon Ross #define	vc_hflags	vc_iods.is_hflags
28240c0e231SGordon Ross #define	vc_hflags2	vc_iods.is_hflags2
28340c0e231SGordon Ross #define	vc_smbuid	vc_iods.is_smbuid
28440c0e231SGordon Ross #define	vc_next_mid	vc_iods.is_next_mid
28540c0e231SGordon Ross #define	vc_txmax	vc_iods.is_txmax
28640c0e231SGordon Ross #define	vc_rwmax	vc_iods.is_rwmax
28740c0e231SGordon Ross #define	vc_rxmax	vc_iods.is_rxmax
28840c0e231SGordon Ross #define	vc_wxmax	vc_iods.is_wxmax
28940c0e231SGordon Ross #define	vc_next_seq	vc_iods.is_next_seq
2904bff34e3Sthurlow 
2914bff34e3Sthurlow #define	SMB_VC_LOCK(vcp)	mutex_enter(&(vcp)->vc_lock)
2924bff34e3Sthurlow #define	SMB_VC_UNLOCK(vcp)	mutex_exit(&(vcp)->vc_lock)
2934bff34e3Sthurlow 
294*adee6784SGordon Ross #define	CPTOVC(cp)	((struct smb_vc *)((void *)(cp)))
295*adee6784SGordon Ross #define	VCTOCP(vcp)	(&(vcp)->vc_co)
296*adee6784SGordon Ross 
297*adee6784SGordon Ross #define	SMB_UNICODE_STRINGS(vcp) \
298*adee6784SGordon Ross 	(((vcp)->vc_flags & SMBV_SMB2) != 0 ||	\
299*adee6784SGordon Ross 	((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE) != 0)
3004bff34e3Sthurlow 
3014bff34e3Sthurlow /* Bits in iod_flags */
3024bff34e3Sthurlow #define	SMBIOD_RUNNING		0x0001
3034bff34e3Sthurlow #define	SMBIOD_SHUTDOWN		0x0002
3044bff34e3Sthurlow 
3054bff34e3Sthurlow /*
3064bff34e3Sthurlow  * smb_share structure describes connection to the given SMB share (tree).
3074bff34e3Sthurlow  * Connection to share is always built on top of the VC.
3084bff34e3Sthurlow  */
3094bff34e3Sthurlow 
3104bff34e3Sthurlow typedef struct smb_share {
311613a2f6bSGordon Ross 	struct smb_connobj ss_co;	/* keep first! See CPTOSS */
3124bff34e3Sthurlow 	kcondvar_t	ss_conn_done;	/* wait for reconnect */
3134bff34e3Sthurlow 	int		ss_conn_waiters;
3144bff34e3Sthurlow 	int		ss_vcgenid;	/* check VC generation ID */
315613a2f6bSGordon Ross 	uint16_t	ss_tid;		/* TID */
316613a2f6bSGordon Ross 	uint16_t	ss_options;	/* option support bits */
317*adee6784SGordon Ross 	uint32_t	ss2_tree_id;
318*adee6784SGordon Ross 	uint32_t	ss2_share_flags;
319*adee6784SGordon Ross 	uint32_t	ss2_share_caps;
320613a2f6bSGordon Ross 	smbioc_oshare_t ss_ioc;
3214bff34e3Sthurlow } smb_share_t;
3224bff34e3Sthurlow 
3234bff34e3Sthurlow #define	ss_lock		ss_co.co_lock
3244bff34e3Sthurlow #define	ss_flags	ss_co.co_flags
3254bff34e3Sthurlow 
326430b4c46SGordon Ross #define	ss_use		ss_ioc.sh_use
327430b4c46SGordon Ross #define	ss_type		ss_ioc.sh_type
328613a2f6bSGordon Ross #define	ss_name		ss_ioc.sh_name
329613a2f6bSGordon Ross #define	ss_pass		ss_ioc.sh_pass
330613a2f6bSGordon Ross 
3314bff34e3Sthurlow #define	SMB_SS_LOCK(ssp)	mutex_enter(&(ssp)->ss_lock)
3324bff34e3Sthurlow #define	SMB_SS_UNLOCK(ssp)	mutex_exit(&(ssp)->ss_lock)
3334bff34e3Sthurlow 
334613a2f6bSGordon Ross #define	CPTOSS(cp)	((struct smb_share *)((void *)(cp)))
3354bff34e3Sthurlow #define	SSTOCP(ssp)	(&(ssp)->ss_co)
336*adee6784SGordon Ross #define	SSTOVC(ssp)	CPTOVC(((ssp)->ss_co.co_parent))
337*adee6784SGordon Ross 
338*adee6784SGordon Ross typedef struct smb2fid {
339*adee6784SGordon Ross 	uint64_t fid_persistent;
340*adee6784SGordon Ross 	uint64_t fid_volatile;
341*adee6784SGordon Ross } smb2fid_t;
342*adee6784SGordon Ross 
343*adee6784SGordon Ross /*
344*adee6784SGordon Ross  * smb_fh struct describes an open file handle under some share.
345*adee6784SGordon Ross  */
346*adee6784SGordon Ross typedef struct smb_fh {
347*adee6784SGordon Ross 	struct smb_connobj fh_co;	/* keep first! See CPTOSS */
348*adee6784SGordon Ross 	int	fh_vcgenid;		/* check VC generation ID */
349*adee6784SGordon Ross 	uint32_t fh_rights;		/* granted access */
350*adee6784SGordon Ross 	smb2fid_t fh_fid2;
351*adee6784SGordon Ross 	uint16_t fh_fid1;
352*adee6784SGordon Ross } smb_fh_t;
353*adee6784SGordon Ross 
354*adee6784SGordon Ross #define	fh_lock		fh_co.co_lock
355*adee6784SGordon Ross #define	fh_flags	fh_co.co_flags
356*adee6784SGordon Ross 
357*adee6784SGordon Ross #define	SMB_FH_LOCK(fhp)	mutex_enter(&(fhp)->fh_lock)
358*adee6784SGordon Ross #define	SMB_FH_UNLOCK(fhp)	mutex_exit(&(fhp)->fh_lock)
359*adee6784SGordon Ross 
360*adee6784SGordon Ross #define	CPTOFH(cp)	((struct smb_fh *)((void *)(cp)))
361*adee6784SGordon Ross #define	FHTOCP(fhp)	(&(fhp)->fh_co)
362*adee6784SGordon Ross #define	FHTOSS(fhp)	CPTOSS(((fhp)->fh_co.co_parent))
3634bff34e3Sthurlow 
3644bff34e3Sthurlow /*
3654bff34e3Sthurlow  * Call-back operations vector, so the netsmb module
3664bff34e3Sthurlow  * can notify smbfs about events affecting mounts.
3674bff34e3Sthurlow  * Installed in netsmb after smbfs loads.
368*adee6784SGordon Ross  * Note: smbfs only uses the fscb_discon hook.
3694bff34e3Sthurlow  */
3704bff34e3Sthurlow typedef struct smb_fscb {
371613a2f6bSGordon Ross 	/* Called when the VC has disconnected. */
372613a2f6bSGordon Ross 	void (*fscb_disconn)(smb_share_t *);
373613a2f6bSGordon Ross 	/* Called when the VC has reconnected. */
374613a2f6bSGordon Ross 	void (*fscb_connect)(smb_share_t *);
3754bff34e3Sthurlow } smb_fscb_t;
3764bff34e3Sthurlow /* Install the above vector, or pass NULL to clear it. */
37702d09e03SGordon Ross void smb_fscb_set(smb_fscb_t *);
378613a2f6bSGordon Ross 
379613a2f6bSGordon Ross /*
380613a2f6bSGordon Ross  * The driver per open instance object.
381613a2f6bSGordon Ross  * Mostly used in: smb_dev.c, smb_usr.c
382613a2f6bSGordon Ross  */
383613a2f6bSGordon Ross typedef struct smb_dev {
384216041c4SGordon Ross 	kmutex_t	sd_lock;
385613a2f6bSGordon Ross 	struct smb_vc	*sd_vc;		/* Reference to VC */
386613a2f6bSGordon Ross 	struct smb_share *sd_share;	/* Reference to share if any */
387*adee6784SGordon Ross 	struct smb_fh	*sd_fh;		/* Reference to FH, if any */
388430b4c46SGordon Ross 	int		sd_level;	/* SMBL_VC, ... */
389613a2f6bSGordon Ross 	int		sd_vcgenid;	/* Generation of share or VC */
390613a2f6bSGordon Ross 	int		sd_poll;	/* Future use */
391613a2f6bSGordon Ross 	int		sd_flags;	/* State of connection */
392*adee6784SGordon Ross #define	NSMBFL_OPEN		0x0001	/* Device minor is open */
393*adee6784SGordon Ross #define	NSMBFL_IOD		0x0004	/* Open by IOD */
394*adee6784SGordon Ross #define	NSMBFL_IOCTL		0x0010	/* Serialize ioctl calls */
395613a2f6bSGordon Ross 	zoneid_t	zoneid;		/* Zone id */
396613a2f6bSGordon Ross } smb_dev_t;
397613a2f6bSGordon Ross 
398613a2f6bSGordon Ross extern const uint32_t nsmb_version;
399613a2f6bSGordon Ross 
400613a2f6bSGordon Ross /*
401613a2f6bSGordon Ross  * smb_dev.c
402613a2f6bSGordon Ross  */
403613a2f6bSGordon Ross int  smb_dev2share(int fd, struct smb_share **sspp);
404613a2f6bSGordon Ross 
405613a2f6bSGordon Ross 
406613a2f6bSGordon Ross /*
407613a2f6bSGordon Ross  * smb_usr.c
408613a2f6bSGordon Ross  */
40940c0e231SGordon Ross int smb_usr_ioctl(smb_dev_t *, int, intptr_t, int, cred_t *);
41040c0e231SGordon Ross 
411613a2f6bSGordon Ross int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags);
412613a2f6bSGordon Ross int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags);
413430b4c46SGordon Ross int smb_usr_dup_dev(smb_dev_t *sdp, intptr_t arg, int flags);
414613a2f6bSGordon Ross 
415613a2f6bSGordon Ross int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
416613a2f6bSGordon Ross int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
417430b4c46SGordon Ross 
418430b4c46SGordon Ross int smb_usr_closefh(smb_dev_t *, cred_t *);
419613a2f6bSGordon Ross int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr);
420430b4c46SGordon Ross int smb_usr_ntcreate(smb_dev_t *, intptr_t, int, cred_t *);
421430b4c46SGordon Ross int smb_usr_printjob(smb_dev_t *, intptr_t, int, cred_t *);
422613a2f6bSGordon Ross 
423613a2f6bSGordon Ross int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *);
424613a2f6bSGordon Ross int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd);
425613a2f6bSGordon Ross 
426613a2f6bSGordon Ross int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *);
427613a2f6bSGordon Ross int smb_usr_drop_tree(smb_dev_t *sdp, int cmd);
428613a2f6bSGordon Ross 
429613a2f6bSGordon Ross int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
43040c0e231SGordon Ross int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags,
43140c0e231SGordon Ross     cred_t *cr);
43240c0e231SGordon Ross 
43340c0e231SGordon Ross int smb_pkey_ioctl(int, intptr_t, int, cred_t *);
434613a2f6bSGordon Ross 
4354bff34e3Sthurlow 
4364bff34e3Sthurlow /*
4374bff34e3Sthurlow  * IOD functions
4384bff34e3Sthurlow  */
439613a2f6bSGordon Ross int  smb_iod_create(smb_vc_t *vcp);
440613a2f6bSGordon Ross int  smb_iod_destroy(smb_vc_t *vcp);
44102d09e03SGordon Ross void smb_iod_disconnect(smb_vc_t *vcp);
442*adee6784SGordon Ross int  smb2_iod_addrq(struct smb_rq *rqp);
443*adee6784SGordon Ross int  smb1_iod_addrq(struct smb_rq *rqp);
444*adee6784SGordon Ross int  smb1_iod_multirq(struct smb_rq *rqp);
4454bff34e3Sthurlow int  smb_iod_waitrq(struct smb_rq *rqp);
446*adee6784SGordon Ross int  smb_iod_waitrq_int(struct smb_rq *rqp);
44702d09e03SGordon Ross void smb_iod_removerq(struct smb_rq *rqp);
44840c0e231SGordon Ross int  smb_iod_sendrecv(struct smb_rq *, int);
449613a2f6bSGordon Ross void smb_iod_shutdown_share(smb_share_t *ssp);
450613a2f6bSGordon Ross 
451613a2f6bSGordon Ross void smb_iod_sendall(smb_vc_t *);
45240c0e231SGordon Ross int smb_iod_recvall(smb_vc_t *, boolean_t);
453613a2f6bSGordon Ross 
454*adee6784SGordon Ross int nsmb_iod_connect(smb_vc_t *vcp, cred_t *cr);
45540c0e231SGordon Ross int nsmb_iod_negotiate(smb_vc_t *vcp, cred_t *cr);
45640c0e231SGordon Ross int nsmb_iod_ssnsetup(smb_vc_t *vcp, cred_t *cr);
45740c0e231SGordon Ross int smb_iod_vc_work(smb_vc_t *, int, cred_t *);
458613a2f6bSGordon Ross int smb_iod_vc_idle(smb_vc_t *);
459613a2f6bSGordon Ross int smb_iod_vc_rcfail(smb_vc_t *);
460613a2f6bSGordon Ross int smb_iod_reconnect(smb_vc_t *);
4614bff34e3Sthurlow 
4624bff34e3Sthurlow /*
4634bff34e3Sthurlow  * Session level functions
4644bff34e3Sthurlow  */
4654bff34e3Sthurlow int  smb_sm_init(void);
4664bff34e3Sthurlow int  smb_sm_idle(void);
4674bff34e3Sthurlow void smb_sm_done(void);
4684bff34e3Sthurlow 
4694bff34e3Sthurlow /*
4704bff34e3Sthurlow  * VC level functions
4714bff34e3Sthurlow  */
472613a2f6bSGordon Ross void smb_vc_hold(smb_vc_t *vcp);
473613a2f6bSGordon Ross void smb_vc_rele(smb_vc_t *vcp);
474613a2f6bSGordon Ross void smb_vc_kill(smb_vc_t *vcp);
475613a2f6bSGordon Ross 
476613a2f6bSGordon Ross int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **);
477613a2f6bSGordon Ross int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp);
478613a2f6bSGordon Ross 
479613a2f6bSGordon Ross const char *smb_vc_getpass(smb_vc_t *vcp);
480613a2f6bSGordon Ross uint16_t smb_vc_nextmid(smb_vc_t *vcp);
481613a2f6bSGordon Ross void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers);
482613a2f6bSGordon Ross 
483613a2f6bSGordon Ross typedef void (*walk_share_func_t)(smb_share_t *);
484613a2f6bSGordon Ross void smb_vc_walkshares(struct smb_vc *,	walk_share_func_t);
4854bff34e3Sthurlow 
4864bff34e3Sthurlow /*
4874bff34e3Sthurlow  * share level functions
4884bff34e3Sthurlow  */
4894bff34e3Sthurlow 
490613a2f6bSGordon Ross int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *,
491613a2f6bSGordon Ross 	smb_share_t **, smb_cred_t *);
492613a2f6bSGordon Ross 
493613a2f6bSGordon Ross void smb_share_hold(smb_share_t *ssp);
494613a2f6bSGordon Ross void smb_share_rele(smb_share_t *ssp);
495613a2f6bSGordon Ross void smb_share_kill(smb_share_t *ssp);
4964bff34e3Sthurlow 
497613a2f6bSGordon Ross void smb_share_invalidate(smb_share_t *ssp);
498613a2f6bSGordon Ross int  smb_share_tcon(smb_share_t *, smb_cred_t *);
4994bff34e3Sthurlow 
500*adee6784SGordon Ross /*
501*adee6784SGordon Ross  * File handle level functions
502*adee6784SGordon Ross  */
503*adee6784SGordon Ross int smb_fh_create(smb_share_t *ssp, struct smb_fh **fhpp);
504*adee6784SGordon Ross void smb_fh_opened(struct smb_fh *fhp);
505*adee6784SGordon Ross void smb_fh_close(struct smb_fh *fhp);
506*adee6784SGordon Ross void smb_fh_hold(struct smb_fh *fhp);
507*adee6784SGordon Ross void smb_fh_rele(struct smb_fh *fhp);
508*adee6784SGordon Ross 
5094bff34e3Sthurlow #endif /* _SMB_CONN_H */
510