xref: /illumos-gate/usr/src/uts/common/smbsrv/smb_ioctl.h (revision a92282e44f968185a6bba094d1e5fece2da819cf)
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 2020 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_SPOOLDOC	_IOW(SMB_IOC_BASE, 13, int)
56 
57 typedef struct smb_ioc_header {
58 	uint32_t	version;
59 	uint32_t	crc;
60 	uint32_t	len;
61 	int		cmd;
62 } smb_ioc_header_t;
63 
64 typedef	struct smb_ioc_spooldoc {
65 	smb_ioc_header_t hdr;
66 	smb_inaddr_t	ipaddr;
67 	uint32_t	spool_num;
68 	char		username[MAXNAMELEN];
69 	char		path[MAXPATHLEN];
70 } smb_ioc_spooldoc_t;
71 
72 typedef	struct {
73 	smb_ioc_header_t hdr;
74 	int32_t		offset;
75 } smb_ioc_gmt_t;
76 
77 typedef struct smb_ioc_share {
78 	smb_ioc_header_t hdr;
79 	uint32_t	shrlen;
80 	char		shr[1];
81 } smb_ioc_share_t;
82 
83 typedef struct smb_ioc_shareinfo {
84 	smb_ioc_header_t hdr;
85 	char		shrname[MAXNAMELEN];
86 	uint32_t	shortnames;
87 } smb_ioc_shareinfo_t;
88 
89 typedef	struct smb_ioc_start {
90 	smb_ioc_header_t hdr;
91 	int		opipe;
92 	int		lmshrd;
93 	int		udoor;
94 	/* These are used only by libfksmbsrv */
95 	void		*opipe_func;
96 	void		*lmshr_func;
97 	void		*udoor_func;
98 } smb_ioc_start_t;
99 
100 typedef	struct smb_ioc_event {
101 	smb_ioc_header_t hdr;
102 	uint32_t	txid;
103 } smb_ioc_event_t;
104 
105 typedef	struct smb_ioc_opennum {
106 	smb_ioc_header_t hdr;
107 	uint32_t	open_users;
108 	uint32_t	open_trees;
109 	uint32_t	open_files;
110 	uint32_t	qualtype;
111 	char		qualifier[MAXNAMELEN];
112 } smb_ioc_opennum_t;
113 
114 /*
115  * For enumeration, user and session are synonymous, as are
116  * connection and tree.
117  */
118 #define	SMB_SVCENUM_TYPE_USER	0x55534552	/* 'USER' */
119 #define	SMB_SVCENUM_TYPE_TREE	0x54524545	/* 'TREE' */
120 #define	SMB_SVCENUM_TYPE_FILE	0x46494C45	/* 'FILE' */
121 #define	SMB_SVCENUM_TYPE_SHARE	0x53484152	/* 'SHAR' */
122 
123 /* Maximum size of payload data an smbsrv ioctl may use. */
124 #define	SMB_IOC_DATA_SIZE		(256 * 1024)
125 
126 typedef struct smb_svcenum {
127 	uint32_t	se_type;	/* object type to enumerate */
128 	uint32_t	se_level;	/* level of detail being requested */
129 	uint32_t	se_prefmaxlen;	/* client max size buffer preference */
130 					/* (ignored by kernel) */
131 	uint32_t	se_resume;	/* client resume handle */
132 	uint32_t	se_bavail;	/* remaining buffer space in bytes */
133 	uint32_t	se_bused;	/* consumed buffer space in bytes */
134 	uint32_t	se_ntotal;	/* total number of objects */
135 	uint32_t	se_nlimit;	/* max number of objects to return */
136 	uint32_t	se_nitems;	/* number of objects in buf */
137 	uint32_t	se_nskip;	/* number of objects to skip */
138 	uint32_t	se_status;	/* enumeration status */
139 	uint32_t	se_buflen;	/* length of the buffer in bytes */
140 	uint8_t		se_buf[1];	/* buffer to hold enumeration data */
141 } smb_svcenum_t;
142 
143 typedef	struct smb_ioc_svcenum {
144 	smb_ioc_header_t hdr;
145 	smb_svcenum_t	svcenum;
146 } smb_ioc_svcenum_t;
147 
148 typedef struct smb_ioc_session {
149 	smb_ioc_header_t hdr;
150 	char		client[MAXNAMELEN];
151 	char		username[MAXNAMELEN];
152 } smb_ioc_session_t;
153 
154 typedef	struct smb_ioc_fileid {
155 	smb_ioc_header_t hdr;
156 	uint32_t	uniqid;
157 } smb_ioc_fileid_t;
158 
159 /* See also: smb_kmod_cfg_t */
160 typedef struct smb_ioc_cfg {
161 	smb_ioc_header_t hdr;
162 	uint32_t	maxworkers;
163 	uint32_t	maxconnections;
164 	uint32_t	keepalive;
165 	int32_t		restrict_anon;
166 	int32_t		signing_enable;
167 	int32_t		signing_required;
168 	int32_t		oplock_enable;
169 	int32_t		sync_enable;
170 	int32_t		secmode;
171 	int32_t		netbios_enable;
172 	int32_t		ipv6_enable;
173 	int32_t		print_enable;
174 	int32_t		traverse_mounts;
175 	uint32_t	max_protocol;
176 	uint32_t	min_protocol;
177 	uint32_t	encrypt;
178 	uint32_t	exec_flags;
179 	uint32_t	negtok_len;
180 	smb_version_t	version;
181 	uint16_t	encrypt_cipher;
182 	uint16_t	initial_credits;
183 	uint16_t	maximum_credits;
184 	/* SMB negotiate protocol response. */
185 	uuid_t		machine_uuid;
186 	uchar_t		negtok[SMB_PI_MAX_NEGTOK];
187 	char		native_os[SMB_PI_MAX_NATIVE_OS];
188 	char		native_lm[SMB_PI_MAX_LANMAN];
189 	char		nbdomain[NETBIOS_NAME_SZ];
190 	char		fqdn[SMB_PI_MAX_DOMAIN];
191 	char		hostname[SMB_PI_MAX_HOST];
192 	char		system_comment[SMB_PI_MAX_COMMENT];
193 } smb_ioc_cfg_t;
194 
195 typedef union smb_ioc {
196 	smb_ioc_header_t	ioc_hdr;
197 	smb_ioc_gmt_t		ioc_gmt;
198 	smb_ioc_cfg_t		ioc_cfg;
199 	smb_ioc_start_t		ioc_start;
200 	smb_ioc_event_t		ioc_event;
201 	smb_ioc_opennum_t	ioc_opennum;
202 	smb_ioc_svcenum_t	ioc_svcenum;
203 	smb_ioc_session_t	ioc_session;
204 	smb_ioc_fileid_t	ioc_fileid;
205 	smb_ioc_share_t		ioc_share;
206 	smb_ioc_shareinfo_t	ioc_shareinfo;
207 	smb_ioc_spooldoc_t	ioc_spooldoc;
208 } smb_ioc_t;
209 
210 uint32_t smb_crc_gen(uint8_t *, size_t);
211 
212 /* fksmbd (init,open,close,ioctl) calls into libfksmbsrv */
213 int fksmbsrv_drv_open(void);
214 int fksmbsrv_drv_close(void);
215 int fksmbsrv_drv_ioctl(int cmd, void *arg);
216 void fksmbsrv_drv_load(void);
217 
218 #ifdef __cplusplus
219 }
220 #endif
221 
222 #endif /* _SMB_IOCTL_H_ */
223