linux/fs/smb/common/smb2pdu.h

/* SPDX-License-Identifier: LGPL-2.1 */
#ifndef _COMMON_SMB2PDU_H
#define _COMMON_SMB2PDU_H

/*
 * Note that, due to trying to use names similar to the protocol specifications,
 * there are many mixed case field names in the structures below.  Although
 * this does not match typical Linux kernel style, it is necessary to be
 * able to match against the protocol specification.
 *
 * SMB2 commands
 * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses
 * (ie no useful data other than the SMB error code itself) and are marked such.
 * Knowing this helps avoid response buffer allocations and copy in some cases.
 */

/* List of commands in host endian */
#define SMB2_NEGOTIATE_HE
#define SMB2_SESSION_SETUP_HE
#define SMB2_LOGOFF_HE
#define SMB2_TREE_CONNECT_HE
#define SMB2_TREE_DISCONNECT_HE
#define SMB2_CREATE_HE
#define SMB2_CLOSE_HE
#define SMB2_FLUSH_HE
#define SMB2_READ_HE
#define SMB2_WRITE_HE
#define SMB2_LOCK_HE
#define SMB2_IOCTL_HE
#define SMB2_CANCEL_HE
#define SMB2_ECHO_HE
#define SMB2_QUERY_DIRECTORY_HE
#define SMB2_CHANGE_NOTIFY_HE
#define SMB2_QUERY_INFO_HE
#define SMB2_SET_INFO_HE
#define SMB2_OPLOCK_BREAK_HE
#define SMB2_SERVER_TO_CLIENT_NOTIFICATION

/* The same list in little endian */
#define SMB2_NEGOTIATE
#define SMB2_SESSION_SETUP
#define SMB2_LOGOFF
#define SMB2_TREE_CONNECT
#define SMB2_TREE_DISCONNECT
#define SMB2_CREATE
#define SMB2_CLOSE
#define SMB2_FLUSH
#define SMB2_READ
#define SMB2_WRITE
#define SMB2_LOCK
#define SMB2_IOCTL
#define SMB2_CANCEL
#define SMB2_ECHO
#define SMB2_QUERY_DIRECTORY
#define SMB2_CHANGE_NOTIFY
#define SMB2_QUERY_INFO
#define SMB2_SET_INFO
#define SMB2_OPLOCK_BREAK

#define SMB2_INTERNAL_CMD

#define NUMBER_OF_SMB2_COMMANDS

/*
 * Size of the session key (crypto key encrypted with the password
 */
#define SMB2_NTLMV2_SESSKEY_SIZE
#define SMB2_SIGNATURE_SIZE
#define SMB2_HMACSHA256_SIZE
#define SMB2_CMACAES_SIZE
#define SMB3_GCM128_CRYPTKEY_SIZE
#define SMB3_GCM256_CRYPTKEY_SIZE

/*
 * Size of the smb3 encryption/decryption keys
 * This size is big enough to store any cipher key types.
 */
#define SMB3_ENC_DEC_KEY_SIZE

/*
 * Size of the smb3 signing key
 */
#define SMB3_SIGN_KEY_SIZE

#define CIFS_CLIENT_CHALLENGE_SIZE

/* Maximum buffer size value we can send with 1 credit */
#define SMB2_MAX_BUFFER_SIZE

/*
 * The default wsize is 1M for SMB2 (and for some CIFS cases).
 * find_get_pages seems to return a maximum of 256
 * pages in a single call. With PAGE_SIZE == 4k, this means we can
 * fill a single wsize request with a single call.
 */
#define SMB3_DEFAULT_IOSIZE

/*
 * SMB2 Header Definition
 *
 * "MBZ" :  Must be Zero
 * "BB"  :  BugBug, Something to check/review/analyze later
 * "PDU" :  "Protocol Data Unit" (ie a network "frame")
 *
 */

#define __SMB2_HEADER_STRUCTURE_SIZE
#define SMB2_HEADER_STRUCTURE_SIZE

#define SMB2_PROTO_NUMBER
#define SMB2_TRANSFORM_PROTO_NUM
#define SMB2_COMPRESSION_TRANSFORM_ID

/*
 *	SMB2 flag definitions
 */
#define SMB2_FLAGS_SERVER_TO_REDIR
#define SMB2_FLAGS_ASYNC_COMMAND
#define SMB2_FLAGS_RELATED_OPERATIONS
#define SMB2_FLAGS_SIGNED
#define SMB2_FLAGS_PRIORITY_MASK
#define SMB2_FLAGS_DFS_OPERATIONS
#define SMB2_FLAGS_REPLAY_OPERATION

/*
 *	Definitions for SMB2 Protocol Data Units (network frames)
 *
 *  See MS-SMB2.PDF specification for protocol details.
 *  The Naming convention is the lower case version of the SMB2
 *  command code name for the struct. Note that structures must be packed.
 *
 */

/* See MS-SMB2 section 2.2.1 */
struct smb2_hdr {} __packed;

struct smb3_hdr_req {} __packed;

struct smb2_pdu {} __packed;

#define SMB2_ERROR_STRUCTURE_SIZE2
#define SMB2_ERROR_STRUCTURE_SIZE2_LE

