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