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 /*
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);
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 */
|
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 2009 Sun Microsystems, Inc. All rights reserved.
37 * Use is subject to license terms.
38 *
39 * Portions Copyright (C) 2001 - 2013 Apple Inc. All rights reserved.
40 * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
41 */
42
43 #ifndef _SMB_CONN_H
44 #define _SMB_CONN_H
45
46 #include <sys/dditypes.h>
47 #include <sys/t_lock.h>
48 #include <sys/queue.h> /* for SLIST below */
49 #include <sys/uio.h>
50 #include <netsmb/smb_dev.h>
51 #include "smb_signing.h"
52
53 /*
54 * Credentials of user/process for processing in the connection procedures
55 */
56 typedef struct smb_cred {
57 struct cred *scr_cred;
58 } smb_cred_t;
59
60 /*
61 * Common object flags
62 */
63 #define SMBO_GONE 0x1000000
64
65 /*
66 * Bits in vc_flags (a.k.a. vc_co.co_flags)
67 * Note: SMBO_GONE is also in vc_flags
68 */
69 #define SMBV_UNICODE 0x0040 /* conn configured to use Unicode */
70 #define SMBV_EXT_SEC 0x0080 /* conn to use extended security */
71 #define SMBV_SIGNING 0x0100 /* negotiated signing */
72 #define SMBV_SMB2 0x0200 /* VC using SMB 2 or 3 */
73 #define SMBV_HAS_FILEIDS 0x0400 /* Use File IDs for hash and inode numbers */
74 #define SMBV_NO_WRITE_THRU 0x0800 /* Can't use ... */
75
76 /*
77 * Note: the common "obj" level uses this GONE flag by
78 * the name SMBO_GONE. Keep this alias as a reminder.
79 */
80 #define SMBV_GONE SMBO_GONE
81
82 /*
83 * bits in smb_share ss_flags (a.k.a. ss_co.co_flags)
84 */
85 #define SMBS_RECONNECTING 0x0002
86 #define SMBS_CONNECTED 0x0004
87 #define SMBS_TCON_WAIT 0x0008
88 #define SMBS_FST_FAT 0x0010 /* share FS Type is FAT */
89 /*
90 * Note: the common "obj" level uses this GONE flag by
91 * the name SMBO_GONE. Keep this alias as a reminder.
92 */
93 #define SMBS_GONE SMBO_GONE
94
95 /*
96 * bits in smb_fh fh_flags (a.k.a. ss_co.co_flags)
97 */
98 #define SMBFH_VALID 0x0002 /* FID is valid */
99 /*
100 * Note: the common "obj" level uses this GONE flag by
101 * the name SMBO_GONE. Keep this alias as a reminder.
102 */
103 #define SMBFH_GONE SMBO_GONE
104
105 struct smb_rq;
106 /* This declares struct smb_rqhead */
107 TAILQ_HEAD(smb_rqhead, smb_rq);
108
109 #define SMB_NBTIMO 15
110 #define SMB_DEFRQTIMO 30 /* 30 for oplock revoke/writeback */
111 #define SMBWRTTIMO 60
112 #define SMBSSNSETUPTIMO 60
113 #define SMBNOREPLYWAIT (0)
114
115 #define SMB_DIALECT(vcp) ((vcp)->vc_sopt.sv_proto)
116
117 /*
118 * Connection object
119 */
120
121 #define SMB_CO_LOCK(cp) mutex_enter(&(cp)->co_lock)
122 #define SMB_CO_UNLOCK(cp) mutex_exit(&(cp)->co_lock)
123
124 /*
137 struct smb_connobj *co_parent;
138
139 /* this.co_lock protects the co_children list */
140 SLIST_HEAD(, smb_connobj) co_children;
141
142 /*
143 * Linkage in parent's list of children.
144 * Must hold parent.co_lock to traverse.
145 */
146 SLIST_ENTRY(smb_connobj) co_next;
147
148 /* These two are set only at creation. */
149 void (*co_gone)(struct smb_connobj *);
150 void (*co_free)(struct smb_connobj *);
151 };
152 typedef struct smb_connobj smb_connobj_t;
153
154 /*
155 * "Level" in the connection object hierarchy
156 */
157 enum smbco_level {
158 SMBL_SM = 0,
159 SMBL_VC = 1,
160 SMBL_SHARE = 2,
161 SMBL_FH = 3
162 };
163
164 /*
165 * SMB1 Negotiated protocol parameters
166 */
167 struct smb_sopt {
168 int16_t sv_proto; /* protocol dialect */
169 uchar_t sv_sm; /* security mode */
170 int16_t sv_tz; /* offset in min relative to UTC */
171 uint16_t sv_maxmux; /* max number of outstanding rq's */
172 uint16_t sv_maxvcs; /* max number of VCs */
173 uint16_t sv_rawmode;
174 uint32_t sv_maxtx; /* maximum transmit buf size */
175 uint32_t sv_maxraw; /* maximum raw-buffer size */
176 uint32_t sv_skey; /* session key */
177 uint32_t sv_caps; /* capabilites SMB_CAP_ */
178
179 /* SMB2+ fields */
180 uint32_t sv2_sessflags; /* final session setup reply flags */
181 uint16_t sv2_dialect; /* dialect (non zero for SMB 2/3 */
182 uint32_t sv2_capabilities; /* capabilities */
183 uint32_t sv2_maxtransact; /* max transact size */
184 uint32_t sv2_maxread; /* max read size */
185 uint32_t sv2_maxwrite; /* max write size */
186 uint8_t sv2_guid[16]; /* GUID */
187 uint16_t sv2_security_mode; /* security mode */
188 };
189 typedef struct smb_sopt smb_sopt_t;
190
191 /*
192 * SMB1 I/O Deamon state
193 */
194 struct smb_iods {
195 uint8_t is_hflags; /* SMB header flags */
196 uint16_t is_hflags2; /* SMB header flags2 */
197 uint16_t is_smbuid; /* SMB header UID */
198 uint16_t is_next_mid; /* SMB header MID */
199 uint32_t is_txmax; /* max tx/rx packet size */
200 uint32_t is_rwmax; /* max read/write data size */
201 uint32_t is_rxmax; /* max readx data size */
202 uint32_t is_wxmax; /* max writex data size */
203 /* Signing state */
204 uint32_t is_next_seq; /* my next sequence number */
205
206 };
207 typedef struct smb_iods smb_iods_t;
208
209 /*
210 * Virtual Circuit to a server (really connection + session).
211 * Yes, calling this a "Virtual Circuit" is confusining,
212 * because it has nothing to do with the SMB notion of a
213 * "Virtual Circuit".
214 */
215 typedef struct smb_vc {
216 struct smb_connobj vc_co; /* keep first! See CPTOVC */
217 enum smbiod_state vc_state;
218 kcondvar_t vc_statechg;
219
220 zoneid_t vc_zoneid;
221 uid_t vc_owner; /* Unix owner */
222 int vc_genid; /* "generation" ID */
223
224 int vc_mackeylen; /* MAC key length */
225 int vc_ssnkeylen; /* session key length */
226 uint8_t *vc_mackey; /* MAC key buffer */
227 uint8_t *vc_ssnkey; /* session key buffer */
228 smb_sign_mech_t vc_signmech;
229
230 struct smb_tran_desc *vc_tdesc; /* transport ops. vector */
231 void *vc_tdata; /* transport control block */
232
233 /* SMB2+ fields */
234 uint64_t vc2_oldest_message_id;
235 uint64_t vc2_next_message_id;
236 uint64_t vc2_limit_message_id;
237 uint64_t vc2_session_id; /* session id */
238 uint64_t vc2_prev_session_id; /* for reconnect */
239 uint32_t vc2_lease_key; /* lease key gen */
240
241 kcondvar_t iod_idle; /* IOD thread idle CV */
242 krwlock_t iod_rqlock; /* iod_rqlist */
243 struct smb_rqhead iod_rqlist; /* list of active reqs */
244 struct _kthread *iod_thr; /* the IOD (reader) thread */
245 int iod_flags; /* see SMBIOD_* below */
246 uint_t iod_muxcnt; /* num. active requests */
247 uint_t iod_muxwant; /* waiting to be active */
248 kcondvar_t iod_muxwait;
249 boolean_t iod_noresp; /* Logged "not responding" */
250
251 smb_iods_t vc_iods;
252 smb_sopt_t vc_sopt;
253
254 /* This is copied in/out when IOD enters/returns */
255 smbioc_ssn_work_t vc_work;
256
257 /* session identity, etc. */
258 smbioc_ossn_t vc_ssn;
259 } smb_vc_t;
260
261 #define vc_lock vc_co.co_lock
262 #define vc_flags vc_co.co_flags
263
264 /* defines for members in vc_ssn */
265 #define vc_owner vc_ssn.ssn_owner
266 #define vc_vopt vc_ssn.ssn_vopt
267 #define vc_minver vc_ssn.ssn_minver
268 #define vc_maxver vc_ssn.ssn_maxver
269 #define vc_srvname vc_ssn.ssn_srvname
270 #define vc_srvaddr vc_ssn.ssn_id.id_srvaddr
271 #define vc_domain vc_ssn.ssn_id.id_domain
272 #define vc_username vc_ssn.ssn_id.id_user
273
274 /* defines for members in vc_work */
275 #define vc_cl_guid vc_work.wk_cl_guid
276
277 /* defines for members in vc_sopt ? */
278 #define vc_maxmux vc_sopt.sv_maxmux
279
280 /* defines for members in vc_iods */
281 #define vc_hflags vc_iods.is_hflags
282 #define vc_hflags2 vc_iods.is_hflags2
283 #define vc_smbuid vc_iods.is_smbuid
284 #define vc_next_mid vc_iods.is_next_mid
285 #define vc_txmax vc_iods.is_txmax
286 #define vc_rwmax vc_iods.is_rwmax
287 #define vc_rxmax vc_iods.is_rxmax
288 #define vc_wxmax vc_iods.is_wxmax
289 #define vc_next_seq vc_iods.is_next_seq
290
291 #define SMB_VC_LOCK(vcp) mutex_enter(&(vcp)->vc_lock)
292 #define SMB_VC_UNLOCK(vcp) mutex_exit(&(vcp)->vc_lock)
293
294 #define CPTOVC(cp) ((struct smb_vc *)((void *)(cp)))
295 #define VCTOCP(vcp) (&(vcp)->vc_co)
296
297 #define SMB_UNICODE_STRINGS(vcp) \
298 (((vcp)->vc_flags & SMBV_SMB2) != 0 || \
299 ((vcp)->vc_hflags2 & SMB_FLAGS2_UNICODE) != 0)
300
301 /* Bits in iod_flags */
302 #define SMBIOD_RUNNING 0x0001
303 #define SMBIOD_SHUTDOWN 0x0002
304
305 /*
306 * smb_share structure describes connection to the given SMB share (tree).
307 * Connection to share is always built on top of the VC.
308 */
309
310 typedef struct smb_share {
311 struct smb_connobj ss_co; /* keep first! See CPTOSS */
312 kcondvar_t ss_conn_done; /* wait for reconnect */
313 int ss_conn_waiters;
314 int ss_vcgenid; /* check VC generation ID */
315 uint16_t ss_tid; /* TID */
316 uint16_t ss_options; /* option support bits */
317 uint32_t ss2_tree_id;
318 uint32_t ss2_share_flags;
319 uint32_t ss2_share_caps;
320 smbioc_oshare_t ss_ioc;
321 } smb_share_t;
322
323 #define ss_lock ss_co.co_lock
324 #define ss_flags ss_co.co_flags
325
326 #define ss_use ss_ioc.sh_use
327 #define ss_type ss_ioc.sh_type
328 #define ss_name ss_ioc.sh_name
329 #define ss_pass ss_ioc.sh_pass
330
331 #define SMB_SS_LOCK(ssp) mutex_enter(&(ssp)->ss_lock)
332 #define SMB_SS_UNLOCK(ssp) mutex_exit(&(ssp)->ss_lock)
333
334 #define CPTOSS(cp) ((struct smb_share *)((void *)(cp)))
335 #define SSTOCP(ssp) (&(ssp)->ss_co)
336 #define SSTOVC(ssp) CPTOVC(((ssp)->ss_co.co_parent))
337
338 typedef struct smb2fid {
339 uint64_t fid_persistent;
340 uint64_t fid_volatile;
341 } smb2fid_t;
342
343 /*
344 * smb_fh struct describes an open file handle under some share.
345 */
346 typedef struct smb_fh {
347 struct smb_connobj fh_co; /* keep first! See CPTOSS */
348 int fh_vcgenid; /* check VC generation ID */
349 uint32_t fh_rights; /* granted access */
350 smb2fid_t fh_fid2;
351 uint16_t fh_fid1;
352 } smb_fh_t;
353
354 #define fh_lock fh_co.co_lock
355 #define fh_flags fh_co.co_flags
356
357 #define SMB_FH_LOCK(fhp) mutex_enter(&(fhp)->fh_lock)
358 #define SMB_FH_UNLOCK(fhp) mutex_exit(&(fhp)->fh_lock)
359
360 #define CPTOFH(cp) ((struct smb_fh *)((void *)(cp)))
361 #define FHTOCP(fhp) (&(fhp)->fh_co)
362 #define FHTOSS(fhp) CPTOSS(((fhp)->fh_co.co_parent))
363
364 /*
365 * Call-back operations vector, so the netsmb module
366 * can notify smbfs about events affecting mounts.
367 * Installed in netsmb after smbfs loads.
368 * Note: smbfs only uses the fscb_discon hook.
369 */
370 typedef struct smb_fscb {
371 /* Called when the VC has disconnected. */
372 void (*fscb_disconn)(smb_share_t *);
373 /* Called when the VC has reconnected. */
374 void (*fscb_connect)(smb_share_t *);
375 } smb_fscb_t;
376 /* Install the above vector, or pass NULL to clear it. */
377 void smb_fscb_set(smb_fscb_t *);
378
379 /*
380 * The driver per open instance object.
381 * Mostly used in: smb_dev.c, smb_usr.c
382 */
383 typedef struct smb_dev {
384 kmutex_t sd_lock;
385 struct smb_vc *sd_vc; /* Reference to VC */
386 struct smb_share *sd_share; /* Reference to share if any */
387 struct smb_fh *sd_fh; /* Reference to FH, if any */
388 int sd_level; /* SMBL_VC, ... */
389 int sd_vcgenid; /* Generation of share or VC */
390 int sd_poll; /* Future use */
391 int sd_flags; /* State of connection */
392 #define NSMBFL_OPEN 0x0001 /* Device minor is open */
393 #define NSMBFL_IOD 0x0004 /* Open by IOD */
394 #define NSMBFL_IOCTL 0x0010 /* Serialize ioctl calls */
395 zoneid_t zoneid; /* Zone id */
396 } smb_dev_t;
397
398 extern const uint32_t nsmb_version;
399
400 /*
401 * smb_dev.c
402 */
403 int smb_dev2share(int fd, struct smb_share **sspp);
404
405
406 /*
407 * smb_usr.c
408 */
409 int smb_usr_ioctl(smb_dev_t *, int, intptr_t, int, cred_t *);
410
411 int smb_usr_get_flags2(smb_dev_t *sdp, intptr_t arg, int flags);
412 int smb_usr_get_ssnkey(smb_dev_t *sdp, intptr_t arg, int flags);
413 int smb_usr_dup_dev(smb_dev_t *sdp, intptr_t arg, int flags);
414
415 int smb_usr_simplerq(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
416 int smb_usr_t2request(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
417
418 int smb_usr_closefh(smb_dev_t *, cred_t *);
419 int smb_usr_rw(smb_dev_t *sdp, int cmd, intptr_t arg, int flags, cred_t *cr);
420 int smb_usr_ntcreate(smb_dev_t *, intptr_t, int, cred_t *);
421 int smb_usr_printjob(smb_dev_t *, intptr_t, int, cred_t *);
422
423 int smb_usr_get_ssn(smb_dev_t *, int, intptr_t, int, cred_t *);
424 int smb_usr_drop_ssn(smb_dev_t *sdp, int cmd);
425
426 int smb_usr_get_tree(smb_dev_t *, int, intptr_t, int, cred_t *);
427 int smb_usr_drop_tree(smb_dev_t *sdp, int cmd);
428
429 int smb_usr_iod_work(smb_dev_t *sdp, intptr_t arg, int flags, cred_t *cr);
430 int smb_usr_iod_ioctl(smb_dev_t *sdp, int cmd, intptr_t arg, int flags,
431 cred_t *cr);
432
433 int smb_pkey_ioctl(int, intptr_t, int, cred_t *);
434
435
436 /*
437 * IOD functions
438 */
439 int smb_iod_create(smb_vc_t *vcp);
440 int smb_iod_destroy(smb_vc_t *vcp);
441 void smb_iod_disconnect(smb_vc_t *vcp);
442 int smb2_iod_addrq(struct smb_rq *rqp);
443 int smb1_iod_addrq(struct smb_rq *rqp);
444 int smb1_iod_multirq(struct smb_rq *rqp);
445 int smb_iod_waitrq(struct smb_rq *rqp);
446 int smb_iod_waitrq_int(struct smb_rq *rqp);
447 void smb_iod_removerq(struct smb_rq *rqp);
448 int smb_iod_sendrecv(struct smb_rq *, int);
449 void smb_iod_shutdown_share(smb_share_t *ssp);
450
451 void smb_iod_sendall(smb_vc_t *);
452 int smb_iod_recvall(smb_vc_t *, boolean_t);
453
454 int nsmb_iod_connect(smb_vc_t *vcp, cred_t *cr);
455 int nsmb_iod_negotiate(smb_vc_t *vcp, cred_t *cr);
456 int nsmb_iod_ssnsetup(smb_vc_t *vcp, cred_t *cr);
457 int smb_iod_vc_work(smb_vc_t *, int, cred_t *);
458 int smb_iod_vc_idle(smb_vc_t *);
459 int smb_iod_vc_rcfail(smb_vc_t *);
460 int smb_iod_reconnect(smb_vc_t *);
461
462 /*
463 * Session level functions
464 */
465 int smb_sm_init(void);
466 int smb_sm_idle(void);
467 void smb_sm_done(void);
468
469 /*
470 * VC level functions
471 */
472 void smb_vc_hold(smb_vc_t *vcp);
473 void smb_vc_rele(smb_vc_t *vcp);
474 void smb_vc_kill(smb_vc_t *vcp);
475
476 int smb_vc_findcreate(smbioc_ossn_t *, smb_cred_t *, smb_vc_t **);
477 int smb_vc_create(smbioc_ossn_t *ossn, smb_cred_t *scred, smb_vc_t **vcpp);
480 uint16_t smb_vc_nextmid(smb_vc_t *vcp);
481 void *smb_vc_getipaddr(smb_vc_t *vcp, int *ipvers);
482
483 typedef void (*walk_share_func_t)(smb_share_t *);
484 void smb_vc_walkshares(struct smb_vc *, walk_share_func_t);
485
486 /*
487 * share level functions
488 */
489
490 int smb_share_findcreate(smbioc_tcon_t *, smb_vc_t *,
491 smb_share_t **, smb_cred_t *);
492
493 void smb_share_hold(smb_share_t *ssp);
494 void smb_share_rele(smb_share_t *ssp);
495 void smb_share_kill(smb_share_t *ssp);
496
497 void smb_share_invalidate(smb_share_t *ssp);
498 int smb_share_tcon(smb_share_t *, smb_cred_t *);
499
500 /*
501 * File handle level functions
502 */
503 int smb_fh_create(smb_share_t *ssp, struct smb_fh **fhpp);
504 void smb_fh_opened(struct smb_fh *fhp);
505 void smb_fh_close(struct smb_fh *fhp);
506 void smb_fh_hold(struct smb_fh *fhp);
507 void smb_fh_rele(struct smb_fh *fhp);
508
509 #endif /* _SMB_CONN_H */
|