xref: /illumos-gate/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_ktypes.h (revision 7f6a299e282ed51917878b84744774a6634e5dc6)
194047d49SGordon Ross /*
294047d49SGordon Ross  * CDDL HEADER START
394047d49SGordon Ross  *
494047d49SGordon Ross  * The contents of this file are subject to the terms of the
594047d49SGordon Ross  * Common Development and Distribution License (the "License").
694047d49SGordon Ross  * You may not use this file except in compliance with the License.
794047d49SGordon Ross  *
894047d49SGordon Ross  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
994047d49SGordon Ross  * or http://www.opensolaris.org/os/licensing.
1094047d49SGordon Ross  * See the License for the specific language governing permissions
1194047d49SGordon Ross  * and limitations under the License.
1294047d49SGordon Ross  *
1394047d49SGordon Ross  * When distributing Covered Code, include this CDDL HEADER in each
1494047d49SGordon Ross  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1594047d49SGordon Ross  * If applicable, add the following below this CDDL HEADER, with the
1694047d49SGordon Ross  * fields enclosed by brackets "[]" replaced with your own identifying
1794047d49SGordon Ross  * information: Portions Copyright [yyyy] [name of copyright owner]
1894047d49SGordon Ross  *
1994047d49SGordon Ross  * CDDL HEADER END
2094047d49SGordon Ross  */
2194047d49SGordon Ross /*
2294047d49SGordon Ross  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
231f0845f1SGordon Ross  * Copyright 2020 Nexenta by DDN, Inc.  All rights reserved.
24*7f6a299eSGordon Ross  * Copyright 2022 RackTop Systems, Inc.
2594047d49SGordon Ross  */
2694047d49SGordon Ross 
2794047d49SGordon Ross /*
2894047d49SGordon Ross  * Structures and type definitions needed by the "testoplock" program
2994047d49SGordon Ross  * (a small subset of what the SMB server uses)
3094047d49SGordon Ross  */
3194047d49SGordon Ross 
3294047d49SGordon Ross #ifndef _SMB_KTYPES_H
3394047d49SGordon Ross #define	_SMB_KTYPES_H
3494047d49SGordon Ross 
3594047d49SGordon Ross #ifdef	__cplusplus
3694047d49SGordon Ross extern "C" {
3794047d49SGordon Ross #endif
3894047d49SGordon Ross 
3994047d49SGordon Ross #include <sys/types.h>
4094047d49SGordon Ross #include <sys/debug.h>
4194047d49SGordon Ross #include <sys/systm.h>
4294047d49SGordon Ross #include <sys/cred.h>
4394047d49SGordon Ross #include <sys/list.h>
4494047d49SGordon Ross #include <sys/sdt.h>
4594047d49SGordon Ross 
4694047d49SGordon Ross typedef struct smb_session smb_session_t;
4794047d49SGordon Ross typedef struct smb_user smb_user_t;
4894047d49SGordon Ross typedef struct smb_tree smb_tree_t;
4994047d49SGordon Ross 
5094047d49SGordon Ross 
5194047d49SGordon Ross /*
5294047d49SGordon Ross  * Destructor object used in the locked-list delete queue.
5394047d49SGordon Ross  */
5494047d49SGordon Ross #define	SMB_DTOR_MAGIC		0x44544F52	/* DTOR */
5594047d49SGordon Ross #define	SMB_DTOR_VALID(d)	\
5694047d49SGordon Ross     ASSERT(((d) != NULL) && ((d)->dt_magic == SMB_DTOR_MAGIC))
5794047d49SGordon Ross 
5894047d49SGordon Ross typedef void (*smb_dtorproc_t)(void *);
5994047d49SGordon Ross 
6094047d49SGordon Ross typedef struct smb_dtor {
6194047d49SGordon Ross 	list_node_t	dt_lnd;
6294047d49SGordon Ross 	uint32_t	dt_magic;
6394047d49SGordon Ross 	void		*dt_object;
6494047d49SGordon Ross 	smb_dtorproc_t	dt_proc;
6594047d49SGordon Ross } smb_dtor_t;
6694047d49SGordon Ross 
6794047d49SGordon Ross typedef struct smb_llist {
6894047d49SGordon Ross 	krwlock_t	ll_lock;
6994047d49SGordon Ross 	list_t		ll_list;
7094047d49SGordon Ross 	uint32_t	ll_count;
7194047d49SGordon Ross 	uint64_t	ll_wrop;
7294047d49SGordon Ross 	kmutex_t	ll_mutex;
7394047d49SGordon Ross 	list_t		ll_deleteq;
7494047d49SGordon Ross 	uint32_t	ll_deleteq_count;
7594047d49SGordon Ross 	boolean_t	ll_flushing;
7694047d49SGordon Ross } smb_llist_t;
7794047d49SGordon Ross 
7894047d49SGordon Ross /*
7994047d49SGordon Ross  * Per smb_node oplock state
8094047d49SGordon Ross  */
8194047d49SGordon Ross typedef struct smb_oplock {
8294047d49SGordon Ross 	kmutex_t		ol_mutex;
8394047d49SGordon Ross 	boolean_t		ol_fem;		/* fem monitor installed? */
8494047d49SGordon Ross 	struct smb_ofile	*excl_open;
8594047d49SGordon Ross 	uint32_t		ol_state;
8694047d49SGordon Ross 	int32_t			cnt_II;
8794047d49SGordon Ross 	int32_t			cnt_R;
8894047d49SGordon Ross 	int32_t			cnt_RH;
8994047d49SGordon Ross 	int32_t			cnt_RHBQ;
9094047d49SGordon Ross 	int32_t			waiters;
9194047d49SGordon Ross 	kcondvar_t		WaitingOpenCV;
9294047d49SGordon Ross } smb_oplock_t;
9394047d49SGordon Ross 
9494047d49SGordon Ross /*
9594047d49SGordon Ross  * Per smb_ofile oplock state
9694047d49SGordon Ross  */
9794047d49SGordon Ross typedef struct smb_oplock_grant {
9894047d49SGordon Ross 	/* smb protocol-level state */
99*7f6a299eSGordon Ross 	uint32_t		og_state;	/* what client has now */
100*7f6a299eSGordon Ross 	uint32_t		og_breakto;	/* level breaking to */
101*7f6a299eSGordon Ross 	boolean_t		og_breaking;
10294047d49SGordon Ross 	uint16_t		og_dialect;	/* how to send breaks */
103*7f6a299eSGordon Ross 	kcondvar_t		og_ack_cv;	/* Wait for ACK */
10494047d49SGordon Ross 	/* File-system level state */
10594047d49SGordon Ross 	uint8_t			onlist_II;
10694047d49SGordon Ross 	uint8_t			onlist_R;
10794047d49SGordon Ross 	uint8_t			onlist_RH;
10894047d49SGordon Ross 	uint8_t			onlist_RHBQ;
10994047d49SGordon Ross 	uint8_t			BreakingToRead;
11094047d49SGordon Ross } smb_oplock_grant_t;
11194047d49SGordon Ross 
11294047d49SGordon Ross #define	SMB_LEASE_KEY_SZ	16
11394047d49SGordon Ross 
114*7f6a299eSGordon Ross struct smb_lease;
115*7f6a299eSGordon Ross 
11694047d49SGordon Ross #define	SMB_NODE_MAGIC		0x4E4F4445	/* 'NODE' */
11794047d49SGordon Ross #define	SMB_NODE_VALID(p)	ASSERT((p)->n_magic == SMB_NODE_MAGIC)
11894047d49SGordon Ross 
11994047d49SGordon Ross typedef enum {
12094047d49SGordon Ross 	SMB_NODE_STATE_AVAILABLE = 0,
12194047d49SGordon Ross 	SMB_NODE_STATE_DESTROYING
12294047d49SGordon Ross } smb_node_state_t;
12394047d49SGordon Ross 
12494047d49SGordon Ross /*
12594047d49SGordon Ross  * waiting_event        # of clients requesting FCN
12694047d49SGordon Ross  * n_timestamps         cached timestamps
12794047d49SGordon Ross  * n_allocsz            cached file allocation size
12894047d49SGordon Ross  * n_dnode              directory node
12994047d49SGordon Ross  * n_unode              unnamed stream node
13094047d49SGordon Ross  * delete_on_close_cred credentials for delayed delete
13194047d49SGordon Ross  */
13294047d49SGordon Ross typedef struct smb_node {
13394047d49SGordon Ross 	list_node_t		n_lnd;
13494047d49SGordon Ross 	uint32_t		n_magic;
13594047d49SGordon Ross 	krwlock_t		n_lock;
13694047d49SGordon Ross 	kmutex_t		n_mutex;
13794047d49SGordon Ross 	smb_node_state_t	n_state;
13894047d49SGordon Ross 	uint32_t		n_refcnt;
13994047d49SGordon Ross 	uint32_t		n_open_count;
14094047d49SGordon Ross 	volatile int		flags;
14194047d49SGordon Ross 
14294047d49SGordon Ross 	smb_llist_t		n_ofile_list;
14394047d49SGordon Ross 	smb_oplock_t		n_oplock;
14494047d49SGordon Ross } smb_node_t;
14594047d49SGordon Ross 
14694047d49SGordon Ross #define	NODE_FLAGS_WRITE_THROUGH	0x00100000
14794047d49SGordon Ross #define	NODE_FLAGS_DELETE_COMMITTED	0x20000000
14894047d49SGordon Ross #define	NODE_FLAGS_DELETE_ON_CLOSE	0x40000000
14994047d49SGordon Ross 
15094047d49SGordon Ross /*
15194047d49SGordon Ross  * Some flags for ofile structure
15294047d49SGordon Ross  *
15394047d49SGordon Ross  *	SMB_OFLAGS_SET_DELETE_ON_CLOSE
15494047d49SGordon Ross  *   Set this flag when the corresponding open operation whose
15594047d49SGordon Ross  *   DELETE_ON_CLOSE bit of the CreateOptions is set. If any
15694047d49SGordon Ross  *   open file instance has this bit set, the NODE_FLAGS_DELETE_ON_CLOSE
15794047d49SGordon Ross  *   will be set for the file node upon close.
15894047d49SGordon Ross  */
15994047d49SGordon Ross 
16094047d49SGordon Ross /*	SMB_OFLAGS_READONLY		0x0001 (obsolete) */
16194047d49SGordon Ross #define	SMB_OFLAGS_EXECONLY		0x0002
16294047d49SGordon Ross #define	SMB_OFLAGS_SET_DELETE_ON_CLOSE	0x0004
16394047d49SGordon Ross #define	SMB_OFLAGS_LLF_POS_VALID	0x0008
16494047d49SGordon Ross 
16594047d49SGordon Ross #define	SMB_OFILE_MAGIC		0x4F464C45	/* 'OFLE' */
16694047d49SGordon Ross #define	SMB_OFILE_VALID(p)	\
16794047d49SGordon Ross     ASSERT((p != NULL) && ((p)->f_magic == SMB_OFILE_MAGIC))
16894047d49SGordon Ross 
16994047d49SGordon Ross /*
17094047d49SGordon Ross  * This is the size of the per-handle "Lock Sequence" array.
17194047d49SGordon Ross  * See LockSequenceIndex in [MS-SMB2] 2.2.26, and smb2_lock.c
17294047d49SGordon Ross  */
17394047d49SGordon Ross #define	SMB_OFILE_LSEQ_MAX		64
17494047d49SGordon Ross 
17594047d49SGordon Ross /* {arg_open,ofile}->dh_vers values */
17694047d49SGordon Ross typedef enum {
17794047d49SGordon Ross 	SMB2_NOT_DURABLE = 0,
17894047d49SGordon Ross 	SMB2_DURABLE_V1,
17994047d49SGordon Ross 	SMB2_DURABLE_V2,
18094047d49SGordon Ross 	SMB2_RESILIENT,
18194047d49SGordon Ross } smb_dh_vers_t;
18294047d49SGordon Ross 
18394047d49SGordon Ross /*
18494047d49SGordon Ross  * See the long "Ofile State Machine" comment in smb_ofile.c
18594047d49SGordon Ross  */
18694047d49SGordon Ross typedef enum {
18794047d49SGordon Ross 	SMB_OFILE_STATE_ALLOC = 0,
18894047d49SGordon Ross 	SMB_OFILE_STATE_OPEN,
18994047d49SGordon Ross 	SMB_OFILE_STATE_SAVE_DH,
19094047d49SGordon Ross 	SMB_OFILE_STATE_SAVING,
19194047d49SGordon Ross 	SMB_OFILE_STATE_CLOSING,
19294047d49SGordon Ross 	SMB_OFILE_STATE_CLOSED,
19394047d49SGordon Ross 	SMB_OFILE_STATE_ORPHANED,
19494047d49SGordon Ross 	SMB_OFILE_STATE_RECONNECT,
19594047d49SGordon Ross 	SMB_OFILE_STATE_EXPIRED,
19694047d49SGordon Ross 	SMB_OFILE_STATE_SENTINEL
19794047d49SGordon Ross } smb_ofile_state_t;
19894047d49SGordon Ross 
19994047d49SGordon Ross typedef struct smb_ofile {
20094047d49SGordon Ross 	list_node_t		f_tree_lnd;	/* t_ofile_list */
20194047d49SGordon Ross 	list_node_t		f_node_lnd;	/* n_ofile_list */
20294047d49SGordon Ross 	list_node_t		f_dh_lnd;	/* sv_persistid_ht */
20394047d49SGordon Ross 	uint32_t		f_magic;
20494047d49SGordon Ross 	kmutex_t		f_mutex;
20594047d49SGordon Ross 	smb_ofile_state_t	f_state;
20694047d49SGordon Ross 
20794047d49SGordon Ross 	uint16_t		f_fid;
20894047d49SGordon Ross 	uint16_t		f_ftype;
20994047d49SGordon Ross 	uint32_t		f_refcnt;
21094047d49SGordon Ross 	uint32_t		f_granted_access;
21194047d49SGordon Ross 	uint32_t		f_share_access;
21294047d49SGordon Ross 
21394047d49SGordon Ross 	smb_node_t		*f_node;
21494047d49SGordon Ross 
21594047d49SGordon Ross 	smb_oplock_grant_t	f_oplock;
2166f8336c5SGordon Ross 	boolean_t		f_oplock_closing;
21794047d49SGordon Ross 	uint8_t			TargetOplockKey[SMB_LEASE_KEY_SZ];
21894047d49SGordon Ross 	uint8_t			ParentOplockKey[SMB_LEASE_KEY_SZ];
21994047d49SGordon Ross 	struct smb_lease	*f_lease;
22094047d49SGordon Ross 
22194047d49SGordon Ross } smb_ofile_t;
22294047d49SGordon Ross 
22394047d49SGordon Ross typedef struct smb_request {
22494047d49SGordon Ross 	list_node_t		sr_session_lnd;
22594047d49SGordon Ross 	uint32_t		sr_magic;
22694047d49SGordon Ross 	kmutex_t		sr_mutex;
22794047d49SGordon Ross } smb_request_t;
22894047d49SGordon Ross 
22994047d49SGordon Ross #ifdef	__cplusplus
23094047d49SGordon Ross }
23194047d49SGordon Ross #endif
23294047d49SGordon Ross 
23394047d49SGordon Ross #endif /* _SMB_KTYPES_H */
234