struct smb2_err_rsp {} __packed;

#define SMB3_AES_CCM_NONCE
#define SMB3_AES_GCM_NONCE

/* Transform flags (for 3.0 dialect this flag indicates CCM */
#define TRANSFORM_FLAG_ENCRYPTED
struct smb2_transform_hdr {} __packed;

/*
 * These are simplified versions from the spec, as we don't need a fully fledged
 * form of both unchained and chained structs.
 *
 * Moreover, even in chained compressed payloads, the initial compression header
 * has the form of the unchained one -- i.e. it never has the
 * OriginalPayloadSize field and ::Offset field always represent an offset
 * (instead of a length, as it is in the chained header).
 *
 * See MS-SMB2 2.2.42 for more details.
 */
#define SMB2_COMPRESSION_FLAG_NONE
#define SMB2_COMPRESSION_FLAG_CHAINED

struct smb2_compression_hdr {} __packed;

/*
 * ... OTOH, set compression payload header to always have OriginalPayloadSize
 * as it's easier to pass the struct size minus sizeof(OriginalPayloadSize)
 * than to juggle around the header/data memory.
 */
struct smb2_compression_payload_hdr {} __packed;

struct smb2_compression_pattern_v1 {} __packed;

/* See MS-SMB2 section 2.2.9.2 */
/* Context Types */
#define SMB2_RESERVED_TREE_CONNECT_CONTEXT_ID
#define SMB2_REMOTED_IDENTITY_TREE_CONNECT_CONTEXT_ID

struct tree_connect_contexts {} __packed;

/* Remoted identity tree connect context structures - see MS-SMB2 2.2.9.2.1 */
struct smb3_blob_data {} __packed;

/* Valid values for Attr */
#define SE_GROUP_MANDATORY
#define SE_GROUP_ENABLED_BY_DEFAULT
#define SE_GROUP_ENABLED
#define SE_GROUP_OWNER
#define SE_GROUP_USE_FOR_DENY_ONLY
#define SE_GROUP_INTEGRITY
#define SE_GROUP_INTEGRITY_ENABLED
#define SE_GROUP_RESOURCE
#define SE_GROUP_LOGON_ID

struct sid_array_data {} __packed;

/* struct sid_attr_data is SidData array in BlobData format then le32 Attr */
struct sid_attr_data {} __packed;

/*
 * struct privilege_data is the same as BLOB_DATA - see MS-SMB2 2.2.9.2.1.5
 * but with size of LUID_ATTR_DATA struct and BlobData set to LUID_ATTR DATA
 */

struct privilege_array_data {} __packed;

struct remoted_identity_tcon_context {} __packed;

struct smb2_tree_connect_req_extension {} __packed;

/* Flags/Reserved for SMB3.1.1 */
#define SMB2_TREE_CONNECT_FLAG_CLUSTER_RECONNECT
#define SMB2_TREE_CONNECT_FLAG_REDIRECT_TO_OWNER
#define SMB2_TREE_CONNECT_FLAG_EXTENSION_PRESENT

struct smb2_tree_connect_req {} __packed;

/* Possible ShareType values */
#define SMB2_SHARE_TYPE_DISK
#define SMB2_SHARE_TYPE_PIPE
#define SMB2_SHARE_TYPE_PRINT

/*
 * Possible ShareFlags - exactly one and only one of the first 4 caching flags
 * must be set (any of the remaining, SHI1005, flags may be set individually
 * or in combination.
 */
#define SMB2_SHAREFLAG_MANUAL_CACHING
#define SMB2_SHAREFLAG_AUTO_CACHING
#define SMB2_SHAREFLAG_VDO_CACHING
#define SMB2_SHAREFLAG_NO_CACHING
#define SHI1005_FLAGS_DFS
#define SHI1005_FLAGS_DFS_ROOT
#define SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS
#define SMB2_SHAREFLAG_FORCE_SHARED_DELETE
#define SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING
#define SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM
#define SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK
#define SMB2_SHAREFLAG_ENABLE_HASH_V1
#define SMB2_SHAREFLAG_ENABLE_HASH_V2
#define SHI1005_FLAGS_ENCRYPT_DATA
#define SMB2_SHAREFLAG_IDENTITY_REMOTING
#define SMB2_SHAREFLAG_COMPRESS_DATA
#define SMB2_SHAREFLAG_ISOLATED_TRANSPORT
#define SHI1005_FLAGS_ALL

/* Possible share capabilities */
#define SMB2_SHARE_CAP_DFS
#define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY
#define SMB2_SHARE_CAP_SCALEOUT
#define SMB2_SHARE_CAP_CLUSTER
#define SMB2_SHARE_CAP_ASYMMETRIC
#define SMB2_SHARE_CAP_REDIRECT_TO_OWNER

struct smb2_tree_connect_rsp {} __packed;

struct smb2_tree_disconnect_req {} __packed;

struct smb2_tree_disconnect_rsp {} __packed;


/*
 * SMB2_NEGOTIATE_PROTOCOL  See MS-SMB2 section 2.2.3
 */
