18705Sjkh/* SPDX-License-Identifier: GPL-2.0-or-later */
28705Sjkh/*
38705Sjkh *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
48705Sjkh *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
58705Sjkh */
68705Sjkh
750479Speter#ifndef _SMB2PDU_H
88705Sjkh#define _SMB2PDU_H
98705Sjkh
108705Sjkh#include "ntlmssp.h"
118705Sjkh#include "smbacl.h"
128705Sjkh
138705Sjkh/*Create Action Flags*/
148705Sjkh#define FILE_SUPERSEDED                0x00000000
158705Sjkh#define FILE_OPENED            0x00000001
168881Srgrimes#define FILE_CREATED           0x00000002
178881Srgrimes#define FILE_OVERWRITTEN       0x00000003
188705Sjkh
198705Sjkh/* SMB2 Max Credits */
208705Sjkh#define SMB2_MAX_CREDITS		8192
218705Sjkh
228705Sjkh/* BB FIXME - analyze following length BB */
238705Sjkh#define MAX_SMB2_HDR_SIZE 0x78 /* 4 len + 64 hdr + (2*24 wct) + 2 bct + 2 pad */
248705Sjkh
258705Sjkh#define SMB21_DEFAULT_IOSIZE	(1024 * 1024)
268705Sjkh#define SMB3_DEFAULT_TRANS_SIZE	(1024 * 1024)
278705Sjkh#define SMB3_MIN_IOSIZE		(64 * 1024)
288705Sjkh#define SMB3_MAX_IOSIZE		(8 * 1024 * 1024)
298705Sjkh#define SMB3_MAX_MSGSIZE	(4 * 4096)
308705Sjkh
318705Sjkh/*
328705Sjkh *	Definitions for SMB2 Protocol Data Units (network frames)
338705Sjkh *
348705Sjkh *  See MS-SMB2.PDF specification for protocol details.
358705Sjkh *  The Naming convention is the lower case version of the SMB2
368705Sjkh *  command code name for the struct. Note that structures must be packed.
378705Sjkh *
388705Sjkh */
398768Sjkh
4015417Sjkhstruct preauth_integrity_info {
4115417Sjkh	/* PreAuth integrity Hash ID */
4215417Sjkh	__le16			Preauth_HashId;
4315417Sjkh	/* PreAuth integrity Hash Value */
4415417Sjkh	__u8			Preauth_HashValue[SMB2_PREAUTH_HASH_SIZE];
4515417Sjkh};
4615417Sjkh
478705Sjkh/* offset is sizeof smb2_negotiate_rsp but rounded up to 8 bytes. */
488705Sjkh#ifdef CONFIG_SMB_SERVER_KERBEROS5
498705Sjkh/* sizeof(struct smb2_negotiate_rsp) =
5020484Sjkh * header(64) + response(64) + GSS_LENGTH(96) + GSS_PADDING(0)
518705Sjkh */
528705Sjkh#define OFFSET_OF_NEG_CONTEXT	0xe0
538705Sjkh#else
5412661Speter/* sizeof(struct smb2_negotiate_rsp) =
558705Sjkh * header(64) + response(64) + GSS_LENGTH(74) + GSS_PADDING(6)
5612661Speter */
578705Sjkh#define OFFSET_OF_NEG_CONTEXT	0xd0
5812661Speter#endif
5912661Speter
6012661Speter#define SMB2_SESSION_EXPIRED		(0)
6112661Speter#define SMB2_SESSION_IN_PROGRESS	BIT(0)
6214793Sjoerg#define SMB2_SESSION_VALID		BIT(1)
6312661Speter
6414793Sjoerg#define SMB2_SESSION_TIMEOUT		(10 * HZ)
6512661Speter
6614793Sjoergstruct create_durable_req_v2 {
678705Sjkh	struct create_context ccontext;
688705Sjkh	__u8   Name[8];
6914793Sjoerg	__le32 Timeout;
708705Sjkh	__le32 Flags;
718705Sjkh	__u8 Reserved[8];
7212661Speter	__u8 CreateGuid[16];
7312661Speter} __packed;
7412661Speter
7512661Speterstruct create_durable_reconn_req {
7612661Speter	struct create_context ccontext;
7712661Speter	__u8   Name[8];
7812661Speter	union {
7912661Speter		__u8  Reserved[16];
8012661Speter		struct {
8112661Speter			__u64 PersistentFileId;
8212661Speter			__u64 VolatileFileId;
8312661Speter		} Fid;
8412661Speter	} Data;
8512661Speter} __packed;
8612661Speter
8712661Speterstruct create_durable_reconn_v2_req {
8812661Speter	struct create_context ccontext;
8920484Sjkh	__u8   Name[8];
9020484Sjkh	struct {
9120484Sjkh		__u64 PersistentFileId;
9220484Sjkh		__u64 VolatileFileId;
9320484Sjkh	} Fid;
9420484Sjkh	__u8 CreateGuid[16];
9520484Sjkh	__le32 Flags;
9620484Sjkh} __packed;
9720484Sjkh
9820484Sjkhstruct create_alloc_size_req {
9920484Sjkh	struct create_context ccontext;
10020484Sjkh	__u8   Name[8];
10120484Sjkh	__le64 AllocationSize;
10220484Sjkh} __packed;
10320484Sjkh
1048705Sjkhstruct create_durable_rsp {
10512661Speter	struct create_context ccontext;
1068751Sjkh	__u8   Name[8];
10734394Sjkh	union {
1088751Sjkh		__u8  Reserved[8];
1098751Sjkh		__u64 data;
1108751Sjkh	} Data;
1118705Sjkh} __packed;
1128705Sjkh
1139202Srgrimes/* See MS-SMB2 2.2.13.2.11 */
1149202Srgrimes/* Flags */
1159202Srgrimes#define SMB2_DHANDLE_FLAG_PERSISTENT	0x00000002
11614793Sjoergstruct create_durable_v2_rsp {
1178705Sjkh	struct create_context ccontext;
1188705Sjkh	__u8   Name[8];
1198705Sjkh	__le32 Timeout;
1208705Sjkh	__le32 Flags;
1218705Sjkh} __packed;
1228705Sjkh
1238756Sjkh/* equivalent of the contents of SMB3.1.1 POSIX open context response */
1248705Sjkhstruct create_posix_rsp {
1258705Sjkh	struct create_context ccontext;
1268705Sjkh	__u8    Name[16];
1278705Sjkh	__le32 nlink;
1288705Sjkh	__le32 reparse_tag;
1298705Sjkh	__le32 mode;
1308705Sjkh	/* SidBuffer contain two sids(Domain sid(28), UNIX group sid(16)) */
1319202Srgrimes	u8 SidBuffer[44];
1328705Sjkh} __packed;
1338705Sjkh
1348705Sjkhstruct smb2_buffer_desc_v1 {
1358705Sjkh	__le64 offset;
1368705Sjkh	__le32 token;
1378705Sjkh	__le32 length;
13820484Sjkh} __packed;
13920484Sjkh
14020484Sjkh#define SMB2_0_IOCTL_IS_FSCTL 0x00000001
14120484Sjkh
14220484Sjkhstruct smb_sockaddr_in {
14320484Sjkh	__be16 Port;
1448705Sjkh	__be32 IPv4address;
1458705Sjkh	__u8 Reserved[8];
1468705Sjkh} __packed;
14720484Sjkh
14820484Sjkhstruct smb_sockaddr_in6 {
14920484Sjkh	__be16 Port;
15020484Sjkh	__be32 FlowInfo;
15120484Sjkh	__u8 IPv6address[16];
15220484Sjkh	__be32 ScopeId;
1538705Sjkh} __packed;
1548705Sjkh
1558705Sjkh#define INTERNETWORK	0x0002
1568705Sjkh#define INTERNETWORKV6	0x0017
1578705Sjkh
1588705Sjkhstruct sockaddr_storage_rsp {
15920484Sjkh	__le16 Family;
16020484Sjkh	union {
16120484Sjkh		struct smb_sockaddr_in addr4;
16228391Sjkh		struct smb_sockaddr_in6 addr6;
16328391Sjkh	};
16420484Sjkh} __packed;
16528391Sjkh
16620484Sjkh#define RSS_CAPABLE	0x00000001
1679202Srgrimes#define RDMA_CAPABLE	0x00000002
1688705Sjkh
1698705Sjkhstruct network_interface_info_ioctl_rsp {
17012661Speter	__le32 Next; /* next interface. zero if this is last one */
17141162Sjkh	__le32 IfIndex;
1728705Sjkh	__le32 Capability; /* RSS or RDMA Capable */
1738705Sjkh	__le32 Reserved;
1748705Sjkh	__le64 LinkSpeed;
1758705Sjkh	char	SockAddr_Storage[128];
1768705Sjkh} __packed;
1778705Sjkh
1788705Sjkhstruct file_object_buf_type1_ioctl_rsp {
1799202Srgrimes	__u8 ObjectId[16];
1809202Srgrimes	__u8 BirthVolumeId[16];
18115242Sjkh	__u8 BirthObjectId[16];
18212661Speter	__u8 DomainId[16];
18312661Speter} __packed;
18412661Speter
18512661Speterstruct resume_key_ioctl_rsp {
18612661Speter	__u64 ResumeKey[3];
1879202Srgrimes	__le32 ContextLength;
18812661Speter	__u8 Context[4]; /* ignored, Windows sets to 4 bytes of zero */
1898705Sjkh} __packed;
1908705Sjkh
1918705Sjkhstruct copychunk_ioctl_req {
19215242Sjkh	__le64 ResumeKey[3];
1938705Sjkh	__le32 ChunkCount;
1948705Sjkh	__le32 Reserved;
1958705Sjkh	__u8 Chunks[1]; /* array of srv_copychunk */
1969202Srgrimes} __packed;
1978705Sjkh
1988705Sjkhstruct srv_copychunk {
1998705Sjkh	__le64 SourceOffset;
2008705Sjkh	__le64 TargetOffset;
2018705Sjkh	__le32 Length;
2028705Sjkh	__le32 Reserved;
2038751Sjkh} __packed;
2048751Sjkh
2058751Sjkhstruct copychunk_ioctl_rsp {
20614793Sjoerg	__le32 ChunksWritten;
2078705Sjkh	__le32 ChunkBytesWritten;
2088751Sjkh	__le32 TotalBytesWritten;
2098751Sjkh} __packed;
21014793Sjoerg
2118751Sjkhstruct file_sparse {
2128751Sjkh	__u8	SetSparse;
2138705Sjkh} __packed;
21412661Speter
21512661Speter/* FILE Info response size */
21641162Sjkh#define FILE_DIRECTORY_INFORMATION_SIZE       1
2178705Sjkh#define FILE_FULL_DIRECTORY_INFORMATION_SIZE  2
2188705Sjkh#define FILE_BOTH_DIRECTORY_INFORMATION_SIZE  3
21912661Speter#define FILE_BASIC_INFORMATION_SIZE           40
22012661Speter#define FILE_STANDARD_INFORMATION_SIZE        24
22115242Sjkh#define FILE_INTERNAL_INFORMATION_SIZE        8
2228705Sjkh#define FILE_EA_INFORMATION_SIZE              4
22341162Sjkh#define FILE_ACCESS_INFORMATION_SIZE          4
22420484Sjkh#define FILE_NAME_INFORMATION_SIZE            9
22541162Sjkh#define FILE_RENAME_INFORMATION_SIZE          10
2268705Sjkh#define FILE_LINK_INFORMATION_SIZE            11
2278837Sjkh#define FILE_NAMES_INFORMATION_SIZE           12
22823751Sjkh#define FILE_DISPOSITION_INFORMATION_SIZE     13
2299202Srgrimes#define FILE_POSITION_INFORMATION_SIZE        14
23022722Sjkh#define FILE_FULL_EA_INFORMATION_SIZE         15
2319202Srgrimes#define FILE_MODE_INFORMATION_SIZE            4
23241162Sjkh#define FILE_ALIGNMENT_INFORMATION_SIZE       4
2338705Sjkh#define FILE_ALL_INFORMATION_SIZE             104
2348705Sjkh#define FILE_ALLOCATION_INFORMATION_SIZE      19
2358705Sjkh#define FILE_END_OF_FILE_INFORMATION_SIZE     20
23641162Sjkh#define FILE_ALTERNATE_NAME_INFORMATION_SIZE  8
23741162Sjkh#define FILE_STREAM_INFORMATION_SIZE          32
23841162Sjkh#define FILE_PIPE_INFORMATION_SIZE            23
2398705Sjkh#define FILE_PIPE_LOCAL_INFORMATION_SIZE      24
24041162Sjkh#define FILE_PIPE_REMOTE_INFORMATION_SIZE     25
24141162Sjkh#define FILE_MAILSLOT_QUERY_INFORMATION_SIZE  26
24241162Sjkh#define FILE_MAILSLOT_SET_INFORMATION_SIZE    27
24312661Speter#define FILE_COMPRESSION_INFORMATION_SIZE     16
24412661Speter#define FILE_OBJECT_ID_INFORMATION_SIZE       29
24523751Sjkh/* Number 30 not defined in documents */
2468705Sjkh#define FILE_MOVE_CLUSTER_INFORMATION_SIZE    31
24741162Sjkh#define FILE_QUOTA_INFORMATION_SIZE           32
24841162Sjkh#define FILE_REPARSE_POINT_INFORMATION_SIZE   33
24941162Sjkh#define FILE_NETWORK_OPEN_INFORMATION_SIZE    56
25041162Sjkh#define FILE_ATTRIBUTE_TAG_INFORMATION_SIZE   8
25141162Sjkh
2528705Sjkh/* FS Info response  size */
2539202Srgrimes#define FS_DEVICE_INFORMATION_SIZE     8
2549202Srgrimes#define FS_ATTRIBUTE_INFORMATION_SIZE  16
25515242Sjkh#define FS_VOLUME_INFORMATION_SIZE     24
2568705Sjkh#define FS_SIZE_INFORMATION_SIZE       24
2578705Sjkh#define FS_FULL_SIZE_INFORMATION_SIZE  32
25822721Sjkh#define FS_SECTOR_SIZE_INFORMATION_SIZE 28
25922721Sjkh#define FS_OBJECT_ID_INFORMATION_SIZE 64
26041162Sjkh#define FS_CONTROL_INFORMATION_SIZE 48
26122721Sjkh#define FS_POSIX_INFORMATION_SIZE 56
26222721Sjkh
26322721Sjkh/* FS_ATTRIBUTE_File_System_Name */
26422721Sjkh#define FS_TYPE_SUPPORT_SIZE   44
26522721Sjkhstruct fs_type_info {
26622721Sjkh	char		*fs_name;
26722721Sjkh	long		magic_number;
26822721Sjkh} __packed;
26922721Sjkh
27022721Sjkh/*
27122721Sjkh *	PDU query infolevel structure definitions
27222721Sjkh *	BB consider moving to a different header
27322721Sjkh */
27422721Sjkh
27522721Sjkhstruct smb2_file_access_info {
27622721Sjkh	__le32 AccessFlags;
27722721Sjkh} __packed;
27822721Sjkh
27922721Sjkhstruct smb2_file_alignment_info {
28022721Sjkh	__le32 AlignmentRequirement;
28122721Sjkh} __packed;
28222721Sjkh
28322721Sjkhstruct smb2_file_basic_info { /* data block encoding of response to level 18 */
28422721Sjkh	__le64 CreationTime;	/* Beginning of FILE_BASIC_INFO equivalent */
28522721Sjkh	__le64 LastAccessTime;
28622721Sjkh	__le64 LastWriteTime;
28722721Sjkh	__le64 ChangeTime;
28822721Sjkh	__le32 Attributes;
28922721Sjkh	__u32  Pad1;		/* End of FILE_BASIC_INFO_INFO equivalent */
29043255Sjkh} __packed;
29143685Sjkh
29222721Sjkhstruct smb2_file_alt_name_info {
29322722Sjkh	__le32 FileNameLength;
29426560Sjkh	char FileName[];
29522721Sjkh} __packed;
29622721Sjkh
29722721Sjkhstruct smb2_file_stream_info {
29822721Sjkh	__le32  NextEntryOffset;
29922721Sjkh	__le32  StreamNameLength;
30022721Sjkh	__le64 StreamSize;
30122721Sjkh	__le64 StreamAllocationSize;
30222721Sjkh	char   StreamName[];
30322721Sjkh} __packed;
30422721Sjkh
30522721Sjkhstruct smb2_file_ntwrk_info {
30622721Sjkh	__le64 CreationTime;
30726560Sjkh	__le64 LastAccessTime;
30826560Sjkh	__le64 LastWriteTime;
30922722Sjkh	__le64 ChangeTime;
31026560Sjkh	__le64 AllocationSize;
31126560Sjkh	__le64 EndOfFile;
31226560Sjkh	__le32 Attributes;
31326560Sjkh	__le32 Reserved;
31426560Sjkh} __packed;
31543685Sjkh
31643685Sjkhstruct smb2_file_standard_info {
31743685Sjkh	__le64 AllocationSize;
31826560Sjkh	__le64 EndOfFile;
31922721Sjkh	__le32 NumberOfLinks;	/* hard links */
32022721Sjkh	__u8   DeletePending;
32122721Sjkh	__u8   Directory;
32226560Sjkh	__le16 Reserved;
32343255Sjkh} __packed; /* level 18 Query */
32443255Sjkh
32543255Sjkhstruct smb2_file_ea_info {
32643255Sjkh	__le32 EASize;
32743685Sjkh} __packed;
32843685Sjkh
32943685Sjkhstruct smb2_file_alloc_info {
33043685Sjkh	__le64 AllocationSize;
33143811Sjkh} __packed;
33243984Sjkh
33343685Sjkhstruct smb2_file_disposition_info {
33443685Sjkh	__u8 DeletePending;
33543255Sjkh} __packed;
33643255Sjkh
33743255Sjkhstruct smb2_file_pos_info {
33843685Sjkh	__le64 CurrentByteOffset;
33943685Sjkh} __packed;
34043685Sjkh
34143255Sjkh#define FILE_MODE_INFO_MASK cpu_to_le32(0x0000100e)
34243255Sjkh
34343255Sjkhstruct smb2_file_mode_info {
34422756Sjkh	__le32 Mode;
34522756Sjkh} __packed;
34622756Sjkh
34722756Sjkh#define COMPRESSION_FORMAT_NONE 0x0000
34822756Sjkh#define COMPRESSION_FORMAT_LZNT1 0x0002
34922756Sjkh
35022756Sjkhstruct smb2_file_comp_info {
35122756Sjkh	__le64 CompressedFileSize;
35222756Sjkh	__le16 CompressionFormat;
35322756Sjkh	__u8 CompressionUnitShift;
35422756Sjkh	__u8 ChunkShift;
35534472Sjkh	__u8 ClusterShift;
35622756Sjkh	__u8 Reserved[3];
35734472Sjkh} __packed;
35843685Sjkh
35934867Sjkhstruct smb2_file_attr_tag_info {
36022756Sjkh	__le32 FileAttributes;
36143685Sjkh	__le32 ReparseTag;
36222756Sjkh} __packed;
36322756Sjkh
36422756Sjkh#define SL_RESTART_SCAN	0x00000001
36522756Sjkh#define SL_RETURN_SINGLE_ENTRY	0x00000002
36622756Sjkh#define SL_INDEX_SPECIFIED	0x00000004
36726456Sjkh
36826456Sjkhstruct smb2_ea_info_req {
36926456Sjkh	__le32 NextEntryOffset;
37026456Sjkh	__u8   EaNameLength;
37143811Sjkh	char name[1];
37226456Sjkh} __packed; /* level 15 Query */
37326456Sjkh
37426456Sjkhstruct smb2_ea_info {
3758705Sjkh	__le32 NextEntryOffset;
37643811Sjkh	__u8   Flags;
3778705Sjkh	__u8   EaNameLength;
37843255Sjkh	__le16 EaValueLength;
3798722Sjkh	char name[];
38043982Sjkh	/* optionally followed by value */
38144019Sjkh} __packed; /* level 15 Query */
3828722Sjkh
38343982Sjkhstruct create_ea_buf_req {
38443982Sjkh	struct create_context ccontext;
38543255Sjkh	__u8   Name[8];
38643255Sjkh	struct smb2_ea_info ea;
38743982Sjkh} __packed;
38843982Sjkh
38943982Sjkhstruct create_sd_buf_req {
39043982Sjkh	struct create_context ccontext;
39143255Sjkh	__u8   Name[8];
39212661Speter	struct smb_ntsd ntsd;
3938722Sjkh} __packed;
39443685Sjkh
39544019Sjkhstruct smb2_posix_info {
39644019Sjkh	__le32 NextEntryOffset;
39744019Sjkh	__u32 Ignored;
39844019Sjkh	__le64 CreationTime;
39943685Sjkh	__le64 LastAccessTime;
40043685Sjkh	__le64 LastWriteTime;
4018768Sjkh	__le64 ChangeTime;
4028768Sjkh	__le64 EndOfFile;
40343255Sjkh	__le64 AllocationSize;
4048705Sjkh	__le32 DosAttributes;
4058705Sjkh	__le64 Inode;
4068722Sjkh	__le32 DeviceId;
40719397Sjkh	__le32 Zero;
40819397Sjkh	/* beginning of POSIX Create Context Response */
40943685Sjkh	__le32 HardLinks;
41019397Sjkh	__le32 ReparseTag;
41143685Sjkh	__le32 Mode;
41219397Sjkh	/* SidBuffer contain two sids (UNIX user sid(16), UNIX group sid(16)) */
41319397Sjkh	u8 SidBuffer[32];
41419397Sjkh	__le32 name_len;
41519397Sjkh	u8 name[];
41615091Sjkh	/*
4178722Sjkh	 * var sized owner SID
41829539Spst	 * var sized group SID
41943685Sjkh	 * le32 filenamelength
42054587Sjkh	 * u8  filename[]
4218722Sjkh	 */
4228722Sjkh} __packed;
4239202Srgrimes
42415091Sjkh/* functions */
4259202Srgrimesvoid init_smb2_1_server(struct ksmbd_conn *conn);
42616963Sjkhvoid init_smb3_0_server(struct ksmbd_conn *conn);
42716963Sjkhvoid init_smb3_02_server(struct ksmbd_conn *conn);
42829539Spstint init_smb3_11_server(struct ksmbd_conn *conn);
42943685Sjkh
43029539Spstvoid init_smb2_max_read_size(unsigned int sz);
43116963Sjkhvoid init_smb2_max_write_size(unsigned int sz);
43216963Sjkhvoid init_smb2_max_trans_size(unsigned int sz);
43316963Sjkhvoid init_smb2_max_credits(unsigned int sz);
43429539Spst
43529539Spstbool is_smb2_neg_cmd(struct ksmbd_work *work);
43626610Sjkhbool is_smb2_rsp(struct ksmbd_work *work);
43726610Sjkh
43816327Sjkhu16 get_smb2_cmd_val(struct ksmbd_work *work);
43954587Sjkhvoid set_smb2_rsp_status(struct ksmbd_work *work, __le32 err);
4409202Srgrimesint init_smb2_rsp_hdr(struct ksmbd_work *work);
4419202Srgrimesint smb2_allocate_rsp_buf(struct ksmbd_work *work);
44215091Sjkhbool is_chained_smb2_message(struct ksmbd_work *work);
44321701Sjkhint init_smb2_neg_rsp(struct ksmbd_work *work);
44421701Sjkhvoid smb2_set_err_rsp(struct ksmbd_work *work);
44554587Sjkhint smb2_check_user_session(struct ksmbd_work *work);
44654587Sjkhint smb2_get_ksmbd_tcon(struct ksmbd_work *work);
44721701Sjkhbool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command);
44821701Sjkhint smb2_check_sign_req(struct ksmbd_work *work);
44954587Sjkhvoid smb2_set_sign_rsp(struct ksmbd_work *work);
45054587Sjkhint smb3_check_sign_req(struct ksmbd_work *work);
45121701Sjkhvoid smb3_set_sign_rsp(struct ksmbd_work *work);
45221701Sjkhint find_matching_smb2_dialect(int start_index, __le16 *cli_dialects,
45348624Sjkh			       __le16 dialects_count);
45448624Sjkhstruct file_lock *smb_flock_init(struct file *f);
45548624Sjkhint setup_async_work(struct ksmbd_work *work, void (*fn)(void **),
45654724Sjkh		     void **arg);
45754724Sjkhvoid release_async_work(struct ksmbd_work *work);
45854724Sjkhvoid smb2_send_interim_resp(struct ksmbd_work *work, __le32 status);
45954724Sjkhstruct channel *lookup_chann_list(struct ksmbd_session *sess,
46048624Sjkh				  struct ksmbd_conn *conn);
46148624Sjkhvoid smb3_preauth_hash_rsp(struct ksmbd_work *work);
46254724Sjkhbool smb3_is_transform_hdr(void *buf);
46354724Sjkhint smb3_decrypt_req(struct ksmbd_work *work);
46454724Sjkhint smb3_encrypt_resp(struct ksmbd_work *work);
46548624Sjkhbool smb3_11_final_sess_setup_resp(struct ksmbd_work *work);
46648624Sjkhint smb2_set_rsp_credits(struct ksmbd_work *work);
46746117Sjkhbool smb3_encryption_negotiated(struct ksmbd_conn *conn);
46846117Sjkh
46946117Sjkh/* smb2 misc functions */
47046117Sjkhint ksmbd_smb2_check_message(struct ksmbd_work *work);
47146142Sjkh
47246142Sjkh/* smb2 command handlers */
47346142Sjkhint smb2_handle_negotiate(struct ksmbd_work *work);
47446142Sjkhint smb2_negotiate_request(struct ksmbd_work *work);
47546142Sjkhint smb2_sess_setup(struct ksmbd_work *work);
47646142Sjkhint smb2_tree_connect(struct ksmbd_work *work);
47746142Sjkhint smb2_tree_disconnect(struct ksmbd_work *work);
47846142Sjkhint smb2_session_logoff(struct ksmbd_work *work);
47946142Sjkhint smb2_open(struct ksmbd_work *work);
48046117Sjkhint smb2_query_info(struct ksmbd_work *work);
48146142Sjkhint smb2_query_dir(struct ksmbd_work *work);
48246142Sjkhint smb2_close(struct ksmbd_work *work);
48346142Sjkhint smb2_echo(struct ksmbd_work *work);
48446142Sjkhint smb2_set_info(struct ksmbd_work *work);
48546142Sjkhint smb2_read(struct ksmbd_work *work);
48652889Sjkhint smb2_write(struct ksmbd_work *work);
48746142Sjkhint smb2_flush(struct ksmbd_work *work);
48846142Sjkhint smb2_cancel(struct ksmbd_work *work);
48946117Sjkhint smb2_lock(struct ksmbd_work *work);
49046117Sjkhint smb2_ioctl(struct ksmbd_work *work);
49146117Sjkhint smb2_oplock_break(struct ksmbd_work *work);
49247058Sjkhint smb2_notify(struct ksmbd_work *ksmbd_work);
49347058Sjkh
49447058Sjkh/*
49547058Sjkh * Get the body of the smb2 message excluding the 4 byte rfc1002 headers
49647058Sjkh * from request/response buffer.
49747058Sjkh */
49847058Sjkhstatic inline void *smb2_get_msg(void *buf)
49947058Sjkh{
50047058Sjkh	return buf + 4;
50147058Sjkh}
50247058Sjkh
50347058Sjkh#endif	/* _SMB2PDU_H */
50421701Sjkh