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 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_0302 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]; 181 #ifdef _LITTLE_ENDIAN 182 #define lp_ptr _lp_p2[0] 183 #define lp_pad _lp_p2[1] 184 #else /* _ENDIAN */ 185 #define lp_pad _lp_p2[0] 186 #define lp_ptr _lp_p2[1] 187 #endif /* _ENDIAN */ 188 #endif /* _ILP32 */ 189 } lptr_t; 190 191 /* 192 * Handy union of sockaddr types we use. 193 * Type discriminator is sa_family 194 */ 195 union smbioc_sockaddr { 196 struct sockaddr sa; /* generic */ 197 struct sockaddr_in sin; 198 struct sockaddr_in6 sin6; 199 }; 200 typedef union smbioc_sockaddr smbioc_sockaddr_t; 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_ */ 367