/* SecurityMode flags */
#define SMB2_NEGOTIATE_SIGNING_ENABLED
#define SMB2_NEGOTIATE_SIGNING_ENABLED_LE
#define SMB2_NEGOTIATE_SIGNING_REQUIRED
#define SMB2_NEGOTIATE_SIGNING_REQUIRED_LE
#define SMB2_SEC_MODE_FLAGS_ALL

/* Capabilities flags */
#define SMB2_GLOBAL_CAP_DFS
#define SMB2_GLOBAL_CAP_LEASING
#define SMB2_GLOBAL_CAP_LARGE_MTU
#define SMB2_GLOBAL_CAP_MULTI_CHANNEL
#define SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
#define SMB2_GLOBAL_CAP_DIRECTORY_LEASING
#define SMB2_GLOBAL_CAP_ENCRYPTION
#define SMB2_GLOBAL_CAP_NOTIFICATIONS
/* Internal types */
#define SMB2_NT_FIND
#define SMB2_LARGE_FILES

#define SMB2_CLIENT_GUID_SIZE
#define SMB2_CREATE_GUID_SIZE

/* Dialects */
#define SMB10_PROT_ID
#define SMB20_PROT_ID
#define SMB21_PROT_ID
#define SMB2X_PROT_ID
#define SMB30_PROT_ID
#define SMB302_PROT_ID
#define SMB311_PROT_ID
#define BAD_PROT_ID

#define SMB311_SALT_SIZE
/* Hash Algorithm Types */
#define SMB2_PREAUTH_INTEGRITY_SHA512
#define SMB2_PREAUTH_HASH_SIZE

/* Negotiate Contexts - ContextTypes. See MS-SMB2 section 2.2.3.1 for details */
#define SMB2_PREAUTH_INTEGRITY_CAPABILITIES
#define SMB2_ENCRYPTION_CAPABILITIES
#define SMB2_COMPRESSION_CAPABILITIES
#define SMB2_NETNAME_NEGOTIATE_CONTEXT_ID
#define SMB2_TRANSPORT_CAPABILITIES
#define SMB2_RDMA_TRANSFORM_CAPABILITIES
#define SMB2_SIGNING_CAPABILITIES
#define SMB2_POSIX_EXTENSIONS_AVAILABLE

struct smb2_neg_context {} __packed;

/*
 * SaltLength that the server send can be zero, so the only three required
 * fields (all __le16) end up six bytes total, so the minimum context data len
 * in the response is six bytes which accounts for
 *
 *      HashAlgorithmCount, SaltLength, and 1 HashAlgorithm.
 */
#define MIN_PREAUTH_CTXT_DATA_LEN

struct smb2_preauth_neg_context {} __packed;

/* Encryption Algorithms Ciphers */
#define SMB2_ENCRYPTION_AES128_CCM
#define SMB2_ENCRYPTION_AES128_GCM
#define SMB2_ENCRYPTION_AES256_CCM
#define SMB2_ENCRYPTION_AES256_GCM

/* Min encrypt context data is one cipher so 2 bytes + 2 byte count field */
#define MIN_ENCRYPT_CTXT_DATA_LEN
struct smb2_encryption_neg_context {} __packed;

/* See MS-SMB2 2.2.3.1.3 */
#define SMB3_COMPRESS_NONE
#define SMB3_COMPRESS_LZNT1
#define SMB3_COMPRESS_LZ77
#define SMB3_COMPRESS_LZ77_HUFF
/* Pattern scanning algorithm See MS-SMB2 3.1.4.4.1 */
#define SMB3_COMPRESS_PATTERN
#define SMB3_COMPRESS_LZ4

/* Compression Flags */
#define SMB2_COMPRESSION_CAPABILITIES_FLAG_NONE
#define SMB2_COMPRESSION_CAPABILITIES_FLAG_CHAINED

struct smb2_compression_capabilities_context {} __packed;

/*
 * For smb2_netname_negotiate_context_id See MS-SMB2 2.2.3.1.4.
 * Its struct simply contains NetName, an array of Unicode characters
 */
struct smb2_netname_neg_context {} __packed;

/*
 * For smb2_transport_capabilities context see MS-SMB2 2.2.3.1.5
 * and 2.2.4.1.5
 */

/* Flags */
#define SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY

struct smb2_transport_capabilities_context {} __packed;

/*
 * For rdma transform capabilities context see MS-SMB2 2.2.3.1.6
 * and 2.2.4.1.6
 */

/* RDMA Transform IDs */
#define SMB2_RDMA_TRANSFORM_NONE
#define SMB2_RDMA_TRANSFORM_ENCRYPTION
#define SMB2_RDMA_TRANSFORM_SIGNING

struct smb2_rdma_transform_capabilities_context {} __packed;

/*
 * For signing capabilities context see MS-SMB2 2.2.3.1.7
 * and 2.2.4.1.7
 */

/* Signing algorithms */
#define SIGNING_ALG_HMAC_SHA256
#define SIGNING_ALG_HMAC_SHA256_LE
#define SIGNING_ALG_AES_CMAC
#define SIGNING_ALG_AES_CMAC_LE
#define SIGNING_ALG_AES_GMAC
#define SIGNING_ALG_AES_GMAC_LE

struct smb2_signing_capabilities {} __packed;

#define POSIX_CTXT_DATA_LEN
struct smb2_posix_neg_context {} __packed;

