Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)
NEX-16824 SMB client connection setup rework
NEX-17232 SMB client reconnect failures
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (improve debug)


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