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