struct smb2_negotiate_req {} __packed;

struct smb2_negotiate_rsp {} __packed;


/*
 * SMB2_SESSION_SETUP  See MS-SMB2 section 2.2.5
 */
/* Flags */
#define SMB2_SESSION_REQ_FLAG_BINDING
#define SMB2_SESSION_REQ_FLAG_ENCRYPT_DATA

struct smb2_sess_setup_req {} __packed;

/* Currently defined SessionFlags */
#define SMB2_SESSION_FLAG_IS_GUEST
#define SMB2_SESSION_FLAG_IS_GUEST_LE
#define SMB2_SESSION_FLAG_IS_NULL
#define SMB2_SESSION_FLAG_IS_NULL_LE
#define SMB2_SESSION_FLAG_ENCRYPT_DATA
#define SMB2_SESSION_FLAG_ENCRYPT_DATA_LE

struct smb2_sess_setup_rsp {} __packed;


/*
 * SMB2_LOGOFF  See MS-SMB2 section 2.2.7
 */
struct smb2_logoff_req {} __packed;

struct smb2_logoff_rsp {} __packed;


/*
 * SMB2_CLOSE  See MS-SMB2 section 2.2.15
 */
/* Currently defined values for close flags */
#define SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB
struct smb2_close_req {} __packed;

/*
 * Maximum size of a SMB2_CLOSE response is 64 (smb2 header) + 60 (data)
 */
#define MAX_SMB2_CLOSE_RESPONSE_SIZE

struct smb2_close_rsp {} __packed;


/*
 * SMB2_READ  See MS-SMB2 section 2.2.19
 */
/* For read request Flags field below, following flag is defined for SMB3.02 */
#define SMB2_READFLAG_READ_UNBUFFERED
#define SMB2_READFLAG_REQUEST_COMPRESSED

/* Channel field for read and write: exactly one of following flags can be set*/
#define SMB2_CHANNEL_NONE
#define SMB2_CHANNEL_RDMA_V1
#define SMB2_CHANNEL_RDMA_V1_INVALIDATE
#define SMB2_CHANNEL_RDMA_TRANSFORM

/* SMB2 read request without RFC1001 length at the beginning */
struct smb2_read_req {} __packed;

/* Read flags */
#define SMB2_READFLAG_RESPONSE_NONE
#define SMB2_READFLAG_RESPONSE_RDMA_TRANSFORM

struct smb2_read_rsp {} __packed;


/*
 * SMB2_WRITE  See MS-SMB2 section 2.2.21
 */
/* For write request Flags field below the following flags are defined: */
#define SMB2_WRITEFLAG_WRITE_THROUGH
#define SMB2_WRITEFLAG_WRITE_UNBUFFERED

struct smb2_write_req {} __packed;

struct smb2_write_rsp {} __packed;


/*
 * SMB2_FLUSH  See MS-SMB2 section 2.2.17
 */
struct smb2_flush_req {} __packed;

struct smb2_flush_rsp {} __packed;

#define SMB2_LOCKFLAG_SHARED
#define SMB2_LOCKFLAG_EXCLUSIVE
#define SMB2_LOCKFLAG_UNLOCK
#define SMB2_LOCKFLAG_FAIL_IMMEDIATELY
#define SMB2_LOCKFLAG_MASK

struct smb2_lock_element {} __packed;

struct smb2_lock_req {} __packed;

struct smb2_lock_rsp {} __packed;

struct smb2_echo_req {} __packed;

struct smb2_echo_rsp {} __packed;

/*
 * Valid FileInformation classes for query directory
 *
 * Note that these are a subset of the (file) QUERY_INFO levels defined
 * later in this file (but since QUERY_DIRECTORY uses equivalent numbers
 * we do not redefine them here)
 *
 * FileDirectoryInfomation		0x01
 * FileFullDirectoryInformation		0x02
 * FileIdFullDirectoryInformation	0x26
 * FileBothDirectoryInformation		0x03
 * FileIdBothDirectoryInformation	0x25
 * FileNamesInformation			0x0C
 * FileIdExtdDirectoryInformation	0x3C
 */

/* search (query_directory) Flags field */
#define SMB2_RESTART_SCANS
#define SMB2_RETURN_SINGLE_ENTRY
#define SMB2_INDEX_SPECIFIED
#define SMB2_REOPEN

struct smb2_query_directory_req {} __packed;

struct smb2_query_directory_rsp {} __packed;

/* DeviceType Flags */
#define FILE_DEVICE_CD_ROM
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM
#define FILE_DEVICE_DFS
#define FILE_DEVICE_DISK
#define FILE_DEVICE_DISK_FILE_SYSTEM
#define FILE_DEVICE_FILE_SYSTEM
#define FILE_DEVICE_NAMED_PIPE
#define FILE_DEVICE_NETWORK
#define FILE_DEVICE_NETWORK_FILE_SYSTEM
#define FILE_DEVICE_NULL
#define FILE_DEVICE_PARALLEL_PORT
#define FILE_DEVICE_PRINTER
#define FILE_DEVICE_SERIAL_PORT
#define FILE_DEVICE_STREAMS
#define FILE_DEVICE_TAPE
#define FILE_DEVICE_TAPE_FILE_SYSTEM
#define FILE_DEVICE_VIRTUAL_DISK
#define FILE_DEVICE_NETWORK_REDIRECTOR

