From: chenxiaosong.chenxiaosong@linux.dev
To: stfrench@microsoft.com, metze@samba.org, pali@kernel.org,
linkinjeon@kernel.org, smfrench@gmail.com, sfrench@samba.org,
senozhatsky@chromium.org, tom@talpey.com, pc@manguebit.org,
ronniesahlberg@gmail.com, sprasad@microsoft.com,
bharathsm@microsoft.com, christophe.jaillet@wanadoo.fr
Cc: linux-cifs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3 14/22] smb: move SMB frame definitions to common/cifspdu.h
Date: Tue, 14 Oct 2025 15:28:48 +0800 [thread overview]
Message-ID: <20251014072856.3004683-4-chenxiaosong.chenxiaosong@linux.dev> (raw)
In-Reply-To: <20251014072856.3004683-1-chenxiaosong.chenxiaosong@linux.dev>
From: ChenXiaoSong <chenxiaosong@kylinos.cn>
The client and server have different struct negotiate_rsp, perhaps in the
future we can change them to be the same.
Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
---
fs/smb/client/cifspdu.h | 58 ----------------------------------
fs/smb/client/cifssmb.c | 4 +--
fs/smb/common/cifspdu.h | 65 ++++++++++++++++++++++++++++++++++++++
fs/smb/server/smb_common.c | 10 +++---
fs/smb/server/smb_common.h | 14 --------
5 files changed, 72 insertions(+), 79 deletions(-)
diff --git a/fs/smb/client/cifspdu.h b/fs/smb/client/cifspdu.h
index a0883b1fda16..07eb821654e1 100644
--- a/fs/smb/client/cifspdu.h
+++ b/fs/smb/client/cifspdu.h
@@ -266,64 +266,6 @@ put_bcc(__u16 count, struct smb_hdr *hdr)
*/
#define MAX_PATHCONF 256
-/*
- * SMB frame definitions (following must be packed structs)
- * See the SNIA CIFS Specification for details.
- *
- * The Naming convention is the lower case version of the
- * smb command code name for the struct and this is typedef to the
- * uppercase version of the same name with the prefix SMB_ removed
- * for brevity. Although typedefs are not commonly used for
- * structure definitions in the Linux kernel, their use in the
- * CIFS standards document, which this code is based on, may
- * make this one of the cases where typedefs for structures make
- * sense to improve readability for readers of the standards doc.
- * Typedefs can always be removed later if they are too distracting
- * and they are only used for the CIFSs PDUs themselves, not
- * internal cifs vfs structures
- *
- */
-
-typedef struct negotiate_req {
- struct smb_hdr hdr; /* wct = 0 */
- __le16 ByteCount;
- unsigned char DialectsArray[];
-} __attribute__((packed)) NEGOTIATE_REQ;
-
-#define MIN_TZ_ADJ (15 * 60) /* minimum grid for timezones in seconds */
-
-#define READ_RAW_ENABLE 1
-#define WRITE_RAW_ENABLE 2
-#define RAW_ENABLE (READ_RAW_ENABLE | WRITE_RAW_ENABLE)
-#define SMB1_CLIENT_GUID_SIZE (16)
-typedef struct negotiate_rsp {
- struct smb_hdr hdr; /* wct = 17 */
- __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */
- __u8 SecurityMode;
- __le16 MaxMpxCount;
- __le16 MaxNumberVcs;
- __le32 MaxBufferSize;
- __le32 MaxRawSize;
- __le32 SessionKey;
- __le32 Capabilities; /* see below */
- __le32 SystemTimeLow;
- __le32 SystemTimeHigh;
- __le16 ServerTimeZone;
- __u8 EncryptionKeyLength;
- __u16 ByteCount;
- union {
- /* cap extended security off */
- DECLARE_FLEX_ARRAY(unsigned char, EncryptionKey);
- /* followed by Domain name - if extended security is off */
- /* followed by 16 bytes of server GUID */
- /* then security blob if cap_extended_security negotiated */
- struct {
- unsigned char GUID[SMB1_CLIENT_GUID_SIZE];
- unsigned char SecurityBlob[];
- } __attribute__((packed)) extended_response;
- } __attribute__((packed)) u;
-} __attribute__((packed)) NEGOTIATE_RSP;
-
/* SecurityMode bits */
#define SECMODE_USER 0x01 /* off indicates share level security */
#define SECMODE_PW_ENCRYPT 0x02
diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c
index 9a346d67e298..e37a00c9251c 100644
--- a/fs/smb/client/cifssmb.c
+++ b/fs/smb/client/cifssmb.c
@@ -361,7 +361,7 @@ static int validate_t2(struct smb_t2_rsp *pSMB)
}
static int
-decode_ext_sec_blob(struct cifs_ses *ses, NEGOTIATE_RSP *pSMBr)
+decode_ext_sec_blob(struct cifs_ses *ses, CLIENT_NEGOTIATE_RSP *pSMBr)
{
int rc = 0;
u16 count;
@@ -420,7 +420,7 @@ CIFSSMBNegotiate(const unsigned int xid,
struct TCP_Server_Info *server)
{
NEGOTIATE_REQ *pSMB;
- NEGOTIATE_RSP *pSMBr;
+ CLIENT_NEGOTIATE_RSP *pSMBr;
int rc = 0;
int bytes_returned;
int i;
diff --git a/fs/smb/common/cifspdu.h b/fs/smb/common/cifspdu.h
index 59e5425cdc8d..1109c20f7bf8 100644
--- a/fs/smb/common/cifspdu.h
+++ b/fs/smb/common/cifspdu.h
@@ -256,6 +256,71 @@ struct smb_hdr {
__u8 WordCount;
} __attribute__((packed));
+/*
+ * SMB frame definitions (following must be packed structs)
+ * See the SNIA CIFS Specification for details.
+ *
+ * The Naming convention is the lower case version of the
+ * smb command code name for the struct and this is typedef to the
+ * uppercase version of the same name with the prefix SMB_ removed
+ * for brevity. Although typedefs are not commonly used for
+ * structure definitions in the Linux kernel, their use in the
+ * CIFS standards document, which this code is based on, may
+ * make this one of the cases where typedefs for structures make
+ * sense to improve readability for readers of the standards doc.
+ * Typedefs can always be removed later if they are too distracting
+ * and they are only used for the CIFSs PDUs themselves, not
+ * internal cifs vfs structures
+ *
+ */
+
+typedef struct negotiate_req {
+ struct smb_hdr hdr; /* wct = 0 */
+ __le16 ByteCount;
+ unsigned char DialectsArray[];
+} __attribute__((packed)) NEGOTIATE_REQ;
+
+#define MIN_TZ_ADJ (15 * 60) /* minimum grid for timezones in seconds */
+
+#define READ_RAW_ENABLE 1
+#define WRITE_RAW_ENABLE 2
+#define RAW_ENABLE (READ_RAW_ENABLE | WRITE_RAW_ENABLE)
+#define SMB1_CLIENT_GUID_SIZE (16)
+
+typedef struct client_negotiate_rsp {
+ struct smb_hdr hdr; /* wct = 17 */
+ __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */
+ __u8 SecurityMode;
+ __le16 MaxMpxCount;
+ __le16 MaxNumberVcs;
+ __le32 MaxBufferSize;
+ __le32 MaxRawSize;
+ __le32 SessionKey;
+ __le32 Capabilities; /* see below */
+ __le32 SystemTimeLow;
+ __le32 SystemTimeHigh;
+ __le16 ServerTimeZone;
+ __u8 EncryptionKeyLength;
+ __u16 ByteCount;
+ union {
+ /* cap extended security off */
+ DECLARE_FLEX_ARRAY(unsigned char, EncryptionKey);
+ /* followed by Domain name - if extended security is off */
+ /* followed by 16 bytes of server GUID */
+ /* then security blob if cap_extended_security negotiated */
+ struct {
+ unsigned char GUID[SMB1_CLIENT_GUID_SIZE];
+ unsigned char SecurityBlob[];
+ } __attribute__((packed)) extended_response;
+ } __attribute__((packed)) u;
+} __attribute__((packed)) CLIENT_NEGOTIATE_RSP;
+
+typedef struct server_negotiate_rsp {
+ struct smb_hdr hdr; /* wct = 17 */
+ __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */
+ __le16 ByteCount;
+} __attribute__((packed)) SERVER_NEGOTIATE_RSP;
+
/* List of FileSystemAttributes - see 2.5.1 of MS-FSCC */
#define FILE_SUPPORTS_SPARSE_VDL 0x10000000 /* faster nonsparse extend */
#define FILE_SUPPORTS_BLOCK_REFCOUNTING 0x08000000 /* allow ioctl dup extents */
diff --git a/fs/smb/server/smb_common.c b/fs/smb/server/smb_common.c
index b23203a1c286..e1e89bc1c43f 100644
--- a/fs/smb/server/smb_common.c
+++ b/fs/smb/server/smb_common.c
@@ -280,13 +280,13 @@ static int ksmbd_negotiate_smb_dialect(void *buf)
proto = *(__le32 *)((struct smb_hdr *)buf)->Protocol;
if (proto == SMB1_PROTO_NUMBER) {
- struct smb_negotiate_req *req;
+ struct negotiate_req *req;
- req = (struct smb_negotiate_req *)buf;
+ req = (struct negotiate_req *)buf;
if (le16_to_cpu(req->ByteCount) < 2)
goto err_out;
- if (offsetof(struct smb_negotiate_req, DialectsArray) - 4 +
+ if (offsetof(struct negotiate_req, DialectsArray) - 4 +
le16_to_cpu(req->ByteCount) > smb_buf_length) {
goto err_out;
}
@@ -572,12 +572,12 @@ static int __smb2_negotiate(struct ksmbd_conn *conn)
static int smb_handle_negotiate(struct ksmbd_work *work)
{
- struct smb_negotiate_rsp *neg_rsp = work->response_buf;
+ struct server_negotiate_rsp *neg_rsp = work->response_buf;
ksmbd_debug(SMB, "Unsupported SMB1 protocol\n");
if (ksmbd_iov_pin_rsp(work, (void *)neg_rsp + 4,
- sizeof(struct smb_negotiate_rsp) - 4))
+ sizeof(struct server_negotiate_rsp) - 4))
return -ENOMEM;
neg_rsp->hdr.Status.CifsError = STATUS_SUCCESS;
diff --git a/fs/smb/server/smb_common.h b/fs/smb/server/smb_common.h
index 90015cd8fe4e..a5dd656c36f1 100644
--- a/fs/smb/server/smb_common.h
+++ b/fs/smb/server/smb_common.h
@@ -56,20 +56,6 @@
FILE_EXECUTE | FILE_DELETE_CHILD | \
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES)
-#define SMB1_CLIENT_GUID_SIZE (16)
-
-struct smb_negotiate_req {
- struct smb_hdr hdr; /* wct = 0 */
- __le16 ByteCount;
- unsigned char DialectsArray[];
-} __packed;
-
-struct smb_negotiate_rsp {
- struct smb_hdr hdr; /* wct = 17 */
- __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */
- __le16 ByteCount;
-} __packed;
-
struct filesystem_attribute_info {
__le32 Attributes;
__le32 MaxPathNameComponentLength;
--
2.43.0
next prev parent reply other threads:[~2025-10-14 7:30 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-14 7:18 [PATCH v3 00/22] smb: fix some bugs, move duplicate definitions to common header file chenxiaosong.chenxiaosong
2025-10-14 7:18 ` [PATCH v3 01/22] smb/server: fix possible memory leak in smb2_read() chenxiaosong.chenxiaosong
2025-10-14 7:18 ` [PATCH v3 02/22] smb/server: fix possible refcount leak in smb2_sess_setup() chenxiaosong.chenxiaosong
2025-10-14 7:18 ` [PATCH v3 03/22] smb: move some duplicate definitions to common/cifsglob.h chenxiaosong.chenxiaosong
2025-10-20 4:39 ` Namjae Jeon
2025-10-14 7:18 ` [PATCH v3 04/22] smb: move smb_version_values " chenxiaosong.chenxiaosong
2025-10-14 7:19 ` [PATCH v3 05/22] smb: move get_rfc1002_len() " chenxiaosong.chenxiaosong
2025-10-14 7:19 ` [PATCH v3 06/22] smb: move SMB1_PROTO_NUMBER " chenxiaosong.chenxiaosong
2025-10-14 7:19 ` [PATCH v3 07/22] smb: move some duplicate definitions to common/smb2pdu.h chenxiaosong.chenxiaosong
2025-10-20 4:52 ` Namjae Jeon
2025-10-26 9:20 ` ChenXiaoSong
2025-10-26 23:17 ` Namjae Jeon
2025-10-14 7:19 ` [PATCH v3 08/22] smb: move smb_sockaddr_in and smb_sockaddr_in6 " chenxiaosong.chenxiaosong
2025-10-14 7:19 ` [PATCH v3 09/22] smb: move copychunk definitions " chenxiaosong.chenxiaosong
2025-10-20 5:03 ` Namjae Jeon
2025-10-22 5:47 ` ChenXiaoSong
2025-10-14 7:19 ` [PATCH v3 10/22] smb: move resume_key_ioctl_rsp " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 11/22] smb: move smb2_file_network_open_info " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 12/22] smb: move some duplicate definitions to common/cifspdu.h chenxiaosong.chenxiaosong
2025-10-20 5:22 ` Namjae Jeon
2025-10-22 6:01 ` ChenXiaoSong
2025-10-14 7:28 ` [PATCH v3 13/22] smb: move file access permission bits " chenxiaosong.chenxiaosong
2025-10-20 5:27 ` Namjae Jeon
2025-10-22 5:55 ` ChenXiaoSong
2025-10-14 7:28 ` chenxiaosong.chenxiaosong [this message]
2025-10-14 7:28 ` [PATCH v3 15/22] smb: move FILE_SYSTEM_ATTRIBUTE_INFO " chenxiaosong.chenxiaosong
2025-10-20 5:35 ` Namjae Jeon
2025-10-21 6:35 ` ChenXiaoSong
2025-10-21 6:36 ` ChenXiaoSong
2025-10-14 7:28 ` [PATCH v3 16/22] smb: move FILE_SYSTEM_DEVICE_INFO " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 17/22] smb: move FILE_SYSTEM_INFO " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 18/22] smb: move FILE_DIRECTORY_INFO " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 19/22] smb: move FILE_FULL_DIRECTORY_INFO " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 20/22] smb: move FILE_BOTH_DIRECTORY_INFO " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 21/22] smb: move SEARCH_ID_FULL_DIR_INFO " chenxiaosong.chenxiaosong
2025-10-14 7:28 ` [PATCH v3 22/22] smb: move FILE_SYSTEM_POSIX_INFO " chenxiaosong.chenxiaosong
2025-10-15 5:43 ` [PATCH v3 00/22] smb: fix some bugs, move duplicate definitions to common header file Namjae Jeon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251014072856.3004683-4-chenxiaosong.chenxiaosong@linux.dev \
--to=chenxiaosong.chenxiaosong@linux.dev \
--cc=bharathsm@microsoft.com \
--cc=christophe.jaillet@wanadoo.fr \
--cc=linkinjeon@kernel.org \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=metze@samba.org \
--cc=pali@kernel.org \
--cc=pc@manguebit.org \
--cc=ronniesahlberg@gmail.com \
--cc=senozhatsky@chromium.org \
--cc=sfrench@samba.org \
--cc=smfrench@gmail.com \
--cc=sprasad@microsoft.com \
--cc=stfrench@microsoft.com \
--cc=tom@talpey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox