From patchwork Mon May 6 04:46:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve French X-Patchwork-Id: 1095685 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="rM600Vco"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44y9Dk5pfsz9s00 for ; Mon, 6 May 2019 14:46:30 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725773AbfEFEq3 (ORCPT ); Mon, 6 May 2019 00:46:29 -0400 Received: from mail-pl1-f177.google.com ([209.85.214.177]:41383 "EHLO mail-pl1-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725710AbfEFEq3 (ORCPT ); Mon, 6 May 2019 00:46:29 -0400 Received: by mail-pl1-f177.google.com with SMTP id d9so5728085pls.8 for ; Sun, 05 May 2019 21:46:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=zbSjsaEpTUTY58uHxF5Q4JVqiKFFgS1zPNtdvl9ixko=; b=rM600VcoM6cYFOH86O6vFp12Nt44e6U5J9rJ4dUvdJcB62uCvwUp5VSQwhktvw8tZt tKlBO5mDeZJSK2XXB/g1HgEIn06JRq95R5POim6yD58JlgpCWXmLX7ZP7m5OLMAc+jeT 9lEejXSiXzkziGPd/tXP4rD0589qSIaMPt3JY7getz8Zde1SulN9aIPBGr3WmtdhFTe2 hK/05OeQn/1U67lPZNtcqsfnFp5qXAIbfqcMGKS75rRq39va5z/ho/VmTVEqGWNtPoyO lJVMZC/FUcq6EKGiaWFvBLFTYAVyeX/hJlvYJPzBbAQTKmSX5LKuGC3W0m+EHpoj08l7 zw1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=zbSjsaEpTUTY58uHxF5Q4JVqiKFFgS1zPNtdvl9ixko=; b=gSbAJU8sxPjnLbv4E4ydeELEJndKo0RPxU3IzU8ToQ+nAgYRGLv+Zp/ClsSb9jKYpp YwH3H6HavbctyCm1T5IRcNPHwAW2hruva35rPptctmNWVIPTuSOLQwe+UKC3jKj7leZ2 /LJ4woeULIMCMGSpWEpIQ2f0ttqeUkrpBfBhqBrN+P5+MEFu9OvSIlIC0TZKdBFEomYP 4OSVb9890iKPJTkp69/F3d/ZMDka1zcfRBw4SzSURKHb+cOw3+rj9YQbbfDvD6hqqWj2 H5eTTTG+K5FEUZj6TpEnbpyTBPuIkwR5lEd9WL+LJ33CPd0jxUFAGL4eeTgan05RE7lZ IwBw== X-Gm-Message-State: APjAAAWG3ApZ3mgen9lWDLXrB4pXi3wFsiBNuqg5tx4ztryfk893XTbS DjqaTYrx9g4tbxhxfZuEjJbXOaLGsqtX0uLqVksEtg== X-Google-Smtp-Source: APXvYqzu2BBQZT4lY6wA+mO9pXcj4SZrUySsbeUhGAaWtECreEvckZN1EU5yFIEyHxsp3ZbmKwUZXJC4UQHhTu7srec= X-Received: by 2002:a17:902:8609:: with SMTP id f9mr28667023plo.32.1557117988042; Sun, 05 May 2019 21:46:28 -0700 (PDT) MIME-Version: 1.0 From: Steve French Date: Sun, 5 May 2019 23:46:16 -0500 Message-ID: Subject: Minor update to negotiate and save preferred compression algorithm patch To: CIFS , ronnie sahlberg Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org FYI- minor update to patch to fix endian error From c66441f45a0654a4982354d0b95b97d38f43fb1d Mon Sep 17 00:00:00 2001 From: Steve French Date: Fri, 26 Apr 2019 20:36:08 -0700 Subject: [PATCH] Negotiate and save preferred compression algorithms New negotiate context (3) allows the server and client to negotiate which compression algorithms to use. Add support for this and save it off in the server structure. Also now displayed in /proc/fs/cifs/DebugData (see below example to Windows 10) where compression algoirthm "LZ77" was negotiated: Servers: Number of credits: 326 Dialect 0x311 COMPRESS_LZ77 signed 1) Name: 192.168.92.17 Uses: 1 Capability: 0x300067 Session Status: 1 TCP status: 1 Instance: 1 See MS-XCA and MS-SMB2 2.2.3.1 for more details. Signed-off-by: Steve French Reviewed-by: Ronnie Sahlberg --- fs/cifs/cifs_debug.c | 6 ++++++ fs/cifs/cifsglob.h | 1 + fs/cifs/smb2pdu.c | 46 +++++++++++++++++++++++++++++++++++++++++++- fs/cifs/smb2pdu.h | 15 +++++++++------ 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 5ff0b3d4c484..6a69f11aacf7 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c @@ -332,6 +332,12 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) #endif seq_printf(m, "\nNumber of credits: %d Dialect 0x%x", server->credits, server->dialect); + if (server->compress_algorithm == SMB3_COMPRESS_LZNT1) + seq_printf(m, " COMPRESS_LZNT1"); + else if (server->compress_algorithm == SMB3_COMPRESS_LZ77) + seq_printf(m, " COMPRESS_LZ77"); + else if (server->compress_algorithm == SMB3_COMPRESS_LZ77_HUFF) + seq_printf(m, " COMPRESS_LZ77_HUFF"); if (server->sign) seq_printf(m, " signed"); if (server->posix_ext_supported) diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index c22ab330238c..561f1395eddd 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -734,6 +734,7 @@ struct TCP_Server_Info { #endif /* STATS2 */ unsigned int max_read; unsigned int max_write; + __le16 compress_algorithm; __le16 cipher_type; /* save initital negprot hash */ __u8 preauth_sha_hash[SMB2_PREAUTH_HASH_SIZE]; diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index 035a568b3dbd..29f011d8d8e2 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c @@ -472,6 +472,19 @@ build_preauth_ctxt(struct smb2_preauth_neg_context *pneg_ctxt) pneg_ctxt->HashAlgorithms = SMB2_PREAUTH_INTEGRITY_SHA512; } +static void +build_compression_ctxt(struct smb2_compression_capabilities_context *pneg_ctxt) +{ + pneg_ctxt->ContextType = SMB2_COMPRESSION_CAPABILITIES; + pneg_ctxt->DataLength = + cpu_to_le16(sizeof(struct smb2_compression_capabilities_context) + - sizeof(struct smb2_neg_context)); + pneg_ctxt->CompressionAlgorithmCount = cpu_to_le16(3); + pneg_ctxt->CompressionAlgorithms[0] = SMB3_COMPRESS_LZ77; + pneg_ctxt->CompressionAlgorithms[1] = SMB3_COMPRESS_LZ77_HUFF; + pneg_ctxt->CompressionAlgorithms[2] = SMB3_COMPRESS_LZNT1; +} + static void build_encrypt_ctxt(struct smb2_encryption_neg_context *pneg_ctxt) { @@ -538,10 +551,17 @@ assemble_neg_contexts(struct smb2_negotiate_req *req, *total_len += ctxt_len; pneg_ctxt += ctxt_len; + build_compression_ctxt((struct smb2_compression_capabilities_context *) + pneg_ctxt); + ctxt_len = DIV_ROUND_UP( + sizeof(struct smb2_compression_capabilities_context), 8) * 8; + *total_len += ctxt_len; + pneg_ctxt += ctxt_len; + build_posix_ctxt((struct smb2_posix_neg_context *)pneg_ctxt); *total_len += sizeof(struct smb2_posix_neg_context); - req->NegotiateContextCount = cpu_to_le16(3); + req->NegotiateContextCount = cpu_to_le16(4); } static void decode_preauth_context(struct smb2_preauth_neg_context *ctxt) @@ -559,6 +579,27 @@ static void decode_preauth_context(struct smb2_preauth_neg_context *ctxt) printk_once(KERN_WARNING "unknown SMB3 hash algorithm\n"); } +static void decode_compress_ctx(struct TCP_Server_Info *server, + struct smb2_compression_capabilities_context *ctxt) +{ + unsigned int len = le16_to_cpu(ctxt->DataLength); + + /* sizeof compress context is a one element compression capbility struct */ + if (len < 10) { + printk_once(KERN_WARNING "server sent bad compression cntxt\n"); + return; + } + if (le16_to_cpu(ctxt->CompressionAlgorithmCount) != 1) { + printk_once(KERN_WARNING "illegal SMB3 compress algorithm count\n"); + return; + } + if (le16_to_cpu(ctxt->CompressionAlgorithms[0]) > 3) { + printk_once(KERN_WARNING "unknown compression algorithm\n"); + return; + } + server->compress_algorithm = ctxt->CompressionAlgorithms[0]; +} + static int decode_encrypt_ctx(struct TCP_Server_Info *server, struct smb2_encryption_neg_context *ctxt) { @@ -623,6 +664,9 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp, else if (pctx->ContextType == SMB2_ENCRYPTION_CAPABILITIES) rc = decode_encrypt_ctx(server, (struct smb2_encryption_neg_context *)pctx); + else if (pctx->ContextType == SMB2_COMPRESSION_CAPABILITIES) + decode_compress_ctx(server, + (struct smb2_compression_capabilities_context *)pctx); else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE) server->posix_ext_supported = true; else diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h index 93dd3b431585..c7d5813bebd8 100644 --- a/fs/cifs/smb2pdu.h +++ b/fs/cifs/smb2pdu.h @@ -297,16 +297,19 @@ struct smb2_encryption_neg_context { } __packed; /* See MS-SMB2 2.2.3.1.3 */ -#define SMB3_COMPRESS_NONE 0x0000 -#define SMB3_COMPRESS_LZNT1 0x0001 -#define SMB3_COMPRESS_LZ77 0x0002 -#define SMB3_COMPRESS_LZ77_HUFF 0x0003 +#define SMB3_COMPRESS_NONE cpu_to_le16(0x0000) +#define SMB3_COMPRESS_LZNT1 cpu_to_le16(0x0001) +#define SMB3_COMPRESS_LZ77 cpu_to_le16(0x0002) +#define SMB3_COMPRESS_LZ77_HUFF cpu_to_le16(0x0003) struct smb2_compression_capabilities_context { + __le16 ContextType; /* 3 */ + __le16 DataLength; + __u32 Reserved; __le16 CompressionAlgorithmCount; __u16 Padding; - __u32 Reserved; - __u16 CompressionAlgorithms[1]; + __u32 Reserved1; + __le16 CompressionAlgorithms[3]; } __packed; /* -- 2.20.1