322 lines · c
1/* SPDX-License-Identifier: LGPL-2.1 */2/*3 *4 * Copyright (c) International Business Machines Corp., 2002, 20115 * Etersoft, 20126 * Author(s): Steve French (sfrench@us.ibm.com)7 * Pavel Shilovsky (pshilovsky@samba.org) 20128 *9 */10#ifndef _SMB2PROTO_H11#define _SMB2PROTO_H12#include <linux/nls.h>13#include <linux/key-type.h>14 15struct statfs;16struct smb_rqst;17 18/*19 *****************************************************************20 * All Prototypes21 *****************************************************************22 */23extern int map_smb2_to_linux_error(char *buf, bool log_err);24extern int smb2_check_message(char *buf, unsigned int length,25 struct TCP_Server_Info *server);26extern unsigned int smb2_calc_size(void *buf);27extern char *smb2_get_data_area_len(int *off, int *len,28 struct smb2_hdr *shdr);29extern __le16 *cifs_convert_path_to_utf16(const char *from,30 struct cifs_sb_info *cifs_sb);31 32extern int smb2_verify_signature(struct smb_rqst *, struct TCP_Server_Info *);33extern int smb2_check_receive(struct mid_q_entry *mid,34 struct TCP_Server_Info *server, bool log_error);35extern struct mid_q_entry *smb2_setup_request(struct cifs_ses *ses,36 struct TCP_Server_Info *,37 struct smb_rqst *rqst);38extern struct mid_q_entry *smb2_setup_async_request(39 struct TCP_Server_Info *server, struct smb_rqst *rqst);40extern struct cifs_ses *smb2_find_smb_ses(struct TCP_Server_Info *server,41 __u64 ses_id);42extern struct cifs_tcon *smb2_find_smb_tcon(struct TCP_Server_Info *server,43 __u64 ses_id, __u32 tid);44extern int smb2_calc_signature(struct smb_rqst *rqst,45 struct TCP_Server_Info *server,46 bool allocate_crypto);47extern int smb3_calc_signature(struct smb_rqst *rqst,48 struct TCP_Server_Info *server,49 bool allocate_crypto);50extern void smb2_echo_request(struct work_struct *work);51extern __le32 smb2_get_lease_state(struct cifsInodeInfo *cinode);52extern bool smb2_is_valid_oplock_break(char *buffer,53 struct TCP_Server_Info *srv);54extern int smb3_handle_read_data(struct TCP_Server_Info *server,55 struct mid_q_entry *mid);56extern int smb2_query_reparse_tag(const unsigned int xid, struct cifs_tcon *tcon,57 struct cifs_sb_info *cifs_sb, const char *path,58 __u32 *reparse_tag);59struct inode *smb2_get_reparse_inode(struct cifs_open_info_data *data,60 struct super_block *sb,61 const unsigned int xid,62 struct cifs_tcon *tcon,63 const char *full_path,64 bool directory,65 struct kvec *reparse_iov,66 struct kvec *xattr_iov);67int smb2_query_reparse_point(const unsigned int xid,68 struct cifs_tcon *tcon,69 struct cifs_sb_info *cifs_sb,70 const char *full_path,71 u32 *tag, struct kvec *rsp,72 int *rsp_buftype);73int smb2_query_path_info(const unsigned int xid,74 struct cifs_tcon *tcon,75 struct cifs_sb_info *cifs_sb,76 const char *full_path,77 struct cifs_open_info_data *data);78extern int smb2_set_path_size(const unsigned int xid, struct cifs_tcon *tcon,79 const char *full_path, __u64 size,80 struct cifs_sb_info *cifs_sb, bool set_alloc,81 struct dentry *dentry);82extern int smb2_set_file_info(struct inode *inode, const char *full_path,83 FILE_BASIC_INFO *buf, const unsigned int xid);84extern int smb311_posix_mkdir(const unsigned int xid, struct inode *inode,85 umode_t mode, struct cifs_tcon *tcon,86 const char *full_path,87 struct cifs_sb_info *cifs_sb);88extern int smb2_mkdir(const unsigned int xid, struct inode *inode,89 umode_t mode, struct cifs_tcon *tcon,90 const char *name, struct cifs_sb_info *cifs_sb);91extern void smb2_mkdir_setinfo(struct inode *inode, const char *full_path,92 struct cifs_sb_info *cifs_sb,93 struct cifs_tcon *tcon, const unsigned int xid);94extern int smb2_rmdir(const unsigned int xid, struct cifs_tcon *tcon,95 const char *name, struct cifs_sb_info *cifs_sb);96extern int smb2_unlink(const unsigned int xid, struct cifs_tcon *tcon,97 const char *name, struct cifs_sb_info *cifs_sb,98 struct dentry *dentry);99int smb2_rename_path(const unsigned int xid,100 struct cifs_tcon *tcon,101 struct dentry *source_dentry,102 const char *from_name, const char *to_name,103 struct cifs_sb_info *cifs_sb);104int smb2_create_hardlink(const unsigned int xid,105 struct cifs_tcon *tcon,106 struct dentry *source_dentry,107 const char *from_name, const char *to_name,108 struct cifs_sb_info *cifs_sb);109extern int smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,110 struct cifs_sb_info *cifs_sb, const unsigned char *path,111 char *pbuf, unsigned int *pbytes_written);112extern int smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,113 struct cifs_sb_info *cifs_sb,114 const unsigned char *path, char *pbuf,115 unsigned int *pbytes_read);116int smb2_parse_symlink_response(struct cifs_sb_info *cifs_sb, const struct kvec *iov, char **path);117int smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms, __u32 *oplock,118 void *buf);119extern int smb2_unlock_range(struct cifsFileInfo *cfile,120 struct file_lock *flock, const unsigned int xid);121extern int smb2_push_mandatory_locks(struct cifsFileInfo *cfile);122extern void smb2_reconnect_server(struct work_struct *work);123extern int smb3_crypto_aead_allocate(struct TCP_Server_Info *server);124extern unsigned long smb_rqst_len(struct TCP_Server_Info *server,125 struct smb_rqst *rqst);126extern void smb2_set_next_command(struct cifs_tcon *tcon,127 struct smb_rqst *rqst);128extern void smb2_set_related(struct smb_rqst *rqst);129extern void smb2_set_replay(struct TCP_Server_Info *server,130 struct smb_rqst *rqst);131extern bool smb2_should_replay(struct cifs_tcon *tcon,132 int *pretries,133 int *pcur_sleep);134 135/*136 * SMB2 Worker functions - most of protocol specific implementation details137 * are contained within these calls.138 */139extern int SMB2_negotiate(const unsigned int xid,140 struct cifs_ses *ses,141 struct TCP_Server_Info *server);142extern int SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses,143 struct TCP_Server_Info *server,144 const struct nls_table *nls_cp);145extern int SMB2_logoff(const unsigned int xid, struct cifs_ses *ses);146extern int SMB2_tcon(const unsigned int xid, struct cifs_ses *ses,147 const char *tree, struct cifs_tcon *tcon,148 const struct nls_table *);149extern int SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon);150extern int SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms,151 __le16 *path, __u8 *oplock,152 struct smb2_file_all_info *buf,153 struct create_posix_rsp *posix,154 struct kvec *err_iov, int *resp_buftype);155extern int SMB2_open_init(struct cifs_tcon *tcon,156 struct TCP_Server_Info *server,157 struct smb_rqst *rqst,158 __u8 *oplock, struct cifs_open_parms *oparms,159 __le16 *path);160extern void SMB2_open_free(struct smb_rqst *rqst);161extern int SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon,162 u64 persistent_fid, u64 volatile_fid, u32 opcode,163 char *in_data, u32 indatalen, u32 maxoutlen,164 char **out_data, u32 *plen /* returned data len */);165extern int SMB2_ioctl_init(struct cifs_tcon *tcon,166 struct TCP_Server_Info *server,167 struct smb_rqst *rqst,168 u64 persistent_fid, u64 volatile_fid, u32 opcode,169 char *in_data, u32 indatalen,170 __u32 max_response_size);171extern void SMB2_ioctl_free(struct smb_rqst *rqst);172extern int SMB2_change_notify(const unsigned int xid, struct cifs_tcon *tcon,173 u64 persistent_fid, u64 volatile_fid, bool watch_tree,174 u32 completion_filter, u32 max_out_data_len,175 char **out_data, u32 *plen /* returned data len */);176 177extern int __SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,178 u64 persistent_fid, u64 volatile_fid,179 struct smb2_file_network_open_info *pbuf);180extern int SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,181 u64 persistent_file_id, u64 volatile_file_id);182extern int SMB2_close_init(struct cifs_tcon *tcon,183 struct TCP_Server_Info *server,184 struct smb_rqst *rqst,185 u64 persistent_fid, u64 volatile_fid,186 bool query_attrs);187extern void SMB2_close_free(struct smb_rqst *rqst);188extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,189 u64 persistent_file_id, u64 volatile_file_id);190extern int SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,191 struct cifs_tcon *tcon,192 struct TCP_Server_Info *server,193 u64 persistent_file_id, u64 volatile_file_id);194extern void SMB2_flush_free(struct smb_rqst *rqst);195extern int SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon,196 u64 persistent_fid, u64 volatile_fid, struct smb311_posix_qinfo *data, u32 *plen);197extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,198 u64 persistent_file_id, u64 volatile_file_id,199 struct smb2_file_all_info *data);200extern int SMB2_query_info_init(struct cifs_tcon *tcon,201 struct TCP_Server_Info *server,202 struct smb_rqst *rqst,203 u64 persistent_fid, u64 volatile_fid,204 u8 info_class, u8 info_type,205 u32 additional_info, size_t output_len,206 size_t input_len, void *input);207extern void SMB2_query_info_free(struct smb_rqst *rqst);208extern int SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon,209 u64 persistent_file_id, u64 volatile_file_id,210 void **data, unsigned int *plen, u32 info);211extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon,212 u64 persistent_fid, u64 volatile_fid,213 __le64 *uniqueid);214extern int smb2_async_readv(struct cifs_io_subrequest *rdata);215extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms,216 unsigned int *nbytes, char **buf, int *buf_type);217extern void smb2_async_writev(struct cifs_io_subrequest *wdata);218extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms,219 unsigned int *nbytes, struct kvec *iov, int n_vec);220extern int SMB2_echo(struct TCP_Server_Info *server);221extern int SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,222 u64 persistent_fid, u64 volatile_fid, int index,223 struct cifs_search_info *srch_inf);224extern int SMB2_query_directory_init(unsigned int xid, struct cifs_tcon *tcon,225 struct TCP_Server_Info *server,226 struct smb_rqst *rqst,227 u64 persistent_fid, u64 volatile_fid,228 int index, int info_level);229extern void SMB2_query_directory_free(struct smb_rqst *rqst);230extern int SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon,231 u64 persistent_fid, u64 volatile_fid, u32 pid,232 loff_t new_eof);233extern int SMB2_set_info_init(struct cifs_tcon *tcon,234 struct TCP_Server_Info *server,235 struct smb_rqst *rqst,236 u64 persistent_fid, u64 volatile_fid, u32 pid,237 u8 info_class, u8 info_type, u32 additional_info,238 void **data, unsigned int *size);239extern void SMB2_set_info_free(struct smb_rqst *rqst);240extern int SMB2_set_acl(const unsigned int xid, struct cifs_tcon *tcon,241 u64 persistent_fid, u64 volatile_fid,242 struct smb_ntsd *pnntsd, int pacllen, int aclflag);243extern int SMB2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,244 u64 persistent_fid, u64 volatile_fid,245 struct smb2_file_full_ea_info *buf, int len);246extern int SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,247 u64 persistent_fid, u64 volatile_fid);248extern int SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon,249 const u64 persistent_fid, const u64 volatile_fid,250 const __u8 oplock_level);251extern int smb2_handle_cancelled_close(struct cifs_tcon *tcon,252 __u64 persistent_fid,253 __u64 volatile_fid);254extern int smb2_handle_cancelled_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server);255void smb2_cancelled_close_fid(struct work_struct *work);256extern int SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,257 u64 persistent_file_id, u64 volatile_file_id,258 struct kstatfs *FSData);259extern int SMB311_posix_qfs_info(const unsigned int xid, struct cifs_tcon *tcon,260 u64 persistent_file_id, u64 volatile_file_id,261 struct kstatfs *FSData);262extern int SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon,263 u64 persistent_file_id, u64 volatile_file_id, int lvl);264extern int SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon,265 const __u64 persist_fid, const __u64 volatile_fid,266 const __u32 pid, const __u64 length, const __u64 offset,267 const __u32 lockFlags, const bool wait);268extern int smb2_lockv(const unsigned int xid, struct cifs_tcon *tcon,269 const __u64 persist_fid, const __u64 volatile_fid,270 const __u32 pid, const __u32 num_lock,271 struct smb2_lock_element *buf);272extern int SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon,273 __u8 *lease_key, const __le32 lease_state);274extern int smb3_validate_negotiate(const unsigned int, struct cifs_tcon *);275 276extern enum securityEnum smb2_select_sectype(struct TCP_Server_Info *,277 enum securityEnum);278int smb2_parse_contexts(struct TCP_Server_Info *server,279 struct kvec *rsp_iov,280 unsigned int *epoch,281 char *lease_key, __u8 *oplock,282 struct smb2_file_all_info *buf,283 struct create_posix_rsp *posix);284 285extern int smb3_encryption_required(const struct cifs_tcon *tcon);286extern int smb2_validate_iov(unsigned int offset, unsigned int buffer_length,287 struct kvec *iov, unsigned int min_buf_size);288extern int smb2_validate_and_copy_iov(unsigned int offset,289 unsigned int buffer_length,290 struct kvec *iov,291 unsigned int minbufsize, char *data);292extern void smb2_copy_fs_info_to_kstatfs(293 struct smb2_fs_full_size_info *pfs_inf,294 struct kstatfs *kst);295extern int smb311_crypto_shash_allocate(struct TCP_Server_Info *server);296extern int smb311_update_preauth_hash(struct cifs_ses *ses,297 struct TCP_Server_Info *server,298 struct kvec *iov, int nvec);299extern int smb2_query_info_compound(const unsigned int xid,300 struct cifs_tcon *tcon,301 const char *path, u32 desired_access,302 u32 class, u32 type, u32 output_len,303 struct kvec *rsp, int *buftype,304 struct cifs_sb_info *cifs_sb);305/* query path info from the server using SMB311 POSIX extensions*/306int smb311_posix_query_path_info(const unsigned int xid,307 struct cifs_tcon *tcon,308 struct cifs_sb_info *cifs_sb,309 const char *full_path,310 struct cifs_open_info_data *data);311int posix_info_parse(const void *beg, const void *end,312 struct smb2_posix_info_parsed *out);313int posix_info_sid_size(const void *beg, const void *end);314int smb2_create_reparse_symlink(const unsigned int xid, struct inode *inode,315 struct dentry *dentry, struct cifs_tcon *tcon,316 const char *full_path, const char *symname);317int smb2_make_nfs_node(unsigned int xid, struct inode *inode,318 struct dentry *dentry, struct cifs_tcon *tcon,319 const char *full_path, umode_t mode, dev_t dev);320 321#endif /* _SMB2PROTO_H */322