1 /* SPDX-License-Identifier: LGPL-2.1 */
2 /*
3 *
4 * Copyright (c) International Business Machines Corp., 2002,2008
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 */
8 #ifndef _SMB1PROTO_H
9 #define _SMB1PROTO_H
10
11 #include <linux/uidgid_types.h>
12 #include <linux/unaligned.h>
13 #include "../common/smb2pdu.h"
14 #include "cifsglob.h"
15
16 struct cifs_unix_set_info_args {
17 __u64 ctime;
18 __u64 atime;
19 __u64 mtime;
20 __u64 mode;
21 kuid_t uid;
22 kgid_t gid;
23 dev_t device;
24 };
25
26 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
27
28 /*
29 * cifssmb.c
30 */
31 int small_smb_init_no_tc(const int smb_command, const int wct,
32 struct cifs_ses *ses, void **request_buf);
33 int CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses,
34 struct TCP_Server_Info *server);
35 int CIFSTCon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
36 struct cifs_tcon *tcon, const struct nls_table *nls_codepage);
37 int CIFSSMBTDis(const unsigned int xid, struct cifs_tcon *tcon);
38 int CIFSSMBEcho(struct TCP_Server_Info *server);
39 int CIFSSMBLogoff(const unsigned int xid, struct cifs_ses *ses);
40 int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon,
41 const char *fileName, __u16 type,
42 const struct nls_table *nls_codepage, int remap);
43 int CIFSSMBDelFile(const unsigned int xid, struct cifs_tcon *tcon,
44 const char *name, struct cifs_sb_info *cifs_sb,
45 struct dentry *dentry);
46 int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon,
47 const char *name, struct cifs_sb_info *cifs_sb);
48 int CIFSSMBMkDir(const unsigned int xid, struct inode *inode, umode_t mode,
49 struct cifs_tcon *tcon, const char *name,
50 struct cifs_sb_info *cifs_sb);
51 int CIFSPOSIXCreate(const unsigned int xid, struct cifs_tcon *tcon,
52 __u32 posix_flags, __u64 mode, __u16 *netfid,
53 FILE_UNIX_BASIC_INFO *pRetData, __u32 *pOplock,
54 const char *name, const struct nls_table *nls_codepage,
55 int remap);
56 int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon,
57 const char *fileName, const int openDisposition,
58 const int access_flags, const int create_options,
59 __u16 *netfid, int *pOplock, FILE_ALL_INFO *pfile_info,
60 const struct nls_table *nls_codepage, int remap);
61 int CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms,
62 int *oplock, FILE_ALL_INFO *buf);
63 int cifs_async_readv(struct cifs_io_subrequest *rdata);
64 int CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms,
65 unsigned int *nbytes, char **buf, int *pbuf_type);
66 int CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms,
67 unsigned int *nbytes, const char *buf);
68 void cifs_async_writev(struct cifs_io_subrequest *wdata);
69 int CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
70 unsigned int *nbytes, struct kvec *iov, int n_vec);
71 int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon,
72 const __u16 netfid, const __u8 lock_type,
73 const __u32 num_unlock, const __u32 num_lock,
74 LOCKING_ANDX_RANGE *buf);
75 int CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon,
76 const __u16 smb_file_id, const __u32 netpid, const __u64 len,
77 const __u64 offset, const __u32 numUnlock, const __u32 numLock,
78 const __u8 lockType, const bool waitFlag,
79 const __u8 oplock_level);
80 int CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon,
81 const __u16 smb_file_id, const __u32 netpid,
82 const loff_t start_offset, const __u64 len,
83 struct file_lock *pLockData, const __u16 lock_type,
84 const bool waitFlag);
85 int CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon,
86 int smb_file_id);
87 int CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon,
88 int smb_file_id);
89 int CIFSSMBRename(const unsigned int xid, struct cifs_tcon *tcon,
90 struct dentry *source_dentry, const char *from_name,
91 const char *to_name, struct cifs_sb_info *cifs_sb);
92 int CIFSSMBRenameOpenFile(const unsigned int xid, struct cifs_tcon *pTcon,
93 int netfid, const char *target_name,
94 const struct nls_table *nls_codepage, int remap);
95 int CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon,
96 const char *fromName, const char *toName,
97 const struct nls_table *nls_codepage, int remap);
98 int CIFSUnixCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon,
99 const char *fromName, const char *toName,
100 const struct nls_table *nls_codepage, int remap);
101 int CIFSCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon,
102 struct dentry *source_dentry, const char *from_name,
103 const char *to_name, struct cifs_sb_info *cifs_sb);
104 int CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon,
105 const unsigned char *searchName,
106 char **symlinkinfo,
107 const struct nls_table *nls_codepage, int remap);
108 int cifs_query_reparse_point(const unsigned int xid, struct cifs_tcon *tcon,
109 struct cifs_sb_info *cifs_sb,
110 const char *full_path, u32 *tag, struct kvec *rsp,
111 int *rsp_buftype);
112 struct inode *cifs_create_reparse_inode(struct cifs_open_info_data *data,
113 struct super_block *sb,
114 const unsigned int xid,
115 struct cifs_tcon *tcon,
116 const char *full_path, bool directory,
117 struct kvec *reparse_iov,
118 struct kvec *xattr_iov);
119 int CIFSSMB_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
120 __u16 fid);
121 int cifs_do_get_acl(const unsigned int xid, struct cifs_tcon *tcon,
122 const unsigned char *searchName, struct posix_acl **acl,
123 const int acl_type, const struct nls_table *nls_codepage,
124 int remap);
125 int cifs_do_set_acl(const unsigned int xid, struct cifs_tcon *tcon,
126 const unsigned char *fileName, const struct posix_acl *acl,
127 const int acl_type, const struct nls_table *nls_codepage,
128 int remap);
129 int CIFSGetExtAttr(const unsigned int xid, struct cifs_tcon *tcon,
130 const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
131 int CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon,
132 __u16 fid, struct smb_ntsd **acl_inf, __u32 *pbuflen,
133 __u32 info);
134 int CIFSSMBSetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon,
135 __u16 fid, struct smb_ntsd *pntsd, __u32 acllen,
136 int aclflag);
137 int SMBQueryInformation(const unsigned int xid, struct cifs_tcon *tcon,
138 const char *search_name, FILE_ALL_INFO *data,
139 const struct nls_table *nls_codepage, int remap);
140 int CIFSSMBQFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
141 u16 netfid, FILE_ALL_INFO *pFindData);
142 int CIFSSMBQPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
143 const char *search_name, FILE_ALL_INFO *data,
144 int legacy /* old style infolevel */,
145 const struct nls_table *nls_codepage, int remap);
146 int CIFSSMBUnixQFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
147 u16 netfid, FILE_UNIX_BASIC_INFO *pFindData);
148 int CIFSSMBUnixQPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
149 const unsigned char *searchName,
150 FILE_UNIX_BASIC_INFO *pFindData,
151 const struct nls_table *nls_codepage, int remap);
152 int CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon,
153 const char *searchName, struct cifs_sb_info *cifs_sb,
154 __u16 *pnetfid, __u16 search_flags,
155 struct cifs_search_info *psrch_inf, bool msearch);
156 int CIFSFindNext(const unsigned int xid, struct cifs_tcon *tcon,
157 __u16 searchHandle, __u16 search_flags,
158 struct cifs_search_info *psrch_inf);
159 int CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon,
160 const __u16 searchHandle);
161 int CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon,
162 const char *search_name, __u64 *inode_number,
163 const struct nls_table *nls_codepage, int remap);
164 int CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses,
165 const char *search_name,
166 struct dfs_info3_param **target_nodes,
167 unsigned int *num_of_nodes,
168 const struct nls_table *nls_codepage, int remap);
169 int SMBOldQFSInfo(const unsigned int xid, struct cifs_tcon *tcon,
170 struct kstatfs *FSData);
171 int CIFSSMBQFSInfo(const unsigned int xid, struct cifs_tcon *tcon,
172 struct kstatfs *FSData);
173 int CIFSSMBQFSAttributeInfo(const unsigned int xid, struct cifs_tcon *tcon);
174 int CIFSSMBQFSDeviceInfo(const unsigned int xid, struct cifs_tcon *tcon);
175 int CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon);
176 int CIFSSMBSetFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon,
177 __u64 cap);
178 int CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon,
179 struct kstatfs *FSData);
180 int CIFSSMBSetEOF(const unsigned int xid, struct cifs_tcon *tcon,
181 const char *file_name, __u64 size,
182 struct cifs_sb_info *cifs_sb, bool set_allocation,
183 struct dentry *dentry);
184 int CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon,
185 struct cifsFileInfo *cfile, __u64 size,
186 bool set_allocation);
187 int SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon,
188 const char *fileName, __le32 attributes,
189 __le64 write_time, const struct nls_table *nls_codepage,
190 struct cifs_sb_info *cifs_sb);
191 int CIFSSMBSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
192 const FILE_BASIC_INFO *data, __u16 fid,
193 __u32 pid_of_opener);
194 int CIFSSMBSetFileDisposition(const unsigned int xid, struct cifs_tcon *tcon,
195 bool delete_file, __u16 fid,
196 __u32 pid_of_opener);
197 int CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
198 const char *fileName, const FILE_BASIC_INFO *data,
199 const struct nls_table *nls_codepage,
200 struct cifs_sb_info *cifs_sb);
201 int CIFSSMBUnixSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
202 const struct cifs_unix_set_info_args *args, u16 fid,
203 u32 pid_of_opener);
204 int CIFSSMBUnixSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
205 const char *file_name,
206 const struct cifs_unix_set_info_args *args,
207 const struct nls_table *nls_codepage, int remap);
208 ssize_t CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon,
209 const unsigned char *searchName,
210 const unsigned char *ea_name, char *EAData,
211 size_t buf_size, struct cifs_sb_info *cifs_sb);
212 int CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon,
213 const char *fileName, const char *ea_name,
214 const void *ea_value, const __u16 ea_value_len,
215 const struct nls_table *nls_codepage,
216 struct cifs_sb_info *cifs_sb);
217
218 /*
219 * smb1debug.c
220 */
221 void cifs_dump_detail(void *buf, size_t buf_len,
222 struct TCP_Server_Info *server);
223
224 /*
225 * smb1encrypt.c
226 */
227 int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server,
228 __u32 *pexpected_response_sequence_number);
229 int cifs_verify_signature(struct smb_rqst *rqst,
230 struct TCP_Server_Info *server,
231 __u32 expected_sequence_number);
232
233 /*
234 * smb1maperror.c
235 */
236 int map_smb_to_linux_error(char *buf, bool logErr);
237 int map_and_check_smb_error(struct TCP_Server_Info *server,
238 struct mid_q_entry *mid, bool logErr);
239
240 /*
241 * smb1misc.c
242 */
243 unsigned int header_assemble(struct smb_hdr *buffer, char smb_command,
244 const struct cifs_tcon *treeCon, int word_count);
245 bool is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv);
246 unsigned int smbCalcSize(void *buf);
247
248 /*
249 * smb1ops.c
250 */
251 extern struct smb_version_operations smb1_operations;
252 extern struct smb_version_values smb1_values;
253
254 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
255 struct cifs_sb_info *cifs_sb,
256 struct smb3_fs_context *ctx);
257
258 /*
259 * smb1session.c
260 */
261 int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
262 struct TCP_Server_Info *server,
263 const struct nls_table *nls_cp);
264
265 /*
266 * smb1transport.c
267 */
268 struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *server,
269 struct smb_rqst *rqst);
270 int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
271 char *in_buf, unsigned int in_len, int flags);
272 int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
273 bool log_error);
274 struct mid_q_entry *cifs_setup_request(struct cifs_ses *ses,
275 struct TCP_Server_Info *server,
276 struct smb_rqst *rqst);
277 int SendReceive2(const unsigned int xid, struct cifs_ses *ses,
278 struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
279 const int flags, struct kvec *resp_iov);
280 int SendReceive(const unsigned int xid, struct cifs_ses *ses,
281 struct smb_hdr *in_buf, unsigned int in_len,
282 struct smb_hdr *out_buf, int *pbytes_returned,
283 const int flags);
284 bool cifs_check_trans2(struct mid_q_entry *mid, struct TCP_Server_Info *server,
285 char *buf, int malformed);
286 int checkSMB(char *buf, unsigned int pdu_len, unsigned int total_read,
287 struct TCP_Server_Info *server);
288
289
290 static inline __u16
get_mid(const struct smb_hdr * smb)291 get_mid(const struct smb_hdr *smb)
292 {
293 return le16_to_cpu(smb->Mid);
294 }
295
296 static inline bool
compare_mid(__u16 mid,const struct smb_hdr * smb)297 compare_mid(__u16 mid, const struct smb_hdr *smb)
298 {
299 return mid == le16_to_cpu(smb->Mid);
300 }
301
302 #define GETU16(var) (*((__u16 *)var)) /* BB check for endian issues */
303 #define GETU32(var) (*((__u32 *)var)) /* BB check for endian issues */
304
305 /* given a pointer to an smb_hdr, retrieve a void pointer to the ByteCount */
306 static inline void *
BCC(struct smb_hdr * smb)307 BCC(struct smb_hdr *smb)
308 {
309 return (void *)smb + sizeof(*smb) + 2 * smb->WordCount;
310 }
311
312 /* given a pointer to an smb_hdr retrieve the pointer to the byte area */
313 #define pByteArea(smb_var) (BCC(smb_var) + 2)
314
315 /* get the unconverted ByteCount for a SMB packet and return it */
316 static inline __u16
get_bcc(struct smb_hdr * hdr)317 get_bcc(struct smb_hdr *hdr)
318 {
319 __le16 *bc_ptr = (__le16 *)BCC(hdr);
320
321 return get_unaligned_le16(bc_ptr);
322 }
323
324 /* set the ByteCount for a SMB packet in little-endian */
325 static inline void
put_bcc(__u16 count,struct smb_hdr * hdr)326 put_bcc(__u16 count, struct smb_hdr *hdr)
327 {
328 __le16 *bc_ptr = (__le16 *)BCC(hdr);
329
330 put_unaligned_le16(count, bc_ptr);
331 }
332
333 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
334
335 #endif /* _SMB1PROTO_H */
336