/* $NetBSD: smb_conn.h,v 1.1 2000/12/07 03:48:10 deberg Exp $ */ /* * Copyright (c) 2000, Boris Popov * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Boris Popov. * 4. Neither the name of the author nor the names of any co-contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _NETINET_IN_H_ #include #include #include #endif /* * Three levels of connection hierarchy */ #define SMBL_CONN 0 #define SMBL_VC 1 #define SMBL_SHARE 2 #define SMBL_NUM 3 #define SMBL_NONE (-1) /* * access modes */ #define SMBM_READ 0400 /* read conn attrs.(like list shares) */ #define SMBM_WRITE 0200 /* modify conn attrs */ #define SMBM_EXEC 0100 /* can send SMB requests */ #define SMBM_READGRP 0040 #define SMBM_WRITEGRP 0020 #define SMBM_EXECGRP 0010 #define SMBM_READOTH 0004 #define SMBM_WRITEOTH 0002 #define SMBM_EXECOTH 0001 #define SMBM_MASK 0777 #define SMBM_EXACT 010000 /* check for specified mode exactly */ #define SMBM_ALL (SMBM_READ | SMBM_WRITE | SMBM_EXEC) #define SMBM_DEFAULT (SMBM_READ | SMBM_WRITE | SMBM_EXEC) #define SMBM_ANY_OWNER ((uid_t)-1) #define SMBM_ANY_GROUP ((gid_t)-1) /* * Connection flags */ #define SMBC_CREATE 0x0100 /* lookup for create opeartion */ /* * VC flags */ #define SMBV_INVALID 0x0001 #define SMBV_PERMANENT 0x0002 #define SMBV_LONGNAMES 0x0004 /* connection is configured to use long names */ #define SMBV_ENCRYPT 0x0008 /* server asked for encrypted password */ #define SMBV_WIN95 0x0010 /* used to apply bugfixes for this OS */ #define SMBV_PRIVATE 0x0020 /* connection can be (re)used only by owner */ #define SMBV_RECONNECTING 0x0040 /* conn is in the process of reconnection */ #define SMBV_SINGLESHARE 0x0080 /* only one share connectin should be allowed */ #define SMBV_LOCK 0x0400 #define SMBV_WANT 0x0800 #define SMBV_SNDLOCK 0x1000 #define SMBV_SNDWANT 0x2000 #define SMBV_RCVLOCK 0x4000 #define SMBV_RCVWANT 0x8000 #define SMBV_MXLOCK 0x010000 #define SMBV_MXWANT 0x020000 #define SMBV_RQLISTLOCK 0x040000 #define SMBV_RQLISTWANT 0x080000 /* * smb_share flags */ #define SMBS_PERMANENT 0x0001 /* * share types */ #define SMB_ST_DISK 0x0 /* A: */ #define SMB_ST_PRINTER 0x1 /* LPT: */ #define SMB_ST_PIPE 0x2 /* IPC */ #define SMB_ST_COMM 0x3 /* COMM */ #define SMB_ST_ANY 0x4 #define SMB_ST_MAX 0x4 #define SMB_ST_NONE 0xff /* not a part of protocol */ /* * Negotiated protocol parameters */ struct smb_sopt { int sv_proto; int16_t sv_tz; /* offset in min relative to UTC */ u_int32_t sv_maxtx; /* maximum transmit buf size */ u_char sv_sm; /* security mode */ u_int16_t sv_maxmux; /* max number of outstanding rq's */ u_int16_t sv_maxvcs; /* max number of VCs */ u_int16_t sv_rawmode; u_int32_t sv_maxraw; /* maximum raw-buffer size */ u_int32_t sv_skey; /* session key */ u_int32_t sv_caps; /* capabilites SMB_CAP_ */ }; /* * Info structures */ #define SMB_INFO_NONE 0 #define SMB_INFO_CONN 1 #define SMB_INFO_VC 2 #define SMB_INFO_SHARE 3 struct smb_conn_info { int itype; int usecount; int flags; char srvname[SMB_MAXSRVNAMELEN]; }; struct smb_vc_info { int itype; int usecount; uid_t uid; /* user id of connection */ gid_t gid; /* group of connection */ mode_t mode; /* access mode */ int flags; struct smb_sopt sopt; char vcname[128]; }; struct smb_share_info { int itype; int usecount; u_short id; /* TID */ int type; /* share type */ uid_t uid; /* user id of connection */ gid_t gid; /* group of connection */ mode_t mode; /* access mode */ int flags; char sname[128]; }; #ifdef _KERNEL #define CONNADDREQ(a1,a2) ((a1)->sa_len == (a2)->sa_len && \ bcmp(a1, a2, (a1)->sa_len) == 0) struct smb_vc; struct smb_share; struct smb_cred; struct smb_rq; struct mbdata; struct smbioc_oshare; struct smbioc_ossn; struct uio; TAILQ_HEAD(smb_rqhead, smb_rq); /* * Node types for connection/share hierarchy */ #define TSMB_CE TTYPE1 /* list of connections to server */ #define TSMB_CONN TTYPE2 /* server connection */ #define TSMB_VC TTYPE3 /* user/VC connection */ #define TSMB_SHARE TTYPE4 /* share/tree connection */ /* * smb_ce structure gathers all resources together (connection engine). * It is possible to declare members of this structure as separate static * variables, _but_ don't do that ! (I have some unimplemented ideas...) */ typedef struct smb_ce { int ce_conncnt; /* number of active conns */ int ce_nextconn; /* next unique id */ struct tnode * ce_tnode; /* backlink */ } *smb_rc_t; #define SMBSO_LOCK 1 #define SMBSO_UNLOCK 2 #define SMB_DEFRQTIMO 5 #define SMB_DIALECT(vcp) ((vcp)->vc_sopt.sv_proto) struct smb_tran_desc; /* * smb_conn structure describes physical connection to an SMB server. * There will be only one smb_conn structure per each server. */ struct smb_conn { int sc_index; /* unique number of connection */ u_int sc_flags; /* SMBC_* */ int sc_vcnext; /* next VC number */ int sc_vcnt; /* number of active VCs */ int sc_maxvcs; /* maximum number of VC per connection */ u_int sc_timo; /* default request timeout */ struct sockaddr*sc_paddr; /* server addr */ struct sockaddr*sc_laddr; /* local addr, if any */ struct tnode * sc_tnode; /* backing object */ struct iconv_drv *sc_tolower; /* local charset */ struct iconv_drv *sc_toupper; /* local charset */ struct iconv_drv *sc_toserver; /* local charset to server one */ struct iconv_drv *sc_tolocal; /* server charset to local one */ }; #define sc_srvname sc_tnode->t_name /* * Virtual Circuit (session) to a server. * This is the most (over)complicated part of SMB protocol. * For the user security level (usl), each session with different remote * user name has its own VC. * It is unclear however, should share security level (ssl) allow additional * VCs, because user name is not used and can be the same. On other hand, * multiple VCs allows us to create separate sessions to server on a per * user basis. */ struct smb_vc { u_short vc_id; /* unique vc id (uid) started from zero */ int vc_number; /* number of this VC from the client side */ int vc_flags; char * vc_domain; /* workgroup/primary domain */ char * vc_pass; /* password for usl case */ uid_t vc_uid; /* user id of connection */ gid_t vc_grp; /* group of connection */ mode_t vc_mode; /* access mode */ struct tnode * vc_tnode; /* backing object */ u_char vc_hflags; /* or'ed with flags in the smb header */ u_short vc_hflags2; /* or'ed with flags in the smb header */ void * vc_tdata; /* transport control block */ struct smb_tran_desc *vc_tdesc; u_int vc_locks; int vc_chlen; /* actual challenge length */ u_char vc_ch[SMB_MAXCHALLENGELEN]; u_short vc_mid; /* multiplex id */ struct smb_sopt vc_sopt; /* server options */ struct smb_rqhead vc_rqlist; /* list of outstanding requests */ struct smb_cred *vc_scred; /* used in reconnect procedure */ int vc_txmax; /* max tx/rx packet size */ int vc_muxcnt; /* number of active outstanding requests */ int vc_muxwant; }; #define vc_user vc_tnode->t_name #define vc_maxmux vc_sopt.sv_maxmux /* * smb_share structure describes connection to the given SMB share (tree). * Connection to share is always built on top of the VC. */ struct smb_share { u_short ss_id; /* TID */ int ss_type; /* share type */ uid_t ss_uid; /* user id of connection */ gid_t ss_grp; /* group of connection */ mode_t ss_mode; /* access mode */ u_int ss_flags; char * ss_pass; /* password to a share, can be null */ struct tnode * ss_tnode; /* backing object */ }; #define ss_name ss_tnode->t_name #define TNTOCE(tp) ((struct smb_ce*)(tp)->t_mdata->tm_data) #define CETOTN(ce) ((cep)->ce_tnode) #define TNTOCN(tp) ((struct smb_conn*)(tp)->t_mdata->tm_data) #define CNTOTN(scp) ((scp)->sc_tnode) #define TNTOVC(tp) ((struct smb_vc*)(tp)->t_mdata->tm_data) #define VCTOTN(vcp) ((vcp)->vc_tnode) #define TNTOSS(tp) ((struct smb_share*)(tp)->t_mdata->tm_data) #define SSTOTN(ssp) ((ssp)->ss_tnode) #define VCTOCN(vcp) TNTOCN(VCTOTN((vcp))->t_parent) #define SSTOVC(ssp) TNTOVC(SSTOTN(ssp)->t_parent) #define SSTOCN(ssp) VCTOCN(TNTOVC(SSTOTN(ssp)->t_parent)) struct smb_connspec { char * name; struct sockaddr*sap; struct smb_vcspec*vcspec; struct smb_vc * vcp; /* returned */ /* * The rest is an internal data. */ struct smb_cred * scred; }; struct smb_vcspec { int flags; char * user; mode_t mode; mode_t rights; uid_t owner; gid_t group; struct smb_sharespec *shspec; struct smb_share *ssp; /* returned */ /* * The rest is an internal data */ struct smb_cred *scred; }; struct smb_sharespec { char * name; mode_t mode; mode_t rights; uid_t owner; gid_t group; int stype; /* * The rest is an internal data */ struct smb_cred *scred; }; /* * Session level functions */ int smb_sm_init(void); int smb_sm_done(void); int smb_sm_lookup(struct smb_connspec *cnspec, struct smb_vcspec *vcspec, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_conn **scpp); /* * ce level functions */ int smb_ce_init(void); int smb_ce_lock(smb_rc_t cep, int flags, struct proc *p); void smb_ce_unlock(smb_rc_t cep, struct proc *p); /*int smb_ce_addconn(smb_rc_t cep, struct smb_conn *scp, struct proc *p);*/ int smb_ce_createconn(struct smb_connspec *cnspec, struct smb_cred *scred, struct smb_conn **scpp); /* * connection level functions */ /*int smb_conn_alloc(struct proc *p, struct ucred *cred, struct smb_conn **conn);*/ void smb_conn_rele(struct smb_conn *scp, struct smb_cred *scred); int smb_conn_get(struct smb_conn *scp, struct smb_cred *scred); void smb_conn_put(struct smb_conn *scp, struct smb_cred *scred); int smb_conn_lookupvc(struct smb_conn *scp, struct smb_vcspec *vcspec, struct smb_cred *scred, struct smb_vc **vcpp); int smb_conn_lock(struct smb_conn *scp, struct proc *p); int smb_conn_unlock(struct smb_conn *scp, struct proc *p); /* * session level functions */ int smb_vc_create(struct smb_vcspec *vcspec, char *pass, const char *domain, struct smb_conn *scp, struct smb_cred *scred, struct smb_vc **vcpp); int smb_vc_connect(struct smb_vc *vcp, struct smb_cred *scred); int smb_vc_disconnect(struct smb_vc *vcp, struct smb_cred *scred); void smb_vc_invalidate(struct smb_vc *vcp); int smb_vc_valid(struct smb_vc *vcp); int smb_vc_reconnect(struct smb_vc *vcp); int smb_vc_access(struct smb_vc *vcp, struct smb_cred *scred, mode_t mode); int smb_vc_get(struct smb_vc *vcp, struct smb_cred *scred); void smb_vc_put(struct smb_vc *vcp, struct smb_cred *scred); void smb_vc_rele(struct smb_vc *vcp, struct smb_cred *scred); void smb_vc_unlock(struct smb_vc *vcp, int flags, struct smb_cred *scred); int smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_share **sspp); char*smb_vc_pass(struct smb_vc *vcp); u_short smb_vc_nextmid(struct smb_vc *vcp); int smb_vc_tranlock(struct smb_vc *vcp, struct proc *p); int smb_vc_tranunlock(struct smb_vc *vcp, struct proc *p); int smb_vc_rqlock(struct smb_vc *vcp, struct proc *p); int smb_vc_rqunlock(struct smb_vc *vcp, struct proc *p); /* * share level functions */ int smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_share **sspp); int smb_share_access(struct smb_share *ssp, struct smb_cred *scred, mode_t mode); int smb_share_get(struct smb_share *ssp, struct smb_cred *scred); void smb_share_put(struct smb_share *ssp, struct proc *p); void smb_share_unlock(struct smb_share *ssp, int flags, struct smb_cred *scred); void smb_share_rele(struct smb_share *ssp, struct smb_cred *scred); int smb_share_connect(struct smb_share *ssp, struct smb_cred *scred); int smb_share_detach(struct smb_share *ssp, struct smb_cred *scred); void smb_share_invalidate(struct smb_share *ssp); int smb_share_valid(struct smb_share *ssp); char*smb_share_pass(struct smb_share *ssp); /* * Link (transport) level functions */ int smb_tran_open(struct smb_conn *scp, struct proc *p); int smb_tran_close(struct smb_conn *scp, struct proc *p); int smb_tran_bind(struct smb_conn *scp, struct sockaddr *sap, struct proc *p); int smb_tran_connect(struct smb_conn *scp, struct sockaddr *sap, struct proc *p); int smb_tran_disconnect(struct smb_conn *scp, struct proc *p); int smb_tran_sndlock(struct smb_rq *rqp); int smb_tran_sndunlock(struct smb_rq *rqp); int smb_tran_send(struct smb_rq *rqp); int smb_tran_receive(struct smb_rq *rqp, struct mbdata *mbp); void smb_conn_timo(struct smb_conn *scp); /* * SMB protocol level functions */ int smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred); int smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred); int smb_smb_ssnclose(struct smb_vc *vcp, struct smb_cred *scred); int smb_smb_treeconnect(struct smb_share *ssp, struct smb_cred *scred); int smb_smb_treedisconnect(struct smb_share *ssp, struct smb_cred *scred); int smb_read(struct smb_share *ssp, u_int16_t fid, struct uio *uio, struct smb_cred *scred); int smb_write(struct smb_share *ssp, u_int16_t fid, struct uio *uio, struct smb_cred *scred); #endif /* _KERNEL */