Merge remote-tracking branch 'origin/master'
[unleashed/lotheac.git] / usr / src / uts / common / netsmb / smb_dev.h
blobd2e769006242ad68218a1bf8f1096e690923e008
1 /*
2 * Copyright (c) 2000-2001 Boris Popov
3 * All rights reserved.
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.
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.
32 * $Id: smb_dev.h,v 1.10.178.1 2005/05/27 02:35:29 lindak Exp $
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.
41 #ifndef _NETSMB_DEV_H_
42 #define _NETSMB_DEV_H_
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.
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.
59 * Also, remember to "bump" NSMB_VER below when
60 * any part of this user/kernel I/F changes.
63 #include <sys/types.h>
64 #include <sys/socket_impl.h>
65 #include <netinet/in.h>
67 #define NSMB_NAME "nsmb"
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.
74 #define NSMB_VERMAJ 1
75 #define NSMB_VERMIN 4000
76 #define NSMB_VERSION (NSMB_VERMAJ * 100000 + NSMB_VERMIN)
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.
83 * EBADRPC is used for message decoding errors.
84 * EAUTH is used for CIFS authentication errors.
86 #ifndef EBADRPC
87 #define EBADRPC 113
88 #endif
89 #ifndef EAUTH
90 #define EAUTH 114
91 #endif
94 * Upper/lower case options
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 */
101 * access mode stuff (see also smb_lib.h)
103 #define SMBM_ANY_OWNER ((uid_t)-1)
104 #define SMBM_ANY_GROUP ((gid_t)-1)
107 * Option flags in smbioc_ossn.ioc_opt
108 * and vcspec.optflags
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 */
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 */
123 * Option flags in smbioc_oshare.ioc_opt
124 * and sharespec.optflags
126 #define SMBSOPT_CREATE SMBVOPT_CREATE
127 #define SMBSOPT_PERMANENT SMBVOPT_PERMANENT
129 /* All user and machine names. */
130 #define SMBIOC_MAX_NAME 256
133 * Size of storage for p/w hashes.
134 * Also for SMBIOC_GETSSNKEY.
136 #define SMBIOC_HASH_SZ 16
139 * network IO daemon states
140 * really connection states.
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 */
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.
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;
178 * Handy union of sockaddr types we use.
179 * Type discriminator is sa_family
181 union smbioc_sockaddr {
182 struct sockaddr sa; /* generic */
183 struct sockaddr_in sin;
184 struct sockaddr_in6 sin6;
186 typedef union smbioc_sockaddr smbioc_sockaddr_t;
189 * This is what identifies a session.
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];
196 typedef struct smbioc_ssn_ident smbioc_ssn_ident_t;
199 * Flags for smbioc_ossn.ssn_opt
201 #define SMBLK_CREATE SMBVOPT_CREATE
204 * Structure used with SMBIOC_SSN_FIND, _CREATE
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];
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
219 * Structure used with SMBIOC_TREE_FIND, _CONNECT
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];
227 typedef struct smbioc_oshare smbioc_oshare_t;
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;
237 * Negotiated protocol parameters
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_ */
251 typedef struct smb_sopt smb_sopt_t;
254 * State carried in/out of the driver by the IOD thread.
255 * Inside the driver, these are members of the "VC" object.
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! */
274 typedef struct smb_iods smb_iods_t;
277 * This is the operational state information passed
278 * in and out of the driver for SMBIOC_SSN_WORK
280 struct smbioc_ssn_work {
281 smb_iods_t wk_iods;
282 smb_sopt_t wk_sopt;
283 int wk_out_state;
285 typedef struct smbioc_ssn_work smbioc_ssn_work_t;
288 * User-level SMB requests
292 * SMBIOC_REQUEST (simple SMB request)
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
308 #define SMBIOC_T2RQ_MAXSETUP 4
309 #define SMBIOC_T2RQ_MAXNAME 128
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
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;
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
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;
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;
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;
377 * Device IOCTLs
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.
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 */
393 SMBIOC_REQUEST, /* simple request */
394 SMBIOC_T2RQ, /* trans2 request */
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 */
402 SMBIOC_SSN_CREATE,
403 SMBIOC_SSN_FIND,
404 SMBIOC_SSN_KILL, /* force disconnect */
405 SMBIOC_SSN_RELE, /* drop our reference */
407 SMBIOC_TREE_CONNECT, /* create and connect */
408 SMBIOC_TREE_FIND,
409 SMBIOC_TREE_KILL,
410 SMBIOC_TREE_RELE,
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 */
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;
424 #endif /* _NETSMB_DEV_H_ */