The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netsmb/smb_conn.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: smb_conn.h,v 1.17 2005/12/11 12:25:16 christos Exp $   */
    2 
    3 /*
    4  * Copyright (c) 2000-2001 Boris Popov
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *    This product includes software developed by Boris Popov.
   18  * 4. Neither the name of the author nor the names of any co-contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  *
   34  * FreeBSD: src/sys/netsmb/smb_conn.h,v 1.8 2002/09/16 10:50:38 bp Exp
   35  */
   36 
   37 #ifndef _NETSMB_SMB_CONN_H_
   38 #define _NETSMB_SMB_CONN_H_
   39 
   40 /*
   41  * Two levels of connection hierarchy
   42  */
   43 #define SMBL_SM         0
   44 #define SMBL_VC         1
   45 #define SMBL_SHARE      2
   46 #define SMBL_NUM        3
   47 #define SMBL_NONE       (-1)
   48 
   49 #define SMB_CS_NONE     0x0000
   50 #define SMB_CS_UPPER    0x0001          /* convert passed string to upper case */
   51 #define SMB_CS_LOWER    0x0002          /* convert passed string to lower case */
   52 
   53 /*
   54  * Common object flags
   55  */
   56 #define SMBO_GONE               0x1000000
   57 
   58 /*
   59  * access modes
   60  */
   61 #define SMBM_READ               0400    /* read conn attrs.(like list shares) */
   62 #define SMBM_WRITE              0200    /* modify conn attrs */
   63 #define SMBM_EXEC               0100    /* can send SMB requests */
   64 #define SMBM_READGRP            0040
   65 #define SMBM_WRITEGRP           0020
   66 #define SMBM_EXECGRP            0010
   67 #define SMBM_READOTH            0004
   68 #define SMBM_WRITEOTH           0002
   69 #define SMBM_EXECOTH            0001
   70 #define SMBM_MASK               0777
   71 #define SMBM_EXACT              010000  /* check for specified mode exactly */
   72 #define SMBM_ALL                (SMBM_READ | SMBM_WRITE | SMBM_EXEC)
   73 #define SMBM_DEFAULT            (SMBM_READ | SMBM_WRITE | SMBM_EXEC)
   74 #define SMBM_ANY_OWNER          ((uid_t)-1)
   75 #define SMBM_ANY_GROUP          ((gid_t)-1)
   76 
   77 /*
   78  * VC flags
   79  */
   80 #define SMBV_PERMANENT          0x0002
   81 #define SMBV_LONGNAMES          0x0004  /* connection is configured to use long names */
   82 #define SMBV_ENCRYPT            0x0008  /* server asked for encrypted password */
   83 #define SMBV_WIN95              0x0010  /* used to apply bugfixes for this OS */
   84 #define SMBV_PRIVATE            0x0020  /* connection can be used only by creator */
   85 #define SMBV_RECONNECTING       0x0040  /* conn is in the process of reconnection */
   86 #define SMBV_SINGLESHARE        0x0080  /* only one share connecting should be allowed */
   87 #define SMBV_CREATE             0x0100  /* lookup for create operation */
   88 /*#define SMBV_FAILED           0x0200*/        /* last reconnect attempt has failed */
   89 #define SMBV_UNICODE            0x0400  /* connection is configured to use Unicode */
   90 
   91 
   92 /*
   93  * smb_share flags
   94  */
   95 #define SMBS_PERMANENT          0x0001
   96 #define SMBS_RECONNECTING       0x0002
   97 #define SMBS_CONNECTED          0x0004
   98 
   99 /*
  100  * share types
  101  */
  102 #define SMB_ST_DISK             0x0     /* A: */
  103 #define SMB_ST_PRINTER          0x1     /* LPT: */
  104 #define SMB_ST_PIPE             0x2     /* IPC */
  105 #define SMB_ST_COMM             0x3     /* COMM */
  106 #define SMB_ST_ANY              0x4
  107 #define SMB_ST_MAX              0x4
  108 #define SMB_ST_NONE             0xff    /* not a part of protocol */
  109 
  110 /*
  111  * Negotiated protocol parameters
  112  */
  113 struct smb_sopt {
  114         int             sv_proto;
  115         int16_t         sv_tz;          /* offset in min relative to UTC */
  116         u_int32_t       sv_maxtx;       /* maximum transmit buf size */
  117         u_int16_t       sv_sm;          /* security mode */
  118         u_int16_t       sv_maxmux;      /* max number of outstanding rq's */
  119         u_int16_t       sv_maxvcs;      /* max number of VCs */
  120         u_int16_t       sv_rawmode;
  121         u_int32_t       sv_maxraw;      /* maximum raw-buffer size */
  122         u_int32_t       sv_skey;        /* session key */
  123         u_int32_t       sv_caps;        /* capabilities SMB_CAP_ */
  124 };
  125 
  126 /*
  127  * network IO daemon states
  128  */
  129 enum smbiod_state {
  130         SMBIOD_ST_NOTCONN,      /* no connect request was made */
  131         SMBIOD_ST_RECONNECT,    /* a [re]connect attempt is in progress */
  132         SMBIOD_ST_TRANACTIVE,   /* transport level is up */
  133         SMBIOD_ST_VCACTIVE,     /* session established */
  134         SMBIOD_ST_DEAD          /* connection broken, transport is down */
  135 };
  136 
  137 
  138 /*
  139  * Info structures
  140  */
  141 #define SMB_INFO_NONE           0
  142 #define SMB_INFO_VC             2
  143 #define SMB_INFO_SHARE          3
  144 
  145 struct smb_vc_info {
  146         int             itype;
  147         int             usecount;
  148         uid_t           uid;            /* user id of connection */
  149         gid_t           gid;            /* group of connection */
  150         mode_t          mode;           /* access mode */
  151         int             flags;
  152         enum smbiod_state iodstate;
  153         struct smb_sopt sopt;
  154         char            srvname[SMB_MAXSRVNAMELEN];
  155         char            vcname[128];
  156 };
  157 
  158 struct smb_share_info {
  159         int             itype;
  160         int             usecount;
  161         u_short         tid;            /* TID */
  162         int             type;           /* share type */
  163         uid_t           uid;            /* user id of connection */
  164         gid_t           gid;            /* group of connection */
  165         mode_t          mode;           /* access mode */
  166         int             flags;
  167         char            sname[128];
  168 };
  169 
  170 #ifdef _KERNEL
  171 
  172 #include <sys/lock.h>
  173 #include <netsmb/smb_subr.h>
  174 
  175 #define CONNADDREQ(a1,a2)       ((a1)->sa_len == (a2)->sa_len && \
  176                                  bcmp(a1, a2, (a1)->sa_len) == 0)
  177 
  178 struct smb_vc;
  179 struct smb_share;
  180 struct smb_cred;
  181 struct smb_rq;
  182 struct mbdata;
  183 struct smbioc_oshare;
  184 struct smbioc_ossn;
  185 struct uio;
  186 
  187 #define SMB_DIALECT(vcp)        ((vcp)->vc_sopt.sv_proto)
  188 #define SMB_CAPS(vcp)           ((vcp)->vc_sopt.sv_caps)
  189 
  190 struct smb_tran_desc;
  191 
  192 /*
  193  * Connection object
  194  */
  195 struct smb_connobj;
  196 
  197 typedef void smb_co_gone_t (struct smb_connobj *cp, struct smb_cred *scred);
  198 typedef void smb_co_free_t (struct smb_connobj *cp);
  199 
  200 #define SMB_CO_LOCK(cp)         smb_sl_lock(&(cp)->co_interlock)
  201 #define SMB_CO_UNLOCK(cp)       smb_sl_unlock(&(cp)->co_interlock)
  202 
  203 struct smb_connobj {
  204         int                     co_level;       /* SMBL_ */
  205         int                     co_flags;
  206         struct lock             co_lock;
  207         struct smb_slock        co_interlock;
  208         int                     co_usecount;
  209         struct smb_connobj *    co_parent;
  210         SLIST_HEAD(,smb_connobj)co_children;
  211         SLIST_ENTRY(smb_connobj)co_next;
  212         smb_co_gone_t *         co_gone;
  213         smb_co_free_t *         co_free;
  214 };
  215 
  216 #define SMBCO_FOREACH(var, cp)  SLIST_FOREACH((var), &(cp)->co_children, co_next)
  217 
  218 /*
  219  * Virtual Circuit (session) to a server.
  220  * This is the most (over)complicated part of SMB protocol.
  221  * For the user security level (usl), each session with different remote
  222  * user name has its own VC.
  223  * It is unclear however, should share security level (ssl) allow additional
  224  * VCs, because user name is not used and can be the same. On other hand,
  225  * multiple VCs allows us to create separate sessions to server on a per
  226  * user basis.
  227  */
  228 
  229 /*
  230  * This lock protects vc_flags
  231  */
  232 #define SMBC_ST_LOCK(vcp)       smb_sl_lock(&(vcp)->vc_stlock)
  233 #define SMBC_ST_UNLOCK(vcp)     smb_sl_unlock(&(vcp)->vc_stlock)
  234 
  235 
  236 struct smb_vc {
  237         struct smb_connobj obj;
  238         char *          vc_srvname;
  239         struct sockaddr*vc_paddr;       /* server addr */
  240         struct sockaddr*vc_laddr;       /* local addr, if any */
  241         char *          vc_username;
  242         char *          vc_pass;        /* password for usl case */
  243         char *          vc_domain;      /* workgroup/primary domain */
  244 
  245         int             vc_maxvcs;      /* maximum number of VC per connection */
  246 
  247         void *          vc_tolower;     /* local charset */
  248         void *          vc_toupper;     /* local charset */
  249         void *          vc_toserver;    /* local charset to server one */
  250         void *          vc_tolocal;     /* server charset to local one */
  251         int             vc_number;      /* number of this VC from the client side */
  252         int             vc_genid;
  253         uid_t           vc_uid;         /* user id of connection */
  254         gid_t           vc_grp;         /* group of connection */
  255         mode_t          vc_mode;        /* access mode */
  256         struct tnode *  vc_tnode;       /* backing object */
  257         u_short         vc_smbuid;      /* unique vc id assigned by server */
  258 
  259         u_char          vc_hflags;      /* or'ed with flags in the smb header */
  260         u_short         vc_hflags2;     /* or'ed with flags in the smb header */
  261         void *          vc_tdata;       /* transport control block */
  262         struct smb_tran_desc *vc_tdesc;
  263         int             vc_chlen;       /* actual challenge length */
  264         u_char          vc_ch[SMB_MAXCHALLENGELEN];
  265         u_short         vc_mid;         /* multiplex id */
  266         struct smb_sopt vc_sopt;        /* server options */
  267         size_t          vc_txmax;       /* max tx/rx packet size */
  268         size_t          vc_rxmax;       /* max readx data size */
  269         size_t          vc_wxmax;       /* max writex data size */
  270         struct smbiod * vc_iod;
  271         struct smb_slock vc_stlock;
  272 };
  273 
  274 #define vc_maxmux       vc_sopt.sv_maxmux
  275 #define vc_flags        obj.co_flags
  276 
  277 #define SMB_UNICODE_STRINGS(vcp)        ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE)
  278 
  279 /*
  280  * smb_share structure describes connection to the given SMB share (tree).
  281  * Connection to share is always built on top of the VC.
  282  */
  283 
  284 /*
  285  * This lock protects ss_flags
  286  */
  287 #define SMBS_ST_LOCK(ssp)       smb_sl_lock(&(ssp)->ss_stlock)
  288 #define SMBS_ST_LOCKPTR(ssp)    (&(ssp)->ss_stlock)
  289 #define SMBS_ST_UNLOCK(ssp)     smb_sl_unlock(&(ssp)->ss_stlock)
  290 
  291 struct smb_share {
  292         struct smb_connobj obj;
  293         char *          ss_name;
  294         u_short         ss_tid;         /* TID */
  295         int             ss_type;        /* share type */
  296         uid_t           ss_uid;         /* user id of connection */
  297         gid_t           ss_grp;         /* group of connection */
  298         mode_t          ss_mode;        /* access mode */
  299         int             ss_vcgenid;
  300         char *          ss_pass;        /* password to a share, can be null */
  301         struct smb_slock ss_stlock;
  302 };
  303 
  304 #define ss_flags        obj.co_flags
  305 
  306 #define CPTOVC(cp)      ((struct smb_vc*)(cp))
  307 #define VCTOCP(vcp)     (&(vcp)->obj)
  308 #define CPTOSS(cp)      ((struct smb_share*)(cp))
  309 #define SSTOVC(ssp)     CPTOVC(((ssp)->obj.co_parent))
  310 #define SSTOCP(ssp)     (&(ssp)->obj)
  311 
  312 struct smb_vcspec {
  313         char *          srvname;
  314         struct sockaddr*sap;
  315         struct sockaddr*lap;
  316         int             flags;
  317         char *          username;
  318         char *          pass;
  319         char *          domain;
  320         mode_t          mode;
  321         mode_t          rights;
  322         uid_t           owner;
  323         gid_t           group;
  324         char *          localcs;
  325         char *          servercs;
  326         struct smb_sharespec *shspec;
  327         struct smb_share *ssp;          /* returned */
  328         /*
  329          * The rest is an internal data
  330          */
  331         struct smb_cred *scred;
  332 };
  333 
  334 struct smb_sharespec {
  335         char *          name;
  336         char *          pass;
  337         mode_t          mode;
  338         mode_t          rights;
  339         uid_t           owner;
  340         gid_t           group;
  341         int             stype;
  342         /*
  343          * The rest is an internal data
  344          */
  345         struct smb_cred *scred;
  346 };
  347 
  348 /*
  349  * Session level functions
  350  */
  351 int  smb_sm_init(void);
  352 int  smb_sm_done(void);
  353 int  smb_sm_lookup(struct smb_vcspec *vcspec,
  354         struct smb_sharespec *shspec, struct smb_cred *scred,
  355         struct smb_vc **vcpp);
  356 
  357 /*
  358  * Connection object
  359  */
  360 void smb_co_ref(struct smb_connobj *cp);
  361 void smb_co_rele(struct smb_connobj *cp, struct smb_cred *scred);
  362 int  smb_co_get(struct smb_connobj *cp, int flags, struct smb_cred *scred);
  363 void smb_co_put(struct smb_connobj *cp, struct smb_cred *scred);
  364 int  smb_co_lock(struct smb_connobj *cp, int flags);
  365 void smb_co_unlock(struct smb_connobj *cp, int flags);
  366 
  367 /*
  368  * session level functions
  369  */
  370 int  smb_vc_create(struct smb_vcspec *vcspec,
  371         struct smb_cred *scred, struct smb_vc **vcpp);
  372 int  smb_vc_connect(struct smb_vc *vcp, struct smb_cred *scred);
  373 int  smb_vc_access(struct smb_vc *vcp, struct smb_cred *scred, mode_t mode);
  374 int  smb_vc_get(struct smb_vc *vcp, int flags, struct smb_cred *scred);
  375 void smb_vc_put(struct smb_vc *vcp, struct smb_cred *scred);
  376 void smb_vc_ref(struct smb_vc *vcp);
  377 void smb_vc_rele(struct smb_vc *vcp, struct smb_cred *scred);
  378 int  smb_vc_lock(struct smb_vc *vcp, int flags);
  379 void smb_vc_unlock(struct smb_vc *vcp, int flags);
  380 int  smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *shspec,
  381         struct smb_cred *scred, struct smb_share **sspp);
  382 const char * smb_vc_getpass(struct smb_vc *vcp);
  383 u_short smb_vc_nextmid(struct smb_vc *vcp);
  384 
  385 /*
  386  * share level functions
  387  */
  388 int  smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec,
  389         struct smb_cred *scred, struct smb_share **sspp);
  390 int  smb_share_access(struct smb_share *ssp, struct smb_cred *scred, mode_t mode);
  391 void smb_share_ref(struct smb_share *ssp);
  392 void smb_share_rele(struct smb_share *ssp, struct smb_cred *scred);
  393 int  smb_share_get(struct smb_share *ssp, int flags, struct smb_cred *scred);
  394 void smb_share_put(struct smb_share *ssp, struct smb_cred *scred);
  395 int  smb_share_lock(struct smb_share *ssp, int flags);
  396 void smb_share_unlock(struct smb_share *ssp, int flags);
  397 int  smb_share_valid(struct smb_share *ssp);
  398 const char * smb_share_getpass(struct smb_share *ssp);
  399 
  400 /*
  401  * SMB protocol level functions
  402  */
  403 int  smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred);
  404 int  smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred);
  405 int  smb_smb_ssnclose(struct smb_vc *vcp, struct smb_cred *scred);
  406 int  smb_smb_treeconnect(struct smb_share *ssp, struct smb_cred *scred);
  407 int  smb_smb_treedisconnect(struct smb_share *ssp, struct smb_cred *scred);
  408 int  smb_read(struct smb_share *ssp, u_int16_t fid, struct uio *uio,
  409         struct smb_cred *scred);
  410 int  smb_write(struct smb_share *ssp, u_int16_t fid, struct uio *uio,
  411         struct smb_cred *scred);
  412 #if 0
  413 int  smb_smb_echo(struct smb_vc *vcp, struct smb_cred *scred);
  414 #endif
  415 
  416 /*
  417  * smbiod thread
  418  */
  419 
  420 #define SMBIOD_EV_NEWRQ         0x0001
  421 #define SMBIOD_EV_SHUTDOWN      0x0002
  422 #define SMBIOD_EV_CONNECT       0x0003
  423 #define SMBIOD_EV_DISCONNECT    0x0004
  424 #define SMBIOD_EV_TREECONNECT   0x0005
  425 #define SMBIOD_EV_MASK          0x00ff
  426 #define SMBIOD_EV_SYNC          0x0100
  427 #define SMBIOD_EV_PROCESSING    0x0200
  428 
  429 struct smbiod_event {
  430         int     ev_type;
  431         int     ev_error;
  432         void *  ev_ident;
  433         SIMPLEQ_ENTRY(smbiod_event)     ev_link;
  434 };
  435 
  436 #define SMBIOD_SHUTDOWN         0x0001
  437 
  438 struct smbiod {
  439         int                     iod_id;
  440         int                     iod_flags;
  441         enum smbiod_state       iod_state;
  442         int                     iod_muxcnt;     /* number of active outstanding requests */
  443         struct smb_vc *         iod_vc;
  444         struct smb_slock        iod_rqlock;     /* iod_rqlist, iod_muxwant */
  445         SIMPLEQ_HEAD(, smb_rq)
  446                                 iod_rqlist;     /* list of outstanding requests */
  447         int                     iod_muxwant;
  448 #ifdef __NetBSD__
  449         struct lwp *            iod_l;
  450 #else
  451         struct proc *           iod_p;
  452         struct thread *         iod_td;
  453 #endif
  454         struct smb_cred         iod_scred;
  455         struct smb_slock        iod_evlock;     /* iod_evlist */
  456         SIMPLEQ_HEAD(,smbiod_event) iod_evlist;
  457 #if 0
  458         int                     iod_sleeptimo;
  459         struct timeval          iod_lastrqsent;
  460         struct timeval          iod_pingtimo;
  461 #endif
  462 };
  463 
  464 int  smb_iod_init(void);
  465 int  smb_iod_done(void);
  466 int  smb_iod_create(struct smb_vc *vcp);
  467 int  smb_iod_destroy(struct smbiod *iod);
  468 int  smb_iod_request(struct smbiod *iod, int event, void *ident);
  469 int  smb_iod_addrq(struct smb_rq *rqp);
  470 int  smb_iod_waitrq(struct smb_rq *rqp);
  471 int  smb_iod_removerq(struct smb_rq *rqp);
  472 
  473 #endif /* _KERNEL */
  474 
  475 #endif /* !_NETSMB_SMB_CONN_H_ */

Cache object: bd5b2dc9126a15ad3b57c653cb9e2ee9


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.