1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
24  * Copyright 2017 Joyent, Inc.
25  * Copyright 2022 RackTop Systems, Inc.
26  */
27 
28 #ifndef _SMB_IOCTL_H_
29 #define	_SMB_IOCTL_H_
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/types.h>
36 #include <sys/param.h>
37 #include <smbsrv/smbinfo.h>
38 
39 #define	SMB_IOC_VERSION		0x534D4201	/* SMB1 */
40 
41 #define	SMB_IOC_BASE		(('S' << 16) | ('B' << 8))
42 
43 #define	SMB_IOC_CONFIG		_IOW(SMB_IOC_BASE, 1, int)
44 #define	SMB_IOC_START		_IOW(SMB_IOC_BASE, 2, int)
45 #define	SMB_IOC_GMTOFF		_IOW(SMB_IOC_BASE, 3, int)
46 #define	SMB_IOC_SHARE		_IOW(SMB_IOC_BASE, 4, int)
47 #define	SMB_IOC_UNSHARE		_IOW(SMB_IOC_BASE, 5, int)
48 #define	SMB_IOC_NUMOPEN		_IOW(SMB_IOC_BASE, 6, int)
49 #define	SMB_IOC_SVCENUM		_IOW(SMB_IOC_BASE, 7, int)
50 #define	SMB_IOC_FILE_CLOSE	_IOW(SMB_IOC_BASE, 8, int)
51 #define	SMB_IOC_SESSION_CLOSE	_IOW(SMB_IOC_BASE, 9, int)
52 #define	SMB_IOC_STOP		_IOW(SMB_IOC_BASE, 10, int)
53 #define	SMB_IOC_EVENT		_IOW(SMB_IOC_BASE, 11, int)
54 #define	SMB_IOC_SHAREINFO	_IOW(SMB_IOC_BASE, 12, int)
55 #define	SMB_IOC_SHAREACCESS	_IOW(SMB_IOC_BASE, 13, int)
56 #define	SMB_IOC_SPOOLDOC	_IOW(SMB_IOC_BASE, 14, int)
57 
58 typedef struct smb_ioc_header {
59 	uint32_t	version;
60 	uint32_t	crc;
61 	uint32_t	len;
62 	int		cmd;
63 } smb_ioc_header_t;
64 
65 typedef	struct smb_ioc_spooldoc {
66 	smb_ioc_header_t hdr;
67 	smb_inaddr_t	ipaddr;
68 	uint32_t	spool_num;
69 	char		username[MAXNAMELEN];
70 	char		path[MAXPATHLEN];
71 } smb_ioc_spooldoc_t;
72 
73 typedef	struct {
74 	smb_ioc_header_t hdr;
75 	int32_t		offset;
76 } smb_ioc_gmt_t;
77 
78 typedef struct smb_ioc_share {
79 	smb_ioc_header_t hdr;
80 	uint32_t	shrlen;
81 	char		shr[1];
82 } smb_ioc_share_t;
83 
84 typedef struct smb_ioc_shareinfo {
85 	smb_ioc_header_t hdr;
86 	char		shrname[MAXNAMELEN];
87 	uint32_t	shortnames;
88 } smb_ioc_shareinfo_t;
89 
90 typedef struct smb_ioc_shareaccess {
91 	smb_ioc_header_t hdr;
92 	uint64_t	session_id;
93 	uint64_t	user_id;
94 	char		shrname[MAXNAMELEN];
95 } smb_ioc_shareaccess_t;
96 
97 typedef	struct smb_ioc_start {
98 	smb_ioc_header_t hdr;
99 	int		opipe;
100 	int		lmshrd;
101 	int		udoor;
102 	/* These are used only by libfksmbsrv */
103 	void		*opipe_func;
104 	void		*lmshr_func;
105 	void		*udoor_func;
106 } smb_ioc_start_t;
107 
108 typedef	struct smb_ioc_event {
109 	smb_ioc_header_t hdr;
110 	uint32_t	txid;
111 } smb_ioc_event_t;
112 
113 typedef	struct smb_ioc_opennum {
114 	smb_ioc_header_t hdr;
115 	uint32_t	open_users;
116 	uint32_t	open_trees;
117 	uint32_t	open_files;
118 	uint32_t	qualtype;
119 	char		qualifier[MAXNAMELEN];
120 } smb_ioc_opennum_t;
121 
122 /*
123  * For enumeration, user and session are synonymous, as are
124  * connection and tree.
125  */
126 #define	SMB_SVCENUM_TYPE_USER	0x55534552	/* 'USER' */
127 #define	SMB_SVCENUM_TYPE_TREE	0x54524545	/* 'TREE' */
128 #define	SMB_SVCENUM_TYPE_FILE	0x46494C45	/* 'FILE' */
129 #define	SMB_SVCENUM_TYPE_SHARE	0x53484152	/* 'SHAR' */
130 
131 /* Maximum size of payload data an smbsrv ioctl may use. */
132 #define	SMB_IOC_DATA_SIZE		(256 * 1024)
133 
134 typedef struct smb_svcenum {
135 	uint32_t	se_type;	/* object type to enumerate */
136 	uint32_t	se_level;	/* level of detail being requested */
137 	uint32_t	se_prefmaxlen;	/* client max size buffer preference */
138 					/* (ignored by kernel) */
139 	uint32_t	se_resume;	/* client resume handle */
140 	uint32_t	se_bavail;	/* remaining buffer space in bytes */
141 	uint32_t	se_bused;	/* consumed buffer space in bytes */
142 	uint32_t	se_ntotal;	/* total number of objects */
143 	uint32_t	se_nlimit;	/* max number of objects to return */
144 	uint32_t	se_nitems;	/* number of objects in buf */
145 	uint32_t	se_nskip;	/* number of objects to skip */
146 	uint32_t	se_status;	/* enumeration status */
147 	uint32_t	se_buflen;	/* length of the buffer in bytes */
148 	uint8_t		se_buf[1];	/* buffer to hold enumeration data */
149 } smb_svcenum_t;
150 
151 typedef	struct smb_ioc_svcenum {
152 	smb_ioc_header_t hdr;
153 	smb_svcenum_t	svcenum;
154 } smb_ioc_svcenum_t;
155 
156 typedef struct smb_ioc_session {
157 	smb_ioc_header_t hdr;
158 	char		client[MAXNAMELEN];
159 	char		username[MAXNAMELEN];
160 } smb_ioc_session_t;
161 
162 typedef	struct smb_ioc_fileid {
163 	smb_ioc_header_t hdr;
164 	uint32_t	uniqid;
165 } smb_ioc_fileid_t;
166 
167 /* See also: smb_kmod_cfg_t */
168 typedef struct smb_ioc_cfg {
169 	smb_ioc_header_t hdr;
170 	uint32_t	maxworkers;
171 	uint32_t	maxconnections;
172 	uint32_t	keepalive;
173 	int32_t		restrict_anon;
174 	int32_t		signing_enable;
175 	int32_t		signing_required;
176 	int32_t		oplock_enable;
177 	int32_t		sync_enable;
178 	int32_t		secmode;
179 	int32_t		netbios_enable;
180 	int32_t		ipv6_enable;
181 	int32_t		print_enable;
182 	int32_t		traverse_mounts;
183 	int32_t		short_names;
184 	uint32_t	max_protocol;
185 	uint32_t	min_protocol;
186 	uint32_t	encrypt;
187 	uint32_t	encrypt_ciphers;
188 	uint32_t	exec_flags;
189 	uint32_t	negtok_len;
190 	uint32_t	max_opens;	/* per client */
191 	smb_version_t	version;
192 	uint16_t	initial_credits;
193 	uint16_t	maximum_credits;
194 	/* SMB negotiate protocol response. */
195 	uuid_t		machine_uuid;
196 	uchar_t		negtok[SMB_PI_MAX_NEGTOK];
197 	char		native_os[SMB_PI_MAX_NATIVE_OS];
198 	char		native_lm[SMB_PI_MAX_LANMAN];
199 	char		nbdomain[NETBIOS_NAME_SZ];
200 	char		fqdn[SMB_PI_MAX_DOMAIN];
201 	char		hostname[SMB_PI_MAX_HOST];
202 	char		system_comment[SMB_PI_MAX_COMMENT];
203 } smb_ioc_cfg_t;
204 
205 typedef union smb_ioc {
206 	smb_ioc_header_t	ioc_hdr;
207 	smb_ioc_gmt_t		ioc_gmt;
208 	smb_ioc_cfg_t		ioc_cfg;
209 	smb_ioc_start_t		ioc_start;
210 	smb_ioc_event_t		ioc_event;
211 	smb_ioc_opennum_t	ioc_opennum;
212 	smb_ioc_svcenum_t	ioc_svcenum;
213 	smb_ioc_session_t	ioc_session;
214 	smb_ioc_fileid_t	ioc_fileid;
215 	smb_ioc_share_t		ioc_share;
216 	smb_ioc_shareaccess_t	ioc_shareaccess;
217 	smb_ioc_shareinfo_t	ioc_shareinfo;
218 	smb_ioc_spooldoc_t	ioc_spooldoc;
219 } smb_ioc_t;
220 
221 uint32_t smb_crc_gen(uint8_t *, size_t);
222 
223 /* fksmbd (init,open,close,ioctl) calls into libfksmbsrv */
224 int fksmbsrv_drv_open(void);
225 int fksmbsrv_drv_close(void);
226 int fksmbsrv_drv_ioctl(int cmd, void *arg);
227 void fksmbsrv_drv_load(void);
228 
229 #ifdef __cplusplus
230 }
231 #endif
232 
233 #endif /* _SMB_IOCTL_H_ */
234