smb2pdu.h (13808B)
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org> 4 * Copyright (C) 2018 Samsung Electronics Co., Ltd. 5 */ 6 7#ifndef _SMB2PDU_H 8#define _SMB2PDU_H 9 10#include "ntlmssp.h" 11#include "smbacl.h" 12 13/*Create Action Flags*/ 14#define FILE_SUPERSEDED 0x00000000 15#define FILE_OPENED 0x00000001 16#define FILE_CREATED 0x00000002 17#define FILE_OVERWRITTEN 0x00000003 18 19/* SMB2 Max Credits */ 20#define SMB2_MAX_CREDITS 8192 21 22/* BB FIXME - analyze following length BB */ 23#define MAX_SMB2_HDR_SIZE 0x78 /* 4 len + 64 hdr + (2*24 wct) + 2 bct + 2 pad */ 24 25#define SMB21_DEFAULT_IOSIZE (1024 * 1024) 26#define SMB3_DEFAULT_TRANS_SIZE (1024 * 1024) 27#define SMB3_MIN_IOSIZE (64 * 1024) 28#define SMB3_MAX_IOSIZE (8 * 1024 * 1024) 29 30/* 31 * Definitions for SMB2 Protocol Data Units (network frames) 32 * 33 * See MS-SMB2.PDF specification for protocol details. 34 * The Naming convention is the lower case version of the SMB2 35 * command code name for the struct. Note that structures must be packed. 36 * 37 */ 38 39struct preauth_integrity_info { 40 /* PreAuth integrity Hash ID */ 41 __le16 Preauth_HashId; 42 /* PreAuth integrity Hash Value */ 43 __u8 Preauth_HashValue[SMB2_PREAUTH_HASH_SIZE]; 44}; 45 46/* offset is sizeof smb2_negotiate_rsp but rounded up to 8 bytes. */ 47#ifdef CONFIG_SMB_SERVER_KERBEROS5 48/* sizeof(struct smb2_negotiate_rsp) = 49 * header(64) + response(64) + GSS_LENGTH(96) + GSS_PADDING(0) 50 */ 51#define OFFSET_OF_NEG_CONTEXT 0xe0 52#else 53/* sizeof(struct smb2_negotiate_rsp) = 54 * header(64) + response(64) + GSS_LENGTH(74) + GSS_PADDING(6) 55 */ 56#define OFFSET_OF_NEG_CONTEXT 0xd0 57#endif 58 59#define SMB2_SESSION_EXPIRED (0) 60#define SMB2_SESSION_IN_PROGRESS BIT(0) 61#define SMB2_SESSION_VALID BIT(1) 62 63struct create_durable_req_v2 { 64 struct create_context ccontext; 65 __u8 Name[8]; 66 __le32 Timeout; 67 __le32 Flags; 68 __u8 Reserved[8]; 69 __u8 CreateGuid[16]; 70} __packed; 71 72struct create_durable_reconn_req { 73 struct create_context ccontext; 74 __u8 Name[8]; 75 union { 76 __u8 Reserved[16]; 77 struct { 78 __u64 PersistentFileId; 79 __u64 VolatileFileId; 80 } Fid; 81 } Data; 82} __packed; 83 84struct create_durable_reconn_v2_req { 85 struct create_context ccontext; 86 __u8 Name[8]; 87 struct { 88 __u64 PersistentFileId; 89 __u64 VolatileFileId; 90 } Fid; 91 __u8 CreateGuid[16]; 92 __le32 Flags; 93} __packed; 94 95struct create_app_inst_id { 96 struct create_context ccontext; 97 __u8 Name[8]; 98 __u8 Reserved[8]; 99 __u8 AppInstanceId[16]; 100} __packed; 101 102struct create_app_inst_id_vers { 103 struct create_context ccontext; 104 __u8 Name[8]; 105 __u8 Reserved[2]; 106 __u8 Padding[4]; 107 __le64 AppInstanceVersionHigh; 108 __le64 AppInstanceVersionLow; 109} __packed; 110 111struct create_mxac_req { 112 struct create_context ccontext; 113 __u8 Name[8]; 114 __le64 Timestamp; 115} __packed; 116 117struct create_alloc_size_req { 118 struct create_context ccontext; 119 __u8 Name[8]; 120 __le64 AllocationSize; 121} __packed; 122 123struct create_durable_rsp { 124 struct create_context ccontext; 125 __u8 Name[8]; 126 union { 127 __u8 Reserved[8]; 128 __u64 data; 129 } Data; 130} __packed; 131 132struct create_durable_v2_rsp { 133 struct create_context ccontext; 134 __u8 Name[8]; 135 __le32 Timeout; 136 __le32 Flags; 137} __packed; 138 139struct create_mxac_rsp { 140 struct create_context ccontext; 141 __u8 Name[8]; 142 __le32 QueryStatus; 143 __le32 MaximalAccess; 144} __packed; 145 146struct create_disk_id_rsp { 147 struct create_context ccontext; 148 __u8 Name[8]; 149 __le64 DiskFileId; 150 __le64 VolumeId; 151 __u8 Reserved[16]; 152} __packed; 153 154/* equivalent of the contents of SMB3.1.1 POSIX open context response */ 155struct create_posix_rsp { 156 struct create_context ccontext; 157 __u8 Name[16]; 158 __le32 nlink; 159 __le32 reparse_tag; 160 __le32 mode; 161 u8 SidBuffer[40]; 162} __packed; 163 164struct smb2_buffer_desc_v1 { 165 __le64 offset; 166 __le32 token; 167 __le32 length; 168} __packed; 169 170#define SMB2_0_IOCTL_IS_FSCTL 0x00000001 171 172struct smb_sockaddr_in { 173 __be16 Port; 174 __be32 IPv4address; 175 __u8 Reserved[8]; 176} __packed; 177 178struct smb_sockaddr_in6 { 179 __be16 Port; 180 __be32 FlowInfo; 181 __u8 IPv6address[16]; 182 __be32 ScopeId; 183} __packed; 184 185#define INTERNETWORK 0x0002 186#define INTERNETWORKV6 0x0017 187 188struct sockaddr_storage_rsp { 189 __le16 Family; 190 union { 191 struct smb_sockaddr_in addr4; 192 struct smb_sockaddr_in6 addr6; 193 }; 194} __packed; 195 196#define RSS_CAPABLE 0x00000001 197#define RDMA_CAPABLE 0x00000002 198 199struct network_interface_info_ioctl_rsp { 200 __le32 Next; /* next interface. zero if this is last one */ 201 __le32 IfIndex; 202 __le32 Capability; /* RSS or RDMA Capable */ 203 __le32 Reserved; 204 __le64 LinkSpeed; 205 char SockAddr_Storage[128]; 206} __packed; 207 208struct file_object_buf_type1_ioctl_rsp { 209 __u8 ObjectId[16]; 210 __u8 BirthVolumeId[16]; 211 __u8 BirthObjectId[16]; 212 __u8 DomainId[16]; 213} __packed; 214 215struct resume_key_ioctl_rsp { 216 __u64 ResumeKey[3]; 217 __le32 ContextLength; 218 __u8 Context[4]; /* ignored, Windows sets to 4 bytes of zero */ 219} __packed; 220 221struct copychunk_ioctl_req { 222 __le64 ResumeKey[3]; 223 __le32 ChunkCount; 224 __le32 Reserved; 225 __u8 Chunks[1]; /* array of srv_copychunk */ 226} __packed; 227 228struct srv_copychunk { 229 __le64 SourceOffset; 230 __le64 TargetOffset; 231 __le32 Length; 232 __le32 Reserved; 233} __packed; 234 235struct copychunk_ioctl_rsp { 236 __le32 ChunksWritten; 237 __le32 ChunkBytesWritten; 238 __le32 TotalBytesWritten; 239} __packed; 240 241struct file_sparse { 242 __u8 SetSparse; 243} __packed; 244 245/* FILE Info response size */ 246#define FILE_DIRECTORY_INFORMATION_SIZE 1 247#define FILE_FULL_DIRECTORY_INFORMATION_SIZE 2 248#define FILE_BOTH_DIRECTORY_INFORMATION_SIZE 3 249#define FILE_BASIC_INFORMATION_SIZE 40 250#define FILE_STANDARD_INFORMATION_SIZE 24 251#define FILE_INTERNAL_INFORMATION_SIZE 8 252#define FILE_EA_INFORMATION_SIZE 4 253#define FILE_ACCESS_INFORMATION_SIZE 4 254#define FILE_NAME_INFORMATION_SIZE 9 255#define FILE_RENAME_INFORMATION_SIZE 10 256#define FILE_LINK_INFORMATION_SIZE 11 257#define FILE_NAMES_INFORMATION_SIZE 12 258#define FILE_DISPOSITION_INFORMATION_SIZE 13 259#define FILE_POSITION_INFORMATION_SIZE 14 260#define FILE_FULL_EA_INFORMATION_SIZE 15 261#define FILE_MODE_INFORMATION_SIZE 4 262#define FILE_ALIGNMENT_INFORMATION_SIZE 4 263#define FILE_ALL_INFORMATION_SIZE 104 264#define FILE_ALLOCATION_INFORMATION_SIZE 19 265#define FILE_END_OF_FILE_INFORMATION_SIZE 20 266#define FILE_ALTERNATE_NAME_INFORMATION_SIZE 8 267#define FILE_STREAM_INFORMATION_SIZE 32 268#define FILE_PIPE_INFORMATION_SIZE 23 269#define FILE_PIPE_LOCAL_INFORMATION_SIZE 24 270#define FILE_PIPE_REMOTE_INFORMATION_SIZE 25 271#define FILE_MAILSLOT_QUERY_INFORMATION_SIZE 26 272#define FILE_MAILSLOT_SET_INFORMATION_SIZE 27 273#define FILE_COMPRESSION_INFORMATION_SIZE 16 274#define FILE_OBJECT_ID_INFORMATION_SIZE 29 275/* Number 30 not defined in documents */ 276#define FILE_MOVE_CLUSTER_INFORMATION_SIZE 31 277#define FILE_QUOTA_INFORMATION_SIZE 32 278#define FILE_REPARSE_POINT_INFORMATION_SIZE 33 279#define FILE_NETWORK_OPEN_INFORMATION_SIZE 56 280#define FILE_ATTRIBUTE_TAG_INFORMATION_SIZE 8 281 282/* FS Info response size */ 283#define FS_DEVICE_INFORMATION_SIZE 8 284#define FS_ATTRIBUTE_INFORMATION_SIZE 16 285#define FS_VOLUME_INFORMATION_SIZE 24 286#define FS_SIZE_INFORMATION_SIZE 24 287#define FS_FULL_SIZE_INFORMATION_SIZE 32 288#define FS_SECTOR_SIZE_INFORMATION_SIZE 28 289#define FS_OBJECT_ID_INFORMATION_SIZE 64 290#define FS_CONTROL_INFORMATION_SIZE 48 291#define FS_POSIX_INFORMATION_SIZE 56 292 293/* FS_ATTRIBUTE_File_System_Name */ 294#define FS_TYPE_SUPPORT_SIZE 44 295struct fs_type_info { 296 char *fs_name; 297 long magic_number; 298} __packed; 299 300/* 301 * PDU query infolevel structure definitions 302 * BB consider moving to a different header 303 */ 304 305struct smb2_file_access_info { 306 __le32 AccessFlags; 307} __packed; 308 309struct smb2_file_alignment_info { 310 __le32 AlignmentRequirement; 311} __packed; 312 313struct smb2_file_basic_info { /* data block encoding of response to level 18 */ 314 __le64 CreationTime; /* Beginning of FILE_BASIC_INFO equivalent */ 315 __le64 LastAccessTime; 316 __le64 LastWriteTime; 317 __le64 ChangeTime; 318 __le32 Attributes; 319 __u32 Pad1; /* End of FILE_BASIC_INFO_INFO equivalent */ 320} __packed; 321 322struct smb2_file_alt_name_info { 323 __le32 FileNameLength; 324 char FileName[]; 325} __packed; 326 327struct smb2_file_stream_info { 328 __le32 NextEntryOffset; 329 __le32 StreamNameLength; 330 __le64 StreamSize; 331 __le64 StreamAllocationSize; 332 char StreamName[]; 333} __packed; 334 335struct smb2_file_ntwrk_info { 336 __le64 CreationTime; 337 __le64 LastAccessTime; 338 __le64 LastWriteTime; 339 __le64 ChangeTime; 340 __le64 AllocationSize; 341 __le64 EndOfFile; 342 __le32 Attributes; 343 __le32 Reserved; 344} __packed; 345 346struct smb2_file_standard_info { 347 __le64 AllocationSize; 348 __le64 EndOfFile; 349 __le32 NumberOfLinks; /* hard links */ 350 __u8 DeletePending; 351 __u8 Directory; 352 __le16 Reserved; 353} __packed; /* level 18 Query */ 354 355struct smb2_file_ea_info { 356 __le32 EASize; 357} __packed; 358 359struct smb2_file_alloc_info { 360 __le64 AllocationSize; 361} __packed; 362 363struct smb2_file_disposition_info { 364 __u8 DeletePending; 365} __packed; 366 367struct smb2_file_pos_info { 368 __le64 CurrentByteOffset; 369} __packed; 370 371#define FILE_MODE_INFO_MASK cpu_to_le32(0x0000100e) 372 373struct smb2_file_mode_info { 374 __le32 Mode; 375} __packed; 376 377#define COMPRESSION_FORMAT_NONE 0x0000 378#define COMPRESSION_FORMAT_LZNT1 0x0002 379 380struct smb2_file_comp_info { 381 __le64 CompressedFileSize; 382 __le16 CompressionFormat; 383 __u8 CompressionUnitShift; 384 __u8 ChunkShift; 385 __u8 ClusterShift; 386 __u8 Reserved[3]; 387} __packed; 388 389struct smb2_file_attr_tag_info { 390 __le32 FileAttributes; 391 __le32 ReparseTag; 392} __packed; 393 394#define SL_RESTART_SCAN 0x00000001 395#define SL_RETURN_SINGLE_ENTRY 0x00000002 396#define SL_INDEX_SPECIFIED 0x00000004 397 398struct smb2_ea_info_req { 399 __le32 NextEntryOffset; 400 __u8 EaNameLength; 401 char name[1]; 402} __packed; /* level 15 Query */ 403 404struct smb2_ea_info { 405 __le32 NextEntryOffset; 406 __u8 Flags; 407 __u8 EaNameLength; 408 __le16 EaValueLength; 409 char name[1]; 410 /* optionally followed by value */ 411} __packed; /* level 15 Query */ 412 413struct create_ea_buf_req { 414 struct create_context ccontext; 415 __u8 Name[8]; 416 struct smb2_ea_info ea; 417} __packed; 418 419struct create_sd_buf_req { 420 struct create_context ccontext; 421 __u8 Name[8]; 422 struct smb_ntsd ntsd; 423} __packed; 424 425struct smb2_posix_info { 426 __le32 NextEntryOffset; 427 __u32 Ignored; 428 __le64 CreationTime; 429 __le64 LastAccessTime; 430 __le64 LastWriteTime; 431 __le64 ChangeTime; 432 __le64 EndOfFile; 433 __le64 AllocationSize; 434 __le32 DosAttributes; 435 __le64 Inode; 436 __le32 DeviceId; 437 __le32 Zero; 438 /* beginning of POSIX Create Context Response */ 439 __le32 HardLinks; 440 __le32 ReparseTag; 441 __le32 Mode; 442 u8 SidBuffer[40]; 443 __le32 name_len; 444 u8 name[1]; 445 /* 446 * var sized owner SID 447 * var sized group SID 448 * le32 filenamelength 449 * u8 filename[] 450 */ 451} __packed; 452 453/* functions */ 454void init_smb2_1_server(struct ksmbd_conn *conn); 455void init_smb3_0_server(struct ksmbd_conn *conn); 456void init_smb3_02_server(struct ksmbd_conn *conn); 457int init_smb3_11_server(struct ksmbd_conn *conn); 458 459void init_smb2_max_read_size(unsigned int sz); 460void init_smb2_max_write_size(unsigned int sz); 461void init_smb2_max_trans_size(unsigned int sz); 462void init_smb2_max_credits(unsigned int sz); 463 464bool is_smb2_neg_cmd(struct ksmbd_work *work); 465bool is_smb2_rsp(struct ksmbd_work *work); 466 467u16 get_smb2_cmd_val(struct ksmbd_work *work); 468void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err); 469int init_smb2_rsp_hdr(struct ksmbd_work *work); 470int smb2_allocate_rsp_buf(struct ksmbd_work *work); 471bool is_chained_smb2_message(struct ksmbd_work *work); 472int init_smb2_neg_rsp(struct ksmbd_work *work); 473void smb2_set_err_rsp(struct ksmbd_work *work); 474int smb2_check_user_session(struct ksmbd_work *work); 475int smb2_get_ksmbd_tcon(struct ksmbd_work *work); 476bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command); 477int smb2_check_sign_req(struct ksmbd_work *work); 478void smb2_set_sign_rsp(struct ksmbd_work *work); 479int smb3_check_sign_req(struct ksmbd_work *work); 480void smb3_set_sign_rsp(struct ksmbd_work *work); 481int find_matching_smb2_dialect(int start_index, __le16 *cli_dialects, 482 __le16 dialects_count); 483struct file_lock *smb_flock_init(struct file *f); 484int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), 485 void **arg); 486void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status); 487struct channel *lookup_chann_list(struct ksmbd_session *sess, 488 struct ksmbd_conn *conn); 489void smb3_preauth_hash_rsp(struct ksmbd_work *work); 490bool smb3_is_transform_hdr(void *buf); 491int smb3_decrypt_req(struct ksmbd_work *work); 492int smb3_encrypt_resp(struct ksmbd_work *work); 493bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work); 494int smb2_set_rsp_credits(struct ksmbd_work *work); 495 496/* smb2 misc functions */ 497int ksmbd_smb2_check_message(struct ksmbd_work *work); 498 499/* smb2 command handlers */ 500int smb2_handle_negotiate(struct ksmbd_work *work); 501int smb2_negotiate_request(struct ksmbd_work *work); 502int smb2_sess_setup(struct ksmbd_work *work); 503int smb2_tree_connect(struct ksmbd_work *work); 504int smb2_tree_disconnect(struct ksmbd_work *work); 505int smb2_session_logoff(struct ksmbd_work *work); 506int smb2_open(struct ksmbd_work *work); 507int smb2_query_info(struct ksmbd_work *work); 508int smb2_query_dir(struct ksmbd_work *work); 509int smb2_close(struct ksmbd_work *work); 510int smb2_echo(struct ksmbd_work *work); 511int smb2_set_info(struct ksmbd_work *work); 512int smb2_read(struct ksmbd_work *work); 513int smb2_write(struct ksmbd_work *work); 514int smb2_flush(struct ksmbd_work *work); 515int smb2_cancel(struct ksmbd_work *work); 516int smb2_lock(struct ksmbd_work *work); 517int smb2_ioctl(struct ksmbd_work *work); 518int smb2_oplock_break(struct ksmbd_work *work); 519int smb2_notify(struct ksmbd_work *ksmbd_work); 520 521/* 522 * Get the body of the smb2 message excluding the 4 byte rfc1002 headers 523 * from request/response buffer. 524 */ 525static inline void *smb2_get_msg(void *buf) 526{ 527 return buf + 4; 528} 529 530#endif /* _SMB2PDU_H */