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