/* Device Characteristics */
#define FILE_REMOVABLE_MEDIA
#define FILE_READ_ONLY_DEVICE
#define FILE_FLOPPY_DISKETTE
#define FILE_WRITE_ONCE_MEDIA
#define FILE_REMOTE_DEVICE
#define FILE_DEVICE_IS_MOUNTED
#define FILE_VIRTUAL_VOLUME
#define FILE_DEVICE_SECURE_OPEN
#define FILE_CHARACTERISTIC_TS_DEVICE
#define FILE_CHARACTERISTIC_WEBDAV_DEVICE
#define FILE_PORTABLE_DEVICE
#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL

/*
 * Maximum number of iovs we need for a set-info request.
 * The largest one is rename/hardlink
 * [0] : struct smb2_set_info_req + smb2_file_[rename|link]_info
 * [1] : path
 * [2] : compound padding
 */
#define SMB2_SET_INFO_IOV_SIZE

struct smb2_set_info_req {} __packed;

struct smb2_set_info_rsp {} __packed;

/*
 * SMB2_NOTIFY  See MS-SMB2 section 2.2.35
 */
/* notify flags */
#define SMB2_WATCH_TREE

/* notify completion filter flags. See MS-FSCC 2.6 and MS-SMB2 2.2.35 */
#define FILE_NOTIFY_CHANGE_FILE_NAME
#define FILE_NOTIFY_CHANGE_DIR_NAME
#define FILE_NOTIFY_CHANGE_ATTRIBUTES
#define FILE_NOTIFY_CHANGE_SIZE
#define FILE_NOTIFY_CHANGE_LAST_WRITE
#define FILE_NOTIFY_CHANGE_LAST_ACCESS
#define FILE_NOTIFY_CHANGE_CREATION
#define FILE_NOTIFY_CHANGE_EA
#define FILE_NOTIFY_CHANGE_SECURITY
#define FILE_NOTIFY_CHANGE_STREAM_NAME
#define FILE_NOTIFY_CHANGE_STREAM_SIZE
#define FILE_NOTIFY_CHANGE_STREAM_WRITE

/* SMB2 Notify Action Flags */
#define FILE_ACTION_ADDED
#define FILE_ACTION_REMOVED
#define FILE_ACTION_MODIFIED
#define FILE_ACTION_RENAMED_OLD_NAME
#define FILE_ACTION_RENAMED_NEW_NAME
#define FILE_ACTION_ADDED_STREAM
#define FILE_ACTION_REMOVED_STREAM
#define FILE_ACTION_MODIFIED_STREAM
#define FILE_ACTION_REMOVED_BY_DELETE

struct smb2_change_notify_req {} __packed;

struct smb2_change_notify_rsp {} __packed;

/*
 * SMB2_SERVER_TO_CLIENT_NOTIFICATION: See MS-SMB2 section 2.2.44
 */

#define SMB2_NOTIFY_SESSION_CLOSED

struct smb2_server_client_notification {} __packed;

/*
 * SMB2_CREATE  See MS-SMB2 section 2.2.13
 */
/* Oplock levels */
#define SMB2_OPLOCK_LEVEL_NONE
#define SMB2_OPLOCK_LEVEL_II
#define SMB2_OPLOCK_LEVEL_EXCLUSIVE
#define SMB2_OPLOCK_LEVEL_BATCH
#define SMB2_OPLOCK_LEVEL_LEASE
/* Non-spec internal type */
#define SMB2_OPLOCK_LEVEL_NOCHANGE

/* Impersonation Levels. See MS-WPO section 9.7 and MSDN-IMPERS */
#define IL_ANONYMOUS
#define IL_IDENTIFICATION
#define IL_IMPERSONATION
#define IL_DELEGATE

/* File Attributes */
#define FILE_ATTRIBUTE_READONLY
#define FILE_ATTRIBUTE_HIDDEN
#define FILE_ATTRIBUTE_SYSTEM
#define FILE_ATTRIBUTE_DIRECTORY
#define FILE_ATTRIBUTE_ARCHIVE
#define FILE_ATTRIBUTE_NORMAL
#define FILE_ATTRIBUTE_TEMPORARY
#define FILE_ATTRIBUTE_SPARSE_FILE
#define FILE_ATTRIBUTE_REPARSE_POINT
#define FILE_ATTRIBUTE_COMPRESSED
#define FILE_ATTRIBUTE_OFFLINE
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
#define FILE_ATTRIBUTE_ENCRYPTED
#define FILE_ATTRIBUTE_INTEGRITY_STREAM
#define FILE_ATTRIBUTE_NO_SCRUB_DATA
#define FILE_ATTRIBUTE__MASK

