xref: /illumos-gate/usr/src/uts/common/netsmb/smb_dev.h (revision 581cede61ac9c14d8d4ea452562a567189eead78)
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 
40 #ifndef _NETSMB_DEV_H_
41 #define	_NETSMB_DEV_H_
42 
43 /*
44  * This file defines an internal ABI for the "nsmb" driver,
45  * particularly the various data structures passed to ioctl.
46  * In order to avoid some messy 32-bit to 64-bit conversions
47  * in the driver, we take pains to define all data structures
48  * that pass across the user/kernel boundary in a way that
49  * makes them invariant across 32-bit and 64-bit ABIs.
50  * This invariance is checked during the driver build
51  * using a mechanism similar to genassym.h builds.
52  *
53  * If you change any of the ioctl data structures in
54  * this file, YOU MUST ALSO edit this file:
55  *   uts/common/fs/smbclnt/netsmb/offsets.in
56  * and then verify the invariance describe above.
57  *
58  * Also, remember to "bump" NSMB_VER below when
59  * any part of this user/kernel I/F changes.
60  */
61 
62 #include <sys/types.h>
63 #include <sys/socket_impl.h>
64 #include <netinet/in.h>
65 
66 #define	NSMB_NAME		"nsmb"
67 
68 /*
69  * Update NSMB_VER* if any of the ioctl codes and/or
70  * associated structures change in ways that would
71  * make them incompatible with an old driver.
72  */
73 #define	NSMB_VERMAJ	1
74 #define	NSMB_VERMIN	3900
75 #define	NSMB_VERSION	(NSMB_VERMAJ * 100000 + NSMB_VERMIN)
76 
77 /*
78  * Some errno values we need to expose to the library.
79  * NB: these are also defined in the library smbfs_api.h
80  * to avoid exposing all of this stuff in that API.
81  *
82  * EBADRPC is used for message decoding errors.
83  * EAUTH is used for CIFS authentication errors.
84  */
85 #ifndef EBADRPC
86 #define	EBADRPC 	113
87 #endif
88 #ifndef EAUTH
89 #define	EAUTH		114
90 #endif
91 
92 /*
93  * Upper/lower case options
94  */
95 #define	SMB_CS_NONE	0x0000
96 #define	SMB_CS_UPPER	0x0001	/* convert passed string to upper case */
97 #define	SMB_CS_LOWER	0x0002	/* convert passed string to lower case */
98 
99 /*
100  * access mode stuff (see also smb_lib.h)
101  */
102 #define	SMBM_ANY_OWNER		((uid_t)-1)
103 #define	SMBM_ANY_GROUP		((gid_t)-1)
104 
105 /*
106  * Option flags in smbioc_ossn.ioc_opt
107  * and vcspec.optflags
108  */
109 #define	SMBVOPT_CREATE		0x0001	/* create object if necessary */
110 #define	SMBVOPT_PRIVATE		0x0002	/* connection should be private */
111 #define	SMBVOPT_SINGLESHARE	0x0004	/* keep only one share at this VC */
112 #define	SMBVOPT_PERMANENT	0x0010	/* object will keep last reference */
113 #define	SMBVOPT_EXT_SEC		0x0020	/* extended security negotiation */
114 #define	SMBVOPT_USE_KEYCHAIN	0x0040	/* get p/w from keychain */
115 #define	SMBVOPT_KC_DOMAIN	0x0080	/* keychain lookup uses domain */
116 
117 #define	SMBVOPT_SIGNING_ENABLED		0x0100	/* sign if server agrees */
118 #define	SMBVOPT_SIGNING_REQUIRED	0x0200	/* signing required */
119 #define	SMBVOPT_SIGNING_MASK		0x0300	/* all signing bits */
120 
121 /*
122  * Option flags in smbioc_oshare.ioc_opt
123  * and sharespec.optflags
124  */
125 #define	SMBSOPT_CREATE		SMBVOPT_CREATE
126 #define	SMBSOPT_PERMANENT	SMBVOPT_PERMANENT
127 
128 /* All user and machine names. */
129 #define	SMBIOC_MAX_NAME		256
130 
131 /*
132  * Size of storage for p/w hashes.
133  * Also for SMBIOC_GETSSNKEY.
134  */
135 #define	SMBIOC_HASH_SZ	16
136 
137 /*
138  * network IO daemon states
139  * really connection states.
140  */
141 enum smbiod_state {
142 	SMBIOD_ST_IDLE = 0,	/* no user requests enqueued yet */
143 	SMBIOD_ST_RECONNECT,	/* a [re]connect attempt is in progress */
144 	SMBIOD_ST_RCFAILED,	/* a reconnect attempt has failed */
145 	SMBIOD_ST_VCACTIVE,	/* session established */
146 	SMBIOD_ST_DEAD		/* connection gone, no IOD */
147 };
148 
149 
150 /*
151  * We're now using structures that are invariant
152  * across 32-bit vs 64-bit compilers for all
153  * member sizes and offsets.  Scalar members
154  * simply have to use fixed-size types.
155  * Pointers are a little harder...
156  * We use this union for all pointers that
157  * must pass between user and kernel.
158  */
159 typedef union lptr {
160 	uint64_t lp_ll;
161 #ifdef _LP64
162 	void	*lp_ptr;
163 #endif
164 #ifdef _ILP32
165 	void	*_lp_p2[2];
166 #ifdef _LITTLE_ENDIAN
167 #define	lp_ptr	_lp_p2[0]
168 #define	lp_pad	_lp_p2[1]
169 #else /* _ENDIAN */
170 #define	lp_pad	_lp_p2[0]
171 #define	lp_ptr	_lp_p2[1]
172 #endif /* _ENDIAN */
173 #endif /* _ILP32 */
174 } lptr_t;
175 
176 /*
177  * Handy union of sockaddr types we use.
178  * Type discriminator is sa_family
179  */
180 union smbioc_sockaddr {
181 	struct sockaddr sa;	/* generic */
182 	struct sockaddr_in sin;
183 	struct sockaddr_in6 sin6;
184 };
185 typedef union smbioc_sockaddr smbioc_sockaddr_t;
186 
187 /*
188  * This is what identifies a session.
189  */
190 struct smbioc_ssn_ident {
191 	smbioc_sockaddr_t id_srvaddr;
192 	char		id_domain[SMBIOC_MAX_NAME];
193 	char		id_user[SMBIOC_MAX_NAME];
194 };
195 typedef struct smbioc_ssn_ident smbioc_ssn_ident_t;
196 
197 /*
198  * Flags for smbioc_ossn.ssn_opt
199  */
200 #define	SMBLK_CREATE		SMBVOPT_CREATE
201 
202 /*
203  * Structure used with SMBIOC_SSN_FIND, _CREATE
204  */
205 struct smbioc_ossn {
206 	uint32_t		ssn_vopt;	/* i.e. SMBVOPT_CREATE */
207 	uint32_t		ssn_owner;	/* Unix owner (UID) */
208 	smbioc_ssn_ident_t	ssn_id;
209 	char			ssn_srvname[SMBIOC_MAX_NAME];
210 };
211 typedef struct smbioc_ossn smbioc_ossn_t;
212 /* Convenience names for members under ssn_id */
213 #define	ssn_srvaddr	ssn_id.id_srvaddr
214 #define	ssn_domain	ssn_id.id_domain
215 #define	ssn_user	ssn_id.id_user
216 
217 /*
218  * Structure used with SMBIOC_TREE_FIND, _CONNECT
219  */
220 #define	SMBIOC_STYPE_LEN	8
221 struct smbioc_oshare {
222 	uint32_t	sh_pwlen;
223 	char		sh_name[SMBIOC_MAX_NAME];
224 	char		sh_pass[SMBIOC_MAX_NAME];
225 	/* share types, in ASCII form, i.e. "A:", "IPC", ... */
226 	char		sh_type_req[SMBIOC_STYPE_LEN];	/* requested */
227 	char		sh_type_ret[SMBIOC_STYPE_LEN];	/* returned */
228 };
229 typedef struct smbioc_oshare smbioc_oshare_t;
230 
231 typedef struct smbioc_tcon {
232 	int32_t		tc_flags;
233 	int32_t		tc_opt;
234 	smbioc_oshare_t	tc_sh;
235 } smbioc_tcon_t;
236 
237 
238 /*
239  * Negotiated protocol parameters
240  */
241 struct smb_sopt {
242 	int16_t		sv_proto;	/* protocol dialect */
243 	uchar_t		sv_sm;		/* security mode */
244 	int16_t		sv_tz;		/* offset in min relative to UTC */
245 	uint16_t	sv_maxmux;	/* max number of outstanding rq's */
246 	uint16_t 	sv_maxvcs;	/* max number of VCs */
247 	uint16_t	sv_rawmode;
248 	uint32_t	sv_maxtx;	/* maximum transmit buf size */
249 	uint32_t	sv_maxraw;	/* maximum raw-buffer size */
250 	uint32_t	sv_skey;	/* session key */
251 	uint32_t	sv_caps;	/* capabilites SMB_CAP_ */
252 };
253 typedef struct smb_sopt smb_sopt_t;
254 
255 /*
256  * State carried in/out of the driver by the IOD thread.
257  * Inside the driver, these are members of the "VC" object.
258  */
259 struct smb_iods {
260 	int32_t		is_tran_fd;	/* transport FD */
261 	uint32_t	is_vcflags;	/* SMBV_... */
262 	uint8_t 	is_hflags;	/* SMB header flags */
263 	uint16_t	is_hflags2;	/* SMB header flags2 */
264 	uint16_t	is_smbuid;	/* SMB header UID */
265 	uint16_t	is_next_mid;	/* SMB header MID */
266 	uint32_t	is_txmax;	/* max tx/rx packet size */
267 	uint32_t	is_rwmax;	/* max read/write data size */
268 	uint32_t	is_rxmax;	/* max readx data size */
269 	uint32_t	is_wxmax;	/* max writex data size */
270 	uint8_t		is_ssn_key[SMBIOC_HASH_SZ]; /* session key */
271 	/* Signing state */
272 	uint32_t	is_next_seq;	/* my next sequence number */
273 	uint32_t	is_u_maclen;	/* MAC key length */
274 	lptr_t		is_u_mackey;	/* user-space ptr! */
275 };
276 typedef struct smb_iods smb_iods_t;
277 
278 /*
279  * This is the operational state information passed
280  * in and out of the driver for SMBIOC_SSN_WORK
281  */
282 struct smbioc_ssn_work {
283 	smb_iods_t	wk_iods;
284 	smb_sopt_t	wk_sopt;
285 	int		wk_out_state;
286 };
287 typedef struct smbioc_ssn_work smbioc_ssn_work_t;
288 
289 /*
290  * User-level SMB requests
291  */
292 
293 /*
294  * SMBIOC_REQUEST (simple SMB request)
295  */
296 typedef struct smbioc_rq {
297 	uchar_t		ioc_cmd;
298 	uint8_t 	ioc_errclass;
299 	uint16_t	ioc_serror;
300 	uint32_t	ioc_error;
301 	uint32_t	ioc_tbufsz;	/* transmit */
302 	uint32_t	ioc_rbufsz;	/* receive */
303 	lptr_t		_ioc_tbuf;
304 	lptr_t		_ioc_rbuf;
305 } smbioc_rq_t;
306 #define	ioc_tbuf	_ioc_tbuf.lp_ptr
307 #define	ioc_rbuf	_ioc_rbuf.lp_ptr
308 
309 
310 #define	SMBIOC_T2RQ_MAXSETUP	4
311 #define	SMBIOC_T2RQ_MAXNAME	128
312 
313 typedef struct smbioc_t2rq {
314 	uint16_t	ioc_setup[SMBIOC_T2RQ_MAXSETUP];
315 	int32_t		ioc_setupcnt;
316 	char		ioc_name[SMBIOC_T2RQ_MAXNAME];
317 	ushort_t	ioc_tparamcnt;
318 	ushort_t	ioc_tdatacnt;
319 	ushort_t	ioc_rparamcnt;
320 	ushort_t	ioc_rdatacnt;
321 	uint8_t 	ioc__pad1;
322 	uint8_t 	ioc_errclass;
323 	uint16_t	ioc_serror;
324 	uint32_t	ioc_error;
325 	uint16_t	ioc_rpflags2;
326 	uint16_t	ioc__pad2;
327 	lptr_t		_ioc_tparam;
328 	lptr_t		_ioc_tdata;
329 	lptr_t		_ioc_rparam;
330 	lptr_t		_ioc_rdata;
331 } smbioc_t2rq_t;
332 #define	ioc_tparam	_ioc_tparam.lp_ptr
333 #define	ioc_tdata	_ioc_tdata.lp_ptr
334 #define	ioc_rparam	_ioc_rparam.lp_ptr
335 #define	ioc_rdata	_ioc_rdata.lp_ptr
336 
337 
338 typedef struct smbioc_flags {
339 	int32_t		ioc_level;	/* 0 - session, 1 - share */
340 	int32_t		ioc_flags;
341 	int32_t		ioc_mask;
342 } smbioc_flags_t;
343 
344 typedef struct smbioc_rw {
345 	uint32_t	ioc_fh;
346 	uint32_t	ioc_cnt;
347 	lloff_t	_ioc_offset;
348 	lptr_t	_ioc_base;
349 } smbioc_rw_t;
350 #define	ioc_offset	_ioc_offset._f
351 #define	ioc_base	_ioc_base.lp_ptr
352 
353 /* Password Keychain (PK) support. */
354 typedef struct smbioc_pk {
355 	uid_t	pk_uid;				/* UID for PAM use */
356 	char pk_dom[SMBIOC_MAX_NAME];		/* CIFS domain name */
357 	char pk_usr[SMBIOC_MAX_NAME];		/* CIFS user name */
358 	uchar_t pk_lmhash[SMBIOC_HASH_SZ];	/* LanMan p/w hash */
359 	uchar_t pk_nthash[SMBIOC_HASH_SZ];	/* NTLM p/w hash */
360 } smbioc_pk_t;
361 
362 
363 /*
364  * Device IOCTLs
365  *
366  * Define ioctl codes the way ZFS does.
367  * The "base" value is arbitrary, and can
368  * occupy the high word if we like, because
369  * our driver does its own copyin/copyout.
370  * Keep GETVERS first and use it to verify
371  * driver compatibility with the library.
372  */
373 #define	SMBIOC_BASE 	((('n' << 8) | 's') << 8)
374 typedef enum nsmb_ioc {
375 	SMBIOC_GETVERS = SMBIOC_BASE,	/* keep first */
376 	SMBIOC_FLAGS2,		/* get hflags2 */
377 	SMBIOC_GETSSNKEY,	/* get SMB session key */
378 
379 	SMBIOC_REQUEST,		/* simple request */
380 	SMBIOC_T2RQ,		/* trans2 request */
381 	SMBIOC_READ,		/* read (pipe) */
382 	SMBIOC_WRITE,		/* write (pipe) */
383 
384 	SMBIOC_SSN_CREATE,
385 	SMBIOC_SSN_FIND,
386 	SMBIOC_SSN_KILL,	/* force disconnect */
387 	SMBIOC_SSN_RELE,	/* drop our reference */
388 
389 	SMBIOC_TREE_CONNECT,	/* create and connect */
390 	SMBIOC_TREE_FIND,
391 	SMBIOC_TREE_KILL,
392 	SMBIOC_TREE_RELE,
393 
394 	SMBIOC_IOD_WORK,	/* work on session requests */
395 	SMBIOC_IOD_IDLE,	/* wait for requests on this session */
396 	SMBIOC_IOD_RCFAIL,	/* notify that reconnect failed */
397 
398 	/* Password Keychain (PK) support. */
399 	SMBIOC_PK_ADD,    /* Add/Modify a password entry */
400 	SMBIOC_PK_CHK,    /* Check for a password entry */
401 	SMBIOC_PK_DEL,    /* Delete specified password entry */
402 	SMBIOC_PK_DEL_OWNER,	/* all owned by the caller */
403 	SMBIOC_PK_DEL_EVERYONE	/* all owned by everyone */
404 } nsmb_ioc_t;
405 
406 #endif /* _NETSMB_DEV_H_ */
407