138c8a9a5SSteve French /* SPDX-License-Identifier: LGPL-2.1 */ 238c8a9a5SSteve French /* 338c8a9a5SSteve French * 438c8a9a5SSteve French * Copyright (c) International Business Machines Corp., 2009, 2013 538c8a9a5SSteve French * Etersoft, 2012 638c8a9a5SSteve French * Author(s): Steve French (sfrench@us.ibm.com) 738c8a9a5SSteve French * Pavel Shilovsky (pshilovsky@samba.org) 2012 838c8a9a5SSteve French * 938c8a9a5SSteve French */ 1038c8a9a5SSteve French 1138c8a9a5SSteve French #ifndef _SMB2PDU_H 1238c8a9a5SSteve French #define _SMB2PDU_H 1338c8a9a5SSteve French 1438c8a9a5SSteve French #include <net/sock.h> 1538c8a9a5SSteve French #include "cifsacl.h" 1638c8a9a5SSteve French 1738c8a9a5SSteve French /* 52 transform hdr + 64 hdr + 88 create rsp */ 1838c8a9a5SSteve French #define SMB2_TRANSFORM_HEADER_SIZE 52 1938c8a9a5SSteve French #define MAX_SMB2_HDR_SIZE 204 2038c8a9a5SSteve French 2138c8a9a5SSteve French /* The total header size for SMB2 read and write */ 2238c8a9a5SSteve French #define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_hdr)) 2338c8a9a5SSteve French 2438c8a9a5SSteve French /* See MS-SMB2 2.2.43 */ 2538c8a9a5SSteve French struct smb2_rdma_transform { 2638c8a9a5SSteve French __le16 RdmaDescriptorOffset; 2738c8a9a5SSteve French __le16 RdmaDescriptorLength; 2838c8a9a5SSteve French __le32 Channel; /* for values see channel description in smb2 read above */ 2938c8a9a5SSteve French __le16 TransformCount; 3038c8a9a5SSteve French __le16 Reserved1; 3138c8a9a5SSteve French __le32 Reserved2; 3238c8a9a5SSteve French } __packed; 3338c8a9a5SSteve French 3438c8a9a5SSteve French /* TransformType */ 3538c8a9a5SSteve French #define SMB2_RDMA_TRANSFORM_TYPE_ENCRYPTION 0x0001 3638c8a9a5SSteve French #define SMB2_RDMA_TRANSFORM_TYPE_SIGNING 0x0002 3738c8a9a5SSteve French 3838c8a9a5SSteve French struct smb2_rdma_crypto_transform { 3938c8a9a5SSteve French __le16 TransformType; 4038c8a9a5SSteve French __le16 SignatureLength; 4138c8a9a5SSteve French __le16 NonceLength; 4238c8a9a5SSteve French __u16 Reserved; 4338c8a9a5SSteve French __u8 Signature[]; /* variable length */ 4438c8a9a5SSteve French /* u8 Nonce[] */ 4538c8a9a5SSteve French /* followed by padding */ 4638c8a9a5SSteve French } __packed; 4738c8a9a5SSteve French 4838c8a9a5SSteve French /* 4938c8a9a5SSteve French * Definitions for SMB2 Protocol Data Units (network frames) 5038c8a9a5SSteve French * 5138c8a9a5SSteve French * See MS-SMB2.PDF specification for protocol details. 5238c8a9a5SSteve French * The Naming convention is the lower case version of the SMB2 5338c8a9a5SSteve French * command code name for the struct. Note that structures must be packed. 5438c8a9a5SSteve French * 5538c8a9a5SSteve French */ 5638c8a9a5SSteve French 5738c8a9a5SSteve French #define COMPOUND_FID 0xFFFFFFFFFFFFFFFFULL 5838c8a9a5SSteve French 5938c8a9a5SSteve French #define SMB2_SYMLINK_STRUCT_SIZE \ 6038c8a9a5SSteve French (sizeof(struct smb2_err_rsp) + sizeof(struct smb2_symlink_err_rsp)) 6138c8a9a5SSteve French 6238c8a9a5SSteve French #define SYMLINK_ERROR_TAG 0x4c4d5953 6338c8a9a5SSteve French 6438c8a9a5SSteve French struct smb2_symlink_err_rsp { 6538c8a9a5SSteve French __le32 SymLinkLength; 6638c8a9a5SSteve French __le32 SymLinkErrorTag; 6738c8a9a5SSteve French __le32 ReparseTag; 6838c8a9a5SSteve French __le16 ReparseDataLength; 6938c8a9a5SSteve French __le16 UnparsedPathLength; 7038c8a9a5SSteve French __le16 SubstituteNameOffset; 7138c8a9a5SSteve French __le16 SubstituteNameLength; 7238c8a9a5SSteve French __le16 PrintNameOffset; 7338c8a9a5SSteve French __le16 PrintNameLength; 7438c8a9a5SSteve French __le32 Flags; 7538c8a9a5SSteve French __u8 PathBuffer[]; 7638c8a9a5SSteve French } __packed; 7738c8a9a5SSteve French 7838c8a9a5SSteve French /* SMB 3.1.1 and later dialects. See MS-SMB2 section 2.2.2.1 */ 7938c8a9a5SSteve French struct smb2_error_context_rsp { 8038c8a9a5SSteve French __le32 ErrorDataLength; 8138c8a9a5SSteve French __le32 ErrorId; 8238c8a9a5SSteve French __u8 ErrorContextData; /* ErrorDataLength long array */ 8338c8a9a5SSteve French } __packed; 8438c8a9a5SSteve French 8538c8a9a5SSteve French /* ErrorId values */ 8638c8a9a5SSteve French #define SMB2_ERROR_ID_DEFAULT 0x00000000 8738c8a9a5SSteve French #define SMB2_ERROR_ID_SHARE_REDIRECT cpu_to_le32(0x72645253) /* "rdRS" */ 8838c8a9a5SSteve French 8938c8a9a5SSteve French /* Defines for Type field below (see MS-SMB2 2.2.2.2.2.1) */ 9038c8a9a5SSteve French #define MOVE_DST_IPADDR_V4 cpu_to_le32(0x00000001) 9138c8a9a5SSteve French #define MOVE_DST_IPADDR_V6 cpu_to_le32(0x00000002) 9238c8a9a5SSteve French 9338c8a9a5SSteve French struct move_dst_ipaddr { 9438c8a9a5SSteve French __le32 Type; 9538c8a9a5SSteve French __u32 Reserved; 9638c8a9a5SSteve French __u8 address[16]; /* IPv4 followed by 12 bytes rsvd or IPv6 address */ 9738c8a9a5SSteve French } __packed; 9838c8a9a5SSteve French 9938c8a9a5SSteve French struct share_redirect_error_context_rsp { 10038c8a9a5SSteve French __le32 StructureSize; 10138c8a9a5SSteve French __le32 NotificationType; 10238c8a9a5SSteve French __le32 ResourceNameOffset; 10338c8a9a5SSteve French __le32 ResourceNameLength; 10438c8a9a5SSteve French __le16 Reserved; 10538c8a9a5SSteve French __le16 TargetType; 10638c8a9a5SSteve French __le32 IPAddrCount; 10738c8a9a5SSteve French struct move_dst_ipaddr IpAddrMoveList[]; 10838c8a9a5SSteve French /* __u8 ResourceName[] */ /* Name of share as counted Unicode string */ 10938c8a9a5SSteve French } __packed; 11038c8a9a5SSteve French 11138c8a9a5SSteve French /* 11238c8a9a5SSteve French * Maximum number of iovs we need for an open/create request. 11338c8a9a5SSteve French * [0] : struct smb2_create_req 11438c8a9a5SSteve French * [1] : path 11538c8a9a5SSteve French * [2] : lease context 11638c8a9a5SSteve French * [3] : durable context 11738c8a9a5SSteve French * [4] : posix context 11838c8a9a5SSteve French * [5] : time warp context 11938c8a9a5SSteve French * [6] : query id context 120df0a8a19SPaulo Alcantara * [7] : create ea context 121df0a8a19SPaulo Alcantara * [8] : compound padding 12238c8a9a5SSteve French */ 123df0a8a19SPaulo Alcantara #define SMB2_CREATE_IOV_SIZE 9 12438c8a9a5SSteve French 12538c8a9a5SSteve French /* 12638c8a9a5SSteve French * Maximum size of a SMB2_CREATE response is 64 (smb2 header) + 12738c8a9a5SSteve French * 88 (fixed part of create response) + 520 (path) + 208 (contexts) + 12838c8a9a5SSteve French * 2 bytes of padding. 12938c8a9a5SSteve French */ 13038c8a9a5SSteve French #define MAX_SMB2_CREATE_RESPONSE_SIZE 880 13138c8a9a5SSteve French 13238c8a9a5SSteve French #define SMB2_LEASE_READ_CACHING_HE 0x01 13338c8a9a5SSteve French #define SMB2_LEASE_HANDLE_CACHING_HE 0x02 13438c8a9a5SSteve French #define SMB2_LEASE_WRITE_CACHING_HE 0x04 13538c8a9a5SSteve French 13638c8a9a5SSteve French 13738c8a9a5SSteve French /* See MS-SMB2 2.2.13.2.11 */ 13838c8a9a5SSteve French /* Flags */ 13938c8a9a5SSteve French #define SMB2_DHANDLE_FLAG_PERSISTENT 0x00000002 14038c8a9a5SSteve French struct durable_context_v2 { 14138c8a9a5SSteve French __le32 Timeout; 14238c8a9a5SSteve French __le32 Flags; 14338c8a9a5SSteve French __u64 Reserved; 14438c8a9a5SSteve French __u8 CreateGuid[16]; 14538c8a9a5SSteve French } __packed; 14638c8a9a5SSteve French 14738c8a9a5SSteve French struct create_durable_v2 { 148d4a079d1SGustavo A. R. Silva struct create_context_hdr ccontext; 14938c8a9a5SSteve French __u8 Name[8]; 15038c8a9a5SSteve French struct durable_context_v2 dcontext; 15138c8a9a5SSteve French } __packed; 15238c8a9a5SSteve French 15338c8a9a5SSteve French /* See MS-SMB2 2.2.13.2.12 */ 15438c8a9a5SSteve French struct durable_reconnect_context_v2 { 15538c8a9a5SSteve French struct { 15638c8a9a5SSteve French __u64 PersistentFileId; 15738c8a9a5SSteve French __u64 VolatileFileId; 15838c8a9a5SSteve French } Fid; 15938c8a9a5SSteve French __u8 CreateGuid[16]; 16038c8a9a5SSteve French __le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */ 16138c8a9a5SSteve French } __packed; 16238c8a9a5SSteve French 16338c8a9a5SSteve French /* See MS-SMB2 2.2.14.2.12 */ 16438c8a9a5SSteve French struct durable_reconnect_context_v2_rsp { 16538c8a9a5SSteve French __le32 Timeout; 16638c8a9a5SSteve French __le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */ 16738c8a9a5SSteve French } __packed; 16838c8a9a5SSteve French 16938c8a9a5SSteve French struct create_durable_handle_reconnect_v2 { 170d4a079d1SGustavo A. R. Silva struct create_context_hdr ccontext; 17138c8a9a5SSteve French __u8 Name[8]; 17238c8a9a5SSteve French struct durable_reconnect_context_v2 dcontext; 17338c8a9a5SSteve French __u8 Pad[4]; 17438c8a9a5SSteve French } __packed; 17538c8a9a5SSteve French 17638c8a9a5SSteve French /* See MS-SMB2 2.2.13.2.5 */ 17738c8a9a5SSteve French struct crt_twarp_ctxt { 178d4a079d1SGustavo A. R. Silva struct create_context_hdr ccontext; 17938c8a9a5SSteve French __u8 Name[8]; 18038c8a9a5SSteve French __le64 Timestamp; 18138c8a9a5SSteve French 18238c8a9a5SSteve French } __packed; 18338c8a9a5SSteve French 18438c8a9a5SSteve French /* See MS-SMB2 2.2.13.2.9 */ 18538c8a9a5SSteve French struct crt_query_id_ctxt { 186d4a079d1SGustavo A. R. Silva struct create_context_hdr ccontext; 18738c8a9a5SSteve French __u8 Name[8]; 18838c8a9a5SSteve French } __packed; 18938c8a9a5SSteve French 19038c8a9a5SSteve French struct crt_sd_ctxt { 191d4a079d1SGustavo A. R. Silva struct create_context_hdr ccontext; 19238c8a9a5SSteve French __u8 Name[8]; 19338c8a9a5SSteve French struct smb3_sd sd; 19438c8a9a5SSteve French } __packed; 19538c8a9a5SSteve French 19638c8a9a5SSteve French 19738c8a9a5SSteve French #define COPY_CHUNK_RES_KEY_SIZE 24 19838c8a9a5SSteve French struct resume_key_req { 19938c8a9a5SSteve French char ResumeKey[COPY_CHUNK_RES_KEY_SIZE]; 20038c8a9a5SSteve French __le32 ContextLength; /* MBZ */ 20138c8a9a5SSteve French char Context[]; /* ignored, Windows sets to 4 bytes of zero */ 20238c8a9a5SSteve French } __packed; 20338c8a9a5SSteve French 20438c8a9a5SSteve French /* this goes in the ioctl buffer when doing a copychunk request */ 20538c8a9a5SSteve French struct copychunk_ioctl { 20638c8a9a5SSteve French char SourceKey[COPY_CHUNK_RES_KEY_SIZE]; 20738c8a9a5SSteve French __le32 ChunkCount; /* we are only sending 1 */ 20838c8a9a5SSteve French __le32 Reserved; 20938c8a9a5SSteve French /* array will only be one chunk long for us */ 21038c8a9a5SSteve French __le64 SourceOffset; 21138c8a9a5SSteve French __le64 TargetOffset; 21238c8a9a5SSteve French __le32 Length; /* how many bytes to copy */ 21338c8a9a5SSteve French __u32 Reserved2; 21438c8a9a5SSteve French } __packed; 21538c8a9a5SSteve French 21638c8a9a5SSteve French struct copychunk_ioctl_rsp { 21738c8a9a5SSteve French __le32 ChunksWritten; 21838c8a9a5SSteve French __le32 ChunkBytesWritten; 21938c8a9a5SSteve French __le32 TotalBytesWritten; 22038c8a9a5SSteve French } __packed; 22138c8a9a5SSteve French 22238c8a9a5SSteve French /* See MS-FSCC 2.3.29 and 2.3.30 */ 22338c8a9a5SSteve French struct get_retrieval_pointer_count_req { 22438c8a9a5SSteve French __le64 StartingVcn; /* virtual cluster number (signed) */ 22538c8a9a5SSteve French } __packed; 22638c8a9a5SSteve French 22738c8a9a5SSteve French struct get_retrieval_pointer_count_rsp { 22838c8a9a5SSteve French __le32 ExtentCount; 22938c8a9a5SSteve French } __packed; 23038c8a9a5SSteve French 23138c8a9a5SSteve French /* 23238c8a9a5SSteve French * See MS-FSCC 2.3.33 and 2.3.34 23338c8a9a5SSteve French * request is the same as get_retrieval_point_count_req struct above 23438c8a9a5SSteve French */ 23538c8a9a5SSteve French struct smb3_extents { 23638c8a9a5SSteve French __le64 NextVcn; 23738c8a9a5SSteve French __le64 Lcn; /* logical cluster number */ 23838c8a9a5SSteve French } __packed; 23938c8a9a5SSteve French 24038c8a9a5SSteve French struct get_retrieval_pointers_refcount_rsp { 24138c8a9a5SSteve French __le32 ExtentCount; 24238c8a9a5SSteve French __u32 Reserved; 24338c8a9a5SSteve French __le64 StartingVcn; 24438c8a9a5SSteve French struct smb3_extents extents[]; 24538c8a9a5SSteve French } __packed; 24638c8a9a5SSteve French 24738c8a9a5SSteve French /* See MS-DFSC 2.2.2 */ 24838c8a9a5SSteve French struct fsctl_get_dfs_referral_req { 24938c8a9a5SSteve French __le16 MaxReferralLevel; 25038c8a9a5SSteve French __u8 RequestFileName[]; 25138c8a9a5SSteve French } __packed; 25238c8a9a5SSteve French 25338c8a9a5SSteve French /* DFS response is struct get_dfs_refer_rsp */ 25438c8a9a5SSteve French 25538c8a9a5SSteve French /* See MS-SMB2 2.2.31.3 */ 25638c8a9a5SSteve French struct network_resiliency_req { 25738c8a9a5SSteve French __le32 Timeout; 25838c8a9a5SSteve French __le32 Reserved; 25938c8a9a5SSteve French } __packed; 26038c8a9a5SSteve French /* There is no buffer for the response ie no struct network_resiliency_rsp */ 26138c8a9a5SSteve French 26238c8a9a5SSteve French #define RSS_CAPABLE cpu_to_le32(0x00000001) 26338c8a9a5SSteve French #define RDMA_CAPABLE cpu_to_le32(0x00000002) 26438c8a9a5SSteve French 26538c8a9a5SSteve French #define INTERNETWORK cpu_to_le16(0x0002) 26638c8a9a5SSteve French #define INTERNETWORKV6 cpu_to_le16(0x0017) 26738c8a9a5SSteve French 26838c8a9a5SSteve French struct network_interface_info_ioctl_rsp { 26938c8a9a5SSteve French __le32 Next; /* next interface. zero if this is last one */ 27038c8a9a5SSteve French __le32 IfIndex; 27138c8a9a5SSteve French __le32 Capability; /* RSS or RDMA Capable */ 27238c8a9a5SSteve French __le32 Reserved; 27338c8a9a5SSteve French __le64 LinkSpeed; 27438c8a9a5SSteve French __le16 Family; 27538c8a9a5SSteve French __u8 Buffer[126]; 27638c8a9a5SSteve French } __packed; 27738c8a9a5SSteve French 27838c8a9a5SSteve French struct iface_info_ipv4 { 27938c8a9a5SSteve French __be16 Port; 28038c8a9a5SSteve French __be32 IPv4Address; 28138c8a9a5SSteve French __be64 Reserved; 28238c8a9a5SSteve French } __packed; 28338c8a9a5SSteve French 28438c8a9a5SSteve French struct iface_info_ipv6 { 28538c8a9a5SSteve French __be16 Port; 28638c8a9a5SSteve French __be32 FlowInfo; 28738c8a9a5SSteve French __u8 IPv6Address[16]; 28838c8a9a5SSteve French __be32 ScopeId; 28938c8a9a5SSteve French } __packed; 29038c8a9a5SSteve French 29138c8a9a5SSteve French #define NO_FILE_ID 0xFFFFFFFFFFFFFFFFULL /* general ioctls to srv not to file */ 29238c8a9a5SSteve French 29338c8a9a5SSteve French struct compress_ioctl { 29438c8a9a5SSteve French __le16 CompressionState; /* See cifspdu.h for possible flag values */ 29538c8a9a5SSteve French } __packed; 29638c8a9a5SSteve French 29738c8a9a5SSteve French /* 29838c8a9a5SSteve French * Maximum number of iovs we need for an ioctl request. 29938c8a9a5SSteve French * [0] : struct smb2_ioctl_req 30038c8a9a5SSteve French * [1] : in_data 30138c8a9a5SSteve French */ 30238c8a9a5SSteve French #define SMB2_IOCTL_IOV_SIZE 2 30338c8a9a5SSteve French 30438c8a9a5SSteve French /* 30538c8a9a5SSteve French * PDU query infolevel structure definitions 30638c8a9a5SSteve French * BB consider moving to a different header 30738c8a9a5SSteve French */ 30838c8a9a5SSteve French 30938c8a9a5SSteve French struct smb2_file_full_ea_info { /* encoding of response for level 15 */ 31038c8a9a5SSteve French __le32 next_entry_offset; 31138c8a9a5SSteve French __u8 flags; 31238c8a9a5SSteve French __u8 ea_name_length; 31338c8a9a5SSteve French __le16 ea_value_length; 31438c8a9a5SSteve French char ea_data[]; /* \0 terminated name plus value */ 31538c8a9a5SSteve French } __packed; /* level 15 Set */ 31638c8a9a5SSteve French 31738c8a9a5SSteve French struct smb2_file_reparse_point_info { 31838c8a9a5SSteve French __le64 IndexNumber; 31938c8a9a5SSteve French __le32 Tag; 32038c8a9a5SSteve French } __packed; 32138c8a9a5SSteve French 32238c8a9a5SSteve French struct smb2_file_network_open_info { 32339ad3d61SGustavo A. R. Silva struct_group_attr(network_open_info, __packed, 32438c8a9a5SSteve French __le64 CreationTime; 32538c8a9a5SSteve French __le64 LastAccessTime; 32638c8a9a5SSteve French __le64 LastWriteTime; 32738c8a9a5SSteve French __le64 ChangeTime; 32838c8a9a5SSteve French __le64 AllocationSize; 32938c8a9a5SSteve French __le64 EndOfFile; 33038c8a9a5SSteve French __le32 Attributes; 3315ca51814SDmitry Antipov ); 33238c8a9a5SSteve French __le32 Reserved; 33338c8a9a5SSteve French } __packed; /* level 34 Query also similar returned in close rsp and open rsp */ 33438c8a9a5SSteve French 33538c8a9a5SSteve French /* See MS-FSCC 2.4.21 */ 33638c8a9a5SSteve French struct smb2_file_id_information { 33738c8a9a5SSteve French __le64 VolumeSerialNumber; 33838c8a9a5SSteve French __u64 PersistentFileId; /* opaque endianness */ 33938c8a9a5SSteve French __u64 VolatileFileId; /* opaque endianness */ 34038c8a9a5SSteve French } __packed; /* level 59 */ 34138c8a9a5SSteve French 34238c8a9a5SSteve French /* See MS-FSCC 2.4.18 */ 34338c8a9a5SSteve French struct smb2_file_id_extd_directory_info { 34438c8a9a5SSteve French __le32 NextEntryOffset; 34538c8a9a5SSteve French __u32 FileIndex; 34638c8a9a5SSteve French __le64 CreationTime; 34738c8a9a5SSteve French __le64 LastAccessTime; 34838c8a9a5SSteve French __le64 LastWriteTime; 34938c8a9a5SSteve French __le64 ChangeTime; 35038c8a9a5SSteve French __le64 EndOfFile; 35138c8a9a5SSteve French __le64 AllocationSize; 35238c8a9a5SSteve French __le32 FileAttributes; 35338c8a9a5SSteve French __le32 FileNameLength; 35438c8a9a5SSteve French __le32 EaSize; /* EA size */ 35538c8a9a5SSteve French __le32 ReparsePointTag; /* valid if FILE_ATTR_REPARSE_POINT set in FileAttributes */ 35638c8a9a5SSteve French __le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit */ 35738c8a9a5SSteve French char FileName[]; 35838c8a9a5SSteve French } __packed; /* level 60 */ 35938c8a9a5SSteve French 36038c8a9a5SSteve French extern char smb2_padding[7]; 36138c8a9a5SSteve French 36238c8a9a5SSteve French /* equivalent of the contents of SMB3.1.1 POSIX open context response */ 36338c8a9a5SSteve French struct create_posix_rsp { 36438c8a9a5SSteve French u32 nlink; 36538c8a9a5SSteve French u32 reparse_tag; 36638c8a9a5SSteve French u32 mode; 367*46c22d37SChenXiaoSong struct smb_sid owner; /* var-sized on the wire */ 368*46c22d37SChenXiaoSong struct smb_sid group; /* var-sized on the wire */ 36938c8a9a5SSteve French } __packed; 37038c8a9a5SSteve French 37138c8a9a5SSteve French #define SMB2_QUERY_DIRECTORY_IOV_SIZE 2 37238c8a9a5SSteve French 37338c8a9a5SSteve French /* 37438c8a9a5SSteve French * SMB2-only POSIX info level for query dir 37538c8a9a5SSteve French * 37638c8a9a5SSteve French * See posix_info_sid_size(), posix_info_extra_size() and 37738c8a9a5SSteve French * posix_info_parse() to help with the handling of this struct. 37838c8a9a5SSteve French */ 37938c8a9a5SSteve French struct smb2_posix_info { 38038c8a9a5SSteve French __le32 NextEntryOffset; 38138c8a9a5SSteve French __u32 Ignored; 38238c8a9a5SSteve French __le64 CreationTime; 38338c8a9a5SSteve French __le64 LastAccessTime; 38438c8a9a5SSteve French __le64 LastWriteTime; 38538c8a9a5SSteve French __le64 ChangeTime; 38638c8a9a5SSteve French __le64 EndOfFile; 38738c8a9a5SSteve French __le64 AllocationSize; 38838c8a9a5SSteve French __le32 DosAttributes; 38938c8a9a5SSteve French __le64 Inode; 39038c8a9a5SSteve French __le32 DeviceId; 39138c8a9a5SSteve French __le32 Zero; 39238c8a9a5SSteve French /* beginning of POSIX Create Context Response */ 39338c8a9a5SSteve French __le32 HardLinks; 39438c8a9a5SSteve French __le32 ReparseTag; 39538c8a9a5SSteve French __le32 Mode; 39638c8a9a5SSteve French /* 39738c8a9a5SSteve French * var sized owner SID 39838c8a9a5SSteve French * var sized group SID 39938c8a9a5SSteve French * le32 filenamelength 40038c8a9a5SSteve French * u8 filename[] 40138c8a9a5SSteve French */ 40238c8a9a5SSteve French } __packed; 40338c8a9a5SSteve French 40438c8a9a5SSteve French /* 40538c8a9a5SSteve French * Parsed version of the above struct. Allows direct access to the 40638c8a9a5SSteve French * variable length fields 40738c8a9a5SSteve French */ 40838c8a9a5SSteve French struct smb2_posix_info_parsed { 40938c8a9a5SSteve French const struct smb2_posix_info *base; 41038c8a9a5SSteve French size_t size; 411*46c22d37SChenXiaoSong struct smb_sid owner; 412*46c22d37SChenXiaoSong struct smb_sid group; 41338c8a9a5SSteve French int name_len; 41438c8a9a5SSteve French const u8 *name; 41538c8a9a5SSteve French }; 41638c8a9a5SSteve French 417df0a8a19SPaulo Alcantara struct smb2_create_ea_ctx { 418d4a079d1SGustavo A. R. Silva struct create_context_hdr ctx; 419df0a8a19SPaulo Alcantara __u8 name[8]; 420df0a8a19SPaulo Alcantara struct smb2_file_full_ea_info ea; 421df0a8a19SPaulo Alcantara } __packed; 422df0a8a19SPaulo Alcantara 4237449d736SSteve French #define SMB2_WSL_XATTR_UID "$LXUID" 4247449d736SSteve French #define SMB2_WSL_XATTR_GID "$LXGID" 4257449d736SSteve French #define SMB2_WSL_XATTR_MODE "$LXMOD" 4267449d736SSteve French #define SMB2_WSL_XATTR_DEV "$LXDEV" 4277449d736SSteve French #define SMB2_WSL_XATTR_NAME_LEN 6 4287449d736SSteve French #define SMB2_WSL_NUM_XATTRS 4 4297449d736SSteve French 4307449d736SSteve French #define SMB2_WSL_XATTR_UID_SIZE 4 4317449d736SSteve French #define SMB2_WSL_XATTR_GID_SIZE 4 4327449d736SSteve French #define SMB2_WSL_XATTR_MODE_SIZE 4 4337449d736SSteve French #define SMB2_WSL_XATTR_DEV_SIZE 8 4347449d736SSteve French 4357449d736SSteve French #define SMB2_WSL_MIN_QUERY_EA_RESP_SIZE \ 4367449d736SSteve French (ALIGN((SMB2_WSL_NUM_XATTRS - 1) * \ 4377449d736SSteve French (SMB2_WSL_XATTR_NAME_LEN + 1 + \ 4387449d736SSteve French sizeof(struct smb2_file_full_ea_info)), 4) + \ 4397449d736SSteve French SMB2_WSL_XATTR_NAME_LEN + 1 + sizeof(struct smb2_file_full_ea_info)) 4407449d736SSteve French 4417449d736SSteve French #define SMB2_WSL_MAX_QUERY_EA_RESP_SIZE \ 4427449d736SSteve French (ALIGN(SMB2_WSL_MIN_QUERY_EA_RESP_SIZE + \ 4437449d736SSteve French SMB2_WSL_XATTR_UID_SIZE + \ 4447449d736SSteve French SMB2_WSL_XATTR_GID_SIZE + \ 4457449d736SSteve French SMB2_WSL_XATTR_MODE_SIZE + \ 4467449d736SSteve French SMB2_WSL_XATTR_DEV_SIZE, 4)) 4477449d736SSteve French 44838c8a9a5SSteve French #endif /* _SMB2PDU_H */ 449