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)
        
*** 32,41 ****
--- 32,43 ----
   * $Id: smb_rq.h,v 1.9 2005/01/22 22:20:58 lindak Exp $
   */
  
  /*
   * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+  * Portions Copyright (C) 2001 - 2012 Apple Inc. All rights reserved.
+  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #ifndef _NETSMB_SMB_RQ_H_
  #define _NETSMB_SMB_RQ_H_
  
*** 54,64 ****
--- 56,70 ----
  #define SMBR_NOINTR_RECV        0x0200  /* no interrupt in recv wait */
  #define SMBR_SENDWAIT           0x0400  /* waiting for send to complete */
  #define SMBR_NORECONNECT        0x0800  /* do not reconnect for this */
  /*      SMBR_VCREF              0x4000   * took vc reference (obsolete) */
  #define SMBR_MOREDATA           0x8000  /* our buffer was too small */
+ #define SMBR_COMPOUND_RQ        0x10000 /* SMB 2/3 compound request */
+ #define SMBR_ASYNC              0x20000 /* got async response */
+ #define SMBR_RECONNECTED        0x40000 /* reconnected during request */
  
+ 
  #define SMBT2_ALLSENT           0x0001  /* all data and params are sent */
  #define SMBT2_ALLRECV           0x0002  /* all data and params are received */
  #define SMBT2_ALLOCED           0x0004
  #define SMBT2_RESTART           0x0008
  #define SMBT2_NORESTART         0x0010
*** 89,103 ****
          struct mbchain          sr_rq;
          uchar_t                 sr_cmd;
          uint8_t                 sr_rqflags;
          uint16_t                sr_rqflags2;
          uint16_t                sr_rqtid;
!         uint16_t                sr_pid;
          uint16_t                sr_rquid;
          uint16_t                sr_mid;
          uchar_t                 *sr_wcount;
          uchar_t                 *sr_bcount;
          struct mdchain          sr_rp;
          int                     sr_rpgen;
          int                     sr_rplast;
          int                     sr_flags;       /* SMBR_* */
          int                     sr_rpsize;
--- 95,122 ----
          struct mbchain          sr_rq;
          uchar_t                 sr_cmd;
          uint8_t                 sr_rqflags;
          uint16_t                sr_rqflags2;
          uint16_t                sr_rqtid;
!         uint32_t                sr_pid;
          uint16_t                sr_rquid;
          uint16_t                sr_mid;
          uchar_t                 *sr_wcount;
          uchar_t                 *sr_bcount;
+ 
+         /* SMB 2/3 request fields */
+         struct smb_rq           *sr2_compound_next;
+         uint16_t                sr2_command;
+         uint16_t                sr2_totalcreditcharge;
+         uint16_t                sr2_creditcharge;
+         uint16_t                sr2_creditsrequested;
+         uint32_t                sr2_rqflags;
+         uint32_t                sr2_nextcmd;
+         uint64_t                sr2_messageid;   /* local copy of message id */
+         uint64_t                sr2_rqsessionid;
+         uint32_t                sr2_rqtreeid;
+ 
          struct mdchain          sr_rp;
          int                     sr_rpgen;
          int                     sr_rplast;
          int                     sr_flags;       /* SMBR_* */
          int                     sr_rpsize;
