14bff34e3Sthurlow /* 24bff34e3Sthurlow * Copyright (c) 2000-2001 Boris Popov 34bff34e3Sthurlow * All rights reserved. 44bff34e3Sthurlow * 54bff34e3Sthurlow * Redistribution and use in source and binary forms, with or without 64bff34e3Sthurlow * modification, are permitted provided that the following conditions 74bff34e3Sthurlow * are met: 84bff34e3Sthurlow * 1. Redistributions of source code must retain the above copyright 94bff34e3Sthurlow * notice, this list of conditions and the following disclaimer. 104bff34e3Sthurlow * 2. Redistributions in binary form must reproduce the above copyright 114bff34e3Sthurlow * notice, this list of conditions and the following disclaimer in the 124bff34e3Sthurlow * documentation and/or other materials provided with the distribution. 134bff34e3Sthurlow * 3. All advertising materials mentioning features or use of this software 144bff34e3Sthurlow * must display the following acknowledgement: 154bff34e3Sthurlow * This product includes software developed by Boris Popov. 164bff34e3Sthurlow * 4. Neither the name of the author nor the names of any co-contributors 174bff34e3Sthurlow * may be used to endorse or promote products derived from this software 184bff34e3Sthurlow * without specific prior written permission. 194bff34e3Sthurlow * 204bff34e3Sthurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 214bff34e3Sthurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 224bff34e3Sthurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 234bff34e3Sthurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 244bff34e3Sthurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 254bff34e3Sthurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 264bff34e3Sthurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 274bff34e3Sthurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 284bff34e3Sthurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 294bff34e3Sthurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 304bff34e3Sthurlow * SUCH DAMAGE. 314bff34e3Sthurlow * 324bff34e3Sthurlow * $Id: smb_conn.h,v 1.32.42.1 2005/05/27 02:35:29 lindak Exp $ 334bff34e3Sthurlow */ 344bff34e3Sthurlow 354bff34e3Sthurlow /* 36613a2f6bSGordon Ross * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 374bff34e3Sthurlow * Use is subject to license terms. 3840c0e231SGordon Ross * 39*adee6784SGordon Ross * Portions Copyright (C) 2001 - 2013 Apple Inc. All rights reserved. 4040c0e231SGordon Ross * Copyright 2018 Nexenta Systems, Inc. All rights reserved. 414bff34e3Sthurlow */ 424bff34e3Sthurlow 434bff34e3Sthurlow #ifndef _SMB_CONN_H 444bff34e3Sthurlow #define _SMB_CONN_H 454bff34e3Sthurlow 46613a2f6bSGordon Ross #include <sys/dditypes.h> 474bff34e3Sthurlow #include <sys/t_lock.h> 484bff34e3Sthurlow #include <sys/queue.h> /* for SLIST below */ 494bff34e3Sthurlow #include <sys/uio.h> 504bff34e3Sthurlow #include <netsmb/smb_dev.h> 51*adee6784SGordon Ross #include "smb_signing.h" 524bff34e3Sthurlow 534bff34e3Sthurlow /* 544bff34e3Sthurlow * Credentials of user/process for processing in the connection procedures 554bff34e3Sthurlow */ 564bff34e3Sthurlow typedef struct smb_cred { 57613a2f6bSGordon Ross struct cred *scr_cred; 584bff34e3Sthurlow } smb_cred_t; 594bff34e3Sthurlow 604bff34e3Sthurlow /* 614bff34e3Sthurlow * Common object flags 624bff34e3Sthurlow */ 634bff34e3Sthurlow #define SMBO_GONE 0x1000000 644bff34e3Sthurlow 654bff34e3Sthurlow /* 664bff34e3Sthurlow * Bits in vc_flags (a.k.a. vc_co.co_flags) 6740c0e231SGordon Ross * Note: SMBO_GONE is also in vc_flags 684bff34e3Sthurlow */ 699c9af259SGordon Ross #define SMBV_UNICODE 0x0040 /* conn configured to use Unicode */ 7040c0e231SGordon Ross #define SMBV_EXT_SEC 0x0080 /* conn to use extended security */ 71*adee6784SGordon Ross #define SMBV_SIGNING 0x0100 /* negotiated signing */ 72*adee6784SGordon Ross #define SMBV_SMB2 0x0200 /* VC using SMB 2 or 3 */ 73*adee6784SGordon Ross #define SMBV_HAS_FILEIDS 0x0400 /* Use File IDs for hash and inode numbers */ 74*adee6784SGordon Ross #define SMBV_NO_WRITE_THRU 0x0800 /* Can't use ... */ 754bff34e3Sthurlow 764bff34e3Sthurlow /* 774bff34e3Sthurlow * Note: the common "obj" level uses this GONE flag by 784bff34e3Sthurlow * the name SMBO_GONE. Keep this alias as a reminder. 794bff34e3Sthurlow */ 80613a2f6bSGordon Ross #define SMBV_GONE SMBO_GONE 814bff34e3Sthurlow 824bff34e3Sthurlow /* 834bff34e3Sthurlow * bits in smb_share ss_flags (a.k.a. ss_co.co_flags) 844bff34e3Sthurlow */ 854bff34e3Sthurlow #define SMBS_RECONNECTING 0x0002 864bff34e3Sthurlow #define SMBS_CONNECTED 0x0004 874bff34e3Sthurlow #define SMBS_TCON_WAIT 0x0008 8802d09e03SGordon Ross #define SMBS_FST_FAT 0x0010 /* share FS Type is FAT */ 894bff34e3Sthurlow /* 904bff34e3Sthurlow * Note: the common "obj" level uses this GONE flag by 914bff34e3Sthurlow * the name SMBO_GONE. Keep this alias as a reminder. 924bff34e3Sthurlow */ 93613a2f6bSGordon Ross #define SMBS_GONE SMBO_GONE 944bff34e3Sthurlow 95*adee6784SGordon Ross /* 96*adee6784SGordon Ross * bits in smb_fh fh_flags (a.k.a. ss_co.co_flags) 97*adee6784SGordon Ross */ 98*adee6784SGordon Ross #define SMBFH_VALID 0x0002 /* FID is valid */ 99*adee6784SGordon Ross /* 100*adee6784SGordon Ross * Note: the common "obj" level uses this GONE flag by 101*adee6784SGordon Ross * the name SMBO_GONE. Keep this alias as a reminder. 102*adee6784SGordon Ross */ 103*adee6784SGordon Ross #define SMBFH_GONE SMBO_GONE 104*adee6784SGordon Ross 1054bff34e3Sthurlow struct smb_rq; 1064bff34e3Sthurlow /* This declares struct smb_rqhead */ 1074bff34e3Sthurlow TAILQ_HEAD(smb_rqhead, smb_rq); 1084bff34e3Sthurlow 1094bff34e3Sthurlow #define SMB_NBTIMO 15 1104bff34e3Sthurlow #define SMB_DEFRQTIMO 30 /* 30 for oplock revoke/writeback */ 1114bff34e3Sthurlow #define SMBWRTTIMO 60 1124bff34e3Sthurlow #define SMBSSNSETUPTIMO 60 1134bff34e3Sthurlow #define SMBNOREPLYWAIT (0) 1144bff34e3Sthurlow 1154bff34e3Sthurlow #define SMB_DIALECT(vcp) ((vcp)->vc_sopt.sv_proto) 1164bff34e3Sthurlow 1174bff34e3Sthurlow /* 1184bff34e3Sthurlow * Connection object 1194bff34e3Sthurlow */ 1204bff34e3Sthurlow 1214bff34e3Sthurlow #define SMB_CO_LOCK(cp) mutex_enter(&(cp)->co_lock) 1224bff34e3Sthurlow #define SMB_CO_UNLOCK(cp) mutex_exit(&(cp)->co_lock) 1234bff34e3Sthurlow 1244bff34e3Sthurlow /* 1254bff34e3Sthurlow * Common part of smb_vc, smb_share 1264bff34e3Sthurlow * Locking: co_lock protects most 1274bff34e3Sthurlow * fields in this struct, except 1284bff34e3Sthurlow * as noted below: 1294bff34e3Sthurlow */ 1304bff34e3Sthurlow struct smb_connobj { 1314bff34e3Sthurlow kmutex_t co_lock; 1324bff34e3Sthurlow int co_level; /* SMBL_ */ 1334bff34e3Sthurlow int co_flags; 1344bff34e3Sthurlow int co_usecount; 1354bff34e3Sthurlow 1364bff34e3Sthurlow /* Note: must lock co_parent before child. */ 1374bff34e3Sthurlow struct smb_connobj *co_parent; 1384bff34e3Sthurlow 1394bff34e3Sthurlow /* this.co_lock protects the co_children list */ 1404bff34e3Sthurlow SLIST_HEAD(, smb_connobj) co_children; 1414bff34e3Sthurlow 1424bff34e3Sthurlow /* 1434bff34e3Sthurlow * Linkage in parent's list of children. 1444bff34e3Sthurlow * Must hold parent.co_lock to traverse. 1454bff34e3Sthurlow */ 1464bff34e3Sthurlow SLIST_ENTRY(smb_connobj) co_next; 1474bff34e3Sthurlow 1484bff34e3Sthurlow /* These two are set only at creation. */ 1494bff34e3Sthurlow void (*co_gone)(struct smb_connobj *); 1504bff34e3Sthurlow void (*co_free)(struct smb_connobj *); 1514bff34e3Sthurlow }; 1524bff34e3Sthurlow typedef struct smb_connobj smb_connobj_t; 1534bff34e3Sthurlow 1544bff34e3Sthurlow /* 155613a2f6bSGordon Ross * "Level" in the connection object hierarchy 1564bff34e3Sthurlow */ 157*adee6784SGordon Ross enum smbco_level { 158*adee6784SGordon Ross SMBL_SM = 0, 159*adee6784SGordon Ross SMBL_VC = 1, 160*adee6784SGordon Ross SMBL_SHARE = 2, 161*adee6784SGordon Ross SMBL_FH = 3 162*adee6784SGordon Ross }; 1634bff34e3Sthurlow 16440c0e231SGordon Ross /* 16540c0e231SGordon Ross * SMB1 Negotiated protocol parameters 16640c0e231SGordon Ross */ 16740c0e231SGordon Ross struct smb_sopt { 16840c0e231SGordon Ross int16_t sv_proto; /* protocol dialect */ 16940c0e231SGordon Ross uchar_t sv_sm; /* security mode */ 17040c0e231SGordon Ross int16_t sv_tz; /* offset in min relative to UTC */ 17140c0e231SGordon Ross uint16_t sv_maxmux; /* max number of outstanding rq's */ 17240c0e231SGordon Ross uint16_t sv_maxvcs; /* max number of VCs */ 17340c0e231SGordon Ross uint16_t sv_rawmode; 17440c0e231SGordon Ross uint32_t sv_maxtx; /* maximum transmit buf size */ 17540c0e231SGordon Ross uint32_t sv_maxraw; /* maximum raw-buffer size */ 17640c0e231SGordon Ross uint32_t sv_skey; /* session key */ 17740c0e231SGordon Ross uint32_t sv_caps; /* capabilites SMB_CAP_ */ 178*adee6784SGordon Ross 179*adee6784SGordon Ross /* SMB2+ fields */ 180*adee6784SGordon Ross uint32_t sv2_sessflags; /* final session setup reply flags */ 181*adee6784SGordon Ross uint16_t sv2_dialect; /* dialect (non zero for SMB 2/3 */ 182*adee6784SGordon Ross uint32_t sv2_capabilities; /* capabilities */ 183*adee6784SGordon Ross uint32_t sv2_maxtransact; /* max transact size */ 184*adee6784SGordon Ross uint32_t sv2_maxread; /* max read size */ 185*adee6784SGordon Ross uint32_t sv2_maxwrite; /* max write size */ 186*adee6784SGordon Ross uint8_t sv2_guid[16]; /* GUID */ 187*adee6784SGordon Ross uint16_t sv2_security_mode; /* security mode */ 18840c0e231SGordon Ross }; 18940c0e231SGordon Ross typedef struct smb_sopt smb_sopt_t; 19040c0e231SGordon Ross 19140c0e231SGordon Ross /* 19240c0e231SGordon Ross * SMB1 I/O Deamon state 19340c0e231SGordon Ross */ 19440c0e231SGordon Ross struct smb_iods { 19540c0e231SGordon Ross uint8_t is_hflags; /* SMB header flags */ 19640c0e231SGordon Ross uint16_t is_hflags2; /* SMB header flags2 */ 19740c0e231SGordon Ross uint16_t is_smbuid; /* SMB header UID */ 19840c0e231SGordon Ross uint16_t is_next_mid; /* SMB header MID */ 19940c0e231SGordon Ross uint32_t is_txmax; /* max tx/rx packet size */ 20040c0e231SGordon Ross uint32_t is_rwmax; /* max read/write data size */ 20140c0e231SGordon Ross uint32_t is_rxmax; /* max readx data size */ 20240c0e231SGordon Ross uint32_t is_wxmax; /* max writex data size */ 20340c0e231SGordon Ross /* Signing state */ 20440c0e231SGordon Ross uint32_t is_next_seq; /* my next sequence number */ 20540c0e231SGordon Ross 20640c0e231SGordon Ross }; 20740c0e231SGordon Ross typedef struct smb_iods smb_iods_t; 20840c0e231SGordon Ross 209613a2f6bSGordon Ross /* 210613a2f6bSGordon Ross * Virtual Circuit to a server (really connection + session). 211613a2f6bSGordon Ross * Yes, calling this a "Virtual Circuit" is confusining, 212613a2f6bSGordon Ross * because it has nothing to do with the SMB notion of a 213613a2f6bSGordon Ross * "Virtual Circuit". 214613a2f6bSGordon Ross */ 2154bff34e3Sthurlow typedef struct smb_vc { 216613a2f6bSGordon Ross struct smb_connobj vc_co; /* keep first! See CPTOVC */ 217613a2f6bSGordon Ross enum smbiod_state vc_state; 218613a2f6bSGordon Ross kcondvar_t vc_statechg; 2194bff34e3Sthurlow 220613a2f6bSGordon Ross zoneid_t vc_zoneid; 221613a2f6bSGordon Ross uid_t vc_owner; /* Unix owner */ 222613a2f6bSGordon Ross int vc_genid; /* "generation" ID */ 223613a2f6bSGordon Ross 22440c0e231SGordon Ross int vc_mackeylen; /* MAC key length */ 22540c0e231SGordon Ross int vc_ssnkeylen; /* session key length */ 22640c0e231SGordon Ross uint8_t *vc_mackey; /* MAC key buffer */ 22740c0e231SGordon Ross uint8_t *vc_ssnkey; /* session key buffer */ 228*adee6784SGordon Ross smb_sign_mech_t vc_signmech; 229613a2f6bSGordon Ross 230613a2f6bSGordon Ross struct smb_tran_desc *vc_tdesc; /* transport ops. vector */ 231613a2f6bSGordon Ross void *vc_tdata; /* transport control block */ 232613a2f6bSGordon Ross 233*adee6784SGordon Ross /* SMB2+ fields */ 234*adee6784SGordon Ross uint64_t vc2_oldest_message_id; 235*adee6784SGordon Ross uint64_t vc2_next_message_id; 236*adee6784SGordon Ross uint64_t vc2_limit_message_id; 237*adee6784SGordon Ross uint64_t vc2_session_id; /* session id */ 238*adee6784SGordon Ross uint64_t vc2_prev_session_id; /* for reconnect */ 239*adee6784SGordon Ross uint32_t vc2_lease_key; /* lease key gen */ 240*adee6784SGordon Ross 24140c0e231SGordon Ross kcondvar_t iod_idle; /* IOD thread idle CV */ 242613a2f6bSGordon Ross krwlock_t iod_rqlock; /* iod_rqlist */ 243*adee6784SGordon Ross struct smb_rqhead iod_rqlist; /* list of active reqs */ 24440c0e231SGordon Ross struct _kthread *iod_thr; /* the IOD (reader) thread */ 2454bff34e3Sthurlow int iod_flags; /* see SMBIOD_* below */ 246*adee6784SGordon Ross uint_t iod_muxcnt; /* num. active requests */ 247*adee6784SGordon Ross uint_t iod_muxwant; /* waiting to be active */ 248*adee6784SGordon Ross kcondvar_t iod_muxwait; 249*adee6784SGordon Ross boolean_t iod_noresp; /* Logged "not responding" */ 250613a2f6bSGordon Ross 25140c0e231SGordon Ross smb_iods_t vc_iods; 25240c0e231SGordon Ross smb_sopt_t vc_sopt; 25340c0e231SGordon Ross 254613a2f6bSGordon Ross /* This is copied in/out when IOD enters/returns */ 255613a2f6bSGordon Ross smbioc_ssn_work_t vc_work; 256613a2f6bSGordon Ross 257613a2f6bSGordon Ross /* session identity, etc. */ 258613a2f6bSGordon Ross smbioc_ossn_t vc_ssn; 2594bff34e3Sthurlow } smb_vc_t; 2604bff34e3Sthurlow 2614bff34e3Sthurlow #define vc_lock vc_co.co_lock 2624bff34e3Sthurlow #define vc_flags vc_co.co_flags 263613a2f6bSGordon Ross 264613a2f6bSGordon Ross /* defines for members in vc_ssn */ 265613a2f6bSGordon Ross #define vc_owner vc_ssn.ssn_owner 266*adee6784SGordon Ross #define vc_vopt vc_ssn.ssn_vopt 267*adee6784SGordon Ross #define vc_minver vc_ssn.ssn_minver 268*adee6784SGordon Ross #define vc_maxver vc_ssn.ssn_maxver 269613a2f6bSGordon Ross #define vc_srvname vc_ssn.ssn_srvname 270613a2f6bSGordon Ross #define vc_srvaddr vc_ssn.ssn_id.id_srvaddr 271613a2f6bSGordon Ross #define vc_domain vc_ssn.ssn_id.id_domain 272613a2f6bSGordon Ross #define vc_username vc_ssn.ssn_id.id_user 273613a2f6bSGordon Ross 274613a2f6bSGordon Ross /* defines for members in vc_work */ 275*adee6784SGordon Ross #define vc_cl_guid vc_work.wk_cl_guid 27640c0e231SGordon Ross 27740c0e231SGordon Ross /* defines for members in vc_sopt ? */ 27840c0e231SGordon Ross #define vc_maxmux vc_sopt.sv_maxmux 27940c0e231SGordon Ross 28040c0e231SGordon Ross /* defines for members in vc_iods */ 28140c0e231SGordon Ross #define vc_hflags vc_iods.is_hflags 28240c0e231SGordon Ross #define vc_hflags2 vc_iods.is_hflags2 28340c0e231SGordon Ross #define vc_smbuid vc_iods.is_smbuid 28440c0e231SGordon Ross #define vc_next_mid vc_iods.is_next_mid 28540c0e231SGordon Ross #define vc_txmax vc_iods.is_txmax 28640c0e231SGordon Ross #define vc_rwmax vc_iods.is_rwmax 28740c0e231SGordon Ross #define vc_rxmax vc_iods.is_rxmax 28840c0e231SGordon Ross #define vc_wxmax vc_iods.is_wxmax 28940c0e231SGordon Ross #define vc_next_seq vc_iods.is_next_seq 2904bff34e3Sthurlow 2914bff34e3Sthurlow #define SMB_VC_LOCK(vcp) mutex_enter(&(vcp)->vc_lock) 2924bff34e3Sthurlow #define SMB_VC_UNLOCK(vcp) mutex_exit(&(vcp)->vc_lock) 2934bff34e3Sthurlow 294*adee6784SGordon Ross #define CPTOVC(cp) ((struct smb_vc *)((void *)(cp))) 295*adee6784SGordon Ross #define VCTOCP(vcp) (&(vcp)->vc_co) 296*adee6784SGordon Ross 297*adee6784SGordon Ross #define SMB_UNICODE_STRINGS(vcp) \ 298*adee6784SGordon Ross (((vcp)->vc_flags & SMBV_SMB2) != 0 || \ 299*adee6784SGordon Ross ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE) != 0) 3004bff34e3Sthurlow 3014bff34e3Sthurlow /* Bits in iod_flags */ 3024bff34e3Sthurlow #define SMBIOD_RUNNING 0x0001 3034bff34e3Sthurlow #define SMBIOD_SHUTDOWN 0x0002 3044bff34e3Sthurlow 3054bff34e3Sthurlow /* 3064bff34e3Sthurlow * smb_share structure describes connection to the given SMB share (tree). 3074bff34e3Sthurlow * Connection to share is always built on top of the VC. 3084bff34e3Sthurlow */ 3094bff34e3Sthurlow 3104bff34e3Sthurlow typedef struct smb_share { 311613a2f6bSGordon Ross struct smb_connobj ss_co; /* keep first! See CPTOSS */ 3124bff34e3Sthurlow kcondvar_t ss_conn_done; /* wait for reconnect */ 3134bff34e3Sthurlow int ss_conn_waiters; 3144bff34e3Sthurlow int ss_vcgenid; /* check VC generation ID */ 315613a2f6bSGordon Ross uint16_t ss_tid; /* TID */ 316613a2f6bSGordon Ross uint16_t ss_options; /* option support bits */ 317*adee6784SGordon Ross uint32_t ss2_tree_id; 318*adee6784SGordon Ross uint32_t ss2_share_flags; 319*adee6784SGordon Ross uint32_t ss2_share_caps; 320613a2f6bSGordon Ross smbioc_oshare_t ss_ioc; 3214bff34e3Sthurlow } smb_share_t; 3224bff34e3Sthurlow 3234bff34e3Sthurlow #define ss_lock ss_co.co_lock 3244bff34e3Sthurlow #define ss_flags ss_co.co_flags 3254bff34e3Sthurlow 326430b4c46SGordon Ross #define ss_use ss_ioc.sh_use 327430b4c46SGordon Ross #define ss_type ss_ioc.sh_type 328613a2f6bSGordon Ross #define ss_name ss_ioc.sh_name 329613a2f6bSGordon Ross #define ss_pass ss_ioc.sh_pass 330613a2f6bSGordon Ross 3314bff34e3Sthurlow #define SMB_SS_LOCK(ssp) mutex_enter(&(ssp)->ss_lock) 3324bff34e3Sthurlow #define SMB_SS_UNLOCK(ssp) mutex_exit(&(ssp)->ss_lock) 3334bff34e3Sthurlow 334613a2f6bSGordon Ross #define CPTOSS(cp) ((struct smb_share *)((void *)(cp))) 3354bff34e3Sthurlow #define SSTOCP(ssp) (&(ssp)->ss_co) 336*adee6784SGordon Ross #define SSTOVC(ssp) CPTOVC(((ssp)->ss_co.co_parent)) 337*adee6784SGordon Ross 338*adee6784SGordon Ross typedef struct smb2fid { 339*adee6784SGordon Ross uint64_t fid_persistent; 340*adee6784SGordon Ross uint64_t fid_volatile; 341*adee6784SGordon Ross } smb2fid_t; 342*adee6784SGordon Ross 343*adee6784SGordon Ross /* 344*adee6784SGordon Ross * smb_fh struct describes an open file handle under some share. 345*adee6784SGordon Ross */ 346*adee6784SGordon Ross typedef struct smb_fh { 347*adee6784SGordon Ross struct smb_connobj fh_co; /* keep first! See CPTOSS */ 348*adee6784SGordon Ross int fh_vcgenid; /* check VC generation ID */ 349*adee6784SGordon Ross uint32_t fh_rights; /* granted access */ 350*adee6784SGordon Ross smb2fid_t fh_fid2; 351*adee6784SGordon Ross uint16_t fh_fid1; 352*adee6784SGordon Ross } smb_fh_t; 353*adee6784SGordon Ross 354*adee6784SGordon Ross #define fh_lock fh_co.co_lock 355*adee6784SGordon Ross #define fh_flags fh_co.co_flags 356*adee6784SGordon Ross 357*adee6784SGordon Ross #define SMB_FH_LOCK(fhp) mutex_enter(&(fhp)->fh_lock) 358*adee6784SGordon Ross #define SMB_FH_UNLOCK(fhp) mutex_exit(&(fhp)->fh_lock) 359*adee6784SGordon Ross 360*adee6784SGordon Ross #define CPTOFH(cp) ((struct smb_fh *)((void *)(cp))) 361*adee6784SGordon Ross #define FHTOCP(fhp) (&(fhp)->fh_co) 362*adee6784SGordon Ross #define FHTOSS(fhp) CPTOSS(((fhp)->fh_co.co_parent)) 3634bff34e3Sthurlow 3644bff34e3Sthurlow /* 3654bff34e3Sthurlow * Call-back operations vector, so the netsmb module 3664bff34e3Sthurlow * can notify smbfs about events affecting mounts. 3674bff34e3Sthurlow * Installed in netsmb after smbfs loads. 368*adee6784SGordon Ross * Note: smbfs only uses the fscb_discon hook. 3694bff34e3Sthurlow */ 3704bff34e3Sthurlow typedef struct smb_fscb { 371613a2f6bSGordon Ross /* Called when the VC has disconnected. */ 372613a2f6bSGordon Ross void (*fscb_disconn)(smb_share_t *); 373613a2f6bSGordon Ross /* Called when the VC has reconnected. */ 374613a2f6bSGordon Ross void (*fscb_connect)(smb_share_t *); 3754bff34e3Sthurlow } smb_fscb_t; 3764bff34e3Sthurlow /* Install the above vector, or pass NULL to clear it. */ 37702d09e03SGordon Ross void smb_fscb_set(smb_fscb_t *); 378613a2f6bSGordon Ross 379613a2f6bSGordon Ross /* 380613a2f6bSGordon Ross * The driver per open instance object. 381613a2f6bSGordon Ross * Mostly used in: smb_dev.c, smb_usr.c 382613a2f6bSGordon Ross */ 383613a2f6bSGordon Ross typedef struct smb_dev { 384216041c4SGordon Ross kmutex_t sd_lock; 385613a2f6bSGordon Ross struct smb_vc *sd_vc; /* Reference to VC */ 386613a2f6bSGordon Ross struct smb_share *sd_share; /* Reference to share if any */ 387*adee6784SGordon Ross struct smb_fh *sd_fh; /* Reference to FH, if any */ 388430b4c46SGordon Ross int sd_level; /* SMBL_VC, ... */ 389613a2f6bSGordon Ross int sd_vcgenid; /* Generation of share or VC */ 390613a2f6bSGordon Ross int sd_poll; /* Future use */ 391613a2f6bSGordon Ross int sd_flags; /* State of connection */ 392*adee6784SGordon Ross #define NSMBFL_OPEN 0x0001 /* Device minor is open */ 393*adee6784SGordon Ross #define NSMBFL_IOD 0x0004 /* Open by IOD */ 394*adee6784SGordon Ross #define NSMBFL_IOCTL 0x0010 /* Serialize ioctl calls */ 395613a2f6bSGordon Ross zoneid_t zoneid; /* Zone id */ 396613a2f6bSGordon Ross } smb_dev_t; 397613a2f6bSGordon Ross 398613a2f6bSGordon Ross extern const uint32_t nsmb_version; 399613a2f6bSGordon Ross 400613a2f6bSGordon Ross /* 401613a2f6bSGordon Ross * smb_dev.c 402613a2f6bSGordon Ross */ 403613a2f6bSGordon Ross int smb_dev2share(int fd, struct smb_share **sspp); 404613a2f6bSGordon Ross 405613a2f6bSGordon Ross 406613a2f6bSGordon Ross /* 407613a2f6bSGordon Ross * smb_usr.c 408613a2f6bSGordon Ross */ 40940c0e231SGordon Ross int smb_usr_ioctl(smb_dev_t *, int, intptr_t, int, cred_t *); 41040c0e231SGordon Ross 411613a2f6bSGordon Ross int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags); 412613a2f6bSGordon Ross int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags); 413430b4c46SGordon Ross int smb_usr_dup_dev(smb_dev_t *sdp, intptr_t arg, int flags); 414613a2f6bSGordon Ross 415613a2f6bSGordon Ross int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr); 416613a2f6bSGordon Ross int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr); 417430b4c46SGordon Ross 418430b4c46SGordon Ross int smb_usr_closefh(smb_dev_t *, cred_t *); 419613a2f6bSGordon Ross int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr); 420430b4c46SGordon Ross int smb_usr_ntcreate(smb_dev_t *, intptr_t, int, cred_t *); 421430b4c46SGordon Ross int smb_usr_printjob(smb_dev_t *, intptr_t, int, cred_t *); 422613a2f6bSGordon Ross 423613a2f6bSGordon Ross int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *); 424613a2f6bSGordon Ross int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd); 425613a2f6bSGordon Ross 426613a2f6bSGordon Ross int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *); 427613a2f6bSGordon Ross int smb_usr_drop_tree(smb_dev_t *sdp, int cmd); 428613a2f6bSGordon Ross 429613a2f6bSGordon Ross int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr); 43040c0e231SGordon Ross int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, 43140c0e231SGordon Ross cred_t *cr); 43240c0e231SGordon Ross 43340c0e231SGordon Ross int smb_pkey_ioctl(int, intptr_t, int, cred_t *); 434613a2f6bSGordon Ross 4354bff34e3Sthurlow 4364bff34e3Sthurlow /* 4374bff34e3Sthurlow * IOD functions 4384bff34e3Sthurlow */ 439613a2f6bSGordon Ross int smb_iod_create(smb_vc_t *vcp); 440613a2f6bSGordon Ross int smb_iod_destroy(smb_vc_t *vcp); 44102d09e03SGordon Ross void smb_iod_disconnect(smb_vc_t *vcp); 442*adee6784SGordon Ross int smb2_iod_addrq(struct smb_rq *rqp); 443*adee6784SGordon Ross int smb1_iod_addrq(struct smb_rq *rqp); 444*adee6784SGordon Ross int smb1_iod_multirq(struct smb_rq *rqp); 4454bff34e3Sthurlow int smb_iod_waitrq(struct smb_rq *rqp); 446*adee6784SGordon Ross int smb_iod_waitrq_int(struct smb_rq *rqp); 44702d09e03SGordon Ross void smb_iod_removerq(struct smb_rq *rqp); 44840c0e231SGordon Ross int smb_iod_sendrecv(struct smb_rq *, int); 449613a2f6bSGordon Ross void smb_iod_shutdown_share(smb_share_t *ssp); 450613a2f6bSGordon Ross 451613a2f6bSGordon Ross void smb_iod_sendall(smb_vc_t *); 45240c0e231SGordon Ross int smb_iod_recvall(smb_vc_t *, boolean_t); 453613a2f6bSGordon Ross 454*adee6784SGordon Ross int nsmb_iod_connect(smb_vc_t *vcp, cred_t *cr); 45540c0e231SGordon Ross int nsmb_iod_negotiate(smb_vc_t *vcp, cred_t *cr); 45640c0e231SGordon Ross int nsmb_iod_ssnsetup(smb_vc_t *vcp, cred_t *cr); 45740c0e231SGordon Ross int smb_iod_vc_work(smb_vc_t *, int, cred_t *); 458613a2f6bSGordon Ross int smb_iod_vc_idle(smb_vc_t *); 459613a2f6bSGordon Ross int smb_iod_vc_rcfail(smb_vc_t *); 460613a2f6bSGordon Ross int smb_iod_reconnect(smb_vc_t *); 4614bff34e3Sthurlow 4624bff34e3Sthurlow /* 4634bff34e3Sthurlow * Session level functions 4644bff34e3Sthurlow */ 4654bff34e3Sthurlow int smb_sm_init(void); 4664bff34e3Sthurlow int smb_sm_idle(void); 4674bff34e3Sthurlow void smb_sm_done(void); 4684bff34e3Sthurlow 4694bff34e3Sthurlow /* 4704bff34e3Sthurlow * VC level functions 4714bff34e3Sthurlow */ 472613a2f6bSGordon Ross void smb_vc_hold(smb_vc_t *vcp); 473613a2f6bSGordon Ross void smb_vc_rele(smb_vc_t *vcp); 474613a2f6bSGordon Ross void smb_vc_kill(smb_vc_t *vcp); 475613a2f6bSGordon Ross 476613a2f6bSGordon Ross int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **); 477613a2f6bSGordon Ross int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp); 478613a2f6bSGordon Ross 479613a2f6bSGordon Ross const char *smb_vc_getpass(smb_vc_t *vcp); 480613a2f6bSGordon Ross uint16_t smb_vc_nextmid(smb_vc_t *vcp); 481613a2f6bSGordon Ross void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers); 482613a2f6bSGordon Ross 483613a2f6bSGordon Ross typedef void (*walk_share_func_t)(smb_share_t *); 484613a2f6bSGordon Ross void smb_vc_walkshares(struct smb_vc *, walk_share_func_t); 4854bff34e3Sthurlow 4864bff34e3Sthurlow /* 4874bff34e3Sthurlow * share level functions 4884bff34e3Sthurlow */ 4894bff34e3Sthurlow 490613a2f6bSGordon Ross int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *, 491613a2f6bSGordon Ross smb_share_t **, smb_cred_t *); 492613a2f6bSGordon Ross 493613a2f6bSGordon Ross void smb_share_hold(smb_share_t *ssp); 494613a2f6bSGordon Ross void smb_share_rele(smb_share_t *ssp); 495613a2f6bSGordon Ross void smb_share_kill(smb_share_t *ssp); 4964bff34e3Sthurlow 497613a2f6bSGordon Ross void smb_share_invalidate(smb_share_t *ssp); 498613a2f6bSGordon Ross int smb_share_tcon(smb_share_t *, smb_cred_t *); 4994bff34e3Sthurlow 500*adee6784SGordon Ross /* 501*adee6784SGordon Ross * File handle level functions 502*adee6784SGordon Ross */ 503*adee6784SGordon Ross int smb_fh_create(smb_share_t *ssp, struct smb_fh **fhpp); 504*adee6784SGordon Ross void smb_fh_opened(struct smb_fh *fhp); 505*adee6784SGordon Ross void smb_fh_close(struct smb_fh *fhp); 506*adee6784SGordon Ross void smb_fh_hold(struct smb_fh *fhp); 507*adee6784SGordon Ross void smb_fh_rele(struct smb_fh *fhp); 508*adee6784SGordon Ross 5094bff34e3Sthurlow #endif /* _SMB_CONN_H */ 510