1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * fs/cifs/smb2pdu.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) International Business Machines Corp., 2009, 2013 5*4882a593Smuzhiyun * Etersoft, 2012 6*4882a593Smuzhiyun * Author(s): Steve French (sfrench@us.ibm.com) 7*4882a593Smuzhiyun * Pavel Shilovsky (pshilovsky@samba.org) 2012 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This library is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of the GNU Lesser General Public License as published 11*4882a593Smuzhiyun * by the Free Software Foundation; either version 2.1 of the License, or 12*4882a593Smuzhiyun * (at your option) any later version. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * This library is distributed in the hope that it will be useful, 15*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 17*4882a593Smuzhiyun * the GNU Lesser General Public License for more details. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * You should have received a copy of the GNU Lesser General Public License 20*4882a593Smuzhiyun * along with this library; if not, write to the Free Software 21*4882a593Smuzhiyun * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef _SMB2PDU_H 25*4882a593Smuzhiyun #define _SMB2PDU_H 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #include <net/sock.h> 28*4882a593Smuzhiyun #include <cifsacl.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 31*4882a593Smuzhiyun * Note that, due to trying to use names similar to the protocol specifications, 32*4882a593Smuzhiyun * there are many mixed case field names in the structures below. Although 33*4882a593Smuzhiyun * this does not match typical Linux kernel style, it is necessary to be 34*4882a593Smuzhiyun * able to match against the protocol specfication. 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * SMB2 commands 37*4882a593Smuzhiyun * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses 38*4882a593Smuzhiyun * (ie no useful data other than the SMB error code itself) and are marked such. 39*4882a593Smuzhiyun * Knowing this helps avoid response buffer allocations and copy in some cases. 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* List of commands in host endian */ 43*4882a593Smuzhiyun #define SMB2_NEGOTIATE_HE 0x0000 44*4882a593Smuzhiyun #define SMB2_SESSION_SETUP_HE 0x0001 45*4882a593Smuzhiyun #define SMB2_LOGOFF_HE 0x0002 /* trivial request/resp */ 46*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_HE 0x0003 47*4882a593Smuzhiyun #define SMB2_TREE_DISCONNECT_HE 0x0004 /* trivial req/resp */ 48*4882a593Smuzhiyun #define SMB2_CREATE_HE 0x0005 49*4882a593Smuzhiyun #define SMB2_CLOSE_HE 0x0006 50*4882a593Smuzhiyun #define SMB2_FLUSH_HE 0x0007 /* trivial resp */ 51*4882a593Smuzhiyun #define SMB2_READ_HE 0x0008 52*4882a593Smuzhiyun #define SMB2_WRITE_HE 0x0009 53*4882a593Smuzhiyun #define SMB2_LOCK_HE 0x000A 54*4882a593Smuzhiyun #define SMB2_IOCTL_HE 0x000B 55*4882a593Smuzhiyun #define SMB2_CANCEL_HE 0x000C 56*4882a593Smuzhiyun #define SMB2_ECHO_HE 0x000D 57*4882a593Smuzhiyun #define SMB2_QUERY_DIRECTORY_HE 0x000E 58*4882a593Smuzhiyun #define SMB2_CHANGE_NOTIFY_HE 0x000F 59*4882a593Smuzhiyun #define SMB2_QUERY_INFO_HE 0x0010 60*4882a593Smuzhiyun #define SMB2_SET_INFO_HE 0x0011 61*4882a593Smuzhiyun #define SMB2_OPLOCK_BREAK_HE 0x0012 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* The same list in little endian */ 64*4882a593Smuzhiyun #define SMB2_NEGOTIATE cpu_to_le16(SMB2_NEGOTIATE_HE) 65*4882a593Smuzhiyun #define SMB2_SESSION_SETUP cpu_to_le16(SMB2_SESSION_SETUP_HE) 66*4882a593Smuzhiyun #define SMB2_LOGOFF cpu_to_le16(SMB2_LOGOFF_HE) 67*4882a593Smuzhiyun #define SMB2_TREE_CONNECT cpu_to_le16(SMB2_TREE_CONNECT_HE) 68*4882a593Smuzhiyun #define SMB2_TREE_DISCONNECT cpu_to_le16(SMB2_TREE_DISCONNECT_HE) 69*4882a593Smuzhiyun #define SMB2_CREATE cpu_to_le16(SMB2_CREATE_HE) 70*4882a593Smuzhiyun #define SMB2_CLOSE cpu_to_le16(SMB2_CLOSE_HE) 71*4882a593Smuzhiyun #define SMB2_FLUSH cpu_to_le16(SMB2_FLUSH_HE) 72*4882a593Smuzhiyun #define SMB2_READ cpu_to_le16(SMB2_READ_HE) 73*4882a593Smuzhiyun #define SMB2_WRITE cpu_to_le16(SMB2_WRITE_HE) 74*4882a593Smuzhiyun #define SMB2_LOCK cpu_to_le16(SMB2_LOCK_HE) 75*4882a593Smuzhiyun #define SMB2_IOCTL cpu_to_le16(SMB2_IOCTL_HE) 76*4882a593Smuzhiyun #define SMB2_CANCEL cpu_to_le16(SMB2_CANCEL_HE) 77*4882a593Smuzhiyun #define SMB2_ECHO cpu_to_le16(SMB2_ECHO_HE) 78*4882a593Smuzhiyun #define SMB2_QUERY_DIRECTORY cpu_to_le16(SMB2_QUERY_DIRECTORY_HE) 79*4882a593Smuzhiyun #define SMB2_CHANGE_NOTIFY cpu_to_le16(SMB2_CHANGE_NOTIFY_HE) 80*4882a593Smuzhiyun #define SMB2_QUERY_INFO cpu_to_le16(SMB2_QUERY_INFO_HE) 81*4882a593Smuzhiyun #define SMB2_SET_INFO cpu_to_le16(SMB2_SET_INFO_HE) 82*4882a593Smuzhiyun #define SMB2_OPLOCK_BREAK cpu_to_le16(SMB2_OPLOCK_BREAK_HE) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define SMB2_INTERNAL_CMD cpu_to_le16(0xFFFF) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define NUMBER_OF_SMB2_COMMANDS 0x0013 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* 52 transform hdr + 64 hdr + 88 create rsp */ 89*4882a593Smuzhiyun #define SMB2_TRANSFORM_HEADER_SIZE 52 90*4882a593Smuzhiyun #define MAX_SMB2_HDR_SIZE 204 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define SMB2_PROTO_NUMBER cpu_to_le32(0x424d53fe) 93*4882a593Smuzhiyun #define SMB2_TRANSFORM_PROTO_NUM cpu_to_le32(0x424d53fd) 94*4882a593Smuzhiyun #define SMB2_COMPRESSION_TRANSFORM_ID cpu_to_le32(0x424d53fc) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* 97*4882a593Smuzhiyun * SMB2 Header Definition 98*4882a593Smuzhiyun * 99*4882a593Smuzhiyun * "MBZ" : Must be Zero 100*4882a593Smuzhiyun * "BB" : BugBug, Something to check/review/analyze later 101*4882a593Smuzhiyun * "PDU" : "Protocol Data Unit" (ie a network "frame") 102*4882a593Smuzhiyun * 103*4882a593Smuzhiyun */ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define SMB2_HEADER_STRUCTURE_SIZE cpu_to_le16(64) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct smb2_sync_hdr { 108*4882a593Smuzhiyun __le32 ProtocolId; /* 0xFE 'S' 'M' 'B' */ 109*4882a593Smuzhiyun __le16 StructureSize; /* 64 */ 110*4882a593Smuzhiyun __le16 CreditCharge; /* MBZ */ 111*4882a593Smuzhiyun __le32 Status; /* Error from server */ 112*4882a593Smuzhiyun __le16 Command; 113*4882a593Smuzhiyun __le16 CreditRequest; /* CreditResponse */ 114*4882a593Smuzhiyun __le32 Flags; 115*4882a593Smuzhiyun __le32 NextCommand; 116*4882a593Smuzhiyun __le64 MessageId; 117*4882a593Smuzhiyun __le32 ProcessId; 118*4882a593Smuzhiyun __u32 TreeId; /* opaque - so do not make little endian */ 119*4882a593Smuzhiyun __u64 SessionId; /* opaque - so do not make little endian */ 120*4882a593Smuzhiyun __u8 Signature[16]; 121*4882a593Smuzhiyun } __packed; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* The total header size for SMB2 read and write */ 124*4882a593Smuzhiyun #define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_sync_hdr)) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun struct smb2_sync_pdu { 127*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 128*4882a593Smuzhiyun __le16 StructureSize2; /* size of wct area (varies, request specific) */ 129*4882a593Smuzhiyun } __packed; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define SMB3_AES_CCM_NONCE 11 132*4882a593Smuzhiyun #define SMB3_AES_GCM_NONCE 12 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* Transform flags (for 3.0 dialect this flag indicates CCM */ 135*4882a593Smuzhiyun #define TRANSFORM_FLAG_ENCRYPTED 0x0001 136*4882a593Smuzhiyun struct smb2_transform_hdr { 137*4882a593Smuzhiyun __le32 ProtocolId; /* 0xFD 'S' 'M' 'B' */ 138*4882a593Smuzhiyun __u8 Signature[16]; 139*4882a593Smuzhiyun __u8 Nonce[16]; 140*4882a593Smuzhiyun __le32 OriginalMessageSize; 141*4882a593Smuzhiyun __u16 Reserved1; 142*4882a593Smuzhiyun __le16 Flags; /* EncryptionAlgorithm for 3.0, enc enabled for 3.1.1 */ 143*4882a593Smuzhiyun __u64 SessionId; 144*4882a593Smuzhiyun } __packed; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* See MS-SMB2 2.2.42 */ 147*4882a593Smuzhiyun struct smb2_compression_transform_hdr { 148*4882a593Smuzhiyun __le32 ProtocolId; /* 0xFC 'S' 'M' 'B' */ 149*4882a593Smuzhiyun __le32 OriginalCompressedSegmentSize; 150*4882a593Smuzhiyun __le16 CompressionAlgorithm; 151*4882a593Smuzhiyun __le16 Flags; 152*4882a593Smuzhiyun __le16 Length; /* if chained it is length, else offset */ 153*4882a593Smuzhiyun } __packed; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* See MS-SMB2 2.2.42.1 */ 156*4882a593Smuzhiyun #define SMB2_COMPRESSION_FLAG_NONE 0x0000 157*4882a593Smuzhiyun #define SMB2_COMPRESSION_FLAG_CHAINED 0x0001 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun struct compression_payload_header { 160*4882a593Smuzhiyun __le16 CompressionAlgorithm; 161*4882a593Smuzhiyun __le16 Flags; 162*4882a593Smuzhiyun __le32 Length; /* length of compressed playload including field below if present */ 163*4882a593Smuzhiyun /* __le32 OriginalPayloadSize; */ /* optional */ 164*4882a593Smuzhiyun } __packed; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* See MS-SMB2 2.2.42.2 */ 167*4882a593Smuzhiyun struct compression_pattern_payload_v1 { 168*4882a593Smuzhiyun __le16 Pattern; 169*4882a593Smuzhiyun __le16 Reserved1; 170*4882a593Smuzhiyun __le16 Reserved2; 171*4882a593Smuzhiyun __le32 Repetitions; 172*4882a593Smuzhiyun } __packed; 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun /* See MS-SMB2 2.2.43 */ 175*4882a593Smuzhiyun struct smb2_rdma_transform { 176*4882a593Smuzhiyun __le16 RdmaDescriptorOffset; 177*4882a593Smuzhiyun __le16 RdmaDescriptorLength; 178*4882a593Smuzhiyun __le32 Channel; /* for values see channel description in smb2 read above */ 179*4882a593Smuzhiyun __le16 TransformCount; 180*4882a593Smuzhiyun __le16 Reserved1; 181*4882a593Smuzhiyun __le32 Reserved2; 182*4882a593Smuzhiyun } __packed; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun struct smb2_rdma_encryption_transform { 185*4882a593Smuzhiyun __le16 TransformType; 186*4882a593Smuzhiyun __le16 SignatureLength; 187*4882a593Smuzhiyun __le16 NonceLength; 188*4882a593Smuzhiyun __u16 Reserved; 189*4882a593Smuzhiyun __u8 Signature[]; /* variable length */ 190*4882a593Smuzhiyun /* u8 Nonce[] */ 191*4882a593Smuzhiyun /* followed by padding */ 192*4882a593Smuzhiyun } __packed; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* 195*4882a593Smuzhiyun * SMB2 flag definitions 196*4882a593Smuzhiyun */ 197*4882a593Smuzhiyun #define SMB2_FLAGS_SERVER_TO_REDIR cpu_to_le32(0x00000001) 198*4882a593Smuzhiyun #define SMB2_FLAGS_ASYNC_COMMAND cpu_to_le32(0x00000002) 199*4882a593Smuzhiyun #define SMB2_FLAGS_RELATED_OPERATIONS cpu_to_le32(0x00000004) 200*4882a593Smuzhiyun #define SMB2_FLAGS_SIGNED cpu_to_le32(0x00000008) 201*4882a593Smuzhiyun #define SMB2_FLAGS_PRIORITY_MASK cpu_to_le32(0x00000070) /* SMB3.1.1 */ 202*4882a593Smuzhiyun #define SMB2_FLAGS_DFS_OPERATIONS cpu_to_le32(0x10000000) 203*4882a593Smuzhiyun #define SMB2_FLAGS_REPLAY_OPERATION cpu_to_le32(0x20000000) /* SMB3 & up */ 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun /* 206*4882a593Smuzhiyun * Definitions for SMB2 Protocol Data Units (network frames) 207*4882a593Smuzhiyun * 208*4882a593Smuzhiyun * See MS-SMB2.PDF specification for protocol details. 209*4882a593Smuzhiyun * The Naming convention is the lower case version of the SMB2 210*4882a593Smuzhiyun * command code name for the struct. Note that structures must be packed. 211*4882a593Smuzhiyun * 212*4882a593Smuzhiyun */ 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define COMPOUND_FID 0xFFFFFFFFFFFFFFFFULL 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun #define SMB2_ERROR_STRUCTURE_SIZE2 cpu_to_le16(9) 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun struct smb2_err_rsp { 219*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 220*4882a593Smuzhiyun __le16 StructureSize; 221*4882a593Smuzhiyun __le16 Reserved; /* MBZ */ 222*4882a593Smuzhiyun __le32 ByteCount; /* even if zero, at least one byte follows */ 223*4882a593Smuzhiyun __u8 ErrorData[1]; /* variable length */ 224*4882a593Smuzhiyun } __packed; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define SYMLINK_ERROR_TAG 0x4c4d5953 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun struct smb2_symlink_err_rsp { 229*4882a593Smuzhiyun __le32 SymLinkLength; 230*4882a593Smuzhiyun __le32 SymLinkErrorTag; 231*4882a593Smuzhiyun __le32 ReparseTag; 232*4882a593Smuzhiyun __le16 ReparseDataLength; 233*4882a593Smuzhiyun __le16 UnparsedPathLength; 234*4882a593Smuzhiyun __le16 SubstituteNameOffset; 235*4882a593Smuzhiyun __le16 SubstituteNameLength; 236*4882a593Smuzhiyun __le16 PrintNameOffset; 237*4882a593Smuzhiyun __le16 PrintNameLength; 238*4882a593Smuzhiyun __le32 Flags; 239*4882a593Smuzhiyun __u8 PathBuffer[]; 240*4882a593Smuzhiyun } __packed; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* SMB 3.1.1 and later dialects. See MS-SMB2 section 2.2.2.1 */ 243*4882a593Smuzhiyun struct smb2_error_context_rsp { 244*4882a593Smuzhiyun __le32 ErrorDataLength; 245*4882a593Smuzhiyun __le32 ErrorId; 246*4882a593Smuzhiyun __u8 ErrorContextData; /* ErrorDataLength long array */ 247*4882a593Smuzhiyun } __packed; 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /* ErrorId values */ 250*4882a593Smuzhiyun #define SMB2_ERROR_ID_DEFAULT 0x00000000 251*4882a593Smuzhiyun #define SMB2_ERROR_ID_SHARE_REDIRECT cpu_to_le32(0x72645253) /* "rdRS" */ 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* Defines for Type field below (see MS-SMB2 2.2.2.2.2.1) */ 254*4882a593Smuzhiyun #define MOVE_DST_IPADDR_V4 cpu_to_le32(0x00000001) 255*4882a593Smuzhiyun #define MOVE_DST_IPADDR_V6 cpu_to_le32(0x00000002) 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun struct move_dst_ipaddr { 258*4882a593Smuzhiyun __le32 Type; 259*4882a593Smuzhiyun __u32 Reserved; 260*4882a593Smuzhiyun __u8 address[16]; /* IPv4 followed by 12 bytes rsvd or IPv6 address */ 261*4882a593Smuzhiyun } __packed; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun struct share_redirect_error_context_rsp { 264*4882a593Smuzhiyun __le32 StructureSize; 265*4882a593Smuzhiyun __le32 NotificationType; 266*4882a593Smuzhiyun __le32 ResourceNameOffset; 267*4882a593Smuzhiyun __le32 ResourceNameLength; 268*4882a593Smuzhiyun __le16 Flags; 269*4882a593Smuzhiyun __le16 TargetType; 270*4882a593Smuzhiyun __le32 IPAddrCount; 271*4882a593Smuzhiyun struct move_dst_ipaddr IpAddrMoveList[]; 272*4882a593Smuzhiyun /* __u8 ResourceName[] */ /* Name of share as counted Unicode string */ 273*4882a593Smuzhiyun } __packed; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun #define SMB2_CLIENT_GUID_SIZE 16 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun struct smb2_negotiate_req { 278*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 279*4882a593Smuzhiyun __le16 StructureSize; /* Must be 36 */ 280*4882a593Smuzhiyun __le16 DialectCount; 281*4882a593Smuzhiyun __le16 SecurityMode; 282*4882a593Smuzhiyun __le16 Reserved; /* MBZ */ 283*4882a593Smuzhiyun __le32 Capabilities; 284*4882a593Smuzhiyun __u8 ClientGUID[SMB2_CLIENT_GUID_SIZE]; 285*4882a593Smuzhiyun /* In SMB3.02 and earlier next three were MBZ le64 ClientStartTime */ 286*4882a593Smuzhiyun __le32 NegotiateContextOffset; /* SMB3.1.1 only. MBZ earlier */ 287*4882a593Smuzhiyun __le16 NegotiateContextCount; /* SMB3.1.1 only. MBZ earlier */ 288*4882a593Smuzhiyun __le16 Reserved2; 289*4882a593Smuzhiyun __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */ 290*4882a593Smuzhiyun } __packed; 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /* Dialects */ 293*4882a593Smuzhiyun #define SMB10_PROT_ID 0x0000 /* local only, not sent on wire w/CIFS negprot */ 294*4882a593Smuzhiyun #define SMB20_PROT_ID 0x0202 295*4882a593Smuzhiyun #define SMB21_PROT_ID 0x0210 296*4882a593Smuzhiyun #define SMB30_PROT_ID 0x0300 297*4882a593Smuzhiyun #define SMB302_PROT_ID 0x0302 298*4882a593Smuzhiyun #define SMB311_PROT_ID 0x0311 299*4882a593Smuzhiyun #define BAD_PROT_ID 0xFFFF 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /* SecurityMode flags */ 302*4882a593Smuzhiyun #define SMB2_NEGOTIATE_SIGNING_ENABLED 0x0001 303*4882a593Smuzhiyun #define SMB2_NEGOTIATE_SIGNING_REQUIRED 0x0002 304*4882a593Smuzhiyun #define SMB2_SEC_MODE_FLAGS_ALL 0x0003 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun /* Capabilities flags */ 307*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_DFS 0x00000001 308*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_LEASING 0x00000002 /* Resp only New to SMB2.1 */ 309*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_LARGE_MTU 0X00000004 /* Resp only New to SMB2.1 */ 310*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_MULTI_CHANNEL 0x00000008 /* New to SMB3 */ 311*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_PERSISTENT_HANDLES 0x00000010 /* New to SMB3 */ 312*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_DIRECTORY_LEASING 0x00000020 /* New to SMB3 */ 313*4882a593Smuzhiyun #define SMB2_GLOBAL_CAP_ENCRYPTION 0x00000040 /* New to SMB3 */ 314*4882a593Smuzhiyun /* Internal types */ 315*4882a593Smuzhiyun #define SMB2_NT_FIND 0x00100000 316*4882a593Smuzhiyun #define SMB2_LARGE_FILES 0x00200000 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* Negotiate Contexts - ContextTypes. See MS-SMB2 section 2.2.3.1 for details */ 320*4882a593Smuzhiyun #define SMB2_PREAUTH_INTEGRITY_CAPABILITIES cpu_to_le16(1) 321*4882a593Smuzhiyun #define SMB2_ENCRYPTION_CAPABILITIES cpu_to_le16(2) 322*4882a593Smuzhiyun #define SMB2_COMPRESSION_CAPABILITIES cpu_to_le16(3) 323*4882a593Smuzhiyun #define SMB2_NETNAME_NEGOTIATE_CONTEXT_ID cpu_to_le16(5) 324*4882a593Smuzhiyun #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6) 325*4882a593Smuzhiyun #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7) 326*4882a593Smuzhiyun #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8) 327*4882a593Smuzhiyun #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100) 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun struct smb2_neg_context { 330*4882a593Smuzhiyun __le16 ContextType; 331*4882a593Smuzhiyun __le16 DataLength; 332*4882a593Smuzhiyun __le32 Reserved; 333*4882a593Smuzhiyun /* Followed by array of data */ 334*4882a593Smuzhiyun } __packed; 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun #define SMB311_LINUX_CLIENT_SALT_SIZE 32 337*4882a593Smuzhiyun /* Hash Algorithm Types */ 338*4882a593Smuzhiyun #define SMB2_PREAUTH_INTEGRITY_SHA512 cpu_to_le16(0x0001) 339*4882a593Smuzhiyun #define SMB2_PREAUTH_HASH_SIZE 64 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /* 342*4882a593Smuzhiyun * SaltLength that the server send can be zero, so the only three required 343*4882a593Smuzhiyun * fields (all __le16) end up six bytes total, so the minimum context data len 344*4882a593Smuzhiyun * in the response is six bytes which accounts for 345*4882a593Smuzhiyun * 346*4882a593Smuzhiyun * HashAlgorithmCount, SaltLength, and 1 HashAlgorithm. 347*4882a593Smuzhiyun */ 348*4882a593Smuzhiyun #define MIN_PREAUTH_CTXT_DATA_LEN 6 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun struct smb2_preauth_neg_context { 351*4882a593Smuzhiyun __le16 ContextType; /* 1 */ 352*4882a593Smuzhiyun __le16 DataLength; 353*4882a593Smuzhiyun __le32 Reserved; 354*4882a593Smuzhiyun __le16 HashAlgorithmCount; /* 1 */ 355*4882a593Smuzhiyun __le16 SaltLength; 356*4882a593Smuzhiyun __le16 HashAlgorithms; /* HashAlgorithms[0] since only one defined */ 357*4882a593Smuzhiyun __u8 Salt[SMB311_LINUX_CLIENT_SALT_SIZE]; 358*4882a593Smuzhiyun } __packed; 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun /* Encryption Algorithms Ciphers */ 361*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES128_CCM cpu_to_le16(0x0001) 362*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES128_GCM cpu_to_le16(0x0002) 363*4882a593Smuzhiyun /* we currently do not request AES256_CCM since presumably GCM faster */ 364*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES256_CCM cpu_to_le16(0x0003) 365*4882a593Smuzhiyun #define SMB2_ENCRYPTION_AES256_GCM cpu_to_le16(0x0004) 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /* Min encrypt context data is one cipher so 2 bytes + 2 byte count field */ 368*4882a593Smuzhiyun #define MIN_ENCRYPT_CTXT_DATA_LEN 4 369*4882a593Smuzhiyun struct smb2_encryption_neg_context { 370*4882a593Smuzhiyun __le16 ContextType; /* 2 */ 371*4882a593Smuzhiyun __le16 DataLength; 372*4882a593Smuzhiyun __le32 Reserved; 373*4882a593Smuzhiyun /* CipherCount usally 2, but can be 3 when AES256-GCM enabled */ 374*4882a593Smuzhiyun __le16 CipherCount; /* AES128-GCM and AES128-CCM by default */ 375*4882a593Smuzhiyun __le16 Ciphers[3]; 376*4882a593Smuzhiyun } __packed; 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun /* See MS-SMB2 2.2.3.1.3 */ 379*4882a593Smuzhiyun #define SMB3_COMPRESS_NONE cpu_to_le16(0x0000) 380*4882a593Smuzhiyun #define SMB3_COMPRESS_LZNT1 cpu_to_le16(0x0001) 381*4882a593Smuzhiyun #define SMB3_COMPRESS_LZ77 cpu_to_le16(0x0002) 382*4882a593Smuzhiyun #define SMB3_COMPRESS_LZ77_HUFF cpu_to_le16(0x0003) 383*4882a593Smuzhiyun /* Pattern scanning algorithm See MS-SMB2 3.1.4.4.1 */ 384*4882a593Smuzhiyun #define SMB3_COMPRESS_PATTERN cpu_to_le16(0x0004) /* Pattern_V1 */ 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun /* Compression Flags */ 387*4882a593Smuzhiyun #define SMB2_COMPRESSION_CAPABILITIES_FLAG_NONE cpu_to_le32(0x00000000) 388*4882a593Smuzhiyun #define SMB2_COMPRESSION_CAPABILITIES_FLAG_CHAINED cpu_to_le32(0x00000001) 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun struct smb2_compression_capabilities_context { 391*4882a593Smuzhiyun __le16 ContextType; /* 3 */ 392*4882a593Smuzhiyun __le16 DataLength; 393*4882a593Smuzhiyun __u32 Reserved; 394*4882a593Smuzhiyun __le16 CompressionAlgorithmCount; 395*4882a593Smuzhiyun __u16 Padding; 396*4882a593Smuzhiyun __u32 Flags; 397*4882a593Smuzhiyun __le16 CompressionAlgorithms[3]; 398*4882a593Smuzhiyun } __packed; 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun /* 401*4882a593Smuzhiyun * For smb2_netname_negotiate_context_id See MS-SMB2 2.2.3.1.4. 402*4882a593Smuzhiyun * Its struct simply contains NetName, an array of Unicode characters 403*4882a593Smuzhiyun */ 404*4882a593Smuzhiyun struct smb2_netname_neg_context { 405*4882a593Smuzhiyun __le16 ContextType; /* 5 */ 406*4882a593Smuzhiyun __le16 DataLength; 407*4882a593Smuzhiyun __le32 Reserved; 408*4882a593Smuzhiyun __le16 NetName[]; /* hostname of target converted to UCS-2 */ 409*4882a593Smuzhiyun } __packed; 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun /* 412*4882a593Smuzhiyun * For rdma transform capabilities context see MS-SMB2 2.2.3.1.6 413*4882a593Smuzhiyun * and 2.2.4.1.5 414*4882a593Smuzhiyun */ 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun /* RDMA Transform IDs */ 417*4882a593Smuzhiyun #define SMB2_RDMA_TRANSFORM_NONE 0x0000 418*4882a593Smuzhiyun #define SMB2_RDMA_TRANSFORM_ENCRYPTION 0x0001 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun struct smb2_rdma_transform_capabilities_context { 421*4882a593Smuzhiyun __le16 ContextType; /* 7 */ 422*4882a593Smuzhiyun __le16 DataLength; 423*4882a593Smuzhiyun __u32 Reserved; 424*4882a593Smuzhiyun __le16 TransformCount; 425*4882a593Smuzhiyun __u16 Reserved1; 426*4882a593Smuzhiyun __u32 Reserved2; 427*4882a593Smuzhiyun __le16 RDMATransformIds[1]; 428*4882a593Smuzhiyun } __packed; 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun /* Signing algorithms */ 431*4882a593Smuzhiyun #define SIGNING_ALG_HMAC_SHA256 0 432*4882a593Smuzhiyun #define SIGNING_ALG_AES_CMAC 1 433*4882a593Smuzhiyun #define SIGNING_ALG_AES_GMAC 2 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun struct smb2_signing_capabilities { 436*4882a593Smuzhiyun __le16 ContextType; /* 8 */ 437*4882a593Smuzhiyun __le16 DataLength; 438*4882a593Smuzhiyun __u32 Reserved; 439*4882a593Smuzhiyun __le16 SigningAlgorithmCount; 440*4882a593Smuzhiyun __le16 SigningAlgorithms[]; 441*4882a593Smuzhiyun } __packed; 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun #define POSIX_CTXT_DATA_LEN 16 444*4882a593Smuzhiyun struct smb2_posix_neg_context { 445*4882a593Smuzhiyun __le16 ContextType; /* 0x100 */ 446*4882a593Smuzhiyun __le16 DataLength; 447*4882a593Smuzhiyun __le32 Reserved; 448*4882a593Smuzhiyun __u8 Name[16]; /* POSIX ctxt GUID 93AD25509CB411E7B42383DE968BCD7C */ 449*4882a593Smuzhiyun } __packed; 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun struct smb2_negotiate_rsp { 452*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 453*4882a593Smuzhiyun __le16 StructureSize; /* Must be 65 */ 454*4882a593Smuzhiyun __le16 SecurityMode; 455*4882a593Smuzhiyun __le16 DialectRevision; 456*4882a593Smuzhiyun __le16 NegotiateContextCount; /* Prior to SMB3.1.1 was Reserved & MBZ */ 457*4882a593Smuzhiyun __u8 ServerGUID[16]; 458*4882a593Smuzhiyun __le32 Capabilities; 459*4882a593Smuzhiyun __le32 MaxTransactSize; 460*4882a593Smuzhiyun __le32 MaxReadSize; 461*4882a593Smuzhiyun __le32 MaxWriteSize; 462*4882a593Smuzhiyun __le64 SystemTime; /* MBZ */ 463*4882a593Smuzhiyun __le64 ServerStartTime; 464*4882a593Smuzhiyun __le16 SecurityBufferOffset; 465*4882a593Smuzhiyun __le16 SecurityBufferLength; 466*4882a593Smuzhiyun __le32 NegotiateContextOffset; /* Pre:SMB3.1.1 was reserved/ignored */ 467*4882a593Smuzhiyun __u8 Buffer[1]; /* variable length GSS security buffer */ 468*4882a593Smuzhiyun } __packed; 469*4882a593Smuzhiyun 470*4882a593Smuzhiyun /* Flags */ 471*4882a593Smuzhiyun #define SMB2_SESSION_REQ_FLAG_BINDING 0x01 472*4882a593Smuzhiyun #define SMB2_SESSION_REQ_FLAG_ENCRYPT_DATA 0x04 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun struct smb2_sess_setup_req { 475*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 476*4882a593Smuzhiyun __le16 StructureSize; /* Must be 25 */ 477*4882a593Smuzhiyun __u8 Flags; 478*4882a593Smuzhiyun __u8 SecurityMode; 479*4882a593Smuzhiyun __le32 Capabilities; 480*4882a593Smuzhiyun __le32 Channel; 481*4882a593Smuzhiyun __le16 SecurityBufferOffset; 482*4882a593Smuzhiyun __le16 SecurityBufferLength; 483*4882a593Smuzhiyun __u64 PreviousSessionId; 484*4882a593Smuzhiyun __u8 Buffer[1]; /* variable length GSS security buffer */ 485*4882a593Smuzhiyun } __packed; 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun /* Currently defined SessionFlags */ 488*4882a593Smuzhiyun #define SMB2_SESSION_FLAG_IS_GUEST 0x0001 489*4882a593Smuzhiyun #define SMB2_SESSION_FLAG_IS_NULL 0x0002 490*4882a593Smuzhiyun #define SMB2_SESSION_FLAG_ENCRYPT_DATA 0x0004 491*4882a593Smuzhiyun struct smb2_sess_setup_rsp { 492*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 493*4882a593Smuzhiyun __le16 StructureSize; /* Must be 9 */ 494*4882a593Smuzhiyun __le16 SessionFlags; 495*4882a593Smuzhiyun __le16 SecurityBufferOffset; 496*4882a593Smuzhiyun __le16 SecurityBufferLength; 497*4882a593Smuzhiyun __u8 Buffer[1]; /* variable length GSS security buffer */ 498*4882a593Smuzhiyun } __packed; 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun struct smb2_logoff_req { 501*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 502*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 503*4882a593Smuzhiyun __le16 Reserved; 504*4882a593Smuzhiyun } __packed; 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun struct smb2_logoff_rsp { 507*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 508*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 509*4882a593Smuzhiyun __le16 Reserved; 510*4882a593Smuzhiyun } __packed; 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun /* Flags/Reserved for SMB3.1.1 */ 513*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_FLAG_CLUSTER_RECONNECT cpu_to_le16(0x0001) 514*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_FLAG_REDIRECT_TO_OWNER cpu_to_le16(0x0002) 515*4882a593Smuzhiyun #define SMB2_TREE_CONNECT_FLAG_EXTENSION_PRESENT cpu_to_le16(0x0004) 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun struct smb2_tree_connect_req { 518*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 519*4882a593Smuzhiyun __le16 StructureSize; /* Must be 9 */ 520*4882a593Smuzhiyun __le16 Flags; /* Reserved MBZ for dialects prior to SMB3.1.1 */ 521*4882a593Smuzhiyun __le16 PathOffset; 522*4882a593Smuzhiyun __le16 PathLength; 523*4882a593Smuzhiyun __u8 Buffer[1]; /* variable length */ 524*4882a593Smuzhiyun } __packed; 525*4882a593Smuzhiyun 526*4882a593Smuzhiyun /* See MS-SMB2 section 2.2.9.2 */ 527*4882a593Smuzhiyun /* Context Types */ 528*4882a593Smuzhiyun #define SMB2_RESERVED_TREE_CONNECT_CONTEXT_ID 0x0000 529*4882a593Smuzhiyun #define SMB2_REMOTED_IDENTITY_TREE_CONNECT_CONTEXT_ID cpu_to_le16(0x0001) 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun struct tree_connect_contexts { 532*4882a593Smuzhiyun __le16 ContextType; 533*4882a593Smuzhiyun __le16 DataLength; 534*4882a593Smuzhiyun __le32 Reserved; 535*4882a593Smuzhiyun __u8 Data[]; 536*4882a593Smuzhiyun } __packed; 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun /* Remoted identity tree connect context structures - see MS-SMB2 2.2.9.2.1 */ 539*4882a593Smuzhiyun struct smb3_blob_data { 540*4882a593Smuzhiyun __le16 BlobSize; 541*4882a593Smuzhiyun __u8 BlobData[]; 542*4882a593Smuzhiyun } __packed; 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun /* Valid values for Attr */ 545*4882a593Smuzhiyun #define SE_GROUP_MANDATORY 0x00000001 546*4882a593Smuzhiyun #define SE_GROUP_ENABLED_BY_DEFAULT 0x00000002 547*4882a593Smuzhiyun #define SE_GROUP_ENABLED 0x00000004 548*4882a593Smuzhiyun #define SE_GROUP_OWNER 0x00000008 549*4882a593Smuzhiyun #define SE_GROUP_USE_FOR_DENY_ONLY 0x00000010 550*4882a593Smuzhiyun #define SE_GROUP_INTEGRITY 0x00000020 551*4882a593Smuzhiyun #define SE_GROUP_INTEGRITY_ENABLED 0x00000040 552*4882a593Smuzhiyun #define SE_GROUP_RESOURCE 0x20000000 553*4882a593Smuzhiyun #define SE_GROUP_LOGON_ID 0xC0000000 554*4882a593Smuzhiyun 555*4882a593Smuzhiyun /* struct sid_attr_data is SidData array in BlobData format then le32 Attr */ 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun struct sid_array_data { 558*4882a593Smuzhiyun __le16 SidAttrCount; 559*4882a593Smuzhiyun /* SidAttrList - array of sid_attr_data structs */ 560*4882a593Smuzhiyun } __packed; 561*4882a593Smuzhiyun 562*4882a593Smuzhiyun struct luid_attr_data { 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun } __packed; 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun /* 567*4882a593Smuzhiyun * struct privilege_data is the same as BLOB_DATA - see MS-SMB2 2.2.9.2.1.5 568*4882a593Smuzhiyun * but with size of LUID_ATTR_DATA struct and BlobData set to LUID_ATTR DATA 569*4882a593Smuzhiyun */ 570*4882a593Smuzhiyun 571*4882a593Smuzhiyun struct privilege_array_data { 572*4882a593Smuzhiyun __le16 PrivilegeCount; 573*4882a593Smuzhiyun /* array of privilege_data structs */ 574*4882a593Smuzhiyun } __packed; 575*4882a593Smuzhiyun 576*4882a593Smuzhiyun struct remoted_identity_tcon_context { 577*4882a593Smuzhiyun __le16 TicketType; /* must be 0x0001 */ 578*4882a593Smuzhiyun __le16 TicketSize; /* total size of this struct */ 579*4882a593Smuzhiyun __le16 User; /* offset to SID_ATTR_DATA struct with user info */ 580*4882a593Smuzhiyun __le16 UserName; /* offset to null terminated Unicode username string */ 581*4882a593Smuzhiyun __le16 Domain; /* offset to null terminated Unicode domain name */ 582*4882a593Smuzhiyun __le16 Groups; /* offset to SID_ARRAY_DATA struct with group info */ 583*4882a593Smuzhiyun __le16 RestrictedGroups; /* similar to above */ 584*4882a593Smuzhiyun __le16 Privileges; /* offset to PRIVILEGE_ARRAY_DATA struct */ 585*4882a593Smuzhiyun __le16 PrimaryGroup; /* offset to SID_ARRAY_DATA struct */ 586*4882a593Smuzhiyun __le16 Owner; /* offset to BLOB_DATA struct */ 587*4882a593Smuzhiyun __le16 DefaultDacl; /* offset to BLOB_DATA struct */ 588*4882a593Smuzhiyun __le16 DeviceGroups; /* offset to SID_ARRAY_DATA struct */ 589*4882a593Smuzhiyun __le16 UserClaims; /* offset to BLOB_DATA struct */ 590*4882a593Smuzhiyun __le16 DeviceClaims; /* offset to BLOB_DATA struct */ 591*4882a593Smuzhiyun __u8 TicketInfo[]; /* variable length buf - remoted identity data */ 592*4882a593Smuzhiyun } __packed; 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun struct smb2_tree_connect_req_extension { 595*4882a593Smuzhiyun __le32 TreeConnectContextOffset; 596*4882a593Smuzhiyun __le16 TreeConnectContextCount; 597*4882a593Smuzhiyun __u8 Reserved[10]; 598*4882a593Smuzhiyun __u8 PathName[]; /* variable sized array */ 599*4882a593Smuzhiyun /* followed by array of TreeConnectContexts */ 600*4882a593Smuzhiyun } __packed; 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun struct smb2_tree_connect_rsp { 603*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 604*4882a593Smuzhiyun __le16 StructureSize; /* Must be 16 */ 605*4882a593Smuzhiyun __u8 ShareType; /* see below */ 606*4882a593Smuzhiyun __u8 Reserved; 607*4882a593Smuzhiyun __le32 ShareFlags; /* see below */ 608*4882a593Smuzhiyun __le32 Capabilities; /* see below */ 609*4882a593Smuzhiyun __le32 MaximalAccess; 610*4882a593Smuzhiyun } __packed; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun /* Possible ShareType values */ 613*4882a593Smuzhiyun #define SMB2_SHARE_TYPE_DISK 0x01 614*4882a593Smuzhiyun #define SMB2_SHARE_TYPE_PIPE 0x02 615*4882a593Smuzhiyun #define SMB2_SHARE_TYPE_PRINT 0x03 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun /* 618*4882a593Smuzhiyun * Possible ShareFlags - exactly one and only one of the first 4 caching flags 619*4882a593Smuzhiyun * must be set (any of the remaining, SHI1005, flags may be set individually 620*4882a593Smuzhiyun * or in combination. 621*4882a593Smuzhiyun */ 622*4882a593Smuzhiyun #define SMB2_SHAREFLAG_MANUAL_CACHING 0x00000000 623*4882a593Smuzhiyun #define SMB2_SHAREFLAG_AUTO_CACHING 0x00000010 624*4882a593Smuzhiyun #define SMB2_SHAREFLAG_VDO_CACHING 0x00000020 625*4882a593Smuzhiyun #define SMB2_SHAREFLAG_NO_CACHING 0x00000030 626*4882a593Smuzhiyun #define SHI1005_FLAGS_DFS 0x00000001 627*4882a593Smuzhiyun #define SHI1005_FLAGS_DFS_ROOT 0x00000002 628*4882a593Smuzhiyun #define SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS 0x00000100 629*4882a593Smuzhiyun #define SHI1005_FLAGS_FORCE_SHARED_DELETE 0x00000200 630*4882a593Smuzhiyun #define SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING 0x00000400 631*4882a593Smuzhiyun #define SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM 0x00000800 632*4882a593Smuzhiyun #define SHI1005_FLAGS_FORCE_LEVELII_OPLOCK 0x00001000 633*4882a593Smuzhiyun #define SHI1005_FLAGS_ENABLE_HASH_V1 0x00002000 634*4882a593Smuzhiyun #define SHI1005_FLAGS_ENABLE_HASH_V2 0x00004000 635*4882a593Smuzhiyun #define SHI1005_FLAGS_ENCRYPT_DATA 0x00008000 636*4882a593Smuzhiyun #define SMB2_SHAREFLAG_IDENTITY_REMOTING 0x00040000 /* 3.1.1 */ 637*4882a593Smuzhiyun #define SHI1005_FLAGS_ALL 0x0004FF33 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun /* Possible share capabilities */ 640*4882a593Smuzhiyun #define SMB2_SHARE_CAP_DFS cpu_to_le32(0x00000008) /* all dialects */ 641*4882a593Smuzhiyun #define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY cpu_to_le32(0x00000010) /* 3.0 */ 642*4882a593Smuzhiyun #define SMB2_SHARE_CAP_SCALEOUT cpu_to_le32(0x00000020) /* 3.0 */ 643*4882a593Smuzhiyun #define SMB2_SHARE_CAP_CLUSTER cpu_to_le32(0x00000040) /* 3.0 */ 644*4882a593Smuzhiyun #define SMB2_SHARE_CAP_ASYMMETRIC cpu_to_le32(0x00000080) /* 3.02 */ 645*4882a593Smuzhiyun #define SMB2_SHARE_CAP_REDIRECT_TO_OWNER cpu_to_le32(0x00000100) /* 3.1.1 */ 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun struct smb2_tree_disconnect_req { 648*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 649*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 650*4882a593Smuzhiyun __le16 Reserved; 651*4882a593Smuzhiyun } __packed; 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun struct smb2_tree_disconnect_rsp { 654*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 655*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 656*4882a593Smuzhiyun __le16 Reserved; 657*4882a593Smuzhiyun } __packed; 658*4882a593Smuzhiyun 659*4882a593Smuzhiyun /* File Attrubutes */ 660*4882a593Smuzhiyun #define FILE_ATTRIBUTE_READONLY 0x00000001 661*4882a593Smuzhiyun #define FILE_ATTRIBUTE_HIDDEN 0x00000002 662*4882a593Smuzhiyun #define FILE_ATTRIBUTE_SYSTEM 0x00000004 663*4882a593Smuzhiyun #define FILE_ATTRIBUTE_DIRECTORY 0x00000010 664*4882a593Smuzhiyun #define FILE_ATTRIBUTE_ARCHIVE 0x00000020 665*4882a593Smuzhiyun #define FILE_ATTRIBUTE_NORMAL 0x00000080 666*4882a593Smuzhiyun #define FILE_ATTRIBUTE_TEMPORARY 0x00000100 667*4882a593Smuzhiyun #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 668*4882a593Smuzhiyun #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 669*4882a593Smuzhiyun #define FILE_ATTRIBUTE_COMPRESSED 0x00000800 670*4882a593Smuzhiyun #define FILE_ATTRIBUTE_OFFLINE 0x00001000 671*4882a593Smuzhiyun #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 672*4882a593Smuzhiyun #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 673*4882a593Smuzhiyun #define FILE_ATTRIBUTE_INTEGRITY_STREAM 0x00008000 674*4882a593Smuzhiyun #define FILE_ATTRIBUTE_NO_SCRUB_DATA 0x00020000 675*4882a593Smuzhiyun 676*4882a593Smuzhiyun /* Oplock levels */ 677*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_NONE 0x00 678*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_II 0x01 679*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_EXCLUSIVE 0x08 680*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_BATCH 0x09 681*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_LEASE 0xFF 682*4882a593Smuzhiyun /* Non-spec internal type */ 683*4882a593Smuzhiyun #define SMB2_OPLOCK_LEVEL_NOCHANGE 0x99 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun /* Desired Access Flags */ 686*4882a593Smuzhiyun #define FILE_READ_DATA_LE cpu_to_le32(0x00000001) 687*4882a593Smuzhiyun #define FILE_WRITE_DATA_LE cpu_to_le32(0x00000002) 688*4882a593Smuzhiyun #define FILE_APPEND_DATA_LE cpu_to_le32(0x00000004) 689*4882a593Smuzhiyun #define FILE_READ_EA_LE cpu_to_le32(0x00000008) 690*4882a593Smuzhiyun #define FILE_WRITE_EA_LE cpu_to_le32(0x00000010) 691*4882a593Smuzhiyun #define FILE_EXECUTE_LE cpu_to_le32(0x00000020) 692*4882a593Smuzhiyun #define FILE_READ_ATTRIBUTES_LE cpu_to_le32(0x00000080) 693*4882a593Smuzhiyun #define FILE_WRITE_ATTRIBUTES_LE cpu_to_le32(0x00000100) 694*4882a593Smuzhiyun #define FILE_DELETE_LE cpu_to_le32(0x00010000) 695*4882a593Smuzhiyun #define FILE_READ_CONTROL_LE cpu_to_le32(0x00020000) 696*4882a593Smuzhiyun #define FILE_WRITE_DAC_LE cpu_to_le32(0x00040000) 697*4882a593Smuzhiyun #define FILE_WRITE_OWNER_LE cpu_to_le32(0x00080000) 698*4882a593Smuzhiyun #define FILE_SYNCHRONIZE_LE cpu_to_le32(0x00100000) 699*4882a593Smuzhiyun #define FILE_ACCESS_SYSTEM_SECURITY_LE cpu_to_le32(0x01000000) 700*4882a593Smuzhiyun #define FILE_MAXIMAL_ACCESS_LE cpu_to_le32(0x02000000) 701*4882a593Smuzhiyun #define FILE_GENERIC_ALL_LE cpu_to_le32(0x10000000) 702*4882a593Smuzhiyun #define FILE_GENERIC_EXECUTE_LE cpu_to_le32(0x20000000) 703*4882a593Smuzhiyun #define FILE_GENERIC_WRITE_LE cpu_to_le32(0x40000000) 704*4882a593Smuzhiyun #define FILE_GENERIC_READ_LE cpu_to_le32(0x80000000) 705*4882a593Smuzhiyun 706*4882a593Smuzhiyun /* ShareAccess Flags */ 707*4882a593Smuzhiyun #define FILE_SHARE_READ_LE cpu_to_le32(0x00000001) 708*4882a593Smuzhiyun #define FILE_SHARE_WRITE_LE cpu_to_le32(0x00000002) 709*4882a593Smuzhiyun #define FILE_SHARE_DELETE_LE cpu_to_le32(0x00000004) 710*4882a593Smuzhiyun #define FILE_SHARE_ALL_LE cpu_to_le32(0x00000007) 711*4882a593Smuzhiyun 712*4882a593Smuzhiyun /* CreateDisposition Flags */ 713*4882a593Smuzhiyun #define FILE_SUPERSEDE_LE cpu_to_le32(0x00000000) 714*4882a593Smuzhiyun #define FILE_OPEN_LE cpu_to_le32(0x00000001) 715*4882a593Smuzhiyun #define FILE_CREATE_LE cpu_to_le32(0x00000002) 716*4882a593Smuzhiyun #define FILE_OPEN_IF_LE cpu_to_le32(0x00000003) 717*4882a593Smuzhiyun #define FILE_OVERWRITE_LE cpu_to_le32(0x00000004) 718*4882a593Smuzhiyun #define FILE_OVERWRITE_IF_LE cpu_to_le32(0x00000005) 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun /* CreateOptions Flags */ 721*4882a593Smuzhiyun #define FILE_DIRECTORY_FILE_LE cpu_to_le32(0x00000001) 722*4882a593Smuzhiyun /* same as #define CREATE_NOT_FILE_LE cpu_to_le32(0x00000001) */ 723*4882a593Smuzhiyun #define FILE_WRITE_THROUGH_LE cpu_to_le32(0x00000002) 724*4882a593Smuzhiyun #define FILE_SEQUENTIAL_ONLY_LE cpu_to_le32(0x00000004) 725*4882a593Smuzhiyun #define FILE_NO_INTERMEDIATE_BUFFERRING_LE cpu_to_le32(0x00000008) 726*4882a593Smuzhiyun #define FILE_SYNCHRONOUS_IO_ALERT_LE cpu_to_le32(0x00000010) 727*4882a593Smuzhiyun #define FILE_SYNCHRONOUS_IO_NON_ALERT_LE cpu_to_le32(0x00000020) 728*4882a593Smuzhiyun #define FILE_NON_DIRECTORY_FILE_LE cpu_to_le32(0x00000040) 729*4882a593Smuzhiyun #define FILE_COMPLETE_IF_OPLOCKED_LE cpu_to_le32(0x00000100) 730*4882a593Smuzhiyun #define FILE_NO_EA_KNOWLEDGE_LE cpu_to_le32(0x00000200) 731*4882a593Smuzhiyun #define FILE_RANDOM_ACCESS_LE cpu_to_le32(0x00000800) 732*4882a593Smuzhiyun #define FILE_DELETE_ON_CLOSE_LE cpu_to_le32(0x00001000) 733*4882a593Smuzhiyun #define FILE_OPEN_BY_FILE_ID_LE cpu_to_le32(0x00002000) 734*4882a593Smuzhiyun #define FILE_OPEN_FOR_BACKUP_INTENT_LE cpu_to_le32(0x00004000) 735*4882a593Smuzhiyun #define FILE_NO_COMPRESSION_LE cpu_to_le32(0x00008000) 736*4882a593Smuzhiyun #define FILE_RESERVE_OPFILTER_LE cpu_to_le32(0x00100000) 737*4882a593Smuzhiyun #define FILE_OPEN_REPARSE_POINT_LE cpu_to_le32(0x00200000) 738*4882a593Smuzhiyun #define FILE_OPEN_NO_RECALL_LE cpu_to_le32(0x00400000) 739*4882a593Smuzhiyun #define FILE_OPEN_FOR_FREE_SPACE_QUERY_LE cpu_to_le32(0x00800000) 740*4882a593Smuzhiyun 741*4882a593Smuzhiyun #define FILE_READ_RIGHTS_LE (FILE_READ_DATA_LE | FILE_READ_EA_LE \ 742*4882a593Smuzhiyun | FILE_READ_ATTRIBUTES_LE) 743*4882a593Smuzhiyun #define FILE_WRITE_RIGHTS_LE (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE \ 744*4882a593Smuzhiyun | FILE_WRITE_EA_LE | FILE_WRITE_ATTRIBUTES_LE) 745*4882a593Smuzhiyun #define FILE_EXEC_RIGHTS_LE (FILE_EXECUTE_LE) 746*4882a593Smuzhiyun 747*4882a593Smuzhiyun /* Impersonation Levels. See MS-WPO section 9.7 and MSDN-IMPERS */ 748*4882a593Smuzhiyun #define IL_ANONYMOUS cpu_to_le32(0x00000000) 749*4882a593Smuzhiyun #define IL_IDENTIFICATION cpu_to_le32(0x00000001) 750*4882a593Smuzhiyun #define IL_IMPERSONATION cpu_to_le32(0x00000002) 751*4882a593Smuzhiyun #define IL_DELEGATE cpu_to_le32(0x00000003) 752*4882a593Smuzhiyun 753*4882a593Smuzhiyun /* Create Context Values */ 754*4882a593Smuzhiyun #define SMB2_CREATE_EA_BUFFER "ExtA" /* extended attributes */ 755*4882a593Smuzhiyun #define SMB2_CREATE_SD_BUFFER "SecD" /* security descriptor */ 756*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_REQUEST "DHnQ" 757*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT "DHnC" 758*4882a593Smuzhiyun #define SMB2_CREATE_ALLOCATION_SIZE "AISi" 759*4882a593Smuzhiyun #define SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST "MxAc" 760*4882a593Smuzhiyun #define SMB2_CREATE_TIMEWARP_REQUEST "TWrp" 761*4882a593Smuzhiyun #define SMB2_CREATE_QUERY_ON_DISK_ID "QFid" 762*4882a593Smuzhiyun #define SMB2_CREATE_REQUEST_LEASE "RqLs" 763*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 "DH2Q" 764*4882a593Smuzhiyun #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 "DH2C" 765*4882a593Smuzhiyun #define SMB2_CREATE_APP_INSTANCE_ID 0x45BCA66AEFA7F74A9008FA462E144D74 766*4882a593Smuzhiyun #define SMB2_CREATE_APP_INSTANCE_VERSION 0xB982D0B73B56074FA07B524A8116A010 767*4882a593Smuzhiyun #define SVHDX_OPEN_DEVICE_CONTEX 0x9CCBCF9E04C1E643980E158DA1F6EC83 768*4882a593Smuzhiyun #define SMB2_CREATE_TAG_POSIX 0x93AD25509CB411E7B42383DE968BCD7C 769*4882a593Smuzhiyun 770*4882a593Smuzhiyun /* Flag (SMB3 open response) values */ 771*4882a593Smuzhiyun #define SMB2_CREATE_FLAG_REPARSEPOINT 0x01 772*4882a593Smuzhiyun 773*4882a593Smuzhiyun /* 774*4882a593Smuzhiyun * Maximum number of iovs we need for an open/create request. 775*4882a593Smuzhiyun * [0] : struct smb2_create_req 776*4882a593Smuzhiyun * [1] : path 777*4882a593Smuzhiyun * [2] : lease context 778*4882a593Smuzhiyun * [3] : durable context 779*4882a593Smuzhiyun * [4] : posix context 780*4882a593Smuzhiyun * [5] : time warp context 781*4882a593Smuzhiyun * [6] : query id context 782*4882a593Smuzhiyun * [7] : compound padding 783*4882a593Smuzhiyun */ 784*4882a593Smuzhiyun #define SMB2_CREATE_IOV_SIZE 8 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun struct smb2_create_req { 787*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 788*4882a593Smuzhiyun __le16 StructureSize; /* Must be 57 */ 789*4882a593Smuzhiyun __u8 SecurityFlags; 790*4882a593Smuzhiyun __u8 RequestedOplockLevel; 791*4882a593Smuzhiyun __le32 ImpersonationLevel; 792*4882a593Smuzhiyun __le64 SmbCreateFlags; 793*4882a593Smuzhiyun __le64 Reserved; 794*4882a593Smuzhiyun __le32 DesiredAccess; 795*4882a593Smuzhiyun __le32 FileAttributes; 796*4882a593Smuzhiyun __le32 ShareAccess; 797*4882a593Smuzhiyun __le32 CreateDisposition; 798*4882a593Smuzhiyun __le32 CreateOptions; 799*4882a593Smuzhiyun __le16 NameOffset; 800*4882a593Smuzhiyun __le16 NameLength; 801*4882a593Smuzhiyun __le32 CreateContextsOffset; 802*4882a593Smuzhiyun __le32 CreateContextsLength; 803*4882a593Smuzhiyun __u8 Buffer[]; 804*4882a593Smuzhiyun } __packed; 805*4882a593Smuzhiyun 806*4882a593Smuzhiyun /* 807*4882a593Smuzhiyun * Maximum size of a SMB2_CREATE response is 64 (smb2 header) + 808*4882a593Smuzhiyun * 88 (fixed part of create response) + 520 (path) + 208 (contexts) + 809*4882a593Smuzhiyun * 2 bytes of padding. 810*4882a593Smuzhiyun */ 811*4882a593Smuzhiyun #define MAX_SMB2_CREATE_RESPONSE_SIZE 880 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun struct smb2_create_rsp { 814*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 815*4882a593Smuzhiyun __le16 StructureSize; /* Must be 89 */ 816*4882a593Smuzhiyun __u8 OplockLevel; 817*4882a593Smuzhiyun __u8 Flag; /* 0x01 if reparse point */ 818*4882a593Smuzhiyun __le32 CreateAction; 819*4882a593Smuzhiyun __le64 CreationTime; 820*4882a593Smuzhiyun __le64 LastAccessTime; 821*4882a593Smuzhiyun __le64 LastWriteTime; 822*4882a593Smuzhiyun __le64 ChangeTime; 823*4882a593Smuzhiyun __le64 AllocationSize; 824*4882a593Smuzhiyun __le64 EndofFile; 825*4882a593Smuzhiyun __le32 FileAttributes; 826*4882a593Smuzhiyun __le32 Reserved2; 827*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 828*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 829*4882a593Smuzhiyun __le32 CreateContextsOffset; 830*4882a593Smuzhiyun __le32 CreateContextsLength; 831*4882a593Smuzhiyun __u8 Buffer[1]; 832*4882a593Smuzhiyun } __packed; 833*4882a593Smuzhiyun 834*4882a593Smuzhiyun struct create_context { 835*4882a593Smuzhiyun __le32 Next; 836*4882a593Smuzhiyun __le16 NameOffset; 837*4882a593Smuzhiyun __le16 NameLength; 838*4882a593Smuzhiyun __le16 Reserved; 839*4882a593Smuzhiyun __le16 DataOffset; 840*4882a593Smuzhiyun __le32 DataLength; 841*4882a593Smuzhiyun __u8 Buffer[]; 842*4882a593Smuzhiyun } __packed; 843*4882a593Smuzhiyun 844*4882a593Smuzhiyun #define SMB2_LEASE_READ_CACHING_HE 0x01 845*4882a593Smuzhiyun #define SMB2_LEASE_HANDLE_CACHING_HE 0x02 846*4882a593Smuzhiyun #define SMB2_LEASE_WRITE_CACHING_HE 0x04 847*4882a593Smuzhiyun 848*4882a593Smuzhiyun #define SMB2_LEASE_NONE cpu_to_le32(0x00) 849*4882a593Smuzhiyun #define SMB2_LEASE_READ_CACHING cpu_to_le32(0x01) 850*4882a593Smuzhiyun #define SMB2_LEASE_HANDLE_CACHING cpu_to_le32(0x02) 851*4882a593Smuzhiyun #define SMB2_LEASE_WRITE_CACHING cpu_to_le32(0x04) 852*4882a593Smuzhiyun 853*4882a593Smuzhiyun #define SMB2_LEASE_FLAG_BREAK_IN_PROGRESS cpu_to_le32(0x00000002) 854*4882a593Smuzhiyun #define SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET cpu_to_le32(0x00000004) 855*4882a593Smuzhiyun 856*4882a593Smuzhiyun #define SMB2_LEASE_KEY_SIZE 16 857*4882a593Smuzhiyun 858*4882a593Smuzhiyun struct lease_context { 859*4882a593Smuzhiyun u8 LeaseKey[SMB2_LEASE_KEY_SIZE]; 860*4882a593Smuzhiyun __le32 LeaseState; 861*4882a593Smuzhiyun __le32 LeaseFlags; 862*4882a593Smuzhiyun __le64 LeaseDuration; 863*4882a593Smuzhiyun } __packed; 864*4882a593Smuzhiyun 865*4882a593Smuzhiyun struct lease_context_v2 { 866*4882a593Smuzhiyun u8 LeaseKey[SMB2_LEASE_KEY_SIZE]; 867*4882a593Smuzhiyun __le32 LeaseState; 868*4882a593Smuzhiyun __le32 LeaseFlags; 869*4882a593Smuzhiyun __le64 LeaseDuration; 870*4882a593Smuzhiyun __le64 ParentLeaseKeyLow; 871*4882a593Smuzhiyun __le64 ParentLeaseKeyHigh; 872*4882a593Smuzhiyun __le16 Epoch; 873*4882a593Smuzhiyun __le16 Reserved; 874*4882a593Smuzhiyun } __packed; 875*4882a593Smuzhiyun 876*4882a593Smuzhiyun struct create_lease { 877*4882a593Smuzhiyun struct create_context ccontext; 878*4882a593Smuzhiyun __u8 Name[8]; 879*4882a593Smuzhiyun struct lease_context lcontext; 880*4882a593Smuzhiyun } __packed; 881*4882a593Smuzhiyun 882*4882a593Smuzhiyun struct create_lease_v2 { 883*4882a593Smuzhiyun struct create_context ccontext; 884*4882a593Smuzhiyun __u8 Name[8]; 885*4882a593Smuzhiyun struct lease_context_v2 lcontext; 886*4882a593Smuzhiyun __u8 Pad[4]; 887*4882a593Smuzhiyun } __packed; 888*4882a593Smuzhiyun 889*4882a593Smuzhiyun struct create_durable { 890*4882a593Smuzhiyun struct create_context ccontext; 891*4882a593Smuzhiyun __u8 Name[8]; 892*4882a593Smuzhiyun union { 893*4882a593Smuzhiyun __u8 Reserved[16]; 894*4882a593Smuzhiyun struct { 895*4882a593Smuzhiyun __u64 PersistentFileId; 896*4882a593Smuzhiyun __u64 VolatileFileId; 897*4882a593Smuzhiyun } Fid; 898*4882a593Smuzhiyun } Data; 899*4882a593Smuzhiyun } __packed; 900*4882a593Smuzhiyun 901*4882a593Smuzhiyun struct create_posix { 902*4882a593Smuzhiyun struct create_context ccontext; 903*4882a593Smuzhiyun __u8 Name[16]; 904*4882a593Smuzhiyun __le32 Mode; 905*4882a593Smuzhiyun __u32 Reserved; 906*4882a593Smuzhiyun } __packed; 907*4882a593Smuzhiyun 908*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.11 */ 909*4882a593Smuzhiyun /* Flags */ 910*4882a593Smuzhiyun #define SMB2_DHANDLE_FLAG_PERSISTENT 0x00000002 911*4882a593Smuzhiyun struct durable_context_v2 { 912*4882a593Smuzhiyun __le32 Timeout; 913*4882a593Smuzhiyun __le32 Flags; 914*4882a593Smuzhiyun __u64 Reserved; 915*4882a593Smuzhiyun __u8 CreateGuid[16]; 916*4882a593Smuzhiyun } __packed; 917*4882a593Smuzhiyun 918*4882a593Smuzhiyun struct create_durable_v2 { 919*4882a593Smuzhiyun struct create_context ccontext; 920*4882a593Smuzhiyun __u8 Name[8]; 921*4882a593Smuzhiyun struct durable_context_v2 dcontext; 922*4882a593Smuzhiyun } __packed; 923*4882a593Smuzhiyun 924*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.12 */ 925*4882a593Smuzhiyun struct durable_reconnect_context_v2 { 926*4882a593Smuzhiyun struct { 927*4882a593Smuzhiyun __u64 PersistentFileId; 928*4882a593Smuzhiyun __u64 VolatileFileId; 929*4882a593Smuzhiyun } Fid; 930*4882a593Smuzhiyun __u8 CreateGuid[16]; 931*4882a593Smuzhiyun __le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */ 932*4882a593Smuzhiyun } __packed; 933*4882a593Smuzhiyun 934*4882a593Smuzhiyun /* See MS-SMB2 2.2.14.2.9 */ 935*4882a593Smuzhiyun struct create_on_disk_id { 936*4882a593Smuzhiyun struct create_context ccontext; 937*4882a593Smuzhiyun __u8 Name[8]; 938*4882a593Smuzhiyun __le64 DiskFileId; 939*4882a593Smuzhiyun __le64 VolumeId; 940*4882a593Smuzhiyun __u32 Reserved[4]; 941*4882a593Smuzhiyun } __packed; 942*4882a593Smuzhiyun 943*4882a593Smuzhiyun /* See MS-SMB2 2.2.14.2.12 */ 944*4882a593Smuzhiyun struct durable_reconnect_context_v2_rsp { 945*4882a593Smuzhiyun __le32 Timeout; 946*4882a593Smuzhiyun __le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */ 947*4882a593Smuzhiyun } __packed; 948*4882a593Smuzhiyun 949*4882a593Smuzhiyun struct create_durable_handle_reconnect_v2 { 950*4882a593Smuzhiyun struct create_context ccontext; 951*4882a593Smuzhiyun __u8 Name[8]; 952*4882a593Smuzhiyun struct durable_reconnect_context_v2 dcontext; 953*4882a593Smuzhiyun __u8 Pad[4]; 954*4882a593Smuzhiyun } __packed; 955*4882a593Smuzhiyun 956*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.5 */ 957*4882a593Smuzhiyun struct crt_twarp_ctxt { 958*4882a593Smuzhiyun struct create_context ccontext; 959*4882a593Smuzhiyun __u8 Name[8]; 960*4882a593Smuzhiyun __le64 Timestamp; 961*4882a593Smuzhiyun 962*4882a593Smuzhiyun } __packed; 963*4882a593Smuzhiyun 964*4882a593Smuzhiyun /* See MS-SMB2 2.2.13.2.9 */ 965*4882a593Smuzhiyun struct crt_query_id_ctxt { 966*4882a593Smuzhiyun struct create_context ccontext; 967*4882a593Smuzhiyun __u8 Name[8]; 968*4882a593Smuzhiyun } __packed; 969*4882a593Smuzhiyun 970*4882a593Smuzhiyun struct crt_sd_ctxt { 971*4882a593Smuzhiyun struct create_context ccontext; 972*4882a593Smuzhiyun __u8 Name[8]; 973*4882a593Smuzhiyun struct smb3_sd sd; 974*4882a593Smuzhiyun } __packed; 975*4882a593Smuzhiyun 976*4882a593Smuzhiyun 977*4882a593Smuzhiyun #define COPY_CHUNK_RES_KEY_SIZE 24 978*4882a593Smuzhiyun struct resume_key_req { 979*4882a593Smuzhiyun char ResumeKey[COPY_CHUNK_RES_KEY_SIZE]; 980*4882a593Smuzhiyun __le32 ContextLength; /* MBZ */ 981*4882a593Smuzhiyun char Context[]; /* ignored, Windows sets to 4 bytes of zero */ 982*4882a593Smuzhiyun } __packed; 983*4882a593Smuzhiyun 984*4882a593Smuzhiyun /* this goes in the ioctl buffer when doing a copychunk request */ 985*4882a593Smuzhiyun struct copychunk_ioctl { 986*4882a593Smuzhiyun char SourceKey[COPY_CHUNK_RES_KEY_SIZE]; 987*4882a593Smuzhiyun __le32 ChunkCount; /* we are only sending 1 */ 988*4882a593Smuzhiyun __le32 Reserved; 989*4882a593Smuzhiyun /* array will only be one chunk long for us */ 990*4882a593Smuzhiyun __le64 SourceOffset; 991*4882a593Smuzhiyun __le64 TargetOffset; 992*4882a593Smuzhiyun __le32 Length; /* how many bytes to copy */ 993*4882a593Smuzhiyun __u32 Reserved2; 994*4882a593Smuzhiyun } __packed; 995*4882a593Smuzhiyun 996*4882a593Smuzhiyun /* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */ 997*4882a593Smuzhiyun struct file_zero_data_information { 998*4882a593Smuzhiyun __le64 FileOffset; 999*4882a593Smuzhiyun __le64 BeyondFinalZero; 1000*4882a593Smuzhiyun } __packed; 1001*4882a593Smuzhiyun 1002*4882a593Smuzhiyun struct copychunk_ioctl_rsp { 1003*4882a593Smuzhiyun __le32 ChunksWritten; 1004*4882a593Smuzhiyun __le32 ChunkBytesWritten; 1005*4882a593Smuzhiyun __le32 TotalBytesWritten; 1006*4882a593Smuzhiyun } __packed; 1007*4882a593Smuzhiyun 1008*4882a593Smuzhiyun /* See MS-FSCC 2.3.29 and 2.3.30 */ 1009*4882a593Smuzhiyun struct get_retrieval_pointer_count_req { 1010*4882a593Smuzhiyun __le64 StartingVcn; /* virtual cluster number (signed) */ 1011*4882a593Smuzhiyun } __packed; 1012*4882a593Smuzhiyun 1013*4882a593Smuzhiyun struct get_retrieval_pointer_count_rsp { 1014*4882a593Smuzhiyun __le32 ExtentCount; 1015*4882a593Smuzhiyun } __packed; 1016*4882a593Smuzhiyun 1017*4882a593Smuzhiyun /* 1018*4882a593Smuzhiyun * See MS-FSCC 2.3.33 and 2.3.34 1019*4882a593Smuzhiyun * request is the same as get_retrieval_point_count_req struct above 1020*4882a593Smuzhiyun */ 1021*4882a593Smuzhiyun struct smb3_extents { 1022*4882a593Smuzhiyun __le64 NextVcn; 1023*4882a593Smuzhiyun __le64 Lcn; /* logical cluster number */ 1024*4882a593Smuzhiyun } __packed; 1025*4882a593Smuzhiyun 1026*4882a593Smuzhiyun struct get_retrieval_pointers_refcount_rsp { 1027*4882a593Smuzhiyun __le32 ExtentCount; 1028*4882a593Smuzhiyun __u32 Reserved; 1029*4882a593Smuzhiyun __le64 StartingVcn; 1030*4882a593Smuzhiyun struct smb3_extents extents[]; 1031*4882a593Smuzhiyun } __packed; 1032*4882a593Smuzhiyun 1033*4882a593Smuzhiyun struct fsctl_set_integrity_information_req { 1034*4882a593Smuzhiyun __le16 ChecksumAlgorithm; 1035*4882a593Smuzhiyun __le16 Reserved; 1036*4882a593Smuzhiyun __le32 Flags; 1037*4882a593Smuzhiyun } __packed; 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun struct fsctl_get_integrity_information_rsp { 1040*4882a593Smuzhiyun __le16 ChecksumAlgorithm; 1041*4882a593Smuzhiyun __le16 Reserved; 1042*4882a593Smuzhiyun __le32 Flags; 1043*4882a593Smuzhiyun __le32 ChecksumChunkSizeInBytes; 1044*4882a593Smuzhiyun __le32 ClusterSizeInBytes; 1045*4882a593Smuzhiyun } __packed; 1046*4882a593Smuzhiyun 1047*4882a593Smuzhiyun struct file_allocated_range_buffer { 1048*4882a593Smuzhiyun __le64 file_offset; 1049*4882a593Smuzhiyun __le64 length; 1050*4882a593Smuzhiyun } __packed; 1051*4882a593Smuzhiyun 1052*4882a593Smuzhiyun /* Integrity ChecksumAlgorithm choices for above */ 1053*4882a593Smuzhiyun #define CHECKSUM_TYPE_NONE 0x0000 1054*4882a593Smuzhiyun #define CHECKSUM_TYPE_CRC64 0x0002 1055*4882a593Smuzhiyun #define CHECKSUM_TYPE_UNCHANGED 0xFFFF /* set only */ 1056*4882a593Smuzhiyun 1057*4882a593Smuzhiyun /* Integrity flags for above */ 1058*4882a593Smuzhiyun #define FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF 0x00000001 1059*4882a593Smuzhiyun 1060*4882a593Smuzhiyun /* Reparse structures - see MS-FSCC 2.1.2 */ 1061*4882a593Smuzhiyun 1062*4882a593Smuzhiyun /* struct fsctl_reparse_info_req is empty, only response structs (see below) */ 1063*4882a593Smuzhiyun 1064*4882a593Smuzhiyun struct reparse_data_buffer { 1065*4882a593Smuzhiyun __le32 ReparseTag; 1066*4882a593Smuzhiyun __le16 ReparseDataLength; 1067*4882a593Smuzhiyun __u16 Reserved; 1068*4882a593Smuzhiyun __u8 DataBuffer[]; /* Variable Length */ 1069*4882a593Smuzhiyun } __packed; 1070*4882a593Smuzhiyun 1071*4882a593Smuzhiyun struct reparse_guid_data_buffer { 1072*4882a593Smuzhiyun __le32 ReparseTag; 1073*4882a593Smuzhiyun __le16 ReparseDataLength; 1074*4882a593Smuzhiyun __u16 Reserved; 1075*4882a593Smuzhiyun __u8 ReparseGuid[16]; 1076*4882a593Smuzhiyun __u8 DataBuffer[]; /* Variable Length */ 1077*4882a593Smuzhiyun } __packed; 1078*4882a593Smuzhiyun 1079*4882a593Smuzhiyun struct reparse_mount_point_data_buffer { 1080*4882a593Smuzhiyun __le32 ReparseTag; 1081*4882a593Smuzhiyun __le16 ReparseDataLength; 1082*4882a593Smuzhiyun __u16 Reserved; 1083*4882a593Smuzhiyun __le16 SubstituteNameOffset; 1084*4882a593Smuzhiyun __le16 SubstituteNameLength; 1085*4882a593Smuzhiyun __le16 PrintNameOffset; 1086*4882a593Smuzhiyun __le16 PrintNameLength; 1087*4882a593Smuzhiyun __u8 PathBuffer[]; /* Variable Length */ 1088*4882a593Smuzhiyun } __packed; 1089*4882a593Smuzhiyun 1090*4882a593Smuzhiyun #define SYMLINK_FLAG_RELATIVE 0x00000001 1091*4882a593Smuzhiyun 1092*4882a593Smuzhiyun struct reparse_symlink_data_buffer { 1093*4882a593Smuzhiyun __le32 ReparseTag; 1094*4882a593Smuzhiyun __le16 ReparseDataLength; 1095*4882a593Smuzhiyun __u16 Reserved; 1096*4882a593Smuzhiyun __le16 SubstituteNameOffset; 1097*4882a593Smuzhiyun __le16 SubstituteNameLength; 1098*4882a593Smuzhiyun __le16 PrintNameOffset; 1099*4882a593Smuzhiyun __le16 PrintNameLength; 1100*4882a593Smuzhiyun __le32 Flags; 1101*4882a593Smuzhiyun __u8 PathBuffer[]; /* Variable Length */ 1102*4882a593Smuzhiyun } __packed; 1103*4882a593Smuzhiyun 1104*4882a593Smuzhiyun /* See MS-FSCC 2.1.2.6 and cifspdu.h for struct reparse_posix_data */ 1105*4882a593Smuzhiyun 1106*4882a593Smuzhiyun 1107*4882a593Smuzhiyun /* See MS-DFSC 2.2.2 */ 1108*4882a593Smuzhiyun struct fsctl_get_dfs_referral_req { 1109*4882a593Smuzhiyun __le16 MaxReferralLevel; 1110*4882a593Smuzhiyun __u8 RequestFileName[]; 1111*4882a593Smuzhiyun } __packed; 1112*4882a593Smuzhiyun 1113*4882a593Smuzhiyun /* DFS response is struct get_dfs_refer_rsp */ 1114*4882a593Smuzhiyun 1115*4882a593Smuzhiyun /* See MS-SMB2 2.2.31.3 */ 1116*4882a593Smuzhiyun struct network_resiliency_req { 1117*4882a593Smuzhiyun __le32 Timeout; 1118*4882a593Smuzhiyun __le32 Reserved; 1119*4882a593Smuzhiyun } __packed; 1120*4882a593Smuzhiyun /* There is no buffer for the response ie no struct network_resiliency_rsp */ 1121*4882a593Smuzhiyun 1122*4882a593Smuzhiyun 1123*4882a593Smuzhiyun struct validate_negotiate_info_req { 1124*4882a593Smuzhiyun __le32 Capabilities; 1125*4882a593Smuzhiyun __u8 Guid[SMB2_CLIENT_GUID_SIZE]; 1126*4882a593Smuzhiyun __le16 SecurityMode; 1127*4882a593Smuzhiyun __le16 DialectCount; 1128*4882a593Smuzhiyun __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */ 1129*4882a593Smuzhiyun } __packed; 1130*4882a593Smuzhiyun 1131*4882a593Smuzhiyun struct validate_negotiate_info_rsp { 1132*4882a593Smuzhiyun __le32 Capabilities; 1133*4882a593Smuzhiyun __u8 Guid[SMB2_CLIENT_GUID_SIZE]; 1134*4882a593Smuzhiyun __le16 SecurityMode; 1135*4882a593Smuzhiyun __le16 Dialect; /* Dialect in use for the connection */ 1136*4882a593Smuzhiyun } __packed; 1137*4882a593Smuzhiyun 1138*4882a593Smuzhiyun #define RSS_CAPABLE cpu_to_le32(0x00000001) 1139*4882a593Smuzhiyun #define RDMA_CAPABLE cpu_to_le32(0x00000002) 1140*4882a593Smuzhiyun 1141*4882a593Smuzhiyun #define INTERNETWORK cpu_to_le16(0x0002) 1142*4882a593Smuzhiyun #define INTERNETWORKV6 cpu_to_le16(0x0017) 1143*4882a593Smuzhiyun 1144*4882a593Smuzhiyun struct network_interface_info_ioctl_rsp { 1145*4882a593Smuzhiyun __le32 Next; /* next interface. zero if this is last one */ 1146*4882a593Smuzhiyun __le32 IfIndex; 1147*4882a593Smuzhiyun __le32 Capability; /* RSS or RDMA Capable */ 1148*4882a593Smuzhiyun __le32 Reserved; 1149*4882a593Smuzhiyun __le64 LinkSpeed; 1150*4882a593Smuzhiyun __le16 Family; 1151*4882a593Smuzhiyun __u8 Buffer[126]; 1152*4882a593Smuzhiyun } __packed; 1153*4882a593Smuzhiyun 1154*4882a593Smuzhiyun struct iface_info_ipv4 { 1155*4882a593Smuzhiyun __be16 Port; 1156*4882a593Smuzhiyun __be32 IPv4Address; 1157*4882a593Smuzhiyun __be64 Reserved; 1158*4882a593Smuzhiyun } __packed; 1159*4882a593Smuzhiyun 1160*4882a593Smuzhiyun struct iface_info_ipv6 { 1161*4882a593Smuzhiyun __be16 Port; 1162*4882a593Smuzhiyun __be32 FlowInfo; 1163*4882a593Smuzhiyun __u8 IPv6Address[16]; 1164*4882a593Smuzhiyun __be32 ScopeId; 1165*4882a593Smuzhiyun } __packed; 1166*4882a593Smuzhiyun 1167*4882a593Smuzhiyun #define NO_FILE_ID 0xFFFFFFFFFFFFFFFFULL /* general ioctls to srv not to file */ 1168*4882a593Smuzhiyun 1169*4882a593Smuzhiyun struct compress_ioctl { 1170*4882a593Smuzhiyun __le16 CompressionState; /* See cifspdu.h for possible flag values */ 1171*4882a593Smuzhiyun } __packed; 1172*4882a593Smuzhiyun 1173*4882a593Smuzhiyun struct duplicate_extents_to_file { 1174*4882a593Smuzhiyun __u64 PersistentFileHandle; /* source file handle, opaque endianness */ 1175*4882a593Smuzhiyun __u64 VolatileFileHandle; 1176*4882a593Smuzhiyun __le64 SourceFileOffset; 1177*4882a593Smuzhiyun __le64 TargetFileOffset; 1178*4882a593Smuzhiyun __le64 ByteCount; /* Bytes to be copied */ 1179*4882a593Smuzhiyun } __packed; 1180*4882a593Smuzhiyun 1181*4882a593Smuzhiyun /* 1182*4882a593Smuzhiyun * Maximum number of iovs we need for an ioctl request. 1183*4882a593Smuzhiyun * [0] : struct smb2_ioctl_req 1184*4882a593Smuzhiyun * [1] : in_data 1185*4882a593Smuzhiyun */ 1186*4882a593Smuzhiyun #define SMB2_IOCTL_IOV_SIZE 2 1187*4882a593Smuzhiyun 1188*4882a593Smuzhiyun struct smb2_ioctl_req { 1189*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1190*4882a593Smuzhiyun __le16 StructureSize; /* Must be 57 */ 1191*4882a593Smuzhiyun __u16 Reserved; 1192*4882a593Smuzhiyun __le32 CtlCode; 1193*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1194*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1195*4882a593Smuzhiyun __le32 InputOffset; 1196*4882a593Smuzhiyun __le32 InputCount; 1197*4882a593Smuzhiyun __le32 MaxInputResponse; 1198*4882a593Smuzhiyun __le32 OutputOffset; 1199*4882a593Smuzhiyun __le32 OutputCount; 1200*4882a593Smuzhiyun __le32 MaxOutputResponse; 1201*4882a593Smuzhiyun __le32 Flags; 1202*4882a593Smuzhiyun __u32 Reserved2; 1203*4882a593Smuzhiyun __u8 Buffer[]; 1204*4882a593Smuzhiyun } __packed; 1205*4882a593Smuzhiyun 1206*4882a593Smuzhiyun struct smb2_ioctl_rsp { 1207*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1208*4882a593Smuzhiyun __le16 StructureSize; /* Must be 57 */ 1209*4882a593Smuzhiyun __u16 Reserved; 1210*4882a593Smuzhiyun __le32 CtlCode; 1211*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1212*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1213*4882a593Smuzhiyun __le32 InputOffset; 1214*4882a593Smuzhiyun __le32 InputCount; 1215*4882a593Smuzhiyun __le32 OutputOffset; 1216*4882a593Smuzhiyun __le32 OutputCount; 1217*4882a593Smuzhiyun __le32 Flags; 1218*4882a593Smuzhiyun __u32 Reserved2; 1219*4882a593Smuzhiyun /* char * buffer[] */ 1220*4882a593Smuzhiyun } __packed; 1221*4882a593Smuzhiyun 1222*4882a593Smuzhiyun /* Currently defined values for close flags */ 1223*4882a593Smuzhiyun #define SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB cpu_to_le16(0x0001) 1224*4882a593Smuzhiyun struct smb2_close_req { 1225*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1226*4882a593Smuzhiyun __le16 StructureSize; /* Must be 24 */ 1227*4882a593Smuzhiyun __le16 Flags; 1228*4882a593Smuzhiyun __le32 Reserved; 1229*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1230*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1231*4882a593Smuzhiyun } __packed; 1232*4882a593Smuzhiyun 1233*4882a593Smuzhiyun /* 1234*4882a593Smuzhiyun * Maximum size of a SMB2_CLOSE response is 64 (smb2 header) + 60 (data) 1235*4882a593Smuzhiyun */ 1236*4882a593Smuzhiyun #define MAX_SMB2_CLOSE_RESPONSE_SIZE 124 1237*4882a593Smuzhiyun 1238*4882a593Smuzhiyun struct smb2_close_rsp { 1239*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1240*4882a593Smuzhiyun __le16 StructureSize; /* 60 */ 1241*4882a593Smuzhiyun __le16 Flags; 1242*4882a593Smuzhiyun __le32 Reserved; 1243*4882a593Smuzhiyun __le64 CreationTime; 1244*4882a593Smuzhiyun __le64 LastAccessTime; 1245*4882a593Smuzhiyun __le64 LastWriteTime; 1246*4882a593Smuzhiyun __le64 ChangeTime; 1247*4882a593Smuzhiyun __le64 AllocationSize; /* Beginning of FILE_STANDARD_INFO equivalent */ 1248*4882a593Smuzhiyun __le64 EndOfFile; 1249*4882a593Smuzhiyun __le32 Attributes; 1250*4882a593Smuzhiyun } __packed; 1251*4882a593Smuzhiyun 1252*4882a593Smuzhiyun struct smb2_flush_req { 1253*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1254*4882a593Smuzhiyun __le16 StructureSize; /* Must be 24 */ 1255*4882a593Smuzhiyun __le16 Reserved1; 1256*4882a593Smuzhiyun __le32 Reserved2; 1257*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1258*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1259*4882a593Smuzhiyun } __packed; 1260*4882a593Smuzhiyun 1261*4882a593Smuzhiyun struct smb2_flush_rsp { 1262*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1263*4882a593Smuzhiyun __le16 StructureSize; 1264*4882a593Smuzhiyun __le16 Reserved; 1265*4882a593Smuzhiyun } __packed; 1266*4882a593Smuzhiyun 1267*4882a593Smuzhiyun /* For read request Flags field below, following flag is defined for SMB3.02 */ 1268*4882a593Smuzhiyun #define SMB2_READFLAG_READ_UNBUFFERED 0x01 1269*4882a593Smuzhiyun #define SMB2_READFLAG_REQUEST_COMPRESSED 0x02 /* See MS-SMB2 2.2.19 */ 1270*4882a593Smuzhiyun 1271*4882a593Smuzhiyun /* Channel field for read and write: exactly one of following flags can be set*/ 1272*4882a593Smuzhiyun #define SMB2_CHANNEL_NONE cpu_to_le32(0x00000000) 1273*4882a593Smuzhiyun #define SMB2_CHANNEL_RDMA_V1 cpu_to_le32(0x00000001) /* SMB3 or later */ 1274*4882a593Smuzhiyun #define SMB2_CHANNEL_RDMA_V1_INVALIDATE cpu_to_le32(0x00000002) /* >= SMB3.02 */ 1275*4882a593Smuzhiyun #define SMB2_CHANNEL_RDMA_TRANSFORM cpu_to_le32(0x00000003) /* >= SMB3.02, only used on write */ 1276*4882a593Smuzhiyun 1277*4882a593Smuzhiyun /* SMB2 read request without RFC1001 length at the beginning */ 1278*4882a593Smuzhiyun struct smb2_read_plain_req { 1279*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1280*4882a593Smuzhiyun __le16 StructureSize; /* Must be 49 */ 1281*4882a593Smuzhiyun __u8 Padding; /* offset from start of SMB2 header to place read */ 1282*4882a593Smuzhiyun __u8 Flags; /* MBZ unless SMB3.02 or later */ 1283*4882a593Smuzhiyun __le32 Length; 1284*4882a593Smuzhiyun __le64 Offset; 1285*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1286*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1287*4882a593Smuzhiyun __le32 MinimumCount; 1288*4882a593Smuzhiyun __le32 Channel; /* MBZ except for SMB3 or later */ 1289*4882a593Smuzhiyun __le32 RemainingBytes; 1290*4882a593Smuzhiyun __le16 ReadChannelInfoOffset; 1291*4882a593Smuzhiyun __le16 ReadChannelInfoLength; 1292*4882a593Smuzhiyun __u8 Buffer[1]; 1293*4882a593Smuzhiyun } __packed; 1294*4882a593Smuzhiyun 1295*4882a593Smuzhiyun /* Read flags */ 1296*4882a593Smuzhiyun #define SMB2_READFLAG_RESPONSE_NONE 0x00000000 1297*4882a593Smuzhiyun #define SMB2_READFLAG_RESPONSE_RDMA_TRANSFORM 0x00000001 1298*4882a593Smuzhiyun 1299*4882a593Smuzhiyun struct smb2_read_rsp { 1300*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1301*4882a593Smuzhiyun __le16 StructureSize; /* Must be 17 */ 1302*4882a593Smuzhiyun __u8 DataOffset; 1303*4882a593Smuzhiyun __u8 Reserved; 1304*4882a593Smuzhiyun __le32 DataLength; 1305*4882a593Smuzhiyun __le32 DataRemaining; 1306*4882a593Smuzhiyun __u32 Flags; 1307*4882a593Smuzhiyun __u8 Buffer[1]; 1308*4882a593Smuzhiyun } __packed; 1309*4882a593Smuzhiyun 1310*4882a593Smuzhiyun /* For write request Flags field below the following flags are defined: */ 1311*4882a593Smuzhiyun #define SMB2_WRITEFLAG_WRITE_THROUGH 0x00000001 /* SMB2.1 or later */ 1312*4882a593Smuzhiyun #define SMB2_WRITEFLAG_WRITE_UNBUFFERED 0x00000002 /* SMB3.02 or later */ 1313*4882a593Smuzhiyun 1314*4882a593Smuzhiyun struct smb2_write_req { 1315*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1316*4882a593Smuzhiyun __le16 StructureSize; /* Must be 49 */ 1317*4882a593Smuzhiyun __le16 DataOffset; /* offset from start of SMB2 header to write data */ 1318*4882a593Smuzhiyun __le32 Length; 1319*4882a593Smuzhiyun __le64 Offset; 1320*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1321*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1322*4882a593Smuzhiyun __le32 Channel; /* MBZ unless SMB3.02 or later */ 1323*4882a593Smuzhiyun __le32 RemainingBytes; 1324*4882a593Smuzhiyun __le16 WriteChannelInfoOffset; 1325*4882a593Smuzhiyun __le16 WriteChannelInfoLength; 1326*4882a593Smuzhiyun __le32 Flags; 1327*4882a593Smuzhiyun __u8 Buffer[1]; 1328*4882a593Smuzhiyun } __packed; 1329*4882a593Smuzhiyun 1330*4882a593Smuzhiyun struct smb2_write_rsp { 1331*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1332*4882a593Smuzhiyun __le16 StructureSize; /* Must be 17 */ 1333*4882a593Smuzhiyun __u8 DataOffset; 1334*4882a593Smuzhiyun __u8 Reserved; 1335*4882a593Smuzhiyun __le32 DataLength; 1336*4882a593Smuzhiyun __le32 DataRemaining; 1337*4882a593Smuzhiyun __u32 Reserved2; 1338*4882a593Smuzhiyun __u8 Buffer[1]; 1339*4882a593Smuzhiyun } __packed; 1340*4882a593Smuzhiyun 1341*4882a593Smuzhiyun /* notify flags */ 1342*4882a593Smuzhiyun #define SMB2_WATCH_TREE 0x0001 1343*4882a593Smuzhiyun 1344*4882a593Smuzhiyun /* notify completion filter flags. See MS-FSCC 2.6 and MS-SMB2 2.2.35 */ 1345*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 1346*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 1347*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 1348*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_SIZE 0x00000008 1349*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 1350*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020 1351*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_CREATION 0x00000040 1352*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_EA 0x00000080 1353*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 1354*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200 1355*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400 1356*4882a593Smuzhiyun #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800 1357*4882a593Smuzhiyun 1358*4882a593Smuzhiyun struct smb2_change_notify_req { 1359*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1360*4882a593Smuzhiyun __le16 StructureSize; 1361*4882a593Smuzhiyun __le16 Flags; 1362*4882a593Smuzhiyun __le32 OutputBufferLength; 1363*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1364*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1365*4882a593Smuzhiyun __le32 CompletionFilter; 1366*4882a593Smuzhiyun __u32 Reserved; 1367*4882a593Smuzhiyun } __packed; 1368*4882a593Smuzhiyun 1369*4882a593Smuzhiyun struct smb2_change_notify_rsp { 1370*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1371*4882a593Smuzhiyun __le16 StructureSize; /* Must be 9 */ 1372*4882a593Smuzhiyun __le16 OutputBufferOffset; 1373*4882a593Smuzhiyun __le32 OutputBufferLength; 1374*4882a593Smuzhiyun __u8 Buffer[1]; /* array of file notify structs */ 1375*4882a593Smuzhiyun } __packed; 1376*4882a593Smuzhiyun 1377*4882a593Smuzhiyun #define SMB2_LOCKFLAG_SHARED_LOCK 0x0001 1378*4882a593Smuzhiyun #define SMB2_LOCKFLAG_EXCLUSIVE_LOCK 0x0002 1379*4882a593Smuzhiyun #define SMB2_LOCKFLAG_UNLOCK 0x0004 1380*4882a593Smuzhiyun #define SMB2_LOCKFLAG_FAIL_IMMEDIATELY 0x0010 1381*4882a593Smuzhiyun 1382*4882a593Smuzhiyun struct smb2_lock_element { 1383*4882a593Smuzhiyun __le64 Offset; 1384*4882a593Smuzhiyun __le64 Length; 1385*4882a593Smuzhiyun __le32 Flags; 1386*4882a593Smuzhiyun __le32 Reserved; 1387*4882a593Smuzhiyun } __packed; 1388*4882a593Smuzhiyun 1389*4882a593Smuzhiyun struct smb2_lock_req { 1390*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1391*4882a593Smuzhiyun __le16 StructureSize; /* Must be 48 */ 1392*4882a593Smuzhiyun __le16 LockCount; 1393*4882a593Smuzhiyun __le32 Reserved; 1394*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1395*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1396*4882a593Smuzhiyun /* Followed by at least one */ 1397*4882a593Smuzhiyun struct smb2_lock_element locks[1]; 1398*4882a593Smuzhiyun } __packed; 1399*4882a593Smuzhiyun 1400*4882a593Smuzhiyun struct smb2_lock_rsp { 1401*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1402*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 1403*4882a593Smuzhiyun __le16 Reserved; 1404*4882a593Smuzhiyun } __packed; 1405*4882a593Smuzhiyun 1406*4882a593Smuzhiyun struct smb2_echo_req { 1407*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1408*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 1409*4882a593Smuzhiyun __u16 Reserved; 1410*4882a593Smuzhiyun } __packed; 1411*4882a593Smuzhiyun 1412*4882a593Smuzhiyun struct smb2_echo_rsp { 1413*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1414*4882a593Smuzhiyun __le16 StructureSize; /* Must be 4 */ 1415*4882a593Smuzhiyun __u16 Reserved; 1416*4882a593Smuzhiyun } __packed; 1417*4882a593Smuzhiyun 1418*4882a593Smuzhiyun /* search (query_directory) Flags field */ 1419*4882a593Smuzhiyun #define SMB2_RESTART_SCANS 0x01 1420*4882a593Smuzhiyun #define SMB2_RETURN_SINGLE_ENTRY 0x02 1421*4882a593Smuzhiyun #define SMB2_INDEX_SPECIFIED 0x04 1422*4882a593Smuzhiyun #define SMB2_REOPEN 0x10 1423*4882a593Smuzhiyun 1424*4882a593Smuzhiyun #define SMB2_QUERY_DIRECTORY_IOV_SIZE 2 1425*4882a593Smuzhiyun 1426*4882a593Smuzhiyun struct smb2_query_directory_req { 1427*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1428*4882a593Smuzhiyun __le16 StructureSize; /* Must be 33 */ 1429*4882a593Smuzhiyun __u8 FileInformationClass; 1430*4882a593Smuzhiyun __u8 Flags; 1431*4882a593Smuzhiyun __le32 FileIndex; 1432*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1433*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1434*4882a593Smuzhiyun __le16 FileNameOffset; 1435*4882a593Smuzhiyun __le16 FileNameLength; 1436*4882a593Smuzhiyun __le32 OutputBufferLength; 1437*4882a593Smuzhiyun __u8 Buffer[1]; 1438*4882a593Smuzhiyun } __packed; 1439*4882a593Smuzhiyun 1440*4882a593Smuzhiyun struct smb2_query_directory_rsp { 1441*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1442*4882a593Smuzhiyun __le16 StructureSize; /* Must be 9 */ 1443*4882a593Smuzhiyun __le16 OutputBufferOffset; 1444*4882a593Smuzhiyun __le32 OutputBufferLength; 1445*4882a593Smuzhiyun __u8 Buffer[1]; 1446*4882a593Smuzhiyun } __packed; 1447*4882a593Smuzhiyun 1448*4882a593Smuzhiyun /* Possible InfoType values */ 1449*4882a593Smuzhiyun #define SMB2_O_INFO_FILE 0x01 1450*4882a593Smuzhiyun #define SMB2_O_INFO_FILESYSTEM 0x02 1451*4882a593Smuzhiyun #define SMB2_O_INFO_SECURITY 0x03 1452*4882a593Smuzhiyun #define SMB2_O_INFO_QUOTA 0x04 1453*4882a593Smuzhiyun 1454*4882a593Smuzhiyun /* Security info type additionalinfo flags. See MS-SMB2 (2.2.37) or MS-DTYP */ 1455*4882a593Smuzhiyun #define OWNER_SECINFO 0x00000001 1456*4882a593Smuzhiyun #define GROUP_SECINFO 0x00000002 1457*4882a593Smuzhiyun #define DACL_SECINFO 0x00000004 1458*4882a593Smuzhiyun #define SACL_SECINFO 0x00000008 1459*4882a593Smuzhiyun #define LABEL_SECINFO 0x00000010 1460*4882a593Smuzhiyun #define ATTRIBUTE_SECINFO 0x00000020 1461*4882a593Smuzhiyun #define SCOPE_SECINFO 0x00000040 1462*4882a593Smuzhiyun #define BACKUP_SECINFO 0x00010000 1463*4882a593Smuzhiyun #define UNPROTECTED_SACL_SECINFO 0x10000000 1464*4882a593Smuzhiyun #define UNPROTECTED_DACL_SECINFO 0x20000000 1465*4882a593Smuzhiyun #define PROTECTED_SACL_SECINFO 0x40000000 1466*4882a593Smuzhiyun #define PROTECTED_DACL_SECINFO 0x80000000 1467*4882a593Smuzhiyun 1468*4882a593Smuzhiyun /* Flags used for FileFullEAinfo */ 1469*4882a593Smuzhiyun #define SL_RESTART_SCAN 0x00000001 1470*4882a593Smuzhiyun #define SL_RETURN_SINGLE_ENTRY 0x00000002 1471*4882a593Smuzhiyun #define SL_INDEX_SPECIFIED 0x00000004 1472*4882a593Smuzhiyun 1473*4882a593Smuzhiyun struct smb2_query_info_req { 1474*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1475*4882a593Smuzhiyun __le16 StructureSize; /* Must be 41 */ 1476*4882a593Smuzhiyun __u8 InfoType; 1477*4882a593Smuzhiyun __u8 FileInfoClass; 1478*4882a593Smuzhiyun __le32 OutputBufferLength; 1479*4882a593Smuzhiyun __le16 InputBufferOffset; 1480*4882a593Smuzhiyun __u16 Reserved; 1481*4882a593Smuzhiyun __le32 InputBufferLength; 1482*4882a593Smuzhiyun __le32 AdditionalInformation; 1483*4882a593Smuzhiyun __le32 Flags; 1484*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1485*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1486*4882a593Smuzhiyun __u8 Buffer[1]; 1487*4882a593Smuzhiyun } __packed; 1488*4882a593Smuzhiyun 1489*4882a593Smuzhiyun struct smb2_query_info_rsp { 1490*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1491*4882a593Smuzhiyun __le16 StructureSize; /* Must be 9 */ 1492*4882a593Smuzhiyun __le16 OutputBufferOffset; 1493*4882a593Smuzhiyun __le32 OutputBufferLength; 1494*4882a593Smuzhiyun __u8 Buffer[1]; 1495*4882a593Smuzhiyun } __packed; 1496*4882a593Smuzhiyun 1497*4882a593Smuzhiyun /* 1498*4882a593Smuzhiyun * Maximum number of iovs we need for a set-info request. 1499*4882a593Smuzhiyun * The largest one is rename/hardlink 1500*4882a593Smuzhiyun * [0] : struct smb2_set_info_req + smb2_file_[rename|link]_info 1501*4882a593Smuzhiyun * [1] : path 1502*4882a593Smuzhiyun * [2] : compound padding 1503*4882a593Smuzhiyun */ 1504*4882a593Smuzhiyun #define SMB2_SET_INFO_IOV_SIZE 3 1505*4882a593Smuzhiyun 1506*4882a593Smuzhiyun struct smb2_set_info_req { 1507*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1508*4882a593Smuzhiyun __le16 StructureSize; /* Must be 33 */ 1509*4882a593Smuzhiyun __u8 InfoType; 1510*4882a593Smuzhiyun __u8 FileInfoClass; 1511*4882a593Smuzhiyun __le32 BufferLength; 1512*4882a593Smuzhiyun __le16 BufferOffset; 1513*4882a593Smuzhiyun __u16 Reserved; 1514*4882a593Smuzhiyun __le32 AdditionalInformation; 1515*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1516*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1517*4882a593Smuzhiyun __u8 Buffer[1]; 1518*4882a593Smuzhiyun } __packed; 1519*4882a593Smuzhiyun 1520*4882a593Smuzhiyun struct smb2_set_info_rsp { 1521*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1522*4882a593Smuzhiyun __le16 StructureSize; /* Must be 2 */ 1523*4882a593Smuzhiyun } __packed; 1524*4882a593Smuzhiyun 1525*4882a593Smuzhiyun struct smb2_oplock_break { 1526*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1527*4882a593Smuzhiyun __le16 StructureSize; /* Must be 24 */ 1528*4882a593Smuzhiyun __u8 OplockLevel; 1529*4882a593Smuzhiyun __u8 Reserved; 1530*4882a593Smuzhiyun __le32 Reserved2; 1531*4882a593Smuzhiyun __u64 PersistentFid; 1532*4882a593Smuzhiyun __u64 VolatileFid; 1533*4882a593Smuzhiyun } __packed; 1534*4882a593Smuzhiyun 1535*4882a593Smuzhiyun #define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01) 1536*4882a593Smuzhiyun 1537*4882a593Smuzhiyun struct smb2_lease_break { 1538*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1539*4882a593Smuzhiyun __le16 StructureSize; /* Must be 44 */ 1540*4882a593Smuzhiyun __le16 Epoch; 1541*4882a593Smuzhiyun __le32 Flags; 1542*4882a593Smuzhiyun __u8 LeaseKey[16]; 1543*4882a593Smuzhiyun __le32 CurrentLeaseState; 1544*4882a593Smuzhiyun __le32 NewLeaseState; 1545*4882a593Smuzhiyun __le32 BreakReason; 1546*4882a593Smuzhiyun __le32 AccessMaskHint; 1547*4882a593Smuzhiyun __le32 ShareMaskHint; 1548*4882a593Smuzhiyun } __packed; 1549*4882a593Smuzhiyun 1550*4882a593Smuzhiyun struct smb2_lease_ack { 1551*4882a593Smuzhiyun struct smb2_sync_hdr sync_hdr; 1552*4882a593Smuzhiyun __le16 StructureSize; /* Must be 36 */ 1553*4882a593Smuzhiyun __le16 Reserved; 1554*4882a593Smuzhiyun __le32 Flags; 1555*4882a593Smuzhiyun __u8 LeaseKey[16]; 1556*4882a593Smuzhiyun __le32 LeaseState; 1557*4882a593Smuzhiyun __le64 LeaseDuration; 1558*4882a593Smuzhiyun } __packed; 1559*4882a593Smuzhiyun 1560*4882a593Smuzhiyun /* 1561*4882a593Smuzhiyun * PDU infolevel structure definitions 1562*4882a593Smuzhiyun * BB consider moving to a different header 1563*4882a593Smuzhiyun */ 1564*4882a593Smuzhiyun 1565*4882a593Smuzhiyun /* File System Information Classes */ 1566*4882a593Smuzhiyun #define FS_VOLUME_INFORMATION 1 /* Query */ 1567*4882a593Smuzhiyun #define FS_LABEL_INFORMATION 2 /* Local only */ 1568*4882a593Smuzhiyun #define FS_SIZE_INFORMATION 3 /* Query */ 1569*4882a593Smuzhiyun #define FS_DEVICE_INFORMATION 4 /* Query */ 1570*4882a593Smuzhiyun #define FS_ATTRIBUTE_INFORMATION 5 /* Query */ 1571*4882a593Smuzhiyun #define FS_CONTROL_INFORMATION 6 /* Query, Set */ 1572*4882a593Smuzhiyun #define FS_FULL_SIZE_INFORMATION 7 /* Query */ 1573*4882a593Smuzhiyun #define FS_OBJECT_ID_INFORMATION 8 /* Query, Set */ 1574*4882a593Smuzhiyun #define FS_DRIVER_PATH_INFORMATION 9 /* Local only */ 1575*4882a593Smuzhiyun #define FS_VOLUME_FLAGS_INFORMATION 10 /* Local only */ 1576*4882a593Smuzhiyun #define FS_SECTOR_SIZE_INFORMATION 11 /* SMB3 or later. Query */ 1577*4882a593Smuzhiyun #define FS_POSIX_INFORMATION 100 /* SMB3.1.1 POSIX. Query */ 1578*4882a593Smuzhiyun 1579*4882a593Smuzhiyun struct smb2_fs_full_size_info { 1580*4882a593Smuzhiyun __le64 TotalAllocationUnits; 1581*4882a593Smuzhiyun __le64 CallerAvailableAllocationUnits; 1582*4882a593Smuzhiyun __le64 ActualAvailableAllocationUnits; 1583*4882a593Smuzhiyun __le32 SectorsPerAllocationUnit; 1584*4882a593Smuzhiyun __le32 BytesPerSector; 1585*4882a593Smuzhiyun } __packed; 1586*4882a593Smuzhiyun 1587*4882a593Smuzhiyun #define SSINFO_FLAGS_ALIGNED_DEVICE 0x00000001 1588*4882a593Smuzhiyun #define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE 0x00000002 1589*4882a593Smuzhiyun #define SSINFO_FLAGS_NO_SEEK_PENALTY 0x00000004 1590*4882a593Smuzhiyun #define SSINFO_FLAGS_TRIM_ENABLED 0x00000008 1591*4882a593Smuzhiyun 1592*4882a593Smuzhiyun /* sector size info struct */ 1593*4882a593Smuzhiyun struct smb3_fs_ss_info { 1594*4882a593Smuzhiyun __le32 LogicalBytesPerSector; 1595*4882a593Smuzhiyun __le32 PhysicalBytesPerSectorForAtomicity; 1596*4882a593Smuzhiyun __le32 PhysicalBytesPerSectorForPerf; 1597*4882a593Smuzhiyun __le32 FileSystemEffectivePhysicalBytesPerSectorForAtomicity; 1598*4882a593Smuzhiyun __le32 Flags; 1599*4882a593Smuzhiyun __le32 ByteOffsetForSectorAlignment; 1600*4882a593Smuzhiyun __le32 ByteOffsetForPartitionAlignment; 1601*4882a593Smuzhiyun } __packed; 1602*4882a593Smuzhiyun 1603*4882a593Smuzhiyun /* volume info struct - see MS-FSCC 2.5.9 */ 1604*4882a593Smuzhiyun #define MAX_VOL_LABEL_LEN 32 1605*4882a593Smuzhiyun struct smb3_fs_vol_info { 1606*4882a593Smuzhiyun __le64 VolumeCreationTime; 1607*4882a593Smuzhiyun __u32 VolumeSerialNumber; 1608*4882a593Smuzhiyun __le32 VolumeLabelLength; /* includes trailing null */ 1609*4882a593Smuzhiyun __u8 SupportsObjects; /* True if eg like NTFS, supports objects */ 1610*4882a593Smuzhiyun __u8 Reserved; 1611*4882a593Smuzhiyun __u8 VolumeLabel[]; /* variable len */ 1612*4882a593Smuzhiyun } __packed; 1613*4882a593Smuzhiyun 1614*4882a593Smuzhiyun /* partial list of QUERY INFO levels */ 1615*4882a593Smuzhiyun #define FILE_DIRECTORY_INFORMATION 1 1616*4882a593Smuzhiyun #define FILE_FULL_DIRECTORY_INFORMATION 2 1617*4882a593Smuzhiyun #define FILE_BOTH_DIRECTORY_INFORMATION 3 1618*4882a593Smuzhiyun #define FILE_BASIC_INFORMATION 4 1619*4882a593Smuzhiyun #define FILE_STANDARD_INFORMATION 5 1620*4882a593Smuzhiyun #define FILE_INTERNAL_INFORMATION 6 1621*4882a593Smuzhiyun #define FILE_EA_INFORMATION 7 1622*4882a593Smuzhiyun #define FILE_ACCESS_INFORMATION 8 1623*4882a593Smuzhiyun #define FILE_NAME_INFORMATION 9 1624*4882a593Smuzhiyun #define FILE_RENAME_INFORMATION 10 1625*4882a593Smuzhiyun #define FILE_LINK_INFORMATION 11 1626*4882a593Smuzhiyun #define FILE_NAMES_INFORMATION 12 1627*4882a593Smuzhiyun #define FILE_DISPOSITION_INFORMATION 13 1628*4882a593Smuzhiyun #define FILE_POSITION_INFORMATION 14 1629*4882a593Smuzhiyun #define FILE_FULL_EA_INFORMATION 15 1630*4882a593Smuzhiyun #define FILE_MODE_INFORMATION 16 1631*4882a593Smuzhiyun #define FILE_ALIGNMENT_INFORMATION 17 1632*4882a593Smuzhiyun #define FILE_ALL_INFORMATION 18 1633*4882a593Smuzhiyun #define FILE_ALLOCATION_INFORMATION 19 1634*4882a593Smuzhiyun #define FILE_END_OF_FILE_INFORMATION 20 1635*4882a593Smuzhiyun #define FILE_ALTERNATE_NAME_INFORMATION 21 1636*4882a593Smuzhiyun #define FILE_STREAM_INFORMATION 22 1637*4882a593Smuzhiyun #define FILE_PIPE_INFORMATION 23 1638*4882a593Smuzhiyun #define FILE_PIPE_LOCAL_INFORMATION 24 1639*4882a593Smuzhiyun #define FILE_PIPE_REMOTE_INFORMATION 25 1640*4882a593Smuzhiyun #define FILE_MAILSLOT_QUERY_INFORMATION 26 1641*4882a593Smuzhiyun #define FILE_MAILSLOT_SET_INFORMATION 27 1642*4882a593Smuzhiyun #define FILE_COMPRESSION_INFORMATION 28 1643*4882a593Smuzhiyun #define FILE_OBJECT_ID_INFORMATION 29 1644*4882a593Smuzhiyun /* Number 30 not defined in documents */ 1645*4882a593Smuzhiyun #define FILE_MOVE_CLUSTER_INFORMATION 31 1646*4882a593Smuzhiyun #define FILE_QUOTA_INFORMATION 32 1647*4882a593Smuzhiyun #define FILE_REPARSE_POINT_INFORMATION 33 1648*4882a593Smuzhiyun #define FILE_NETWORK_OPEN_INFORMATION 34 1649*4882a593Smuzhiyun #define FILE_ATTRIBUTE_TAG_INFORMATION 35 1650*4882a593Smuzhiyun #define FILE_TRACKING_INFORMATION 36 1651*4882a593Smuzhiyun #define FILEID_BOTH_DIRECTORY_INFORMATION 37 1652*4882a593Smuzhiyun #define FILEID_FULL_DIRECTORY_INFORMATION 38 1653*4882a593Smuzhiyun #define FILE_VALID_DATA_LENGTH_INFORMATION 39 1654*4882a593Smuzhiyun #define FILE_SHORT_NAME_INFORMATION 40 1655*4882a593Smuzhiyun #define FILE_SFIO_RESERVE_INFORMATION 44 1656*4882a593Smuzhiyun #define FILE_SFIO_VOLUME_INFORMATION 45 1657*4882a593Smuzhiyun #define FILE_HARD_LINK_INFORMATION 46 1658*4882a593Smuzhiyun #define FILE_NORMALIZED_NAME_INFORMATION 48 1659*4882a593Smuzhiyun #define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50 1660*4882a593Smuzhiyun #define FILE_STANDARD_LINK_INFORMATION 54 1661*4882a593Smuzhiyun #define FILE_ID_INFORMATION 59 1662*4882a593Smuzhiyun 1663*4882a593Smuzhiyun struct smb2_file_internal_info { 1664*4882a593Smuzhiyun __le64 IndexNumber; 1665*4882a593Smuzhiyun } __packed; /* level 6 Query */ 1666*4882a593Smuzhiyun 1667*4882a593Smuzhiyun struct smb2_file_rename_info { /* encoding of request for level 10 */ 1668*4882a593Smuzhiyun __u8 ReplaceIfExists; /* 1 = replace existing target with new */ 1669*4882a593Smuzhiyun /* 0 = fail if target already exists */ 1670*4882a593Smuzhiyun __u8 Reserved[7]; 1671*4882a593Smuzhiyun __u64 RootDirectory; /* MBZ for network operations (why says spec?) */ 1672*4882a593Smuzhiyun __le32 FileNameLength; 1673*4882a593Smuzhiyun char FileName[]; /* New name to be assigned */ 1674*4882a593Smuzhiyun /* padding - overall struct size must be >= 24 so filename + pad >= 6 */ 1675*4882a593Smuzhiyun } __packed; /* level 10 Set */ 1676*4882a593Smuzhiyun 1677*4882a593Smuzhiyun struct smb2_file_link_info { /* encoding of request for level 11 */ 1678*4882a593Smuzhiyun __u8 ReplaceIfExists; /* 1 = replace existing link with new */ 1679*4882a593Smuzhiyun /* 0 = fail if link already exists */ 1680*4882a593Smuzhiyun __u8 Reserved[7]; 1681*4882a593Smuzhiyun __u64 RootDirectory; /* MBZ for network operations (why says spec?) */ 1682*4882a593Smuzhiyun __le32 FileNameLength; 1683*4882a593Smuzhiyun char FileName[]; /* Name to be assigned to new link */ 1684*4882a593Smuzhiyun } __packed; /* level 11 Set */ 1685*4882a593Smuzhiyun 1686*4882a593Smuzhiyun struct smb2_file_full_ea_info { /* encoding of response for level 15 */ 1687*4882a593Smuzhiyun __le32 next_entry_offset; 1688*4882a593Smuzhiyun __u8 flags; 1689*4882a593Smuzhiyun __u8 ea_name_length; 1690*4882a593Smuzhiyun __le16 ea_value_length; 1691*4882a593Smuzhiyun char ea_data[]; /* \0 terminated name plus value */ 1692*4882a593Smuzhiyun } __packed; /* level 15 Set */ 1693*4882a593Smuzhiyun 1694*4882a593Smuzhiyun /* 1695*4882a593Smuzhiyun * This level 18, although with struct with same name is different from cifs 1696*4882a593Smuzhiyun * level 0x107. Level 0x107 has an extra u64 between AccessFlags and 1697*4882a593Smuzhiyun * CurrentByteOffset. 1698*4882a593Smuzhiyun */ 1699*4882a593Smuzhiyun struct smb2_file_all_info { /* data block encoding of response to level 18 */ 1700*4882a593Smuzhiyun __le64 CreationTime; /* Beginning of FILE_BASIC_INFO equivalent */ 1701*4882a593Smuzhiyun __le64 LastAccessTime; 1702*4882a593Smuzhiyun __le64 LastWriteTime; 1703*4882a593Smuzhiyun __le64 ChangeTime; 1704*4882a593Smuzhiyun __le32 Attributes; 1705*4882a593Smuzhiyun __u32 Pad1; /* End of FILE_BASIC_INFO_INFO equivalent */ 1706*4882a593Smuzhiyun __le64 AllocationSize; /* Beginning of FILE_STANDARD_INFO equivalent */ 1707*4882a593Smuzhiyun __le64 EndOfFile; /* size ie offset to first free byte in file */ 1708*4882a593Smuzhiyun __le32 NumberOfLinks; /* hard links */ 1709*4882a593Smuzhiyun __u8 DeletePending; 1710*4882a593Smuzhiyun __u8 Directory; 1711*4882a593Smuzhiyun __u16 Pad2; /* End of FILE_STANDARD_INFO equivalent */ 1712*4882a593Smuzhiyun __le64 IndexNumber; 1713*4882a593Smuzhiyun __le32 EASize; 1714*4882a593Smuzhiyun __le32 AccessFlags; 1715*4882a593Smuzhiyun __le64 CurrentByteOffset; 1716*4882a593Smuzhiyun __le32 Mode; 1717*4882a593Smuzhiyun __le32 AlignmentRequirement; 1718*4882a593Smuzhiyun __le32 FileNameLength; 1719*4882a593Smuzhiyun char FileName[1]; 1720*4882a593Smuzhiyun } __packed; /* level 18 Query */ 1721*4882a593Smuzhiyun 1722*4882a593Smuzhiyun struct smb2_file_eof_info { /* encoding of request for level 10 */ 1723*4882a593Smuzhiyun __le64 EndOfFile; /* new end of file value */ 1724*4882a593Smuzhiyun } __packed; /* level 20 Set */ 1725*4882a593Smuzhiyun 1726*4882a593Smuzhiyun struct smb2_file_reparse_point_info { 1727*4882a593Smuzhiyun __le64 IndexNumber; 1728*4882a593Smuzhiyun __le32 Tag; 1729*4882a593Smuzhiyun } __packed; 1730*4882a593Smuzhiyun 1731*4882a593Smuzhiyun struct smb2_file_network_open_info { 1732*4882a593Smuzhiyun __le64 CreationTime; 1733*4882a593Smuzhiyun __le64 LastAccessTime; 1734*4882a593Smuzhiyun __le64 LastWriteTime; 1735*4882a593Smuzhiyun __le64 ChangeTime; 1736*4882a593Smuzhiyun __le64 AllocationSize; 1737*4882a593Smuzhiyun __le64 EndOfFile; 1738*4882a593Smuzhiyun __le32 Attributes; 1739*4882a593Smuzhiyun __le32 Reserved; 1740*4882a593Smuzhiyun } __packed; /* level 34 Query also similar returned in close rsp and open rsp */ 1741*4882a593Smuzhiyun 1742*4882a593Smuzhiyun /* See MS-FSCC 2.4.43 */ 1743*4882a593Smuzhiyun struct smb2_file_id_information { 1744*4882a593Smuzhiyun __le64 VolumeSerialNumber; 1745*4882a593Smuzhiyun __u64 PersistentFileId; /* opaque endianness */ 1746*4882a593Smuzhiyun __u64 VolatileFileId; /* opaque endianness */ 1747*4882a593Smuzhiyun } __packed; /* level 59 */ 1748*4882a593Smuzhiyun 1749*4882a593Smuzhiyun extern char smb2_padding[7]; 1750*4882a593Smuzhiyun 1751*4882a593Smuzhiyun /* equivalent of the contents of SMB3.1.1 POSIX open context response */ 1752*4882a593Smuzhiyun struct create_posix_rsp { 1753*4882a593Smuzhiyun u32 nlink; 1754*4882a593Smuzhiyun u32 reparse_tag; 1755*4882a593Smuzhiyun u32 mode; 1756*4882a593Smuzhiyun struct cifs_sid owner; /* var-sized on the wire */ 1757*4882a593Smuzhiyun struct cifs_sid group; /* var-sized on the wire */ 1758*4882a593Smuzhiyun } __packed; 1759*4882a593Smuzhiyun 1760*4882a593Smuzhiyun /* 1761*4882a593Smuzhiyun * SMB2-only POSIX info level for query dir 1762*4882a593Smuzhiyun * 1763*4882a593Smuzhiyun * See posix_info_sid_size(), posix_info_extra_size() and 1764*4882a593Smuzhiyun * posix_info_parse() to help with the handling of this struct. 1765*4882a593Smuzhiyun */ 1766*4882a593Smuzhiyun struct smb2_posix_info { 1767*4882a593Smuzhiyun __le32 NextEntryOffset; 1768*4882a593Smuzhiyun __u32 Ignored; 1769*4882a593Smuzhiyun __le64 CreationTime; 1770*4882a593Smuzhiyun __le64 LastAccessTime; 1771*4882a593Smuzhiyun __le64 LastWriteTime; 1772*4882a593Smuzhiyun __le64 ChangeTime; 1773*4882a593Smuzhiyun __le64 EndOfFile; 1774*4882a593Smuzhiyun __le64 AllocationSize; 1775*4882a593Smuzhiyun __le32 DosAttributes; 1776*4882a593Smuzhiyun __le64 Inode; 1777*4882a593Smuzhiyun __le32 DeviceId; 1778*4882a593Smuzhiyun __le32 Zero; 1779*4882a593Smuzhiyun /* beginning of POSIX Create Context Response */ 1780*4882a593Smuzhiyun __le32 HardLinks; 1781*4882a593Smuzhiyun __le32 ReparseTag; 1782*4882a593Smuzhiyun __le32 Mode; 1783*4882a593Smuzhiyun /* 1784*4882a593Smuzhiyun * var sized owner SID 1785*4882a593Smuzhiyun * var sized group SID 1786*4882a593Smuzhiyun * le32 filenamelength 1787*4882a593Smuzhiyun * u8 filename[] 1788*4882a593Smuzhiyun */ 1789*4882a593Smuzhiyun } __packed; 1790*4882a593Smuzhiyun 1791*4882a593Smuzhiyun /* Level 100 query info */ 1792*4882a593Smuzhiyun struct smb311_posix_qinfo { 1793*4882a593Smuzhiyun __le64 CreationTime; 1794*4882a593Smuzhiyun __le64 LastAccessTime; 1795*4882a593Smuzhiyun __le64 LastWriteTime; 1796*4882a593Smuzhiyun __le64 ChangeTime; 1797*4882a593Smuzhiyun __le64 EndOfFile; 1798*4882a593Smuzhiyun __le64 AllocationSize; 1799*4882a593Smuzhiyun __le32 DosAttributes; 1800*4882a593Smuzhiyun __le64 Inode; 1801*4882a593Smuzhiyun __le32 DeviceId; 1802*4882a593Smuzhiyun __le32 Zero; 1803*4882a593Smuzhiyun /* beginning of POSIX Create Context Response */ 1804*4882a593Smuzhiyun __le32 HardLinks; 1805*4882a593Smuzhiyun __le32 ReparseTag; 1806*4882a593Smuzhiyun __le32 Mode; 1807*4882a593Smuzhiyun u8 Sids[]; 1808*4882a593Smuzhiyun /* 1809*4882a593Smuzhiyun * var sized owner SID 1810*4882a593Smuzhiyun * var sized group SID 1811*4882a593Smuzhiyun * le32 filenamelength 1812*4882a593Smuzhiyun * u8 filename[] 1813*4882a593Smuzhiyun */ 1814*4882a593Smuzhiyun } __packed; 1815*4882a593Smuzhiyun 1816*4882a593Smuzhiyun /* 1817*4882a593Smuzhiyun * Parsed version of the above struct. Allows direct access to the 1818*4882a593Smuzhiyun * variable length fields 1819*4882a593Smuzhiyun */ 1820*4882a593Smuzhiyun struct smb2_posix_info_parsed { 1821*4882a593Smuzhiyun const struct smb2_posix_info *base; 1822*4882a593Smuzhiyun size_t size; 1823*4882a593Smuzhiyun struct cifs_sid owner; 1824*4882a593Smuzhiyun struct cifs_sid group; 1825*4882a593Smuzhiyun int name_len; 1826*4882a593Smuzhiyun const u8 *name; 1827*4882a593Smuzhiyun }; 1828*4882a593Smuzhiyun 1829*4882a593Smuzhiyun #endif /* _SMB2PDU_H */ 1830