xref: /linux/fs/smb/server/smb_common.h (revision ce825345dd63f62cdab80a8c45f943bb65511aa1)
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