#define FILE_ATTRIBUTE_READONLY_LE
#define FILE_ATTRIBUTE_HIDDEN_LE
#define FILE_ATTRIBUTE_SYSTEM_LE
#define FILE_ATTRIBUTE_DIRECTORY_LE
#define FILE_ATTRIBUTE_ARCHIVE_LE
#define FILE_ATTRIBUTE_NORMAL_LE
#define FILE_ATTRIBUTE_TEMPORARY_LE
#define FILE_ATTRIBUTE_SPARSE_FILE_LE
#define FILE_ATTRIBUTE_REPARSE_POINT_LE
#define FILE_ATTRIBUTE_COMPRESSED_LE
#define FILE_ATTRIBUTE_OFFLINE_LE
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED_LE
#define FILE_ATTRIBUTE_ENCRYPTED_LE
#define FILE_ATTRIBUTE_INTEGRITY_STREAM_LE
#define FILE_ATTRIBUTE_NO_SCRUB_DATA_LE
#define FILE_ATTRIBUTE_MASK_LE

/* Desired Access Flags */
#define FILE_READ_DATA_LE
#define FILE_LIST_DIRECTORY_LE
#define FILE_WRITE_DATA_LE
#define FILE_APPEND_DATA_LE
#define FILE_ADD_SUBDIRECTORY_LE
#define FILE_READ_EA_LE
#define FILE_WRITE_EA_LE
#define FILE_EXECUTE_LE
#define FILE_DELETE_CHILD_LE
#define FILE_READ_ATTRIBUTES_LE
#define FILE_WRITE_ATTRIBUTES_LE
#define FILE_DELETE_LE
#define FILE_READ_CONTROL_LE
#define FILE_WRITE_DAC_LE
#define FILE_WRITE_OWNER_LE
#define FILE_SYNCHRONIZE_LE
#define FILE_ACCESS_SYSTEM_SECURITY_LE
#define FILE_MAXIMAL_ACCESS_LE
#define FILE_GENERIC_ALL_LE
#define FILE_GENERIC_EXECUTE_LE
#define FILE_GENERIC_WRITE_LE
#define FILE_GENERIC_READ_LE
#define DESIRED_ACCESS_MASK


#define FILE_READ_DESIRED_ACCESS_LE
#define FILE_WRITE_DESIRE_ACCESS_LE

/* ShareAccess Flags */
#define FILE_SHARE_READ_LE
#define FILE_SHARE_WRITE_LE
#define FILE_SHARE_DELETE_LE
#define FILE_SHARE_ALL_LE

/* CreateDisposition Flags */
#define FILE_SUPERSEDE_LE
#define FILE_OPEN_LE
#define FILE_CREATE_LE
#define FILE_OPEN_IF_LE
#define FILE_OVERWRITE_LE
#define FILE_OVERWRITE_IF_LE
#define FILE_CREATE_MASK_LE

#define FILE_READ_RIGHTS
#define FILE_WRITE_RIGHTS
#define FILE_EXEC_RIGHTS

/* CreateOptions Flags */
#define FILE_DIRECTORY_FILE_LE
/* same as #define CREATE_NOT_FILE_LE	cpu_to_le32(0x00000001) */
#define FILE_WRITE_THROUGH_LE
#define FILE_SEQUENTIAL_ONLY_LE
#define FILE_NO_INTERMEDIATE_BUFFERING_LE
/* FILE_SYNCHRONOUS_IO_ALERT_LE		cpu_to_le32(0x00000010) should be zero, ignored */
/* FILE_SYNCHRONOUS_IO_NONALERT		cpu_to_le32(0x00000020) should be zero, ignored */
#define FILE_NON_DIRECTORY_FILE_LE
#define FILE_COMPLETE_IF_OPLOCKED_LE
#define FILE_NO_EA_KNOWLEDGE_LE
/* FILE_OPEN_REMOTE_INSTANCE		cpu_to_le32(0x00000400) should be zero, ignored */
#define FILE_RANDOM_ACCESS_LE
#define FILE_DELETE_ON_CLOSE_LE
#define FILE_OPEN_BY_FILE_ID_LE
#define FILE_OPEN_FOR_BACKUP_INTENT_LE
#define FILE_NO_COMPRESSION_LE
/* FILE_OPEN_REQUIRING_OPLOCK		cpu_to_le32(0x00010000) should be zero, ignored */
/* FILE_DISALLOW_EXCLUSIVE		cpu_to_le32(0x00020000) should be zero, ignored */
/* FILE_RESERVE_OPFILTER		cpu_to_le32(0x00100000) MBZ */
#define FILE_OPEN_REPARSE_POINT_LE
#define FILE_OPEN_NO_RECALL_LE
/* #define FILE_OPEN_FOR_FREE_SPACE_QUERY cpu_to_le32(0x00800000) should be zero, ignored */
#define CREATE_OPTIONS_MASK_LE

#define FILE_READ_RIGHTS_LE
#define FILE_WRITE_RIGHTS_LE
#define FILE_EXEC_RIGHTS_LE

/* Create Context Values */
#define SMB2_CREATE_EA_BUFFER
#define SMB2_CREATE_SD_BUFFER
#define SMB2_CREATE_DURABLE_HANDLE_REQUEST
#define SMB2_CREATE_DURABLE_HANDLE_RECONNECT
#define SMB2_CREATE_ALLOCATION_SIZE
#define SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST
#define SMB2_CREATE_TIMEWARP_REQUEST
#define SMB2_CREATE_QUERY_ON_DISK_ID
#define SMB2_CREATE_REQUEST_LEASE
#define SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2
#define SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2
#define SMB2_CREATE_TAG_POSIX
#define SMB2_CREATE_APP_INSTANCE_ID
#define SMB2_CREATE_APP_INSTANCE_VERSION
#define SVHDX_OPEN_DEVICE_CONTEXT
#define SMB2_CREATE_TAG_AAPL

