Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)
NEX-16824 SMB client connection setup rework
NEX-17232 SMB client reconnect failures
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (improve debug)
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/uts/common/fs/smbclnt/netsmb/smb_rq.h
+++ new/usr/src/uts/common/fs/smbclnt/netsmb/smb_rq.h
1 1 /*
2 2 * Copyright (c) 2000-2001, Boris Popov
3 3 * All rights reserved.
4 4 *
5 5 * Redistribution and use in source and binary forms, with or without
6 6 * modification, are permitted provided that the following conditions
7 7 * are met:
8 8 * 1. Redistributions of source code must retain the above copyright
9 9 * notice, this list of conditions and the following disclaimer.
10 10 * 2. Redistributions in binary form must reproduce the above copyright
11 11 * notice, this list of conditions and the following disclaimer in the
12 12 * documentation and/or other materials provided with the distribution.
13 13 * 3. All advertising materials mentioning features or use of this software
14 14 * must display the following acknowledgement:
15 15 * This product includes software developed by Boris Popov.
16 16 * 4. Neither the name of the author nor the names of any co-contributors
17 17 * may be used to endorse or promote products derived from this software
18 18 * without specific prior written permission.
19 19 *
20 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
↓ open down ↓ |
26 lines elided |
↑ open up ↑ |
27 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 30 * SUCH DAMAGE.
31 31 *
32 32 * $Id: smb_rq.h,v 1.9 2005/01/22 22:20:58 lindak Exp $
33 33 */
34 34
35 35 /*
36 36 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
37 + * Portions Copyright (C) 2001 - 2012 Apple Inc. All rights reserved.
38 + * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
37 39 */
38 40
39 41 #ifndef _NETSMB_SMB_RQ_H_
40 42 #define _NETSMB_SMB_RQ_H_
41 43
42 44 #include <netsmb/mchain.h>
43 45 #include <sys/queue.h>
44 46
45 47 #define SMBR_ALLOCED 0x0001 /* structure was malloced */
46 48 #define SMBR_SENT 0x0002 /* request successfully transmitted */
47 49 #define SMBR_REXMIT 0x0004 /* request should be retransmitted */
48 50 #define SMBR_INTR 0x0008 /* request interrupted */
|
↓ open down ↓ |
2 lines elided |
↑ open up ↑ |
49 51 #define SMBR_RESTART 0x0010 /* req should be repeated if possible */
50 52 #define SMBR_NORESTART 0x0020 /* request is not restartable */
51 53 #define SMBR_MULTIPACKET 0x0040 /* multiple pkts can be sent/received */
52 54 #define SMBR_INTERNAL 0x0080 /* request enqueued by the IOD! */
53 55 #define SMBR_NOINTR_SEND 0x0100 /* no interrupt in send wait */
54 56 #define SMBR_NOINTR_RECV 0x0200 /* no interrupt in recv wait */
55 57 #define SMBR_SENDWAIT 0x0400 /* waiting for send to complete */
56 58 #define SMBR_NORECONNECT 0x0800 /* do not reconnect for this */
57 59 /* SMBR_VCREF 0x4000 * took vc reference (obsolete) */
58 60 #define SMBR_MOREDATA 0x8000 /* our buffer was too small */
61 +#define SMBR_COMPOUND_RQ 0x10000 /* SMB 2/3 compound request */
62 +#define SMBR_ASYNC 0x20000 /* got async response */
63 +#define SMBR_RECONNECTED 0x40000 /* reconnected during request */
59 64
65 +
60 66 #define SMBT2_ALLSENT 0x0001 /* all data and params are sent */
61 67 #define SMBT2_ALLRECV 0x0002 /* all data and params are received */
62 68 #define SMBT2_ALLOCED 0x0004
63 69 #define SMBT2_RESTART 0x0008
64 70 #define SMBT2_NORESTART 0x0010
65 71 #define SMBT2_MOREDATA 0x8000 /* our buffer was too small */
66 72
67 73 #define SMBRQ_LOCK(rqp) mutex_enter(&(rqp)->sr_lock)
68 74 #define SMBRQ_UNLOCK(rqp) mutex_exit(&(rqp)->sr_lock)
69 75
70 76 enum smbrq_state {
71 77 SMBRQ_NOTSENT, /* rq have data to send */
72 78 SMBRQ_SENT, /* send procedure completed */
73 79 SMBRQ_REPLYRECEIVED,
74 80 SMBRQ_NOTIFIED /* owner notified about completion */
75 81 };
76 82
77 83 struct smb_vc;
78 84
79 85 struct smb_rq {
80 86 TAILQ_ENTRY(smb_rq) sr_link;
81 87 kmutex_t sr_lock;
82 88 kcondvar_t sr_cond;
83 89 enum smbrq_state sr_state;
|
↓ open down ↓ |
14 lines elided |
↑ open up ↑ |
84 90 struct smb_vc *sr_vc;
85 91 struct smb_share *sr_share;
86 92 struct _kthread *sr_owner;
87 93 uint32_t sr_seqno; /* Seq. no. of request */
88 94 uint32_t sr_rseqno; /* Seq. no. of reply */
89 95 struct mbchain sr_rq;
90 96 uchar_t sr_cmd;
91 97 uint8_t sr_rqflags;
92 98 uint16_t sr_rqflags2;
93 99 uint16_t sr_rqtid;
94 - uint16_t sr_pid;
100 + uint32_t sr_pid;
95 101 uint16_t sr_rquid;
96 102 uint16_t sr_mid;
97 103 uchar_t *sr_wcount;
98 104 uchar_t *sr_bcount;
105 +
106 + /* SMB 2/3 request fields */
107 + struct smb_rq *sr2_compound_next;
108 + uint16_t sr2_command;
109 + uint16_t sr2_totalcreditcharge;
110 + uint16_t sr2_creditcharge;
111 + uint16_t sr2_creditsrequested;
112 + uint32_t sr2_rqflags;
113 + uint32_t sr2_nextcmd;
114 + uint64_t sr2_messageid; /* local copy of message id */
115 + uint64_t sr2_rqsessionid;
116 + uint32_t sr2_rqtreeid;
117 +
99 118 struct mdchain sr_rp;
100 119 int sr_rpgen;
101 120 int sr_rplast;
102 121 int sr_flags; /* SMBR_* */
103 122 int sr_rpsize;
104 123 struct smb_cred *sr_cred;
105 124 int sr_timo;
106 125 int sr_rexmit; /* how many more retries. dflt 0 */
107 126 int sr_sendcnt;
108 127 struct timespec sr_timesent;
109 128 int sr_lerror;
110 129 uint8_t sr_errclass;
111 130 uint16_t sr_serror;
112 131 uint32_t sr_error;
113 132 uint8_t sr_rpflags;
114 133 uint16_t sr_rpflags2;
115 134 uint16_t sr_rptid;
116 135 uint16_t sr_rppid;
117 136 uint16_t sr_rpuid;
118 137 uint16_t sr_rpmid;
138 +
139 + /* SMB2 response fields */
140 + uint16_t sr2_rspcreditsgranted;
141 + uint32_t sr2_rspflags;
142 + uint32_t sr2_rspnextcmd;
143 + uint32_t sr2_rsppid;
144 + uint32_t sr2_rsptreeid;
145 + uint64_t sr2_rspasyncid;
146 + uint64_t sr2_rspsessionid;
119 147 };
120 148 typedef struct smb_rq smb_rq_t;
121 149
122 150 struct smb_t2rq {
123 151 kmutex_t t2_lock;
124 152 kcondvar_t t2_cond;
125 153 uint16_t t2_setupcount;
126 154 uint16_t *t2_setupdata;
127 - uint16_t t2_setup[SMBIOC_T2RQ_MAXSETUP];
155 + uint16_t t2_setup[4];
128 156 uint8_t t2_maxscount; /* max setup words to return */
129 157 uint16_t t2_maxpcount; /* max param bytes to return */
130 158 uint16_t t2_maxdcount; /* max data bytes to return */
131 159 uint16_t t2_fid; /* for T2 request */
132 160 char *t_name; /* for T, must be NULL for T2 */
133 161 int t_name_len; /* t_name string length */
134 162 int t_name_maxlen; /* t_name allocated size */
135 163 int t2_flags; /* SMBT2_ */
136 164 struct mbchain t2_tparam; /* parameters to transmit */
137 165 struct mbchain t2_tdata; /* data to transmit */
138 166 struct mdchain t2_rparam; /* received paramters */
139 167 struct mdchain t2_rdata; /* received data */
140 168 struct smb_cred *t2_cred;
141 169 struct smb_connobj *t2_source;
142 170 struct smb_rq *t2_rq;
143 171 struct smb_vc *t2_vc;
144 172 struct smb_share *t2_share; /* for smb up/down */
145 173 /* unmapped windows error detail */
146 174 uint8_t t2_sr_errclass;
147 175 uint16_t t2_sr_serror;
148 176 uint32_t t2_sr_error;
149 177 uint16_t t2_sr_rpflags2;
150 178 };
151 179 typedef struct smb_t2rq smb_t2rq_t;
152 180
153 181 struct smb_ntrq {
154 182 kmutex_t nt_lock;
155 183 kcondvar_t nt_cond;
156 184 uint16_t nt_function;
157 185 uint8_t nt_maxscount; /* max setup words to return */
158 186 uint32_t nt_maxpcount; /* max param bytes to return */
159 187 uint32_t nt_maxdcount; /* max data bytes to return */
160 188 int nt_flags; /* SMBT2_ */
161 189 struct mbchain nt_tsetup; /* setup to transmit */
162 190 struct mbchain nt_tparam; /* parameters to transmit */
163 191 struct mbchain nt_tdata; /* data to transmit */
164 192 struct mdchain nt_rparam; /* received paramters */
165 193 struct mdchain nt_rdata; /* received data */
166 194 struct smb_cred *nt_cred;
167 195 struct smb_connobj *nt_source;
168 196 struct smb_rq *nt_rq;
169 197 struct smb_vc *nt_vc;
170 198 struct smb_share *nt_share; /* for smb up/down */
171 199 /* unmapped windows error details */
172 200 uint32_t nt_sr_error;
173 201 uint16_t nt_sr_rpflags2;
174 202 };
175 203 typedef struct smb_ntrq smb_ntrq_t;
176 204
|
↓ open down ↓ |
39 lines elided |
↑ open up ↑ |
177 205 #define smb_rq_getrequest(RQ, MBPP) \
178 206 *(MBPP) = &(RQ)->sr_rq
179 207 #define smb_rq_getreply(RQ, MDPP) \
180 208 *(MDPP) = &(RQ)->sr_rp
181 209
182 210 void smb_rq_done(struct smb_rq *rqp);
183 211 int smb_rq_alloc(struct smb_connobj *layer, uchar_t cmd,
184 212 struct smb_cred *scred, struct smb_rq **rqpp);
185 213 int smb_rq_init(struct smb_rq *rqp, struct smb_connobj *layer,
186 214 uchar_t cmd, struct smb_cred *scred);
215 +int smb_rq_getenv(struct smb_connobj *layer,
216 + struct smb_vc **vcpp, struct smb_share **sspp);
187 217
188 218 void smb_rq_fillhdr(struct smb_rq *rqp);
189 219 void smb_rq_wstart(struct smb_rq *rqp);
190 220 void smb_rq_wend(struct smb_rq *rqp);
191 221 void smb_rq_bstart(struct smb_rq *rqp);
192 222 void smb_rq_bend(struct smb_rq *rqp);
193 -int smb_rq_intr(struct smb_rq *rqp);
194 223 int smb_rq_simple(struct smb_rq *rqp);
195 224 int smb_rq_simple_timed(struct smb_rq *rqp, int timeout);
225 +int smb_rq_internal(struct smb_rq *rqp, int timeout);
196 226
227 +int smb2_parse_smb1nego_resp(struct smb_rq *rqp);
228 +
197 229 int smb_t2_alloc(struct smb_connobj *layer, ushort_t setup,
198 230 struct smb_cred *scred, struct smb_t2rq **rqpp);
199 231 int smb_t2_init(struct smb_t2rq *rqp, struct smb_connobj *layer,
200 232 ushort_t *setup, int setupcnt, struct smb_cred *scred);
201 233 void smb_t2_done(struct smb_t2rq *t2p);
202 234 int smb_t2_request(struct smb_t2rq *t2p);
203 235
236 +int smb_t2_xnp(struct smb_share *ssp, uint16_t fid,
237 + struct mbchain *send_mb, struct mdchain *recv_md,
238 + uint32_t *data_out_sz, uint32_t *more, struct smb_cred *scrp);
239 +
204 240 int smb_nt_alloc(struct smb_connobj *layer, ushort_t fn,
205 241 struct smb_cred *scred, struct smb_ntrq **rqpp);
206 242 int smb_nt_init(struct smb_ntrq *rqp, struct smb_connobj *layer,
207 243 ushort_t fn, struct smb_cred *scred);
208 244 void smb_nt_done(struct smb_ntrq *ntp);
209 245 int smb_nt_request(struct smb_ntrq *ntp);
210 246
211 247 #endif /* _NETSMB_SMB_RQ_H_ */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX