| /* SPDX-License-Identifier: LGPL-2.1 */ |
| /* |
| * |
| * Copyright (c) International Business Machines Corp., 2002,2008 |
| * Author(s): Steve French (sfrench@us.ibm.com) |
| * |
| */ |
| #ifndef _SMB1PROTO_H |
| #define _SMB1PROTO_H |
| |
| #include <linux/uidgid_types.h> |
| #include <linux/unaligned.h> |
| #include "../common/smb2pdu.h" |
| #include "cifsglob.h" |
| |
| struct cifs_unix_set_info_args { |
| __u64 ctime; |
| __u64 atime; |
| __u64 mtime; |
| __u64 mode; |
| kuid_t uid; |
| kgid_t gid; |
| dev_t device; |
| }; |
| |
| #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY |
| |
| /* |
| * cifssmb.c |
| */ |
| int small_smb_init_no_tc(const int smb_command, const int wct, |
| struct cifs_ses *ses, void **request_buf); |
| int CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses, |
| struct TCP_Server_Info *server); |
| int CIFSTCon(const unsigned int xid, struct cifs_ses *ses, const char *tree, |
| struct cifs_tcon *tcon, const struct nls_table *nls_codepage); |
| int CIFSSMBTDis(const unsigned int xid, struct cifs_tcon *tcon); |
| int CIFSSMBEcho(struct TCP_Server_Info *server); |
| int CIFSSMBLogoff(const unsigned int xid, struct cifs_ses *ses); |
| int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fileName, __u16 type, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSSMBDelFile(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *name, struct cifs_sb_info *cifs_sb, |
| struct dentry *dentry); |
| int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *name, struct cifs_sb_info *cifs_sb); |
| int CIFSSMBMkDir(const unsigned int xid, struct inode *inode, umode_t mode, |
| struct cifs_tcon *tcon, const char *name, |
| struct cifs_sb_info *cifs_sb); |
| int CIFSPOSIXCreate(const unsigned int xid, struct cifs_tcon *tcon, |
| __u32 posix_flags, __u64 mode, __u16 *netfid, |
| FILE_UNIX_BASIC_INFO *pRetData, __u32 *pOplock, |
| const char *name, const struct nls_table *nls_codepage, |
| int remap); |
| int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fileName, const int openDisposition, |
| const int access_flags, const int create_options, |
| __u16 *netfid, int *pOplock, FILE_ALL_INFO *pfile_info, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms, |
| int *oplock, FILE_ALL_INFO *buf); |
| int cifs_async_readv(struct cifs_io_subrequest *rdata); |
| int CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms, |
| unsigned int *nbytes, char **buf, int *pbuf_type); |
| int CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms, |
| unsigned int *nbytes, const char *buf); |
| void cifs_async_writev(struct cifs_io_subrequest *wdata); |
| int CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms, |
| unsigned int *nbytes, struct kvec *iov, int n_vec); |
| int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon, |
| const __u16 netfid, const __u8 lock_type, |
| const __u32 num_unlock, const __u32 num_lock, |
| LOCKING_ANDX_RANGE *buf); |
| int CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon, |
| const __u16 smb_file_id, const __u32 netpid, const __u64 len, |
| const __u64 offset, const __u32 numUnlock, const __u32 numLock, |
| const __u8 lockType, const bool waitFlag, |
| const __u8 oplock_level); |
| int CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon, |
| const __u16 smb_file_id, const __u32 netpid, |
| const loff_t start_offset, const __u64 len, |
| struct file_lock *pLockData, const __u16 lock_type, |
| const bool waitFlag); |
| int CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon, |
| int smb_file_id); |
| int CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon, |
| int smb_file_id); |
| int CIFSSMBRename(const unsigned int xid, struct cifs_tcon *tcon, |
| struct dentry *source_dentry, const char *from_name, |
| const char *to_name, struct cifs_sb_info *cifs_sb); |
| int CIFSSMBRenameOpenFile(const unsigned int xid, struct cifs_tcon *pTcon, |
| int netfid, const char *target_name, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fromName, const char *toName, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSUnixCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fromName, const char *toName, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon, |
| struct dentry *source_dentry, const char *from_name, |
| const char *to_name, struct cifs_sb_info *cifs_sb); |
| int CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, |
| const unsigned char *searchName, |
| char **symlinkinfo, |
| const struct nls_table *nls_codepage, int remap); |
| int cifs_query_reparse_point(const unsigned int xid, struct cifs_tcon *tcon, |
| struct cifs_sb_info *cifs_sb, |
| const char *full_path, u32 *tag, struct kvec *rsp, |
| int *rsp_buftype); |
| struct inode *cifs_create_reparse_inode(struct cifs_open_info_data *data, |
| struct super_block *sb, |
| const unsigned int xid, |
| struct cifs_tcon *tcon, |
| const char *full_path, bool directory, |
| struct kvec *reparse_iov, |
| struct kvec *xattr_iov); |
| int CIFSSMB_set_compression(const unsigned int xid, struct cifs_tcon *tcon, |
| __u16 fid); |
| int cifs_do_get_acl(const unsigned int xid, struct cifs_tcon *tcon, |
| const unsigned char *searchName, struct posix_acl **acl, |
| const int acl_type, const struct nls_table *nls_codepage, |
| int remap); |
| int cifs_do_set_acl(const unsigned int xid, struct cifs_tcon *tcon, |
| const unsigned char *fileName, const struct posix_acl *acl, |
| const int acl_type, const struct nls_table *nls_codepage, |
| int remap); |
| int CIFSGetExtAttr(const unsigned int xid, struct cifs_tcon *tcon, |
| const int netfid, __u64 *pExtAttrBits, __u64 *pMask); |
| int CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, |
| __u16 fid, struct smb_ntsd **acl_inf, __u32 *pbuflen, |
| __u32 info); |
| int CIFSSMBSetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, |
| __u16 fid, struct smb_ntsd *pntsd, __u32 acllen, |
| int aclflag); |
| int SMBQueryInformation(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *search_name, FILE_ALL_INFO *data, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSSMBQFileInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| u16 netfid, FILE_ALL_INFO *pFindData); |
| int CIFSSMBQPathInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *search_name, FILE_ALL_INFO *data, |
| int legacy /* old style infolevel */, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSSMBUnixQFileInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| u16 netfid, FILE_UNIX_BASIC_INFO *pFindData); |
| int CIFSSMBUnixQPathInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| const unsigned char *searchName, |
| FILE_UNIX_BASIC_INFO *pFindData, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *searchName, struct cifs_sb_info *cifs_sb, |
| __u16 *pnetfid, __u16 search_flags, |
| struct cifs_search_info *psrch_inf, bool msearch); |
| int CIFSFindNext(const unsigned int xid, struct cifs_tcon *tcon, |
| __u16 searchHandle, __u16 search_flags, |
| struct cifs_search_info *psrch_inf); |
| int CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon, |
| const __u16 searchHandle); |
| int CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *search_name, __u64 *inode_number, |
| const struct nls_table *nls_codepage, int remap); |
| int CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses, |
| const char *search_name, |
| struct dfs_info3_param **target_nodes, |
| unsigned int *num_of_nodes, |
| const struct nls_table *nls_codepage, int remap); |
| int SMBOldQFSInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| struct kstatfs *FSData); |
| int CIFSSMBQFSInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| struct kstatfs *FSData); |
| int CIFSSMBQFSAttributeInfo(const unsigned int xid, struct cifs_tcon *tcon); |
| int CIFSSMBQFSDeviceInfo(const unsigned int xid, struct cifs_tcon *tcon); |
| int CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon); |
| int CIFSSMBSetFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| __u64 cap); |
| int CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| struct kstatfs *FSData); |
| int CIFSSMBSetEOF(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *file_name, __u64 size, |
| struct cifs_sb_info *cifs_sb, bool set_allocation, |
| struct dentry *dentry); |
| int CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon, |
| struct cifsFileInfo *cfile, __u64 size, |
| bool set_allocation); |
| int SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fileName, __le32 attributes, |
| __le64 write_time, const struct nls_table *nls_codepage, |
| struct cifs_sb_info *cifs_sb); |
| int CIFSSMBSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| const FILE_BASIC_INFO *data, __u16 fid, |
| __u32 pid_of_opener); |
| int CIFSSMBSetFileDisposition(const unsigned int xid, struct cifs_tcon *tcon, |
| bool delete_file, __u16 fid, |
| __u32 pid_of_opener); |
| int CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fileName, const FILE_BASIC_INFO *data, |
| const struct nls_table *nls_codepage, |
| struct cifs_sb_info *cifs_sb); |
| int CIFSSMBUnixSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| const struct cifs_unix_set_info_args *args, u16 fid, |
| u32 pid_of_opener); |
| int CIFSSMBUnixSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *file_name, |
| const struct cifs_unix_set_info_args *args, |
| const struct nls_table *nls_codepage, int remap); |
| ssize_t CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon, |
| const unsigned char *searchName, |
| const unsigned char *ea_name, char *EAData, |
| size_t buf_size, struct cifs_sb_info *cifs_sb); |
| int CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon, |
| const char *fileName, const char *ea_name, |
| const void *ea_value, const __u16 ea_value_len, |
| const struct nls_table *nls_codepage, |
| struct cifs_sb_info *cifs_sb); |
| |
| /* |
| * smb1debug.c |
| */ |
| void cifs_dump_detail(void *buf, size_t buf_len, |
| struct TCP_Server_Info *server); |
| |
| /* |
| * smb1encrypt.c |
| */ |
| int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server, |
| __u32 *pexpected_response_sequence_number); |
| int cifs_verify_signature(struct smb_rqst *rqst, |
| struct TCP_Server_Info *server, |
| __u32 expected_sequence_number); |
| |
| /* |
| * smb1maperror.c |
| */ |
| int map_smb_to_linux_error(char *buf, bool logErr); |
| int map_and_check_smb_error(struct TCP_Server_Info *server, |
| struct mid_q_entry *mid, bool logErr); |
| |
| /* |
| * smb1misc.c |
| */ |
| unsigned int header_assemble(struct smb_hdr *buffer, char smb_command, |
| const struct cifs_tcon *treeCon, int word_count); |
| bool is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv); |
| unsigned int smbCalcSize(void *buf); |
| |
| /* |
| * smb1ops.c |
| */ |
| extern struct smb_version_operations smb1_operations; |
| extern struct smb_version_values smb1_values; |
| |
| void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon, |
| struct cifs_sb_info *cifs_sb, |
| struct smb3_fs_context *ctx); |
| |
| /* |
| * smb1session.c |
| */ |
| int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses, |
| struct TCP_Server_Info *server, |
| const struct nls_table *nls_cp); |
| |
| /* |
| * smb1transport.c |
| */ |
| struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *server, |
| struct smb_rqst *rqst); |
| int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses, |
| char *in_buf, unsigned int in_len, int flags); |
| int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, |
| bool log_error); |
| struct mid_q_entry *cifs_setup_request(struct cifs_ses *ses, |
| struct TCP_Server_Info *server, |
| struct smb_rqst *rqst); |
| int SendReceive2(const unsigned int xid, struct cifs_ses *ses, |
| struct kvec *iov, int n_vec, int *resp_buf_type /* ret */, |
| const int flags, struct kvec *resp_iov); |
| int SendReceive(const unsigned int xid, struct cifs_ses *ses, |
| struct smb_hdr *in_buf, unsigned int in_len, |
| struct smb_hdr *out_buf, int *pbytes_returned, |
| const int flags); |
| bool cifs_check_trans2(struct mid_q_entry *mid, struct TCP_Server_Info *server, |
| char *buf, int malformed); |
| int checkSMB(char *buf, unsigned int pdu_len, unsigned int total_read, |
| struct TCP_Server_Info *server); |
| |
| |
| static inline __u16 |
| get_mid(const struct smb_hdr *smb) |
| { |
| return le16_to_cpu(smb->Mid); |
| } |
| |
| static inline bool |
| compare_mid(__u16 mid, const struct smb_hdr *smb) |
| { |
| return mid == le16_to_cpu(smb->Mid); |
| } |
| |
| #define GETU16(var) (*((__u16 *)var)) /* BB check for endian issues */ |
| #define GETU32(var) (*((__u32 *)var)) /* BB check for endian issues */ |
| |
| /* given a pointer to an smb_hdr, retrieve a void pointer to the ByteCount */ |
| static inline void * |
| BCC(struct smb_hdr *smb) |
| { |
| return (void *)smb + sizeof(*smb) + 2 * smb->WordCount; |
| } |
| |
| /* given a pointer to an smb_hdr retrieve the pointer to the byte area */ |
| #define pByteArea(smb_var) (BCC(smb_var) + 2) |
| |
| /* get the unconverted ByteCount for a SMB packet and return it */ |
| static inline __u16 |
| get_bcc(struct smb_hdr *hdr) |
| { |
| __le16 *bc_ptr = (__le16 *)BCC(hdr); |
| |
| return get_unaligned_le16(bc_ptr); |
| } |
| |
| /* set the ByteCount for a SMB packet in little-endian */ |
| static inline void |
| put_bcc(__u16 count, struct smb_hdr *hdr) |
| { |
| __le16 *bc_ptr = (__le16 *)BCC(hdr); |
| |
| put_unaligned_le16(count, bc_ptr); |
| } |
| |
| #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ |
| |
| #endif /* _SMB1PROTO_H */ |