/* * fs/cifs/smb2pdu.h * * Copyright (c) International Business Machines Corp., 2009, 2010 * Etersoft, 2012 * Author(s): Steve French (sfrench@us.ibm.com) * Pavel Shilovsky (pshilovsky@samba.org) 2012 * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _SMB2PDU_H #define _SMB2PDU_H #include /* * Note that, due to trying to use names similar to the protocol specifications, * there are many mixed case field names in the structures below. Although * this does not match typical Linux kernel style, it is necessary to be * be able to match against the protocol specfication. * * SMB2 commands * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses * (ie no useful data other than the SMB error code itself) and are marked such. * Knowing this helps avoid response buffer allocations and copy in some cases. */ /* List of commands in host endian */ #define SMB2_NEGOTIATE_HE 0x0000 #define SMB2_SESSION_SETUP_HE 0x0001 #define SMB2_LOGOFF_HE 0x0002 /* trivial request/resp */ #define SMB2_TREE_CONNECT_HE 0x0003 #define SMB2_TREE_DISCONNECT_HE 0x0004 /* trivial req/resp */ #define SMB2_CREATE_HE 0x0005 #define SMB2_CLOSE_HE 0x0006 #define SMB2_FLUSH_HE 0x0007 /* trivial resp */ #define SMB2_READ_HE 0x0008 #define SMB2_WRITE_HE 0x0009 #define SMB2_LOCK_HE 0x000A #define SMB2_IOCTL_HE 0x000B #define SMB2_CANCEL_HE 0x000C #define SMB2_ECHO_HE 0x000D #define SMB2_QUERY_DIRECTORY_HE 0x000E #define SMB2_CHANGE_NOTIFY_HE 0x000F #define SMB2_QUERY_INFO_HE 0x0010 #define SMB2_SET_INFO_HE 0x0011 #define SMB2_OPLOCK_BREAK_HE 0x0012 /* The same list in little endian */ #define SMB2_NEGOTIATE cpu_to_le16(SMB2_NEGOTIATE_HE) #define SMB2_SESSION_SETUP cpu_to_le16(SMB2_SESSION_SETUP_HE) #define SMB2_LOGOFF cpu_to_le16(SMB2_LOGOFF_HE) #define SMB2_TREE_CONNECT cpu_to_le16(SMB2_TREE_CONNECT_HE) #define SMB2_TREE_DISCONNECT cpu_to_le16(SMB2_TREE_DISCONNECT_HE) #define SMB2_CREATE cpu_to_le16(SMB2_CREATE_HE) #define SMB2_CLOSE cpu_to_le16(SMB2_CLOSE_HE) #define SMB2_FLUSH cpu_to_le16(SMB2_FLUSH_HE) #define SMB2_READ cpu_to_le16(SMB2_READ_HE) #define SMB2_WRITE cpu_to_le16(SMB2_WRITE_HE) #define SMB2_LOCK cpu_to_le16(SMB2_LOCK_HE) #define SMB2_IOCTL cpu_to_le16(SMB2_IOCTL_HE) #define SMB2_CANCEL cpu_to_le16(SMB2_CANCEL_HE) #define SMB2_ECHO cpu_to_le16(SMB2_ECHO_HE) #define SMB2_QUERY_DIRECTORY cpu_to_le16(SMB2_QUERY_DIRECTORY_HE) #define SMB2_CHANGE_NOTIFY cpu_to_le16(SMB2_CHANGE_NOTIFY_HE) #define SMB2_QUERY_INFO cpu_to_le16(SMB2_QUERY_INFO_HE) #define SMB2_SET_INFO cpu_to_le16(SMB2_SET_INFO_HE) #define SMB2_OPLOCK_BREAK cpu_to_le16(SMB2_OPLOCK_BREAK_HE) #define NUMBER_OF_SMB2_COMMANDS 0x0013 /* BB FIXME - analyze following length BB */ #define MAX_SMB2_HDR_SIZE 0x78 /* 4 len + 64 hdr + (2*24 wct) + 2 bct + 2 pad */ #define SMB2_PROTO_NUMBER __constant_cpu_to_le32(0x424d53fe) #define SMB2_HEADER_SIZE __constant_le16_to_cpu(64) #define SMB2_ERROR_STRUCTURE_SIZE2 __constant_le16_to_cpu(9) /* * SMB2 Header Definition * * "MBZ" : Must be Zero * "BB" : BugBug, Something to check/review/analyze later * "PDU" : "Protocol Data Unit" (ie a network "frame") * */ struct smb2_hdr { __be32 smb2_buf_length; /* big endian on wire */ /* length is only two or three bytes - with one or two byte type preceding it that MBZ */ __u8 ProtocolId[4]; /* 0xFE 'S' 'M' 'B' */ __le16 StructureSize; /* 64 */ __le16 CreditCharge; /* MBZ */ __le32 Status; /* Error from server */ __le16 Command; __le16 CreditRequest; /* CreditResponse */ __le32 Flags; __le32 NextCommand; __u64 MessageId; /* opaque - so can stay little endian */ __le32 ProcessId; __u32 TreeId; /* opaque - so do not make little endian */ __u64 SessionId; /* opaque - so do not make little endian */ __u8 Signature[16]; } __packed; struct smb2_pdu { struct smb2_hdr hdr; __le16 StructureSize2; /* size of wct area (varies, request specific) */ } __packed; /* * SMB2 flag definitions */ #define SMB2_FLAGS_SERVER_TO_REDIR __constant_cpu_to_le32(0x00000001) #define SMB2_FLAGS_ASYNC_COMMAND __constant_cpu_to_le32(0x00000002) #define SMB2_FLAGS_RELATED_OPERATIONS __constant_cpu_to_le32(0x00000004) #define SMB2_FLAGS_SIGNED __constant_cpu_to_le32(0x00000008) #define SMB2_FLAGS_DFS_OPERATIONS __constant_cpu_to_le32(0x10000000) /* * Definitions for SMB2 Protocol Data Units (network frames) * * See MS-SMB2.PDF specification for protocol details. * The Naming convention is the lower case version of the SMB2 * command code name for the struct. Note that structures must be packed. * */ struct smb2_err_rsp { struct smb2_hdr hdr; __le16 StructureSize; __le16 Reserved; /* MBZ */ __le32 ByteCount; /* even if zero, at least one byte follows */ __u8 ErrorData[1]; /* variable length */ } __packed; struct smb2_negotiate_req { struct smb2_hdr hdr; __le16 StructureSize; /* Must be 36 */ __le16 DialectCount; __le16 SecurityMode; __le16 Reserved; /* MBZ */ __le32 Capabilities; __u8 ClientGUID[16]; /* MBZ */ __le64 ClientStartTime; /* MBZ */ __le16 Dialects[2]; /* variable length */ } __packed; /* SecurityMode flags */ #define SMB2_NEGOTIATE_SIGNING_ENABLED 0x0001 #define SMB2_NEGOTIATE_SIGNING_REQUIRED 0x0002 /* Capabilities flags */ #define SMB2_GLOBAL_CAP_DFS 0x00000001 #define SMB2_GLOBAL_CAP_LEASING 0x00000002 /* Resp only New to SMB2.1 */ #define SMB2_GLOBAL_CAP_LARGE_MTU 0X00000004 /* Resp only New to SMB2.1 */ struct smb2_negotiate_rsp { struct smb2_hdr hdr; __le16 StructureSize; /* Must be 65 */ __le16 SecurityMode; __le16 DialectRevision; __le16 Reserved; /* MBZ */ __u8 ServerGUID[16]; __le32 Capabilities; __le32 MaxTransactSize; __le32 MaxReadSize; __le32 MaxWriteSize; __le64 SystemTime; /* MBZ */ __le64 ServerStartTime; __le16 SecurityBufferOffset; __le16 SecurityBufferLength; __le32 Reserved2; /* may be any value, ignore */ __u8 Buffer[1]; /* variable length GSS security buffer */ } __packed; #endif /* _SMB2PDU_H */