/* Flag (SMB3 open response) values */
#define SMB2_CREATE_FLAG_REPARSEPOINT

struct create_context {} __packed;
static_assert();

struct smb2_create_req {} __packed;

struct smb2_create_rsp {} __packed;

struct create_posix {} __packed;

/* See MS-SMB2 2.2.13.2.3 and MS-SMB2 2.2.13.2.4 */
struct create_durable {} __packed;

/* See MS-SMB2 2.2.13.2.5 */
struct create_mxac_req {} __packed;

/* See MS-SMB2 2.2.14.2.5 */
struct create_mxac_rsp {} __packed;

#define SMB2_LEASE_NONE_LE
#define SMB2_LEASE_READ_CACHING_LE
#define SMB2_LEASE_HANDLE_CACHING_LE
#define SMB2_LEASE_WRITE_CACHING_LE

#define SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE
#define SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE

#define SMB2_LEASE_KEY_SIZE

/* See MS-SMB2 2.2.13.2.8 */
struct lease_context {} __packed;

/* See MS-SMB2 2.2.13.2.10 */
struct lease_context_v2 {} __packed;

struct create_lease {} __packed;

struct create_lease_v2 {} __packed;

/* See MS-SMB2 2.2.14.2.9 */
struct create_disk_id_rsp {} __packed;

/* See MS-SMB2 2.2.13.2.13 */
struct create_app_inst_id {} __packed;

/* See MS-SMB2 2.2.13.2.15 */
struct create_app_inst_id_vers {} __packed;

/* See MS-SMB2 2.2.31 and 2.2.32 */
struct smb2_ioctl_req {} __packed;

struct smb2_ioctl_rsp {} __packed;

/* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */
struct file_zero_data_information {} __packed;

/* See MS-FSCC 2.3.7 */
struct duplicate_extents_to_file {} __packed;

/* See MS-FSCC 2.3.8 */
#define DUPLICATE_EXTENTS_DATA_EX_SOURCE_ATOMIC
struct duplicate_extents_to_file_ex {} __packed;


/* See MS-FSCC 2.3.20 */
struct fsctl_get_integrity_information_rsp {} __packed;

/* See MS-FSCC 2.3.55 */
struct fsctl_query_file_regions_req {} __packed;

/* DesiredUsage flags see MS-FSCC 2.3.56.1 */
#define FILE_USAGE_INVALID_RANGE
#define FILE_USAGE_VALID_CACHED_DATA
#define FILE_USAGE_NONCACHED_DATA

struct file_region_info {} __packed;

/* See MS-FSCC 2.3.56 */
struct fsctl_query_file_region_rsp {} __packed;

/* See MS-FSCC 2.3.58 */
struct fsctl_query_on_disk_vol_info_rsp {} __packed;

/* See MS-FSCC 2.3.73 */
struct fsctl_set_integrity_information_req {} __packed;

/* See MS-FSCC 2.3.75 */
struct fsctl_set_integrity_info_ex_req {} __packed;

/* Integrity ChecksumAlgorithm choices for above */
#define CHECKSUM_TYPE_NONE
#define CHECKSUM_TYPE_CRC64
#define CHECKSUM_TYPE_UNCHANGED

/* Integrity flags for above */
#define FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF

/* Reparse structures - see MS-FSCC 2.1.2 */

/* struct fsctl_reparse_info_req is empty, only response structs (see below) */
struct reparse_data_buffer {} __packed;

struct reparse_guid_data_buffer {} __packed;

struct reparse_mount_point_data_buffer {} __packed;

#define SYMLINK_FLAG_RELATIVE

struct reparse_symlink_data_buffer {} __packed;

/* See MS-FSCC 2.1.2.6 and cifspdu.h for struct reparse_posix_data */

struct validate_negotiate_info_req {} __packed;

struct validate_negotiate_info_rsp {} __packed;


/* Possible InfoType values */
#define SMB2_O_INFO_FILE
#define SMB2_O_INFO_FILESYSTEM
#define SMB2_O_INFO_SECURITY
#define SMB2_O_INFO_QUOTA

/* SMB2 Query Info see MS-SMB2 (2.2.37) or MS-DTYP */

