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