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