1 /*
2 * Copyright (c) 2000-2001 Boris Popov
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by Boris Popov.
16 * 4. Neither the name of the author nor the names of any co-contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 *
32 * $Id: smb_dev.h,v 1.10.178.1 2005/05/27 02:35:29 lindak Exp $
33 */
34
35 /*
36 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
37 * Use is subject to license terms.
38 *
39 * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
40 */
41
42 #ifndef _NETSMB_DEV_H_
43 #define _NETSMB_DEV_H_
44
45 /*
46 * This file defines an internal ABI for the "nsmb" driver,
47 * particularly the various data structures passed to ioctl.
48 * In order to avoid some messy 32-bit to 64-bit conversions
49 * in the driver, we take pains to define all data structures
50 * that pass across the user/kernel boundary in a way that
51 * makes them invariant across 32-bit and 64-bit ABIs.
52 * This invariance is checked during the driver build
53 * using a mechanism similar to genassym.h builds.
54 *
55 * If you change any of the ioctl data structures in
56 * this file, YOU MUST ALSO edit this file:
57 * uts/common/fs/smbclnt/netsmb/offsets.in
58 * and then verify the invariance describe above.
59 *
60 * Also, remember to "bump" NSMB_VER below when
61 * any part of this user/kernel I/F changes.
62 */
63
64 #include <sys/types.h>
65 #include <sys/socket_impl.h>
66 #include <netinet/in.h>
67
68 #define NSMB_NAME "nsmb"
69
70 /*
71 * Update NSMB_VER* if any of the ioctl codes and/or
72 * associated structures change in ways that would
73 * make them incompatible with an old driver.
74 */
75 #define NSMB_VERMAJ 2
76 #define NSMB_VERMIN 0x100
77 #define NSMB_VERSION ((NSMB_VERMAJ << 16) | NSMB_VERMIN)
78
79 /*
80 * Some errno values we need to expose to the library.
81 * NB: these are also defined in the library smbfs_api.h
82 * to avoid exposing all of this stuff in that API.
83 *
84 * EBADRPC is used for message decoding errors.
85 * EAUTH is used for CIFS authentication errors.
86 */
87 #ifndef EBADRPC
88 #define EBADRPC 113
89 #endif
90 #ifndef EAUTH
91 #define EAUTH 114
92 #endif
93
94 /*
95 * Upper/lower case options
96 */
97 #define SMB_CS_NONE 0x0000
98 #define SMB_CS_UPPER 0x0001 /* convert passed string to upper case */
99 #define SMB_CS_LOWER 0x0002 /* convert passed string to lower case */
100
101 /*
102 * access mode stuff (see also smb_lib.h)
103 */
104 #define SMBM_ANY_OWNER ((uid_t)-1)
105 #define SMBM_ANY_GROUP ((gid_t)-1)
106
107 /*
108 * Option flags in smbioc_ossn.ioc_opt
109 * and vcspec.optflags
110 */
111 #define SMBVOPT_CREATE 0x0001 /* create object if necessary */
112 #define SMBVOPT_PRIVATE 0x0002 /* connection should be private */
113 #define SMBVOPT_SINGLESHARE 0x0004 /* keep only one share at this VC */
114 #define SMBVOPT_PERMANENT 0x0010 /* object will keep last reference */
115 #define SMBVOPT_ANONYMOUS 0x0020 /* using a NULL session */
116
117 #define SMBVOPT_SIGNING_ENABLED 0x10000 /* sign if server agrees */
118 #define SMBVOPT_SIGNING_REQUIRED 0x20000 /* signing required */
119 #define SMBVOPT_SIGNING_MASK 0x30000 /* all signing bits */
120
121 #define SMB2_DIALECT_BASE 0x0200
122 #define SMB2_DIALECT_0202 0x0202
123 #define SMB2_DIALECT_02ff 0x02ff
124 #define SMB2_DIALECT_0210 0x0210
125 #define SMB2_DIALECT_0300 0x0300
126 #define SMB2_DIALECT_0302 0x0302
127
128 /* Maximum supported dialect (for ssn_maxver) */
129 #define SMB2_DIALECT_MAX SMB2_DIALECT_0210
130
131 /*
132 * Option flags in smbioc_oshare.ioc_opt
133 * and sharespec.optflags
134 */
135 #define SMBSOPT_CREATE SMBVOPT_CREATE
136 #define SMBSOPT_PERMANENT SMBVOPT_PERMANENT
137
138 /* All user and machine names. */
139 #define SMBIOC_MAX_NAME 256
140
141 /*
142 * Size of storage for p/w hashes.
143 * Also for SMBIOC_GETSSNKEY.
144 */
145 #define SMBIOC_HASH_SZ 16
146
147 /*
148 * network IO daemon states
149 */
150 enum smbiod_state {
151 SMBIOD_ST_UNINIT = 0, /* uninitialized */
152 SMBIOD_ST_RECONNECT, /* a [re]connect attempt requested */
153 SMBIOD_ST_RCFAILED, /* a reconnect attempt has failed */
154 SMBIOD_ST_CONNECTED, /* Transport (TCP) connected */
155 SMBIOD_ST_NEGOTIATED, /* Negotiated SMB/SMB2+ */
156 SMBIOD_ST_AUTHCONT, /* Session setup continuing */
157 SMBIOD_ST_AUTHFAIL, /* Session setup failed */
158 SMBIOD_ST_AUTHOK, /* Session setup success */
159 SMBIOD_ST_VCACTIVE, /* iod_work running */
160 SMBIOD_ST_IDLE, /* no trees, will go DEAD */
161 SMBIOD_ST_DEAD /* connection gone, no IOD */
162 };
163
164
165 /*
166 * We're now using structures that are invariant
167 * across 32-bit vs 64-bit compilers for all
168 * member sizes and offsets. Scalar members
169 * simply have to use fixed-size types.
170 * Pointers are a little harder...
171 * We use this union for all pointers that
172 * must pass between user and kernel.
173 */
174 typedef union lptr {
175 uint64_t lp_ll;
176 #ifdef _LP64
177 void *lp_ptr;
178 #endif
179 #ifdef _ILP32
180 void *_lp_p2[2];
181 #ifdef _LITTLE_ENDIAN
182 #define lp_ptr _lp_p2[0]
183 #define lp_pad _lp_p2[1]
184 #else /* _ENDIAN */
185 #define lp_pad _lp_p2[0]
186 #define lp_ptr _lp_p2[1]
187 #endif /* _ENDIAN */
188 #endif /* _ILP32 */
189 } lptr_t;
190
191 /*
192 * Handy union of sockaddr types we use.
193 * Type discriminator is sa_family
194 */
195 union smbioc_sockaddr {
196 struct sockaddr sa; /* generic */
197 struct sockaddr_in sin;
198 struct sockaddr_in6 sin6;
199 };
200 typedef union smbioc_sockaddr smbioc_sockaddr_t;
201
202 /*
203 * This is what identifies a session.
204 */
205 struct smbioc_ssn_ident {
206 smbioc_sockaddr_t id_srvaddr;
207 char id_domain[SMBIOC_MAX_NAME];
208 char id_user[SMBIOC_MAX_NAME];
209 };
210 typedef struct smbioc_ssn_ident smbioc_ssn_ident_t;
211
212 /*
213 * Flags for smbioc_ossn.ssn_opt
214 */
215 #define SMBLK_CREATE SMBVOPT_CREATE
216
217 /*
218 * Structure used with SMBIOC_SSN_FIND, _CREATE
219 */
220 struct smbioc_ossn {
221 uint32_t ssn_owner; /* Unix owner (UID) */
222 uint32_t ssn_vopt; /* i.e. SMBVOPT_CREATE */
223 uint16_t ssn_minver; /* Min SMB version. */
224 uint16_t ssn_maxver; /* Max SMB version. */
225 smbioc_ssn_ident_t ssn_id;
226 char ssn_srvname[SMBIOC_MAX_NAME];
227 };
228 typedef struct smbioc_ossn smbioc_ossn_t;
229 /* Convenience names for members under ssn_id */
230 #define ssn_srvaddr ssn_id.id_srvaddr
231 #define ssn_domain ssn_id.id_domain
232 #define ssn_user ssn_id.id_user
233
234 /*
235 * Structure used with SMBIOC_TREE_FIND, _CONNECT
236 */
237 struct smbioc_oshare {
238 uint32_t sh_use; /* requested */
239 uint32_t sh_type; /* returned */
240 char sh_name[SMBIOC_MAX_NAME];
241 char sh_pass[SMBIOC_MAX_NAME];
242 };
243 typedef struct smbioc_oshare smbioc_oshare_t;
244
245 typedef struct smbioc_tcon {
246 int32_t tc_flags;
247 int32_t tc_opt;
248 smbioc_oshare_t tc_sh;
249 } smbioc_tcon_t;
250
251 /*
252 * This is the operational state information passed
253 * in and out of the driver for SMBIOC_SSN_WORK
254 */
255 struct smbioc_ssn_work {
256 uint32_t wk_out_state; /* out-only */
257 uint32_t wk_u_ssnkey_len; /* ssn key length */
258 lptr_t wk_u_ssnkey_buf; /* user-space ptr! */
259 uint32_t wk_u_auth_rlen; /* recv auth tok len */
260 uint32_t wk_u_auth_wlen; /* send auth tok len */
261 lptr_t wk_u_auth_rbuf; /* recv auth tok buf */
262 lptr_t wk_u_auth_wbuf; /* send auth tok buf */
263 uint8_t wk_cl_guid[16]; /* client GUID */
264 };
265 typedef struct smbioc_ssn_work smbioc_ssn_work_t;
266
267 /*
268 * User-level SMB requests
269 */
270
271 typedef struct smbioc_rw {
272 uint32_t ioc_cnt;
273 uint32_t ioc_flags;
274 lloff_t _ioc_offset;
275 lptr_t _ioc_base;
276 } smbioc_rw_t;
277 #define ioc_offset _ioc_offset._f
278 #define ioc_base _ioc_base.lp_ptr
279
280 /* Transact on named pipe (send/recv) */
281 typedef struct smbioc_xnp {
282 uint32_t ioc_tdlen; /* transmit len */
283 uint32_t ioc_rdlen; /* recv maxlen */
284 uint32_t ioc_more; /* more data to read */
285 uint32_t ioc_pad1;
286 lptr_t _ioc_tdata;
287 lptr_t _ioc_rdata;
288 } smbioc_xnp_t;
289 #define ioc_tdata _ioc_tdata.lp_ptr
290 #define ioc_rdata _ioc_rdata.lp_ptr
291
292 typedef struct smbioc_ntcreate {
293 uint32_t ioc_req_acc;
294 uint32_t ioc_efattr;
295 uint32_t ioc_share_acc;
296 uint32_t ioc_open_disp;
297 uint32_t ioc_creat_opts;
298 char ioc_name[SMBIOC_MAX_NAME];
299 } smbioc_ntcreate_t;
300
301 typedef struct smbioc_printjob {
302 uint16_t ioc_setuplen;
303 uint16_t ioc_prmode;
304 char ioc_title[SMBIOC_MAX_NAME];
305 } smbioc_printjob_t;
306
307 /* Password Keychain (PK) support. */
308 typedef struct smbioc_pk {
309 uid_t pk_uid; /* UID for PAM use */
310 char pk_dom[SMBIOC_MAX_NAME]; /* CIFS domain name */
311 char pk_usr[SMBIOC_MAX_NAME]; /* CIFS user name */
312 uchar_t pk_lmhash[SMBIOC_HASH_SZ]; /* LanMan p/w hash */
313 uchar_t pk_nthash[SMBIOC_HASH_SZ]; /* NTLM p/w hash */
314 } smbioc_pk_t;
315
316
317 /*
318 * Device IOCTLs
319 *
320 * Define ioctl codes the way ZFS does.
321 * The "base" value is arbitrary, and can
322 * occupy the high word if we like, because
323 * our driver does its own copyin/copyout.
324 * Keep GETVERS first and use it to verify
325 * driver compatibility with the library.
326 */
327 #define SMBIOC_BASE ((('n' << 8) | 's') << 8)
328 typedef enum nsmb_ioc {
329 SMBIOC_GETVERS = SMBIOC_BASE, /* keep first */
330 SMBIOC_FLAGS2, /* obsolete */
331 SMBIOC_GETSSNKEY, /* get SMB session key */
332 SMBIOC_DUP_DEV, /* duplicate dev handle */
333
334 SMBIOC_READ, /* read (pipe) */
335 SMBIOC_WRITE, /* write (pipe) */
336 SMBIOC_XACTNP, /* "transact" (pipe) */
337 SMBIOC_NTCREATE, /* open or create */
338 SMBIOC_PRINTJOB, /* open print job */
339 SMBIOC_CLOSEFH, /* from ntcreate or printjob */
340
341 SMBIOC_SSN_CREATE,
342 SMBIOC_SSN_FIND,
343 SMBIOC_SSN_KILL, /* force disconnect */
344 SMBIOC_SSN_RELE, /* drop our reference */
345
346 SMBIOC_TREE_CONNECT, /* create and connect */
347 SMBIOC_TREE_FIND,
348 SMBIOC_TREE_KILL,
349 SMBIOC_TREE_RELE,
350
351 SMBIOC_IOD_CONNECT, /* Setup connection */
352 SMBIOC_IOD_NEGOTIATE, /* SMB/SMB2 negotiate */
353 SMBIOC_IOD_SSNSETUP, /* SMB/SMB2 session setup */
354 SMBIOC_IOD_WORK, /* work on session requests */
355 SMBIOC_IOD_IDLE, /* wait for requests on this session */
356 SMBIOC_IOD_RCFAIL, /* tell driver reconnect failed */
357
358 /* Password Keychain (PK) support. */
359 SMBIOC_PK_ADD, /* Add/Modify a password entry */
360 SMBIOC_PK_CHK, /* Check for a password entry */
361 SMBIOC_PK_DEL, /* Delete specified password entry */
362 SMBIOC_PK_DEL_OWNER, /* all owned by the caller */
363 SMBIOC_PK_DEL_EVERYONE /* all owned by everyone */
364 } nsmb_ioc_t;
365
366 #endif /* _NETSMB_DEV_H_ */