cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

smb2pdu.h (10428B)


      1/* SPDX-License-Identifier: LGPL-2.1 */
      2/*
      3 *
      4 *   Copyright (c) International Business Machines  Corp., 2009, 2013
      5 *                 Etersoft, 2012
      6 *   Author(s): Steve French (sfrench@us.ibm.com)
      7 *              Pavel Shilovsky (pshilovsky@samba.org) 2012
      8 *
      9 */
     10
     11#ifndef _SMB2PDU_H
     12#define _SMB2PDU_H
     13
     14#include <net/sock.h>
     15#include "cifsacl.h"
     16
     17/* 52 transform hdr + 64 hdr + 88 create rsp */
     18#define SMB2_TRANSFORM_HEADER_SIZE 52
     19#define MAX_SMB2_HDR_SIZE 204
     20
     21/* The total header size for SMB2 read and write */
     22#define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_hdr))
     23
     24/* See MS-SMB2 2.2.43 */
     25struct smb2_rdma_transform {
     26	__le16 RdmaDescriptorOffset;
     27	__le16 RdmaDescriptorLength;
     28	__le32 Channel; /* for values see channel description in smb2 read above */
     29	__le16 TransformCount;
     30	__le16 Reserved1;
     31	__le32 Reserved2;
     32} __packed;
     33
     34/* TransformType */
     35#define SMB2_RDMA_TRANSFORM_TYPE_ENCRYPTION	0x0001
     36#define SMB2_RDMA_TRANSFORM_TYPE_SIGNING	0x0002
     37
     38struct smb2_rdma_crypto_transform {
     39	__le16	TransformType;
     40	__le16	SignatureLength;
     41	__le16	NonceLength;
     42	__u16	Reserved;
     43	__u8	Signature[]; /* variable length */
     44	/* u8 Nonce[] */
     45	/* followed by padding */
     46} __packed;
     47
     48/*
     49 *	Definitions for SMB2 Protocol Data Units (network frames)
     50 *
     51 *  See MS-SMB2.PDF specification for protocol details.
     52 *  The Naming convention is the lower case version of the SMB2
     53 *  command code name for the struct. Note that structures must be packed.
     54 *
     55 */
     56
     57#define COMPOUND_FID 0xFFFFFFFFFFFFFFFFULL
     58
     59#define SYMLINK_ERROR_TAG 0x4c4d5953
     60
     61struct smb2_symlink_err_rsp {
     62	__le32 SymLinkLength;
     63	__le32 SymLinkErrorTag;
     64	__le32 ReparseTag;
     65	__le16 ReparseDataLength;
     66	__le16 UnparsedPathLength;
     67	__le16 SubstituteNameOffset;
     68	__le16 SubstituteNameLength;
     69	__le16 PrintNameOffset;
     70	__le16 PrintNameLength;
     71	__le32 Flags;
     72	__u8  PathBuffer[];
     73} __packed;
     74
     75/* SMB 3.1.1 and later dialects. See MS-SMB2 section 2.2.2.1 */
     76struct smb2_error_context_rsp {
     77	__le32 ErrorDataLength;
     78	__le32 ErrorId;
     79	__u8  ErrorContextData; /* ErrorDataLength long array */
     80} __packed;
     81
     82/* ErrorId values */
     83#define SMB2_ERROR_ID_DEFAULT		0x00000000
     84#define SMB2_ERROR_ID_SHARE_REDIRECT	cpu_to_le32(0x72645253)	/* "rdRS" */
     85
     86/* Defines for Type field below (see MS-SMB2 2.2.2.2.2.1) */
     87#define MOVE_DST_IPADDR_V4	cpu_to_le32(0x00000001)
     88#define MOVE_DST_IPADDR_V6	cpu_to_le32(0x00000002)
     89
     90struct move_dst_ipaddr {
     91	__le32 Type;
     92	__u32  Reserved;
     93	__u8   address[16]; /* IPv4 followed by 12 bytes rsvd or IPv6 address */
     94} __packed;
     95
     96struct share_redirect_error_context_rsp {
     97	__le32 StructureSize;
     98	__le32 NotificationType;
     99	__le32 ResourceNameOffset;
    100	__le32 ResourceNameLength;
    101	__le16 Reserved;
    102	__le16 TargetType;
    103	__le32 IPAddrCount;
    104	struct move_dst_ipaddr IpAddrMoveList[];
    105	/* __u8 ResourceName[] */ /* Name of share as counted Unicode string */
    106} __packed;
    107
    108/*
    109 * Maximum number of iovs we need for an open/create request.
    110 * [0] : struct smb2_create_req
    111 * [1] : path
    112 * [2] : lease context
    113 * [3] : durable context
    114 * [4] : posix context
    115 * [5] : time warp context
    116 * [6] : query id context
    117 * [7] : compound padding
    118 */
    119#define SMB2_CREATE_IOV_SIZE 8
    120
    121/*
    122 * Maximum size of a SMB2_CREATE response is 64 (smb2 header) +
    123 * 88 (fixed part of create response) + 520 (path) + 208 (contexts) +
    124 * 2 bytes of padding.
    125 */
    126#define MAX_SMB2_CREATE_RESPONSE_SIZE 880
    127
    128#define SMB2_LEASE_READ_CACHING_HE	0x01
    129#define SMB2_LEASE_HANDLE_CACHING_HE	0x02
    130#define SMB2_LEASE_WRITE_CACHING_HE	0x04
    131
    132struct create_durable {
    133	struct create_context ccontext;
    134	__u8   Name[8];
    135	union {
    136		__u8  Reserved[16];
    137		struct {
    138			__u64 PersistentFileId;
    139			__u64 VolatileFileId;
    140		} Fid;
    141	} Data;
    142} __packed;
    143
    144/* See MS-SMB2 2.2.13.2.11 */
    145/* Flags */
    146#define SMB2_DHANDLE_FLAG_PERSISTENT	0x00000002
    147struct durable_context_v2 {
    148	__le32 Timeout;
    149	__le32 Flags;
    150	__u64 Reserved;
    151	__u8 CreateGuid[16];
    152} __packed;
    153
    154struct create_durable_v2 {
    155	struct create_context ccontext;
    156	__u8   Name[8];
    157	struct durable_context_v2 dcontext;
    158} __packed;
    159
    160/* See MS-SMB2 2.2.13.2.12 */
    161struct durable_reconnect_context_v2 {
    162	struct {
    163		__u64 PersistentFileId;
    164		__u64 VolatileFileId;
    165	} Fid;
    166	__u8 CreateGuid[16];
    167	__le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
    168} __packed;
    169
    170/* See MS-SMB2 2.2.14.2.9 */
    171struct create_on_disk_id {
    172	struct create_context ccontext;
    173	__u8   Name[8];
    174	__le64 DiskFileId;
    175	__le64 VolumeId;
    176	__u32  Reserved[4];
    177} __packed;
    178
    179/* See MS-SMB2 2.2.14.2.12 */
    180struct durable_reconnect_context_v2_rsp {
    181	__le32 Timeout;
    182	__le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
    183} __packed;
    184
    185struct create_durable_handle_reconnect_v2 {
    186	struct create_context ccontext;
    187	__u8   Name[8];
    188	struct durable_reconnect_context_v2 dcontext;
    189	__u8   Pad[4];
    190} __packed;
    191
    192/* See MS-SMB2 2.2.13.2.5 */
    193struct crt_twarp_ctxt {
    194	struct create_context ccontext;
    195	__u8	Name[8];
    196	__le64	Timestamp;
    197
    198} __packed;
    199
    200/* See MS-SMB2 2.2.13.2.9 */
    201struct crt_query_id_ctxt {
    202	struct create_context ccontext;
    203	__u8	Name[8];
    204} __packed;
    205
    206struct crt_sd_ctxt {
    207	struct create_context ccontext;
    208	__u8	Name[8];
    209	struct smb3_sd sd;
    210} __packed;
    211
    212
    213#define COPY_CHUNK_RES_KEY_SIZE	24
    214struct resume_key_req {
    215	char ResumeKey[COPY_CHUNK_RES_KEY_SIZE];
    216	__le32	ContextLength;	/* MBZ */
    217	char	Context[];	/* ignored, Windows sets to 4 bytes of zero */
    218} __packed;
    219
    220/* this goes in the ioctl buffer when doing a copychunk request */
    221struct copychunk_ioctl {
    222	char SourceKey[COPY_CHUNK_RES_KEY_SIZE];
    223	__le32 ChunkCount; /* we are only sending 1 */
    224	__le32 Reserved;
    225	/* array will only be one chunk long for us */
    226	__le64 SourceOffset;
    227	__le64 TargetOffset;
    228	__le32 Length; /* how many bytes to copy */
    229	__u32 Reserved2;
    230} __packed;
    231
    232struct copychunk_ioctl_rsp {
    233	__le32 ChunksWritten;
    234	__le32 ChunkBytesWritten;
    235	__le32 TotalBytesWritten;
    236} __packed;
    237
    238/* See MS-FSCC 2.3.29 and 2.3.30 */
    239struct get_retrieval_pointer_count_req {
    240	__le64 StartingVcn; /* virtual cluster number (signed) */
    241} __packed;
    242
    243struct get_retrieval_pointer_count_rsp {
    244	__le32 ExtentCount;
    245} __packed;
    246
    247/*
    248 * See MS-FSCC 2.3.33 and 2.3.34
    249 * request is the same as get_retrieval_point_count_req struct above
    250 */
    251struct smb3_extents {
    252	__le64 NextVcn;
    253	__le64 Lcn; /* logical cluster number */
    254} __packed;
    255
    256struct get_retrieval_pointers_refcount_rsp {
    257	__le32 ExtentCount;
    258	__u32  Reserved;
    259	__le64 StartingVcn;
    260	struct smb3_extents extents[];
    261} __packed;
    262
    263/* See MS-DFSC 2.2.2 */
    264struct fsctl_get_dfs_referral_req {
    265	__le16 MaxReferralLevel;
    266	__u8 RequestFileName[];
    267} __packed;
    268
    269/* DFS response is struct get_dfs_refer_rsp */
    270
    271/* See MS-SMB2 2.2.31.3 */
    272struct network_resiliency_req {
    273	__le32 Timeout;
    274	__le32 Reserved;
    275} __packed;
    276/* There is no buffer for the response ie no struct network_resiliency_rsp */
    277
    278#define RSS_CAPABLE	cpu_to_le32(0x00000001)
    279#define RDMA_CAPABLE	cpu_to_le32(0x00000002)
    280
    281#define INTERNETWORK	cpu_to_le16(0x0002)
    282#define INTERNETWORKV6	cpu_to_le16(0x0017)
    283
    284struct network_interface_info_ioctl_rsp {
    285	__le32 Next; /* next interface. zero if this is last one */
    286	__le32 IfIndex;
    287	__le32 Capability; /* RSS or RDMA Capable */
    288	__le32 Reserved;
    289	__le64 LinkSpeed;
    290	__le16 Family;
    291	__u8 Buffer[126];
    292} __packed;
    293
    294struct iface_info_ipv4 {
    295	__be16 Port;
    296	__be32 IPv4Address;
    297	__be64 Reserved;
    298} __packed;
    299
    300struct iface_info_ipv6 {
    301	__be16 Port;
    302	__be32 FlowInfo;
    303	__u8   IPv6Address[16];
    304	__be32 ScopeId;
    305} __packed;
    306
    307#define NO_FILE_ID 0xFFFFFFFFFFFFFFFFULL /* general ioctls to srv not to file */
    308
    309struct compress_ioctl {
    310	__le16 CompressionState; /* See cifspdu.h for possible flag values */
    311} __packed;
    312
    313/*
    314 * Maximum number of iovs we need for an ioctl request.
    315 * [0] : struct smb2_ioctl_req
    316 * [1] : in_data
    317 */
    318#define SMB2_IOCTL_IOV_SIZE 2
    319
    320/*
    321 *	PDU query infolevel structure definitions
    322 *	BB consider moving to a different header
    323 */
    324
    325struct smb2_file_full_ea_info { /* encoding of response for level 15 */
    326	__le32 next_entry_offset;
    327	__u8   flags;
    328	__u8   ea_name_length;
    329	__le16 ea_value_length;
    330	char   ea_data[]; /* \0 terminated name plus value */
    331} __packed; /* level 15 Set */
    332
    333struct smb2_file_reparse_point_info {
    334	__le64 IndexNumber;
    335	__le32 Tag;
    336} __packed;
    337
    338struct smb2_file_network_open_info {
    339	__le64 CreationTime;
    340	__le64 LastAccessTime;
    341	__le64 LastWriteTime;
    342	__le64 ChangeTime;
    343	__le64 AllocationSize;
    344	__le64 EndOfFile;
    345	__le32 Attributes;
    346	__le32 Reserved;
    347} __packed; /* level 34 Query also similar returned in close rsp and open rsp */
    348
    349/* See MS-FSCC 2.4.21 */
    350struct smb2_file_id_information {
    351	__le64	VolumeSerialNumber;
    352	__u64  PersistentFileId; /* opaque endianness */
    353	__u64  VolatileFileId; /* opaque endianness */
    354} __packed; /* level 59 */
    355
    356/* See MS-FSCC 2.4.18 */
    357struct smb2_file_id_extd_directory_info {
    358	__le32 NextEntryOffset;
    359	__u32 FileIndex;
    360	__le64 CreationTime;
    361	__le64 LastAccessTime;
    362	__le64 LastWriteTime;
    363	__le64 ChangeTime;
    364	__le64 EndOfFile;
    365	__le64 AllocationSize;
    366	__le32 FileAttributes;
    367	__le32 FileNameLength;
    368	__le32 EaSize; /* EA size */
    369	__le32 ReparsePointTag; /* valid if FILE_ATTR_REPARSE_POINT set in FileAttributes */
    370	__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit */
    371	char FileName[1];
    372} __packed; /* level 60 */
    373
    374extern char smb2_padding[7];
    375
    376/* equivalent of the contents of SMB3.1.1 POSIX open context response */
    377struct create_posix_rsp {
    378	u32 nlink;
    379	u32 reparse_tag;
    380	u32 mode;
    381	struct cifs_sid owner; /* var-sized on the wire */
    382	struct cifs_sid group; /* var-sized on the wire */
    383} __packed;
    384
    385#define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
    386
    387/*
    388 * SMB2-only POSIX info level for query dir
    389 *
    390 * See posix_info_sid_size(), posix_info_extra_size() and
    391 * posix_info_parse() to help with the handling of this struct.
    392 */
    393struct smb2_posix_info {
    394	__le32 NextEntryOffset;
    395	__u32 Ignored;
    396	__le64 CreationTime;
    397	__le64 LastAccessTime;
    398	__le64 LastWriteTime;
    399	__le64 ChangeTime;
    400	__le64 EndOfFile;
    401	__le64 AllocationSize;
    402	__le32 DosAttributes;
    403	__le64 Inode;
    404	__le32 DeviceId;
    405	__le32 Zero;
    406	/* beginning of POSIX Create Context Response */
    407	__le32 HardLinks;
    408	__le32 ReparseTag;
    409	__le32 Mode;
    410	/*
    411	 * var sized owner SID
    412	 * var sized group SID
    413	 * le32 filenamelength
    414	 * u8  filename[]
    415	 */
    416} __packed;
    417
    418/*
    419 * Parsed version of the above struct. Allows direct access to the
    420 * variable length fields
    421 */
    422struct smb2_posix_info_parsed {
    423	const struct smb2_posix_info *base;
    424	size_t size;
    425	struct cifs_sid owner;
    426	struct cifs_sid group;
    427	int name_len;
    428	const u8 *name;
    429};
    430
    431#endif				/* _SMB2PDU_H */