| From ba3468b11ceb9ee919f73d46ffd42cffe49b2d42 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 8 Mar 2024 19:00:12 -0300 |
| Subject: smb: common: simplify compression headers |
| |
| From: Enzo Matsumiya <ematsumiya@suse.de> |
| |
| [ Upstream commit 24337b60e88219816f84d633369299660e8e8cce ] |
| |
| Unify compression headers (chained and unchained) into a single struct |
| so we can use it for the initial compression transform header |
| interchangeably. |
| |
| Also make the OriginalPayloadSize field to be always visible in the |
| compression payload header, and have callers subtract its size when not |
| needed. |
| |
| Rename the related structs to match the naming convetion used in the |
| other SMB2 structs. |
| |
| Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/smb/common/smb2pdu.h | 45 ++++++++++++++++++++++++----------------- |
| 1 file changed, 26 insertions(+), 19 deletions(-) |
| |
| diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h |
| index 10a9e20eec43f..61c6e72ccddc4 100644 |
| --- a/fs/smb/common/smb2pdu.h |
| +++ b/fs/smb/common/smb2pdu.h |
| @@ -208,36 +208,43 @@ struct smb2_transform_hdr { |
| __le64 SessionId; |
| } __packed; |
| |
| +/* |
| + * These are simplified versions from the spec, as we don't need a fully fledged |
| + * form of both unchained and chained structs. |
| + * |
| + * Moreover, even in chained compressed payloads, the initial compression header |
| + * has the form of the unchained one -- i.e. it never has the |
| + * OriginalPayloadSize field and ::Offset field always represent an offset |
| + * (instead of a length, as it is in the chained header). |
| + * |
| + * See MS-SMB2 2.2.42 for more details. |
| + */ |
| +#define SMB2_COMPRESSION_FLAG_NONE 0x0000 |
| +#define SMB2_COMPRESSION_FLAG_CHAINED 0x0001 |
| |
| -/* See MS-SMB2 2.2.42 */ |
| -struct smb2_compression_transform_hdr_unchained { |
| - __le32 ProtocolId; /* 0xFC 'S' 'M' 'B' */ |
| +struct smb2_compression_hdr { |
| + __le32 ProtocolId; /* 0xFC 'S' 'M' 'B' */ |
| __le32 OriginalCompressedSegmentSize; |
| __le16 CompressionAlgorithm; |
| __le16 Flags; |
| - __le16 Length; /* if chained it is length, else offset */ |
| + __le16 Offset; /* this is the size of the uncompressed SMB2 header below */ |
| + /* uncompressed SMB2 header (READ or WRITE) goes here */ |
| + /* compressed data goes here */ |
| } __packed; |
| |
| -/* See MS-SMB2 2.2.42.1 */ |
| -#define SMB2_COMPRESSION_FLAG_NONE 0x0000 |
| -#define SMB2_COMPRESSION_FLAG_CHAINED 0x0001 |
| - |
| -struct compression_payload_header { |
| +/* |
| + * ... OTOH, set compression payload header to always have OriginalPayloadSize |
| + * as it's easier to pass the struct size minus sizeof(OriginalPayloadSize) |
| + * than to juggle around the header/data memory. |
| + */ |
| +struct smb2_compression_payload_hdr { |
| __le16 CompressionAlgorithm; |
| __le16 Flags; |
| __le32 Length; /* length of compressed playload including field below if present */ |
| - /* __le32 OriginalPayloadSize; */ /* optional, present when LZNT1, LZ77, LZ77+Huffman */ |
| -} __packed; |
| - |
| -/* See MS-SMB2 2.2.42.2 */ |
| -struct smb2_compression_transform_hdr_chained { |
| - __le32 ProtocolId; /* 0xFC 'S' 'M' 'B' */ |
| - __le32 OriginalCompressedSegmentSize; |
| - /* struct compression_payload_header[] */ |
| + __le32 OriginalPayloadSize; /* accounted when LZNT1, LZ77, LZ77+Huffman */ |
| } __packed; |
| |
| -/* See MS-SMB2 2.2.42.2.2 */ |
| -struct compression_pattern_payload_v1 { |
| +struct smb2_compression_pattern_v1 { |
| __u8 Pattern; |
| __u8 Reserved1; |
| __le16 Reserved2; |
| -- |
| 2.43.0 |
| |