1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2018 Samsung Electronics Co., Ltd. 4 */ 5 6 #ifndef __SMB_SERVER_COMMON_H__ 7 #define __SMB_SERVER_COMMON_H__ 8 9 #include <linux/kernel.h> 10 11 #include "glob.h" 12 #include "../common/smbglob.h" 13 #include "../common/smb2pdu.h" 14 #include "../common/fscc.h" 15 #include "smb2pdu.h" 16 17 /* ksmbd's Specific ERRNO */ 18 #define ESHARE 50000 19 20 #define SMB1_PROT 0 21 #define SMB2_PROT 1 22 #define SMB21_PROT 2 23 /* multi-protocol negotiate request */ 24 #define SMB2X_PROT 3 25 #define SMB30_PROT 4 26 #define SMB302_PROT 5 27 #define SMB311_PROT 6 28 #define BAD_PROT 0xFFFF 29 30 #define SMB_ECHO_INTERVAL (60 * HZ) 31 32 #define MAX_STREAM_PROT_LEN 0x00FFFFFF 33 34 /* Responses when opening a file. */ 35 #define F_SUPERSEDED 0 36 #define F_OPENED 1 37 #define F_CREATED 2 38 #define F_OVERWRITTEN 3 39 40 /* Combinations of file access permission bits */ 41 #define SET_FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA \ 42 | FILE_READ_ATTRIBUTES \ 43 | DELETE | READ_CONTROL | WRITE_DAC \ 44 | WRITE_OWNER | SYNCHRONIZE) 45 #define SET_FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \ 46 | FILE_WRITE_EA \ 47 | FILE_DELETE_CHILD \ 48 | FILE_WRITE_ATTRIBUTES \ 49 | DELETE | READ_CONTROL | WRITE_DAC \ 50 | WRITE_OWNER | SYNCHRONIZE) 51 52 /* generic flags for file open */ 53 #define GENERIC_READ_FLAGS (READ_CONTROL | FILE_READ_DATA | \ 54 FILE_READ_ATTRIBUTES | \ 55 FILE_READ_EA | SYNCHRONIZE) 56 57 #define GENERIC_WRITE_FLAGS (READ_CONTROL | FILE_WRITE_DATA | \ 58 FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | \ 59 FILE_APPEND_DATA | SYNCHRONIZE) 60 61 #define GENERIC_EXECUTE_FLAGS (READ_CONTROL | FILE_EXECUTE | \ 62 FILE_READ_ATTRIBUTES | SYNCHRONIZE) 63 64 #define GENERIC_ALL_FLAGS (DELETE | READ_CONTROL | WRITE_DAC | \ 65 WRITE_OWNER | SYNCHRONIZE | FILE_READ_DATA | \ 66 FILE_WRITE_DATA | FILE_APPEND_DATA | \ 67 FILE_READ_EA | FILE_WRITE_EA | \ 68 FILE_EXECUTE | FILE_DELETE_CHILD | \ 69 FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES) 70 71 #define SMB_COM_NEGOTIATE 0x72 /* See MS-CIFS 2.2.2.1 */ 72 73 /* See MS-CIFS 2.2.3.1 */ 74 #define SMBFLG_RESPONSE 0x80 /* this PDU is a response from server */ 75 76 /* 77 * See MS-CIFS 2.2.3.1 78 * MS-SMB 2.2.3.1 79 */ 80 #define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40) 81 #define SMBFLG2_EXT_SEC cpu_to_le16(0x800) 82 #define SMBFLG2_ERR_STATUS cpu_to_le16(0x4000) 83 #define SMBFLG2_UNICODE cpu_to_le16(0x8000) 84 85 /* See MS-CIFS 2.2.4.52.2 */ 86 struct smb_negotiate_rsp { 87 struct smb_hdr hdr; /* wct = 17 */ 88 __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */ 89 __le16 ByteCount; 90 } __packed; 91 92 struct filesystem_vol_info { 93 __le64 VolumeCreationTime; 94 __le32 SerialNumber; 95 __le32 VolumeLabelSize; 96 __le16 Reserved; 97 __le16 VolumeLabel[]; 98 } __packed; 99 100 #define EXTENDED_INFO_MAGIC 0x43667364 /* Cfsd */ 101 #define STRING_LENGTH 28 102 103 struct fs_extended_info { 104 __le32 magic; 105 __le32 version; 106 __le32 release; 107 __u64 rel_date; 108 char version_string[STRING_LENGTH]; 109 } __packed; 110 111 struct object_id_info { 112 char objid[16]; 113 struct fs_extended_info extended_info; 114 } __packed; 115 116 struct file_names_info { 117 __le32 NextEntryOffset; 118 __u32 FileIndex; 119 __le32 FileNameLength; 120 char FileName[]; 121 } __packed; /* level 0xc FF resp data */ 122 123 struct file_id_both_directory_info { 124 __le32 NextEntryOffset; 125 __u32 FileIndex; 126 __le64 CreationTime; 127 __le64 LastAccessTime; 128 __le64 LastWriteTime; 129 __le64 ChangeTime; 130 __le64 EndOfFile; 131 __le64 AllocationSize; 132 __le32 ExtFileAttributes; 133 __le32 FileNameLength; 134 __le32 EaSize; /* length of the xattrs */ 135 __u8 ShortNameLength; 136 __u8 Reserved; 137 __u8 ShortName[24]; 138 __le16 Reserved2; 139 __le64 UniqueId; 140 char FileName[]; 141 } __packed; 142 143 struct smb_version_ops { 144 u16 (*get_cmd_val)(struct ksmbd_work *swork); 145 int (*init_rsp_hdr)(struct ksmbd_work *swork); 146 void (*set_rsp_status)(struct ksmbd_work *swork, __le32 err); 147 int (*allocate_rsp_buf)(struct ksmbd_work *work); 148 int (*set_rsp_credits)(struct ksmbd_work *work); 149 int (*check_user_session)(struct ksmbd_work *work); 150 int (*get_ksmbd_tcon)(struct ksmbd_work *work); 151 bool (*is_sign_req)(struct ksmbd_work *work, unsigned int command); 152 int (*check_sign_req)(struct ksmbd_work *work); 153 void (*set_sign_rsp)(struct ksmbd_work *work); 154 int (*generate_signingkey)(struct ksmbd_session *sess, struct ksmbd_conn *conn); 155 void (*generate_encryptionkey)(struct ksmbd_conn *conn, struct ksmbd_session *sess); 156 bool (*is_transform_hdr)(void *buf); 157 int (*decrypt_req)(struct ksmbd_work *work); 158 int (*encrypt_resp)(struct ksmbd_work *work); 159 }; 160 161 struct smb_version_cmds { 162 int (*proc)(struct ksmbd_work *swork); 163 }; 164 165 int ksmbd_min_protocol(void); 166 int ksmbd_max_protocol(void); 167 168 int ksmbd_lookup_protocol_idx(char *str); 169 170 int ksmbd_verify_smb_message(struct ksmbd_work *work); 171 bool ksmbd_smb_request(struct ksmbd_conn *conn); 172 173 int ksmbd_lookup_dialect_by_id(__le16 *cli_dialects, __le16 dialects_count); 174 175 int ksmbd_init_smb_server(struct ksmbd_conn *conn); 176 177 struct ksmbd_kstat; 178 int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, 179 int info_level, 180 struct ksmbd_file *dir, 181 struct ksmbd_dir_info *d_info, 182 char *search_pattern, 183 int (*fn)(struct ksmbd_conn *, 184 int, 185 struct ksmbd_dir_info *, 186 struct ksmbd_kstat *)); 187 188 int ksmbd_extract_shortname(struct ksmbd_conn *conn, 189 const char *longname, 190 char *shortname); 191 192 int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command); 193 194 int ksmbd_smb_check_shared_mode(struct file *filp, struct ksmbd_file *curr_fp); 195 int __ksmbd_override_fsids(struct ksmbd_work *work, 196 struct ksmbd_share_config *share); 197 int ksmbd_override_fsids(struct ksmbd_work *work); 198 void ksmbd_revert_fsids(struct ksmbd_work *work); 199 200 unsigned int ksmbd_server_side_copy_max_chunk_count(void); 201 unsigned int ksmbd_server_side_copy_max_chunk_size(void); 202 unsigned int ksmbd_server_side_copy_max_total_size(void); 203 bool is_asterisk(char *p); 204 __le32 smb_map_generic_desired_access(__le32 daccess); 205 #endif /* __SMB_SERVER_COMMON_H__ */ 206