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