162306a36Sopenharmony_ci/* SPDX-License-Identifier: LGPL-2.1 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *   Copyright (c) International Business Machines  Corp., 2009, 2013
562306a36Sopenharmony_ci *                 Etersoft, 2012
662306a36Sopenharmony_ci *   Author(s): Steve French (sfrench@us.ibm.com)
762306a36Sopenharmony_ci *              Pavel Shilovsky (pshilovsky@samba.org) 2012
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef _SMB2PDU_H
1262306a36Sopenharmony_ci#define _SMB2PDU_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <net/sock.h>
1562306a36Sopenharmony_ci#include "cifsacl.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/* 52 transform hdr + 64 hdr + 88 create rsp */
1862306a36Sopenharmony_ci#define SMB2_TRANSFORM_HEADER_SIZE 52
1962306a36Sopenharmony_ci#define MAX_SMB2_HDR_SIZE 204
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* The total header size for SMB2 read and write */
2262306a36Sopenharmony_ci#define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_hdr))
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* See MS-SMB2 2.2.43 */
2562306a36Sopenharmony_cistruct smb2_rdma_transform {
2662306a36Sopenharmony_ci	__le16 RdmaDescriptorOffset;
2762306a36Sopenharmony_ci	__le16 RdmaDescriptorLength;
2862306a36Sopenharmony_ci	__le32 Channel; /* for values see channel description in smb2 read above */
2962306a36Sopenharmony_ci	__le16 TransformCount;
3062306a36Sopenharmony_ci	__le16 Reserved1;
3162306a36Sopenharmony_ci	__le32 Reserved2;
3262306a36Sopenharmony_ci} __packed;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* TransformType */
3562306a36Sopenharmony_ci#define SMB2_RDMA_TRANSFORM_TYPE_ENCRYPTION	0x0001
3662306a36Sopenharmony_ci#define SMB2_RDMA_TRANSFORM_TYPE_SIGNING	0x0002
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct smb2_rdma_crypto_transform {
3962306a36Sopenharmony_ci	__le16	TransformType;
4062306a36Sopenharmony_ci	__le16	SignatureLength;
4162306a36Sopenharmony_ci	__le16	NonceLength;
4262306a36Sopenharmony_ci	__u16	Reserved;
4362306a36Sopenharmony_ci	__u8	Signature[]; /* variable length */
4462306a36Sopenharmony_ci	/* u8 Nonce[] */
4562306a36Sopenharmony_ci	/* followed by padding */
4662306a36Sopenharmony_ci} __packed;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/*
4962306a36Sopenharmony_ci *	Definitions for SMB2 Protocol Data Units (network frames)
5062306a36Sopenharmony_ci *
5162306a36Sopenharmony_ci *  See MS-SMB2.PDF specification for protocol details.
5262306a36Sopenharmony_ci *  The Naming convention is the lower case version of the SMB2
5362306a36Sopenharmony_ci *  command code name for the struct. Note that structures must be packed.
5462306a36Sopenharmony_ci *
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define COMPOUND_FID 0xFFFFFFFFFFFFFFFFULL
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define SMB2_SYMLINK_STRUCT_SIZE \
6062306a36Sopenharmony_ci	(sizeof(struct smb2_err_rsp) + sizeof(struct smb2_symlink_err_rsp))
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define SYMLINK_ERROR_TAG 0x4c4d5953
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct smb2_symlink_err_rsp {
6562306a36Sopenharmony_ci	__le32 SymLinkLength;
6662306a36Sopenharmony_ci	__le32 SymLinkErrorTag;
6762306a36Sopenharmony_ci	__le32 ReparseTag;
6862306a36Sopenharmony_ci	__le16 ReparseDataLength;
6962306a36Sopenharmony_ci	__le16 UnparsedPathLength;
7062306a36Sopenharmony_ci	__le16 SubstituteNameOffset;
7162306a36Sopenharmony_ci	__le16 SubstituteNameLength;
7262306a36Sopenharmony_ci	__le16 PrintNameOffset;
7362306a36Sopenharmony_ci	__le16 PrintNameLength;
7462306a36Sopenharmony_ci	__le32 Flags;
7562306a36Sopenharmony_ci	__u8  PathBuffer[];
7662306a36Sopenharmony_ci} __packed;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/* SMB 3.1.1 and later dialects. See MS-SMB2 section 2.2.2.1 */
7962306a36Sopenharmony_cistruct smb2_error_context_rsp {
8062306a36Sopenharmony_ci	__le32 ErrorDataLength;
8162306a36Sopenharmony_ci	__le32 ErrorId;
8262306a36Sopenharmony_ci	__u8  ErrorContextData; /* ErrorDataLength long array */
8362306a36Sopenharmony_ci} __packed;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/* ErrorId values */
8662306a36Sopenharmony_ci#define SMB2_ERROR_ID_DEFAULT		0x00000000
8762306a36Sopenharmony_ci#define SMB2_ERROR_ID_SHARE_REDIRECT	cpu_to_le32(0x72645253)	/* "rdRS" */
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci/* Defines for Type field below (see MS-SMB2 2.2.2.2.2.1) */
9062306a36Sopenharmony_ci#define MOVE_DST_IPADDR_V4	cpu_to_le32(0x00000001)
9162306a36Sopenharmony_ci#define MOVE_DST_IPADDR_V6	cpu_to_le32(0x00000002)
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct move_dst_ipaddr {
9462306a36Sopenharmony_ci	__le32 Type;
9562306a36Sopenharmony_ci	__u32  Reserved;
9662306a36Sopenharmony_ci	__u8   address[16]; /* IPv4 followed by 12 bytes rsvd or IPv6 address */
9762306a36Sopenharmony_ci} __packed;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistruct share_redirect_error_context_rsp {
10062306a36Sopenharmony_ci	__le32 StructureSize;
10162306a36Sopenharmony_ci	__le32 NotificationType;
10262306a36Sopenharmony_ci	__le32 ResourceNameOffset;
10362306a36Sopenharmony_ci	__le32 ResourceNameLength;
10462306a36Sopenharmony_ci	__le16 Reserved;
10562306a36Sopenharmony_ci	__le16 TargetType;
10662306a36Sopenharmony_ci	__le32 IPAddrCount;
10762306a36Sopenharmony_ci	struct move_dst_ipaddr IpAddrMoveList[];
10862306a36Sopenharmony_ci	/* __u8 ResourceName[] */ /* Name of share as counted Unicode string */
10962306a36Sopenharmony_ci} __packed;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci/*
11262306a36Sopenharmony_ci * Maximum number of iovs we need for an open/create request.
11362306a36Sopenharmony_ci * [0] : struct smb2_create_req
11462306a36Sopenharmony_ci * [1] : path
11562306a36Sopenharmony_ci * [2] : lease context
11662306a36Sopenharmony_ci * [3] : durable context
11762306a36Sopenharmony_ci * [4] : posix context
11862306a36Sopenharmony_ci * [5] : time warp context
11962306a36Sopenharmony_ci * [6] : query id context
12062306a36Sopenharmony_ci * [7] : compound padding
12162306a36Sopenharmony_ci */
12262306a36Sopenharmony_ci#define SMB2_CREATE_IOV_SIZE 8
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/*
12562306a36Sopenharmony_ci * Maximum size of a SMB2_CREATE response is 64 (smb2 header) +
12662306a36Sopenharmony_ci * 88 (fixed part of create response) + 520 (path) + 208 (contexts) +
12762306a36Sopenharmony_ci * 2 bytes of padding.
12862306a36Sopenharmony_ci */
12962306a36Sopenharmony_ci#define MAX_SMB2_CREATE_RESPONSE_SIZE 880
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci#define SMB2_LEASE_READ_CACHING_HE	0x01
13262306a36Sopenharmony_ci#define SMB2_LEASE_HANDLE_CACHING_HE	0x02
13362306a36Sopenharmony_ci#define SMB2_LEASE_WRITE_CACHING_HE	0x04
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci/* See MS-SMB2 2.2.13.2.11 */
13762306a36Sopenharmony_ci/* Flags */
13862306a36Sopenharmony_ci#define SMB2_DHANDLE_FLAG_PERSISTENT	0x00000002
13962306a36Sopenharmony_cistruct durable_context_v2 {
14062306a36Sopenharmony_ci	__le32 Timeout;
14162306a36Sopenharmony_ci	__le32 Flags;
14262306a36Sopenharmony_ci	__u64 Reserved;
14362306a36Sopenharmony_ci	__u8 CreateGuid[16];
14462306a36Sopenharmony_ci} __packed;
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistruct create_durable_v2 {
14762306a36Sopenharmony_ci	struct create_context ccontext;
14862306a36Sopenharmony_ci	__u8   Name[8];
14962306a36Sopenharmony_ci	struct durable_context_v2 dcontext;
15062306a36Sopenharmony_ci} __packed;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/* See MS-SMB2 2.2.13.2.12 */
15362306a36Sopenharmony_cistruct durable_reconnect_context_v2 {
15462306a36Sopenharmony_ci	struct {
15562306a36Sopenharmony_ci		__u64 PersistentFileId;
15662306a36Sopenharmony_ci		__u64 VolatileFileId;
15762306a36Sopenharmony_ci	} Fid;
15862306a36Sopenharmony_ci	__u8 CreateGuid[16];
15962306a36Sopenharmony_ci	__le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
16062306a36Sopenharmony_ci} __packed;
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci/* See MS-SMB2 2.2.14.2.12 */
16362306a36Sopenharmony_cistruct durable_reconnect_context_v2_rsp {
16462306a36Sopenharmony_ci	__le32 Timeout;
16562306a36Sopenharmony_ci	__le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
16662306a36Sopenharmony_ci} __packed;
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistruct create_durable_handle_reconnect_v2 {
16962306a36Sopenharmony_ci	struct create_context ccontext;
17062306a36Sopenharmony_ci	__u8   Name[8];
17162306a36Sopenharmony_ci	struct durable_reconnect_context_v2 dcontext;
17262306a36Sopenharmony_ci	__u8   Pad[4];
17362306a36Sopenharmony_ci} __packed;
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci/* See MS-SMB2 2.2.13.2.5 */
17662306a36Sopenharmony_cistruct crt_twarp_ctxt {
17762306a36Sopenharmony_ci	struct create_context ccontext;
17862306a36Sopenharmony_ci	__u8	Name[8];
17962306a36Sopenharmony_ci	__le64	Timestamp;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci} __packed;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci/* See MS-SMB2 2.2.13.2.9 */
18462306a36Sopenharmony_cistruct crt_query_id_ctxt {
18562306a36Sopenharmony_ci	struct create_context ccontext;
18662306a36Sopenharmony_ci	__u8	Name[8];
18762306a36Sopenharmony_ci} __packed;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistruct crt_sd_ctxt {
19062306a36Sopenharmony_ci	struct create_context ccontext;
19162306a36Sopenharmony_ci	__u8	Name[8];
19262306a36Sopenharmony_ci	struct smb3_sd sd;
19362306a36Sopenharmony_ci} __packed;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci#define COPY_CHUNK_RES_KEY_SIZE	24
19762306a36Sopenharmony_cistruct resume_key_req {
19862306a36Sopenharmony_ci	char ResumeKey[COPY_CHUNK_RES_KEY_SIZE];
19962306a36Sopenharmony_ci	__le32	ContextLength;	/* MBZ */
20062306a36Sopenharmony_ci	char	Context[];	/* ignored, Windows sets to 4 bytes of zero */
20162306a36Sopenharmony_ci} __packed;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci/* this goes in the ioctl buffer when doing a copychunk request */
20462306a36Sopenharmony_cistruct copychunk_ioctl {
20562306a36Sopenharmony_ci	char SourceKey[COPY_CHUNK_RES_KEY_SIZE];
20662306a36Sopenharmony_ci	__le32 ChunkCount; /* we are only sending 1 */
20762306a36Sopenharmony_ci	__le32 Reserved;
20862306a36Sopenharmony_ci	/* array will only be one chunk long for us */
20962306a36Sopenharmony_ci	__le64 SourceOffset;
21062306a36Sopenharmony_ci	__le64 TargetOffset;
21162306a36Sopenharmony_ci	__le32 Length; /* how many bytes to copy */
21262306a36Sopenharmony_ci	__u32 Reserved2;
21362306a36Sopenharmony_ci} __packed;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_cistruct copychunk_ioctl_rsp {
21662306a36Sopenharmony_ci	__le32 ChunksWritten;
21762306a36Sopenharmony_ci	__le32 ChunkBytesWritten;
21862306a36Sopenharmony_ci	__le32 TotalBytesWritten;
21962306a36Sopenharmony_ci} __packed;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci/* See MS-FSCC 2.3.29 and 2.3.30 */
22262306a36Sopenharmony_cistruct get_retrieval_pointer_count_req {
22362306a36Sopenharmony_ci	__le64 StartingVcn; /* virtual cluster number (signed) */
22462306a36Sopenharmony_ci} __packed;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cistruct get_retrieval_pointer_count_rsp {
22762306a36Sopenharmony_ci	__le32 ExtentCount;
22862306a36Sopenharmony_ci} __packed;
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci/*
23162306a36Sopenharmony_ci * See MS-FSCC 2.3.33 and 2.3.34
23262306a36Sopenharmony_ci * request is the same as get_retrieval_point_count_req struct above
23362306a36Sopenharmony_ci */
23462306a36Sopenharmony_cistruct smb3_extents {
23562306a36Sopenharmony_ci	__le64 NextVcn;
23662306a36Sopenharmony_ci	__le64 Lcn; /* logical cluster number */
23762306a36Sopenharmony_ci} __packed;
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistruct get_retrieval_pointers_refcount_rsp {
24062306a36Sopenharmony_ci	__le32 ExtentCount;
24162306a36Sopenharmony_ci	__u32  Reserved;
24262306a36Sopenharmony_ci	__le64 StartingVcn;
24362306a36Sopenharmony_ci	struct smb3_extents extents[];
24462306a36Sopenharmony_ci} __packed;
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci/* See MS-DFSC 2.2.2 */
24762306a36Sopenharmony_cistruct fsctl_get_dfs_referral_req {
24862306a36Sopenharmony_ci	__le16 MaxReferralLevel;
24962306a36Sopenharmony_ci	__u8 RequestFileName[];
25062306a36Sopenharmony_ci} __packed;
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci/* DFS response is struct get_dfs_refer_rsp */
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci/* See MS-SMB2 2.2.31.3 */
25562306a36Sopenharmony_cistruct network_resiliency_req {
25662306a36Sopenharmony_ci	__le32 Timeout;
25762306a36Sopenharmony_ci	__le32 Reserved;
25862306a36Sopenharmony_ci} __packed;
25962306a36Sopenharmony_ci/* There is no buffer for the response ie no struct network_resiliency_rsp */
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci#define RSS_CAPABLE	cpu_to_le32(0x00000001)
26262306a36Sopenharmony_ci#define RDMA_CAPABLE	cpu_to_le32(0x00000002)
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci#define INTERNETWORK	cpu_to_le16(0x0002)
26562306a36Sopenharmony_ci#define INTERNETWORKV6	cpu_to_le16(0x0017)
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cistruct network_interface_info_ioctl_rsp {
26862306a36Sopenharmony_ci	__le32 Next; /* next interface. zero if this is last one */
26962306a36Sopenharmony_ci	__le32 IfIndex;
27062306a36Sopenharmony_ci	__le32 Capability; /* RSS or RDMA Capable */
27162306a36Sopenharmony_ci	__le32 Reserved;
27262306a36Sopenharmony_ci	__le64 LinkSpeed;
27362306a36Sopenharmony_ci	__le16 Family;
27462306a36Sopenharmony_ci	__u8 Buffer[126];
27562306a36Sopenharmony_ci} __packed;
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistruct iface_info_ipv4 {
27862306a36Sopenharmony_ci	__be16 Port;
27962306a36Sopenharmony_ci	__be32 IPv4Address;
28062306a36Sopenharmony_ci	__be64 Reserved;
28162306a36Sopenharmony_ci} __packed;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_cistruct iface_info_ipv6 {
28462306a36Sopenharmony_ci	__be16 Port;
28562306a36Sopenharmony_ci	__be32 FlowInfo;
28662306a36Sopenharmony_ci	__u8   IPv6Address[16];
28762306a36Sopenharmony_ci	__be32 ScopeId;
28862306a36Sopenharmony_ci} __packed;
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci#define NO_FILE_ID 0xFFFFFFFFFFFFFFFFULL /* general ioctls to srv not to file */
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistruct compress_ioctl {
29362306a36Sopenharmony_ci	__le16 CompressionState; /* See cifspdu.h for possible flag values */
29462306a36Sopenharmony_ci} __packed;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/*
29762306a36Sopenharmony_ci * Maximum number of iovs we need for an ioctl request.
29862306a36Sopenharmony_ci * [0] : struct smb2_ioctl_req
29962306a36Sopenharmony_ci * [1] : in_data
30062306a36Sopenharmony_ci */
30162306a36Sopenharmony_ci#define SMB2_IOCTL_IOV_SIZE 2
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci/*
30462306a36Sopenharmony_ci *	PDU query infolevel structure definitions
30562306a36Sopenharmony_ci *	BB consider moving to a different header
30662306a36Sopenharmony_ci */
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_cistruct smb2_file_full_ea_info { /* encoding of response for level 15 */
30962306a36Sopenharmony_ci	__le32 next_entry_offset;
31062306a36Sopenharmony_ci	__u8   flags;
31162306a36Sopenharmony_ci	__u8   ea_name_length;
31262306a36Sopenharmony_ci	__le16 ea_value_length;
31362306a36Sopenharmony_ci	char   ea_data[]; /* \0 terminated name plus value */
31462306a36Sopenharmony_ci} __packed; /* level 15 Set */
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct smb2_file_reparse_point_info {
31762306a36Sopenharmony_ci	__le64 IndexNumber;
31862306a36Sopenharmony_ci	__le32 Tag;
31962306a36Sopenharmony_ci} __packed;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistruct smb2_file_network_open_info {
32262306a36Sopenharmony_ci	struct_group(network_open_info,
32362306a36Sopenharmony_ci		__le64 CreationTime;
32462306a36Sopenharmony_ci		__le64 LastAccessTime;
32562306a36Sopenharmony_ci		__le64 LastWriteTime;
32662306a36Sopenharmony_ci		__le64 ChangeTime;
32762306a36Sopenharmony_ci		__le64 AllocationSize;
32862306a36Sopenharmony_ci		__le64 EndOfFile;
32962306a36Sopenharmony_ci		__le32 Attributes;
33062306a36Sopenharmony_ci	);
33162306a36Sopenharmony_ci	__le32 Reserved;
33262306a36Sopenharmony_ci} __packed; /* level 34 Query also similar returned in close rsp and open rsp */
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci/* See MS-FSCC 2.4.21 */
33562306a36Sopenharmony_cistruct smb2_file_id_information {
33662306a36Sopenharmony_ci	__le64	VolumeSerialNumber;
33762306a36Sopenharmony_ci	__u64  PersistentFileId; /* opaque endianness */
33862306a36Sopenharmony_ci	__u64  VolatileFileId; /* opaque endianness */
33962306a36Sopenharmony_ci} __packed; /* level 59 */
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci/* See MS-FSCC 2.4.18 */
34262306a36Sopenharmony_cistruct smb2_file_id_extd_directory_info {
34362306a36Sopenharmony_ci	__le32 NextEntryOffset;
34462306a36Sopenharmony_ci	__u32 FileIndex;
34562306a36Sopenharmony_ci	__le64 CreationTime;
34662306a36Sopenharmony_ci	__le64 LastAccessTime;
34762306a36Sopenharmony_ci	__le64 LastWriteTime;
34862306a36Sopenharmony_ci	__le64 ChangeTime;
34962306a36Sopenharmony_ci	__le64 EndOfFile;
35062306a36Sopenharmony_ci	__le64 AllocationSize;
35162306a36Sopenharmony_ci	__le32 FileAttributes;
35262306a36Sopenharmony_ci	__le32 FileNameLength;
35362306a36Sopenharmony_ci	__le32 EaSize; /* EA size */
35462306a36Sopenharmony_ci	__le32 ReparsePointTag; /* valid if FILE_ATTR_REPARSE_POINT set in FileAttributes */
35562306a36Sopenharmony_ci	__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit */
35662306a36Sopenharmony_ci	char FileName[];
35762306a36Sopenharmony_ci} __packed; /* level 60 */
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ciextern char smb2_padding[7];
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci/* equivalent of the contents of SMB3.1.1 POSIX open context response */
36262306a36Sopenharmony_cistruct create_posix_rsp {
36362306a36Sopenharmony_ci	u32 nlink;
36462306a36Sopenharmony_ci	u32 reparse_tag;
36562306a36Sopenharmony_ci	u32 mode;
36662306a36Sopenharmony_ci	struct cifs_sid owner; /* var-sized on the wire */
36762306a36Sopenharmony_ci	struct cifs_sid group; /* var-sized on the wire */
36862306a36Sopenharmony_ci} __packed;
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci#define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci/*
37362306a36Sopenharmony_ci * SMB2-only POSIX info level for query dir
37462306a36Sopenharmony_ci *
37562306a36Sopenharmony_ci * See posix_info_sid_size(), posix_info_extra_size() and
37662306a36Sopenharmony_ci * posix_info_parse() to help with the handling of this struct.
37762306a36Sopenharmony_ci */
37862306a36Sopenharmony_cistruct smb2_posix_info {
37962306a36Sopenharmony_ci	__le32 NextEntryOffset;
38062306a36Sopenharmony_ci	__u32 Ignored;
38162306a36Sopenharmony_ci	__le64 CreationTime;
38262306a36Sopenharmony_ci	__le64 LastAccessTime;
38362306a36Sopenharmony_ci	__le64 LastWriteTime;
38462306a36Sopenharmony_ci	__le64 ChangeTime;
38562306a36Sopenharmony_ci	__le64 EndOfFile;
38662306a36Sopenharmony_ci	__le64 AllocationSize;
38762306a36Sopenharmony_ci	__le32 DosAttributes;
38862306a36Sopenharmony_ci	__le64 Inode;
38962306a36Sopenharmony_ci	__le32 DeviceId;
39062306a36Sopenharmony_ci	__le32 Zero;
39162306a36Sopenharmony_ci	/* beginning of POSIX Create Context Response */
39262306a36Sopenharmony_ci	__le32 HardLinks;
39362306a36Sopenharmony_ci	__le32 ReparseTag;
39462306a36Sopenharmony_ci	__le32 Mode;
39562306a36Sopenharmony_ci	/*
39662306a36Sopenharmony_ci	 * var sized owner SID
39762306a36Sopenharmony_ci	 * var sized group SID
39862306a36Sopenharmony_ci	 * le32 filenamelength
39962306a36Sopenharmony_ci	 * u8  filename[]
40062306a36Sopenharmony_ci	 */
40162306a36Sopenharmony_ci} __packed;
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci/*
40462306a36Sopenharmony_ci * Parsed version of the above struct. Allows direct access to the
40562306a36Sopenharmony_ci * variable length fields
40662306a36Sopenharmony_ci */
40762306a36Sopenharmony_cistruct smb2_posix_info_parsed {
40862306a36Sopenharmony_ci	const struct smb2_posix_info *base;
40962306a36Sopenharmony_ci	size_t size;
41062306a36Sopenharmony_ci	struct cifs_sid owner;
41162306a36Sopenharmony_ci	struct cifs_sid group;
41262306a36Sopenharmony_ci	int name_len;
41362306a36Sopenharmony_ci	const u8 *name;
41462306a36Sopenharmony_ci};
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci#endif				/* _SMB2PDU_H */
417