2 * Copyright (c) 2000-2001 Boris Popov
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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
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.
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.
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.
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.
167 #ifdef _LITTLE_ENDIAN
168 #define lp_ptr _lp_p2[0]
169 #define lp_pad _lp_p2[1]
171 #define lp_pad _lp_p2[0]
172 #define lp_ptr _lp_p2[1]
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
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
{
232 smbioc_oshare_t tc_sh
;
237 * Negotiated protocol parameters
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 */
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.
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 */
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
{
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
{
296 uint8_t ioc_errclass
;
299 uint32_t ioc_tbufsz
; /* transmit */
300 uint32_t ioc_rbufsz
; /* receive */
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
;
320 uint8_t ioc_errclass
;
323 uint16_t ioc_rpflags2
;
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 */
342 typedef struct smbioc_rw
{
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
;
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
];
360 typedef struct smbioc_printjob
{
361 uint16_t ioc_setuplen
;
363 char ioc_title
[SMBIOC_MAX_NAME
];
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 */
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 */
404 SMBIOC_SSN_KILL
, /* force disconnect */
405 SMBIOC_SSN_RELE
, /* drop our reference */
407 SMBIOC_TREE_CONNECT
, /* create and connect */
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 */
424 #endif /* _NETSMB_DEV_H_ */