cifspdu.h revision 76a3c92e
1/* SPDX-License-Identifier: LGPL-2.1 */
2/*
3 *   fs/cifs/cifspdu.h
4 *
5 *   Copyright (c) International Business Machines  Corp., 2002,2009
6 *   Author(s): Steve French (sfrench@us.ibm.com)
7 *
8 */
9
10#ifndef _CIFSPDU_H
11#define _CIFSPDU_H
12
13#include <net/sock.h>
14#include <asm/unaligned.h>
15#include "smbfsctl.h"
16
17#define CIFS_PROT   0
18#define POSIX_PROT  (CIFS_PROT+1)
19#define BAD_PROT 0xFFFF
20
21/* SMB command codes:
22 * Note some commands have minimal (wct=0,bcc=0), or uninteresting, responses
23 * (ie which include no useful data other than the SMB error code itself).
24 * This can allow us to avoid response buffer allocations and copy in some cases
25 */
26#define SMB_COM_CREATE_DIRECTORY      0x00 /* trivial response */
27#define SMB_COM_DELETE_DIRECTORY      0x01 /* trivial response */
28#define SMB_COM_CLOSE                 0x04 /* triv req/rsp, timestamp ignored */
29#define SMB_COM_FLUSH                 0x05 /* triv req/rsp */
30#define SMB_COM_DELETE                0x06 /* trivial response */
31#define SMB_COM_RENAME                0x07 /* trivial response */
32#define SMB_COM_QUERY_INFORMATION     0x08 /* aka getattr */
33#define SMB_COM_SETATTR               0x09 /* trivial response */
34#define SMB_COM_LOCKING_ANDX          0x24 /* trivial response */
35#define SMB_COM_COPY                  0x29 /* trivial rsp, fail filename ignrd*/
36#define SMB_COM_ECHO                  0x2B /* echo request */
37#define SMB_COM_OPEN_ANDX             0x2D /* Legacy open for old servers */
38#define SMB_COM_READ_ANDX             0x2E
39#define SMB_COM_WRITE_ANDX            0x2F
40#define SMB_COM_TRANSACTION2          0x32
41#define SMB_COM_TRANSACTION2_SECONDARY 0x33
42#define SMB_COM_FIND_CLOSE2           0x34 /* trivial response */
43#define SMB_COM_TREE_DISCONNECT       0x71 /* trivial response */
44#define SMB_COM_NEGOTIATE             0x72
45#define SMB_COM_SESSION_SETUP_ANDX    0x73
46#define SMB_COM_LOGOFF_ANDX           0x74 /* trivial response */
47#define SMB_COM_TREE_CONNECT_ANDX     0x75
48#define SMB_COM_NT_TRANSACT           0xA0
49#define SMB_COM_NT_TRANSACT_SECONDARY 0xA1
50#define SMB_COM_NT_CREATE_ANDX        0xA2
51#define SMB_COM_NT_CANCEL             0xA4 /* no response */
52#define SMB_COM_NT_RENAME             0xA5 /* trivial response */
53
54/* Transact2 subcommand codes */
55#define TRANS2_OPEN                   0x00
56#define TRANS2_FIND_FIRST             0x01
57#define TRANS2_FIND_NEXT              0x02
58#define TRANS2_QUERY_FS_INFORMATION   0x03
59#define TRANS2_SET_FS_INFORMATION     0x04
60#define TRANS2_QUERY_PATH_INFORMATION 0x05
61#define TRANS2_SET_PATH_INFORMATION   0x06
62#define TRANS2_QUERY_FILE_INFORMATION 0x07
63#define TRANS2_SET_FILE_INFORMATION   0x08
64#define TRANS2_GET_DFS_REFERRAL       0x10
65#define TRANS2_REPORT_DFS_INCOSISTENCY 0x11
66
67/* SMB Transact (Named Pipe) subcommand codes */
68#define TRANS_SET_NMPIPE_STATE      0x0001
69#define TRANS_RAW_READ_NMPIPE       0x0011
70#define TRANS_QUERY_NMPIPE_STATE    0x0021
71#define TRANS_QUERY_NMPIPE_INFO     0x0022
72#define TRANS_PEEK_NMPIPE           0x0023
73#define TRANS_TRANSACT_NMPIPE       0x0026
74#define TRANS_RAW_WRITE_NMPIPE      0x0031
75#define TRANS_READ_NMPIPE           0x0036
76#define TRANS_WRITE_NMPIPE          0x0037
77#define TRANS_WAIT_NMPIPE           0x0053
78#define TRANS_CALL_NMPIPE           0x0054
79
80/* NT Transact subcommand codes */
81#define NT_TRANSACT_CREATE            0x01
82#define NT_TRANSACT_IOCTL             0x02
83#define NT_TRANSACT_SET_SECURITY_DESC 0x03
84#define NT_TRANSACT_NOTIFY_CHANGE     0x04
85#define NT_TRANSACT_RENAME            0x05
86#define NT_TRANSACT_QUERY_SECURITY_DESC 0x06
87#define NT_TRANSACT_GET_USER_QUOTA    0x07
88#define NT_TRANSACT_SET_USER_QUOTA    0x08
89
90#define MAX_CIFS_SMALL_BUFFER_SIZE 448 /* big enough for most */
91/* future chained NTCreateXReadX bigger, but for time being NTCreateX biggest */
92/* among the requests (NTCreateX response is bigger with wct of 34) */
93#define MAX_CIFS_HDR_SIZE 0x58 /* 4 len + 32 hdr + (2*24 wct) + 2 bct + 2 pad */
94#define CIFS_SMALL_PATH 120 /* allows for (448-88)/3 */
95
96/* internal cifs vfs structures */
97/*****************************************************************
98 * All constants go here
99 *****************************************************************
100 */
101
102/*
103 * Starting value for maximum SMB size negotiation
104 */
105#define CIFS_MAX_MSGSIZE (4*4096)
106
107/*
108 * Size of encrypted user password in bytes
109 */
110#define CIFS_ENCPWD_SIZE (16)
111
112/*
113 * Size of the crypto key returned on the negotiate SMB in bytes
114 */
115#define CIFS_CRYPTO_KEY_SIZE (8)
116
117/*
118 * Size of the ntlm client response
119 */
120#define CIFS_AUTH_RESP_SIZE (24)
121
122/*
123 * Size of the session key (crypto key encrypted with the password
124 */
125#define CIFS_SESS_KEY_SIZE (16)
126
127/*
128 * Size of the smb3 signing key
129 */
130#define SMB3_SIGN_KEY_SIZE (16)
131
132/*
133 * Size of the smb3 encryption/decryption key storage.
134 * This size is big enough to store any cipher key types.
135 */
136#define SMB3_ENC_DEC_KEY_SIZE (32)
137
138#define CIFS_CLIENT_CHALLENGE_SIZE (8)
139#define CIFS_SERVER_CHALLENGE_SIZE (8)
140#define CIFS_HMAC_MD5_HASH_SIZE (16)
141#define CIFS_CPHTXT_SIZE (16)
142#define CIFS_NTHASH_SIZE (16)
143
144/*
145 * Maximum user name length
146 */
147#define CIFS_UNLEN (20)
148
149/*
150 * Flags on SMB open
151 */
152#define SMBOPEN_WRITE_THROUGH 0x4000
153#define SMBOPEN_DENY_ALL      0x0010
154#define SMBOPEN_DENY_WRITE    0x0020
155#define SMBOPEN_DENY_READ     0x0030
156#define SMBOPEN_DENY_NONE     0x0040
157#define SMBOPEN_READ          0x0000
158#define SMBOPEN_WRITE         0x0001
159#define SMBOPEN_READWRITE     0x0002
160#define SMBOPEN_EXECUTE       0x0003
161
162#define SMBOPEN_OCREATE       0x0010
163#define SMBOPEN_OTRUNC        0x0002
164#define SMBOPEN_OAPPEND       0x0001
165
166/*
167 * SMB flag definitions
168 */
169#define SMBFLG_EXTD_LOCK 0x01	/* server supports lock-read write-unlock smb */
170#define SMBFLG_RCV_POSTED 0x02	/* obsolete */
171#define SMBFLG_RSVD 0x04
172#define SMBFLG_CASELESS 0x08	/* all pathnames treated as caseless (off
173				implies case sensitive file handling request) */
174#define SMBFLG_CANONICAL_PATH_FORMAT 0x10	/* obsolete */
175#define SMBFLG_OLD_OPLOCK 0x20	/* obsolete */
176#define SMBFLG_OLD_OPLOCK_NOTIFY 0x40	/* obsolete */
177#define SMBFLG_RESPONSE 0x80	/* this PDU is a response from server */
178
179/*
180 * SMB flag2 definitions
181 */
182#define SMBFLG2_KNOWS_LONG_NAMES cpu_to_le16(1)	/* can send long (non-8.3)
183						   path names in response */
184#define SMBFLG2_KNOWS_EAS cpu_to_le16(2)
185#define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4)
186#define SMBFLG2_COMPRESSED (8)
187#define SMBFLG2_SECURITY_SIGNATURE_REQUIRED (0x10)
188#define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40)
189#define SMBFLG2_REPARSE_PATH (0x400)
190#define SMBFLG2_EXT_SEC cpu_to_le16(0x800)
191#define SMBFLG2_DFS cpu_to_le16(0x1000)
192#define SMBFLG2_PAGING_IO cpu_to_le16(0x2000)
193#define SMBFLG2_ERR_STATUS cpu_to_le16(0x4000)
194#define SMBFLG2_UNICODE cpu_to_le16(0x8000)
195
196/*
197 * These are the file access permission bits defined in CIFS for the
198 * NTCreateAndX as well as the level 0x107
199 * TRANS2_QUERY_PATH_INFORMATION API.  The level 0x107, SMB_QUERY_FILE_ALL_INFO
200 * responds with the AccessFlags.
201 * The AccessFlags specifies the access permissions a caller has to the
202 * file and can have any suitable combination of the following values:
203 */
204
205#define FILE_READ_DATA        0x00000001  /* Data can be read from the file   */
206#define FILE_WRITE_DATA       0x00000002  /* Data can be written to the file  */
207#define FILE_APPEND_DATA      0x00000004  /* Data can be appended to the file */
208#define FILE_READ_EA          0x00000008  /* Extended attributes associated   */
209					  /* with the file can be read        */
210#define FILE_WRITE_EA         0x00000010  /* Extended attributes associated   */
211					  /* with the file can be written     */
212#define FILE_EXECUTE          0x00000020  /*Data can be read into memory from */
213					  /* the file using system paging I/O */
214#define FILE_DELETE_CHILD     0x00000040
215#define FILE_READ_ATTRIBUTES  0x00000080  /* Attributes associated with the   */
216					  /* file can be read                 */
217#define FILE_WRITE_ATTRIBUTES 0x00000100  /* Attributes associated with the   */
218					  /* file can be written              */
219#define DELETE                0x00010000  /* The file can be deleted          */
220#define READ_CONTROL          0x00020000  /* The access control list and      */
221					  /* ownership associated with the    */
222					  /* file can be read                 */
223#define WRITE_DAC             0x00040000  /* The access control list and      */
224					  /* ownership associated with the    */
225					  /* file can be written.             */
226#define WRITE_OWNER           0x00080000  /* Ownership information associated */
227					  /* with the file can be written     */
228#define SYNCHRONIZE           0x00100000  /* The file handle can waited on to */
229					  /* synchronize with the completion  */
230					  /* of an input/output request       */
231#define SYSTEM_SECURITY       0x01000000  /* The system access control list   */
232					  /* can be read and changed          */
233#define GENERIC_ALL           0x10000000
234#define GENERIC_EXECUTE       0x20000000
235#define GENERIC_WRITE         0x40000000
236#define GENERIC_READ          0x80000000
237					 /* In summary - Relevant file       */
238					 /* access flags from CIFS are       */
239					 /* file_read_data, file_write_data  */
240					 /* file_execute, file_read_attributes*/
241					 /* write_dac, and delete.           */
242
243#define FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES)
244#define FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \
245				| FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES)
246#define FILE_EXEC_RIGHTS (FILE_EXECUTE)
247
248#define SET_FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_WRITE_EA \
249				| FILE_READ_ATTRIBUTES \
250				| FILE_WRITE_ATTRIBUTES \
251				| DELETE | READ_CONTROL | WRITE_DAC \
252				| WRITE_OWNER | SYNCHRONIZE)
253#define SET_FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \
254				| FILE_READ_EA | FILE_WRITE_EA \
255				| FILE_READ_ATTRIBUTES \
256				| FILE_WRITE_ATTRIBUTES \
257				| DELETE | READ_CONTROL | WRITE_DAC \
258				| WRITE_OWNER | SYNCHRONIZE)
259#define SET_FILE_EXEC_RIGHTS (FILE_READ_EA | FILE_WRITE_EA | FILE_EXECUTE \
260				| FILE_READ_ATTRIBUTES \
261				| FILE_WRITE_ATTRIBUTES \
262				| DELETE | READ_CONTROL | WRITE_DAC \
263				| WRITE_OWNER | SYNCHRONIZE)
264
265#define SET_MINIMUM_RIGHTS (FILE_READ_EA | FILE_READ_ATTRIBUTES \
266				| READ_CONTROL | SYNCHRONIZE)
267
268
269/*
270 * Invalid readdir handle
271 */
272#define CIFS_NO_HANDLE        0xFFFF
273
274#define NO_CHANGE_64          0xFFFFFFFFFFFFFFFFULL
275
276/* IPC$ in ASCII */
277#define CIFS_IPC_RESOURCE "\x49\x50\x43\x24"
278
279/* IPC$ in Unicode */
280#define CIFS_IPC_UNICODE_RESOURCE "\x00\x49\x00\x50\x00\x43\x00\x24\x00\x00"
281
282/* Unicode Null terminate 2 bytes of 0 */
283#define UNICODE_NULL "\x00\x00"
284#define ASCII_NULL 0x00
285
286/*
287 * Server type values (returned on EnumServer API
288 */
289#define CIFS_SV_TYPE_DC     0x00000008
290#define CIFS_SV_TYPE_BACKDC 0x00000010
291
292/*
293 * Alias type flags (From EnumAlias API call
294 */
295#define CIFS_ALIAS_TYPE_FILE 0x0001
296#define CIFS_SHARE_TYPE_FILE 0x0000
297
298/*
299 * File Attribute flags
300 */
301#define ATTR_READONLY  0x0001
302#define ATTR_HIDDEN    0x0002
303#define ATTR_SYSTEM    0x0004
304#define ATTR_VOLUME    0x0008
305#define ATTR_DIRECTORY 0x0010
306#define ATTR_ARCHIVE   0x0020
307#define ATTR_DEVICE    0x0040
308#define ATTR_NORMAL    0x0080
309#define ATTR_TEMPORARY 0x0100
310#define ATTR_SPARSE    0x0200
311#define ATTR_REPARSE   0x0400
312#define ATTR_COMPRESSED 0x0800
313#define ATTR_OFFLINE    0x1000	/* ie file not immediately available -
314					on offline storage */
315#define ATTR_NOT_CONTENT_INDEXED 0x2000
316#define ATTR_ENCRYPTED  0x4000
317#define ATTR_POSIX_SEMANTICS 0x01000000
318#define ATTR_BACKUP_SEMANTICS 0x02000000
319#define ATTR_DELETE_ON_CLOSE 0x04000000
320#define ATTR_SEQUENTIAL_SCAN 0x08000000
321#define ATTR_RANDOM_ACCESS   0x10000000
322#define ATTR_NO_BUFFERING    0x20000000
323#define ATTR_WRITE_THROUGH   0x80000000
324
325/* ShareAccess flags */
326#define FILE_NO_SHARE     0x00000000
327#define FILE_SHARE_READ   0x00000001
328#define FILE_SHARE_WRITE  0x00000002
329#define FILE_SHARE_DELETE 0x00000004
330#define FILE_SHARE_ALL    0x00000007
331
332/* CreateDisposition flags, similar to CreateAction as well */
333#define FILE_SUPERSEDE    0x00000000
334#define FILE_OPEN         0x00000001
335#define FILE_CREATE       0x00000002
336#define FILE_OPEN_IF      0x00000003
337#define FILE_OVERWRITE    0x00000004
338#define FILE_OVERWRITE_IF 0x00000005
339
340/* CreateOptions */
341#define CREATE_NOT_FILE		0x00000001	/* if set must not be file */
342#define CREATE_WRITE_THROUGH	0x00000002
343#define CREATE_SEQUENTIAL       0x00000004
344#define CREATE_NO_BUFFER        0x00000008      /* should not buffer on srv */
345#define CREATE_SYNC_ALERT       0x00000010	/* MBZ */
346#define CREATE_ASYNC_ALERT      0x00000020	/* MBZ */
347#define CREATE_NOT_DIR		0x00000040    /* if set must not be directory */
348#define CREATE_TREE_CONNECTION  0x00000080	/* should be zero */
349#define CREATE_COMPLETE_IF_OPLK 0x00000100	/* should be zero */
350#define CREATE_NO_EA_KNOWLEDGE  0x00000200
351#define CREATE_EIGHT_DOT_THREE  0x00000400	/* doc says this is obsolete
352						 "open for recovery" flag should
353						 be zero in any case */
354#define CREATE_OPEN_FOR_RECOVERY 0x00000400
355#define CREATE_RANDOM_ACCESS	0x00000800
356#define CREATE_DELETE_ON_CLOSE	0x00001000
357#define CREATE_OPEN_BY_ID       0x00002000
358#define CREATE_OPEN_BACKUP_INTENT 0x00004000
359#define CREATE_NO_COMPRESSION   0x00008000
360#define CREATE_RESERVE_OPFILTER 0x00100000	/* should be zero */
361#define OPEN_REPARSE_POINT	0x00200000
362#define OPEN_NO_RECALL          0x00400000
363#define OPEN_FREE_SPACE_QUERY   0x00800000	/* should be zero */
364#define CREATE_OPTIONS_MASK     0x007FFFFF
365#define CREATE_OPTION_READONLY	0x10000000
366#define CREATE_OPTION_SPECIAL   0x20000000   /* system. NB not sent over wire */
367
368/* ImpersonationLevel flags */
369#define SECURITY_ANONYMOUS      0
370#define SECURITY_IDENTIFICATION 1
371#define SECURITY_IMPERSONATION  2
372#define SECURITY_DELEGATION     3
373
374/* SecurityFlags */
375#define SECURITY_CONTEXT_TRACKING 0x01
376#define SECURITY_EFFECTIVE_ONLY   0x02
377
378/*
379 * Default PID value, used in all SMBs where the PID is not important
380 */
381#define CIFS_DFT_PID  0x1234
382
383/*
384 * We use the same routine for Copy and Move SMBs.  This flag is used to
385 * distinguish
386 */
387#define CIFS_COPY_OP 1
388#define CIFS_RENAME_OP 2
389
390#define GETU16(var)  (*((__u16 *)var))	/* BB check for endian issues */
391#define GETU32(var)  (*((__u32 *)var))	/* BB check for endian issues */
392
393struct smb_hdr {
394	__be32 smb_buf_length;	/* BB length is only two (rarely three) bytes,
395		with one or two byte "type" preceding it that will be
396		zero - we could mask the type byte off */
397	__u8 Protocol[4];
398	__u8 Command;
399	union {
400		struct {
401			__u8 ErrorClass;
402			__u8 Reserved;
403			__le16 Error;
404		} __attribute__((packed)) DosError;
405		__le32 CifsError;
406	} __attribute__((packed)) Status;
407	__u8 Flags;
408	__le16 Flags2;		/* note: le */
409	__le16 PidHigh;
410	union {
411		struct {
412			__le32 SequenceNumber;  /* le */
413			__u32 Reserved; /* zero */
414		} __attribute__((packed)) Sequence;
415		__u8 SecuritySignature[8];	/* le */
416	} __attribute__((packed)) Signature;
417	__u8 pad[2];
418	__u16 Tid;
419	__le16 Pid;
420	__u16 Uid;
421	__le16 Mid;
422	__u8 WordCount;
423} __attribute__((packed));
424
425/* given a pointer to an smb_hdr, retrieve a void pointer to the ByteCount */
426static inline void *
427BCC(struct smb_hdr *smb)
428{
429	return (void *)smb + sizeof(*smb) + 2 * smb->WordCount;
430}
431
432/* given a pointer to an smb_hdr retrieve the pointer to the byte area */
433#define pByteArea(smb_var) (BCC(smb_var) + 2)
434
435/* get the unconverted ByteCount for a SMB packet and return it */
436static inline __u16
437get_bcc(struct smb_hdr *hdr)
438{
439	__le16 *bc_ptr = (__le16 *)BCC(hdr);
440
441	return get_unaligned_le16(bc_ptr);
442}
443
444/* set the ByteCount for a SMB packet in little-endian */
445static inline void
446put_bcc(__u16 count, struct smb_hdr *hdr)
447{
448	__le16 *bc_ptr = (__le16 *)BCC(hdr);
449
450	put_unaligned_le16(count, bc_ptr);
451}
452
453/*
454 * Computer Name Length (since Netbios name was length 16 with last byte 0x20)
455 * No longer as important, now that TCP names are more commonly used to
456 * resolve hosts.
457 */
458#define CNLEN 15
459
460/*
461 * Share Name Length (SNLEN)
462 * Note:  This length was limited by the SMB used to get
463 *        the Share info.   NetShareEnum only returned 13
464 *        chars, including the null termination.
465 * This was removed because it no longer is limiting.
466 */
467
468/*
469 * Comment Length
470 */
471#define MAXCOMMENTLEN 40
472
473/*
474 * The OS/2 maximum path name
475 */
476#define MAX_PATHCONF 256
477
478/*
479 *  SMB frame definitions  (following must be packed structs)
480 *  See the SNIA CIFS Specification for details.
481 *
482 *  The Naming convention is the lower case version of the
483 *  smb command code name for the struct and this is typedef to the
484 *  uppercase version of the same name with the prefix SMB_ removed
485 *  for brevity.  Although typedefs are not commonly used for
486 *  structure definitions in the Linux kernel, their use in the
487 *  CIFS standards document, which this code is based on, may
488 *  make this one of the cases where typedefs for structures make
489 *  sense to improve readability for readers of the standards doc.
490 *  Typedefs can always be removed later if they are too distracting
491 *  and they are only used for the CIFSs PDUs themselves, not
492 *  internal cifs vfs structures
493 *
494 */
495
496typedef struct negotiate_req {
497	struct smb_hdr hdr;	/* wct = 0 */
498	__le16 ByteCount;
499	unsigned char DialectsArray[1];
500} __attribute__((packed)) NEGOTIATE_REQ;
501
502#define MIN_TZ_ADJ (15 * 60) /* minimum grid for timezones in seconds */
503
504#define READ_RAW_ENABLE 1
505#define WRITE_RAW_ENABLE 2
506#define RAW_ENABLE (READ_RAW_ENABLE | WRITE_RAW_ENABLE)
507#define SMB1_CLIENT_GUID_SIZE (16)
508typedef struct negotiate_rsp {
509	struct smb_hdr hdr;	/* wct = 17 */
510	__le16 DialectIndex; /* 0xFFFF = no dialect acceptable */
511	__u8 SecurityMode;
512	__le16 MaxMpxCount;
513	__le16 MaxNumberVcs;
514	__le32 MaxBufferSize;
515	__le32 MaxRawSize;
516	__le32 SessionKey;
517	__le32 Capabilities;	/* see below */
518	__le32 SystemTimeLow;
519	__le32 SystemTimeHigh;
520	__le16 ServerTimeZone;
521	__u8 EncryptionKeyLength;
522	__u16 ByteCount;
523	union {
524		unsigned char EncryptionKey[1];	/* cap extended security off */
525		/* followed by Domain name - if extended security is off */
526		/* followed by 16 bytes of server GUID */
527		/* then security blob if cap_extended_security negotiated */
528		struct {
529			unsigned char GUID[SMB1_CLIENT_GUID_SIZE];
530			unsigned char SecurityBlob[1];
531		} __attribute__((packed)) extended_response;
532	} __attribute__((packed)) u;
533} __attribute__((packed)) NEGOTIATE_RSP;
534
535/* SecurityMode bits */
536#define SECMODE_USER          0x01	/* off indicates share level security */
537#define SECMODE_PW_ENCRYPT    0x02
538#define SECMODE_SIGN_ENABLED  0x04	/* SMB security signatures enabled */
539#define SECMODE_SIGN_REQUIRED 0x08	/* SMB security signatures required */
540
541/* Negotiate response Capabilities */
542#define CAP_RAW_MODE           0x00000001
543#define CAP_MPX_MODE           0x00000002
544#define CAP_UNICODE            0x00000004
545#define CAP_LARGE_FILES        0x00000008
546#define CAP_NT_SMBS            0x00000010	/* implies CAP_NT_FIND */
547#define CAP_RPC_REMOTE_APIS    0x00000020
548#define CAP_STATUS32           0x00000040
549#define CAP_LEVEL_II_OPLOCKS   0x00000080
550#define CAP_LOCK_AND_READ      0x00000100
551#define CAP_NT_FIND            0x00000200
552#define CAP_DFS                0x00001000
553#define CAP_INFOLEVEL_PASSTHRU 0x00002000
554#define CAP_LARGE_READ_X       0x00004000
555#define CAP_LARGE_WRITE_X      0x00008000
556#define CAP_LWIO               0x00010000 /* support fctl_srv_req_resume_key */
557#define CAP_UNIX               0x00800000
558#define CAP_COMPRESSED_DATA    0x02000000
559#define CAP_DYNAMIC_REAUTH     0x20000000
560#define CAP_PERSISTENT_HANDLES 0x40000000
561#define CAP_EXTENDED_SECURITY  0x80000000
562
563typedef union smb_com_session_setup_andx {
564	struct {		/* request format */
565		struct smb_hdr hdr;	/* wct = 12 */
566		__u8 AndXCommand;
567		__u8 AndXReserved;
568		__le16 AndXOffset;
569		__le16 MaxBufferSize;
570		__le16 MaxMpxCount;
571		__le16 VcNumber;
572		__u32 SessionKey;
573		__le16 SecurityBlobLength;
574		__u32 Reserved;
575		__le32 Capabilities;	/* see below */
576		__le16 ByteCount;
577		unsigned char SecurityBlob[1];	/* followed by */
578		/* STRING NativeOS */
579		/* STRING NativeLanMan */
580	} __attribute__((packed)) req;	/* NTLM request format (with
581					extended security */
582
583	struct {		/* request format */
584		struct smb_hdr hdr;	/* wct = 13 */
585		__u8 AndXCommand;
586		__u8 AndXReserved;
587		__le16 AndXOffset;
588		__le16 MaxBufferSize;
589		__le16 MaxMpxCount;
590		__le16 VcNumber;
591		__u32 SessionKey;
592		__le16 CaseInsensitivePasswordLength; /* ASCII password len */
593		__le16 CaseSensitivePasswordLength; /* Unicode password length*/
594		__u32 Reserved;	/* see below */
595		__le32 Capabilities;
596		__le16 ByteCount;
597		unsigned char CaseInsensitivePassword[1];     /* followed by: */
598		/* unsigned char * CaseSensitivePassword; */
599		/* STRING AccountName */
600		/* STRING PrimaryDomain */
601		/* STRING NativeOS */
602		/* STRING NativeLanMan */
603	} __attribute__((packed)) req_no_secext; /* NTLM request format (without
604							extended security */
605
606	struct {		/* default (NTLM) response format */
607		struct smb_hdr hdr;	/* wct = 4 */
608		__u8 AndXCommand;
609		__u8 AndXReserved;
610		__le16 AndXOffset;
611		__le16 Action;	/* see below */
612		__le16 SecurityBlobLength;
613		__u16 ByteCount;
614		unsigned char SecurityBlob[1];	/* followed by */
615/*      unsigned char  * NativeOS;      */
616/*	unsigned char  * NativeLanMan;  */
617/*      unsigned char  * PrimaryDomain; */
618	} __attribute__((packed)) resp;	/* NTLM response
619					   (with or without extended sec) */
620
621	struct {		/* request format */
622		struct smb_hdr hdr;	/* wct = 10 */
623		__u8 AndXCommand;
624		__u8 AndXReserved;
625		__le16 AndXOffset;
626		__le16 MaxBufferSize;
627		__le16 MaxMpxCount;
628		__le16 VcNumber;
629		__u32 SessionKey;
630		__le16 PasswordLength;
631		__u32 Reserved; /* encrypt key len and offset */
632		__le16 ByteCount;
633		unsigned char AccountPassword[1];	/* followed by */
634		/* STRING AccountName */
635		/* STRING PrimaryDomain */
636		/* STRING NativeOS */
637		/* STRING NativeLanMan */
638	} __attribute__((packed)) old_req; /* pre-NTLM (LANMAN2.1) req format */
639
640	struct {		/* default (NTLM) response format */
641		struct smb_hdr hdr;	/* wct = 3 */
642		__u8 AndXCommand;
643		__u8 AndXReserved;
644		__le16 AndXOffset;
645		__le16 Action;	/* see below */
646		__u16 ByteCount;
647		unsigned char NativeOS[1];	/* followed by */
648/*	unsigned char * NativeLanMan; */
649/*      unsigned char * PrimaryDomain; */
650	} __attribute__((packed)) old_resp; /* pre-NTLM (LANMAN2.1) response */
651} __attribute__((packed)) SESSION_SETUP_ANDX;
652
653/* format of NLTMv2 Response ie "case sensitive password" hash when NTLMv2 */
654
655#define NTLMSSP_SERVER_TYPE	1
656#define NTLMSSP_DOMAIN_TYPE	2
657#define NTLMSSP_FQ_DOMAIN_TYPE	3
658#define NTLMSSP_DNS_DOMAIN_TYPE	4
659#define NTLMSSP_DNS_PARENT_TYPE	5
660
661struct ntlmssp2_name {
662	__le16 type;
663	__le16 length;
664/*	char   name[length]; */
665} __attribute__((packed));
666
667struct ntlmv2_resp {
668	union {
669	    char ntlmv2_hash[CIFS_ENCPWD_SIZE];
670	    struct {
671		__u8 reserved[8];
672		__u8 key[CIFS_SERVER_CHALLENGE_SIZE];
673	    } __attribute__((packed)) challenge;
674	} __attribute__((packed));
675	__le32 blob_signature;
676	__u32  reserved;
677	__le64  time;
678	__u64  client_chal; /* random */
679	__u32  reserved2;
680	/* array of name entries could follow ending in minimum 4 byte struct */
681} __attribute__((packed));
682
683
684#define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux"
685
686/* Capabilities bits (for NTLM SessSetup request) */
687#define CAP_UNICODE            0x00000004
688#define CAP_LARGE_FILES        0x00000008
689#define CAP_NT_SMBS            0x00000010
690#define CAP_STATUS32           0x00000040
691#define CAP_LEVEL_II_OPLOCKS   0x00000080
692#define CAP_NT_FIND            0x00000200	/* reserved should be zero
693				(because NT_SMBs implies the same thing?) */
694#define CAP_BULK_TRANSFER      0x20000000
695#define CAP_EXTENDED_SECURITY  0x80000000
696
697/* Action bits */
698#define GUEST_LOGIN 1
699
700typedef struct smb_com_tconx_req {
701	struct smb_hdr hdr;	/* wct = 4 */
702	__u8 AndXCommand;
703	__u8 AndXReserved;
704	__le16 AndXOffset;
705	__le16 Flags;		/* see below */
706	__le16 PasswordLength;
707	__le16 ByteCount;
708	unsigned char Password[1];	/* followed by */
709/* STRING Path    *//* \\server\share name */
710	/* STRING Service */
711} __attribute__((packed)) TCONX_REQ;
712
713typedef struct smb_com_tconx_rsp {
714	struct smb_hdr hdr;	/* wct = 3 , not extended response */
715	__u8 AndXCommand;
716	__u8 AndXReserved;
717	__le16 AndXOffset;
718	__le16 OptionalSupport;	/* see below */
719	__u16 ByteCount;
720	unsigned char Service[1];	/* always ASCII, not Unicode */
721	/* STRING NativeFileSystem */
722} __attribute__((packed)) TCONX_RSP;
723
724typedef struct smb_com_tconx_rsp_ext {
725	struct smb_hdr hdr;	/* wct = 7, extended response */
726	__u8 AndXCommand;
727	__u8 AndXReserved;
728	__le16 AndXOffset;
729	__le16 OptionalSupport;	/* see below */
730	__le32 MaximalShareAccessRights;
731	__le32 GuestMaximalShareAccessRights;
732	__u16 ByteCount;
733	unsigned char Service[1];	/* always ASCII, not Unicode */
734	/* STRING NativeFileSystem */
735} __attribute__((packed)) TCONX_RSP_EXT;
736
737
738/* tree connect Flags */
739#define DISCONNECT_TID          0x0001
740#define TCON_EXTENDED_SIGNATURES 0x0004
741#define TCON_EXTENDED_SECINFO   0x0008
742
743/* OptionalSupport bits */
744#define SMB_SUPPORT_SEARCH_BITS 0x0001	/* "must have" directory search bits
745					 (exclusive searches supported) */
746#define SMB_SHARE_IS_IN_DFS     0x0002
747#define SMB_CSC_MASK               0x000C
748/* CSC flags defined as follows */
749#define SMB_CSC_CACHE_MANUAL_REINT 0x0000
750#define SMB_CSC_CACHE_AUTO_REINT   0x0004
751#define SMB_CSC_CACHE_VDO          0x0008
752#define SMB_CSC_NO_CACHING         0x000C
753#define SMB_UNIQUE_FILE_NAME    0x0010
754#define SMB_EXTENDED_SIGNATURES 0x0020
755
756/* services
757 *
758 * A:       ie disk
759 * LPT1:    ie printer
760 * IPC      ie named pipe
761 * COMM
762 * ?????    ie any type
763 *
764 */
765
766typedef struct smb_com_echo_req {
767	struct	smb_hdr hdr;
768	__le16	EchoCount;
769	__le16	ByteCount;
770	char	Data[1];
771} __attribute__((packed)) ECHO_REQ;
772
773typedef struct smb_com_echo_rsp {
774	struct	smb_hdr hdr;
775	__le16	SequenceNumber;
776	__le16	ByteCount;
777	char	Data[1];
778} __attribute__((packed)) ECHO_RSP;
779
780typedef struct smb_com_logoff_andx_req {
781	struct smb_hdr hdr;	/* wct = 2 */
782	__u8 AndXCommand;
783	__u8 AndXReserved;
784	__u16 AndXOffset;
785	__u16 ByteCount;
786} __attribute__((packed)) LOGOFF_ANDX_REQ;
787
788typedef struct smb_com_logoff_andx_rsp {
789	struct smb_hdr hdr;	/* wct = 2 */
790	__u8 AndXCommand;
791	__u8 AndXReserved;
792	__u16 AndXOffset;
793	__u16 ByteCount;
794} __attribute__((packed)) LOGOFF_ANDX_RSP;
795
796typedef union smb_com_tree_disconnect {	/* as an altetnative can use flag on
797					tree_connect PDU to effect disconnect */
798					/* tdis is probably simplest SMB PDU */
799	struct {
800		struct smb_hdr hdr;	/* wct = 0 */
801		__u16 ByteCount;	/* bcc = 0 */
802	} __attribute__((packed)) req;
803	struct {
804		struct smb_hdr hdr;	/* wct = 0 */
805		__u16 ByteCount;	/* bcc = 0 */
806	} __attribute__((packed)) resp;
807} __attribute__((packed)) TREE_DISCONNECT;
808
809typedef struct smb_com_close_req {
810	struct smb_hdr hdr;	/* wct = 3 */
811	__u16 FileID;
812	__u32 LastWriteTime;	/* should be zero or -1 */
813	__u16 ByteCount;	/* 0 */
814} __attribute__((packed)) CLOSE_REQ;
815
816typedef struct smb_com_close_rsp {
817	struct smb_hdr hdr;	/* wct = 0 */
818	__u16 ByteCount;	/* bct = 0 */
819} __attribute__((packed)) CLOSE_RSP;
820
821typedef struct smb_com_flush_req {
822	struct smb_hdr hdr;	/* wct = 1 */
823	__u16 FileID;
824	__u16 ByteCount;	/* 0 */
825} __attribute__((packed)) FLUSH_REQ;
826
827typedef struct smb_com_findclose_req {
828	struct smb_hdr hdr; /* wct = 1 */
829	__u16 FileID;
830	__u16 ByteCount;    /* 0 */
831} __attribute__((packed)) FINDCLOSE_REQ;
832
833/* OpenFlags */
834#define REQ_MORE_INFO      0x00000001  /* legacy (OPEN_AND_X) only */
835#define REQ_OPLOCK         0x00000002
836#define REQ_BATCHOPLOCK    0x00000004
837#define REQ_OPENDIRONLY    0x00000008
838#define REQ_EXTENDED_INFO  0x00000010
839
840/* File type */
841#define DISK_TYPE		0x0000
842#define BYTE_PIPE_TYPE		0x0001
843#define MESSAGE_PIPE_TYPE	0x0002
844#define PRINTER_TYPE		0x0003
845#define COMM_DEV_TYPE		0x0004
846#define UNKNOWN_TYPE		0xFFFF
847
848/* Device Type or File Status Flags */
849#define NO_EAS			0x0001
850#define NO_SUBSTREAMS		0x0002
851#define NO_REPARSETAG		0x0004
852/* following flags can apply if pipe */
853#define ICOUNT_MASK		0x00FF
854#define PIPE_READ_MODE		0x0100
855#define NAMED_PIPE_TYPE		0x0400
856#define PIPE_END_POINT		0x4000
857#define BLOCKING_NAMED_PIPE	0x8000
858
859typedef struct smb_com_open_req {	/* also handles create */
860	struct smb_hdr hdr;	/* wct = 24 */
861	__u8 AndXCommand;
862	__u8 AndXReserved;
863	__le16 AndXOffset;
864	__u8 Reserved;		/* Must Be Zero */
865	__le16 NameLength;
866	__le32 OpenFlags;
867	__u32  RootDirectoryFid;
868	__le32 DesiredAccess;
869	__le64 AllocationSize;
870	__le32 FileAttributes;
871	__le32 ShareAccess;
872	__le32 CreateDisposition;
873	__le32 CreateOptions;
874	__le32 ImpersonationLevel;
875	__u8 SecurityFlags;
876	__le16 ByteCount;
877	char fileName[1];
878} __attribute__((packed)) OPEN_REQ;
879
880/* open response: oplock levels */
881#define OPLOCK_NONE  	 0
882#define OPLOCK_EXCLUSIVE 1
883#define OPLOCK_BATCH	 2
884#define OPLOCK_READ	 3  /* level 2 oplock */
885
886/* open response for CreateAction shifted left */
887#define CIFS_CREATE_ACTION 0x20000 /* file created */
888
889typedef struct smb_com_open_rsp {
890	struct smb_hdr hdr;	/* wct = 34 BB */
891	__u8 AndXCommand;
892	__u8 AndXReserved;
893	__le16 AndXOffset;
894	__u8 OplockLevel;
895	__u16 Fid;
896	__le32 CreateAction;
897	__le64 CreationTime;
898	__le64 LastAccessTime;
899	__le64 LastWriteTime;
900	__le64 ChangeTime;
901	__le32 FileAttributes;
902	__le64 AllocationSize;
903	__le64 EndOfFile;
904	__le16 FileType;
905	__le16 DeviceState;
906	__u8 DirectoryFlag;
907	__u16 ByteCount;	/* bct = 0 */
908} __attribute__((packed)) OPEN_RSP;
909
910typedef struct smb_com_open_rsp_ext {
911	struct smb_hdr hdr;     /* wct = 42 but meaningless due to MS bug? */
912	__u8 AndXCommand;
913	__u8 AndXReserved;
914	__le16 AndXOffset;
915	__u8 OplockLevel;
916	__u16 Fid;
917	__le32 CreateAction;
918	__le64 CreationTime;
919	__le64 LastAccessTime;
920	__le64 LastWriteTime;
921	__le64 ChangeTime;
922	__le32 FileAttributes;
923	__le64 AllocationSize;
924	__le64 EndOfFile;
925	__le16 FileType;
926	__le16 DeviceState;
927	__u8 DirectoryFlag;
928	__u8 VolumeGUID[16];
929	__u64 FileId; /* note no endian conversion - is opaque UniqueID */
930	__le32 MaximalAccessRights;
931	__le32 GuestMaximalAccessRights;
932	__u16 ByteCount;        /* bct = 0 */
933} __attribute__((packed)) OPEN_RSP_EXT;
934
935
936/* format of legacy open request */
937typedef struct smb_com_openx_req {
938	struct smb_hdr	hdr;	/* wct = 15 */
939	__u8 AndXCommand;
940	__u8 AndXReserved;
941	__le16 AndXOffset;
942	__le16 OpenFlags;
943	__le16 Mode;
944	__le16 Sattr; /* search attributes */
945	__le16 FileAttributes;  /* dos attrs */
946	__le32 CreateTime; /* os2 format */
947	__le16 OpenFunction;
948	__le32 EndOfFile;
949	__le32 Timeout;
950	__le32 Reserved;
951	__le16  ByteCount;  /* file name follows */
952	char   fileName[1];
953} __attribute__((packed)) OPENX_REQ;
954
955typedef struct smb_com_openx_rsp {
956	struct smb_hdr	hdr;	/* wct = 15 */
957	__u8 AndXCommand;
958	__u8 AndXReserved;
959	__le16 AndXOffset;
960	__u16  Fid;
961	__le16 FileAttributes;
962	__le32 LastWriteTime; /* os2 format */
963	__le32 EndOfFile;
964	__le16 Access;
965	__le16 FileType;
966	__le16 IPCState;
967	__le16 Action;
968	__u32  FileId;
969	__u16  Reserved;
970	__u16  ByteCount;
971} __attribute__((packed)) OPENX_RSP;
972
973/* For encoding of POSIX Open Request - see trans2 function 0x209 data struct */
974
975/* Legacy write request for older servers */
976typedef struct smb_com_writex_req {
977	struct smb_hdr hdr;     /* wct = 12 */
978	__u8 AndXCommand;
979	__u8 AndXReserved;
980	__le16 AndXOffset;
981	__u16 Fid;
982	__le32 OffsetLow;
983	__u32 Reserved; /* Timeout */
984	__le16 WriteMode; /* 1 = write through */
985	__le16 Remaining;
986	__le16 Reserved2;
987	__le16 DataLengthLow;
988	__le16 DataOffset;
989	__le16 ByteCount;
990	__u8 Pad;		/* BB check for whether padded to DWORD
991				   boundary and optimum performance here */
992	char Data[];
993} __attribute__((packed)) WRITEX_REQ;
994
995typedef struct smb_com_write_req {
996	struct smb_hdr hdr;	/* wct = 14 */
997	__u8 AndXCommand;
998	__u8 AndXReserved;
999	__le16 AndXOffset;
1000	__u16 Fid;
1001	__le32 OffsetLow;
1002	__u32 Reserved;
1003	__le16 WriteMode;
1004	__le16 Remaining;
1005	__le16 DataLengthHigh;
1006	__le16 DataLengthLow;
1007	__le16 DataOffset;
1008	__le32 OffsetHigh;
1009	__le16 ByteCount;
1010	__u8 Pad;		/* BB check for whether padded to DWORD
1011				   boundary and optimum performance here */
1012	char Data[];
1013} __attribute__((packed)) WRITE_REQ;
1014
1015typedef struct smb_com_write_rsp {
1016	struct smb_hdr hdr;	/* wct = 6 */
1017	__u8 AndXCommand;
1018	__u8 AndXReserved;
1019	__le16 AndXOffset;
1020	__le16 Count;
1021	__le16 Remaining;
1022	__le16 CountHigh;
1023	__u16  Reserved;
1024	__u16 ByteCount;
1025} __attribute__((packed)) WRITE_RSP;
1026
1027/* legacy read request for older servers */
1028typedef struct smb_com_readx_req {
1029	struct smb_hdr hdr;	/* wct = 10 */
1030	__u8 AndXCommand;
1031	__u8 AndXReserved;
1032	__le16 AndXOffset;
1033	__u16 Fid;
1034	__le32 OffsetLow;
1035	__le16 MaxCount;
1036	__le16 MinCount;	/* obsolete */
1037	__le32 Reserved;
1038	__le16 Remaining;
1039	__le16 ByteCount;
1040} __attribute__((packed)) READX_REQ;
1041
1042typedef struct smb_com_read_req {
1043	struct smb_hdr hdr;	/* wct = 12 */
1044	__u8 AndXCommand;
1045	__u8 AndXReserved;
1046	__le16 AndXOffset;
1047	__u16 Fid;
1048	__le32 OffsetLow;
1049	__le16 MaxCount;
1050	__le16 MinCount;		/* obsolete */
1051	__le32 MaxCountHigh;
1052	__le16 Remaining;
1053	__le32 OffsetHigh;
1054	__le16 ByteCount;
1055} __attribute__((packed)) READ_REQ;
1056
1057typedef struct smb_com_read_rsp {
1058	struct smb_hdr hdr;	/* wct = 12 */
1059	__u8 AndXCommand;
1060	__u8 AndXReserved;
1061	__le16 AndXOffset;
1062	__le16 Remaining;
1063	__le16 DataCompactionMode;
1064	__le16 Reserved;
1065	__le16 DataLength;
1066	__le16 DataOffset;
1067	__le16 DataLengthHigh;
1068	__u64 Reserved2;
1069	__u16 ByteCount;
1070	/* read response data immediately follows */
1071} __attribute__((packed)) READ_RSP;
1072
1073typedef struct locking_andx_range {
1074	__le16 Pid;
1075	__le16 Pad;
1076	__le32 OffsetHigh;
1077	__le32 OffsetLow;
1078	__le32 LengthHigh;
1079	__le32 LengthLow;
1080} __attribute__((packed)) LOCKING_ANDX_RANGE;
1081
1082#define LOCKING_ANDX_SHARED_LOCK     0x01
1083#define LOCKING_ANDX_OPLOCK_RELEASE  0x02
1084#define LOCKING_ANDX_CHANGE_LOCKTYPE 0x04
1085#define LOCKING_ANDX_CANCEL_LOCK     0x08
1086#define LOCKING_ANDX_LARGE_FILES     0x10	/* always on for us */
1087
1088typedef struct smb_com_lock_req {
1089	struct smb_hdr hdr;	/* wct = 8 */
1090	__u8 AndXCommand;
1091	__u8 AndXReserved;
1092	__le16 AndXOffset;
1093	__u16 Fid;
1094	__u8 LockType;
1095	__u8 OplockLevel;
1096	__le32 Timeout;
1097	__le16 NumberOfUnlocks;
1098	__le16 NumberOfLocks;
1099	__le16 ByteCount;
1100	LOCKING_ANDX_RANGE Locks[1];
1101} __attribute__((packed)) LOCK_REQ;
1102
1103/* lock type */
1104#define CIFS_RDLCK	0
1105#define CIFS_WRLCK	1
1106#define CIFS_UNLCK      2
1107typedef struct cifs_posix_lock {
1108	__le16  lock_type;  /* 0 = Read, 1 = Write, 2 = Unlock */
1109	__le16  lock_flags; /* 1 = Wait (only valid for setlock) */
1110	__le32  pid;
1111	__le64	start;
1112	__le64	length;
1113	/* BB what about additional owner info to identify network client */
1114} __attribute__((packed)) CIFS_POSIX_LOCK;
1115
1116typedef struct smb_com_lock_rsp {
1117	struct smb_hdr hdr;	/* wct = 2 */
1118	__u8 AndXCommand;
1119	__u8 AndXReserved;
1120	__le16 AndXOffset;
1121	__u16 ByteCount;
1122} __attribute__((packed)) LOCK_RSP;
1123
1124typedef struct smb_com_rename_req {
1125	struct smb_hdr hdr;	/* wct = 1 */
1126	__le16 SearchAttributes;	/* target file attributes */
1127	__le16 ByteCount;
1128	__u8 BufferFormat;	/* 4 = ASCII or Unicode */
1129	unsigned char OldFileName[1];
1130	/* followed by __u8 BufferFormat2 */
1131	/* followed by NewFileName */
1132} __attribute__((packed)) RENAME_REQ;
1133
1134	/* copy request flags */
1135#define COPY_MUST_BE_FILE      0x0001
1136#define COPY_MUST_BE_DIR       0x0002
1137#define COPY_TARGET_MODE_ASCII 0x0004 /* if not set, binary */
1138#define COPY_SOURCE_MODE_ASCII 0x0008 /* if not set, binary */
1139#define COPY_VERIFY_WRITES     0x0010
1140#define COPY_TREE              0x0020
1141
1142typedef struct smb_com_copy_req {
1143	struct smb_hdr hdr;	/* wct = 3 */
1144	__u16 Tid2;
1145	__le16 OpenFunction;
1146	__le16 Flags;
1147	__le16 ByteCount;
1148	__u8 BufferFormat;	/* 4 = ASCII or Unicode */
1149	unsigned char OldFileName[1];
1150	/* followed by __u8 BufferFormat2 */
1151	/* followed by NewFileName string */
1152} __attribute__((packed)) COPY_REQ;
1153
1154typedef struct smb_com_copy_rsp {
1155	struct smb_hdr hdr;     /* wct = 1 */
1156	__le16 CopyCount;    /* number of files copied */
1157	__u16 ByteCount;    /* may be zero */
1158	__u8 BufferFormat;  /* 0x04 - only present if errored file follows */
1159	unsigned char ErrorFileName[1]; /* only present if error in copy */
1160} __attribute__((packed)) COPY_RSP;
1161
1162#define CREATE_HARD_LINK		0x103
1163#define MOVEFILE_COPY_ALLOWED		0x0002
1164#define MOVEFILE_REPLACE_EXISTING	0x0001
1165
1166typedef struct smb_com_nt_rename_req {	/* A5 - also used for create hardlink */
1167	struct smb_hdr hdr;	/* wct = 4 */
1168	__le16 SearchAttributes;	/* target file attributes */
1169	__le16 Flags;		/* spec says Information Level */
1170	__le32 ClusterCount;
1171	__le16 ByteCount;
1172	__u8 BufferFormat;	/* 4 = ASCII or Unicode */
1173	unsigned char OldFileName[1];
1174	/* followed by __u8 BufferFormat2 */
1175	/* followed by NewFileName */
1176} __attribute__((packed)) NT_RENAME_REQ;
1177
1178typedef struct smb_com_rename_rsp {
1179	struct smb_hdr hdr;	/* wct = 0 */
1180	__u16 ByteCount;	/* bct = 0 */
1181} __attribute__((packed)) RENAME_RSP;
1182
1183typedef struct smb_com_delete_file_req {
1184	struct smb_hdr hdr;	/* wct = 1 */
1185	__le16 SearchAttributes;
1186	__le16 ByteCount;
1187	__u8 BufferFormat;	/* 4 = ASCII */
1188	unsigned char fileName[1];
1189} __attribute__((packed)) DELETE_FILE_REQ;
1190
1191typedef struct smb_com_delete_file_rsp {
1192	struct smb_hdr hdr;	/* wct = 0 */
1193	__u16 ByteCount;	/* bct = 0 */
1194} __attribute__((packed)) DELETE_FILE_RSP;
1195
1196typedef struct smb_com_delete_directory_req {
1197	struct smb_hdr hdr;	/* wct = 0 */
1198	__le16 ByteCount;
1199	__u8 BufferFormat;	/* 4 = ASCII */
1200	unsigned char DirName[1];
1201} __attribute__((packed)) DELETE_DIRECTORY_REQ;
1202
1203typedef struct smb_com_delete_directory_rsp {
1204	struct smb_hdr hdr;	/* wct = 0 */
1205	__u16 ByteCount;	/* bct = 0 */
1206} __attribute__((packed)) DELETE_DIRECTORY_RSP;
1207
1208typedef struct smb_com_create_directory_req {
1209	struct smb_hdr hdr;	/* wct = 0 */
1210	__le16 ByteCount;
1211	__u8 BufferFormat;	/* 4 = ASCII */
1212	unsigned char DirName[1];
1213} __attribute__((packed)) CREATE_DIRECTORY_REQ;
1214
1215typedef struct smb_com_create_directory_rsp {
1216	struct smb_hdr hdr;	/* wct = 0 */
1217	__u16 ByteCount;	/* bct = 0 */
1218} __attribute__((packed)) CREATE_DIRECTORY_RSP;
1219
1220typedef struct smb_com_query_information_req {
1221	struct smb_hdr hdr;     /* wct = 0 */
1222	__le16 ByteCount;	/* 1 + namelen + 1 */
1223	__u8 BufferFormat;      /* 4 = ASCII */
1224	unsigned char FileName[1];
1225} __attribute__((packed)) QUERY_INFORMATION_REQ;
1226
1227typedef struct smb_com_query_information_rsp {
1228	struct smb_hdr hdr;     /* wct = 10 */
1229	__le16 attr;
1230	__le32  last_write_time;
1231	__le32 size;
1232	__u16  reserved[5];
1233	__le16 ByteCount;	/* bcc = 0 */
1234} __attribute__((packed)) QUERY_INFORMATION_RSP;
1235
1236typedef struct smb_com_setattr_req {
1237	struct smb_hdr hdr; /* wct = 8 */
1238	__le16 attr;
1239	__le16 time_low;
1240	__le16 time_high;
1241	__le16 reserved[5]; /* must be zero */
1242	__u16  ByteCount;
1243	__u8   BufferFormat; /* 4 = ASCII */
1244	unsigned char fileName[1];
1245} __attribute__((packed)) SETATTR_REQ;
1246
1247typedef struct smb_com_setattr_rsp {
1248	struct smb_hdr hdr;     /* wct = 0 */
1249	__u16 ByteCount;        /* bct = 0 */
1250} __attribute__((packed)) SETATTR_RSP;
1251
1252/* empty wct response to setattr */
1253
1254/*******************************************************/
1255/* NT Transact structure definitions follow            */
1256/* Currently only ioctl, acl (get security descriptor) */
1257/* and notify are implemented                          */
1258/*******************************************************/
1259typedef struct smb_com_ntransact_req {
1260	struct smb_hdr hdr; /* wct >= 19 */
1261	__u8 MaxSetupCount;
1262	__u16 Reserved;
1263	__le32 TotalParameterCount;
1264	__le32 TotalDataCount;
1265	__le32 MaxParameterCount;
1266	__le32 MaxDataCount;
1267	__le32 ParameterCount;
1268	__le32 ParameterOffset;
1269	__le32 DataCount;
1270	__le32 DataOffset;
1271	__u8 SetupCount; /* four setup words follow subcommand */
1272	/* SNIA spec incorrectly included spurious pad here */
1273	__le16 SubCommand; /* 2 = IOCTL/FSCTL */
1274	/* SetupCount words follow then */
1275	__le16 ByteCount;
1276	__u8 Pad[3];
1277	__u8 Parms[];
1278} __attribute__((packed)) NTRANSACT_REQ;
1279
1280typedef struct smb_com_ntransact_rsp {
1281	struct smb_hdr hdr;     /* wct = 18 */
1282	__u8 Reserved[3];
1283	__le32 TotalParameterCount;
1284	__le32 TotalDataCount;
1285	__le32 ParameterCount;
1286	__le32 ParameterOffset;
1287	__le32 ParameterDisplacement;
1288	__le32 DataCount;
1289	__le32 DataOffset;
1290	__le32 DataDisplacement;
1291	__u8 SetupCount;   /* 0 */
1292	__u16 ByteCount;
1293	/* __u8 Pad[3]; */
1294	/* parms and data follow */
1295} __attribute__((packed)) NTRANSACT_RSP;
1296
1297/* See MS-SMB 2.2.7.2.1.1 */
1298struct srv_copychunk {
1299	__le64 SourceOffset;
1300	__le64 DestinationOffset;
1301	__le32 CopyLength;
1302	__u32  Reserved;
1303} __packed;
1304
1305typedef struct smb_com_transaction_ioctl_req {
1306	struct smb_hdr hdr;	/* wct = 23 */
1307	__u8 MaxSetupCount;
1308	__u16 Reserved;
1309	__le32 TotalParameterCount;
1310	__le32 TotalDataCount;
1311	__le32 MaxParameterCount;
1312	__le32 MaxDataCount;
1313	__le32 ParameterCount;
1314	__le32 ParameterOffset;
1315	__le32 DataCount;
1316	__le32 DataOffset;
1317	__u8 SetupCount; /* four setup words follow subcommand */
1318	/* SNIA spec incorrectly included spurious pad here */
1319	__le16 SubCommand; /* 2 = IOCTL/FSCTL */
1320	__le32 FunctionCode;
1321	__u16 Fid;
1322	__u8 IsFsctl;  /* 1 = File System Control 0 = device control (IOCTL) */
1323	__u8 IsRootFlag; /* 1 = apply command to root of share (must be DFS) */
1324	__le16 ByteCount;
1325	__u8 Pad[3];
1326	__u8 Data[1];
1327} __attribute__((packed)) TRANSACT_IOCTL_REQ;
1328
1329typedef struct smb_com_transaction_compr_ioctl_req {
1330	struct smb_hdr hdr;	/* wct = 23 */
1331	__u8 MaxSetupCount;
1332	__u16 Reserved;
1333	__le32 TotalParameterCount;
1334	__le32 TotalDataCount;
1335	__le32 MaxParameterCount;
1336	__le32 MaxDataCount;
1337	__le32 ParameterCount;
1338	__le32 ParameterOffset;
1339	__le32 DataCount;
1340	__le32 DataOffset;
1341	__u8 SetupCount; /* four setup words follow subcommand */
1342	/* SNIA spec incorrectly included spurious pad here */
1343	__le16 SubCommand; /* 2 = IOCTL/FSCTL */
1344	__le32 FunctionCode;
1345	__u16 Fid;
1346	__u8 IsFsctl;  /* 1 = File System Control 0 = device control (IOCTL) */
1347	__u8 IsRootFlag; /* 1 = apply command to root of share (must be DFS) */
1348	__le16 ByteCount;
1349	__u8 Pad[3];
1350	__le16 compression_state;  /* See below for valid flags */
1351} __attribute__((packed)) TRANSACT_COMPR_IOCTL_REQ;
1352
1353/* compression state flags */
1354#define COMPRESSION_FORMAT_NONE		0x0000
1355#define COMPRESSION_FORMAT_DEFAULT	0x0001
1356#define COMPRESSION_FORMAT_LZNT1	0x0002
1357
1358typedef struct smb_com_transaction_ioctl_rsp {
1359	struct smb_hdr hdr;	/* wct = 19 */
1360	__u8 Reserved[3];
1361	__le32 TotalParameterCount;
1362	__le32 TotalDataCount;
1363	__le32 ParameterCount;
1364	__le32 ParameterOffset;
1365	__le32 ParameterDisplacement;
1366	__le32 DataCount;
1367	__le32 DataOffset;
1368	__le32 DataDisplacement;
1369	__u8 SetupCount;	/* 1 */
1370	__le16 ReturnedDataLen;
1371	__u16 ByteCount;
1372} __attribute__((packed)) TRANSACT_IOCTL_RSP;
1373
1374#define CIFS_ACL_OWNER 1
1375#define CIFS_ACL_GROUP 2
1376#define CIFS_ACL_DACL  4
1377#define CIFS_ACL_SACL  8
1378
1379typedef struct smb_com_transaction_qsec_req {
1380	struct smb_hdr hdr;     /* wct = 19 */
1381	__u8 MaxSetupCount;
1382	__u16 Reserved;
1383	__le32 TotalParameterCount;
1384	__le32 TotalDataCount;
1385	__le32 MaxParameterCount;
1386	__le32 MaxDataCount;
1387	__le32 ParameterCount;
1388	__le32 ParameterOffset;
1389	__le32 DataCount;
1390	__le32 DataOffset;
1391	__u8 SetupCount; /* no setup words follow subcommand */
1392	/* SNIA spec incorrectly included spurious pad here */
1393	__le16 SubCommand; /* 6 = QUERY_SECURITY_DESC */
1394	__le16 ByteCount; /* bcc = 3 + 8 */
1395	__u8 Pad[3];
1396	__u16 Fid;
1397	__u16 Reserved2;
1398	__le32 AclFlags;
1399} __attribute__((packed)) QUERY_SEC_DESC_REQ;
1400
1401
1402typedef struct smb_com_transaction_ssec_req {
1403	struct smb_hdr hdr;     /* wct = 19 */
1404	__u8 MaxSetupCount;
1405	__u16 Reserved;
1406	__le32 TotalParameterCount;
1407	__le32 TotalDataCount;
1408	__le32 MaxParameterCount;
1409	__le32 MaxDataCount;
1410	__le32 ParameterCount;
1411	__le32 ParameterOffset;
1412	__le32 DataCount;
1413	__le32 DataOffset;
1414	__u8 SetupCount; /* no setup words follow subcommand */
1415	/* SNIA spec incorrectly included spurious pad here */
1416	__le16 SubCommand; /* 3 = SET_SECURITY_DESC */
1417	__le16 ByteCount; /* bcc = 3 + 8 */
1418	__u8 Pad[3];
1419	__u16 Fid;
1420	__u16 Reserved2;
1421	__le32 AclFlags;
1422} __attribute__((packed)) SET_SEC_DESC_REQ;
1423
1424typedef struct smb_com_transaction_change_notify_req {
1425	struct smb_hdr hdr;     /* wct = 23 */
1426	__u8 MaxSetupCount;
1427	__u16 Reserved;
1428	__le32 TotalParameterCount;
1429	__le32 TotalDataCount;
1430	__le32 MaxParameterCount;
1431	__le32 MaxDataCount;
1432	__le32 ParameterCount;
1433	__le32 ParameterOffset;
1434	__le32 DataCount;
1435	__le32 DataOffset;
1436	__u8 SetupCount; /* four setup words follow subcommand */
1437	/* SNIA spec incorrectly included spurious pad here */
1438	__le16 SubCommand;/* 4 = Change Notify */
1439	__le32 CompletionFilter;  /* operation to monitor */
1440	__u16 Fid;
1441	__u8 WatchTree;  /* 1 = Monitor subdirectories */
1442	__u8 Reserved2;
1443	__le16 ByteCount;
1444/* 	__u8 Pad[3];*/
1445/*	__u8 Data[1];*/
1446} __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ;
1447
1448/* BB eventually change to use generic ntransact rsp struct
1449      and validation routine */
1450typedef struct smb_com_transaction_change_notify_rsp {
1451	struct smb_hdr hdr;	/* wct = 18 */
1452	__u8 Reserved[3];
1453	__le32 TotalParameterCount;
1454	__le32 TotalDataCount;
1455	__le32 ParameterCount;
1456	__le32 ParameterOffset;
1457	__le32 ParameterDisplacement;
1458	__le32 DataCount;
1459	__le32 DataOffset;
1460	__le32 DataDisplacement;
1461	__u8 SetupCount;   /* 0 */
1462	__u16 ByteCount;
1463	/* __u8 Pad[3]; */
1464} __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_RSP;
1465/* Completion Filter flags for Notify */
1466#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
1467#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
1468#define FILE_NOTIFY_CHANGE_NAME         0x00000003
1469#define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
1470#define FILE_NOTIFY_CHANGE_SIZE         0x00000008
1471#define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
1472#define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
1473#define FILE_NOTIFY_CHANGE_CREATION     0x00000040
1474#define FILE_NOTIFY_CHANGE_EA           0x00000080
1475#define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
1476#define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
1477#define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
1478#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
1479
1480#define FILE_ACTION_ADDED		0x00000001
1481#define FILE_ACTION_REMOVED		0x00000002
1482#define FILE_ACTION_MODIFIED		0x00000003
1483#define FILE_ACTION_RENAMED_OLD_NAME	0x00000004
1484#define FILE_ACTION_RENAMED_NEW_NAME	0x00000005
1485#define FILE_ACTION_ADDED_STREAM	0x00000006
1486#define FILE_ACTION_REMOVED_STREAM	0x00000007
1487#define FILE_ACTION_MODIFIED_STREAM	0x00000008
1488
1489/* response contains array of the following structures */
1490struct file_notify_information {
1491	__le32 NextEntryOffset;
1492	__le32 Action;
1493	__le32 FileNameLength;
1494	__u8  FileName[];
1495} __attribute__((packed));
1496
1497/* For IO_REPARSE_TAG_SYMLINK */
1498struct reparse_symlink_data {
1499	__le32	ReparseTag;
1500	__le16	ReparseDataLength;
1501	__u16	Reserved;
1502	__le16	SubstituteNameOffset;
1503	__le16	SubstituteNameLength;
1504	__le16	PrintNameOffset;
1505	__le16	PrintNameLength;
1506	__le32	Flags;
1507	char	PathBuffer[];
1508} __attribute__((packed));
1509
1510/* Flag above */
1511#define SYMLINK_FLAG_RELATIVE 0x00000001
1512
1513/* For IO_REPARSE_TAG_NFS */
1514#define NFS_SPECFILE_LNK	0x00000000014B4E4C
1515#define NFS_SPECFILE_CHR	0x0000000000524843
1516#define NFS_SPECFILE_BLK	0x00000000004B4C42
1517#define NFS_SPECFILE_FIFO	0x000000004F464946
1518#define NFS_SPECFILE_SOCK	0x000000004B434F53
1519struct reparse_posix_data {
1520	__le32	ReparseTag;
1521	__le16	ReparseDataLength;
1522	__u16	Reserved;
1523	__le64	InodeType; /* LNK, FIFO, CHR etc. */
1524	char	PathBuffer[];
1525} __attribute__((packed));
1526
1527struct cifs_quota_data {
1528	__u32	rsrvd1;  /* 0 */
1529	__u32	sid_size;
1530	__u64	rsrvd2;  /* 0 */
1531	__u64	space_used;
1532	__u64	soft_limit;
1533	__u64	hard_limit;
1534	char	sid[1];  /* variable size? */
1535} __attribute__((packed));
1536
1537/* quota sub commands */
1538#define QUOTA_LIST_CONTINUE	    0
1539#define QUOTA_LIST_START	0x100
1540#define QUOTA_FOR_SID		0x101
1541
1542struct trans2_req {
1543	/* struct smb_hdr hdr precedes. Set wct = 14+ */
1544	__le16 TotalParameterCount;
1545	__le16 TotalDataCount;
1546	__le16 MaxParameterCount;
1547	__le16 MaxDataCount;
1548	__u8 MaxSetupCount;
1549	__u8 Reserved;
1550	__le16 Flags;
1551	__le32 Timeout;
1552	__u16 Reserved2;
1553	__le16 ParameterCount;
1554	__le16 ParameterOffset;
1555	__le16 DataCount;
1556	__le16 DataOffset;
1557	__u8 SetupCount;
1558	__u8 Reserved3;
1559	__le16 SubCommand; /* 1st setup word - SetupCount words follow */
1560	__le16 ByteCount;
1561} __attribute__((packed));
1562
1563struct smb_t2_req {
1564	struct smb_hdr hdr;
1565	struct trans2_req t2_req;
1566} __attribute__((packed));
1567
1568struct trans2_resp {
1569	/* struct smb_hdr hdr precedes. Note wct = 10 + setup count */
1570	__le16 TotalParameterCount;
1571	__le16 TotalDataCount;
1572	__u16 Reserved;
1573	__le16 ParameterCount;
1574	__le16 ParameterOffset;
1575	__le16 ParameterDisplacement;
1576	__le16 DataCount;
1577	__le16 DataOffset;
1578	__le16 DataDisplacement;
1579	__u8 SetupCount;
1580	__u8 Reserved1;
1581	/* SetupWords[SetupCount];
1582	__u16 ByteCount;
1583	__u16 Reserved2;*/
1584	/* data area follows */
1585} __attribute__((packed));
1586
1587struct smb_t2_rsp {
1588	struct smb_hdr hdr;
1589	struct trans2_resp t2_rsp;
1590} __attribute__((packed));
1591
1592/* PathInfo/FileInfo infolevels */
1593#define SMB_INFO_STANDARD                   1
1594#define SMB_SET_FILE_EA                     2
1595#define SMB_QUERY_FILE_EA_SIZE              2
1596#define SMB_INFO_QUERY_EAS_FROM_LIST        3
1597#define SMB_INFO_QUERY_ALL_EAS              4
1598#define SMB_INFO_IS_NAME_VALID              6
1599#define SMB_QUERY_FILE_BASIC_INFO       0x101
1600#define SMB_QUERY_FILE_STANDARD_INFO    0x102
1601#define SMB_QUERY_FILE_EA_INFO          0x103
1602#define SMB_QUERY_FILE_NAME_INFO        0x104
1603#define SMB_QUERY_FILE_ALLOCATION_INFO  0x105
1604#define SMB_QUERY_FILE_END_OF_FILEINFO  0x106
1605#define SMB_QUERY_FILE_ALL_INFO         0x107
1606#define SMB_QUERY_ALT_NAME_INFO         0x108
1607#define SMB_QUERY_FILE_STREAM_INFO      0x109
1608#define SMB_QUERY_FILE_COMPRESSION_INFO 0x10B
1609#define SMB_QUERY_FILE_UNIX_BASIC       0x200
1610#define SMB_QUERY_FILE_UNIX_LINK        0x201
1611#define SMB_QUERY_POSIX_ACL             0x204
1612#define SMB_QUERY_XATTR                 0x205  /* e.g. system EA name space */
1613#define SMB_QUERY_ATTR_FLAGS            0x206  /* append,immutable etc. */
1614#define SMB_QUERY_POSIX_PERMISSION      0x207
1615#define SMB_QUERY_POSIX_LOCK            0x208
1616/* #define SMB_POSIX_OPEN               0x209 */
1617/* #define SMB_POSIX_UNLINK             0x20a */
1618#define SMB_QUERY_FILE__UNIX_INFO2      0x20b
1619#define SMB_QUERY_FILE_INTERNAL_INFO    0x3ee
1620#define SMB_QUERY_FILE_ACCESS_INFO      0x3f0
1621#define SMB_QUERY_FILE_NAME_INFO2       0x3f1 /* 0x30 bytes */
1622#define SMB_QUERY_FILE_POSITION_INFO    0x3f6
1623#define SMB_QUERY_FILE_MODE_INFO        0x3f8
1624#define SMB_QUERY_FILE_ALGN_INFO        0x3f9
1625
1626
1627#define SMB_SET_FILE_BASIC_INFO	        0x101
1628#define SMB_SET_FILE_DISPOSITION_INFO   0x102
1629#define SMB_SET_FILE_ALLOCATION_INFO    0x103
1630#define SMB_SET_FILE_END_OF_FILE_INFO   0x104
1631#define SMB_SET_FILE_UNIX_BASIC         0x200
1632#define SMB_SET_FILE_UNIX_LINK          0x201
1633#define SMB_SET_FILE_UNIX_HLINK         0x203
1634#define SMB_SET_POSIX_ACL               0x204
1635#define SMB_SET_XATTR                   0x205
1636#define SMB_SET_ATTR_FLAGS              0x206  /* append, immutable etc. */
1637#define SMB_SET_POSIX_LOCK              0x208
1638#define SMB_POSIX_OPEN                  0x209
1639#define SMB_POSIX_UNLINK                0x20a
1640#define SMB_SET_FILE_UNIX_INFO2         0x20b
1641#define SMB_SET_FILE_BASIC_INFO2        0x3ec
1642#define SMB_SET_FILE_RENAME_INFORMATION 0x3f2 /* BB check if qpathinfo too */
1643#define SMB_FILE_ALL_INFO2              0x3fa
1644#define SMB_SET_FILE_ALLOCATION_INFO2   0x3fb
1645#define SMB_SET_FILE_END_OF_FILE_INFO2  0x3fc
1646#define SMB_FILE_MOVE_CLUSTER_INFO      0x407
1647#define SMB_FILE_QUOTA_INFO             0x408
1648#define SMB_FILE_REPARSEPOINT_INFO      0x409
1649#define SMB_FILE_MAXIMUM_INFO           0x40d
1650
1651/* Find File infolevels */
1652#define SMB_FIND_FILE_INFO_STANDARD       0x001
1653#define SMB_FIND_FILE_QUERY_EA_SIZE       0x002
1654#define SMB_FIND_FILE_QUERY_EAS_FROM_LIST 0x003
1655#define SMB_FIND_FILE_DIRECTORY_INFO      0x101
1656#define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
1657#define SMB_FIND_FILE_NAMES_INFO          0x103
1658#define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104
1659#define SMB_FIND_FILE_ID_FULL_DIR_INFO    0x105
1660#define SMB_FIND_FILE_ID_BOTH_DIR_INFO    0x106
1661#define SMB_FIND_FILE_UNIX                0x202
1662#define SMB_FIND_FILE_POSIX_INFO          0x064
1663
1664typedef struct smb_com_transaction2_qpi_req {
1665	struct smb_hdr hdr;	/* wct = 14+ */
1666	__le16 TotalParameterCount;
1667	__le16 TotalDataCount;
1668	__le16 MaxParameterCount;
1669	__le16 MaxDataCount;
1670	__u8 MaxSetupCount;
1671	__u8 Reserved;
1672	__le16 Flags;
1673	__le32 Timeout;
1674	__u16 Reserved2;
1675	__le16 ParameterCount;
1676	__le16 ParameterOffset;
1677	__le16 DataCount;
1678	__le16 DataOffset;
1679	__u8 SetupCount;
1680	__u8 Reserved3;
1681	__le16 SubCommand;	/* one setup word */
1682	__le16 ByteCount;
1683	__u8 Pad;
1684	__le16 InformationLevel;
1685	__u32 Reserved4;
1686	char FileName[1];
1687} __attribute__((packed)) TRANSACTION2_QPI_REQ;
1688
1689typedef struct smb_com_transaction2_qpi_rsp {
1690	struct smb_hdr hdr;	/* wct = 10 + SetupCount */
1691	struct trans2_resp t2;
1692	__u16 ByteCount;
1693	__u16 Reserved2; /* parameter word is present for infolevels > 100 */
1694} __attribute__((packed)) TRANSACTION2_QPI_RSP;
1695
1696typedef struct smb_com_transaction2_spi_req {
1697	struct smb_hdr hdr;	/* wct = 15 */
1698	__le16 TotalParameterCount;
1699	__le16 TotalDataCount;
1700	__le16 MaxParameterCount;
1701	__le16 MaxDataCount;
1702	__u8 MaxSetupCount;
1703	__u8 Reserved;
1704	__le16 Flags;
1705	__le32 Timeout;
1706	__u16 Reserved2;
1707	__le16 ParameterCount;
1708	__le16 ParameterOffset;
1709	__le16 DataCount;
1710	__le16 DataOffset;
1711	__u8 SetupCount;
1712	__u8 Reserved3;
1713	__le16 SubCommand;	/* one setup word */
1714	__le16 ByteCount;
1715	__u8 Pad;
1716	__u16 Pad1;
1717	__le16 InformationLevel;
1718	__u32 Reserved4;
1719	char FileName[1];
1720} __attribute__((packed)) TRANSACTION2_SPI_REQ;
1721
1722typedef struct smb_com_transaction2_spi_rsp {
1723	struct smb_hdr hdr;	/* wct = 10 + SetupCount */
1724	struct trans2_resp t2;
1725	__u16 ByteCount;
1726	__u16 Reserved2; /* parameter word is present for infolevels > 100 */
1727} __attribute__((packed)) TRANSACTION2_SPI_RSP;
1728
1729struct set_file_rename {
1730	__le32 overwrite;   /* 1 = overwrite dest */
1731	__u32 root_fid;   /* zero */
1732	__le32 target_name_len;
1733	char  target_name[];  /* Must be unicode */
1734} __attribute__((packed));
1735
1736struct smb_com_transaction2_sfi_req {
1737	struct smb_hdr hdr;	/* wct = 15 */
1738	__le16 TotalParameterCount;
1739	__le16 TotalDataCount;
1740	__le16 MaxParameterCount;
1741	__le16 MaxDataCount;
1742	__u8 MaxSetupCount;
1743	__u8 Reserved;
1744	__le16 Flags;
1745	__le32 Timeout;
1746	__u16 Reserved2;
1747	__le16 ParameterCount;
1748	__le16 ParameterOffset;
1749	__le16 DataCount;
1750	__le16 DataOffset;
1751	__u8 SetupCount;
1752	__u8 Reserved3;
1753	__le16 SubCommand;	/* one setup word */
1754	__le16 ByteCount;
1755	__u8 Pad;
1756	__u16 Pad1;
1757	__u16 Fid;
1758	__le16 InformationLevel;
1759	__u16 Reserved4;
1760	__u8  payload[];
1761} __attribute__((packed));
1762
1763struct smb_com_transaction2_sfi_rsp {
1764	struct smb_hdr hdr;	/* wct = 10 + SetupCount */
1765	struct trans2_resp t2;
1766	__u16 ByteCount;
1767	__u16 Reserved2;	/* parameter word reserved -
1768					present for infolevels > 100 */
1769} __attribute__((packed));
1770
1771struct smb_t2_qfi_req {
1772	struct	smb_hdr hdr;
1773	struct	trans2_req t2;
1774	__u8	Pad;
1775	__u16	Fid;
1776	__le16	InformationLevel;
1777} __attribute__((packed));
1778
1779struct smb_t2_qfi_rsp {
1780	struct smb_hdr hdr;     /* wct = 10 + SetupCount */
1781	struct trans2_resp t2;
1782	__u16 ByteCount;
1783	__u16 Reserved2;        /* parameter word reserved -
1784				   present for infolevels > 100 */
1785} __attribute__((packed));
1786
1787/*
1788 * Flags on T2 FINDFIRST and FINDNEXT
1789 */
1790#define CIFS_SEARCH_CLOSE_ALWAYS  0x0001
1791#define CIFS_SEARCH_CLOSE_AT_END  0x0002
1792#define CIFS_SEARCH_RETURN_RESUME 0x0004
1793#define CIFS_SEARCH_CONTINUE_FROM_LAST 0x0008
1794#define CIFS_SEARCH_BACKUP_SEARCH 0x0010
1795
1796/*
1797 * Size of the resume key on FINDFIRST and FINDNEXT calls
1798 */
1799#define CIFS_SMB_RESUME_KEY_SIZE 4
1800
1801typedef struct smb_com_transaction2_ffirst_req {
1802	struct smb_hdr hdr;	/* wct = 15 */
1803	__le16 TotalParameterCount;
1804	__le16 TotalDataCount;
1805	__le16 MaxParameterCount;
1806	__le16 MaxDataCount;
1807	__u8 MaxSetupCount;
1808	__u8 Reserved;
1809	__le16 Flags;
1810	__le32 Timeout;
1811	__u16 Reserved2;
1812	__le16 ParameterCount;
1813	__le16 ParameterOffset;
1814	__le16 DataCount;
1815	__le16 DataOffset;
1816	__u8 SetupCount;	/* one */
1817	__u8 Reserved3;
1818	__le16 SubCommand;	/* TRANS2_FIND_FIRST */
1819	__le16 ByteCount;
1820	__u8 Pad;
1821	__le16 SearchAttributes;
1822	__le16 SearchCount;
1823	__le16 SearchFlags;
1824	__le16 InformationLevel;
1825	__le32 SearchStorageType;
1826	char FileName[1];
1827} __attribute__((packed)) TRANSACTION2_FFIRST_REQ;
1828
1829typedef struct smb_com_transaction2_ffirst_rsp {
1830	struct smb_hdr hdr;	/* wct = 10 */
1831	struct trans2_resp t2;
1832	__u16 ByteCount;
1833} __attribute__((packed)) TRANSACTION2_FFIRST_RSP;
1834
1835typedef struct smb_com_transaction2_ffirst_rsp_parms {
1836	__u16 SearchHandle;
1837	__le16 SearchCount;
1838	__le16 EndofSearch;
1839	__le16 EAErrorOffset;
1840	__le16 LastNameOffset;
1841} __attribute__((packed)) T2_FFIRST_RSP_PARMS;
1842
1843typedef struct smb_com_transaction2_fnext_req {
1844	struct smb_hdr hdr;	/* wct = 15 */
1845	__le16 TotalParameterCount;
1846	__le16 TotalDataCount;
1847	__le16 MaxParameterCount;
1848	__le16 MaxDataCount;
1849	__u8 MaxSetupCount;
1850	__u8 Reserved;
1851	__le16 Flags;
1852	__le32 Timeout;
1853	__u16 Reserved2;
1854	__le16 ParameterCount;
1855	__le16 ParameterOffset;
1856	__le16 DataCount;
1857	__le16 DataOffset;
1858	__u8 SetupCount;	/* one */
1859	__u8 Reserved3;
1860	__le16 SubCommand;	/* TRANS2_FIND_NEXT */
1861	__le16 ByteCount;
1862	__u8 Pad;
1863	__u16 SearchHandle;
1864	__le16 SearchCount;
1865	__le16 InformationLevel;
1866	__u32 ResumeKey;
1867	__le16 SearchFlags;
1868	char ResumeFileName[];
1869} __attribute__((packed)) TRANSACTION2_FNEXT_REQ;
1870
1871typedef struct smb_com_transaction2_fnext_rsp {
1872	struct smb_hdr hdr;	/* wct = 10 */
1873	struct trans2_resp t2;
1874	__u16 ByteCount;
1875} __attribute__((packed)) TRANSACTION2_FNEXT_RSP;
1876
1877typedef struct smb_com_transaction2_fnext_rsp_parms {
1878	__le16 SearchCount;
1879	__le16 EndofSearch;
1880	__le16 EAErrorOffset;
1881	__le16 LastNameOffset;
1882} __attribute__((packed)) T2_FNEXT_RSP_PARMS;
1883
1884/* QFSInfo Levels */
1885#define SMB_INFO_ALLOCATION         1
1886#define SMB_INFO_VOLUME             2
1887#define SMB_QUERY_FS_VOLUME_INFO    0x102
1888#define SMB_QUERY_FS_SIZE_INFO      0x103
1889#define SMB_QUERY_FS_DEVICE_INFO    0x104
1890#define SMB_QUERY_FS_ATTRIBUTE_INFO 0x105
1891#define SMB_QUERY_CIFS_UNIX_INFO    0x200
1892#define SMB_QUERY_POSIX_FS_INFO     0x201
1893#define SMB_QUERY_POSIX_WHO_AM_I    0x202
1894#define SMB_REQUEST_TRANSPORT_ENCRYPTION 0x203
1895#define SMB_QUERY_FS_PROXY          0x204 /* WAFS enabled. Returns structure
1896					    FILE_SYSTEM__UNIX_INFO to tell
1897					    whether new NTIOCTL available
1898					    (0xACE) for WAN friendly SMB
1899					    operations to be carried */
1900#define SMB_QUERY_LABEL_INFO        0x3ea
1901#define SMB_QUERY_FS_QUOTA_INFO     0x3ee
1902#define SMB_QUERY_FS_FULL_SIZE_INFO 0x3ef
1903#define SMB_QUERY_OBJECTID_INFO     0x3f0
1904
1905typedef struct smb_com_transaction2_qfsi_req {
1906	struct smb_hdr hdr;	/* wct = 14+ */
1907	__le16 TotalParameterCount;
1908	__le16 TotalDataCount;
1909	__le16 MaxParameterCount;
1910	__le16 MaxDataCount;
1911	__u8 MaxSetupCount;
1912	__u8 Reserved;
1913	__le16 Flags;
1914	__le32 Timeout;
1915	__u16 Reserved2;
1916	__le16 ParameterCount;
1917	__le16 ParameterOffset;
1918	__le16 DataCount;
1919	__le16 DataOffset;
1920	__u8 SetupCount;
1921	__u8 Reserved3;
1922	__le16 SubCommand;	/* one setup word */
1923	__le16 ByteCount;
1924	__u8 Pad;
1925	__le16 InformationLevel;
1926} __attribute__((packed)) TRANSACTION2_QFSI_REQ;
1927
1928typedef struct smb_com_transaction_qfsi_rsp {
1929	struct smb_hdr hdr;	/* wct = 10 + SetupCount */
1930	struct trans2_resp t2;
1931	__u16 ByteCount;
1932	__u8 Pad;	/* may be three bytes? *//* followed by data area */
1933} __attribute__((packed)) TRANSACTION2_QFSI_RSP;
1934
1935typedef struct whoami_rsp_data { /* Query level 0x202 */
1936	__u32 flags; /* 0 = Authenticated user 1 = GUEST */
1937	__u32 mask; /* which flags bits server understands ie 0x0001 */
1938	__u64 unix_user_id;
1939	__u64 unix_user_gid;
1940	__u32 number_of_supplementary_gids; /* may be zero */
1941	__u32 number_of_sids; /* may be zero */
1942	__u32 length_of_sid_array; /* in bytes - may be zero */
1943	__u32 pad; /* reserved - MBZ */
1944	/* __u64 gid_array[0]; */  /* may be empty */
1945	/* __u8 * psid_list */  /* may be empty */
1946} __attribute__((packed)) WHOAMI_RSP_DATA;
1947
1948/* SETFSInfo Levels */
1949#define SMB_SET_CIFS_UNIX_INFO    0x200
1950/* level 0x203 is defined above in list of QFS info levels */
1951/* #define SMB_REQUEST_TRANSPORT_ENCRYPTION 0x203 */
1952
1953/* Level 0x200 request structure follows */
1954typedef struct smb_com_transaction2_setfsi_req {
1955	struct smb_hdr hdr;	/* wct = 15 */
1956	__le16 TotalParameterCount;
1957	__le16 TotalDataCount;
1958	__le16 MaxParameterCount;
1959	__le16 MaxDataCount;
1960	__u8 MaxSetupCount;
1961	__u8 Reserved;
1962	__le16 Flags;
1963	__le32 Timeout;
1964	__u16 Reserved2;
1965	__le16 ParameterCount;	/* 4 */
1966	__le16 ParameterOffset;
1967	__le16 DataCount;	/* 12 */
1968	__le16 DataOffset;
1969	__u8 SetupCount;	/* one */
1970	__u8 Reserved3;
1971	__le16 SubCommand;	/* TRANS2_SET_FS_INFORMATION */
1972	__le16 ByteCount;
1973	__u8 Pad;
1974	__u16 FileNum;		/* Parameters start. */
1975	__le16 InformationLevel;/* Parameters end. */
1976	__le16 ClientUnixMajor; /* Data start. */
1977	__le16 ClientUnixMinor;
1978	__le64 ClientUnixCap;   /* Data end */
1979} __attribute__((packed)) TRANSACTION2_SETFSI_REQ;
1980
1981/* level 0x203 request structure follows */
1982typedef struct smb_com_transaction2_setfs_enc_req {
1983	struct smb_hdr hdr;	/* wct = 15 */
1984	__le16 TotalParameterCount;
1985	__le16 TotalDataCount;
1986	__le16 MaxParameterCount;
1987	__le16 MaxDataCount;
1988	__u8 MaxSetupCount;
1989	__u8 Reserved;
1990	__le16 Flags;
1991	__le32 Timeout;
1992	__u16 Reserved2;
1993	__le16 ParameterCount;	/* 4 */
1994	__le16 ParameterOffset;
1995	__le16 DataCount;	/* 12 */
1996	__le16 DataOffset;
1997	__u8 SetupCount;	/* one */
1998	__u8 Reserved3;
1999	__le16 SubCommand;	/* TRANS2_SET_FS_INFORMATION */
2000	__le16 ByteCount;
2001	__u8 Pad;
2002	__u16  Reserved4;	/* Parameters start. */
2003	__le16 InformationLevel;/* Parameters end. */
2004	/* NTLMSSP Blob, Data start. */
2005} __attribute__((packed)) TRANSACTION2_SETFSI_ENC_REQ;
2006
2007/* response for setfsinfo levels 0x200 and 0x203 */
2008typedef struct smb_com_transaction2_setfsi_rsp {
2009	struct smb_hdr hdr;	/* wct = 10 */
2010	struct trans2_resp t2;
2011	__u16 ByteCount;
2012} __attribute__((packed)) TRANSACTION2_SETFSI_RSP;
2013
2014typedef struct smb_com_transaction2_get_dfs_refer_req {
2015	struct smb_hdr hdr;	/* wct = 15 */
2016	__le16 TotalParameterCount;
2017	__le16 TotalDataCount;
2018	__le16 MaxParameterCount;
2019	__le16 MaxDataCount;
2020	__u8 MaxSetupCount;
2021	__u8 Reserved;
2022	__le16 Flags;
2023	__le32 Timeout;
2024	__u16 Reserved2;
2025	__le16 ParameterCount;
2026	__le16 ParameterOffset;
2027	__le16 DataCount;
2028	__le16 DataOffset;
2029	__u8 SetupCount;
2030	__u8 Reserved3;
2031	__le16 SubCommand;	/* one setup word */
2032	__le16 ByteCount;
2033	__u8 Pad[3];		/* Win2K has sent 0x0F01 (max response length
2034				   perhaps?) followed by one byte pad - doesn't
2035				   seem to matter though */
2036	__le16 MaxReferralLevel;
2037	char RequestFileName[1];
2038} __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ;
2039
2040#define DFS_VERSION cpu_to_le16(0x0003)
2041
2042/* DFS server target type */
2043#define DFS_TYPE_LINK 0x0000  /* also for sysvol targets */
2044#define DFS_TYPE_ROOT 0x0001
2045
2046/* Referral Entry Flags */
2047#define DFS_NAME_LIST_REF 0x0200 /* set for domain or DC referral responses */
2048#define DFS_TARGET_SET_BOUNDARY 0x0400 /* only valid with version 4 dfs req */
2049
2050typedef struct dfs_referral_level_3 { /* version 4 is same, + one flag bit */
2051	__le16 VersionNumber;  /* must be 3 or 4 */
2052	__le16 Size;
2053	__le16 ServerType; /* 0x0001 = root targets; 0x0000 = link targets */
2054	__le16 ReferralEntryFlags;
2055	__le32 TimeToLive;
2056	__le16 DfsPathOffset;
2057	__le16 DfsAlternatePathOffset;
2058	__le16 NetworkAddressOffset; /* offset of the link target */
2059	__u8   ServiceSiteGuid[16];  /* MBZ, ignored */
2060} __attribute__((packed)) REFERRAL3;
2061
2062struct get_dfs_referral_rsp {
2063	__le16 PathConsumed;
2064	__le16 NumberOfReferrals;
2065	__le32 DFSFlags;
2066	REFERRAL3 referrals[1];	/* array of level 3 dfs_referral structures */
2067	/* followed by the strings pointed to by the referral structures */
2068} __packed;
2069
2070typedef struct smb_com_transaction_get_dfs_refer_rsp {
2071	struct smb_hdr hdr;	/* wct = 10 */
2072	struct trans2_resp t2;
2073	__u16 ByteCount;
2074	__u8 Pad;
2075	struct get_dfs_referral_rsp dfs_data;
2076} __packed TRANSACTION2_GET_DFS_REFER_RSP;
2077
2078/* DFS Flags */
2079#define DFSREF_REFERRAL_SERVER  0x00000001 /* all targets are DFS roots */
2080#define DFSREF_STORAGE_SERVER   0x00000002 /* no further ref requests needed */
2081#define DFSREF_TARGET_FAILBACK  0x00000004 /* only for DFS referral version 4 */
2082
2083/*
2084 ************************************************************************
2085 * All structs for everything above the SMB PDUs themselves
2086 * (such as the T2 level specific data) go here
2087 ************************************************************************
2088 */
2089
2090/*
2091 * Information on a server
2092 */
2093
2094struct serverInfo {
2095	char name[16];
2096	unsigned char versionMajor;
2097	unsigned char versionMinor;
2098	unsigned long type;
2099	unsigned int commentOffset;
2100} __attribute__((packed));
2101
2102/*
2103 * The following structure is the format of the data returned on a NetShareEnum
2104 * with level "90" (x5A)
2105 */
2106
2107struct shareInfo {
2108	char shareName[13];
2109	char pad;
2110	unsigned short type;
2111	unsigned int commentOffset;
2112} __attribute__((packed));
2113
2114struct aliasInfo {
2115	char aliasName[9];
2116	char pad;
2117	unsigned int commentOffset;
2118	unsigned char type[2];
2119} __attribute__((packed));
2120
2121struct aliasInfo92 {
2122	int aliasNameOffset;
2123	int serverNameOffset;
2124	int shareNameOffset;
2125} __attribute__((packed));
2126
2127typedef struct {
2128	__le64 TotalAllocationUnits;
2129	__le64 FreeAllocationUnits;
2130	__le32 SectorsPerAllocationUnit;
2131	__le32 BytesPerSector;
2132} __attribute__((packed)) FILE_SYSTEM_INFO;	/* size info, level 0x103 */
2133
2134typedef struct {
2135	__le32 fsid;
2136	__le32 SectorsPerAllocationUnit;
2137	__le32 TotalAllocationUnits;
2138	__le32 FreeAllocationUnits;
2139	__le16  BytesPerSector;
2140} __attribute__((packed)) FILE_SYSTEM_ALLOC_INFO;
2141
2142typedef struct {
2143	__le16 MajorVersionNumber;
2144	__le16 MinorVersionNumber;
2145	__le64 Capability;
2146} __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extension level 0x200*/
2147
2148/* Version numbers for CIFS UNIX major and minor. */
2149#define CIFS_UNIX_MAJOR_VERSION 1
2150#define CIFS_UNIX_MINOR_VERSION 0
2151
2152/* Linux/Unix extensions capability flags */
2153#define CIFS_UNIX_FCNTL_CAP             0x00000001 /* support for fcntl locks */
2154#define CIFS_UNIX_POSIX_ACL_CAP         0x00000002 /* support getfacl/setfacl */
2155#define CIFS_UNIX_XATTR_CAP             0x00000004 /* support new namespace   */
2156#define CIFS_UNIX_EXTATTR_CAP           0x00000008 /* support chattr/chflag   */
2157#define CIFS_UNIX_POSIX_PATHNAMES_CAP   0x00000010 /* Allow POSIX path chars  */
2158#define CIFS_UNIX_POSIX_PATH_OPS_CAP    0x00000020 /* Allow new POSIX path based
2159						      calls including posix open
2160						      and posix unlink */
2161#define CIFS_UNIX_LARGE_READ_CAP        0x00000040 /* support reads >128K (up
2162						      to 0xFFFF00 */
2163#define CIFS_UNIX_LARGE_WRITE_CAP       0x00000080
2164#define CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP 0x00000100 /* can do SPNEGO crypt */
2165#define CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP  0x00000200 /* must do  */
2166#define CIFS_UNIX_PROXY_CAP             0x00000400 /* Proxy cap: 0xACE ioctl and
2167						      QFS PROXY call */
2168#ifdef CONFIG_CIFS_POSIX
2169/* presumably don't need the 0x20 POSIX_PATH_OPS_CAP since we never send
2170   LockingX instead of posix locking call on unix sess (and we do not expect
2171   LockingX to use different (ie Windows) semantics than posix locking on
2172   the same session (if WINE needs to do this later, we can add this cap
2173   back in later */
2174/* #define CIFS_UNIX_CAP_MASK              0x000000fb */
2175#define CIFS_UNIX_CAP_MASK              0x000003db
2176#else
2177#define CIFS_UNIX_CAP_MASK              0x00000013
2178#endif /* CONFIG_CIFS_POSIX */
2179
2180
2181#define CIFS_POSIX_EXTENSIONS           0x00000010 /* support for new QFSInfo */
2182
2183typedef struct {
2184	/* For undefined recommended transfer size return -1 in that field */
2185	__le32 OptimalTransferSize;  /* bsize on some os, iosize on other os */
2186	__le32 BlockSize;
2187    /* The next three fields are in terms of the block size.
2188	(above). If block size is unknown, 4096 would be a
2189	reasonable block size for a server to report.
2190	Note that returning the blocks/blocksavail removes need
2191	to make a second call (to QFSInfo level 0x103 to get this info.
2192	UserBlockAvail is typically less than or equal to BlocksAvail,
2193	if no distinction is made return the same value in each */
2194	__le64 TotalBlocks;
2195	__le64 BlocksAvail;       /* bfree */
2196	__le64 UserBlocksAvail;   /* bavail */
2197    /* For undefined Node fields or FSID return -1 */
2198	__le64 TotalFileNodes;
2199	__le64 FreeFileNodes;
2200	__le64 FileSysIdentifier;   /* fsid */
2201	/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
2202	/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call   */
2203} __attribute__((packed)) FILE_SYSTEM_POSIX_INFO;
2204
2205/* DeviceType Flags */
2206#define FILE_DEVICE_CD_ROM              0x00000002
2207#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
2208#define FILE_DEVICE_DFS                 0x00000006
2209#define FILE_DEVICE_DISK                0x00000007
2210#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
2211#define FILE_DEVICE_FILE_SYSTEM         0x00000009
2212#define FILE_DEVICE_NAMED_PIPE          0x00000011
2213#define FILE_DEVICE_NETWORK             0x00000012
2214#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
2215#define FILE_DEVICE_NULL                0x00000015
2216#define FILE_DEVICE_PARALLEL_PORT       0x00000016
2217#define FILE_DEVICE_PRINTER             0x00000018
2218#define FILE_DEVICE_SERIAL_PORT         0x0000001b
2219#define FILE_DEVICE_STREAMS             0x0000001e
2220#define FILE_DEVICE_TAPE                0x0000001f
2221#define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020
2222#define FILE_DEVICE_VIRTUAL_DISK        0x00000024
2223#define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028
2224
2225/* Device Characteristics */
2226#define FILE_REMOVABLE_MEDIA			0x00000001
2227#define FILE_READ_ONLY_DEVICE			0x00000002
2228#define FILE_FLOPPY_DISKETTE			0x00000004
2229#define FILE_WRITE_ONCE_MEDIA			0x00000008
2230#define FILE_REMOTE_DEVICE			0x00000010
2231#define FILE_DEVICE_IS_MOUNTED			0x00000020
2232#define FILE_VIRTUAL_VOLUME			0x00000040
2233#define FILE_DEVICE_SECURE_OPEN			0x00000100
2234#define FILE_CHARACTERISTIC_TS_DEVICE		0x00001000
2235#define FILE_CHARACTERISTIC_WEBDAV_DEVICE	0x00002000
2236#define FILE_PORTABLE_DEVICE			0x00004000
2237#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
2238
2239typedef struct {
2240	__le32 DeviceType;
2241	__le32 DeviceCharacteristics;
2242} __attribute__((packed)) FILE_SYSTEM_DEVICE_INFO; /* device info level 0x104 */
2243
2244/* minimum includes first three fields, and empty FS Name */
2245#define MIN_FS_ATTR_INFO_SIZE 12
2246
2247
2248/* List of FileSystemAttributes - see 2.5.1 of MS-FSCC */
2249#define FILE_SUPPORTS_SPARSE_VDL	0x10000000 /* faster nonsparse extend */
2250#define FILE_SUPPORTS_BLOCK_REFCOUNTING	0x08000000 /* allow ioctl dup extents */
2251#define FILE_SUPPORT_INTEGRITY_STREAMS	0x04000000
2252#define FILE_SUPPORTS_USN_JOURNAL	0x02000000
2253#define FILE_SUPPORTS_OPEN_BY_FILE_ID	0x01000000
2254#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
2255#define FILE_SUPPORTS_HARD_LINKS	0x00400000
2256#define FILE_SUPPORTS_TRANSACTIONS	0x00200000
2257#define FILE_SEQUENTIAL_WRITE_ONCE	0x00100000
2258#define FILE_READ_ONLY_VOLUME		0x00080000
2259#define FILE_NAMED_STREAMS		0x00040000
2260#define FILE_SUPPORTS_ENCRYPTION	0x00020000
2261#define FILE_SUPPORTS_OBJECT_IDS	0x00010000
2262#define FILE_VOLUME_IS_COMPRESSED	0x00008000
2263#define FILE_SUPPORTS_REMOTE_STORAGE	0x00000100
2264#define FILE_SUPPORTS_REPARSE_POINTS	0x00000080
2265#define FILE_SUPPORTS_SPARSE_FILES	0x00000040
2266#define FILE_VOLUME_QUOTAS		0x00000020
2267#define FILE_FILE_COMPRESSION		0x00000010
2268#define FILE_PERSISTENT_ACLS		0x00000008
2269#define FILE_UNICODE_ON_DISK		0x00000004
2270#define FILE_CASE_PRESERVED_NAMES	0x00000002
2271#define FILE_CASE_SENSITIVE_SEARCH	0x00000001
2272typedef struct {
2273	__le32 Attributes;
2274	__le32 MaxPathNameComponentLength;
2275	__le32 FileSystemNameLen;
2276	char FileSystemName[52]; /* do not have to save this - get subset? */
2277} __attribute__((packed)) FILE_SYSTEM_ATTRIBUTE_INFO;
2278
2279/******************************************************************************/
2280/* QueryFileInfo/QueryPathinfo (also for SetPath/SetFile) data buffer formats */
2281/******************************************************************************/
2282typedef struct { /* data block encoding of response to level 263 QPathInfo */
2283	__le64 CreationTime;
2284	__le64 LastAccessTime;
2285	__le64 LastWriteTime;
2286	__le64 ChangeTime;
2287	__le32 Attributes;
2288	__u32 Pad1;
2289	__le64 AllocationSize;
2290	__le64 EndOfFile;	/* size ie offset to first free byte in file */
2291	__le32 NumberOfLinks;	/* hard links */
2292	__u8 DeletePending;
2293	__u8 Directory;
2294	__u16 Pad2;
2295	__le64 IndexNumber;
2296	__le32 EASize;
2297	__le32 AccessFlags;
2298	__u64 IndexNumber1;
2299	__le64 CurrentByteOffset;
2300	__le32 Mode;
2301	__le32 AlignmentRequirement;
2302	__le32 FileNameLength;
2303	char FileName[1];
2304} __attribute__((packed)) FILE_ALL_INFO;	/* level 0x107 QPathInfo */
2305
2306typedef struct {
2307	__le64 AllocationSize;
2308	__le64 EndOfFile;	/* size ie offset to first free byte in file */
2309	__le32 NumberOfLinks;	/* hard links */
2310	__u8 DeletePending;
2311	__u8 Directory;
2312	__u16 Pad;
2313} __attribute__((packed)) FILE_STANDARD_INFO;	/* level 0x102 QPathInfo */
2314
2315
2316/* defines for enumerating possible values of the Unix type field below */
2317#define UNIX_FILE      0
2318#define UNIX_DIR       1
2319#define UNIX_SYMLINK   2
2320#define UNIX_CHARDEV   3
2321#define UNIX_BLOCKDEV  4
2322#define UNIX_FIFO      5
2323#define UNIX_SOCKET    6
2324typedef struct {
2325	__le64 EndOfFile;
2326	__le64 NumOfBytes;
2327	__le64 LastStatusChange; /*SNIA specs DCE time for the 3 time fields */
2328	__le64 LastAccessTime;
2329	__le64 LastModificationTime;
2330	__le64 Uid;
2331	__le64 Gid;
2332	__le32 Type;
2333	__le64 DevMajor;
2334	__le64 DevMinor;
2335	__le64 UniqueId;
2336	__le64 Permissions;
2337	__le64 Nlinks;
2338} __attribute__((packed)) FILE_UNIX_BASIC_INFO;	/* level 0x200 QPathInfo */
2339
2340typedef struct {
2341	char LinkDest[1];
2342} __attribute__((packed)) FILE_UNIX_LINK_INFO;	/* level 0x201 QPathInfo */
2343
2344/* The following three structures are needed only for
2345	setting time to NT4 and some older servers via
2346	the primitive DOS time format */
2347typedef struct {
2348	__u16 Day:5;
2349	__u16 Month:4;
2350	__u16 Year:7;
2351} __attribute__((packed)) SMB_DATE;
2352
2353typedef struct {
2354	__u16 TwoSeconds:5;
2355	__u16 Minutes:6;
2356	__u16 Hours:5;
2357} __attribute__((packed)) SMB_TIME;
2358
2359typedef struct {
2360	__le16 CreationDate; /* SMB Date see above */
2361	__le16 CreationTime; /* SMB Time */
2362	__le16 LastAccessDate;
2363	__le16 LastAccessTime;
2364	__le16 LastWriteDate;
2365	__le16 LastWriteTime;
2366	__le32 DataSize; /* File Size (EOF) */
2367	__le32 AllocationSize;
2368	__le16 Attributes; /* verify not u32 */
2369	__le32 EASize;
2370} __attribute__((packed)) FILE_INFO_STANDARD;  /* level 1 SetPath/FileInfo */
2371
2372typedef struct {
2373	__le64 CreationTime;
2374	__le64 LastAccessTime;
2375	__le64 LastWriteTime;
2376	__le64 ChangeTime;
2377	__le32 Attributes;
2378	__u32 Pad;
2379} __attribute__((packed)) FILE_BASIC_INFO;	/* size info, level 0x101 */
2380
2381struct file_allocation_info {
2382	__le64 AllocationSize; /* Note old Samba srvr rounds this up too much */
2383} __attribute__((packed));	/* size used on disk, for level 0x103 for set,
2384				   0x105 for query */
2385
2386struct file_end_of_file_info {
2387	__le64 FileSize;		/* offset to end of file */
2388} __attribute__((packed)); /* size info, level 0x104 for set, 0x106 for query */
2389
2390struct file_alt_name_info {
2391	__u8   alt_name[1];
2392} __attribute__((packed));      /* level 0x0108 */
2393
2394struct file_stream_info {
2395	__le32 number_of_streams;  /* BB check sizes and verify location */
2396	/* followed by info on streams themselves
2397		u64 size;
2398		u64 allocation_size
2399		stream info */
2400};      /* level 0x109 */
2401
2402struct file_compression_info {
2403	__le64 compressed_size;
2404	__le16 format;
2405	__u8   unit_shift;
2406	__u8   ch_shift;
2407	__u8   cl_shift;
2408	__u8   pad[3];
2409} __attribute__((packed));      /* level 0x10b */
2410
2411/* POSIX ACL set/query path info structures */
2412#define CIFS_ACL_VERSION 1
2413struct cifs_posix_ace { /* access control entry (ACE) */
2414	__u8  cifs_e_tag;
2415	__u8  cifs_e_perm;
2416	__le64 cifs_uid; /* or gid */
2417} __attribute__((packed));
2418
2419struct cifs_posix_acl { /* access conrol list  (ACL) */
2420	__le16	version;
2421	__le16	access_entry_count;  /* access ACL - count of entries */
2422	__le16	default_entry_count; /* default ACL - count of entries */
2423	struct cifs_posix_ace ace_array[];
2424	/* followed by
2425	struct cifs_posix_ace default_ace_arraay[] */
2426} __attribute__((packed));  /* level 0x204 */
2427
2428/* types of access control entries already defined in posix_acl.h */
2429/* #define CIFS_POSIX_ACL_USER_OBJ	 0x01
2430#define CIFS_POSIX_ACL_USER      0x02
2431#define CIFS_POSIX_ACL_GROUP_OBJ 0x04
2432#define CIFS_POSIX_ACL_GROUP     0x08
2433#define CIFS_POSIX_ACL_MASK      0x10
2434#define CIFS_POSIX_ACL_OTHER     0x20 */
2435
2436/* types of perms */
2437/* #define CIFS_POSIX_ACL_EXECUTE   0x01
2438#define CIFS_POSIX_ACL_WRITE     0x02
2439#define CIFS_POSIX_ACL_READ	     0x04 */
2440
2441/* end of POSIX ACL definitions */
2442
2443/* POSIX Open Flags */
2444#define SMB_O_RDONLY 	 0x1
2445#define SMB_O_WRONLY 	0x2
2446#define SMB_O_RDWR 	0x4
2447#define SMB_O_CREAT 	0x10
2448#define SMB_O_EXCL 	0x20
2449#define SMB_O_TRUNC 	0x40
2450#define SMB_O_APPEND 	0x80
2451#define SMB_O_SYNC 	0x100
2452#define SMB_O_DIRECTORY 0x200
2453#define SMB_O_NOFOLLOW 	0x400
2454#define SMB_O_DIRECT 	0x800
2455
2456typedef struct {
2457	__le32 OpenFlags; /* same as NT CreateX */
2458	__le32 PosixOpenFlags;
2459	__le64 Permissions;
2460	__le16 Level; /* reply level requested (see QPathInfo levels) */
2461} __attribute__((packed)) OPEN_PSX_REQ; /* level 0x209 SetPathInfo data */
2462
2463typedef struct {
2464	__le16 OplockFlags;
2465	__u16 Fid;
2466	__le32 CreateAction;
2467	__le16 ReturnedLevel;
2468	__le16 Pad;
2469	/* struct following varies based on requested level */
2470} __attribute__((packed)) OPEN_PSX_RSP; /* level 0x209 SetPathInfo data */
2471
2472#define SMB_POSIX_UNLINK_FILE_TARGET		0
2473#define SMB_POSIX_UNLINK_DIRECTORY_TARGET	1
2474
2475struct unlink_psx_rq { /* level 0x20a SetPathInfo */
2476	__le16 type;
2477} __attribute__((packed));
2478
2479struct file_internal_info {
2480	__le64  UniqueId; /* inode number */
2481} __attribute__((packed));      /* level 0x3ee */
2482
2483struct file_mode_info {
2484	__le32	Mode;
2485} __attribute__((packed));      /* level 0x3f8 */
2486
2487struct file_attrib_tag {
2488	__le32 Attribute;
2489	__le32 ReparseTag;
2490} __attribute__((packed));      /* level 0x40b */
2491
2492
2493/********************************************************/
2494/*  FindFirst/FindNext transact2 data buffer formats    */
2495/********************************************************/
2496
2497typedef struct {
2498	__le32 NextEntryOffset;
2499	__u32 ResumeKey; /* as with FileIndex - no need to convert */
2500	FILE_UNIX_BASIC_INFO basic;
2501	char FileName[1];
2502} __attribute__((packed)) FILE_UNIX_INFO; /* level 0x202 */
2503
2504typedef struct {
2505	__le32 NextEntryOffset;
2506	__u32 FileIndex;
2507	__le64 CreationTime;
2508	__le64 LastAccessTime;
2509	__le64 LastWriteTime;
2510	__le64 ChangeTime;
2511	__le64 EndOfFile;
2512	__le64 AllocationSize;
2513	__le32 ExtFileAttributes;
2514	__le32 FileNameLength;
2515	char FileName[1];
2516} __attribute__((packed)) FILE_DIRECTORY_INFO;   /* level 0x101 FF resp data */
2517
2518typedef struct {
2519	__le32 NextEntryOffset;
2520	__u32 FileIndex;
2521	__le64 CreationTime;
2522	__le64 LastAccessTime;
2523	__le64 LastWriteTime;
2524	__le64 ChangeTime;
2525	__le64 EndOfFile;
2526	__le64 AllocationSize;
2527	__le32 ExtFileAttributes;
2528	__le32 FileNameLength;
2529	__le32 EaSize; /* length of the xattrs */
2530	char FileName[1];
2531} __attribute__((packed)) FILE_FULL_DIRECTORY_INFO; /* level 0x102 rsp data */
2532
2533typedef struct {
2534	__le32 NextEntryOffset;
2535	__u32 FileIndex;
2536	__le64 CreationTime;
2537	__le64 LastAccessTime;
2538	__le64 LastWriteTime;
2539	__le64 ChangeTime;
2540	__le64 EndOfFile;
2541	__le64 AllocationSize;
2542	__le32 ExtFileAttributes;
2543	__le32 FileNameLength;
2544	__le32 EaSize; /* EA size */
2545	__le32 Reserved;
2546	__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/
2547	char FileName[1];
2548} __attribute__((packed)) SEARCH_ID_FULL_DIR_INFO; /* level 0x105 FF rsp data */
2549
2550typedef struct {
2551	__le32 NextEntryOffset;
2552	__u32 FileIndex;
2553	__le64 CreationTime;
2554	__le64 LastAccessTime;
2555	__le64 LastWriteTime;
2556	__le64 ChangeTime;
2557	__le64 EndOfFile;
2558	__le64 AllocationSize;
2559	__le32 ExtFileAttributes;
2560	__le32 FileNameLength;
2561	__le32 EaSize; /* length of the xattrs */
2562	__u8   ShortNameLength;
2563	__u8   Reserved;
2564	__u8   ShortName[12];
2565	char FileName[1];
2566} __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FFrsp data */
2567
2568typedef struct {
2569	__u32  ResumeKey;
2570	__le16 CreationDate; /* SMB Date */
2571	__le16 CreationTime; /* SMB Time */
2572	__le16 LastAccessDate;
2573	__le16 LastAccessTime;
2574	__le16 LastWriteDate;
2575	__le16 LastWriteTime;
2576	__le32 DataSize; /* File Size (EOF) */
2577	__le32 AllocationSize;
2578	__le16 Attributes; /* verify not u32 */
2579	__u8   FileNameLength;
2580	char FileName[1];
2581} __attribute__((packed)) FIND_FILE_STANDARD_INFO; /* level 0x1 FF resp data */
2582
2583
2584struct win_dev {
2585	unsigned char type[8]; /* IntxCHR or IntxBLK */
2586	__le64 major;
2587	__le64 minor;
2588} __attribute__((packed));
2589
2590struct gea {
2591	unsigned char name_len;
2592	char name[1];
2593} __attribute__((packed));
2594
2595struct gealist {
2596	unsigned long list_len;
2597	struct gea list[1];
2598} __attribute__((packed));
2599
2600struct fea {
2601	unsigned char EA_flags;
2602	__u8 name_len;
2603	__le16 value_len;
2604	char name[1];
2605	/* optionally followed by value */
2606} __attribute__((packed));
2607/* flags for _FEA.fEA */
2608#define FEA_NEEDEA         0x80	/* need EA bit */
2609
2610struct fealist {
2611	__le32 list_len;
2612	struct fea list[1];
2613} __attribute__((packed));
2614
2615/* used to hold an arbitrary blob of data */
2616struct data_blob {
2617	__u8 *data;
2618	size_t length;
2619	void (*free) (struct data_blob *data_blob);
2620} __attribute__((packed));
2621
2622
2623#ifdef CONFIG_CIFS_POSIX
2624/*
2625	For better POSIX semantics from Linux client, (even better
2626	than the existing CIFS Unix Extensions) we need updated PDUs for:
2627
2628	1) PosixCreateX - to set and return the mode, inode#, device info and
2629	perhaps add a CreateDevice - to create Pipes and other special .inodes
2630	Also note POSIX open flags
2631	2) Close - to return the last write time to do cache across close
2632		more safely
2633	3) FindFirst return unique inode number - what about resume key, two
2634	forms short (matches readdir) and full (enough info to cache inodes)
2635	4) Mkdir - set mode
2636
2637	And under consideration:
2638	5) FindClose2 (return nanosecond timestamp ??)
2639	6) Use nanosecond timestamps throughout all time fields if
2640	   corresponding attribute flag is set
2641	7) sendfile - handle based copy
2642
2643	what about fixing 64 bit alignment
2644
2645	There are also various legacy SMB/CIFS requests used as is
2646
2647	From existing Lanman and NTLM dialects:
2648	--------------------------------------
2649	NEGOTIATE
2650	SESSION_SETUP_ANDX (BB which?)
2651	TREE_CONNECT_ANDX (BB which wct?)
2652	TREE_DISCONNECT (BB add volume timestamp on response)
2653	LOGOFF_ANDX
2654	DELETE (note delete open file behavior)
2655	DELETE_DIRECTORY
2656	READ_AND_X
2657	WRITE_AND_X
2658	LOCKING_AND_X (note posix lock semantics)
2659	RENAME (note rename across dirs and open file rename posix behaviors)
2660	NT_RENAME (for hardlinks) Is this good enough for all features?
2661	FIND_CLOSE2
2662	TRANSACTION2 (18 cases)
2663		SMB_SET_FILE_END_OF_FILE_INFO2 SMB_SET_PATH_END_OF_FILE_INFO2
2664		(BB verify that never need to set allocation size)
2665		SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via
2666			 Unix ext?)
2667
2668	COPY (note support for copy across directories) - FUTURE, OPTIONAL
2669	setting/getting OS/2 EAs - FUTURE (BB can this handle
2670	setting Linux xattrs perfectly)         - OPTIONAL
2671	dnotify                                 - FUTURE, OPTIONAL
2672	quota                                   - FUTURE, OPTIONAL
2673
2674	Note that various requests implemented for NT interop such as
2675		NT_TRANSACT (IOCTL) QueryReparseInfo
2676	are unneeded to servers compliant with the CIFS POSIX extensions
2677
2678	From CIFS Unix Extensions:
2679	-------------------------
2680	T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks
2681	T2 SET_PATH_INFO (SMB_SET_FILE_BASIC_INFO2)
2682	T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_LINK)
2683	T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC)	BB check for missing
2684							inode fields
2685				Actually a need QUERY_FILE_UNIX_INFO
2686				since has inode num
2687				BB what about a) blksize/blkbits/blocks
2688							  b) i_version
2689							  c) i_rdev
2690							  d) notify mask?
2691							  e) generation
2692							  f) size_seqcount
2693	T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX
2694	TRANS2_GET_DFS_REFERRAL		      - OPTIONAL but recommended
2695	T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL
2696 */
2697
2698/* xsymlink is a symlink format (used by MacOS) that can be used
2699   to save symlink info in a regular file when
2700   mounted to operating systems that do not
2701   support the cifs Unix extensions or EAs (for xattr
2702   based symlinks).  For such a file to be recognized
2703   as containing symlink data:
2704
2705   1) file size must be 1067,
2706   2) signature must begin file data,
2707   3) length field must be set to ASCII representation
2708	of a number which is less than or equal to 1024,
2709   4) md5 must match that of the path data */
2710
2711struct xsymlink {
2712	/* 1067 bytes */
2713	char signature[4]; /* XSym */ /* not null terminated */
2714	char cr0;         /* \n */
2715/* ASCII representation of length (4 bytes decimal) terminated by \n not null */
2716	char length[4];
2717	char cr1;         /* \n */
2718/* md5 of valid subset of path ie path[0] through path[length-1] */
2719	__u8 md5[32];
2720	char cr2;        /* \n */
2721/* if room left, then end with \n then 0x20s by convention but not required */
2722	char path[1024];
2723} __attribute__((packed));
2724
2725typedef struct file_xattr_info {
2726	/* BB do we need another field for flags? BB */
2727	__u32 xattr_name_len;
2728	__u32 xattr_value_len;
2729	char  xattr_name[];
2730	/* followed by xattr_value[xattr_value_len], no pad */
2731} __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute info
2732					      level 0x205 */
2733
2734/* flags for lsattr and chflags commands removed arein uapi/linux/fs.h */
2735
2736typedef struct file_chattr_info {
2737	__le64	mask; /* list of all possible attribute bits */
2738	__le64	mode; /* list of actual attribute bits on this inode */
2739} __attribute__((packed)) FILE_CHATTR_INFO;  /* ext attributes
2740						(chattr, chflags) level 0x206 */
2741#endif 				/* POSIX */
2742#endif				/* _CIFSPDU_H */
2743