1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2018 Samsung Electronics Co., Ltd. 4 */ 5 6 #ifndef __SMB_COMMON_H__ 7 #define __SMB_COMMON_H__ 8 9 #include <linux/kernel.h> 10 11 #include "glob.h" 12 #include "nterr.h" 13 #include "../common/smbglob.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 struct filesystem_vol_info { 94 __le64 VolumeCreationTime; 95 __le32 SerialNumber; 96 __le32 VolumeLabelSize; 97 __le16 Reserved; 98 __le16 VolumeLabel[]; 99 } __packed; 100 101 #define EXTENDED_INFO_MAGIC 0x43667364 /* Cfsd */ 102 #define STRING_LENGTH 28 103 104 struct fs_extended_info { 105 __le32 magic; 106 __le32 version; 107 __le32 release; 108 __u64 rel_date; 109 char version_string[STRING_LENGTH]; 110 } __packed; 111 112 struct object_id_info { 113 char objid[16]; 114 struct fs_extended_info extended_info; 115 } __packed; 116 117 struct file_names_info { 118 __le32 NextEntryOffset; 119 __u32 FileIndex; 120 __le32 FileNameLength; 121 char FileName[]; 122 } __packed; /* level 0xc FF resp data */ 123 124 struct file_id_both_directory_info { 125 __le32 NextEntryOffset; 126 __u32 FileIndex; 127 __le64 CreationTime; 128 __le64 LastAccessTime; 129 __le64 LastWriteTime; 130 __le64 ChangeTime; 131 __le64 EndOfFile; 132 __le64 AllocationSize; 133 __le32 ExtFileAttributes; 134 __le32 FileNameLength; 135 __le32 EaSize; /* length of the xattrs */ 136 __u8 ShortNameLength; 137 __u8 Reserved; 138 __u8 ShortName[24]; 139 __le16 Reserved2; 140 __le64 UniqueId; 141 char FileName[]; 142 } __packed; 143 144 struct smb_version_ops { 145 u16 (*get_cmd_val)(struct ksmbd_work *swork); 146 int (*init_rsp_hdr)(struct ksmbd_work *swork); 147 void (*set_rsp_status)(struct ksmbd_work *swork, __le32 err); 148 int (*allocate_rsp_buf)(struct ksmbd_work *work); 149 int (*set_rsp_credits)(struct ksmbd_work *work); 150 int (*check_user_session)(struct ksmbd_work *work); 151 int (*get_ksmbd_tcon)(struct ksmbd_work *work); 152 bool (*is_sign_req)(struct ksmbd_work *work, unsigned int command); 153 int (*check_sign_req)(struct ksmbd_work *work); 154 void (*set_sign_rsp)(struct ksmbd_work *work); 155 int (*generate_signingkey)(struct ksmbd_session *sess, struct ksmbd_conn *conn); 156 void (*generate_encryptionkey)(struct ksmbd_conn *conn, struct ksmbd_session *sess); 157 bool (*is_transform_hdr)(void *buf); 158 int (*decrypt_req)(struct ksmbd_work *work); 159 int (*encrypt_resp)(struct ksmbd_work *work); 160 }; 161 162 struct smb_version_cmds { 163 int (*proc)(struct ksmbd_work *swork); 164 }; 165 166 int ksmbd_min_protocol(void); 167 int ksmbd_max_protocol(void); 168 169 int ksmbd_lookup_protocol_idx(char *str); 170 171 int ksmbd_verify_smb_message(struct ksmbd_work *work); 172 bool ksmbd_smb_request(struct ksmbd_conn *conn); 173 174 int ksmbd_lookup_dialect_by_id(__le16 *cli_dialects, __le16 dialects_count); 175 176 int ksmbd_init_smb_server(struct ksmbd_conn *conn); 177 178 struct ksmbd_kstat; 179 int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, 180 int info_level, 181 struct ksmbd_file *dir, 182 struct ksmbd_dir_info *d_info, 183 char *search_pattern, 184 int (*fn)(struct ksmbd_conn *, 185 int, 186 struct ksmbd_dir_info *, 187 struct ksmbd_kstat *)); 188 189 int ksmbd_extract_shortname(struct ksmbd_conn *conn, 190 const char *longname, 191 char *shortname); 192 193 int ksmbd_smb_negotiate_common(struct ksmbd_work *work, unsigned int command); 194 195 int ksmbd_smb_check_shared_mode(struct file *filp, struct ksmbd_file *curr_fp); 196 int __ksmbd_override_fsids(struct ksmbd_work *work, 197 struct ksmbd_share_config *share); 198 int ksmbd_override_fsids(struct ksmbd_work *work); 199 void ksmbd_revert_fsids(struct ksmbd_work *work); 200 201 unsigned int ksmbd_server_side_copy_max_chunk_count(void); 202 unsigned int ksmbd_server_side_copy_max_chunk_size(void); 203 unsigned int ksmbd_server_side_copy_max_total_size(void); 204 bool is_asterisk(char *p); 205 __le32 smb_map_generic_desired_access(__le32 daccess); 206 #endif /* __SMB_COMMON_H__ */ 207