*** 114,132 ****
          uint16_t                sr_rpflags2;
          uint16_t                sr_rptid;
          uint16_t                sr_rppid;
          uint16_t                sr_rpuid;
          uint16_t                sr_rpmid;
  };
  typedef struct smb_rq smb_rq_t;
  
  struct smb_t2rq {
          kmutex_t        t2_lock;
          kcondvar_t      t2_cond;
          uint16_t        t2_setupcount;
          uint16_t        *t2_setupdata;
!         uint16_t        t2_setup[SMBIOC_T2RQ_MAXSETUP];
          uint8_t         t2_maxscount;   /* max setup words to return */
          uint16_t        t2_maxpcount;   /* max param bytes to return */
          uint16_t        t2_maxdcount;   /* max data bytes to return */
          uint16_t        t2_fid;         /* for T2 request */
          char            *t_name;        /* for T, must be NULL for T2 */
--- 133,160 ----
          uint16_t                sr_rpflags2;
          uint16_t                sr_rptid;
          uint16_t                sr_rppid;
          uint16_t                sr_rpuid;
          uint16_t                sr_rpmid;
+ 
+         /* SMB2 response fields */
+         uint16_t                sr2_rspcreditsgranted;
+         uint32_t                sr2_rspflags;
+         uint32_t                sr2_rspnextcmd;
+         uint32_t                sr2_rsppid;
+         uint32_t                sr2_rsptreeid;
+         uint64_t                sr2_rspasyncid;
+         uint64_t                sr2_rspsessionid;
  };
  typedef struct smb_rq smb_rq_t;
  
  struct smb_t2rq {
          kmutex_t        t2_lock;
          kcondvar_t      t2_cond;
          uint16_t        t2_setupcount;
          uint16_t        *t2_setupdata;
!         uint16_t        t2_setup[4];
          uint8_t         t2_maxscount;   /* max setup words to return */
          uint16_t        t2_maxpcount;   /* max param bytes to return */
          uint16_t        t2_maxdcount;   /* max data bytes to return */
          uint16_t        t2_fid;         /* for T2 request */
          char            *t_name;        /* for T, must be NULL for T2 */
*** 182,208 ****
  void smb_rq_done(struct smb_rq *rqp);
  int   smb_rq_alloc(struct smb_connobj *layer, uchar_t cmd,
          struct smb_cred *scred, struct smb_rq **rqpp);
  int  smb_rq_init(struct smb_rq *rqp, struct smb_connobj *layer,
          uchar_t cmd, struct smb_cred *scred);
  
  void smb_rq_fillhdr(struct smb_rq *rqp);
  void smb_rq_wstart(struct smb_rq *rqp);
  void smb_rq_wend(struct smb_rq *rqp);
  void smb_rq_bstart(struct smb_rq *rqp);
  void smb_rq_bend(struct smb_rq *rqp);
- int  smb_rq_intr(struct smb_rq *rqp);
  int  smb_rq_simple(struct smb_rq *rqp);
  int  smb_rq_simple_timed(struct smb_rq *rqp, int timeout);
  
  int  smb_t2_alloc(struct smb_connobj *layer, ushort_t setup,
          struct smb_cred *scred, struct smb_t2rq **rqpp);
  int  smb_t2_init(struct smb_t2rq *rqp, struct smb_connobj *layer,
          ushort_t *setup, int setupcnt, struct smb_cred *scred);
  void smb_t2_done(struct smb_t2rq *t2p);
  int  smb_t2_request(struct smb_t2rq *t2p);
  
  int  smb_nt_alloc(struct smb_connobj *layer, ushort_t fn,
          struct smb_cred *scred, struct smb_ntrq **rqpp);
  int  smb_nt_init(struct smb_ntrq *rqp, struct smb_connobj *layer,
          ushort_t fn, struct smb_cred *scred);
  void smb_nt_done(struct smb_ntrq *ntp);
--- 210,244 ----
  void smb_rq_done(struct smb_rq *rqp);
  int   smb_rq_alloc(struct smb_connobj *layer, uchar_t cmd,
          struct smb_cred *scred, struct smb_rq **rqpp);
  int  smb_rq_init(struct smb_rq *rqp, struct smb_connobj *layer,
          uchar_t cmd, struct smb_cred *scred);
+ int  smb_rq_getenv(struct smb_connobj *layer,
+         struct smb_vc **vcpp, struct smb_share **sspp);
  
  void smb_rq_fillhdr(struct smb_rq *rqp);
  void smb_rq_wstart(struct smb_rq *rqp);
  void smb_rq_wend(struct smb_rq *rqp);
  void smb_rq_bstart(struct smb_rq *rqp);
  void smb_rq_bend(struct smb_rq *rqp);
  int  smb_rq_simple(struct smb_rq *rqp);
  int  smb_rq_simple_timed(struct smb_rq *rqp, int timeout);
+ int  smb_rq_internal(struct smb_rq *rqp, int timeout);
  
+ int smb2_parse_smb1nego_resp(struct smb_rq *rqp);
+ 
  int  smb_t2_alloc(struct smb_connobj *layer, ushort_t setup,
          struct smb_cred *scred, struct smb_t2rq **rqpp);
  int  smb_t2_init(struct smb_t2rq *rqp, struct smb_connobj *layer,
          ushort_t *setup, int setupcnt, struct smb_cred *scred);
  void smb_t2_done(struct smb_t2rq *t2p);
  int  smb_t2_request(struct smb_t2rq *t2p);
  
+ int smb_t2_xnp(struct smb_share *ssp, uint16_t fid,
+     struct mbchain *send_mb, struct mdchain *recv_md,
+     uint32_t *data_out_sz, uint32_t *more, struct smb_cred *scrp);
+ 
  int  smb_nt_alloc(struct smb_connobj *layer, ushort_t fn,
          struct smb_cred *scred, struct smb_ntrq **rqpp);
  int  smb_nt_init(struct smb_ntrq *rqp, struct smb_connobj *layer,
          ushort_t fn, struct smb_cred *scred);
  void smb_nt_done(struct smb_ntrq *ntp);