xref: /OK3568_Linux_fs/kernel/fs/cifs/smb2pdu.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *   fs/cifs/smb2pdu.h
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *   Copyright (c) International Business Machines  Corp., 2009, 2013
5*4882a593Smuzhiyun  *                 Etersoft, 2012
6*4882a593Smuzhiyun  *   Author(s): Steve French (sfrench@us.ibm.com)
7*4882a593Smuzhiyun  *              Pavel Shilovsky (pshilovsky@samba.org) 2012
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  *   This library is free software; you can redistribute it and/or modify
10*4882a593Smuzhiyun  *   it under the terms of the GNU Lesser General Public License as published
11*4882a593Smuzhiyun  *   by the Free Software Foundation; either version 2.1 of the License, or
12*4882a593Smuzhiyun  *   (at your option) any later version.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *   This library is distributed in the hope that it will be useful,
15*4882a593Smuzhiyun  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
16*4882a593Smuzhiyun  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
17*4882a593Smuzhiyun  *   the GNU Lesser General Public License for more details.
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  *   You should have received a copy of the GNU Lesser General Public License
20*4882a593Smuzhiyun  *   along with this library; if not, write to the Free Software
21*4882a593Smuzhiyun  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef _SMB2PDU_H
25*4882a593Smuzhiyun #define _SMB2PDU_H
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <net/sock.h>
28*4882a593Smuzhiyun #include <cifsacl.h>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /*
31*4882a593Smuzhiyun  * Note that, due to trying to use names similar to the protocol specifications,
32*4882a593Smuzhiyun  * there are many mixed case field names in the structures below.  Although
33*4882a593Smuzhiyun  * this does not match typical Linux kernel style, it is necessary to be
34*4882a593Smuzhiyun  * able to match against the protocol specfication.
35*4882a593Smuzhiyun  *
36*4882a593Smuzhiyun  * SMB2 commands
37*4882a593Smuzhiyun  * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses
38*4882a593Smuzhiyun  * (ie no useful data other than the SMB error code itself) and are marked such.
39*4882a593Smuzhiyun  * Knowing this helps avoid response buffer allocations and copy in some cases.
40*4882a593Smuzhiyun  */
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* List of commands in host endian */
43*4882a593Smuzhiyun #define SMB2_NEGOTIATE_HE	0x0000
44*4882a593Smuzhiyun #define SMB2_SESSION_SETUP_HE	0x0001
45*4882a593Smuzhiyun #define SMB2_LOGOFF_HE		0x0002 /* trivial request/resp */
46*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_HE	0x0003
47*4882a593Smuzhiyun #define SMB2_TREE_DISCONNECT_HE	0x0004 /* trivial req/resp */
48*4882a593Smuzhiyun #define SMB2_CREATE_HE		0x0005
49*4882a593Smuzhiyun #define SMB2_CLOSE_HE		0x0006
50*4882a593Smuzhiyun #define SMB2_FLUSH_HE		0x0007 /* trivial resp */
51*4882a593Smuzhiyun #define SMB2_READ_HE		0x0008
52*4882a593Smuzhiyun #define SMB2_WRITE_HE		0x0009
53*4882a593Smuzhiyun #define SMB2_LOCK_HE		0x000A
54*4882a593Smuzhiyun #define SMB2_IOCTL_HE		0x000B
55*4882a593Smuzhiyun #define SMB2_CANCEL_HE		0x000C
56*4882a593Smuzhiyun #define SMB2_ECHO_HE		0x000D
57*4882a593Smuzhiyun #define SMB2_QUERY_DIRECTORY_HE	0x000E
58*4882a593Smuzhiyun #define SMB2_CHANGE_NOTIFY_HE	0x000F
59*4882a593Smuzhiyun #define SMB2_QUERY_INFO_HE	0x0010
60*4882a593Smuzhiyun #define SMB2_SET_INFO_HE	0x0011
61*4882a593Smuzhiyun #define SMB2_OPLOCK_BREAK_HE	0x0012
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* The same list in little endian */
64*4882a593Smuzhiyun #define SMB2_NEGOTIATE		cpu_to_le16(SMB2_NEGOTIATE_HE)
65*4882a593Smuzhiyun #define SMB2_SESSION_SETUP	cpu_to_le16(SMB2_SESSION_SETUP_HE)
66*4882a593Smuzhiyun #define SMB2_LOGOFF		cpu_to_le16(SMB2_LOGOFF_HE)
67*4882a593Smuzhiyun #define SMB2_TREE_CONNECT	cpu_to_le16(SMB2_TREE_CONNECT_HE)
68*4882a593Smuzhiyun #define SMB2_TREE_DISCONNECT	cpu_to_le16(SMB2_TREE_DISCONNECT_HE)
69*4882a593Smuzhiyun #define SMB2_CREATE		cpu_to_le16(SMB2_CREATE_HE)
70*4882a593Smuzhiyun #define SMB2_CLOSE		cpu_to_le16(SMB2_CLOSE_HE)
71*4882a593Smuzhiyun #define SMB2_FLUSH		cpu_to_le16(SMB2_FLUSH_HE)
72*4882a593Smuzhiyun #define SMB2_READ		cpu_to_le16(SMB2_READ_HE)
73*4882a593Smuzhiyun #define SMB2_WRITE		cpu_to_le16(SMB2_WRITE_HE)
74*4882a593Smuzhiyun #define SMB2_LOCK		cpu_to_le16(SMB2_LOCK_HE)
75*4882a593Smuzhiyun #define SMB2_IOCTL		cpu_to_le16(SMB2_IOCTL_HE)
76*4882a593Smuzhiyun #define SMB2_CANCEL		cpu_to_le16(SMB2_CANCEL_HE)
77*4882a593Smuzhiyun #define SMB2_ECHO		cpu_to_le16(SMB2_ECHO_HE)
78*4882a593Smuzhiyun #define SMB2_QUERY_DIRECTORY	cpu_to_le16(SMB2_QUERY_DIRECTORY_HE)
79*4882a593Smuzhiyun #define SMB2_CHANGE_NOTIFY	cpu_to_le16(SMB2_CHANGE_NOTIFY_HE)
80*4882a593Smuzhiyun #define SMB2_QUERY_INFO		cpu_to_le16(SMB2_QUERY_INFO_HE)
81*4882a593Smuzhiyun #define SMB2_SET_INFO		cpu_to_le16(SMB2_SET_INFO_HE)
82*4882a593Smuzhiyun #define SMB2_OPLOCK_BREAK	cpu_to_le16(SMB2_OPLOCK_BREAK_HE)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define SMB2_INTERNAL_CMD	cpu_to_le16(0xFFFF)
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define NUMBER_OF_SMB2_COMMANDS	0x0013
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* 52 transform hdr + 64 hdr + 88 create rsp */
89*4882a593Smuzhiyun #define SMB2_TRANSFORM_HEADER_SIZE 52
90*4882a593Smuzhiyun #define MAX_SMB2_HDR_SIZE 204
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define SMB2_PROTO_NUMBER cpu_to_le32(0x424d53fe)
93*4882a593Smuzhiyun #define SMB2_TRANSFORM_PROTO_NUM cpu_to_le32(0x424d53fd)
94*4882a593Smuzhiyun #define SMB2_COMPRESSION_TRANSFORM_ID cpu_to_le32(0x424d53fc)
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /*
97*4882a593Smuzhiyun  * SMB2 Header Definition
98*4882a593Smuzhiyun  *
99*4882a593Smuzhiyun  * "MBZ" :  Must be Zero
100*4882a593Smuzhiyun  * "BB"  :  BugBug, Something to check/review/analyze later
101*4882a593Smuzhiyun  * "PDU" :  "Protocol Data Unit" (ie a network "frame")
102*4882a593Smuzhiyun  *
103*4882a593Smuzhiyun  */
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define SMB2_HEADER_STRUCTURE_SIZE cpu_to_le16(64)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun struct smb2_sync_hdr {
108*4882a593Smuzhiyun 	__le32 ProtocolId;	/* 0xFE 'S' 'M' 'B' */
109*4882a593Smuzhiyun 	__le16 StructureSize;	/* 64 */
110*4882a593Smuzhiyun 	__le16 CreditCharge;	/* MBZ */
111*4882a593Smuzhiyun 	__le32 Status;		/* Error from server */
112*4882a593Smuzhiyun 	__le16 Command;
113*4882a593Smuzhiyun 	__le16 CreditRequest;  /* CreditResponse */
114*4882a593Smuzhiyun 	__le32 Flags;
115*4882a593Smuzhiyun 	__le32 NextCommand;
116*4882a593Smuzhiyun 	__le64 MessageId;
117*4882a593Smuzhiyun 	__le32 ProcessId;
118*4882a593Smuzhiyun 	__u32  TreeId;		/* opaque - so do not make little endian */
119*4882a593Smuzhiyun 	__u64  SessionId;	/* opaque - so do not make little endian */
120*4882a593Smuzhiyun 	__u8   Signature[16];
121*4882a593Smuzhiyun } __packed;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* The total header size for SMB2 read and write */
124*4882a593Smuzhiyun #define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_sync_hdr))
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct smb2_sync_pdu {
127*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
128*4882a593Smuzhiyun 	__le16 StructureSize2; /* size of wct area (varies, request specific) */
129*4882a593Smuzhiyun } __packed;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define SMB3_AES_CCM_NONCE 11
132*4882a593Smuzhiyun #define SMB3_AES_GCM_NONCE 12
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /* Transform flags (for 3.0 dialect this flag indicates CCM */
135*4882a593Smuzhiyun #define TRANSFORM_FLAG_ENCRYPTED	0x0001
136*4882a593Smuzhiyun struct smb2_transform_hdr {
137*4882a593Smuzhiyun 	__le32 ProtocolId;	/* 0xFD 'S' 'M' 'B' */
138*4882a593Smuzhiyun 	__u8   Signature[16];
139*4882a593Smuzhiyun 	__u8   Nonce[16];
140*4882a593Smuzhiyun 	__le32 OriginalMessageSize;
141*4882a593Smuzhiyun 	__u16  Reserved1;
142*4882a593Smuzhiyun 	__le16 Flags; /* EncryptionAlgorithm for 3.0, enc enabled for 3.1.1 */
143*4882a593Smuzhiyun 	__u64  SessionId;
144*4882a593Smuzhiyun } __packed;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* See MS-SMB2 2.2.42 */
147*4882a593Smuzhiyun struct smb2_compression_transform_hdr {
148*4882a593Smuzhiyun 	__le32 ProtocolId;	/* 0xFC 'S' 'M' 'B' */
149*4882a593Smuzhiyun 	__le32 OriginalCompressedSegmentSize;
150*4882a593Smuzhiyun 	__le16 CompressionAlgorithm;
151*4882a593Smuzhiyun 	__le16 Flags;
152*4882a593Smuzhiyun 	__le16 Length; /* if chained it is length, else offset */
153*4882a593Smuzhiyun } __packed;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* See MS-SMB2 2.2.42.1 */
156*4882a593Smuzhiyun #define SMB2_COMPRESSION_FLAG_NONE	0x0000
157*4882a593Smuzhiyun #define SMB2_COMPRESSION_FLAG_CHAINED	0x0001
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun struct compression_payload_header {
160*4882a593Smuzhiyun 	__le16	CompressionAlgorithm;
161*4882a593Smuzhiyun 	__le16	Flags;
162*4882a593Smuzhiyun 	__le32	Length; /* length of compressed playload including field below if present */
163*4882a593Smuzhiyun 	/* __le32 OriginalPayloadSize; */ /* optional */
164*4882a593Smuzhiyun } __packed;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* See MS-SMB2 2.2.42.2 */
167*4882a593Smuzhiyun struct compression_pattern_payload_v1 {
168*4882a593Smuzhiyun 	__le16	Pattern;
169*4882a593Smuzhiyun 	__le16	Reserved1;
170*4882a593Smuzhiyun 	__le16	Reserved2;
171*4882a593Smuzhiyun 	__le32	Repetitions;
172*4882a593Smuzhiyun } __packed;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /* See MS-SMB2 2.2.43 */
175*4882a593Smuzhiyun struct smb2_rdma_transform {
176*4882a593Smuzhiyun 	__le16 RdmaDescriptorOffset;
177*4882a593Smuzhiyun 	__le16 RdmaDescriptorLength;
178*4882a593Smuzhiyun 	__le32 Channel; /* for values see channel description in smb2 read above */
179*4882a593Smuzhiyun 	__le16 TransformCount;
180*4882a593Smuzhiyun 	__le16 Reserved1;
181*4882a593Smuzhiyun 	__le32 Reserved2;
182*4882a593Smuzhiyun } __packed;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun struct smb2_rdma_encryption_transform {
185*4882a593Smuzhiyun 	__le16	TransformType;
186*4882a593Smuzhiyun 	__le16	SignatureLength;
187*4882a593Smuzhiyun 	__le16	NonceLength;
188*4882a593Smuzhiyun 	__u16	Reserved;
189*4882a593Smuzhiyun 	__u8	Signature[]; /* variable length */
190*4882a593Smuzhiyun 	/* u8 Nonce[] */
191*4882a593Smuzhiyun 	/* followed by padding */
192*4882a593Smuzhiyun } __packed;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun /*
195*4882a593Smuzhiyun  *	SMB2 flag definitions
196*4882a593Smuzhiyun  */
197*4882a593Smuzhiyun #define SMB2_FLAGS_SERVER_TO_REDIR	cpu_to_le32(0x00000001)
198*4882a593Smuzhiyun #define SMB2_FLAGS_ASYNC_COMMAND	cpu_to_le32(0x00000002)
199*4882a593Smuzhiyun #define SMB2_FLAGS_RELATED_OPERATIONS	cpu_to_le32(0x00000004)
200*4882a593Smuzhiyun #define SMB2_FLAGS_SIGNED		cpu_to_le32(0x00000008)
201*4882a593Smuzhiyun #define SMB2_FLAGS_PRIORITY_MASK	cpu_to_le32(0x00000070) /* SMB3.1.1 */
202*4882a593Smuzhiyun #define SMB2_FLAGS_DFS_OPERATIONS	cpu_to_le32(0x10000000)
203*4882a593Smuzhiyun #define SMB2_FLAGS_REPLAY_OPERATION	cpu_to_le32(0x20000000) /* SMB3 & up */
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun /*
206*4882a593Smuzhiyun  *	Definitions for SMB2 Protocol Data Units (network frames)
207*4882a593Smuzhiyun  *
208*4882a593Smuzhiyun  *  See MS-SMB2.PDF specification for protocol details.
209*4882a593Smuzhiyun  *  The Naming convention is the lower case version of the SMB2
210*4882a593Smuzhiyun  *  command code name for the struct. Note that structures must be packed.
211*4882a593Smuzhiyun  *
212*4882a593Smuzhiyun  */
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define COMPOUND_FID 0xFFFFFFFFFFFFFFFFULL
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun #define SMB2_ERROR_STRUCTURE_SIZE2 cpu_to_le16(9)
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun struct smb2_err_rsp {
219*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
220*4882a593Smuzhiyun 	__le16 StructureSize;
221*4882a593Smuzhiyun 	__le16 Reserved; /* MBZ */
222*4882a593Smuzhiyun 	__le32 ByteCount;  /* even if zero, at least one byte follows */
223*4882a593Smuzhiyun 	__u8   ErrorData[1];  /* variable length */
224*4882a593Smuzhiyun } __packed;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #define SYMLINK_ERROR_TAG 0x4c4d5953
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun struct smb2_symlink_err_rsp {
229*4882a593Smuzhiyun 	__le32 SymLinkLength;
230*4882a593Smuzhiyun 	__le32 SymLinkErrorTag;
231*4882a593Smuzhiyun 	__le32 ReparseTag;
232*4882a593Smuzhiyun 	__le16 ReparseDataLength;
233*4882a593Smuzhiyun 	__le16 UnparsedPathLength;
234*4882a593Smuzhiyun 	__le16 SubstituteNameOffset;
235*4882a593Smuzhiyun 	__le16 SubstituteNameLength;
236*4882a593Smuzhiyun 	__le16 PrintNameOffset;
237*4882a593Smuzhiyun 	__le16 PrintNameLength;
238*4882a593Smuzhiyun 	__le32 Flags;
239*4882a593Smuzhiyun 	__u8  PathBuffer[];
240*4882a593Smuzhiyun } __packed;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun /* SMB 3.1.1 and later dialects. See MS-SMB2 section 2.2.2.1 */
243*4882a593Smuzhiyun struct smb2_error_context_rsp {
244*4882a593Smuzhiyun 	__le32 ErrorDataLength;
245*4882a593Smuzhiyun 	__le32 ErrorId;
246*4882a593Smuzhiyun 	__u8  ErrorContextData; /* ErrorDataLength long array */
247*4882a593Smuzhiyun } __packed;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /* ErrorId values */
250*4882a593Smuzhiyun #define SMB2_ERROR_ID_DEFAULT		0x00000000
251*4882a593Smuzhiyun #define SMB2_ERROR_ID_SHARE_REDIRECT	cpu_to_le32(0x72645253)	/* "rdRS" */
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun /* Defines for Type field below (see MS-SMB2 2.2.2.2.2.1) */
254*4882a593Smuzhiyun #define MOVE_DST_IPADDR_V4	cpu_to_le32(0x00000001)
255*4882a593Smuzhiyun #define MOVE_DST_IPADDR_V6	cpu_to_le32(0x00000002)
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun struct move_dst_ipaddr {
258*4882a593Smuzhiyun 	__le32 Type;
259*4882a593Smuzhiyun 	__u32  Reserved;
260*4882a593Smuzhiyun 	__u8   address[16]; /* IPv4 followed by 12 bytes rsvd or IPv6 address */
261*4882a593Smuzhiyun } __packed;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun struct share_redirect_error_context_rsp {
264*4882a593Smuzhiyun 	__le32 StructureSize;
265*4882a593Smuzhiyun 	__le32 NotificationType;
266*4882a593Smuzhiyun 	__le32 ResourceNameOffset;
267*4882a593Smuzhiyun 	__le32 ResourceNameLength;
268*4882a593Smuzhiyun 	__le16 Flags;
269*4882a593Smuzhiyun 	__le16 TargetType;
270*4882a593Smuzhiyun 	__le32 IPAddrCount;
271*4882a593Smuzhiyun 	struct move_dst_ipaddr IpAddrMoveList[];
272*4882a593Smuzhiyun 	/* __u8 ResourceName[] */ /* Name of share as counted Unicode string */
273*4882a593Smuzhiyun } __packed;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun #define SMB2_CLIENT_GUID_SIZE 16
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun struct smb2_negotiate_req {
278*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
279*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 36 */
280*4882a593Smuzhiyun 	__le16 DialectCount;
281*4882a593Smuzhiyun 	__le16 SecurityMode;
282*4882a593Smuzhiyun 	__le16 Reserved;	/* MBZ */
283*4882a593Smuzhiyun 	__le32 Capabilities;
284*4882a593Smuzhiyun 	__u8   ClientGUID[SMB2_CLIENT_GUID_SIZE];
285*4882a593Smuzhiyun 	/* In SMB3.02 and earlier next three were MBZ le64 ClientStartTime */
286*4882a593Smuzhiyun 	__le32 NegotiateContextOffset; /* SMB3.1.1 only. MBZ earlier */
287*4882a593Smuzhiyun 	__le16 NegotiateContextCount;  /* SMB3.1.1 only. MBZ earlier */
288*4882a593Smuzhiyun 	__le16 Reserved2;
289*4882a593Smuzhiyun 	__le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */
290*4882a593Smuzhiyun } __packed;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun /* Dialects */
293*4882a593Smuzhiyun #define SMB10_PROT_ID 0x0000 /* local only, not sent on wire w/CIFS negprot */
294*4882a593Smuzhiyun #define SMB20_PROT_ID 0x0202
295*4882a593Smuzhiyun #define SMB21_PROT_ID 0x0210
296*4882a593Smuzhiyun #define SMB30_PROT_ID 0x0300
297*4882a593Smuzhiyun #define SMB302_PROT_ID 0x0302
298*4882a593Smuzhiyun #define SMB311_PROT_ID 0x0311
299*4882a593Smuzhiyun #define BAD_PROT_ID   0xFFFF
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /* SecurityMode flags */
302*4882a593Smuzhiyun #define	SMB2_NEGOTIATE_SIGNING_ENABLED	0x0001
303*4882a593Smuzhiyun #define SMB2_NEGOTIATE_SIGNING_REQUIRED	0x0002
304*4882a593Smuzhiyun #define SMB2_SEC_MODE_FLAGS_ALL		0x0003
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /* Capabilities flags */
307*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_DFS		0x00000001
308*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_LEASING		0x00000002 /* Resp only New to SMB2.1 */
309*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_LARGE_MTU	0X00000004 /* Resp only New to SMB2.1 */
310*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_MULTI_CHANNEL	0x00000008 /* New to SMB3 */
311*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_PERSISTENT_HANDLES 0x00000010 /* New to SMB3 */
312*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_DIRECTORY_LEASING  0x00000020 /* New to SMB3 */
313*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_ENCRYPTION	0x00000040 /* New to SMB3 */
314*4882a593Smuzhiyun /* Internal types */
315*4882a593Smuzhiyun #define SMB2_NT_FIND			0x00100000
316*4882a593Smuzhiyun #define SMB2_LARGE_FILES		0x00200000
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun /* Negotiate Contexts - ContextTypes. See MS-SMB2 section 2.2.3.1 for details */
320*4882a593Smuzhiyun #define SMB2_PREAUTH_INTEGRITY_CAPABILITIES	cpu_to_le16(1)
321*4882a593Smuzhiyun #define SMB2_ENCRYPTION_CAPABILITIES		cpu_to_le16(2)
322*4882a593Smuzhiyun #define SMB2_COMPRESSION_CAPABILITIES		cpu_to_le16(3)
323*4882a593Smuzhiyun #define SMB2_NETNAME_NEGOTIATE_CONTEXT_ID	cpu_to_le16(5)
324*4882a593Smuzhiyun #define SMB2_TRANSPORT_CAPABILITIES		cpu_to_le16(6)
325*4882a593Smuzhiyun #define SMB2_RDMA_TRANSFORM_CAPABILITIES	cpu_to_le16(7)
326*4882a593Smuzhiyun #define SMB2_SIGNING_CAPABILITIES		cpu_to_le16(8)
327*4882a593Smuzhiyun #define SMB2_POSIX_EXTENSIONS_AVAILABLE		cpu_to_le16(0x100)
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun struct smb2_neg_context {
330*4882a593Smuzhiyun 	__le16	ContextType;
331*4882a593Smuzhiyun 	__le16	DataLength;
332*4882a593Smuzhiyun 	__le32	Reserved;
333*4882a593Smuzhiyun 	/* Followed by array of data */
334*4882a593Smuzhiyun } __packed;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun #define SMB311_LINUX_CLIENT_SALT_SIZE			32
337*4882a593Smuzhiyun /* Hash Algorithm Types */
338*4882a593Smuzhiyun #define SMB2_PREAUTH_INTEGRITY_SHA512	cpu_to_le16(0x0001)
339*4882a593Smuzhiyun #define SMB2_PREAUTH_HASH_SIZE 64
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun /*
342*4882a593Smuzhiyun  * SaltLength that the server send can be zero, so the only three required
343*4882a593Smuzhiyun  * fields (all __le16) end up six bytes total, so the minimum context data len
344*4882a593Smuzhiyun  * in the response is six bytes which accounts for
345*4882a593Smuzhiyun  *
346*4882a593Smuzhiyun  *      HashAlgorithmCount, SaltLength, and 1 HashAlgorithm.
347*4882a593Smuzhiyun  */
348*4882a593Smuzhiyun #define MIN_PREAUTH_CTXT_DATA_LEN 6
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun struct smb2_preauth_neg_context {
351*4882a593Smuzhiyun 	__le16	ContextType; /* 1 */
352*4882a593Smuzhiyun 	__le16	DataLength;
353*4882a593Smuzhiyun 	__le32	Reserved;
354*4882a593Smuzhiyun 	__le16	HashAlgorithmCount; /* 1 */
355*4882a593Smuzhiyun 	__le16	SaltLength;
356*4882a593Smuzhiyun 	__le16	HashAlgorithms; /* HashAlgorithms[0] since only one defined */
357*4882a593Smuzhiyun 	__u8	Salt[SMB311_LINUX_CLIENT_SALT_SIZE];
358*4882a593Smuzhiyun } __packed;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun /* Encryption Algorithms Ciphers */
361*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES128_CCM	cpu_to_le16(0x0001)
362*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES128_GCM	cpu_to_le16(0x0002)
363*4882a593Smuzhiyun /* we currently do not request AES256_CCM since presumably GCM faster */
364*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES256_CCM      cpu_to_le16(0x0003)
365*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES256_GCM      cpu_to_le16(0x0004)
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun /* Min encrypt context data is one cipher so 2 bytes + 2 byte count field */
368*4882a593Smuzhiyun #define MIN_ENCRYPT_CTXT_DATA_LEN	4
369*4882a593Smuzhiyun struct smb2_encryption_neg_context {
370*4882a593Smuzhiyun 	__le16	ContextType; /* 2 */
371*4882a593Smuzhiyun 	__le16	DataLength;
372*4882a593Smuzhiyun 	__le32	Reserved;
373*4882a593Smuzhiyun 	/* CipherCount usally 2, but can be 3 when AES256-GCM enabled */
374*4882a593Smuzhiyun 	__le16	CipherCount; /* AES128-GCM and AES128-CCM by default */
375*4882a593Smuzhiyun 	__le16	Ciphers[3];
376*4882a593Smuzhiyun } __packed;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /* See MS-SMB2 2.2.3.1.3 */
379*4882a593Smuzhiyun #define SMB3_COMPRESS_NONE	cpu_to_le16(0x0000)
380*4882a593Smuzhiyun #define SMB3_COMPRESS_LZNT1	cpu_to_le16(0x0001)
381*4882a593Smuzhiyun #define SMB3_COMPRESS_LZ77	cpu_to_le16(0x0002)
382*4882a593Smuzhiyun #define SMB3_COMPRESS_LZ77_HUFF	cpu_to_le16(0x0003)
383*4882a593Smuzhiyun /* Pattern scanning algorithm See MS-SMB2 3.1.4.4.1 */
384*4882a593Smuzhiyun #define SMB3_COMPRESS_PATTERN	cpu_to_le16(0x0004) /* Pattern_V1 */
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun /* Compression Flags */
387*4882a593Smuzhiyun #define SMB2_COMPRESSION_CAPABILITIES_FLAG_NONE		cpu_to_le32(0x00000000)
388*4882a593Smuzhiyun #define SMB2_COMPRESSION_CAPABILITIES_FLAG_CHAINED	cpu_to_le32(0x00000001)
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun struct smb2_compression_capabilities_context {
391*4882a593Smuzhiyun 	__le16	ContextType; /* 3 */
392*4882a593Smuzhiyun 	__le16  DataLength;
393*4882a593Smuzhiyun 	__u32	Reserved;
394*4882a593Smuzhiyun 	__le16	CompressionAlgorithmCount;
395*4882a593Smuzhiyun 	__u16	Padding;
396*4882a593Smuzhiyun 	__u32	Flags;
397*4882a593Smuzhiyun 	__le16	CompressionAlgorithms[3];
398*4882a593Smuzhiyun } __packed;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun /*
401*4882a593Smuzhiyun  * For smb2_netname_negotiate_context_id See MS-SMB2 2.2.3.1.4.
402*4882a593Smuzhiyun  * Its struct simply contains NetName, an array of Unicode characters
403*4882a593Smuzhiyun  */
404*4882a593Smuzhiyun struct smb2_netname_neg_context {
405*4882a593Smuzhiyun 	__le16	ContextType; /* 5 */
406*4882a593Smuzhiyun 	__le16	DataLength;
407*4882a593Smuzhiyun 	__le32	Reserved;
408*4882a593Smuzhiyun 	__le16	NetName[]; /* hostname of target converted to UCS-2 */
409*4882a593Smuzhiyun } __packed;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun /*
412*4882a593Smuzhiyun  * For rdma transform capabilities context see MS-SMB2 2.2.3.1.6
413*4882a593Smuzhiyun  * and 2.2.4.1.5
414*4882a593Smuzhiyun  */
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun /* RDMA Transform IDs */
417*4882a593Smuzhiyun #define SMB2_RDMA_TRANSFORM_NONE	0x0000
418*4882a593Smuzhiyun #define SMB2_RDMA_TRANSFORM_ENCRYPTION	0x0001
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun struct smb2_rdma_transform_capabilities_context {
421*4882a593Smuzhiyun 	__le16	ContextType; /* 7 */
422*4882a593Smuzhiyun 	__le16  DataLength;
423*4882a593Smuzhiyun 	__u32	Reserved;
424*4882a593Smuzhiyun 	__le16	TransformCount;
425*4882a593Smuzhiyun 	__u16	Reserved1;
426*4882a593Smuzhiyun 	__u32	Reserved2;
427*4882a593Smuzhiyun 	__le16	RDMATransformIds[1];
428*4882a593Smuzhiyun } __packed;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun /* Signing algorithms */
431*4882a593Smuzhiyun #define SIGNING_ALG_HMAC_SHA256	0
432*4882a593Smuzhiyun #define SIGNING_ALG_AES_CMAC	1
433*4882a593Smuzhiyun #define SIGNING_ALG_AES_GMAC	2
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun struct smb2_signing_capabilities {
436*4882a593Smuzhiyun 	__le16	ContextType; /* 8 */
437*4882a593Smuzhiyun 	__le16	DataLength;
438*4882a593Smuzhiyun 	__u32	Reserved;
439*4882a593Smuzhiyun 	__le16	SigningAlgorithmCount;
440*4882a593Smuzhiyun 	__le16	SigningAlgorithms[];
441*4882a593Smuzhiyun } __packed;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun #define POSIX_CTXT_DATA_LEN	16
444*4882a593Smuzhiyun struct smb2_posix_neg_context {
445*4882a593Smuzhiyun 	__le16	ContextType; /* 0x100 */
446*4882a593Smuzhiyun 	__le16	DataLength;
447*4882a593Smuzhiyun 	__le32	Reserved;
448*4882a593Smuzhiyun 	__u8	Name[16]; /* POSIX ctxt GUID 93AD25509CB411E7B42383DE968BCD7C */
449*4882a593Smuzhiyun } __packed;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun struct smb2_negotiate_rsp {
452*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
453*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 65 */
454*4882a593Smuzhiyun 	__le16 SecurityMode;
455*4882a593Smuzhiyun 	__le16 DialectRevision;
456*4882a593Smuzhiyun 	__le16 NegotiateContextCount;	/* Prior to SMB3.1.1 was Reserved & MBZ */
457*4882a593Smuzhiyun 	__u8   ServerGUID[16];
458*4882a593Smuzhiyun 	__le32 Capabilities;
459*4882a593Smuzhiyun 	__le32 MaxTransactSize;
460*4882a593Smuzhiyun 	__le32 MaxReadSize;
461*4882a593Smuzhiyun 	__le32 MaxWriteSize;
462*4882a593Smuzhiyun 	__le64 SystemTime;	/* MBZ */
463*4882a593Smuzhiyun 	__le64 ServerStartTime;
464*4882a593Smuzhiyun 	__le16 SecurityBufferOffset;
465*4882a593Smuzhiyun 	__le16 SecurityBufferLength;
466*4882a593Smuzhiyun 	__le32 NegotiateContextOffset;	/* Pre:SMB3.1.1 was reserved/ignored */
467*4882a593Smuzhiyun 	__u8   Buffer[1];	/* variable length GSS security buffer */
468*4882a593Smuzhiyun } __packed;
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun /* Flags */
471*4882a593Smuzhiyun #define SMB2_SESSION_REQ_FLAG_BINDING		0x01
472*4882a593Smuzhiyun #define SMB2_SESSION_REQ_FLAG_ENCRYPT_DATA	0x04
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun struct smb2_sess_setup_req {
475*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
476*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 25 */
477*4882a593Smuzhiyun 	__u8   Flags;
478*4882a593Smuzhiyun 	__u8   SecurityMode;
479*4882a593Smuzhiyun 	__le32 Capabilities;
480*4882a593Smuzhiyun 	__le32 Channel;
481*4882a593Smuzhiyun 	__le16 SecurityBufferOffset;
482*4882a593Smuzhiyun 	__le16 SecurityBufferLength;
483*4882a593Smuzhiyun 	__u64 PreviousSessionId;
484*4882a593Smuzhiyun 	__u8   Buffer[1];	/* variable length GSS security buffer */
485*4882a593Smuzhiyun } __packed;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun /* Currently defined SessionFlags */
488*4882a593Smuzhiyun #define SMB2_SESSION_FLAG_IS_GUEST	0x0001
489*4882a593Smuzhiyun #define SMB2_SESSION_FLAG_IS_NULL	0x0002
490*4882a593Smuzhiyun #define SMB2_SESSION_FLAG_ENCRYPT_DATA	0x0004
491*4882a593Smuzhiyun struct smb2_sess_setup_rsp {
492*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
493*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 9 */
494*4882a593Smuzhiyun 	__le16 SessionFlags;
495*4882a593Smuzhiyun 	__le16 SecurityBufferOffset;
496*4882a593Smuzhiyun 	__le16 SecurityBufferLength;
497*4882a593Smuzhiyun 	__u8   Buffer[1];	/* variable length GSS security buffer */
498*4882a593Smuzhiyun } __packed;
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun struct smb2_logoff_req {
501*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
502*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 4 */
503*4882a593Smuzhiyun 	__le16 Reserved;
504*4882a593Smuzhiyun } __packed;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun struct smb2_logoff_rsp {
507*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
508*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 4 */
509*4882a593Smuzhiyun 	__le16 Reserved;
510*4882a593Smuzhiyun } __packed;
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun /* Flags/Reserved for SMB3.1.1 */
513*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_FLAG_CLUSTER_RECONNECT cpu_to_le16(0x0001)
514*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_FLAG_REDIRECT_TO_OWNER cpu_to_le16(0x0002)
515*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_FLAG_EXTENSION_PRESENT cpu_to_le16(0x0004)
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun struct smb2_tree_connect_req {
518*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
519*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 9 */
520*4882a593Smuzhiyun 	__le16 Flags; /* Reserved MBZ for dialects prior to SMB3.1.1 */
521*4882a593Smuzhiyun 	__le16 PathOffset;
522*4882a593Smuzhiyun 	__le16 PathLength;
523*4882a593Smuzhiyun 	__u8   Buffer[1];	/* variable length */
524*4882a593Smuzhiyun } __packed;
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun /* See MS-SMB2 section 2.2.9.2 */
527*4882a593Smuzhiyun /* Context Types */
528*4882a593Smuzhiyun #define SMB2_RESERVED_TREE_CONNECT_CONTEXT_ID 0x0000
529*4882a593Smuzhiyun #define SMB2_REMOTED_IDENTITY_TREE_CONNECT_CONTEXT_ID cpu_to_le16(0x0001)
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun struct tree_connect_contexts {
532*4882a593Smuzhiyun 	__le16 ContextType;
533*4882a593Smuzhiyun 	__le16 DataLength;
534*4882a593Smuzhiyun 	__le32 Reserved;
535*4882a593Smuzhiyun 	__u8   Data[];
536*4882a593Smuzhiyun } __packed;
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun /* Remoted identity tree connect context structures - see MS-SMB2 2.2.9.2.1 */
539*4882a593Smuzhiyun struct smb3_blob_data {
540*4882a593Smuzhiyun 	__le16 BlobSize;
541*4882a593Smuzhiyun 	__u8   BlobData[];
542*4882a593Smuzhiyun } __packed;
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun /* Valid values for Attr */
545*4882a593Smuzhiyun #define SE_GROUP_MANDATORY		0x00000001
546*4882a593Smuzhiyun #define SE_GROUP_ENABLED_BY_DEFAULT	0x00000002
547*4882a593Smuzhiyun #define SE_GROUP_ENABLED		0x00000004
548*4882a593Smuzhiyun #define SE_GROUP_OWNER			0x00000008
549*4882a593Smuzhiyun #define SE_GROUP_USE_FOR_DENY_ONLY	0x00000010
550*4882a593Smuzhiyun #define SE_GROUP_INTEGRITY		0x00000020
551*4882a593Smuzhiyun #define SE_GROUP_INTEGRITY_ENABLED	0x00000040
552*4882a593Smuzhiyun #define SE_GROUP_RESOURCE		0x20000000
553*4882a593Smuzhiyun #define SE_GROUP_LOGON_ID		0xC0000000
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun /* struct sid_attr_data is SidData array in BlobData format then le32 Attr */
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun struct sid_array_data {
558*4882a593Smuzhiyun 	__le16 SidAttrCount;
559*4882a593Smuzhiyun 	/* SidAttrList - array of sid_attr_data structs */
560*4882a593Smuzhiyun } __packed;
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun struct luid_attr_data {
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun } __packed;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun /*
567*4882a593Smuzhiyun  * struct privilege_data is the same as BLOB_DATA - see MS-SMB2 2.2.9.2.1.5
568*4882a593Smuzhiyun  * but with size of LUID_ATTR_DATA struct and BlobData set to LUID_ATTR DATA
569*4882a593Smuzhiyun  */
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun struct privilege_array_data {
572*4882a593Smuzhiyun 	__le16 PrivilegeCount;
573*4882a593Smuzhiyun 	/* array of privilege_data structs */
574*4882a593Smuzhiyun } __packed;
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun struct remoted_identity_tcon_context {
577*4882a593Smuzhiyun 	__le16 TicketType; /* must be 0x0001 */
578*4882a593Smuzhiyun 	__le16 TicketSize; /* total size of this struct */
579*4882a593Smuzhiyun 	__le16 User; /* offset to SID_ATTR_DATA struct with user info */
580*4882a593Smuzhiyun 	__le16 UserName; /* offset to null terminated Unicode username string */
581*4882a593Smuzhiyun 	__le16 Domain; /* offset to null terminated Unicode domain name */
582*4882a593Smuzhiyun 	__le16 Groups; /* offset to SID_ARRAY_DATA struct with group info */
583*4882a593Smuzhiyun 	__le16 RestrictedGroups; /* similar to above */
584*4882a593Smuzhiyun 	__le16 Privileges; /* offset to PRIVILEGE_ARRAY_DATA struct */
585*4882a593Smuzhiyun 	__le16 PrimaryGroup; /* offset to SID_ARRAY_DATA struct */
586*4882a593Smuzhiyun 	__le16 Owner; /* offset to BLOB_DATA struct */
587*4882a593Smuzhiyun 	__le16 DefaultDacl; /* offset to BLOB_DATA struct */
588*4882a593Smuzhiyun 	__le16 DeviceGroups; /* offset to SID_ARRAY_DATA struct */
589*4882a593Smuzhiyun 	__le16 UserClaims; /* offset to BLOB_DATA struct */
590*4882a593Smuzhiyun 	__le16 DeviceClaims; /* offset to BLOB_DATA struct */
591*4882a593Smuzhiyun 	__u8   TicketInfo[]; /* variable length buf - remoted identity data */
592*4882a593Smuzhiyun } __packed;
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun struct smb2_tree_connect_req_extension {
595*4882a593Smuzhiyun 	__le32 TreeConnectContextOffset;
596*4882a593Smuzhiyun 	__le16 TreeConnectContextCount;
597*4882a593Smuzhiyun 	__u8  Reserved[10];
598*4882a593Smuzhiyun 	__u8  PathName[]; /* variable sized array */
599*4882a593Smuzhiyun 	/* followed by array of TreeConnectContexts */
600*4882a593Smuzhiyun } __packed;
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun struct smb2_tree_connect_rsp {
603*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
604*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 16 */
605*4882a593Smuzhiyun 	__u8   ShareType;  /* see below */
606*4882a593Smuzhiyun 	__u8   Reserved;
607*4882a593Smuzhiyun 	__le32 ShareFlags; /* see below */
608*4882a593Smuzhiyun 	__le32 Capabilities; /* see below */
609*4882a593Smuzhiyun 	__le32 MaximalAccess;
610*4882a593Smuzhiyun } __packed;
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun /* Possible ShareType values */
613*4882a593Smuzhiyun #define SMB2_SHARE_TYPE_DISK	0x01
614*4882a593Smuzhiyun #define SMB2_SHARE_TYPE_PIPE	0x02
615*4882a593Smuzhiyun #define	SMB2_SHARE_TYPE_PRINT	0x03
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun /*
618*4882a593Smuzhiyun  * Possible ShareFlags - exactly one and only one of the first 4 caching flags
619*4882a593Smuzhiyun  * must be set (any of the remaining, SHI1005, flags may be set individually
620*4882a593Smuzhiyun  * or in combination.
621*4882a593Smuzhiyun  */
622*4882a593Smuzhiyun #define SMB2_SHAREFLAG_MANUAL_CACHING			0x00000000
623*4882a593Smuzhiyun #define SMB2_SHAREFLAG_AUTO_CACHING			0x00000010
624*4882a593Smuzhiyun #define SMB2_SHAREFLAG_VDO_CACHING			0x00000020
625*4882a593Smuzhiyun #define SMB2_SHAREFLAG_NO_CACHING			0x00000030
626*4882a593Smuzhiyun #define SHI1005_FLAGS_DFS				0x00000001
627*4882a593Smuzhiyun #define SHI1005_FLAGS_DFS_ROOT				0x00000002
628*4882a593Smuzhiyun #define SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS		0x00000100
629*4882a593Smuzhiyun #define SHI1005_FLAGS_FORCE_SHARED_DELETE		0x00000200
630*4882a593Smuzhiyun #define SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING		0x00000400
631*4882a593Smuzhiyun #define SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM	0x00000800
632*4882a593Smuzhiyun #define SHI1005_FLAGS_FORCE_LEVELII_OPLOCK		0x00001000
633*4882a593Smuzhiyun #define SHI1005_FLAGS_ENABLE_HASH_V1			0x00002000
634*4882a593Smuzhiyun #define SHI1005_FLAGS_ENABLE_HASH_V2			0x00004000
635*4882a593Smuzhiyun #define SHI1005_FLAGS_ENCRYPT_DATA			0x00008000
636*4882a593Smuzhiyun #define SMB2_SHAREFLAG_IDENTITY_REMOTING		0x00040000 /* 3.1.1 */
637*4882a593Smuzhiyun #define SHI1005_FLAGS_ALL				0x0004FF33
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun /* Possible share capabilities */
640*4882a593Smuzhiyun #define SMB2_SHARE_CAP_DFS	cpu_to_le32(0x00000008) /* all dialects */
641*4882a593Smuzhiyun #define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY cpu_to_le32(0x00000010) /* 3.0 */
642*4882a593Smuzhiyun #define SMB2_SHARE_CAP_SCALEOUT	cpu_to_le32(0x00000020) /* 3.0 */
643*4882a593Smuzhiyun #define SMB2_SHARE_CAP_CLUSTER	cpu_to_le32(0x00000040) /* 3.0 */
644*4882a593Smuzhiyun #define SMB2_SHARE_CAP_ASYMMETRIC cpu_to_le32(0x00000080) /* 3.02 */
645*4882a593Smuzhiyun #define SMB2_SHARE_CAP_REDIRECT_TO_OWNER cpu_to_le32(0x00000100) /* 3.1.1 */
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun struct smb2_tree_disconnect_req {
648*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
649*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 4 */
650*4882a593Smuzhiyun 	__le16 Reserved;
651*4882a593Smuzhiyun } __packed;
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun struct smb2_tree_disconnect_rsp {
654*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
655*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 4 */
656*4882a593Smuzhiyun 	__le16 Reserved;
657*4882a593Smuzhiyun } __packed;
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun /* File Attrubutes */
660*4882a593Smuzhiyun #define FILE_ATTRIBUTE_READONLY			0x00000001
661*4882a593Smuzhiyun #define FILE_ATTRIBUTE_HIDDEN			0x00000002
662*4882a593Smuzhiyun #define FILE_ATTRIBUTE_SYSTEM			0x00000004
663*4882a593Smuzhiyun #define FILE_ATTRIBUTE_DIRECTORY		0x00000010
664*4882a593Smuzhiyun #define FILE_ATTRIBUTE_ARCHIVE			0x00000020
665*4882a593Smuzhiyun #define FILE_ATTRIBUTE_NORMAL			0x00000080
666*4882a593Smuzhiyun #define FILE_ATTRIBUTE_TEMPORARY		0x00000100
667*4882a593Smuzhiyun #define FILE_ATTRIBUTE_SPARSE_FILE		0x00000200
668*4882a593Smuzhiyun #define FILE_ATTRIBUTE_REPARSE_POINT		0x00000400
669*4882a593Smuzhiyun #define FILE_ATTRIBUTE_COMPRESSED		0x00000800
670*4882a593Smuzhiyun #define FILE_ATTRIBUTE_OFFLINE			0x00001000
671*4882a593Smuzhiyun #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED	0x00002000
672*4882a593Smuzhiyun #define FILE_ATTRIBUTE_ENCRYPTED		0x00004000
673*4882a593Smuzhiyun #define FILE_ATTRIBUTE_INTEGRITY_STREAM		0x00008000
674*4882a593Smuzhiyun #define FILE_ATTRIBUTE_NO_SCRUB_DATA		0x00020000
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun /* Oplock levels */
677*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_NONE		0x00
678*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_II		0x01
679*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_EXCLUSIVE	0x08
680*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_BATCH		0x09
681*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_LEASE		0xFF
682*4882a593Smuzhiyun /* Non-spec internal type */
683*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_NOCHANGE	0x99
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun /* Desired Access Flags */
686*4882a593Smuzhiyun #define FILE_READ_DATA_LE		cpu_to_le32(0x00000001)
687*4882a593Smuzhiyun #define FILE_WRITE_DATA_LE		cpu_to_le32(0x00000002)
688*4882a593Smuzhiyun #define FILE_APPEND_DATA_LE		cpu_to_le32(0x00000004)
689*4882a593Smuzhiyun #define FILE_READ_EA_LE			cpu_to_le32(0x00000008)
690*4882a593Smuzhiyun #define FILE_WRITE_EA_LE		cpu_to_le32(0x00000010)
691*4882a593Smuzhiyun #define FILE_EXECUTE_LE			cpu_to_le32(0x00000020)
692*4882a593Smuzhiyun #define FILE_READ_ATTRIBUTES_LE		cpu_to_le32(0x00000080)
693*4882a593Smuzhiyun #define FILE_WRITE_ATTRIBUTES_LE	cpu_to_le32(0x00000100)
694*4882a593Smuzhiyun #define FILE_DELETE_LE			cpu_to_le32(0x00010000)
695*4882a593Smuzhiyun #define FILE_READ_CONTROL_LE		cpu_to_le32(0x00020000)
696*4882a593Smuzhiyun #define FILE_WRITE_DAC_LE		cpu_to_le32(0x00040000)
697*4882a593Smuzhiyun #define FILE_WRITE_OWNER_LE		cpu_to_le32(0x00080000)
698*4882a593Smuzhiyun #define FILE_SYNCHRONIZE_LE		cpu_to_le32(0x00100000)
699*4882a593Smuzhiyun #define FILE_ACCESS_SYSTEM_SECURITY_LE	cpu_to_le32(0x01000000)
700*4882a593Smuzhiyun #define FILE_MAXIMAL_ACCESS_LE		cpu_to_le32(0x02000000)
701*4882a593Smuzhiyun #define FILE_GENERIC_ALL_LE		cpu_to_le32(0x10000000)
702*4882a593Smuzhiyun #define FILE_GENERIC_EXECUTE_LE		cpu_to_le32(0x20000000)
703*4882a593Smuzhiyun #define FILE_GENERIC_WRITE_LE		cpu_to_le32(0x40000000)
704*4882a593Smuzhiyun #define FILE_GENERIC_READ_LE		cpu_to_le32(0x80000000)
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun /* ShareAccess Flags */
707*4882a593Smuzhiyun #define FILE_SHARE_READ_LE		cpu_to_le32(0x00000001)
708*4882a593Smuzhiyun #define FILE_SHARE_WRITE_LE		cpu_to_le32(0x00000002)
709*4882a593Smuzhiyun #define FILE_SHARE_DELETE_LE		cpu_to_le32(0x00000004)
710*4882a593Smuzhiyun #define FILE_SHARE_ALL_LE		cpu_to_le32(0x00000007)
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun /* CreateDisposition Flags */
713*4882a593Smuzhiyun #define FILE_SUPERSEDE_LE		cpu_to_le32(0x00000000)
714*4882a593Smuzhiyun #define FILE_OPEN_LE			cpu_to_le32(0x00000001)
715*4882a593Smuzhiyun #define FILE_CREATE_LE			cpu_to_le32(0x00000002)
716*4882a593Smuzhiyun #define	FILE_OPEN_IF_LE			cpu_to_le32(0x00000003)
717*4882a593Smuzhiyun #define FILE_OVERWRITE_LE		cpu_to_le32(0x00000004)
718*4882a593Smuzhiyun #define FILE_OVERWRITE_IF_LE		cpu_to_le32(0x00000005)
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun /* CreateOptions Flags */
721*4882a593Smuzhiyun #define FILE_DIRECTORY_FILE_LE		cpu_to_le32(0x00000001)
722*4882a593Smuzhiyun /* same as #define CREATE_NOT_FILE_LE	cpu_to_le32(0x00000001) */
723*4882a593Smuzhiyun #define FILE_WRITE_THROUGH_LE		cpu_to_le32(0x00000002)
724*4882a593Smuzhiyun #define FILE_SEQUENTIAL_ONLY_LE		cpu_to_le32(0x00000004)
725*4882a593Smuzhiyun #define FILE_NO_INTERMEDIATE_BUFFERRING_LE cpu_to_le32(0x00000008)
726*4882a593Smuzhiyun #define FILE_SYNCHRONOUS_IO_ALERT_LE	cpu_to_le32(0x00000010)
727*4882a593Smuzhiyun #define FILE_SYNCHRONOUS_IO_NON_ALERT_LE	cpu_to_le32(0x00000020)
728*4882a593Smuzhiyun #define FILE_NON_DIRECTORY_FILE_LE	cpu_to_le32(0x00000040)
729*4882a593Smuzhiyun #define FILE_COMPLETE_IF_OPLOCKED_LE	cpu_to_le32(0x00000100)
730*4882a593Smuzhiyun #define FILE_NO_EA_KNOWLEDGE_LE		cpu_to_le32(0x00000200)
731*4882a593Smuzhiyun #define FILE_RANDOM_ACCESS_LE		cpu_to_le32(0x00000800)
732*4882a593Smuzhiyun #define FILE_DELETE_ON_CLOSE_LE		cpu_to_le32(0x00001000)
733*4882a593Smuzhiyun #define FILE_OPEN_BY_FILE_ID_LE		cpu_to_le32(0x00002000)
734*4882a593Smuzhiyun #define FILE_OPEN_FOR_BACKUP_INTENT_LE	cpu_to_le32(0x00004000)
735*4882a593Smuzhiyun #define FILE_NO_COMPRESSION_LE		cpu_to_le32(0x00008000)
736*4882a593Smuzhiyun #define FILE_RESERVE_OPFILTER_LE	cpu_to_le32(0x00100000)
737*4882a593Smuzhiyun #define FILE_OPEN_REPARSE_POINT_LE	cpu_to_le32(0x00200000)
738*4882a593Smuzhiyun #define FILE_OPEN_NO_RECALL_LE		cpu_to_le32(0x00400000)
739*4882a593Smuzhiyun #define FILE_OPEN_FOR_FREE_SPACE_QUERY_LE cpu_to_le32(0x00800000)
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun #define FILE_READ_RIGHTS_LE (FILE_READ_DATA_LE | FILE_READ_EA_LE \
742*4882a593Smuzhiyun 			| FILE_READ_ATTRIBUTES_LE)
743*4882a593Smuzhiyun #define FILE_WRITE_RIGHTS_LE (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE \
744*4882a593Smuzhiyun 			| FILE_WRITE_EA_LE | FILE_WRITE_ATTRIBUTES_LE)
745*4882a593Smuzhiyun #define FILE_EXEC_RIGHTS_LE (FILE_EXECUTE_LE)
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun /* Impersonation Levels. See MS-WPO section 9.7 and MSDN-IMPERS */
748*4882a593Smuzhiyun #define IL_ANONYMOUS		cpu_to_le32(0x00000000)
749*4882a593Smuzhiyun #define IL_IDENTIFICATION	cpu_to_le32(0x00000001)
750*4882a593Smuzhiyun #define IL_IMPERSONATION	cpu_to_le32(0x00000002)
751*4882a593Smuzhiyun #define IL_DELEGATE		cpu_to_le32(0x00000003)
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun /* Create Context Values */
754*4882a593Smuzhiyun #define SMB2_CREATE_EA_BUFFER			"ExtA" /* extended attributes */
755*4882a593Smuzhiyun #define SMB2_CREATE_SD_BUFFER			"SecD" /* security descriptor */
756*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_REQUEST	"DHnQ"
757*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT	"DHnC"
758*4882a593Smuzhiyun #define SMB2_CREATE_ALLOCATION_SIZE		"AISi"
759*4882a593Smuzhiyun #define SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST "MxAc"
760*4882a593Smuzhiyun #define SMB2_CREATE_TIMEWARP_REQUEST		"TWrp"
761*4882a593Smuzhiyun #define SMB2_CREATE_QUERY_ON_DISK_ID		"QFid"
762*4882a593Smuzhiyun #define SMB2_CREATE_REQUEST_LEASE		"RqLs"
763*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2	"DH2Q"
764*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2	"DH2C"
765*4882a593Smuzhiyun #define SMB2_CREATE_APP_INSTANCE_ID	0x45BCA66AEFA7F74A9008FA462E144D74
766*4882a593Smuzhiyun #define SMB2_CREATE_APP_INSTANCE_VERSION 0xB982D0B73B56074FA07B524A8116A010
767*4882a593Smuzhiyun #define SVHDX_OPEN_DEVICE_CONTEX	0x9CCBCF9E04C1E643980E158DA1F6EC83
768*4882a593Smuzhiyun #define SMB2_CREATE_TAG_POSIX		0x93AD25509CB411E7B42383DE968BCD7C
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun /* Flag (SMB3 open response) values */
771*4882a593Smuzhiyun #define SMB2_CREATE_FLAG_REPARSEPOINT 0x01
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun /*
774*4882a593Smuzhiyun  * Maximum number of iovs we need for an open/create request.
775*4882a593Smuzhiyun  * [0] : struct smb2_create_req
776*4882a593Smuzhiyun  * [1] : path
777*4882a593Smuzhiyun  * [2] : lease context
778*4882a593Smuzhiyun  * [3] : durable context
779*4882a593Smuzhiyun  * [4] : posix context
780*4882a593Smuzhiyun  * [5] : time warp context
781*4882a593Smuzhiyun  * [6] : query id context
782*4882a593Smuzhiyun  * [7] : compound padding
783*4882a593Smuzhiyun  */
784*4882a593Smuzhiyun #define SMB2_CREATE_IOV_SIZE 8
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun struct smb2_create_req {
787*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
788*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 57 */
789*4882a593Smuzhiyun 	__u8   SecurityFlags;
790*4882a593Smuzhiyun 	__u8   RequestedOplockLevel;
791*4882a593Smuzhiyun 	__le32 ImpersonationLevel;
792*4882a593Smuzhiyun 	__le64 SmbCreateFlags;
793*4882a593Smuzhiyun 	__le64 Reserved;
794*4882a593Smuzhiyun 	__le32 DesiredAccess;
795*4882a593Smuzhiyun 	__le32 FileAttributes;
796*4882a593Smuzhiyun 	__le32 ShareAccess;
797*4882a593Smuzhiyun 	__le32 CreateDisposition;
798*4882a593Smuzhiyun 	__le32 CreateOptions;
799*4882a593Smuzhiyun 	__le16 NameOffset;
800*4882a593Smuzhiyun 	__le16 NameLength;
801*4882a593Smuzhiyun 	__le32 CreateContextsOffset;
802*4882a593Smuzhiyun 	__le32 CreateContextsLength;
803*4882a593Smuzhiyun 	__u8   Buffer[];
804*4882a593Smuzhiyun } __packed;
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun /*
807*4882a593Smuzhiyun  * Maximum size of a SMB2_CREATE response is 64 (smb2 header) +
808*4882a593Smuzhiyun  * 88 (fixed part of create response) + 520 (path) + 208 (contexts) +
809*4882a593Smuzhiyun  * 2 bytes of padding.
810*4882a593Smuzhiyun  */
811*4882a593Smuzhiyun #define MAX_SMB2_CREATE_RESPONSE_SIZE 880
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun struct smb2_create_rsp {
814*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
815*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 89 */
816*4882a593Smuzhiyun 	__u8   OplockLevel;
817*4882a593Smuzhiyun 	__u8   Flag;  /* 0x01 if reparse point */
818*4882a593Smuzhiyun 	__le32 CreateAction;
819*4882a593Smuzhiyun 	__le64 CreationTime;
820*4882a593Smuzhiyun 	__le64 LastAccessTime;
821*4882a593Smuzhiyun 	__le64 LastWriteTime;
822*4882a593Smuzhiyun 	__le64 ChangeTime;
823*4882a593Smuzhiyun 	__le64 AllocationSize;
824*4882a593Smuzhiyun 	__le64 EndofFile;
825*4882a593Smuzhiyun 	__le32 FileAttributes;
826*4882a593Smuzhiyun 	__le32 Reserved2;
827*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
828*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
829*4882a593Smuzhiyun 	__le32 CreateContextsOffset;
830*4882a593Smuzhiyun 	__le32 CreateContextsLength;
831*4882a593Smuzhiyun 	__u8   Buffer[1];
832*4882a593Smuzhiyun } __packed;
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun struct create_context {
835*4882a593Smuzhiyun 	__le32 Next;
836*4882a593Smuzhiyun 	__le16 NameOffset;
837*4882a593Smuzhiyun 	__le16 NameLength;
838*4882a593Smuzhiyun 	__le16 Reserved;
839*4882a593Smuzhiyun 	__le16 DataOffset;
840*4882a593Smuzhiyun 	__le32 DataLength;
841*4882a593Smuzhiyun 	__u8 Buffer[];
842*4882a593Smuzhiyun } __packed;
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun #define SMB2_LEASE_READ_CACHING_HE	0x01
845*4882a593Smuzhiyun #define SMB2_LEASE_HANDLE_CACHING_HE	0x02
846*4882a593Smuzhiyun #define SMB2_LEASE_WRITE_CACHING_HE	0x04
847*4882a593Smuzhiyun 
848*4882a593Smuzhiyun #define SMB2_LEASE_NONE			cpu_to_le32(0x00)
849*4882a593Smuzhiyun #define SMB2_LEASE_READ_CACHING		cpu_to_le32(0x01)
850*4882a593Smuzhiyun #define SMB2_LEASE_HANDLE_CACHING	cpu_to_le32(0x02)
851*4882a593Smuzhiyun #define SMB2_LEASE_WRITE_CACHING	cpu_to_le32(0x04)
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun #define SMB2_LEASE_FLAG_BREAK_IN_PROGRESS cpu_to_le32(0x00000002)
854*4882a593Smuzhiyun #define SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET cpu_to_le32(0x00000004)
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun #define SMB2_LEASE_KEY_SIZE 16
857*4882a593Smuzhiyun 
858*4882a593Smuzhiyun struct lease_context {
859*4882a593Smuzhiyun 	u8 LeaseKey[SMB2_LEASE_KEY_SIZE];
860*4882a593Smuzhiyun 	__le32 LeaseState;
861*4882a593Smuzhiyun 	__le32 LeaseFlags;
862*4882a593Smuzhiyun 	__le64 LeaseDuration;
863*4882a593Smuzhiyun } __packed;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun struct lease_context_v2 {
866*4882a593Smuzhiyun 	u8 LeaseKey[SMB2_LEASE_KEY_SIZE];
867*4882a593Smuzhiyun 	__le32 LeaseState;
868*4882a593Smuzhiyun 	__le32 LeaseFlags;
869*4882a593Smuzhiyun 	__le64 LeaseDuration;
870*4882a593Smuzhiyun 	__le64 ParentLeaseKeyLow;
871*4882a593Smuzhiyun 	__le64 ParentLeaseKeyHigh;
872*4882a593Smuzhiyun 	__le16 Epoch;
873*4882a593Smuzhiyun 	__le16 Reserved;
874*4882a593Smuzhiyun } __packed;
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun struct create_lease {
877*4882a593Smuzhiyun 	struct create_context ccontext;
878*4882a593Smuzhiyun 	__u8   Name[8];
879*4882a593Smuzhiyun 	struct lease_context lcontext;
880*4882a593Smuzhiyun } __packed;
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun struct create_lease_v2 {
883*4882a593Smuzhiyun 	struct create_context ccontext;
884*4882a593Smuzhiyun 	__u8   Name[8];
885*4882a593Smuzhiyun 	struct lease_context_v2 lcontext;
886*4882a593Smuzhiyun 	__u8   Pad[4];
887*4882a593Smuzhiyun } __packed;
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun struct create_durable {
890*4882a593Smuzhiyun 	struct create_context ccontext;
891*4882a593Smuzhiyun 	__u8   Name[8];
892*4882a593Smuzhiyun 	union {
893*4882a593Smuzhiyun 		__u8  Reserved[16];
894*4882a593Smuzhiyun 		struct {
895*4882a593Smuzhiyun 			__u64 PersistentFileId;
896*4882a593Smuzhiyun 			__u64 VolatileFileId;
897*4882a593Smuzhiyun 		} Fid;
898*4882a593Smuzhiyun 	} Data;
899*4882a593Smuzhiyun } __packed;
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun struct create_posix {
902*4882a593Smuzhiyun 	struct create_context ccontext;
903*4882a593Smuzhiyun 	__u8	Name[16];
904*4882a593Smuzhiyun 	__le32  Mode;
905*4882a593Smuzhiyun 	__u32	Reserved;
906*4882a593Smuzhiyun } __packed;
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.11 */
909*4882a593Smuzhiyun /* Flags */
910*4882a593Smuzhiyun #define SMB2_DHANDLE_FLAG_PERSISTENT	0x00000002
911*4882a593Smuzhiyun struct durable_context_v2 {
912*4882a593Smuzhiyun 	__le32 Timeout;
913*4882a593Smuzhiyun 	__le32 Flags;
914*4882a593Smuzhiyun 	__u64 Reserved;
915*4882a593Smuzhiyun 	__u8 CreateGuid[16];
916*4882a593Smuzhiyun } __packed;
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun struct create_durable_v2 {
919*4882a593Smuzhiyun 	struct create_context ccontext;
920*4882a593Smuzhiyun 	__u8   Name[8];
921*4882a593Smuzhiyun 	struct durable_context_v2 dcontext;
922*4882a593Smuzhiyun } __packed;
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.12 */
925*4882a593Smuzhiyun struct durable_reconnect_context_v2 {
926*4882a593Smuzhiyun 	struct {
927*4882a593Smuzhiyun 		__u64 PersistentFileId;
928*4882a593Smuzhiyun 		__u64 VolatileFileId;
929*4882a593Smuzhiyun 	} Fid;
930*4882a593Smuzhiyun 	__u8 CreateGuid[16];
931*4882a593Smuzhiyun 	__le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
932*4882a593Smuzhiyun } __packed;
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun /* See MS-SMB2 2.2.14.2.9 */
935*4882a593Smuzhiyun struct create_on_disk_id {
936*4882a593Smuzhiyun 	struct create_context ccontext;
937*4882a593Smuzhiyun 	__u8   Name[8];
938*4882a593Smuzhiyun 	__le64 DiskFileId;
939*4882a593Smuzhiyun 	__le64 VolumeId;
940*4882a593Smuzhiyun 	__u32  Reserved[4];
941*4882a593Smuzhiyun } __packed;
942*4882a593Smuzhiyun 
943*4882a593Smuzhiyun /* See MS-SMB2 2.2.14.2.12 */
944*4882a593Smuzhiyun struct durable_reconnect_context_v2_rsp {
945*4882a593Smuzhiyun 	__le32 Timeout;
946*4882a593Smuzhiyun 	__le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
947*4882a593Smuzhiyun } __packed;
948*4882a593Smuzhiyun 
949*4882a593Smuzhiyun struct create_durable_handle_reconnect_v2 {
950*4882a593Smuzhiyun 	struct create_context ccontext;
951*4882a593Smuzhiyun 	__u8   Name[8];
952*4882a593Smuzhiyun 	struct durable_reconnect_context_v2 dcontext;
953*4882a593Smuzhiyun 	__u8   Pad[4];
954*4882a593Smuzhiyun } __packed;
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.5 */
957*4882a593Smuzhiyun struct crt_twarp_ctxt {
958*4882a593Smuzhiyun 	struct create_context ccontext;
959*4882a593Smuzhiyun 	__u8	Name[8];
960*4882a593Smuzhiyun 	__le64	Timestamp;
961*4882a593Smuzhiyun 
962*4882a593Smuzhiyun } __packed;
963*4882a593Smuzhiyun 
964*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.9 */
965*4882a593Smuzhiyun struct crt_query_id_ctxt {
966*4882a593Smuzhiyun 	struct create_context ccontext;
967*4882a593Smuzhiyun 	__u8	Name[8];
968*4882a593Smuzhiyun } __packed;
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun struct crt_sd_ctxt {
971*4882a593Smuzhiyun 	struct create_context ccontext;
972*4882a593Smuzhiyun 	__u8	Name[8];
973*4882a593Smuzhiyun 	struct smb3_sd sd;
974*4882a593Smuzhiyun } __packed;
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun #define COPY_CHUNK_RES_KEY_SIZE	24
978*4882a593Smuzhiyun struct resume_key_req {
979*4882a593Smuzhiyun 	char ResumeKey[COPY_CHUNK_RES_KEY_SIZE];
980*4882a593Smuzhiyun 	__le32	ContextLength;	/* MBZ */
981*4882a593Smuzhiyun 	char	Context[];	/* ignored, Windows sets to 4 bytes of zero */
982*4882a593Smuzhiyun } __packed;
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun /* this goes in the ioctl buffer when doing a copychunk request */
985*4882a593Smuzhiyun struct copychunk_ioctl {
986*4882a593Smuzhiyun 	char SourceKey[COPY_CHUNK_RES_KEY_SIZE];
987*4882a593Smuzhiyun 	__le32 ChunkCount; /* we are only sending 1 */
988*4882a593Smuzhiyun 	__le32 Reserved;
989*4882a593Smuzhiyun 	/* array will only be one chunk long for us */
990*4882a593Smuzhiyun 	__le64 SourceOffset;
991*4882a593Smuzhiyun 	__le64 TargetOffset;
992*4882a593Smuzhiyun 	__le32 Length; /* how many bytes to copy */
993*4882a593Smuzhiyun 	__u32 Reserved2;
994*4882a593Smuzhiyun } __packed;
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun /* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */
997*4882a593Smuzhiyun struct file_zero_data_information {
998*4882a593Smuzhiyun 	__le64	FileOffset;
999*4882a593Smuzhiyun 	__le64	BeyondFinalZero;
1000*4882a593Smuzhiyun } __packed;
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun struct copychunk_ioctl_rsp {
1003*4882a593Smuzhiyun 	__le32 ChunksWritten;
1004*4882a593Smuzhiyun 	__le32 ChunkBytesWritten;
1005*4882a593Smuzhiyun 	__le32 TotalBytesWritten;
1006*4882a593Smuzhiyun } __packed;
1007*4882a593Smuzhiyun 
1008*4882a593Smuzhiyun /* See MS-FSCC 2.3.29 and 2.3.30 */
1009*4882a593Smuzhiyun struct get_retrieval_pointer_count_req {
1010*4882a593Smuzhiyun 	__le64 StartingVcn; /* virtual cluster number (signed) */
1011*4882a593Smuzhiyun } __packed;
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun struct get_retrieval_pointer_count_rsp {
1014*4882a593Smuzhiyun 	__le32 ExtentCount;
1015*4882a593Smuzhiyun } __packed;
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun /*
1018*4882a593Smuzhiyun  * See MS-FSCC 2.3.33 and 2.3.34
1019*4882a593Smuzhiyun  * request is the same as get_retrieval_point_count_req struct above
1020*4882a593Smuzhiyun  */
1021*4882a593Smuzhiyun struct smb3_extents {
1022*4882a593Smuzhiyun 	__le64 NextVcn;
1023*4882a593Smuzhiyun 	__le64 Lcn; /* logical cluster number */
1024*4882a593Smuzhiyun } __packed;
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun struct get_retrieval_pointers_refcount_rsp {
1027*4882a593Smuzhiyun 	__le32 ExtentCount;
1028*4882a593Smuzhiyun 	__u32  Reserved;
1029*4882a593Smuzhiyun 	__le64 StartingVcn;
1030*4882a593Smuzhiyun 	struct smb3_extents extents[];
1031*4882a593Smuzhiyun } __packed;
1032*4882a593Smuzhiyun 
1033*4882a593Smuzhiyun struct fsctl_set_integrity_information_req {
1034*4882a593Smuzhiyun 	__le16	ChecksumAlgorithm;
1035*4882a593Smuzhiyun 	__le16	Reserved;
1036*4882a593Smuzhiyun 	__le32	Flags;
1037*4882a593Smuzhiyun } __packed;
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun struct fsctl_get_integrity_information_rsp {
1040*4882a593Smuzhiyun 	__le16	ChecksumAlgorithm;
1041*4882a593Smuzhiyun 	__le16	Reserved;
1042*4882a593Smuzhiyun 	__le32	Flags;
1043*4882a593Smuzhiyun 	__le32	ChecksumChunkSizeInBytes;
1044*4882a593Smuzhiyun 	__le32	ClusterSizeInBytes;
1045*4882a593Smuzhiyun } __packed;
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun struct file_allocated_range_buffer {
1048*4882a593Smuzhiyun 	__le64	file_offset;
1049*4882a593Smuzhiyun 	__le64	length;
1050*4882a593Smuzhiyun } __packed;
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun /* Integrity ChecksumAlgorithm choices for above */
1053*4882a593Smuzhiyun #define	CHECKSUM_TYPE_NONE	0x0000
1054*4882a593Smuzhiyun #define	CHECKSUM_TYPE_CRC64	0x0002
1055*4882a593Smuzhiyun #define CHECKSUM_TYPE_UNCHANGED	0xFFFF	/* set only */
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun /* Integrity flags for above */
1058*4882a593Smuzhiyun #define FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF	0x00000001
1059*4882a593Smuzhiyun 
1060*4882a593Smuzhiyun /* Reparse structures - see MS-FSCC 2.1.2 */
1061*4882a593Smuzhiyun 
1062*4882a593Smuzhiyun /* struct fsctl_reparse_info_req is empty, only response structs (see below) */
1063*4882a593Smuzhiyun 
1064*4882a593Smuzhiyun struct reparse_data_buffer {
1065*4882a593Smuzhiyun 	__le32	ReparseTag;
1066*4882a593Smuzhiyun 	__le16	ReparseDataLength;
1067*4882a593Smuzhiyun 	__u16	Reserved;
1068*4882a593Smuzhiyun 	__u8	DataBuffer[]; /* Variable Length */
1069*4882a593Smuzhiyun } __packed;
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun struct reparse_guid_data_buffer {
1072*4882a593Smuzhiyun 	__le32	ReparseTag;
1073*4882a593Smuzhiyun 	__le16	ReparseDataLength;
1074*4882a593Smuzhiyun 	__u16	Reserved;
1075*4882a593Smuzhiyun 	__u8	ReparseGuid[16];
1076*4882a593Smuzhiyun 	__u8	DataBuffer[]; /* Variable Length */
1077*4882a593Smuzhiyun } __packed;
1078*4882a593Smuzhiyun 
1079*4882a593Smuzhiyun struct reparse_mount_point_data_buffer {
1080*4882a593Smuzhiyun 	__le32	ReparseTag;
1081*4882a593Smuzhiyun 	__le16	ReparseDataLength;
1082*4882a593Smuzhiyun 	__u16	Reserved;
1083*4882a593Smuzhiyun 	__le16	SubstituteNameOffset;
1084*4882a593Smuzhiyun 	__le16	SubstituteNameLength;
1085*4882a593Smuzhiyun 	__le16	PrintNameOffset;
1086*4882a593Smuzhiyun 	__le16	PrintNameLength;
1087*4882a593Smuzhiyun 	__u8	PathBuffer[]; /* Variable Length */
1088*4882a593Smuzhiyun } __packed;
1089*4882a593Smuzhiyun 
1090*4882a593Smuzhiyun #define SYMLINK_FLAG_RELATIVE 0x00000001
1091*4882a593Smuzhiyun 
1092*4882a593Smuzhiyun struct reparse_symlink_data_buffer {
1093*4882a593Smuzhiyun 	__le32	ReparseTag;
1094*4882a593Smuzhiyun 	__le16	ReparseDataLength;
1095*4882a593Smuzhiyun 	__u16	Reserved;
1096*4882a593Smuzhiyun 	__le16	SubstituteNameOffset;
1097*4882a593Smuzhiyun 	__le16	SubstituteNameLength;
1098*4882a593Smuzhiyun 	__le16	PrintNameOffset;
1099*4882a593Smuzhiyun 	__le16	PrintNameLength;
1100*4882a593Smuzhiyun 	__le32	Flags;
1101*4882a593Smuzhiyun 	__u8	PathBuffer[]; /* Variable Length */
1102*4882a593Smuzhiyun } __packed;
1103*4882a593Smuzhiyun 
1104*4882a593Smuzhiyun /* See MS-FSCC 2.1.2.6 and cifspdu.h for struct reparse_posix_data */
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun /* See MS-DFSC 2.2.2 */
1108*4882a593Smuzhiyun struct fsctl_get_dfs_referral_req {
1109*4882a593Smuzhiyun 	__le16 MaxReferralLevel;
1110*4882a593Smuzhiyun 	__u8 RequestFileName[];
1111*4882a593Smuzhiyun } __packed;
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun /* DFS response is struct get_dfs_refer_rsp */
1114*4882a593Smuzhiyun 
1115*4882a593Smuzhiyun /* See MS-SMB2 2.2.31.3 */
1116*4882a593Smuzhiyun struct network_resiliency_req {
1117*4882a593Smuzhiyun 	__le32 Timeout;
1118*4882a593Smuzhiyun 	__le32 Reserved;
1119*4882a593Smuzhiyun } __packed;
1120*4882a593Smuzhiyun /* There is no buffer for the response ie no struct network_resiliency_rsp */
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun 
1123*4882a593Smuzhiyun struct validate_negotiate_info_req {
1124*4882a593Smuzhiyun 	__le32 Capabilities;
1125*4882a593Smuzhiyun 	__u8   Guid[SMB2_CLIENT_GUID_SIZE];
1126*4882a593Smuzhiyun 	__le16 SecurityMode;
1127*4882a593Smuzhiyun 	__le16 DialectCount;
1128*4882a593Smuzhiyun 	__le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */
1129*4882a593Smuzhiyun } __packed;
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun struct validate_negotiate_info_rsp {
1132*4882a593Smuzhiyun 	__le32 Capabilities;
1133*4882a593Smuzhiyun 	__u8   Guid[SMB2_CLIENT_GUID_SIZE];
1134*4882a593Smuzhiyun 	__le16 SecurityMode;
1135*4882a593Smuzhiyun 	__le16 Dialect; /* Dialect in use for the connection */
1136*4882a593Smuzhiyun } __packed;
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun #define RSS_CAPABLE	cpu_to_le32(0x00000001)
1139*4882a593Smuzhiyun #define RDMA_CAPABLE	cpu_to_le32(0x00000002)
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun #define INTERNETWORK	cpu_to_le16(0x0002)
1142*4882a593Smuzhiyun #define INTERNETWORKV6	cpu_to_le16(0x0017)
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun struct network_interface_info_ioctl_rsp {
1145*4882a593Smuzhiyun 	__le32 Next; /* next interface. zero if this is last one */
1146*4882a593Smuzhiyun 	__le32 IfIndex;
1147*4882a593Smuzhiyun 	__le32 Capability; /* RSS or RDMA Capable */
1148*4882a593Smuzhiyun 	__le32 Reserved;
1149*4882a593Smuzhiyun 	__le64 LinkSpeed;
1150*4882a593Smuzhiyun 	__le16 Family;
1151*4882a593Smuzhiyun 	__u8 Buffer[126];
1152*4882a593Smuzhiyun } __packed;
1153*4882a593Smuzhiyun 
1154*4882a593Smuzhiyun struct iface_info_ipv4 {
1155*4882a593Smuzhiyun 	__be16 Port;
1156*4882a593Smuzhiyun 	__be32 IPv4Address;
1157*4882a593Smuzhiyun 	__be64 Reserved;
1158*4882a593Smuzhiyun } __packed;
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun struct iface_info_ipv6 {
1161*4882a593Smuzhiyun 	__be16 Port;
1162*4882a593Smuzhiyun 	__be32 FlowInfo;
1163*4882a593Smuzhiyun 	__u8   IPv6Address[16];
1164*4882a593Smuzhiyun 	__be32 ScopeId;
1165*4882a593Smuzhiyun } __packed;
1166*4882a593Smuzhiyun 
1167*4882a593Smuzhiyun #define NO_FILE_ID 0xFFFFFFFFFFFFFFFFULL /* general ioctls to srv not to file */
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun struct compress_ioctl {
1170*4882a593Smuzhiyun 	__le16 CompressionState; /* See cifspdu.h for possible flag values */
1171*4882a593Smuzhiyun } __packed;
1172*4882a593Smuzhiyun 
1173*4882a593Smuzhiyun struct duplicate_extents_to_file {
1174*4882a593Smuzhiyun 	__u64 PersistentFileHandle; /* source file handle, opaque endianness */
1175*4882a593Smuzhiyun 	__u64 VolatileFileHandle;
1176*4882a593Smuzhiyun 	__le64 SourceFileOffset;
1177*4882a593Smuzhiyun 	__le64 TargetFileOffset;
1178*4882a593Smuzhiyun 	__le64 ByteCount;  /* Bytes to be copied */
1179*4882a593Smuzhiyun } __packed;
1180*4882a593Smuzhiyun 
1181*4882a593Smuzhiyun /*
1182*4882a593Smuzhiyun  * Maximum number of iovs we need for an ioctl request.
1183*4882a593Smuzhiyun  * [0] : struct smb2_ioctl_req
1184*4882a593Smuzhiyun  * [1] : in_data
1185*4882a593Smuzhiyun  */
1186*4882a593Smuzhiyun #define SMB2_IOCTL_IOV_SIZE 2
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun struct smb2_ioctl_req {
1189*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1190*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 57 */
1191*4882a593Smuzhiyun 	__u16 Reserved;
1192*4882a593Smuzhiyun 	__le32 CtlCode;
1193*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1194*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1195*4882a593Smuzhiyun 	__le32 InputOffset;
1196*4882a593Smuzhiyun 	__le32 InputCount;
1197*4882a593Smuzhiyun 	__le32 MaxInputResponse;
1198*4882a593Smuzhiyun 	__le32 OutputOffset;
1199*4882a593Smuzhiyun 	__le32 OutputCount;
1200*4882a593Smuzhiyun 	__le32 MaxOutputResponse;
1201*4882a593Smuzhiyun 	__le32 Flags;
1202*4882a593Smuzhiyun 	__u32  Reserved2;
1203*4882a593Smuzhiyun 	__u8   Buffer[];
1204*4882a593Smuzhiyun } __packed;
1205*4882a593Smuzhiyun 
1206*4882a593Smuzhiyun struct smb2_ioctl_rsp {
1207*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1208*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 57 */
1209*4882a593Smuzhiyun 	__u16 Reserved;
1210*4882a593Smuzhiyun 	__le32 CtlCode;
1211*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1212*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1213*4882a593Smuzhiyun 	__le32 InputOffset;
1214*4882a593Smuzhiyun 	__le32 InputCount;
1215*4882a593Smuzhiyun 	__le32 OutputOffset;
1216*4882a593Smuzhiyun 	__le32 OutputCount;
1217*4882a593Smuzhiyun 	__le32 Flags;
1218*4882a593Smuzhiyun 	__u32  Reserved2;
1219*4882a593Smuzhiyun 	/* char * buffer[] */
1220*4882a593Smuzhiyun } __packed;
1221*4882a593Smuzhiyun 
1222*4882a593Smuzhiyun /* Currently defined values for close flags */
1223*4882a593Smuzhiyun #define SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB	cpu_to_le16(0x0001)
1224*4882a593Smuzhiyun struct smb2_close_req {
1225*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1226*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 24 */
1227*4882a593Smuzhiyun 	__le16 Flags;
1228*4882a593Smuzhiyun 	__le32 Reserved;
1229*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1230*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1231*4882a593Smuzhiyun } __packed;
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun /*
1234*4882a593Smuzhiyun  * Maximum size of a SMB2_CLOSE response is 64 (smb2 header) + 60 (data)
1235*4882a593Smuzhiyun  */
1236*4882a593Smuzhiyun #define MAX_SMB2_CLOSE_RESPONSE_SIZE 124
1237*4882a593Smuzhiyun 
1238*4882a593Smuzhiyun struct smb2_close_rsp {
1239*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1240*4882a593Smuzhiyun 	__le16 StructureSize; /* 60 */
1241*4882a593Smuzhiyun 	__le16 Flags;
1242*4882a593Smuzhiyun 	__le32 Reserved;
1243*4882a593Smuzhiyun 	__le64 CreationTime;
1244*4882a593Smuzhiyun 	__le64 LastAccessTime;
1245*4882a593Smuzhiyun 	__le64 LastWriteTime;
1246*4882a593Smuzhiyun 	__le64 ChangeTime;
1247*4882a593Smuzhiyun 	__le64 AllocationSize;	/* Beginning of FILE_STANDARD_INFO equivalent */
1248*4882a593Smuzhiyun 	__le64 EndOfFile;
1249*4882a593Smuzhiyun 	__le32 Attributes;
1250*4882a593Smuzhiyun } __packed;
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun struct smb2_flush_req {
1253*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1254*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 24 */
1255*4882a593Smuzhiyun 	__le16 Reserved1;
1256*4882a593Smuzhiyun 	__le32 Reserved2;
1257*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1258*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1259*4882a593Smuzhiyun } __packed;
1260*4882a593Smuzhiyun 
1261*4882a593Smuzhiyun struct smb2_flush_rsp {
1262*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1263*4882a593Smuzhiyun 	__le16 StructureSize;
1264*4882a593Smuzhiyun 	__le16 Reserved;
1265*4882a593Smuzhiyun } __packed;
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun /* For read request Flags field below, following flag is defined for SMB3.02 */
1268*4882a593Smuzhiyun #define SMB2_READFLAG_READ_UNBUFFERED	0x01
1269*4882a593Smuzhiyun #define SMB2_READFLAG_REQUEST_COMPRESSED 0x02 /* See MS-SMB2 2.2.19 */
1270*4882a593Smuzhiyun 
1271*4882a593Smuzhiyun /* Channel field for read and write: exactly one of following flags can be set*/
1272*4882a593Smuzhiyun #define SMB2_CHANNEL_NONE	cpu_to_le32(0x00000000)
1273*4882a593Smuzhiyun #define SMB2_CHANNEL_RDMA_V1	cpu_to_le32(0x00000001) /* SMB3 or later */
1274*4882a593Smuzhiyun #define SMB2_CHANNEL_RDMA_V1_INVALIDATE cpu_to_le32(0x00000002) /* >= SMB3.02 */
1275*4882a593Smuzhiyun #define SMB2_CHANNEL_RDMA_TRANSFORM cpu_to_le32(0x00000003) /* >= SMB3.02, only used on write */
1276*4882a593Smuzhiyun 
1277*4882a593Smuzhiyun /* SMB2 read request without RFC1001 length at the beginning */
1278*4882a593Smuzhiyun struct smb2_read_plain_req {
1279*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1280*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 49 */
1281*4882a593Smuzhiyun 	__u8   Padding; /* offset from start of SMB2 header to place read */
1282*4882a593Smuzhiyun 	__u8   Flags; /* MBZ unless SMB3.02 or later */
1283*4882a593Smuzhiyun 	__le32 Length;
1284*4882a593Smuzhiyun 	__le64 Offset;
1285*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1286*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1287*4882a593Smuzhiyun 	__le32 MinimumCount;
1288*4882a593Smuzhiyun 	__le32 Channel; /* MBZ except for SMB3 or later */
1289*4882a593Smuzhiyun 	__le32 RemainingBytes;
1290*4882a593Smuzhiyun 	__le16 ReadChannelInfoOffset;
1291*4882a593Smuzhiyun 	__le16 ReadChannelInfoLength;
1292*4882a593Smuzhiyun 	__u8   Buffer[1];
1293*4882a593Smuzhiyun } __packed;
1294*4882a593Smuzhiyun 
1295*4882a593Smuzhiyun /* Read flags */
1296*4882a593Smuzhiyun #define SMB2_READFLAG_RESPONSE_NONE	0x00000000
1297*4882a593Smuzhiyun #define SMB2_READFLAG_RESPONSE_RDMA_TRANSFORM	0x00000001
1298*4882a593Smuzhiyun 
1299*4882a593Smuzhiyun struct smb2_read_rsp {
1300*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1301*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 17 */
1302*4882a593Smuzhiyun 	__u8   DataOffset;
1303*4882a593Smuzhiyun 	__u8   Reserved;
1304*4882a593Smuzhiyun 	__le32 DataLength;
1305*4882a593Smuzhiyun 	__le32 DataRemaining;
1306*4882a593Smuzhiyun 	__u32  Flags;
1307*4882a593Smuzhiyun 	__u8   Buffer[1];
1308*4882a593Smuzhiyun } __packed;
1309*4882a593Smuzhiyun 
1310*4882a593Smuzhiyun /* For write request Flags field below the following flags are defined: */
1311*4882a593Smuzhiyun #define SMB2_WRITEFLAG_WRITE_THROUGH	0x00000001	/* SMB2.1 or later */
1312*4882a593Smuzhiyun #define SMB2_WRITEFLAG_WRITE_UNBUFFERED	0x00000002	/* SMB3.02 or later */
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun struct smb2_write_req {
1315*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1316*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 49 */
1317*4882a593Smuzhiyun 	__le16 DataOffset; /* offset from start of SMB2 header to write data */
1318*4882a593Smuzhiyun 	__le32 Length;
1319*4882a593Smuzhiyun 	__le64 Offset;
1320*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1321*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1322*4882a593Smuzhiyun 	__le32 Channel; /* MBZ unless SMB3.02 or later */
1323*4882a593Smuzhiyun 	__le32 RemainingBytes;
1324*4882a593Smuzhiyun 	__le16 WriteChannelInfoOffset;
1325*4882a593Smuzhiyun 	__le16 WriteChannelInfoLength;
1326*4882a593Smuzhiyun 	__le32 Flags;
1327*4882a593Smuzhiyun 	__u8   Buffer[1];
1328*4882a593Smuzhiyun } __packed;
1329*4882a593Smuzhiyun 
1330*4882a593Smuzhiyun struct smb2_write_rsp {
1331*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1332*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 17 */
1333*4882a593Smuzhiyun 	__u8   DataOffset;
1334*4882a593Smuzhiyun 	__u8   Reserved;
1335*4882a593Smuzhiyun 	__le32 DataLength;
1336*4882a593Smuzhiyun 	__le32 DataRemaining;
1337*4882a593Smuzhiyun 	__u32  Reserved2;
1338*4882a593Smuzhiyun 	__u8   Buffer[1];
1339*4882a593Smuzhiyun } __packed;
1340*4882a593Smuzhiyun 
1341*4882a593Smuzhiyun /* notify flags */
1342*4882a593Smuzhiyun #define SMB2_WATCH_TREE			0x0001
1343*4882a593Smuzhiyun 
1344*4882a593Smuzhiyun /* notify completion filter flags. See MS-FSCC 2.6 and MS-SMB2 2.2.35 */
1345*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_FILE_NAME		0x00000001
1346*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_DIR_NAME		0x00000002
1347*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_ATTRIBUTES		0x00000004
1348*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_SIZE			0x00000008
1349*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_LAST_WRITE		0x00000010
1350*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_LAST_ACCESS		0x00000020
1351*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_CREATION		0x00000040
1352*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_EA			0x00000080
1353*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_SECURITY		0x00000100
1354*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_STREAM_NAME		0x00000200
1355*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_STREAM_SIZE		0x00000400
1356*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_STREAM_WRITE		0x00000800
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun struct smb2_change_notify_req {
1359*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1360*4882a593Smuzhiyun 	__le16	StructureSize;
1361*4882a593Smuzhiyun 	__le16	Flags;
1362*4882a593Smuzhiyun 	__le32	OutputBufferLength;
1363*4882a593Smuzhiyun 	__u64	PersistentFileId; /* opaque endianness */
1364*4882a593Smuzhiyun 	__u64	VolatileFileId; /* opaque endianness */
1365*4882a593Smuzhiyun 	__le32	CompletionFilter;
1366*4882a593Smuzhiyun 	__u32	Reserved;
1367*4882a593Smuzhiyun } __packed;
1368*4882a593Smuzhiyun 
1369*4882a593Smuzhiyun struct smb2_change_notify_rsp {
1370*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1371*4882a593Smuzhiyun 	__le16	StructureSize;  /* Must be 9 */
1372*4882a593Smuzhiyun 	__le16	OutputBufferOffset;
1373*4882a593Smuzhiyun 	__le32	OutputBufferLength;
1374*4882a593Smuzhiyun 	__u8	Buffer[1]; /* array of file notify structs */
1375*4882a593Smuzhiyun } __packed;
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun #define SMB2_LOCKFLAG_SHARED_LOCK	0x0001
1378*4882a593Smuzhiyun #define SMB2_LOCKFLAG_EXCLUSIVE_LOCK	0x0002
1379*4882a593Smuzhiyun #define SMB2_LOCKFLAG_UNLOCK		0x0004
1380*4882a593Smuzhiyun #define SMB2_LOCKFLAG_FAIL_IMMEDIATELY	0x0010
1381*4882a593Smuzhiyun 
1382*4882a593Smuzhiyun struct smb2_lock_element {
1383*4882a593Smuzhiyun 	__le64 Offset;
1384*4882a593Smuzhiyun 	__le64 Length;
1385*4882a593Smuzhiyun 	__le32 Flags;
1386*4882a593Smuzhiyun 	__le32 Reserved;
1387*4882a593Smuzhiyun } __packed;
1388*4882a593Smuzhiyun 
1389*4882a593Smuzhiyun struct smb2_lock_req {
1390*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1391*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 48 */
1392*4882a593Smuzhiyun 	__le16 LockCount;
1393*4882a593Smuzhiyun 	__le32 Reserved;
1394*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1395*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1396*4882a593Smuzhiyun 	/* Followed by at least one */
1397*4882a593Smuzhiyun 	struct smb2_lock_element locks[1];
1398*4882a593Smuzhiyun } __packed;
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun struct smb2_lock_rsp {
1401*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1402*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 4 */
1403*4882a593Smuzhiyun 	__le16 Reserved;
1404*4882a593Smuzhiyun } __packed;
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun struct smb2_echo_req {
1407*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1408*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 4 */
1409*4882a593Smuzhiyun 	__u16  Reserved;
1410*4882a593Smuzhiyun } __packed;
1411*4882a593Smuzhiyun 
1412*4882a593Smuzhiyun struct smb2_echo_rsp {
1413*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1414*4882a593Smuzhiyun 	__le16 StructureSize;	/* Must be 4 */
1415*4882a593Smuzhiyun 	__u16  Reserved;
1416*4882a593Smuzhiyun } __packed;
1417*4882a593Smuzhiyun 
1418*4882a593Smuzhiyun /* search (query_directory) Flags field */
1419*4882a593Smuzhiyun #define SMB2_RESTART_SCANS		0x01
1420*4882a593Smuzhiyun #define SMB2_RETURN_SINGLE_ENTRY	0x02
1421*4882a593Smuzhiyun #define SMB2_INDEX_SPECIFIED		0x04
1422*4882a593Smuzhiyun #define SMB2_REOPEN			0x10
1423*4882a593Smuzhiyun 
1424*4882a593Smuzhiyun #define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
1425*4882a593Smuzhiyun 
1426*4882a593Smuzhiyun struct smb2_query_directory_req {
1427*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1428*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 33 */
1429*4882a593Smuzhiyun 	__u8   FileInformationClass;
1430*4882a593Smuzhiyun 	__u8   Flags;
1431*4882a593Smuzhiyun 	__le32 FileIndex;
1432*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1433*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1434*4882a593Smuzhiyun 	__le16 FileNameOffset;
1435*4882a593Smuzhiyun 	__le16 FileNameLength;
1436*4882a593Smuzhiyun 	__le32 OutputBufferLength;
1437*4882a593Smuzhiyun 	__u8   Buffer[1];
1438*4882a593Smuzhiyun } __packed;
1439*4882a593Smuzhiyun 
1440*4882a593Smuzhiyun struct smb2_query_directory_rsp {
1441*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1442*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 9 */
1443*4882a593Smuzhiyun 	__le16 OutputBufferOffset;
1444*4882a593Smuzhiyun 	__le32 OutputBufferLength;
1445*4882a593Smuzhiyun 	__u8   Buffer[1];
1446*4882a593Smuzhiyun } __packed;
1447*4882a593Smuzhiyun 
1448*4882a593Smuzhiyun /* Possible InfoType values */
1449*4882a593Smuzhiyun #define SMB2_O_INFO_FILE	0x01
1450*4882a593Smuzhiyun #define SMB2_O_INFO_FILESYSTEM	0x02
1451*4882a593Smuzhiyun #define SMB2_O_INFO_SECURITY	0x03
1452*4882a593Smuzhiyun #define SMB2_O_INFO_QUOTA	0x04
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun /* Security info type additionalinfo flags. See MS-SMB2 (2.2.37) or MS-DTYP */
1455*4882a593Smuzhiyun #define OWNER_SECINFO   0x00000001
1456*4882a593Smuzhiyun #define GROUP_SECINFO   0x00000002
1457*4882a593Smuzhiyun #define DACL_SECINFO   0x00000004
1458*4882a593Smuzhiyun #define SACL_SECINFO   0x00000008
1459*4882a593Smuzhiyun #define LABEL_SECINFO   0x00000010
1460*4882a593Smuzhiyun #define ATTRIBUTE_SECINFO   0x00000020
1461*4882a593Smuzhiyun #define SCOPE_SECINFO   0x00000040
1462*4882a593Smuzhiyun #define BACKUP_SECINFO   0x00010000
1463*4882a593Smuzhiyun #define UNPROTECTED_SACL_SECINFO   0x10000000
1464*4882a593Smuzhiyun #define UNPROTECTED_DACL_SECINFO   0x20000000
1465*4882a593Smuzhiyun #define PROTECTED_SACL_SECINFO   0x40000000
1466*4882a593Smuzhiyun #define PROTECTED_DACL_SECINFO   0x80000000
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun /* Flags used for FileFullEAinfo */
1469*4882a593Smuzhiyun #define SL_RESTART_SCAN		0x00000001
1470*4882a593Smuzhiyun #define SL_RETURN_SINGLE_ENTRY	0x00000002
1471*4882a593Smuzhiyun #define SL_INDEX_SPECIFIED	0x00000004
1472*4882a593Smuzhiyun 
1473*4882a593Smuzhiyun struct smb2_query_info_req {
1474*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1475*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 41 */
1476*4882a593Smuzhiyun 	__u8   InfoType;
1477*4882a593Smuzhiyun 	__u8   FileInfoClass;
1478*4882a593Smuzhiyun 	__le32 OutputBufferLength;
1479*4882a593Smuzhiyun 	__le16 InputBufferOffset;
1480*4882a593Smuzhiyun 	__u16  Reserved;
1481*4882a593Smuzhiyun 	__le32 InputBufferLength;
1482*4882a593Smuzhiyun 	__le32 AdditionalInformation;
1483*4882a593Smuzhiyun 	__le32 Flags;
1484*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1485*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1486*4882a593Smuzhiyun 	__u8   Buffer[1];
1487*4882a593Smuzhiyun } __packed;
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun struct smb2_query_info_rsp {
1490*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1491*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 9 */
1492*4882a593Smuzhiyun 	__le16 OutputBufferOffset;
1493*4882a593Smuzhiyun 	__le32 OutputBufferLength;
1494*4882a593Smuzhiyun 	__u8   Buffer[1];
1495*4882a593Smuzhiyun } __packed;
1496*4882a593Smuzhiyun 
1497*4882a593Smuzhiyun /*
1498*4882a593Smuzhiyun  * Maximum number of iovs we need for a set-info request.
1499*4882a593Smuzhiyun  * The largest one is rename/hardlink
1500*4882a593Smuzhiyun  * [0] : struct smb2_set_info_req + smb2_file_[rename|link]_info
1501*4882a593Smuzhiyun  * [1] : path
1502*4882a593Smuzhiyun  * [2] : compound padding
1503*4882a593Smuzhiyun  */
1504*4882a593Smuzhiyun #define SMB2_SET_INFO_IOV_SIZE 3
1505*4882a593Smuzhiyun 
1506*4882a593Smuzhiyun struct smb2_set_info_req {
1507*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1508*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 33 */
1509*4882a593Smuzhiyun 	__u8   InfoType;
1510*4882a593Smuzhiyun 	__u8   FileInfoClass;
1511*4882a593Smuzhiyun 	__le32 BufferLength;
1512*4882a593Smuzhiyun 	__le16 BufferOffset;
1513*4882a593Smuzhiyun 	__u16  Reserved;
1514*4882a593Smuzhiyun 	__le32 AdditionalInformation;
1515*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1516*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1517*4882a593Smuzhiyun 	__u8   Buffer[1];
1518*4882a593Smuzhiyun } __packed;
1519*4882a593Smuzhiyun 
1520*4882a593Smuzhiyun struct smb2_set_info_rsp {
1521*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1522*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 2 */
1523*4882a593Smuzhiyun } __packed;
1524*4882a593Smuzhiyun 
1525*4882a593Smuzhiyun struct smb2_oplock_break {
1526*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1527*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 24 */
1528*4882a593Smuzhiyun 	__u8   OplockLevel;
1529*4882a593Smuzhiyun 	__u8   Reserved;
1530*4882a593Smuzhiyun 	__le32 Reserved2;
1531*4882a593Smuzhiyun 	__u64  PersistentFid;
1532*4882a593Smuzhiyun 	__u64  VolatileFid;
1533*4882a593Smuzhiyun } __packed;
1534*4882a593Smuzhiyun 
1535*4882a593Smuzhiyun #define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01)
1536*4882a593Smuzhiyun 
1537*4882a593Smuzhiyun struct smb2_lease_break {
1538*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1539*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 44 */
1540*4882a593Smuzhiyun 	__le16 Epoch;
1541*4882a593Smuzhiyun 	__le32 Flags;
1542*4882a593Smuzhiyun 	__u8   LeaseKey[16];
1543*4882a593Smuzhiyun 	__le32 CurrentLeaseState;
1544*4882a593Smuzhiyun 	__le32 NewLeaseState;
1545*4882a593Smuzhiyun 	__le32 BreakReason;
1546*4882a593Smuzhiyun 	__le32 AccessMaskHint;
1547*4882a593Smuzhiyun 	__le32 ShareMaskHint;
1548*4882a593Smuzhiyun } __packed;
1549*4882a593Smuzhiyun 
1550*4882a593Smuzhiyun struct smb2_lease_ack {
1551*4882a593Smuzhiyun 	struct smb2_sync_hdr sync_hdr;
1552*4882a593Smuzhiyun 	__le16 StructureSize; /* Must be 36 */
1553*4882a593Smuzhiyun 	__le16 Reserved;
1554*4882a593Smuzhiyun 	__le32 Flags;
1555*4882a593Smuzhiyun 	__u8   LeaseKey[16];
1556*4882a593Smuzhiyun 	__le32 LeaseState;
1557*4882a593Smuzhiyun 	__le64 LeaseDuration;
1558*4882a593Smuzhiyun } __packed;
1559*4882a593Smuzhiyun 
1560*4882a593Smuzhiyun /*
1561*4882a593Smuzhiyun  *	PDU infolevel structure definitions
1562*4882a593Smuzhiyun  *	BB consider moving to a different header
1563*4882a593Smuzhiyun  */
1564*4882a593Smuzhiyun 
1565*4882a593Smuzhiyun /* File System Information Classes */
1566*4882a593Smuzhiyun #define FS_VOLUME_INFORMATION		1 /* Query */
1567*4882a593Smuzhiyun #define FS_LABEL_INFORMATION		2 /* Local only */
1568*4882a593Smuzhiyun #define FS_SIZE_INFORMATION		3 /* Query */
1569*4882a593Smuzhiyun #define FS_DEVICE_INFORMATION		4 /* Query */
1570*4882a593Smuzhiyun #define FS_ATTRIBUTE_INFORMATION	5 /* Query */
1571*4882a593Smuzhiyun #define FS_CONTROL_INFORMATION		6 /* Query, Set */
1572*4882a593Smuzhiyun #define FS_FULL_SIZE_INFORMATION	7 /* Query */
1573*4882a593Smuzhiyun #define FS_OBJECT_ID_INFORMATION	8 /* Query, Set */
1574*4882a593Smuzhiyun #define FS_DRIVER_PATH_INFORMATION	9 /* Local only */
1575*4882a593Smuzhiyun #define FS_VOLUME_FLAGS_INFORMATION	10 /* Local only */
1576*4882a593Smuzhiyun #define FS_SECTOR_SIZE_INFORMATION	11 /* SMB3 or later. Query */
1577*4882a593Smuzhiyun #define FS_POSIX_INFORMATION		100 /* SMB3.1.1 POSIX. Query */
1578*4882a593Smuzhiyun 
1579*4882a593Smuzhiyun struct smb2_fs_full_size_info {
1580*4882a593Smuzhiyun 	__le64 TotalAllocationUnits;
1581*4882a593Smuzhiyun 	__le64 CallerAvailableAllocationUnits;
1582*4882a593Smuzhiyun 	__le64 ActualAvailableAllocationUnits;
1583*4882a593Smuzhiyun 	__le32 SectorsPerAllocationUnit;
1584*4882a593Smuzhiyun 	__le32 BytesPerSector;
1585*4882a593Smuzhiyun } __packed;
1586*4882a593Smuzhiyun 
1587*4882a593Smuzhiyun #define SSINFO_FLAGS_ALIGNED_DEVICE		0x00000001
1588*4882a593Smuzhiyun #define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE 0x00000002
1589*4882a593Smuzhiyun #define SSINFO_FLAGS_NO_SEEK_PENALTY		0x00000004
1590*4882a593Smuzhiyun #define SSINFO_FLAGS_TRIM_ENABLED		0x00000008
1591*4882a593Smuzhiyun 
1592*4882a593Smuzhiyun /* sector size info struct */
1593*4882a593Smuzhiyun struct smb3_fs_ss_info {
1594*4882a593Smuzhiyun 	__le32 LogicalBytesPerSector;
1595*4882a593Smuzhiyun 	__le32 PhysicalBytesPerSectorForAtomicity;
1596*4882a593Smuzhiyun 	__le32 PhysicalBytesPerSectorForPerf;
1597*4882a593Smuzhiyun 	__le32 FileSystemEffectivePhysicalBytesPerSectorForAtomicity;
1598*4882a593Smuzhiyun 	__le32 Flags;
1599*4882a593Smuzhiyun 	__le32 ByteOffsetForSectorAlignment;
1600*4882a593Smuzhiyun 	__le32 ByteOffsetForPartitionAlignment;
1601*4882a593Smuzhiyun } __packed;
1602*4882a593Smuzhiyun 
1603*4882a593Smuzhiyun /* volume info struct - see MS-FSCC 2.5.9 */
1604*4882a593Smuzhiyun #define MAX_VOL_LABEL_LEN	32
1605*4882a593Smuzhiyun struct smb3_fs_vol_info {
1606*4882a593Smuzhiyun 	__le64	VolumeCreationTime;
1607*4882a593Smuzhiyun 	__u32	VolumeSerialNumber;
1608*4882a593Smuzhiyun 	__le32	VolumeLabelLength; /* includes trailing null */
1609*4882a593Smuzhiyun 	__u8	SupportsObjects; /* True if eg like NTFS, supports objects */
1610*4882a593Smuzhiyun 	__u8	Reserved;
1611*4882a593Smuzhiyun 	__u8	VolumeLabel[]; /* variable len */
1612*4882a593Smuzhiyun } __packed;
1613*4882a593Smuzhiyun 
1614*4882a593Smuzhiyun /* partial list of QUERY INFO levels */
1615*4882a593Smuzhiyun #define FILE_DIRECTORY_INFORMATION	1
1616*4882a593Smuzhiyun #define FILE_FULL_DIRECTORY_INFORMATION 2
1617*4882a593Smuzhiyun #define FILE_BOTH_DIRECTORY_INFORMATION 3
1618*4882a593Smuzhiyun #define FILE_BASIC_INFORMATION		4
1619*4882a593Smuzhiyun #define FILE_STANDARD_INFORMATION	5
1620*4882a593Smuzhiyun #define FILE_INTERNAL_INFORMATION	6
1621*4882a593Smuzhiyun #define FILE_EA_INFORMATION	        7
1622*4882a593Smuzhiyun #define FILE_ACCESS_INFORMATION		8
1623*4882a593Smuzhiyun #define FILE_NAME_INFORMATION		9
1624*4882a593Smuzhiyun #define FILE_RENAME_INFORMATION		10
1625*4882a593Smuzhiyun #define FILE_LINK_INFORMATION		11
1626*4882a593Smuzhiyun #define FILE_NAMES_INFORMATION		12
1627*4882a593Smuzhiyun #define FILE_DISPOSITION_INFORMATION	13
1628*4882a593Smuzhiyun #define FILE_POSITION_INFORMATION	14
1629*4882a593Smuzhiyun #define FILE_FULL_EA_INFORMATION	15
1630*4882a593Smuzhiyun #define FILE_MODE_INFORMATION		16
1631*4882a593Smuzhiyun #define FILE_ALIGNMENT_INFORMATION	17
1632*4882a593Smuzhiyun #define FILE_ALL_INFORMATION		18
1633*4882a593Smuzhiyun #define FILE_ALLOCATION_INFORMATION	19
1634*4882a593Smuzhiyun #define FILE_END_OF_FILE_INFORMATION	20
1635*4882a593Smuzhiyun #define FILE_ALTERNATE_NAME_INFORMATION 21
1636*4882a593Smuzhiyun #define FILE_STREAM_INFORMATION		22
1637*4882a593Smuzhiyun #define FILE_PIPE_INFORMATION		23
1638*4882a593Smuzhiyun #define FILE_PIPE_LOCAL_INFORMATION	24
1639*4882a593Smuzhiyun #define FILE_PIPE_REMOTE_INFORMATION	25
1640*4882a593Smuzhiyun #define FILE_MAILSLOT_QUERY_INFORMATION 26
1641*4882a593Smuzhiyun #define FILE_MAILSLOT_SET_INFORMATION	27
1642*4882a593Smuzhiyun #define FILE_COMPRESSION_INFORMATION	28
1643*4882a593Smuzhiyun #define FILE_OBJECT_ID_INFORMATION	29
1644*4882a593Smuzhiyun /* Number 30 not defined in documents */
1645*4882a593Smuzhiyun #define FILE_MOVE_CLUSTER_INFORMATION	31
1646*4882a593Smuzhiyun #define FILE_QUOTA_INFORMATION		32
1647*4882a593Smuzhiyun #define FILE_REPARSE_POINT_INFORMATION	33
1648*4882a593Smuzhiyun #define FILE_NETWORK_OPEN_INFORMATION	34
1649*4882a593Smuzhiyun #define FILE_ATTRIBUTE_TAG_INFORMATION	35
1650*4882a593Smuzhiyun #define FILE_TRACKING_INFORMATION	36
1651*4882a593Smuzhiyun #define FILEID_BOTH_DIRECTORY_INFORMATION 37
1652*4882a593Smuzhiyun #define FILEID_FULL_DIRECTORY_INFORMATION 38
1653*4882a593Smuzhiyun #define FILE_VALID_DATA_LENGTH_INFORMATION 39
1654*4882a593Smuzhiyun #define FILE_SHORT_NAME_INFORMATION	40
1655*4882a593Smuzhiyun #define FILE_SFIO_RESERVE_INFORMATION	44
1656*4882a593Smuzhiyun #define FILE_SFIO_VOLUME_INFORMATION	45
1657*4882a593Smuzhiyun #define FILE_HARD_LINK_INFORMATION	46
1658*4882a593Smuzhiyun #define FILE_NORMALIZED_NAME_INFORMATION 48
1659*4882a593Smuzhiyun #define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50
1660*4882a593Smuzhiyun #define FILE_STANDARD_LINK_INFORMATION	54
1661*4882a593Smuzhiyun #define FILE_ID_INFORMATION		59
1662*4882a593Smuzhiyun 
1663*4882a593Smuzhiyun struct smb2_file_internal_info {
1664*4882a593Smuzhiyun 	__le64 IndexNumber;
1665*4882a593Smuzhiyun } __packed; /* level 6 Query */
1666*4882a593Smuzhiyun 
1667*4882a593Smuzhiyun struct smb2_file_rename_info { /* encoding of request for level 10 */
1668*4882a593Smuzhiyun 	__u8   ReplaceIfExists; /* 1 = replace existing target with new */
1669*4882a593Smuzhiyun 				/* 0 = fail if target already exists */
1670*4882a593Smuzhiyun 	__u8   Reserved[7];
1671*4882a593Smuzhiyun 	__u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
1672*4882a593Smuzhiyun 	__le32 FileNameLength;
1673*4882a593Smuzhiyun 	char   FileName[];     /* New name to be assigned */
1674*4882a593Smuzhiyun 	/* padding - overall struct size must be >= 24 so filename + pad >= 6 */
1675*4882a593Smuzhiyun } __packed; /* level 10 Set */
1676*4882a593Smuzhiyun 
1677*4882a593Smuzhiyun struct smb2_file_link_info { /* encoding of request for level 11 */
1678*4882a593Smuzhiyun 	__u8   ReplaceIfExists; /* 1 = replace existing link with new */
1679*4882a593Smuzhiyun 				/* 0 = fail if link already exists */
1680*4882a593Smuzhiyun 	__u8   Reserved[7];
1681*4882a593Smuzhiyun 	__u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
1682*4882a593Smuzhiyun 	__le32 FileNameLength;
1683*4882a593Smuzhiyun 	char   FileName[];     /* Name to be assigned to new link */
1684*4882a593Smuzhiyun } __packed; /* level 11 Set */
1685*4882a593Smuzhiyun 
1686*4882a593Smuzhiyun struct smb2_file_full_ea_info { /* encoding of response for level 15 */
1687*4882a593Smuzhiyun 	__le32 next_entry_offset;
1688*4882a593Smuzhiyun 	__u8   flags;
1689*4882a593Smuzhiyun 	__u8   ea_name_length;
1690*4882a593Smuzhiyun 	__le16 ea_value_length;
1691*4882a593Smuzhiyun 	char   ea_data[]; /* \0 terminated name plus value */
1692*4882a593Smuzhiyun } __packed; /* level 15 Set */
1693*4882a593Smuzhiyun 
1694*4882a593Smuzhiyun /*
1695*4882a593Smuzhiyun  * This level 18, although with struct with same name is different from cifs
1696*4882a593Smuzhiyun  * level 0x107. Level 0x107 has an extra u64 between AccessFlags and
1697*4882a593Smuzhiyun  * CurrentByteOffset.
1698*4882a593Smuzhiyun  */
1699*4882a593Smuzhiyun struct smb2_file_all_info { /* data block encoding of response to level 18 */
1700*4882a593Smuzhiyun 	__le64 CreationTime;	/* Beginning of FILE_BASIC_INFO equivalent */
1701*4882a593Smuzhiyun 	__le64 LastAccessTime;
1702*4882a593Smuzhiyun 	__le64 LastWriteTime;
1703*4882a593Smuzhiyun 	__le64 ChangeTime;
1704*4882a593Smuzhiyun 	__le32 Attributes;
1705*4882a593Smuzhiyun 	__u32  Pad1;		/* End of FILE_BASIC_INFO_INFO equivalent */
1706*4882a593Smuzhiyun 	__le64 AllocationSize;	/* Beginning of FILE_STANDARD_INFO equivalent */
1707*4882a593Smuzhiyun 	__le64 EndOfFile;	/* size ie offset to first free byte in file */
1708*4882a593Smuzhiyun 	__le32 NumberOfLinks;	/* hard links */
1709*4882a593Smuzhiyun 	__u8   DeletePending;
1710*4882a593Smuzhiyun 	__u8   Directory;
1711*4882a593Smuzhiyun 	__u16  Pad2;		/* End of FILE_STANDARD_INFO equivalent */
1712*4882a593Smuzhiyun 	__le64 IndexNumber;
1713*4882a593Smuzhiyun 	__le32 EASize;
1714*4882a593Smuzhiyun 	__le32 AccessFlags;
1715*4882a593Smuzhiyun 	__le64 CurrentByteOffset;
1716*4882a593Smuzhiyun 	__le32 Mode;
1717*4882a593Smuzhiyun 	__le32 AlignmentRequirement;
1718*4882a593Smuzhiyun 	__le32 FileNameLength;
1719*4882a593Smuzhiyun 	char   FileName[1];
1720*4882a593Smuzhiyun } __packed; /* level 18 Query */
1721*4882a593Smuzhiyun 
1722*4882a593Smuzhiyun struct smb2_file_eof_info { /* encoding of request for level 10 */
1723*4882a593Smuzhiyun 	__le64 EndOfFile; /* new end of file value */
1724*4882a593Smuzhiyun } __packed; /* level 20 Set */
1725*4882a593Smuzhiyun 
1726*4882a593Smuzhiyun struct smb2_file_reparse_point_info {
1727*4882a593Smuzhiyun 	__le64 IndexNumber;
1728*4882a593Smuzhiyun 	__le32 Tag;
1729*4882a593Smuzhiyun } __packed;
1730*4882a593Smuzhiyun 
1731*4882a593Smuzhiyun struct smb2_file_network_open_info {
1732*4882a593Smuzhiyun 	__le64 CreationTime;
1733*4882a593Smuzhiyun 	__le64 LastAccessTime;
1734*4882a593Smuzhiyun 	__le64 LastWriteTime;
1735*4882a593Smuzhiyun 	__le64 ChangeTime;
1736*4882a593Smuzhiyun 	__le64 AllocationSize;
1737*4882a593Smuzhiyun 	__le64 EndOfFile;
1738*4882a593Smuzhiyun 	__le32 Attributes;
1739*4882a593Smuzhiyun 	__le32 Reserved;
1740*4882a593Smuzhiyun } __packed; /* level 34 Query also similar returned in close rsp and open rsp */
1741*4882a593Smuzhiyun 
1742*4882a593Smuzhiyun /* See MS-FSCC 2.4.43 */
1743*4882a593Smuzhiyun struct smb2_file_id_information {
1744*4882a593Smuzhiyun 	__le64	VolumeSerialNumber;
1745*4882a593Smuzhiyun 	__u64  PersistentFileId; /* opaque endianness */
1746*4882a593Smuzhiyun 	__u64  VolatileFileId; /* opaque endianness */
1747*4882a593Smuzhiyun } __packed; /* level 59 */
1748*4882a593Smuzhiyun 
1749*4882a593Smuzhiyun extern char smb2_padding[7];
1750*4882a593Smuzhiyun 
1751*4882a593Smuzhiyun /* equivalent of the contents of SMB3.1.1 POSIX open context response */
1752*4882a593Smuzhiyun struct create_posix_rsp {
1753*4882a593Smuzhiyun 	u32 nlink;
1754*4882a593Smuzhiyun 	u32 reparse_tag;
1755*4882a593Smuzhiyun 	u32 mode;
1756*4882a593Smuzhiyun 	struct cifs_sid owner; /* var-sized on the wire */
1757*4882a593Smuzhiyun 	struct cifs_sid group; /* var-sized on the wire */
1758*4882a593Smuzhiyun } __packed;
1759*4882a593Smuzhiyun 
1760*4882a593Smuzhiyun /*
1761*4882a593Smuzhiyun  * SMB2-only POSIX info level for query dir
1762*4882a593Smuzhiyun  *
1763*4882a593Smuzhiyun  * See posix_info_sid_size(), posix_info_extra_size() and
1764*4882a593Smuzhiyun  * posix_info_parse() to help with the handling of this struct.
1765*4882a593Smuzhiyun  */
1766*4882a593Smuzhiyun struct smb2_posix_info {
1767*4882a593Smuzhiyun 	__le32 NextEntryOffset;
1768*4882a593Smuzhiyun 	__u32 Ignored;
1769*4882a593Smuzhiyun 	__le64 CreationTime;
1770*4882a593Smuzhiyun 	__le64 LastAccessTime;
1771*4882a593Smuzhiyun 	__le64 LastWriteTime;
1772*4882a593Smuzhiyun 	__le64 ChangeTime;
1773*4882a593Smuzhiyun 	__le64 EndOfFile;
1774*4882a593Smuzhiyun 	__le64 AllocationSize;
1775*4882a593Smuzhiyun 	__le32 DosAttributes;
1776*4882a593Smuzhiyun 	__le64 Inode;
1777*4882a593Smuzhiyun 	__le32 DeviceId;
1778*4882a593Smuzhiyun 	__le32 Zero;
1779*4882a593Smuzhiyun 	/* beginning of POSIX Create Context Response */
1780*4882a593Smuzhiyun 	__le32 HardLinks;
1781*4882a593Smuzhiyun 	__le32 ReparseTag;
1782*4882a593Smuzhiyun 	__le32 Mode;
1783*4882a593Smuzhiyun 	/*
1784*4882a593Smuzhiyun 	 * var sized owner SID
1785*4882a593Smuzhiyun 	 * var sized group SID
1786*4882a593Smuzhiyun 	 * le32 filenamelength
1787*4882a593Smuzhiyun 	 * u8  filename[]
1788*4882a593Smuzhiyun 	 */
1789*4882a593Smuzhiyun } __packed;
1790*4882a593Smuzhiyun 
1791*4882a593Smuzhiyun /* Level 100 query info */
1792*4882a593Smuzhiyun struct smb311_posix_qinfo {
1793*4882a593Smuzhiyun 	__le64 CreationTime;
1794*4882a593Smuzhiyun 	__le64 LastAccessTime;
1795*4882a593Smuzhiyun 	__le64 LastWriteTime;
1796*4882a593Smuzhiyun 	__le64 ChangeTime;
1797*4882a593Smuzhiyun 	__le64 EndOfFile;
1798*4882a593Smuzhiyun 	__le64 AllocationSize;
1799*4882a593Smuzhiyun 	__le32 DosAttributes;
1800*4882a593Smuzhiyun 	__le64 Inode;
1801*4882a593Smuzhiyun 	__le32 DeviceId;
1802*4882a593Smuzhiyun 	__le32 Zero;
1803*4882a593Smuzhiyun 	/* beginning of POSIX Create Context Response */
1804*4882a593Smuzhiyun 	__le32 HardLinks;
1805*4882a593Smuzhiyun 	__le32 ReparseTag;
1806*4882a593Smuzhiyun 	__le32 Mode;
1807*4882a593Smuzhiyun 	u8     Sids[];
1808*4882a593Smuzhiyun 	/*
1809*4882a593Smuzhiyun 	 * var sized owner SID
1810*4882a593Smuzhiyun 	 * var sized group SID
1811*4882a593Smuzhiyun 	 * le32 filenamelength
1812*4882a593Smuzhiyun 	 * u8  filename[]
1813*4882a593Smuzhiyun 	 */
1814*4882a593Smuzhiyun } __packed;
1815*4882a593Smuzhiyun 
1816*4882a593Smuzhiyun /*
1817*4882a593Smuzhiyun  * Parsed version of the above struct. Allows direct access to the
1818*4882a593Smuzhiyun  * variable length fields
1819*4882a593Smuzhiyun  */
1820*4882a593Smuzhiyun struct smb2_posix_info_parsed {
1821*4882a593Smuzhiyun 	const struct smb2_posix_info *base;
1822*4882a593Smuzhiyun 	size_t size;
1823*4882a593Smuzhiyun 	struct cifs_sid owner;
1824*4882a593Smuzhiyun 	struct cifs_sid group;
1825*4882a593Smuzhiyun 	int name_len;
1826*4882a593Smuzhiyun 	const u8 *name;
1827*4882a593Smuzhiyun };
1828*4882a593Smuzhiyun 
1829*4882a593Smuzhiyun #endif				/* _SMB2PDU_H */
1830