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];
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_ */
|
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];
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_ */
|