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_conn.h,v 1.32.42.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 _SMB_CONN_H
  42 #define _SMB_CONN_H
  43 
  44 #include <sys/dditypes.h>
  45 #include <sys/t_lock.h>
  46 #include <sys/queue.h> /* for SLIST below */
  47 #include <sys/uio.h>
  48 #include <netsmb/smb_dev.h>
  49 
  50 /*
  51  * Credentials of user/process for processing in the connection procedures
  52  */
  53 typedef struct smb_cred {
  54         struct cred *scr_cred;
  55 } smb_cred_t;
  56 
  57 /*
  58  * Common object flags
  59  */
  60 #define SMBO_GONE               0x1000000
  61 
  62 /*
  63  * Bits in vc_flags (a.k.a. vc_co.co_flags)
  64  * Many of these were duplicates of SMBVOPT_ flags
  65  * and we now keep those too instead of merging
  66  * them into vc_flags.
  67  */
  68 
  69 #define SMBV_WIN95              0x0010  /* used to apply bugfixes for this OS */
  70 #define SMBV_NT4                0x0020  /* used when NT4 issues invalid resp */
  71 #define SMBV_UNICODE            0x0040  /* conn configured to use Unicode */
  72 
  73 /*
  74  * Note: the common "obj" level uses this GONE flag by
  75  * the name SMBO_GONE.  Keep this alias as a reminder.
  76  */
  77 #define SMBV_GONE               SMBO_GONE
  78 
  79 /*
  80  * bits in smb_share ss_flags (a.k.a. ss_co.co_flags)
  81  */
  82 #define SMBS_RECONNECTING       0x0002
  83 #define SMBS_CONNECTED          0x0004
  84 #define SMBS_TCON_WAIT          0x0008
  85 #define SMBS_FST_FAT            0x0010  /* share FS Type is FAT */
  86 /*
  87  * Note: the common "obj" level uses this GONE flag by
  88  * the name SMBO_GONE.  Keep this alias as a reminder.
  89  */
  90 #define SMBS_GONE               SMBO_GONE
  91 
  92 struct smb_rq;
  93 /* This declares struct smb_rqhead */
  94 TAILQ_HEAD(smb_rqhead, smb_rq);
  95 
  96 #define SMB_NBTIMO      15
  97 #define SMB_DEFRQTIMO   30      /* 30 for oplock revoke/writeback */
  98 #define SMBWRTTIMO      60
  99 #define SMBSSNSETUPTIMO 60
 100 #define SMBNOREPLYWAIT (0)
 101 
 102 #define SMB_DIALECT(vcp)        ((vcp)->vc_sopt.sv_proto)
 103 
 104 /*
 105  * Connection object
 106  */
 107 
 108 #define SMB_CO_LOCK(cp)         mutex_enter(&(cp)->co_lock)
 109 #define SMB_CO_UNLOCK(cp)       mutex_exit(&(cp)->co_lock)
 110 
 111 /*
 112  * Common part of smb_vc, smb_share
 113  * Locking: co_lock protects most
 114  * fields in this struct, except
 115  * as noted below:
 116  */
 117 struct smb_connobj {
 118         kmutex_t                co_lock;
 119         int                     co_level;       /* SMBL_ */
 120         int                     co_flags;
 121         int                     co_usecount;
 122 
 123         /* Note: must lock co_parent before child. */
 124         struct smb_connobj      *co_parent;
 125 
 126         /* this.co_lock protects the co_children list */
 127         SLIST_HEAD(, smb_connobj) co_children;
 128 
 129         /*
 130          * Linkage in parent's list of children.
 131          * Must hold parent.co_lock to traverse.
 132          */
 133         SLIST_ENTRY(smb_connobj) co_next;
 134 
 135         /* These two are set only at creation. */
 136         void (*co_gone)(struct smb_connobj *);
 137         void (*co_free)(struct smb_connobj *);
 138 };
 139 typedef struct smb_connobj smb_connobj_t;
 140 
 141 /*
 142  * "Level" in the connection object hierarchy
 143  */
 144 #define SMBL_SM         0
 145 #define SMBL_VC         1
 146 #define SMBL_SHARE      2
 147 
 148 /*
 149  * Virtual Circuit to a server (really connection + session).
 150  * Yes, calling this a "Virtual Circuit" is confusining,
 151  * because it has nothing to do with the SMB notion of a
 152  * "Virtual Circuit".
 153  */
 154 typedef struct smb_vc {
 155         struct smb_connobj      vc_co;  /* keep first! See CPTOVC */
 156         enum smbiod_state       vc_state;
 157         kcondvar_t              vc_statechg;
 158 
 159         zoneid_t                vc_zoneid;
 160         uid_t                   vc_owner;       /* Unix owner */
 161         int                     vc_genid;       /* "generation" ID */
 162 
 163         int                     vc_mackeylen;   /* length of MAC key */
 164         uint8_t                 *vc_mackey;     /* MAC key */
 165 
 166         ksema_t                 vc_sendlock;
 167         struct smb_tran_desc    *vc_tdesc;      /* transport ops. vector */
 168         void                    *vc_tdata;      /* transport control block */
 169 
 170         kcondvar_t              iod_idle;       /* IOD thread idle CV */
 171         krwlock_t               iod_rqlock;     /* iod_rqlist */
 172         struct smb_rqhead       iod_rqlist;     /* list of outstanding reqs */
 173         struct _kthread         *iod_thr;       /* the IOD (reader) thread */
 174         int                     iod_flags;      /* see SMBIOD_* below */
 175         int                     iod_newrq;      /* send needed (iod_rqlock) */
 176         int                     iod_muxfull;    /* maxmux limit reached */
 177 
 178         /* This is copied in/out when IOD enters/returns */
 179         smbioc_ssn_work_t       vc_work;
 180 
 181         /* session identity, etc. */
 182         smbioc_ossn_t           vc_ssn;
 183 } smb_vc_t;
 184 
 185 #define vc_lock         vc_co.co_lock
 186 #define vc_flags        vc_co.co_flags
 187 
 188 /* defines for members in vc_ssn */
 189 #define vc_owner        vc_ssn.ssn_owner
 190 #define vc_srvname      vc_ssn.ssn_srvname
 191 #define vc_srvaddr      vc_ssn.ssn_id.id_srvaddr
 192 #define vc_domain       vc_ssn.ssn_id.id_domain
 193 #define vc_username     vc_ssn.ssn_id.id_user
 194 #define vc_vopt         vc_ssn.ssn_vopt
 195 
 196 /* defines for members in vc_work */
 197 #define vc_sopt         vc_work.wk_sopt
 198 #define vc_maxmux       vc_work.wk_sopt.sv_maxmux
 199 #define vc_tran_fd      vc_work.wk_iods.is_tran_fd
 200 #define vc_hflags       vc_work.wk_iods.is_hflags
 201 #define vc_hflags2      vc_work.wk_iods.is_hflags2
 202 #define vc_smbuid       vc_work.wk_iods.is_smbuid
 203 #define vc_next_mid     vc_work.wk_iods.is_next_mid
 204 #define vc_txmax        vc_work.wk_iods.is_txmax
 205 #define vc_rwmax        vc_work.wk_iods.is_rwmax
 206 #define vc_rxmax        vc_work.wk_iods.is_rxmax
 207 #define vc_wxmax        vc_work.wk_iods.is_wxmax
 208 #define vc_ssn_key      vc_work.wk_iods.is_ssn_key
 209 #define vc_next_seq     vc_work.wk_iods.is_next_seq
 210 #define vc_u_mackey     vc_work.wk_iods.is_u_mackey
 211 #define vc_u_maclen     vc_work.wk_iods.is_u_maclen
 212 
 213 #define SMB_VC_LOCK(vcp)        mutex_enter(&(vcp)->vc_lock)
 214 #define SMB_VC_UNLOCK(vcp)      mutex_exit(&(vcp)->vc_lock)
 215 
 216 #define SMB_UNICODE_STRINGS(vcp)        ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE)
 217 
 218 /* Bits in iod_flags */
 219 #define SMBIOD_RUNNING          0x0001
 220 #define SMBIOD_SHUTDOWN         0x0002
 221 
 222 /*
 223  * smb_share structure describes connection to the given SMB share (tree).
 224  * Connection to share is always built on top of the VC.
 225  */
 226 
 227 typedef struct smb_share {
 228         struct smb_connobj ss_co;       /* keep first! See CPTOSS */
 229         kcondvar_t      ss_conn_done;   /* wait for reconnect */
 230         int             ss_conn_waiters;
 231         int             ss_vcgenid;     /* check VC generation ID */
 232         uint16_t        ss_tid;         /* TID */
 233         uint16_t        ss_options;     /* option support bits */
 234         smbioc_oshare_t ss_ioc;
 235 } smb_share_t;
 236 
 237 #define ss_lock         ss_co.co_lock
 238 #define ss_flags        ss_co.co_flags
 239 
 240 #define ss_use          ss_ioc.sh_use
 241 #define ss_type         ss_ioc.sh_type
 242 #define ss_name         ss_ioc.sh_name
 243 #define ss_pass         ss_ioc.sh_pass
 244 
 245 #define SMB_SS_LOCK(ssp)        mutex_enter(&(ssp)->ss_lock)
 246 #define SMB_SS_UNLOCK(ssp)      mutex_exit(&(ssp)->ss_lock)
 247 
 248 #define CPTOVC(cp)      ((struct smb_vc *)((void *)(cp)))
 249 #define VCTOCP(vcp)     (&(vcp)->vc_co)
 250 
 251 #define CPTOSS(cp)      ((struct smb_share *)((void *)(cp)))
 252 #define SSTOVC(ssp)     CPTOVC(((ssp)->ss_co.co_parent))
 253 #define SSTOCP(ssp)     (&(ssp)->ss_co)
 254 
 255 /*
 256  * Call-back operations vector, so the netsmb module
 257  * can notify smbfs about events affecting mounts.
 258  * Installed in netsmb after smbfs loads.
 259  */
 260 typedef struct smb_fscb {
 261         /* Called when the VC has disconnected. */
 262         void (*fscb_disconn)(smb_share_t *);
 263         /* Called when the VC has reconnected. */
 264         void (*fscb_connect)(smb_share_t *);
 265         /* Called when the server becomes unresponsive. */
 266         void (*fscb_down)(smb_share_t *);
 267         /* Called when the server is responding again. */
 268         void (*fscb_up)(smb_share_t *);
 269 } smb_fscb_t;
 270 /* Install the above vector, or pass NULL to clear it. */
 271 void smb_fscb_set(smb_fscb_t *);
 272 
 273 /*
 274  * The driver per open instance object.
 275  * Mostly used in: smb_dev.c, smb_usr.c
 276  */
 277 typedef struct smb_dev {
 278         kmutex_t        sd_lock;
 279         struct smb_vc   *sd_vc;         /* Reference to VC */
 280         struct smb_share *sd_share;     /* Reference to share if any */
 281         int             sd_level;       /* SMBL_VC, ... */
 282         int             sd_vcgenid;     /* Generation of share or VC */
 283         int             sd_poll;        /* Future use */
 284         int             sd_flags;       /* State of connection */
 285 #define NSMBFL_OPEN             0x0001
 286 #define NSMBFL_IOD              0x0002
 287 #define NSMBFL_IOCTL            0x0004
 288         int             sd_smbfid;      /* library read/write */
 289         zoneid_t        zoneid;         /* Zone id */
 290 } smb_dev_t;
 291 
 292 extern const uint32_t nsmb_version;
 293 
 294 /*
 295  * smb_dev.c
 296  */
 297 int  smb_dev2share(int fd, struct smb_share **sspp);
 298 
 299 
 300 /*
 301  * smb_usr.c
 302  */
 303 int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags);
 304 int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags);
 305 int smb_usr_dup_dev(smb_dev_t *sdp, intptr_t arg, int flags);
 306 
 307 int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
 308 int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
 309 
 310 int smb_usr_closefh(smb_dev_t *, cred_t *);
 311 int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr);
 312 int smb_usr_ntcreate(smb_dev_t *, intptr_t, int, cred_t *);
 313 int smb_usr_printjob(smb_dev_t *, intptr_t, int, cred_t *);
 314 
 315 int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *);
 316 int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd);
 317 
 318 int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *);
 319 int smb_usr_drop_tree(smb_dev_t *sdp, int cmd);
 320 
 321 int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
 322 int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags);
 323 
 324 
 325 /*
 326  * IOD functions
 327  */
 328 int  smb_iod_create(smb_vc_t *vcp);
 329 int  smb_iod_destroy(smb_vc_t *vcp);
 330 int  smb_iod_connect(smb_vc_t *vcp);
 331 void smb_iod_disconnect(smb_vc_t *vcp);
 332 int  smb_iod_addrq(struct smb_rq *rqp);
 333 int  smb_iod_multirq(struct smb_rq *rqp);
 334 int  smb_iod_waitrq(struct smb_rq *rqp);
 335 void smb_iod_removerq(struct smb_rq *rqp);
 336 void smb_iod_shutdown_share(smb_share_t *ssp);
 337 
 338 void smb_iod_sendall(smb_vc_t *);
 339 int smb_iod_recvall(smb_vc_t *);
 340 
 341 int smb_iod_vc_work(smb_vc_t *, cred_t *);
 342 int smb_iod_vc_idle(smb_vc_t *);
 343 int smb_iod_vc_rcfail(smb_vc_t *);
 344 int smb_iod_reconnect(smb_vc_t *);
 345 
 346 /*
 347  * Session level functions
 348  */
 349 int  smb_sm_init(void);
 350 int  smb_sm_idle(void);
 351 void smb_sm_done(void);
 352 
 353 /*
 354  * VC level functions
 355  */
 356 void smb_vc_hold(smb_vc_t *vcp);
 357 void smb_vc_rele(smb_vc_t *vcp);
 358 void smb_vc_kill(smb_vc_t *vcp);
 359 
 360 int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **);
 361 int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp);
 362 
 363 const char *smb_vc_getpass(smb_vc_t *vcp);
 364 uint16_t smb_vc_nextmid(smb_vc_t *vcp);
 365 void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers);
 366 
 367 typedef void (*walk_share_func_t)(smb_share_t *);
 368 void smb_vc_walkshares(struct smb_vc *, walk_share_func_t);
 369 
 370 /*
 371  * share level functions
 372  */
 373 
 374 int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *,
 375         smb_share_t **, smb_cred_t *);
 376 
 377 void smb_share_hold(smb_share_t *ssp);
 378 void smb_share_rele(smb_share_t *ssp);
 379 void smb_share_kill(smb_share_t *ssp);
 380 
 381 void smb_share_invalidate(smb_share_t *ssp);
 382 int  smb_share_tcon(smb_share_t *, smb_cred_t *);
 383 
 384 #endif /* _SMB_CONN_H */