/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2018 Samsung Electronics Co., Ltd. */ #ifndef __SMB_COMMON_H__ #define __SMB_COMMON_H__ #include #include "glob.h" #include "nterr.h" #include "../common/smbglob.h" #include "../common/smb2pdu.h" #include "../common/fscc.h" #include "smb2pdu.h" /* ksmbd's Specific ERRNO */ #define ESHARE 50000 #define SMB1_PROT 0 #define SMB2_PROT 1 #define SMB21_PROT 2 /* multi-protocol negotiate request */ #define SMB2X_PROT 3 #define SMB30_PROT 4 #define SMB302_PROT 5 #define SMB311_PROT 6 #define BAD_PROT 0xFFFF #define SMB_ECHO_INTERVAL (60 * HZ) #define MAX_STREAM_PROT_LEN 0x00FFFFFF /* Responses when opening a file. */ #define F_SUPERSEDED 0 #define F_OPENED 1 #define F_CREATED 2 #define F_OVERWRITTEN 3 /* * File Attribute flags */ #define ATTR_POSIX_SEMANTICS 0x01000000 #define ATTR_BACKUP_SEMANTICS 0x02000000 #define ATTR_DELETE_ON_CLOSE 0x04000000 #define ATTR_SEQUENTIAL_SCAN 0x08000000 #define ATTR_RANDOM_ACCESS 0x10000000 #define ATTR_NO_BUFFERING 0x20000000 #define ATTR_WRITE_THROUGH 0x80000000 /* Combinations of file access permission bits */ #define SET_FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA \ | FILE_READ_ATTRIBUTES \ | DELETE | READ_CONTROL | WRITE_DAC \ | WRITE_OWNER | SYNCHRONIZE) #define SET_FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \ | FILE_WRITE_EA \ | FILE_DELETE_CHILD \ | FILE_WRITE_ATTRIBUTES \ | DELETE | READ_CONTROL | WRITE_DAC \ | WRITE_OWNER | SYNCHRONIZE) /* generic flags for file open */ #define GENERIC_READ_FLAGS (READ_CONTROL | FILE_READ_DATA | \ FILE_READ_ATTRIBUTES | \ FILE_READ_EA | SYNCHRONIZE) #define GENERIC_WRITE_FLAGS (READ_CONTROL | FILE_WRITE_DATA | \ FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \ FILE_APPEND_DATA | SYNCHRONIZE) #define GENERIC_EXECUTE_FLAGS (READ_CONTROL | FILE_EXECUTE | \ FILE_READ_ATTRIBUTES | SYNCHRONIZE) #define GENERIC_ALL_FLAGS (DELETE | READ_CONTROL | WRITE_DAC | \ WRITE_OWNER | SYNCHRONIZE | FILE_READ_DATA | \ FILE_WRITE_DATA | FILE_APPEND_DATA | \ FILE_READ_EA | FILE_WRITE_EA | \ FILE_EXECUTE | FILE_DELETE_CHILD | \ FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES) #define SMB_COM_NEGOTIATE 0x72 #define SMB1_CLIENT_GUID_SIZE (16) #define SMBFLG_RESPONSE 0x80 /* this PDU is a response from server */ #define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40) #define SMBFLG2_EXT_SEC cpu_to_le16(0x800) #define SMBFLG2_ERR_STATUS cpu_to_le16(0x4000) #define SMBFLG2_UNICODE cpu_to_le16(0x8000) /* See MS-CIFS 2.2.4.52.2 */ struct smb_negotiate_rsp { struct smb_hdr hdr; /* wct = 17 */ __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */ __le16 ByteCount; } __packed; struct filesystem_attribute_info { __le32 Attributes; __le32 MaxPathNameComponentLength; __le32 FileSystemNameLen; __le16 FileSystemName[]; /* do not have to save this - get subset? */ } __packed; struct filesystem_vol_info { __le64 VolumeCreationTime; __le32 SerialNumber; __le32 VolumeLabelSize; __le16 Reserved; __le16 VolumeLabel[]; } __packed; struct filesystem_info { __le64 TotalAllocationUnits; __le64 FreeAllocationUnits; __le32 SectorsPerAllocationUnit; __le32 BytesPerSector; } __packed; /* size info, level 0x103 */ #define EXTENDED_INFO_MAGIC 0x43667364 /* Cfsd */ #define STRING_LENGTH 28 struct fs_extended_info { __le32 magic; __le32 version; __le32 release; __u64 rel_date; char version_string[STRING_LENGTH]; } __packed; struct object_id_info { char objid[16]; struct fs_extended_info extended_info; } __packed; struct file_names_info { __le32 NextEntryOffset; __u32 FileIndex; __le32 FileNameLength; char FileName[]; } __packed; /* level 0xc FF resp data */ struct file_id_both_directory_info { __le32 NextEntryOffset; __u32 FileIndex; __le64 CreationTime; __le64 LastAccessTime; __le64 LastWriteTime; __le64 ChangeTime; __le64 EndOfFile; __le64 AllocationSize; __le32 ExtFileAttributes; __le32 FileNameLength; __le32 EaSize; /* length of the xattrs */ __u8 ShortNameLength; __u8 Reserved; __u8 ShortName[24]; __le16 Reserved2; __le64 UniqueId; char FileName[]; } __packed; struct smb_version_ops { u16 (*get_cmd_val)(struct ksmbd_work *swork); int (*init_rsp_hdr)(struct ksmbd_work *swork); void (*set_rsp_status)(struct ksmbd_work *swork, __le32 err); int (*allocate_rsp_buf)(struct ksmbd_work *work); int (*set_rsp_credits)(struct ksmbd_work *work); int (*check_user_session)(struct ksmbd_work *work); int (*get_ksmbd_tcon)(struct ksmbd_work *work); bool (*is_sign_req)(struct ksmbd_work *work, unsigned int command); int (*check_sign_req)(struct ksmbd_work *work); void (*set_sign_rsp)(struct ksmbd_work *work); int (*generate_signingkey)(struct ksmbd_session *sess, struct ksmbd_conn *conn); void (*generate_encryptionkey)(struct ksmbd_conn *conn, struct ksmbd_session *sess); bool (*is_transform_hdr)(void *buf); int (*decrypt_req)(struct ksmbd_work *work); int (*encrypt_resp)(struct ksmbd_work *work); }; struct smb_version_cmds { int (*proc)(struct ksmbd_work *swork); }; int ksmbd_min_protocol(void); int ksmbd_max_protocol(void); int ksmbd_lookup_protocol_idx(char *str); int ksmbd_verify_smb_message(struct ksmbd_work *work); bool ksmbd_smb_request(struct ksmbd_conn *conn); int ksmbd_lookup_dialect_by_id(__le16 *cli_dialects, __le16 dialects_count); int ksmbd_init_smb_server(struct ksmbd_conn *conn); struct ksmbd_kstat; int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level, struct ksmbd_file *dir, struct ksmbd_dir_info *d_info, char *search_pattern, int (*fn)(struct ksmbd_conn *, int, struct ksmbd_dir_info *, struct ksmbd_kstat *)); int ksmbd_extract_shortname(struct ksmbd_conn *conn, const char *longname, char *shortname); int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command); int ksmbd_smb_check_shared_mode(struct file *filp, struct ksmbd_file *curr_fp); int __ksmbd_override_fsids(struct ksmbd_work *work, struct ksmbd_share_config *share); int ksmbd_override_fsids(struct ksmbd_work *work); void ksmbd_revert_fsids(struct ksmbd_work *work); unsigned int ksmbd_server_side_copy_max_chunk_count(void); unsigned int ksmbd_server_side_copy_max_chunk_size(void); unsigned int ksmbd_server_side_copy_max_total_size(void); bool is_asterisk(char *p); __le32 smb_map_generic_desired_access(__le32 daccess); #endif /* __SMB_COMMON_H__ */