update structure definitions from updated protocol documentation
authorSteve French <stfrench@microsoft.com>
Sun, 4 Oct 2020 22:42:27 +0000 (17:42 -0500)
committerSteve French <stfrench@microsoft.com>
Mon, 12 Oct 2020 04:57:18 +0000 (23:57 -0500)
MS-SMB2 was updated recently to include new protocol definitions for
updated compression payload header and new RDMA transform capabilities
Update structure definitions in smb2pdu.h to match

Signed-off-by: Steve French <stfrench@microsoft.com>
Acked-by: Ronnie Sahlberg <lsahlber@redhat.com>
fs/cifs/smb2pdu.h

index 7b6db16..4dfb51d 100644 (file)
@@ -153,10 +153,14 @@ struct smb2_compression_transform_hdr {
 } __packed;
 
 /* See MS-SMB2 2.2.42.1 */
+#define SMB2_COMPRESSION_FLAG_NONE     0x0000
+#define SMB2_COMPRESSION_FLAG_CHAINDED 0x0001
+
 struct compression_payload_header {
-       __le16  AlgorithmId;
-       __le16  Reserved;
-       __le32  Length;
+       __le16  CompressionAlgorithm;
+       __le16  Flags;
+       __le32  Length; /* length of compressed playload including field below if present */
+       /* __le32 OriginalPayloadSize; */ /* optional */
 } __packed;
 
 /* See MS-SMB2 2.2.42.2 */
@@ -167,6 +171,26 @@ struct compression_pattern_payload_v1 {
        __le32  Repetitions;
 } __packed;
 
+/* See MS-SMB2 2.2.43 */
+struct smb2_rdma_transform {
+       __le16 RdmaDescriptorOffset;
+       __le16 RdmaDescriptorLength;
+       __le32 Channel; /* for values see channel description in smb2 read above */
+       __le16 TransformCount;
+       __le16 Reserved1;
+       __le32 Reserved2;
+} __packed;
+
+struct smb2_rdma_encryption_transform {
+       __le16  TransformType;
+       __le16  SignatureLength;
+       __le16  NonceLength;
+       __u16   Reserved;
+       __u8    Signature[]; /* variable length */
+       /* u8 Nonce[] */
+       /* followed by padding */
+} __packed;
+
 /*
  *     SMB2 flag definitions
  */
@@ -297,6 +321,8 @@ struct smb2_negotiate_req {
 #define SMB2_ENCRYPTION_CAPABILITIES           cpu_to_le16(2)
 #define SMB2_COMPRESSION_CAPABILITIES          cpu_to_le16(3)
 #define SMB2_NETNAME_NEGOTIATE_CONTEXT_ID      cpu_to_le16(5)
+#define SMB2_TRANSPORT_CAPABILITIES            cpu_to_le16(6)
+#define SMB2_RDMA_TRANSFORM_CAPABILITIES       cpu_to_le16(7)
 #define SMB2_POSIX_EXTENSIONS_AVAILABLE                cpu_to_le16(0x100)
 
 struct smb2_neg_context {
@@ -353,10 +379,10 @@ struct smb2_encryption_neg_context {
 struct smb2_compression_capabilities_context {
        __le16  ContextType; /* 3 */
        __le16  DataLength;
-       __u32   Flags;
+       __u32   Reserved;
        __le16  CompressionAlgorithmCount;
        __u16   Padding;
-       __u32   Reserved1;
+       __u32   Flags;
        __le16  CompressionAlgorithms[3];
 } __packed;
 
@@ -365,12 +391,31 @@ struct smb2_compression_capabilities_context {
  * Its struct simply contains NetName, an array of Unicode characters
  */
 struct smb2_netname_neg_context {
-       __le16  ContextType; /* 0x100 */
+       __le16  ContextType; /* 5 */
        __le16  DataLength;
        __le32  Reserved;
        __le16  NetName[]; /* hostname of target converted to UCS-2 */
 } __packed;
 
+/*
+ * For rdma transform capabilities context see MS-SMB2 2.2.3.1.6
+ * and 2.2.4.1.5
+ */
+
+/* RDMA Transform IDs */
+#define SMB2_RDMA_TRANSFORM_NONE       0x0000
+#define SMB2_RDMA_TRANSFORM_ENCRYPTION 0x0001
+
+struct smb2_rdma_transform_capabilities_context {
+       __le16  ContextType; /* 7 */
+       __le16  DataLength;
+       __u32   Reserved;
+       __le16  TransformCount;
+       __u16   Reserved1;
+       __u32   Reserved2;
+       __le16  RDMATransformIds[1];
+} __packed;
+
 #define POSIX_CTXT_DATA_LEN    16
 struct smb2_posix_neg_context {
        __le16  ContextType; /* 0x100 */
@@ -1180,6 +1225,7 @@ struct smb2_flush_rsp {
 #define SMB2_CHANNEL_NONE      cpu_to_le32(0x00000000)
 #define SMB2_CHANNEL_RDMA_V1   cpu_to_le32(0x00000001) /* SMB3 or later */
 #define SMB2_CHANNEL_RDMA_V1_INVALIDATE cpu_to_le32(0x00000002) /* >= SMB3.02 */
+#define SMB2_CHANNEL_RDMA_TRANSFORM cpu_to_le32(0x00000003) /* >= SMB3.02, only used on write */
 
 /* SMB2 read request without RFC1001 length at the beginning */
 struct smb2_read_plain_req {
@@ -1199,6 +1245,10 @@ struct smb2_read_plain_req {
        __u8   Buffer[1];
 } __packed;
 
+/* Read flags */
+#define SMB2_READFLAG_RESPONSE_NONE    0x00000000
+#define SMB2_READFLAG_RESPONSE_RDMA_TRANSFORM  0x00000001
+
 struct smb2_read_rsp {
        struct smb2_sync_hdr sync_hdr;
        __le16 StructureSize; /* Must be 17 */
@@ -1206,7 +1256,7 @@ struct smb2_read_rsp {
        __u8   Reserved;
        __le32 DataLength;
        __le32 DataRemaining;
-       __u32  Reserved2;
+       __u32  Flags;
        __u8   Buffer[1];
 } __packed;