/* List of QUERY INFO levels (those also valid for QUERY_DIR are noted below */
#define FILE_DIRECTORY_INFORMATION
#define FILE_FULL_DIRECTORY_INFORMATION
#define FILE_BOTH_DIRECTORY_INFORMATION
#define FILE_BASIC_INFORMATION
#define FILE_STANDARD_INFORMATION
#define FILE_INTERNAL_INFORMATION
#define FILE_EA_INFORMATION
#define FILE_ACCESS_INFORMATION
#define FILE_NAME_INFORMATION
#define FILE_RENAME_INFORMATION
#define FILE_LINK_INFORMATION
#define FILE_NAMES_INFORMATION
#define FILE_DISPOSITION_INFORMATION
#define FILE_POSITION_INFORMATION
#define FILE_FULL_EA_INFORMATION
#define FILE_MODE_INFORMATION
#define FILE_ALIGNMENT_INFORMATION
#define FILE_ALL_INFORMATION
#define FILE_ALLOCATION_INFORMATION
#define FILE_END_OF_FILE_INFORMATION
#define FILE_ALTERNATE_NAME_INFORMATION
#define FILE_STREAM_INFORMATION
#define FILE_PIPE_INFORMATION
#define FILE_PIPE_LOCAL_INFORMATION
#define FILE_PIPE_REMOTE_INFORMATION
#define FILE_MAILSLOT_QUERY_INFORMATION
#define FILE_MAILSLOT_SET_INFORMATION
#define FILE_COMPRESSION_INFORMATION
#define FILE_OBJECT_ID_INFORMATION
/* Number 30 not defined in documents */
#define FILE_MOVE_CLUSTER_INFORMATION
#define FILE_QUOTA_INFORMATION
#define FILE_REPARSE_POINT_INFORMATION
#define FILE_NETWORK_OPEN_INFORMATION
#define FILE_ATTRIBUTE_TAG_INFORMATION
#define FILE_TRACKING_INFORMATION
#define FILEID_BOTH_DIRECTORY_INFORMATION
#define FILEID_FULL_DIRECTORY_INFORMATION
#define FILE_VALID_DATA_LENGTH_INFORMATION
#define FILE_SHORT_NAME_INFORMATION
#define FILE_SFIO_RESERVE_INFORMATION
#define FILE_SFIO_VOLUME_INFORMATION
#define FILE_HARD_LINK_INFORMATION
#define FILE_NORMALIZED_NAME_INFORMATION
#define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION
#define FILE_STANDARD_LINK_INFORMATION
#define FILE_ID_INFORMATION
#define FILE_ID_EXTD_DIRECTORY_INFORMATION
/* Used for Query Info and Find File POSIX Info for SMB3.1.1 and SMB1 */
#define SMB_FIND_FILE_POSIX_INFO

/* Security info type additionalinfo flags. */
#define OWNER_SECINFO
#define GROUP_SECINFO
#define DACL_SECINFO
#define SACL_SECINFO
#define LABEL_SECINFO
#define ATTRIBUTE_SECINFO
#define SCOPE_SECINFO
#define BACKUP_SECINFO
#define UNPROTECTED_SACL_SECINFO
#define UNPROTECTED_DACL_SECINFO
#define PROTECTED_SACL_SECINFO
#define PROTECTED_DACL_SECINFO

/* Flags used for FileFullEAinfo */
#define SL_RESTART_SCAN
#define SL_RETURN_SINGLE_ENTRY
#define SL_INDEX_SPECIFIED

struct smb2_query_info_req {} __packed;

struct smb2_query_info_rsp {} __packed;

/*
 *	PDU query infolevel structure definitions
 */

/* See MS-FSCC 2.3.52 */
struct file_allocated_range_buffer {} __packed;

struct smb2_file_internal_info {} __packed; /* level 6 Query */

struct smb2_file_rename_info {} __packed; /* level 10 Set */

struct smb2_file_link_info {} __packed; /* level 11 Set */

/*
 * This level 18, although with struct with same name is different from cifs
 * level 0x107. Level 0x107 has an extra u64 between AccessFlags and
 * CurrentByteOffset.
 */
struct smb2_file_all_info {} __packed; /* level 18 Query */

struct smb2_file_eof_info {} __packed; /* level 20 Set */

/* Level 100 query info */
struct smb311_posix_qinfo {} __packed;

/* File System Information Classes */
#define FS_VOLUME_INFORMATION
#define FS_LABEL_INFORMATION
#define FS_SIZE_INFORMATION
#define FS_DEVICE_INFORMATION
#define FS_ATTRIBUTE_INFORMATION
#define FS_CONTROL_INFORMATION
#define FS_FULL_SIZE_INFORMATION
#define FS_OBJECT_ID_INFORMATION
#define FS_DRIVER_PATH_INFORMATION
#define FS_SECTOR_SIZE_INFORMATION
#define FS_POSIX_INFORMATION

struct smb2_fs_full_size_info {} __packed;

#define SSINFO_FLAGS_ALIGNED_DEVICE
#define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE
#define SSINFO_FLAGS_NO_SEEK_PENALTY
#define SSINFO_FLAGS_TRIM_ENABLED

/* sector size info struct */
struct smb3_fs_ss_info {} __packed;

/* File System Control Information */
struct smb2_fs_control_info {} __packed;

/* volume info struct - see MS-FSCC 2.5.9 */
#define MAX_VOL_LABEL_LEN
struct smb3_fs_vol_info {} __packed;

/* See MS-SMB2 2.2.23 through 2.2.25 */
struct smb2_oplock_break {} __packed;

#define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED

struct smb2_lease_break {} __packed;

struct smb2_lease_ack {} __packed;

#define OP_BREAK_STRUCT_SIZE_20
#define OP_BREAK_STRUCT_SIZE_21
#endif				/* _COMMON_SMB2PDU_H */