| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| /* | |
| * Copyright (C) 2018 Samsung Electronics Co., Ltd. | |
| */ | |
| #ifndef __SMB_SERVER_COMMON_H__ | |
| #define __SMB_SERVER_COMMON_H__ | |
| #include <linux/kernel.h> | |
| #include "glob.h" | |
| #include "../common/smbglob.h" | |
| #include "../common/smb1pdu.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 | |
| /* 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 /* See MS-CIFS 2.2.2.1 */ | |
| /* See MS-CIFS 2.2.3.1 */ | |
| #define SMBFLG_RESPONSE 0x80 /* this PDU is a response from server */ | |
| /* | |
| * See MS-CIFS 2.2.3.1 | |
| * MS-SMB 2.2.3.1 | |
| */ | |
| #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; | |
| #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); | |
| void (*inc_reqs)(unsigned int cmd, __le32 status); | |
| 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); | |
| const char *ksmbd_get_protocol_string(int version); | |
| 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); | |
| /* | |
| * Get the body of the smb message excluding the 4 byte rfc1002 headers | |
| * from request/response buffer. | |
| */ | |
| static inline void *smb_get_msg(void *buf) | |
| { | |
| return buf + 4; | |
| } | |
| #endif /* __SMB_SERVER_COMMON_H__ */ |