xref: /openbmc/linux/fs/smb/server/smb2pdu.h (revision d4a079d1)
138c8a9a5SSteve French /* SPDX-License-Identifier: GPL-2.0-or-later */
238c8a9a5SSteve French /*
338c8a9a5SSteve French  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
438c8a9a5SSteve French  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
538c8a9a5SSteve French  */
638c8a9a5SSteve French 
738c8a9a5SSteve French #ifndef _SMB2PDU_H
838c8a9a5SSteve French #define _SMB2PDU_H
938c8a9a5SSteve French 
1038c8a9a5SSteve French #include "ntlmssp.h"
1138c8a9a5SSteve French #include "smbacl.h"
1238c8a9a5SSteve French 
1338c8a9a5SSteve French /*Create Action Flags*/
1438c8a9a5SSteve French #define FILE_SUPERSEDED                0x00000000
1538c8a9a5SSteve French #define FILE_OPENED            0x00000001
1638c8a9a5SSteve French #define FILE_CREATED           0x00000002
1738c8a9a5SSteve French #define FILE_OVERWRITTEN       0x00000003
1838c8a9a5SSteve French 
1938c8a9a5SSteve French /* SMB2 Max Credits */
2038c8a9a5SSteve French #define SMB2_MAX_CREDITS		8192
2138c8a9a5SSteve French 
2238c8a9a5SSteve French /* BB FIXME - analyze following length BB */
2338c8a9a5SSteve French #define MAX_SMB2_HDR_SIZE 0x78 /* 4 len + 64 hdr + (2*24 wct) + 2 bct + 2 pad */
2438c8a9a5SSteve French 
2538c8a9a5SSteve French #define SMB21_DEFAULT_IOSIZE	(1024 * 1024)
2638c8a9a5SSteve French #define SMB3_DEFAULT_TRANS_SIZE	(1024 * 1024)
2738c8a9a5SSteve French #define SMB3_MIN_IOSIZE		(64 * 1024)
2838c8a9a5SSteve French #define SMB3_MAX_IOSIZE		(8 * 1024 * 1024)
2938c8a9a5SSteve French #define SMB3_MAX_MSGSIZE	(4 * 4096)
3038c8a9a5SSteve French 
3138c8a9a5SSteve French /*
3238c8a9a5SSteve French  *	Definitions for SMB2 Protocol Data Units (network frames)
3338c8a9a5SSteve French  *
3438c8a9a5SSteve French  *  See MS-SMB2.PDF specification for protocol details.
3538c8a9a5SSteve French  *  The Naming convention is the lower case version of the SMB2
3638c8a9a5SSteve French  *  command code name for the struct. Note that structures must be packed.
3738c8a9a5SSteve French  *
3838c8a9a5SSteve French  */
3938c8a9a5SSteve French 
4038c8a9a5SSteve French struct preauth_integrity_info {
4138c8a9a5SSteve French 	/* PreAuth integrity Hash ID */
4238c8a9a5SSteve French 	__le16			Preauth_HashId;
4338c8a9a5SSteve French 	/* PreAuth integrity Hash Value */
4438c8a9a5SSteve French 	__u8			Preauth_HashValue[SMB2_PREAUTH_HASH_SIZE];
4538c8a9a5SSteve French };
4638c8a9a5SSteve French 
4738c8a9a5SSteve French /* offset is sizeof smb2_negotiate_rsp but rounded up to 8 bytes. */
4838c8a9a5SSteve French #ifdef CONFIG_SMB_SERVER_KERBEROS5
4938c8a9a5SSteve French /* sizeof(struct smb2_negotiate_rsp) =
5038c8a9a5SSteve French  * header(64) + response(64) + GSS_LENGTH(96) + GSS_PADDING(0)
5138c8a9a5SSteve French  */
5238c8a9a5SSteve French #define OFFSET_OF_NEG_CONTEXT	0xe0
5338c8a9a5SSteve French #else
5438c8a9a5SSteve French /* sizeof(struct smb2_negotiate_rsp) =
5538c8a9a5SSteve French  * header(64) + response(64) + GSS_LENGTH(74) + GSS_PADDING(6)
5638c8a9a5SSteve French  */
5738c8a9a5SSteve French #define OFFSET_OF_NEG_CONTEXT	0xd0
5838c8a9a5SSteve French #endif
5938c8a9a5SSteve French 
6038c8a9a5SSteve French #define SMB2_SESSION_EXPIRED		(0)
6138c8a9a5SSteve French #define SMB2_SESSION_IN_PROGRESS	BIT(0)
6238c8a9a5SSteve French #define SMB2_SESSION_VALID		BIT(1)
6338c8a9a5SSteve French 
6438c8a9a5SSteve French #define SMB2_SESSION_TIMEOUT		(10 * HZ)
6538c8a9a5SSteve French 
6638c8a9a5SSteve French struct create_durable_req_v2 {
67d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
6838c8a9a5SSteve French 	__u8   Name[8];
6938c8a9a5SSteve French 	__le32 Timeout;
7038c8a9a5SSteve French 	__le32 Flags;
7138c8a9a5SSteve French 	__u8 Reserved[8];
7238c8a9a5SSteve French 	__u8 CreateGuid[16];
7338c8a9a5SSteve French } __packed;
7438c8a9a5SSteve French 
758df4bcdbSNamjae Jeon struct create_durable_reconn_req {
76d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
778df4bcdbSNamjae Jeon 	__u8   Name[8];
788df4bcdbSNamjae Jeon 	union {
798df4bcdbSNamjae Jeon 		__u8  Reserved[16];
808df4bcdbSNamjae Jeon 		struct {
818df4bcdbSNamjae Jeon 			__u64 PersistentFileId;
828df4bcdbSNamjae Jeon 			__u64 VolatileFileId;
838df4bcdbSNamjae Jeon 		} Fid;
848df4bcdbSNamjae Jeon 	} Data;
858df4bcdbSNamjae Jeon } __packed;
868df4bcdbSNamjae Jeon 
8738c8a9a5SSteve French struct create_durable_reconn_v2_req {
88d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
8938c8a9a5SSteve French 	__u8   Name[8];
9038c8a9a5SSteve French 	struct {
9138c8a9a5SSteve French 		__u64 PersistentFileId;
9238c8a9a5SSteve French 		__u64 VolatileFileId;
9338c8a9a5SSteve French 	} Fid;
9438c8a9a5SSteve French 	__u8 CreateGuid[16];
9538c8a9a5SSteve French 	__le32 Flags;
9638c8a9a5SSteve French } __packed;
9738c8a9a5SSteve French 
9838c8a9a5SSteve French struct create_alloc_size_req {
99d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
10038c8a9a5SSteve French 	__u8   Name[8];
10138c8a9a5SSteve French 	__le64 AllocationSize;
10238c8a9a5SSteve French } __packed;
10338c8a9a5SSteve French 
10438c8a9a5SSteve French struct create_durable_rsp {
105d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
10638c8a9a5SSteve French 	__u8   Name[8];
10738c8a9a5SSteve French 	union {
10838c8a9a5SSteve French 		__u8  Reserved[8];
10938c8a9a5SSteve French 		__u64 data;
11038c8a9a5SSteve French 	} Data;
11138c8a9a5SSteve French } __packed;
11238c8a9a5SSteve French 
1138df4bcdbSNamjae Jeon /* See MS-SMB2 2.2.13.2.11 */
1148df4bcdbSNamjae Jeon /* Flags */
1158df4bcdbSNamjae Jeon #define SMB2_DHANDLE_FLAG_PERSISTENT	0x00000002
11638c8a9a5SSteve French struct create_durable_v2_rsp {
117d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
11838c8a9a5SSteve French 	__u8   Name[8];
11938c8a9a5SSteve French 	__le32 Timeout;
12038c8a9a5SSteve French 	__le32 Flags;
12138c8a9a5SSteve French } __packed;
12238c8a9a5SSteve French 
12338c8a9a5SSteve French /* equivalent of the contents of SMB3.1.1 POSIX open context response */
12438c8a9a5SSteve French struct create_posix_rsp {
125d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
12638c8a9a5SSteve French 	__u8    Name[16];
12738c8a9a5SSteve French 	__le32 nlink;
12838c8a9a5SSteve French 	__le32 reparse_tag;
12938c8a9a5SSteve French 	__le32 mode;
13038c8a9a5SSteve French 	/* SidBuffer contain two sids(Domain sid(28), UNIX group sid(16)) */
13138c8a9a5SSteve French 	u8 SidBuffer[44];
13238c8a9a5SSteve French } __packed;
13338c8a9a5SSteve French 
13438c8a9a5SSteve French struct smb2_buffer_desc_v1 {
13538c8a9a5SSteve French 	__le64 offset;
13638c8a9a5SSteve French 	__le32 token;
13738c8a9a5SSteve French 	__le32 length;
13838c8a9a5SSteve French } __packed;
13938c8a9a5SSteve French 
14038c8a9a5SSteve French #define SMB2_0_IOCTL_IS_FSCTL 0x00000001
14138c8a9a5SSteve French 
14238c8a9a5SSteve French struct smb_sockaddr_in {
14338c8a9a5SSteve French 	__be16 Port;
14438c8a9a5SSteve French 	__be32 IPv4address;
14538c8a9a5SSteve French 	__u8 Reserved[8];
14638c8a9a5SSteve French } __packed;
14738c8a9a5SSteve French 
14838c8a9a5SSteve French struct smb_sockaddr_in6 {
14938c8a9a5SSteve French 	__be16 Port;
15038c8a9a5SSteve French 	__be32 FlowInfo;
15138c8a9a5SSteve French 	__u8 IPv6address[16];
15238c8a9a5SSteve French 	__be32 ScopeId;
15338c8a9a5SSteve French } __packed;
15438c8a9a5SSteve French 
15538c8a9a5SSteve French #define INTERNETWORK	0x0002
15638c8a9a5SSteve French #define INTERNETWORKV6	0x0017
15738c8a9a5SSteve French 
15838c8a9a5SSteve French struct sockaddr_storage_rsp {
15938c8a9a5SSteve French 	__le16 Family;
16038c8a9a5SSteve French 	union {
16138c8a9a5SSteve French 		struct smb_sockaddr_in addr4;
16238c8a9a5SSteve French 		struct smb_sockaddr_in6 addr6;
16338c8a9a5SSteve French 	};
16438c8a9a5SSteve French } __packed;
16538c8a9a5SSteve French 
16638c8a9a5SSteve French #define RSS_CAPABLE	0x00000001
16738c8a9a5SSteve French #define RDMA_CAPABLE	0x00000002
16838c8a9a5SSteve French 
16938c8a9a5SSteve French struct network_interface_info_ioctl_rsp {
17038c8a9a5SSteve French 	__le32 Next; /* next interface. zero if this is last one */
17138c8a9a5SSteve French 	__le32 IfIndex;
17238c8a9a5SSteve French 	__le32 Capability; /* RSS or RDMA Capable */
17338c8a9a5SSteve French 	__le32 Reserved;
17438c8a9a5SSteve French 	__le64 LinkSpeed;
17538c8a9a5SSteve French 	char	SockAddr_Storage[128];
17638c8a9a5SSteve French } __packed;
17738c8a9a5SSteve French 
17838c8a9a5SSteve French struct file_object_buf_type1_ioctl_rsp {
17938c8a9a5SSteve French 	__u8 ObjectId[16];
18038c8a9a5SSteve French 	__u8 BirthVolumeId[16];
18138c8a9a5SSteve French 	__u8 BirthObjectId[16];
18238c8a9a5SSteve French 	__u8 DomainId[16];
18338c8a9a5SSteve French } __packed;
18438c8a9a5SSteve French 
18538c8a9a5SSteve French struct resume_key_ioctl_rsp {
18638c8a9a5SSteve French 	__u64 ResumeKey[3];
18738c8a9a5SSteve French 	__le32 ContextLength;
18838c8a9a5SSteve French 	__u8 Context[4]; /* ignored, Windows sets to 4 bytes of zero */
18938c8a9a5SSteve French } __packed;
19038c8a9a5SSteve French 
19138c8a9a5SSteve French struct copychunk_ioctl_req {
19238c8a9a5SSteve French 	__le64 ResumeKey[3];
19338c8a9a5SSteve French 	__le32 ChunkCount;
19438c8a9a5SSteve French 	__le32 Reserved;
19538c8a9a5SSteve French 	__u8 Chunks[1]; /* array of srv_copychunk */
19638c8a9a5SSteve French } __packed;
19738c8a9a5SSteve French 
19838c8a9a5SSteve French struct srv_copychunk {
19938c8a9a5SSteve French 	__le64 SourceOffset;
20038c8a9a5SSteve French 	__le64 TargetOffset;
20138c8a9a5SSteve French 	__le32 Length;
20238c8a9a5SSteve French 	__le32 Reserved;
20338c8a9a5SSteve French } __packed;
20438c8a9a5SSteve French 
20538c8a9a5SSteve French struct copychunk_ioctl_rsp {
20638c8a9a5SSteve French 	__le32 ChunksWritten;
20738c8a9a5SSteve French 	__le32 ChunkBytesWritten;
20838c8a9a5SSteve French 	__le32 TotalBytesWritten;
20938c8a9a5SSteve French } __packed;
21038c8a9a5SSteve French 
21138c8a9a5SSteve French struct file_sparse {
21238c8a9a5SSteve French 	__u8	SetSparse;
21338c8a9a5SSteve French } __packed;
21438c8a9a5SSteve French 
21538c8a9a5SSteve French /* FILE Info response size */
21638c8a9a5SSteve French #define FILE_DIRECTORY_INFORMATION_SIZE       1
21738c8a9a5SSteve French #define FILE_FULL_DIRECTORY_INFORMATION_SIZE  2
21838c8a9a5SSteve French #define FILE_BOTH_DIRECTORY_INFORMATION_SIZE  3
21938c8a9a5SSteve French #define FILE_BASIC_INFORMATION_SIZE           40
22038c8a9a5SSteve French #define FILE_STANDARD_INFORMATION_SIZE        24
22138c8a9a5SSteve French #define FILE_INTERNAL_INFORMATION_SIZE        8
22238c8a9a5SSteve French #define FILE_EA_INFORMATION_SIZE              4
22338c8a9a5SSteve French #define FILE_ACCESS_INFORMATION_SIZE          4
22438c8a9a5SSteve French #define FILE_NAME_INFORMATION_SIZE            9
22538c8a9a5SSteve French #define FILE_RENAME_INFORMATION_SIZE          10
22638c8a9a5SSteve French #define FILE_LINK_INFORMATION_SIZE            11
22738c8a9a5SSteve French #define FILE_NAMES_INFORMATION_SIZE           12
22838c8a9a5SSteve French #define FILE_DISPOSITION_INFORMATION_SIZE     13
22938c8a9a5SSteve French #define FILE_POSITION_INFORMATION_SIZE        14
23038c8a9a5SSteve French #define FILE_FULL_EA_INFORMATION_SIZE         15
23138c8a9a5SSteve French #define FILE_MODE_INFORMATION_SIZE            4
23238c8a9a5SSteve French #define FILE_ALIGNMENT_INFORMATION_SIZE       4
23338c8a9a5SSteve French #define FILE_ALL_INFORMATION_SIZE             104
23438c8a9a5SSteve French #define FILE_ALLOCATION_INFORMATION_SIZE      19
23538c8a9a5SSteve French #define FILE_END_OF_FILE_INFORMATION_SIZE     20
23638c8a9a5SSteve French #define FILE_ALTERNATE_NAME_INFORMATION_SIZE  8
23738c8a9a5SSteve French #define FILE_STREAM_INFORMATION_SIZE          32
23838c8a9a5SSteve French #define FILE_PIPE_INFORMATION_SIZE            23
23938c8a9a5SSteve French #define FILE_PIPE_LOCAL_INFORMATION_SIZE      24
24038c8a9a5SSteve French #define FILE_PIPE_REMOTE_INFORMATION_SIZE     25
24138c8a9a5SSteve French #define FILE_MAILSLOT_QUERY_INFORMATION_SIZE  26
24238c8a9a5SSteve French #define FILE_MAILSLOT_SET_INFORMATION_SIZE    27
24338c8a9a5SSteve French #define FILE_COMPRESSION_INFORMATION_SIZE     16
24438c8a9a5SSteve French #define FILE_OBJECT_ID_INFORMATION_SIZE       29
24538c8a9a5SSteve French /* Number 30 not defined in documents */
24638c8a9a5SSteve French #define FILE_MOVE_CLUSTER_INFORMATION_SIZE    31
24738c8a9a5SSteve French #define FILE_QUOTA_INFORMATION_SIZE           32
24838c8a9a5SSteve French #define FILE_REPARSE_POINT_INFORMATION_SIZE   33
24938c8a9a5SSteve French #define FILE_NETWORK_OPEN_INFORMATION_SIZE    56
25038c8a9a5SSteve French #define FILE_ATTRIBUTE_TAG_INFORMATION_SIZE   8
25138c8a9a5SSteve French 
25238c8a9a5SSteve French /* FS Info response  size */
25338c8a9a5SSteve French #define FS_DEVICE_INFORMATION_SIZE     8
25438c8a9a5SSteve French #define FS_ATTRIBUTE_INFORMATION_SIZE  16
25538c8a9a5SSteve French #define FS_VOLUME_INFORMATION_SIZE     24
25638c8a9a5SSteve French #define FS_SIZE_INFORMATION_SIZE       24
25738c8a9a5SSteve French #define FS_FULL_SIZE_INFORMATION_SIZE  32
25838c8a9a5SSteve French #define FS_SECTOR_SIZE_INFORMATION_SIZE 28
25938c8a9a5SSteve French #define FS_OBJECT_ID_INFORMATION_SIZE 64
26038c8a9a5SSteve French #define FS_CONTROL_INFORMATION_SIZE 48
26138c8a9a5SSteve French #define FS_POSIX_INFORMATION_SIZE 56
26238c8a9a5SSteve French 
26338c8a9a5SSteve French /* FS_ATTRIBUTE_File_System_Name */
26438c8a9a5SSteve French #define FS_TYPE_SUPPORT_SIZE   44
26538c8a9a5SSteve French struct fs_type_info {
26638c8a9a5SSteve French 	char		*fs_name;
26738c8a9a5SSteve French 	long		magic_number;
26838c8a9a5SSteve French } __packed;
26938c8a9a5SSteve French 
27038c8a9a5SSteve French /*
27138c8a9a5SSteve French  *	PDU query infolevel structure definitions
27238c8a9a5SSteve French  *	BB consider moving to a different header
27338c8a9a5SSteve French  */
27438c8a9a5SSteve French 
27538c8a9a5SSteve French struct smb2_file_access_info {
27638c8a9a5SSteve French 	__le32 AccessFlags;
27738c8a9a5SSteve French } __packed;
27838c8a9a5SSteve French 
27938c8a9a5SSteve French struct smb2_file_alignment_info {
28038c8a9a5SSteve French 	__le32 AlignmentRequirement;
28138c8a9a5SSteve French } __packed;
28238c8a9a5SSteve French 
28338c8a9a5SSteve French struct smb2_file_basic_info { /* data block encoding of response to level 18 */
28438c8a9a5SSteve French 	__le64 CreationTime;	/* Beginning of FILE_BASIC_INFO equivalent */
28538c8a9a5SSteve French 	__le64 LastAccessTime;
28638c8a9a5SSteve French 	__le64 LastWriteTime;
28738c8a9a5SSteve French 	__le64 ChangeTime;
28838c8a9a5SSteve French 	__le32 Attributes;
28938c8a9a5SSteve French 	__u32  Pad1;		/* End of FILE_BASIC_INFO_INFO equivalent */
29038c8a9a5SSteve French } __packed;
29138c8a9a5SSteve French 
29238c8a9a5SSteve French struct smb2_file_alt_name_info {
29338c8a9a5SSteve French 	__le32 FileNameLength;
29438c8a9a5SSteve French 	char FileName[];
29538c8a9a5SSteve French } __packed;
29638c8a9a5SSteve French 
29738c8a9a5SSteve French struct smb2_file_stream_info {
29838c8a9a5SSteve French 	__le32  NextEntryOffset;
29938c8a9a5SSteve French 	__le32  StreamNameLength;
30038c8a9a5SSteve French 	__le64 StreamSize;
30138c8a9a5SSteve French 	__le64 StreamAllocationSize;
30238c8a9a5SSteve French 	char   StreamName[];
30338c8a9a5SSteve French } __packed;
30438c8a9a5SSteve French 
30538c8a9a5SSteve French struct smb2_file_ntwrk_info {
30638c8a9a5SSteve French 	__le64 CreationTime;
30738c8a9a5SSteve French 	__le64 LastAccessTime;
30838c8a9a5SSteve French 	__le64 LastWriteTime;
30938c8a9a5SSteve French 	__le64 ChangeTime;
31038c8a9a5SSteve French 	__le64 AllocationSize;
31138c8a9a5SSteve French 	__le64 EndOfFile;
31238c8a9a5SSteve French 	__le32 Attributes;
31338c8a9a5SSteve French 	__le32 Reserved;
31438c8a9a5SSteve French } __packed;
31538c8a9a5SSteve French 
31638c8a9a5SSteve French struct smb2_file_standard_info {
31738c8a9a5SSteve French 	__le64 AllocationSize;
31838c8a9a5SSteve French 	__le64 EndOfFile;
31938c8a9a5SSteve French 	__le32 NumberOfLinks;	/* hard links */
32038c8a9a5SSteve French 	__u8   DeletePending;
32138c8a9a5SSteve French 	__u8   Directory;
32238c8a9a5SSteve French 	__le16 Reserved;
32338c8a9a5SSteve French } __packed; /* level 18 Query */
32438c8a9a5SSteve French 
32538c8a9a5SSteve French struct smb2_file_ea_info {
32638c8a9a5SSteve French 	__le32 EASize;
32738c8a9a5SSteve French } __packed;
32838c8a9a5SSteve French 
32938c8a9a5SSteve French struct smb2_file_alloc_info {
33038c8a9a5SSteve French 	__le64 AllocationSize;
33138c8a9a5SSteve French } __packed;
33238c8a9a5SSteve French 
33338c8a9a5SSteve French struct smb2_file_disposition_info {
33438c8a9a5SSteve French 	__u8 DeletePending;
33538c8a9a5SSteve French } __packed;
33638c8a9a5SSteve French 
33738c8a9a5SSteve French struct smb2_file_pos_info {
33838c8a9a5SSteve French 	__le64 CurrentByteOffset;
33938c8a9a5SSteve French } __packed;
34038c8a9a5SSteve French 
34138c8a9a5SSteve French #define FILE_MODE_INFO_MASK cpu_to_le32(0x0000100e)
34238c8a9a5SSteve French 
34338c8a9a5SSteve French struct smb2_file_mode_info {
34438c8a9a5SSteve French 	__le32 Mode;
34538c8a9a5SSteve French } __packed;
34638c8a9a5SSteve French 
34738c8a9a5SSteve French #define COMPRESSION_FORMAT_NONE 0x0000
34838c8a9a5SSteve French #define COMPRESSION_FORMAT_LZNT1 0x0002
34938c8a9a5SSteve French 
35038c8a9a5SSteve French struct smb2_file_comp_info {
35138c8a9a5SSteve French 	__le64 CompressedFileSize;
35238c8a9a5SSteve French 	__le16 CompressionFormat;
35338c8a9a5SSteve French 	__u8 CompressionUnitShift;
35438c8a9a5SSteve French 	__u8 ChunkShift;
35538c8a9a5SSteve French 	__u8 ClusterShift;
35638c8a9a5SSteve French 	__u8 Reserved[3];
35738c8a9a5SSteve French } __packed;
35838c8a9a5SSteve French 
35938c8a9a5SSteve French struct smb2_file_attr_tag_info {
36038c8a9a5SSteve French 	__le32 FileAttributes;
36138c8a9a5SSteve French 	__le32 ReparseTag;
36238c8a9a5SSteve French } __packed;
36338c8a9a5SSteve French 
36438c8a9a5SSteve French #define SL_RESTART_SCAN	0x00000001
36538c8a9a5SSteve French #define SL_RETURN_SINGLE_ENTRY	0x00000002
36638c8a9a5SSteve French #define SL_INDEX_SPECIFIED	0x00000004
36738c8a9a5SSteve French 
36838c8a9a5SSteve French struct smb2_ea_info_req {
36938c8a9a5SSteve French 	__le32 NextEntryOffset;
37038c8a9a5SSteve French 	__u8   EaNameLength;
37138c8a9a5SSteve French 	char name[1];
37238c8a9a5SSteve French } __packed; /* level 15 Query */
37338c8a9a5SSteve French 
37438c8a9a5SSteve French struct smb2_ea_info {
37538c8a9a5SSteve French 	__le32 NextEntryOffset;
37638c8a9a5SSteve French 	__u8   Flags;
37738c8a9a5SSteve French 	__u8   EaNameLength;
37838c8a9a5SSteve French 	__le16 EaValueLength;
3790ba5439dSNamjae Jeon 	char name[];
38038c8a9a5SSteve French 	/* optionally followed by value */
38138c8a9a5SSteve French } __packed; /* level 15 Query */
38238c8a9a5SSteve French 
38338c8a9a5SSteve French struct create_ea_buf_req {
384d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
38538c8a9a5SSteve French 	__u8   Name[8];
38638c8a9a5SSteve French 	struct smb2_ea_info ea;
38738c8a9a5SSteve French } __packed;
38838c8a9a5SSteve French 
38938c8a9a5SSteve French struct create_sd_buf_req {
390d4a079d1SGustavo A. R. Silva 	struct create_context_hdr ccontext;
39138c8a9a5SSteve French 	__u8   Name[8];
39238c8a9a5SSteve French 	struct smb_ntsd ntsd;
39338c8a9a5SSteve French } __packed;
39438c8a9a5SSteve French 
39538c8a9a5SSteve French struct smb2_posix_info {
39638c8a9a5SSteve French 	__le32 NextEntryOffset;
39738c8a9a5SSteve French 	__u32 Ignored;
39838c8a9a5SSteve French 	__le64 CreationTime;
39938c8a9a5SSteve French 	__le64 LastAccessTime;
40038c8a9a5SSteve French 	__le64 LastWriteTime;
40138c8a9a5SSteve French 	__le64 ChangeTime;
40238c8a9a5SSteve French 	__le64 EndOfFile;
40338c8a9a5SSteve French 	__le64 AllocationSize;
40438c8a9a5SSteve French 	__le32 DosAttributes;
40538c8a9a5SSteve French 	__le64 Inode;
40638c8a9a5SSteve French 	__le32 DeviceId;
40738c8a9a5SSteve French 	__le32 Zero;
40838c8a9a5SSteve French 	/* beginning of POSIX Create Context Response */
40938c8a9a5SSteve French 	__le32 HardLinks;
41038c8a9a5SSteve French 	__le32 ReparseTag;
41138c8a9a5SSteve French 	__le32 Mode;
41238c8a9a5SSteve French 	/* SidBuffer contain two sids (UNIX user sid(16), UNIX group sid(16)) */
41338c8a9a5SSteve French 	u8 SidBuffer[32];
41438c8a9a5SSteve French 	__le32 name_len;
41538c8a9a5SSteve French 	u8 name[];
41638c8a9a5SSteve French 	/*
41738c8a9a5SSteve French 	 * var sized owner SID
41838c8a9a5SSteve French 	 * var sized group SID
41938c8a9a5SSteve French 	 * le32 filenamelength
42038c8a9a5SSteve French 	 * u8  filename[]
42138c8a9a5SSteve French 	 */
42238c8a9a5SSteve French } __packed;
42338c8a9a5SSteve French 
42438c8a9a5SSteve French /* functions */
42538c8a9a5SSteve French void init_smb2_1_server(struct ksmbd_conn *conn);
42638c8a9a5SSteve French void init_smb3_0_server(struct ksmbd_conn *conn);
42738c8a9a5SSteve French void init_smb3_02_server(struct ksmbd_conn *conn);
42838c8a9a5SSteve French int init_smb3_11_server(struct ksmbd_conn *conn);
42938c8a9a5SSteve French 
43038c8a9a5SSteve French void init_smb2_max_read_size(unsigned int sz);
43138c8a9a5SSteve French void init_smb2_max_write_size(unsigned int sz);
43238c8a9a5SSteve French void init_smb2_max_trans_size(unsigned int sz);
43338c8a9a5SSteve French void init_smb2_max_credits(unsigned int sz);
43438c8a9a5SSteve French 
43538c8a9a5SSteve French bool is_smb2_neg_cmd(struct ksmbd_work *work);
43638c8a9a5SSteve French bool is_smb2_rsp(struct ksmbd_work *work);
43738c8a9a5SSteve French 
43838c8a9a5SSteve French u16 get_smb2_cmd_val(struct ksmbd_work *work);
43938c8a9a5SSteve French void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err);
44038c8a9a5SSteve French int init_smb2_rsp_hdr(struct ksmbd_work *work);
44138c8a9a5SSteve French int smb2_allocate_rsp_buf(struct ksmbd_work *work);
44238c8a9a5SSteve French bool is_chained_smb2_message(struct ksmbd_work *work);
44338c8a9a5SSteve French int init_smb2_neg_rsp(struct ksmbd_work *work);
44438c8a9a5SSteve French void smb2_set_err_rsp(struct ksmbd_work *work);
44538c8a9a5SSteve French int smb2_check_user_session(struct ksmbd_work *work);
44638c8a9a5SSteve French int smb2_get_ksmbd_tcon(struct ksmbd_work *work);
44738c8a9a5SSteve French bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command);
44838c8a9a5SSteve French int smb2_check_sign_req(struct ksmbd_work *work);
44938c8a9a5SSteve French void smb2_set_sign_rsp(struct ksmbd_work *work);
45038c8a9a5SSteve French int smb3_check_sign_req(struct ksmbd_work *work);
45138c8a9a5SSteve French void smb3_set_sign_rsp(struct ksmbd_work *work);
45238c8a9a5SSteve French int find_matching_smb2_dialect(int start_index, __le16 *cli_dialects,
45338c8a9a5SSteve French 			       __le16 dialects_count);
45438c8a9a5SSteve French struct file_lock *smb_flock_init(struct file *f);
45538c8a9a5SSteve French int setup_async_work(struct ksmbd_work *work, void (*fn)(void **),
45638c8a9a5SSteve French 		     void **arg);
45738c8a9a5SSteve French void release_async_work(struct ksmbd_work *work);
45838c8a9a5SSteve French void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status);
45938c8a9a5SSteve French struct channel *lookup_chann_list(struct ksmbd_session *sess,
46038c8a9a5SSteve French 				  struct ksmbd_conn *conn);
46138c8a9a5SSteve French void smb3_preauth_hash_rsp(struct ksmbd_work *work);
46238c8a9a5SSteve French bool smb3_is_transform_hdr(void *buf);
46338c8a9a5SSteve French int smb3_decrypt_req(struct ksmbd_work *work);
46438c8a9a5SSteve French int smb3_encrypt_resp(struct ksmbd_work *work);
46538c8a9a5SSteve French bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work);
46638c8a9a5SSteve French int smb2_set_rsp_credits(struct ksmbd_work *work);
46738c8a9a5SSteve French bool smb3_encryption_negotiated(struct ksmbd_conn *conn);
46838c8a9a5SSteve French 
46938c8a9a5SSteve French /* smb2 misc functions */
47038c8a9a5SSteve French int ksmbd_smb2_check_message(struct ksmbd_work *work);
47138c8a9a5SSteve French 
47238c8a9a5SSteve French /* smb2 command handlers */
47338c8a9a5SSteve French int smb2_handle_negotiate(struct ksmbd_work *work);
47438c8a9a5SSteve French int smb2_negotiate_request(struct ksmbd_work *work);
47538c8a9a5SSteve French int smb2_sess_setup(struct ksmbd_work *work);
47638c8a9a5SSteve French int smb2_tree_connect(struct ksmbd_work *work);
47738c8a9a5SSteve French int smb2_tree_disconnect(struct ksmbd_work *work);
47838c8a9a5SSteve French int smb2_session_logoff(struct ksmbd_work *work);
47938c8a9a5SSteve French int smb2_open(struct ksmbd_work *work);
48038c8a9a5SSteve French int smb2_query_info(struct ksmbd_work *work);
48138c8a9a5SSteve French int smb2_query_dir(struct ksmbd_work *work);
48238c8a9a5SSteve French int smb2_close(struct ksmbd_work *work);
48338c8a9a5SSteve French int smb2_echo(struct ksmbd_work *work);
48438c8a9a5SSteve French int smb2_set_info(struct ksmbd_work *work);
48538c8a9a5SSteve French int smb2_read(struct ksmbd_work *work);
48638c8a9a5SSteve French int smb2_write(struct ksmbd_work *work);
48738c8a9a5SSteve French int smb2_flush(struct ksmbd_work *work);
48838c8a9a5SSteve French int smb2_cancel(struct ksmbd_work *work);
48938c8a9a5SSteve French int smb2_lock(struct ksmbd_work *work);
49038c8a9a5SSteve French int smb2_ioctl(struct ksmbd_work *work);
49138c8a9a5SSteve French int smb2_oplock_break(struct ksmbd_work *work);
49238c8a9a5SSteve French int smb2_notify(struct ksmbd_work *ksmbd_work);
49338c8a9a5SSteve French 
49438c8a9a5SSteve French /*
49538c8a9a5SSteve French  * Get the body of the smb2 message excluding the 4 byte rfc1002 headers
49638c8a9a5SSteve French  * from request/response buffer.
49738c8a9a5SSteve French  */
smb2_get_msg(void * buf)49838c8a9a5SSteve French static inline void *smb2_get_msg(void *buf)
49938c8a9a5SSteve French {
50038c8a9a5SSteve French 	return buf + 4;
50138c8a9a5SSteve French }
50238c8a9a5SSteve French 
50338c8a9a5SSteve French #endif	/* _SMB2PDU_H */
504