* [PATCH] cifs: implementation id context as negotiate context
@ 2026-03-04 12:27 nspmangalore
2026-03-04 12:34 ` Shyam Prasad N
2026-03-09 16:19 ` Ralph Boehme
0 siblings, 2 replies; 15+ messages in thread
From: nspmangalore @ 2026-03-04 12:27 UTC (permalink / raw)
To: linux-cifs, smfrench, pc, bharathsm, dhowells; +Cc: Shyam Prasad N
From: Shyam Prasad N <sprasad@microsoft.com>
MS-SMB2 does not allow any fields for the client to communicate
the client version details to the server. This change is a
proof-of-concept to add client details in a new negotiate context.
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
---
fs/smb/client/smb2pdu.c | 78 +++++++++++++++++++++++++++++++++++++++++
fs/smb/common/smb2pdu.h | 32 +++++++++++++++++
2 files changed, 110 insertions(+)
diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
index ef655acf673df..9c89f6b4a6709 100644
--- a/fs/smb/client/smb2pdu.c
+++ b/fs/smb/client/smb2pdu.c
@@ -24,6 +24,7 @@
#include <linux/pagemap.h>
#include <linux/xattr.h>
#include <linux/netfs.h>
+#include <linux/utsname.h>
#include <trace/events/netfs.h>
#include "cifsglob.h"
#include "cifsproto.h"
@@ -45,6 +46,7 @@
#include "cached_dir.h"
#include "compress.h"
#include "fs_context.h"
+#include "cifsfs.h"
/*
* The following table defines the expected "StructureSize" of SMB2 requests
@@ -724,6 +726,75 @@ build_posix_ctxt(struct smb2_posix_neg_context *pneg_ctxt)
pneg_ctxt->Name[15] = 0x7C;
}
+static unsigned int
+build_implementation_id_ctxt(struct smb2_implementation_id_context *pneg_ctxt)
+{
+ struct nls_table *cp = load_nls_default();
+ struct new_utsname *uts = utsname();
+ const char *impl_domain = "kernel.org";
+ const char *impl_name = "fs/smb/client";
+ const char *os_name = "Linux";
+ unsigned int data_len = 0;
+ __u8 *data_ptr;
+ int len;
+
+ pneg_ctxt->ContextType = SMB2_IMPLEMENTATION_ID_CONTEXT_ID;
+ data_ptr = pneg_ctxt->Data;
+
+ /* ImplDomain */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, impl_domain,
+ SMB2_IMPL_ID_MAX_DOMAIN_LEN, cp);
+ pneg_ctxt->ImplDomainLength = cpu_to_le16(len * 2);
+ data_ptr += len * 2;
+ data_len += len * 2;
+
+ /* ImplName */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, impl_name,
+ SMB2_IMPL_ID_MAX_NAME_LEN, cp);
+ pneg_ctxt->ImplNameLength = cpu_to_le16(len * 2);
+ data_ptr += len * 2;
+ data_len += len * 2;
+
+ /* ImplVersion - CIFS_VERSION from cifsfs.h */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, CIFS_VERSION,
+ SMB2_IMPL_ID_MAX_VERSION_LEN, cp);
+ pneg_ctxt->ImplVersionLength = cpu_to_le16(len * 2);
+ data_ptr += len * 2;
+ data_len += len * 2;
+
+ /* HostName - from utsname()->nodename */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, uts->nodename,
+ SMB2_IMPL_ID_MAX_HOSTNAME_LEN, cp);
+ pneg_ctxt->HostNameLength = cpu_to_le16(len * 2);
+ data_ptr += len * 2;
+ data_len += len * 2;
+
+ /* OSName */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, os_name,
+ SMB2_IMPL_ID_MAX_OS_NAME_LEN, cp);
+ pneg_ctxt->OSNameLength = cpu_to_le16(len * 2);
+ data_ptr += len * 2;
+ data_len += len * 2;
+
+ /* OSVersion - from utsname()->release */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, uts->release,
+ SMB2_IMPL_ID_MAX_OS_VERSION_LEN, cp);
+ pneg_ctxt->OSVersionLength = cpu_to_le16(len * 2);
+ data_ptr += len * 2;
+ data_len += len * 2;
+
+ /* Arch - from utsname()->machine */
+ len = cifs_strtoUTF16((__le16 *)data_ptr, uts->machine,
+ SMB2_IMPL_ID_MAX_ARCH_LEN, cp);
+ pneg_ctxt->ArchLength = cpu_to_le16(len * 2);
+ data_len += len * 2;
+
+ pneg_ctxt->Reserved2 = 0;
+ pneg_ctxt->DataLength = cpu_to_le16(data_len + 14); /* 14 = 7 length fields * 2 bytes */
+ /* Context size is DataLength + minimal smb2_neg_context, aligned to 8 */
+ return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8);
+}
+
static void
assemble_neg_contexts(struct smb2_negotiate_req *req,
struct TCP_Server_Info *server, unsigned int *total_len)
@@ -797,6 +868,13 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
neg_context_count++;
}
+ /* Add implementation ID context */
+ ctxt_len = build_implementation_id_ctxt((struct smb2_implementation_id_context *)
+ pneg_ctxt);
+ *total_len += ctxt_len;
+ pneg_ctxt += ctxt_len;
+ neg_context_count++;
+
/* check for and add transport_capabilities and signing capabilities */
req->NegotiateContextCount = cpu_to_le16(neg_context_count);
diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h
index e482c86ceb00d..1ad7b57ce2952 100644
--- a/fs/smb/common/smb2pdu.h
+++ b/fs/smb/common/smb2pdu.h
@@ -457,6 +457,7 @@ struct smb2_tree_disconnect_rsp {
#define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6)
#define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7)
#define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8)
+#define SMB2_IMPLEMENTATION_ID_CONTEXT_ID cpu_to_le16(0xF100)
#define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100)
struct smb2_neg_context {
@@ -596,6 +597,37 @@ struct smb2_signing_capabilities {
/* Followed by padding to 8 byte boundary (required by some servers) */
} __packed;
+/*
+ * For implementation ID context see MS-SMB2 2.2.3.1.8
+ * Maximum string lengths per specification
+ */
+#define SMB2_IMPL_ID_MAX_DOMAIN_LEN 128
+#define SMB2_IMPL_ID_MAX_NAME_LEN 260
+#define SMB2_IMPL_ID_MAX_VERSION_LEN 260
+#define SMB2_IMPL_ID_MAX_HOSTNAME_LEN 64
+#define SMB2_IMPL_ID_MAX_OS_NAME_LEN 64
+#define SMB2_IMPL_ID_MAX_OS_VERSION_LEN 64
+#define SMB2_IMPL_ID_MAX_ARCH_LEN 64
+
+struct smb2_implementation_id_context {
+ __le16 ContextType; /* 9 */
+ __le16 DataLength;
+ __le32 Reserved;
+ __le16 ImplDomainLength;
+ __le16 ImplNameLength;
+ __le16 ImplVersionLength;
+ __le16 HostNameLength;
+ __le16 OSNameLength;
+ __le16 OSVersionLength;
+ __le16 ArchLength;
+ __le16 Reserved2;
+ /* Followed by variable length UTF-16 strings:
+ * ImplDomain, ImplName, ImplVersion, HostName,
+ * OSName, OSVersion, Arch
+ */
+ __u8 Data[];
+} __packed;
+
#define POSIX_CTXT_DATA_LEN 16
struct smb2_posix_neg_context {
__le16 ContextType; /* 0x100 */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-04 12:27 [PATCH] cifs: implementation id context as negotiate context nspmangalore
@ 2026-03-04 12:34 ` Shyam Prasad N
2026-03-06 22:45 ` Henrique Carvalho
2026-03-09 16:19 ` Ralph Boehme
1 sibling, 1 reply; 15+ messages in thread
From: Shyam Prasad N @ 2026-03-04 12:34 UTC (permalink / raw)
To: linux-cifs, smfrench, pc, bharathsm, dhowells; +Cc: Shyam Prasad N
[-- Attachment #1: Type: text/plain, Size: 7181 bytes --]
On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote:
>
> From: Shyam Prasad N <sprasad@microsoft.com>
>
> MS-SMB2 does not allow any fields for the client to communicate
> the client version details to the server. This change is a
> proof-of-concept to add client details in a new negotiate context.
>
> Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
> ---
> fs/smb/client/smb2pdu.c | 78 +++++++++++++++++++++++++++++++++++++++++
> fs/smb/common/smb2pdu.h | 32 +++++++++++++++++
> 2 files changed, 110 insertions(+)
>
> diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
> index ef655acf673df..9c89f6b4a6709 100644
> --- a/fs/smb/client/smb2pdu.c
> +++ b/fs/smb/client/smb2pdu.c
> @@ -24,6 +24,7 @@
> #include <linux/pagemap.h>
> #include <linux/xattr.h>
> #include <linux/netfs.h>
> +#include <linux/utsname.h>
> #include <trace/events/netfs.h>
> #include "cifsglob.h"
> #include "cifsproto.h"
> @@ -45,6 +46,7 @@
> #include "cached_dir.h"
> #include "compress.h"
> #include "fs_context.h"
> +#include "cifsfs.h"
>
> /*
> * The following table defines the expected "StructureSize" of SMB2 requests
> @@ -724,6 +726,75 @@ build_posix_ctxt(struct smb2_posix_neg_context *pneg_ctxt)
> pneg_ctxt->Name[15] = 0x7C;
> }
>
> +static unsigned int
> +build_implementation_id_ctxt(struct smb2_implementation_id_context *pneg_ctxt)
> +{
> + struct nls_table *cp = load_nls_default();
> + struct new_utsname *uts = utsname();
> + const char *impl_domain = "kernel.org";
> + const char *impl_name = "fs/smb/client";
> + const char *os_name = "Linux";
> + unsigned int data_len = 0;
> + __u8 *data_ptr;
> + int len;
> +
> + pneg_ctxt->ContextType = SMB2_IMPLEMENTATION_ID_CONTEXT_ID;
> + data_ptr = pneg_ctxt->Data;
> +
> + /* ImplDomain */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_domain,
> + SMB2_IMPL_ID_MAX_DOMAIN_LEN, cp);
> + pneg_ctxt->ImplDomainLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* ImplName */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_name,
> + SMB2_IMPL_ID_MAX_NAME_LEN, cp);
> + pneg_ctxt->ImplNameLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* ImplVersion - CIFS_VERSION from cifsfs.h */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, CIFS_VERSION,
> + SMB2_IMPL_ID_MAX_VERSION_LEN, cp);
> + pneg_ctxt->ImplVersionLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* HostName - from utsname()->nodename */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->nodename,
> + SMB2_IMPL_ID_MAX_HOSTNAME_LEN, cp);
> + pneg_ctxt->HostNameLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* OSName */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, os_name,
> + SMB2_IMPL_ID_MAX_OS_NAME_LEN, cp);
> + pneg_ctxt->OSNameLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* OSVersion - from utsname()->release */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->release,
> + SMB2_IMPL_ID_MAX_OS_VERSION_LEN, cp);
> + pneg_ctxt->OSVersionLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* Arch - from utsname()->machine */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->machine,
> + SMB2_IMPL_ID_MAX_ARCH_LEN, cp);
> + pneg_ctxt->ArchLength = cpu_to_le16(len * 2);
> + data_len += len * 2;
> +
> + pneg_ctxt->Reserved2 = 0;
> + pneg_ctxt->DataLength = cpu_to_le16(data_len + 14); /* 14 = 7 length fields * 2 bytes */
> + /* Context size is DataLength + minimal smb2_neg_context, aligned to 8 */
> + return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8);
> +}
> +
> static void
> assemble_neg_contexts(struct smb2_negotiate_req *req,
> struct TCP_Server_Info *server, unsigned int *total_len)
> @@ -797,6 +868,13 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
> neg_context_count++;
> }
>
> + /* Add implementation ID context */
> + ctxt_len = build_implementation_id_ctxt((struct smb2_implementation_id_context *)
> + pneg_ctxt);
> + *total_len += ctxt_len;
> + pneg_ctxt += ctxt_len;
> + neg_context_count++;
> +
> /* check for and add transport_capabilities and signing capabilities */
> req->NegotiateContextCount = cpu_to_le16(neg_context_count);
>
> diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h
> index e482c86ceb00d..1ad7b57ce2952 100644
> --- a/fs/smb/common/smb2pdu.h
> +++ b/fs/smb/common/smb2pdu.h
> @@ -457,6 +457,7 @@ struct smb2_tree_disconnect_rsp {
> #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6)
> #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7)
> #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8)
> +#define SMB2_IMPLEMENTATION_ID_CONTEXT_ID cpu_to_le16(0xF100)
> #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100)
>
> struct smb2_neg_context {
> @@ -596,6 +597,37 @@ struct smb2_signing_capabilities {
> /* Followed by padding to 8 byte boundary (required by some servers) */
> } __packed;
>
> +/*
> + * For implementation ID context see MS-SMB2 2.2.3.1.8
> + * Maximum string lengths per specification
> + */
> +#define SMB2_IMPL_ID_MAX_DOMAIN_LEN 128
> +#define SMB2_IMPL_ID_MAX_NAME_LEN 260
> +#define SMB2_IMPL_ID_MAX_VERSION_LEN 260
> +#define SMB2_IMPL_ID_MAX_HOSTNAME_LEN 64
> +#define SMB2_IMPL_ID_MAX_OS_NAME_LEN 64
> +#define SMB2_IMPL_ID_MAX_OS_VERSION_LEN 64
> +#define SMB2_IMPL_ID_MAX_ARCH_LEN 64
> +
> +struct smb2_implementation_id_context {
> + __le16 ContextType; /* 9 */
> + __le16 DataLength;
> + __le32 Reserved;
> + __le16 ImplDomainLength;
> + __le16 ImplNameLength;
> + __le16 ImplVersionLength;
> + __le16 HostNameLength;
> + __le16 OSNameLength;
> + __le16 OSVersionLength;
> + __le16 ArchLength;
> + __le16 Reserved2;
> + /* Followed by variable length UTF-16 strings:
> + * ImplDomain, ImplName, ImplVersion, HostName,
> + * OSName, OSVersion, Arch
> + */
> + __u8 Data[];
> +} __packed;
> +
> #define POSIX_CTXT_DATA_LEN 16
> struct smb2_posix_neg_context {
> __le16 ContextType; /* 0x100 */
> --
> 2.43.0
>
A proof-of-concept based on this draft from Bharath.
Looking for comments on how to improve.
--
Regards,
Shyam
[-- Attachment #2: SMB2_IMPL_ID_Design.pdf --]
[-- Type: application/pdf, Size: 372482 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-04 12:34 ` Shyam Prasad N
@ 2026-03-06 22:45 ` Henrique Carvalho
2026-03-06 23:04 ` Steve French
0 siblings, 1 reply; 15+ messages in thread
From: Henrique Carvalho @ 2026-03-06 22:45 UTC (permalink / raw)
To: Shyam Prasad N
Cc: linux-cifs, smfrench, pc, bharathsm, dhowells, Shyam Prasad N
On Wed, Mar 04, 2026 at 06:04:05PM +0530, Shyam Prasad N wrote: > On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote: From: Shyam Prasad N <sprasad@microsoft.com>
>
> A proof-of-concept based on this draft from Bharath.
> Looking for comments on how to improve.
Looks good.
Just one minor thing for now. To me the cifs.ko module version doesn't
say much as it seems to be not reliable (apologies if I'm mistaken).
Also, the same version could have different implementations in different
distributions. modinfo -F srcversion cifs is a better way to
differentiate cifs versions but not to compare versions. So the solution
is either remove this or bump it in every change using X.Y.Z.
Further, have you thought about how the client can use this in its favor
other than diagnosing/debugging a faulty server?
I think we need to be clear on what is allowed here, to me it seems
quirks, workarounds and perf tuning? Maybe this can be used to improve
interaction between linux client and linux server?
Thanks,
--
Henrique
SUSE Labs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-06 22:45 ` Henrique Carvalho
@ 2026-03-06 23:04 ` Steve French
2026-03-06 23:19 ` Paulo Alcantara
2026-03-06 23:30 ` Henrique Carvalho
0 siblings, 2 replies; 15+ messages in thread
From: Steve French @ 2026-03-06 23:04 UTC (permalink / raw)
To: Henrique Carvalho
Cc: Shyam Prasad N, linux-cifs, pc, bharathsm, dhowells,
Shyam Prasad N
On Fri, Mar 6, 2026 at 4:45 PM Henrique Carvalho
<henrique.carvalho@suse.com> wrote:
>
> On Wed, Mar 04, 2026 at 06:04:05PM +0530, Shyam Prasad N wrote: > On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote: From: Shyam Prasad N <sprasad@microsoft.com>
> >
> > A proof-of-concept based on this draft from Bharath.
> > Looking for comments on how to improve.
>
> Looks good.
>
> Just one minor thing for now. To me the cifs.ko module version doesn't
> say much as it seems to be not reliable (apologies if I'm mistaken).
It does get incremented every 10 weeks.
> Also, the same version could have different implementations in different
> distributions. modinfo -F srcversion cifs is a better way to
> differentiate cifs versions but not to compare versions. So the solution
> is either remove this or bump it in every change using X.Y.Z.
We do bump the module version every kernel release, e.g. we are at
2.59 in Linux 7.0 (7.0-rc2)
Would bump it when someone does a 'full backport' of most cifs fixes
to an earlier kernel.
> Further, have you thought about how the client can use this in its favor
> other than diagnosing/debugging a faulty server?
I thought this was for the reverse - so the server support team can
get metrics on whether the client is an old client with known bugs
> I think we need to be clear on what is allowed here, to me it seems
> quirks, workarounds and perf tuning? Maybe this can be used to improve
> interaction between linux client and linux server?
presumably primarily for customer support to be able to recognise
known client problems on clients accessing a server
--
Thanks,
Steve
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-06 23:04 ` Steve French
@ 2026-03-06 23:19 ` Paulo Alcantara
2026-03-06 23:23 ` Steve French
2026-03-09 16:34 ` Shyam Prasad N
2026-03-06 23:30 ` Henrique Carvalho
1 sibling, 2 replies; 15+ messages in thread
From: Paulo Alcantara @ 2026-03-06 23:19 UTC (permalink / raw)
To: Steve French, Henrique Carvalho
Cc: Shyam Prasad N, linux-cifs, bharathsm, dhowells, Shyam Prasad N
Steve French <smfrench@gmail.com> writes:
> On Fri, Mar 6, 2026 at 4:45 PM Henrique Carvalho
> <henrique.carvalho@suse.com> wrote:
>>
>> On Wed, Mar 04, 2026 at 06:04:05PM +0530, Shyam Prasad N wrote: > On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote: From: Shyam Prasad N <sprasad@microsoft.com>
>> >
>> > A proof-of-concept based on this draft from Bharath.
>> > Looking for comments on how to improve.
>>
>> Looks good.
>>
>> Just one minor thing for now. To me the cifs.ko module version doesn't
>> say much as it seems to be not reliable (apologies if I'm mistaken).
>
> It does get incremented every 10 weeks.
>
>> Also, the same version could have different implementations in different
>> distributions. modinfo -F srcversion cifs is a better way to
>> differentiate cifs versions but not to compare versions. So the solution
>> is either remove this or bump it in every change using X.Y.Z.
>
> We do bump the module version every kernel release, e.g. we are at
> 2.59 in Linux 7.0 (7.0-rc2)
> Would bump it when someone does a 'full backport' of most cifs fixes
> to an earlier kernel.
Who?
>> Further, have you thought about how the client can use this in its favor
>> other than diagnosing/debugging a faulty server?
>
> I thought this was for the reverse - so the server support team can
> get metrics on whether the client is an old client with known bugs
The client version is entirely pointless, especially for distribution
kernels. The support team can't figure out by just looking at the
client version as the backports are what really matter in terms of a
distro kernel. Most distro kernels don't even bother backporting those
commits that bump the client version, which makes it even more
inaccurate.
>> I think we need to be clear on what is allowed here, to me it seems
>> quirks, workarounds and perf tuning? Maybe this can be used to improve
>> interaction between linux client and linux server?
>
> presumably primarily for customer support to be able to recognise
> known client problems on clients accessing a server
Neither the client or kernel version will tell you _exactly_ where the
problem is in distro kernels.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-06 23:19 ` Paulo Alcantara
@ 2026-03-06 23:23 ` Steve French
2026-03-09 16:34 ` Shyam Prasad N
1 sibling, 0 replies; 15+ messages in thread
From: Steve French @ 2026-03-06 23:23 UTC (permalink / raw)
To: Paulo Alcantara
Cc: Henrique Carvalho, Shyam Prasad N, linux-cifs, bharathsm,
dhowells, Shyam Prasad N
On Fri, Mar 6, 2026 at 5:19 PM Paulo Alcantara <pc@manguebit.org> wrote:
>
> Steve French <smfrench@gmail.com> writes:
>
> > On Fri, Mar 6, 2026 at 4:45 PM Henrique Carvalho
> > <henrique.carvalho@suse.com> wrote:
> >>
> >> On Wed, Mar 04, 2026 at 06:04:05PM +0530, Shyam Prasad N wrote: > On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote: From: Shyam Prasad N <sprasad@microsoft.com>
> >> >
> >> > A proof-of-concept based on this draft from Bharath.
> >> > Looking for comments on how to improve.
> >>
> >> Looks good.
> >>
> >> Just one minor thing for now. To me the cifs.ko module version doesn't
> >> say much as it seems to be not reliable (apologies if I'm mistaken).
> >
> > It does get incremented every 10 weeks.
> >
> >> Also, the same version could have different implementations in different
> >> distributions. modinfo -F srcversion cifs is a better way to
> >> differentiate cifs versions but not to compare versions. So the solution
> >> is either remove this or bump it in every change using X.Y.Z.
> >
> > We do bump the module version every kernel release, e.g. we are at
> > 2.59 in Linux 7.0 (7.0-rc2)
> > Would bump it when someone does a 'full backport' of most cifs fixes
> > to an earlier kernel.
>
> Who?
>
> >> Further, have you thought about how the client can use this in its favor
> >> other than diagnosing/debugging a faulty server?
> >
> > I thought this was for the reverse - so the server support team can
> > get metrics on whether the client is an old client with known bugs
>
> The client version is entirely pointless, especially for distribution
> kernels. The support team can't figure out by just looking at the
> client version as the backports are what really matter in terms of a
> distro kernel. Most distro kernels don't even bother backporting those
> commits that bump the client version, which makes it even more
> inaccurate.
>
> >> I think we need to be clear on what is allowed here, to me it seems
> >> quirks, workarounds and perf tuning? Maybe this can be used to improve
> >> interaction between linux client and linux server?
> >
> > presumably primarily for customer support to be able to recognise
> > known client problems on clients accessing a server
>
> Neither the client or kernel version will tell you _exactly_ where the
> problem is in distro kernels.
The combination of the various version fields would be 99% likely to
be able to match to a particular distro version (at least for the
major ones, SuSE, Redhat, Ubuntu, Mariner). Unfortunately there are
many customers out there who run kernels more than four years old so
can be helpful to know client os version
--
Thanks,
Steve
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-06 23:04 ` Steve French
2026-03-06 23:19 ` Paulo Alcantara
@ 2026-03-06 23:30 ` Henrique Carvalho
1 sibling, 0 replies; 15+ messages in thread
From: Henrique Carvalho @ 2026-03-06 23:30 UTC (permalink / raw)
To: Steve French
Cc: Shyam Prasad N, linux-cifs, pc, bharathsm, dhowells,
Shyam Prasad N
On Fri, Mar 06, 2026 at 05:04:20PM -0600, Steve French wrote:
> On Fri, Mar 6, 2026 at 4:45 PM Henrique Carvalho
> <henrique.carvalho@suse.com> wrote:
> >
> > On Wed, Mar 04, 2026 at 06:04:05PM +0530, Shyam Prasad N wrote: > On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote: From: Shyam Prasad N <sprasad@microsoft.com>
> > >
> > > A proof-of-concept based on this draft from Bharath.
> > > Looking for comments on how to improve.
> >
> > Looks good.
> >
> > Just one minor thing for now. To me the cifs.ko module version doesn't
> > say much as it seems to be not reliable (apologies if I'm mistaken).
>
> It does get incremented every 10 weeks.
>
Okay. I guess we've skipped sometimes.
> > Also, the same version could have different implementations in different
> > distributions. modinfo -F srcversion cifs is a better way to
> > differentiate cifs versions but not to compare versions. So the solution
> > is either remove this or bump it in every change using X.Y.Z.
>
> We do bump the module version every kernel release, e.g. we are at
> 2.59 in Linux 7.0 (7.0-rc2)
> Would bump it when someone does a 'full backport' of most cifs fixes
> to an earlier kernel.
>
> > Further, have you thought about how the client can use this in its favor
> > other than diagnosing/debugging a faulty server?
>
> I thought this was for the reverse - so the server support team can
> get metrics on whether the client is an old client with known bugs
>
> > I think we need to be clear on what is allowed here, to me it seems
> > quirks, workarounds and perf tuning? Maybe this can be used to improve
> > interaction between linux client and linux server?
>
> presumably primarily for customer support to be able to recognise
> known client problems on clients accessing a server
>
Yes, but also the server will be able to send back context as well,
correct? This may allow more than bug triaging.
--
Henrique
SUSE Labs
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-04 12:27 [PATCH] cifs: implementation id context as negotiate context nspmangalore
2026-03-04 12:34 ` Shyam Prasad N
@ 2026-03-09 16:19 ` Ralph Boehme
2026-03-09 16:37 ` Shyam Prasad N
1 sibling, 1 reply; 15+ messages in thread
From: Ralph Boehme @ 2026-03-09 16:19 UTC (permalink / raw)
To: nspmangalore, linux-cifs, smfrench, pc, bharathsm, dhowells
Cc: Shyam Prasad N
[-- Attachment #1.1: Type: text/plain, Size: 6628 bytes --]
Hi!
I wonder which servers are expected to be implementing this? I suppose
this protocol extension is not proposed without a server vendor
interested in actually implementing it, otherwise the whole metrics
story doesn't make sense.
*scratches head*
Thanks!
-slow
On 3/4/26 1:27 PM, nspmangalore@gmail.com wrote:
> From: Shyam Prasad N <sprasad@microsoft.com>
>
> MS-SMB2 does not allow any fields for the client to communicate
> the client version details to the server. This change is a
> proof-of-concept to add client details in a new negotiate context.
>
> Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
> ---
> fs/smb/client/smb2pdu.c | 78 +++++++++++++++++++++++++++++++++++++++++
> fs/smb/common/smb2pdu.h | 32 +++++++++++++++++
> 2 files changed, 110 insertions(+)
>
> diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
> index ef655acf673df..9c89f6b4a6709 100644
> --- a/fs/smb/client/smb2pdu.c
> +++ b/fs/smb/client/smb2pdu.c
> @@ -24,6 +24,7 @@
> #include <linux/pagemap.h>
> #include <linux/xattr.h>
> #include <linux/netfs.h>
> +#include <linux/utsname.h>
> #include <trace/events/netfs.h>
> #include "cifsglob.h"
> #include "cifsproto.h"
> @@ -45,6 +46,7 @@
> #include "cached_dir.h"
> #include "compress.h"
> #include "fs_context.h"
> +#include "cifsfs.h"
>
> /*
> * The following table defines the expected "StructureSize" of SMB2 requests
> @@ -724,6 +726,75 @@ build_posix_ctxt(struct smb2_posix_neg_context *pneg_ctxt)
> pneg_ctxt->Name[15] = 0x7C;
> }
>
> +static unsigned int
> +build_implementation_id_ctxt(struct smb2_implementation_id_context *pneg_ctxt)
> +{
> + struct nls_table *cp = load_nls_default();
> + struct new_utsname *uts = utsname();
> + const char *impl_domain = "kernel.org";
> + const char *impl_name = "fs/smb/client";
> + const char *os_name = "Linux";
> + unsigned int data_len = 0;
> + __u8 *data_ptr;
> + int len;
> +
> + pneg_ctxt->ContextType = SMB2_IMPLEMENTATION_ID_CONTEXT_ID;
> + data_ptr = pneg_ctxt->Data;
> +
> + /* ImplDomain */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_domain,
> + SMB2_IMPL_ID_MAX_DOMAIN_LEN, cp);
> + pneg_ctxt->ImplDomainLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* ImplName */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_name,
> + SMB2_IMPL_ID_MAX_NAME_LEN, cp);
> + pneg_ctxt->ImplNameLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* ImplVersion - CIFS_VERSION from cifsfs.h */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, CIFS_VERSION,
> + SMB2_IMPL_ID_MAX_VERSION_LEN, cp);
> + pneg_ctxt->ImplVersionLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* HostName - from utsname()->nodename */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->nodename,
> + SMB2_IMPL_ID_MAX_HOSTNAME_LEN, cp);
> + pneg_ctxt->HostNameLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* OSName */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, os_name,
> + SMB2_IMPL_ID_MAX_OS_NAME_LEN, cp);
> + pneg_ctxt->OSNameLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* OSVersion - from utsname()->release */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->release,
> + SMB2_IMPL_ID_MAX_OS_VERSION_LEN, cp);
> + pneg_ctxt->OSVersionLength = cpu_to_le16(len * 2);
> + data_ptr += len * 2;
> + data_len += len * 2;
> +
> + /* Arch - from utsname()->machine */
> + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->machine,
> + SMB2_IMPL_ID_MAX_ARCH_LEN, cp);
> + pneg_ctxt->ArchLength = cpu_to_le16(len * 2);
> + data_len += len * 2;
> +
> + pneg_ctxt->Reserved2 = 0;
> + pneg_ctxt->DataLength = cpu_to_le16(data_len + 14); /* 14 = 7 length fields * 2 bytes */
> + /* Context size is DataLength + minimal smb2_neg_context, aligned to 8 */
> + return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8);
> +}
> +
> static void
> assemble_neg_contexts(struct smb2_negotiate_req *req,
> struct TCP_Server_Info *server, unsigned int *total_len)
> @@ -797,6 +868,13 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
> neg_context_count++;
> }
>
> + /* Add implementation ID context */
> + ctxt_len = build_implementation_id_ctxt((struct smb2_implementation_id_context *)
> + pneg_ctxt);
> + *total_len += ctxt_len;
> + pneg_ctxt += ctxt_len;
> + neg_context_count++;
> +
> /* check for and add transport_capabilities and signing capabilities */
> req->NegotiateContextCount = cpu_to_le16(neg_context_count);
>
> diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h
> index e482c86ceb00d..1ad7b57ce2952 100644
> --- a/fs/smb/common/smb2pdu.h
> +++ b/fs/smb/common/smb2pdu.h
> @@ -457,6 +457,7 @@ struct smb2_tree_disconnect_rsp {
> #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6)
> #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7)
> #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8)
> +#define SMB2_IMPLEMENTATION_ID_CONTEXT_ID cpu_to_le16(0xF100)
> #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100)
>
> struct smb2_neg_context {
> @@ -596,6 +597,37 @@ struct smb2_signing_capabilities {
> /* Followed by padding to 8 byte boundary (required by some servers) */
> } __packed;
>
> +/*
> + * For implementation ID context see MS-SMB2 2.2.3.1.8
> + * Maximum string lengths per specification
> + */
> +#define SMB2_IMPL_ID_MAX_DOMAIN_LEN 128
> +#define SMB2_IMPL_ID_MAX_NAME_LEN 260
> +#define SMB2_IMPL_ID_MAX_VERSION_LEN 260
> +#define SMB2_IMPL_ID_MAX_HOSTNAME_LEN 64
> +#define SMB2_IMPL_ID_MAX_OS_NAME_LEN 64
> +#define SMB2_IMPL_ID_MAX_OS_VERSION_LEN 64
> +#define SMB2_IMPL_ID_MAX_ARCH_LEN 64
> +
> +struct smb2_implementation_id_context {
> + __le16 ContextType; /* 9 */
> + __le16 DataLength;
> + __le32 Reserved;
> + __le16 ImplDomainLength;
> + __le16 ImplNameLength;
> + __le16 ImplVersionLength;
> + __le16 HostNameLength;
> + __le16 OSNameLength;
> + __le16 OSVersionLength;
> + __le16 ArchLength;
> + __le16 Reserved2;
> + /* Followed by variable length UTF-16 strings:
> + * ImplDomain, ImplName, ImplVersion, HostName,
> + * OSName, OSVersion, Arch
> + */
> + __u8 Data[];
> +} __packed;
> +
> #define POSIX_CTXT_DATA_LEN 16
> struct smb2_posix_neg_context {
> __le16 ContextType; /* 0x100 */
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-06 23:19 ` Paulo Alcantara
2026-03-06 23:23 ` Steve French
@ 2026-03-09 16:34 ` Shyam Prasad N
1 sibling, 0 replies; 15+ messages in thread
From: Shyam Prasad N @ 2026-03-09 16:34 UTC (permalink / raw)
To: Paulo Alcantara
Cc: Steve French, Henrique Carvalho, linux-cifs, bharathsm, dhowells,
Shyam Prasad N
On Sat, Mar 7, 2026 at 4:49 AM Paulo Alcantara <pc@manguebit.org> wrote:
>
> Steve French <smfrench@gmail.com> writes:
>
> > On Fri, Mar 6, 2026 at 4:45 PM Henrique Carvalho
> > <henrique.carvalho@suse.com> wrote:
> >>
> >> On Wed, Mar 04, 2026 at 06:04:05PM +0530, Shyam Prasad N wrote: > On Wed, Mar 4, 2026 at 5:59 PM <nspmangalore@gmail.com> wrote: From: Shyam Prasad N <sprasad@microsoft.com>
> >> >
> >> > A proof-of-concept based on this draft from Bharath.
> >> > Looking for comments on how to improve.
> >>
> >> Looks good.
> >>
> >> Just one minor thing for now. To me the cifs.ko module version doesn't
> >> say much as it seems to be not reliable (apologies if I'm mistaken).
> >
> > It does get incremented every 10 weeks.
> >
> >> Also, the same version could have different implementations in different
> >> distributions. modinfo -F srcversion cifs is a better way to
> >> differentiate cifs versions but not to compare versions. So the solution
> >> is either remove this or bump it in every change using X.Y.Z.
> >
> > We do bump the module version every kernel release, e.g. we are at
> > 2.59 in Linux 7.0 (7.0-rc2)
> > Would bump it when someone does a 'full backport' of most cifs fixes
> > to an earlier kernel.
>
> Who?
>
> >> Further, have you thought about how the client can use this in its favor
> >> other than diagnosing/debugging a faulty server?
> >
> > I thought this was for the reverse - so the server support team can
> > get metrics on whether the client is an old client with known bugs
>
> The client version is entirely pointless, especially for distribution
> kernels. The support team can't figure out by just looking at the
> client version as the backports are what really matter in terms of a
> distro kernel. Most distro kernels don't even bother backporting those
> commits that bump the client version, which makes it even more
> inaccurate.
>
> >> I think we need to be clear on what is allowed here, to me it seems
> >> quirks, workarounds and perf tuning? Maybe this can be used to improve
> >> interaction between linux client and linux server?
> >
> > presumably primarily for customer support to be able to recognise
> > known client problems on clients accessing a server
>
> Neither the client or kernel version will tell you _exactly_ where the
> problem is in distro kernels.
Hi Paulo / Henrique,
Good points.
srcversion is probably something that can be unique for a specific
version. But is there a common place where srcversion values are
documented by distros today?
If that is the case, perhaps that with the combination of the kernel
version can tell us what cifs.ko the client machine is actually
running.
--
Regards,
Shyam
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-09 16:19 ` Ralph Boehme
@ 2026-03-09 16:37 ` Shyam Prasad N
2026-03-09 17:35 ` Ralph Boehme
2026-03-09 17:59 ` Enzo Matsumiya
0 siblings, 2 replies; 15+ messages in thread
From: Shyam Prasad N @ 2026-03-09 16:37 UTC (permalink / raw)
To: Ralph Boehme
Cc: linux-cifs, smfrench, pc, bharathsm, dhowells, Shyam Prasad N
On Mon, Mar 9, 2026 at 9:49 PM Ralph Boehme <slow@samba.org> wrote:
>
> Hi!
>
> I wonder which servers are expected to be implementing this? I suppose
> this protocol extension is not proposed without a server vendor
> interested in actually implementing it, otherwise the whole metrics
> story doesn't make sense.
Hi Ralph,
This is supposed to give the server an idea of what version of cifs.ko
the client is actually running.
This can be useful for servers like Azure SMB servers, where it is not
easy to explain client side behaviour without knowing what exact
version of the code is running on the client.
>
> *scratches head*
>
> Thanks!
> -slow
>
> On 3/4/26 1:27 PM, nspmangalore@gmail.com wrote:
> > From: Shyam Prasad N <sprasad@microsoft.com>
> >
> > MS-SMB2 does not allow any fields for the client to communicate
> > the client version details to the server. This change is a
> > proof-of-concept to add client details in a new negotiate context.
> >
> > Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
> > ---
> > fs/smb/client/smb2pdu.c | 78 +++++++++++++++++++++++++++++++++++++++++
> > fs/smb/common/smb2pdu.h | 32 +++++++++++++++++
> > 2 files changed, 110 insertions(+)
> >
> > diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
> > index ef655acf673df..9c89f6b4a6709 100644
> > --- a/fs/smb/client/smb2pdu.c
> > +++ b/fs/smb/client/smb2pdu.c
> > @@ -24,6 +24,7 @@
> > #include <linux/pagemap.h>
> > #include <linux/xattr.h>
> > #include <linux/netfs.h>
> > +#include <linux/utsname.h>
> > #include <trace/events/netfs.h>
> > #include "cifsglob.h"
> > #include "cifsproto.h"
> > @@ -45,6 +46,7 @@
> > #include "cached_dir.h"
> > #include "compress.h"
> > #include "fs_context.h"
> > +#include "cifsfs.h"
> >
> > /*
> > * The following table defines the expected "StructureSize" of SMB2 requests
> > @@ -724,6 +726,75 @@ build_posix_ctxt(struct smb2_posix_neg_context *pneg_ctxt)
> > pneg_ctxt->Name[15] = 0x7C;
> > }
> >
> > +static unsigned int
> > +build_implementation_id_ctxt(struct smb2_implementation_id_context *pneg_ctxt)
> > +{
> > + struct nls_table *cp = load_nls_default();
> > + struct new_utsname *uts = utsname();
> > + const char *impl_domain = "kernel.org";
> > + const char *impl_name = "fs/smb/client";
> > + const char *os_name = "Linux";
> > + unsigned int data_len = 0;
> > + __u8 *data_ptr;
> > + int len;
> > +
> > + pneg_ctxt->ContextType = SMB2_IMPLEMENTATION_ID_CONTEXT_ID;
> > + data_ptr = pneg_ctxt->Data;
> > +
> > + /* ImplDomain */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_domain,
> > + SMB2_IMPL_ID_MAX_DOMAIN_LEN, cp);
> > + pneg_ctxt->ImplDomainLength = cpu_to_le16(len * 2);
> > + data_ptr += len * 2;
> > + data_len += len * 2;
> > +
> > + /* ImplName */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_name,
> > + SMB2_IMPL_ID_MAX_NAME_LEN, cp);
> > + pneg_ctxt->ImplNameLength = cpu_to_le16(len * 2);
> > + data_ptr += len * 2;
> > + data_len += len * 2;
> > +
> > + /* ImplVersion - CIFS_VERSION from cifsfs.h */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, CIFS_VERSION,
> > + SMB2_IMPL_ID_MAX_VERSION_LEN, cp);
> > + pneg_ctxt->ImplVersionLength = cpu_to_le16(len * 2);
> > + data_ptr += len * 2;
> > + data_len += len * 2;
> > +
> > + /* HostName - from utsname()->nodename */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->nodename,
> > + SMB2_IMPL_ID_MAX_HOSTNAME_LEN, cp);
> > + pneg_ctxt->HostNameLength = cpu_to_le16(len * 2);
> > + data_ptr += len * 2;
> > + data_len += len * 2;
> > +
> > + /* OSName */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, os_name,
> > + SMB2_IMPL_ID_MAX_OS_NAME_LEN, cp);
> > + pneg_ctxt->OSNameLength = cpu_to_le16(len * 2);
> > + data_ptr += len * 2;
> > + data_len += len * 2;
> > +
> > + /* OSVersion - from utsname()->release */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->release,
> > + SMB2_IMPL_ID_MAX_OS_VERSION_LEN, cp);
> > + pneg_ctxt->OSVersionLength = cpu_to_le16(len * 2);
> > + data_ptr += len * 2;
> > + data_len += len * 2;
> > +
> > + /* Arch - from utsname()->machine */
> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->machine,
> > + SMB2_IMPL_ID_MAX_ARCH_LEN, cp);
> > + pneg_ctxt->ArchLength = cpu_to_le16(len * 2);
> > + data_len += len * 2;
> > +
> > + pneg_ctxt->Reserved2 = 0;
> > + pneg_ctxt->DataLength = cpu_to_le16(data_len + 14); /* 14 = 7 length fields * 2 bytes */
> > + /* Context size is DataLength + minimal smb2_neg_context, aligned to 8 */
> > + return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8);
> > +}
> > +
> > static void
> > assemble_neg_contexts(struct smb2_negotiate_req *req,
> > struct TCP_Server_Info *server, unsigned int *total_len)
> > @@ -797,6 +868,13 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
> > neg_context_count++;
> > }
> >
> > + /* Add implementation ID context */
> > + ctxt_len = build_implementation_id_ctxt((struct smb2_implementation_id_context *)
> > + pneg_ctxt);
> > + *total_len += ctxt_len;
> > + pneg_ctxt += ctxt_len;
> > + neg_context_count++;
> > +
> > /* check for and add transport_capabilities and signing capabilities */
> > req->NegotiateContextCount = cpu_to_le16(neg_context_count);
> >
> > diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h
> > index e482c86ceb00d..1ad7b57ce2952 100644
> > --- a/fs/smb/common/smb2pdu.h
> > +++ b/fs/smb/common/smb2pdu.h
> > @@ -457,6 +457,7 @@ struct smb2_tree_disconnect_rsp {
> > #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6)
> > #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7)
> > #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8)
> > +#define SMB2_IMPLEMENTATION_ID_CONTEXT_ID cpu_to_le16(0xF100)
> > #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100)
> >
> > struct smb2_neg_context {
> > @@ -596,6 +597,37 @@ struct smb2_signing_capabilities {
> > /* Followed by padding to 8 byte boundary (required by some servers) */
> > } __packed;
> >
> > +/*
> > + * For implementation ID context see MS-SMB2 2.2.3.1.8
> > + * Maximum string lengths per specification
> > + */
> > +#define SMB2_IMPL_ID_MAX_DOMAIN_LEN 128
> > +#define SMB2_IMPL_ID_MAX_NAME_LEN 260
> > +#define SMB2_IMPL_ID_MAX_VERSION_LEN 260
> > +#define SMB2_IMPL_ID_MAX_HOSTNAME_LEN 64
> > +#define SMB2_IMPL_ID_MAX_OS_NAME_LEN 64
> > +#define SMB2_IMPL_ID_MAX_OS_VERSION_LEN 64
> > +#define SMB2_IMPL_ID_MAX_ARCH_LEN 64
> > +
> > +struct smb2_implementation_id_context {
> > + __le16 ContextType; /* 9 */
> > + __le16 DataLength;
> > + __le32 Reserved;
> > + __le16 ImplDomainLength;
> > + __le16 ImplNameLength;
> > + __le16 ImplVersionLength;
> > + __le16 HostNameLength;
> > + __le16 OSNameLength;
> > + __le16 OSVersionLength;
> > + __le16 ArchLength;
> > + __le16 Reserved2;
> > + /* Followed by variable length UTF-16 strings:
> > + * ImplDomain, ImplName, ImplVersion, HostName,
> > + * OSName, OSVersion, Arch
> > + */
> > + __u8 Data[];
> > +} __packed;
> > +
> > #define POSIX_CTXT_DATA_LEN 16
> > struct smb2_posix_neg_context {
> > __le16 ContextType; /* 0x100 */
>
--
Regards,
Shyam
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-09 16:37 ` Shyam Prasad N
@ 2026-03-09 17:35 ` Ralph Boehme
2026-03-11 23:50 ` Shyam Prasad N
2026-03-09 17:59 ` Enzo Matsumiya
1 sibling, 1 reply; 15+ messages in thread
From: Ralph Boehme @ 2026-03-09 17:35 UTC (permalink / raw)
To: Shyam Prasad N
Cc: linux-cifs, smfrench, pc, bharathsm, dhowells, Shyam Prasad N
[-- Attachment #1.1: Type: text/plain, Size: 516 bytes --]
Hi Shyam,
On 3/9/26 5:37 PM, Shyam Prasad N wrote:
> This can be useful for servers like Azure SMB servers, where it is not
> easy to explain client side behaviour without knowing what exact
> version of the code is running on the client.
so it is planned that MS is going to implement this in their servers?
I was kind of assuming this which made me wonder why is this made an
community extension instead of a protocol feature will full MS backing
including inclusion in MS-SMB2.
Thanks!
-slow
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-09 16:37 ` Shyam Prasad N
2026-03-09 17:35 ` Ralph Boehme
@ 2026-03-09 17:59 ` Enzo Matsumiya
2026-03-11 23:52 ` Shyam Prasad N
1 sibling, 1 reply; 15+ messages in thread
From: Enzo Matsumiya @ 2026-03-09 17:59 UTC (permalink / raw)
To: Shyam Prasad N
Cc: Ralph Boehme, linux-cifs, smfrench, pc, bharathsm, dhowells,
Shyam Prasad N
On 03/09, Shyam Prasad N wrote:
>On Mon, Mar 9, 2026 at 9:49 PM Ralph Boehme <slow@samba.org> wrote:
>>
>> Hi!
>>
>> I wonder which servers are expected to be implementing this? I suppose
>> this protocol extension is not proposed without a server vendor
>> interested in actually implementing it, otherwise the whole metrics
>> story doesn't make sense.
>
>Hi Ralph,
>
>This is supposed to give the server an idea of what version of cifs.ko
>the client is actually running.
I agree with others on this point -- cifs.ko version is useless to match
to a particular behaviour or pinpoint a specific bug.
>This can be useful for servers like Azure SMB servers, where it is not
>easy to explain client side behaviour without knowing what exact
>version of the code is running on the client.
If the proposal is going to be bidirectional, it would be much better,
for cifs.ko, to have servers sending such information to clients
instead; even when there's a problem on the server, it'll usually
reflect on the client (crashes, misbehaviour, etc).
Also useful for cases where customers don't have direct/easy access to
their SMB infrastructure (e.g. external/3rd party hosting, or 1000s of
servers mixed with DFS and/or clusters).
Cheers,
Enzo
>> *scratches head*
>>
>> Thanks!
>> -slow
>>
>> On 3/4/26 1:27 PM, nspmangalore@gmail.com wrote:
>> > From: Shyam Prasad N <sprasad@microsoft.com>
>> >
>> > MS-SMB2 does not allow any fields for the client to communicate
>> > the client version details to the server. This change is a
>> > proof-of-concept to add client details in a new negotiate context.
>> >
>> > Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
>> > ---
>> > fs/smb/client/smb2pdu.c | 78 +++++++++++++++++++++++++++++++++++++++++
>> > fs/smb/common/smb2pdu.h | 32 +++++++++++++++++
>> > 2 files changed, 110 insertions(+)
>> >
>> > diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
>> > index ef655acf673df..9c89f6b4a6709 100644
>> > --- a/fs/smb/client/smb2pdu.c
>> > +++ b/fs/smb/client/smb2pdu.c
>> > @@ -24,6 +24,7 @@
>> > #include <linux/pagemap.h>
>> > #include <linux/xattr.h>
>> > #include <linux/netfs.h>
>> > +#include <linux/utsname.h>
>> > #include <trace/events/netfs.h>
>> > #include "cifsglob.h"
>> > #include "cifsproto.h"
>> > @@ -45,6 +46,7 @@
>> > #include "cached_dir.h"
>> > #include "compress.h"
>> > #include "fs_context.h"
>> > +#include "cifsfs.h"
>> >
>> > /*
>> > * The following table defines the expected "StructureSize" of SMB2 requests
>> > @@ -724,6 +726,75 @@ build_posix_ctxt(struct smb2_posix_neg_context *pneg_ctxt)
>> > pneg_ctxt->Name[15] = 0x7C;
>> > }
>> >
>> > +static unsigned int
>> > +build_implementation_id_ctxt(struct smb2_implementation_id_context *pneg_ctxt)
>> > +{
>> > + struct nls_table *cp = load_nls_default();
>> > + struct new_utsname *uts = utsname();
>> > + const char *impl_domain = "kernel.org";
>> > + const char *impl_name = "fs/smb/client";
>> > + const char *os_name = "Linux";
>> > + unsigned int data_len = 0;
>> > + __u8 *data_ptr;
>> > + int len;
>> > +
>> > + pneg_ctxt->ContextType = SMB2_IMPLEMENTATION_ID_CONTEXT_ID;
>> > + data_ptr = pneg_ctxt->Data;
>> > +
>> > + /* ImplDomain */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_domain,
>> > + SMB2_IMPL_ID_MAX_DOMAIN_LEN, cp);
>> > + pneg_ctxt->ImplDomainLength = cpu_to_le16(len * 2);
>> > + data_ptr += len * 2;
>> > + data_len += len * 2;
>> > +
>> > + /* ImplName */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_name,
>> > + SMB2_IMPL_ID_MAX_NAME_LEN, cp);
>> > + pneg_ctxt->ImplNameLength = cpu_to_le16(len * 2);
>> > + data_ptr += len * 2;
>> > + data_len += len * 2;
>> > +
>> > + /* ImplVersion - CIFS_VERSION from cifsfs.h */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, CIFS_VERSION,
>> > + SMB2_IMPL_ID_MAX_VERSION_LEN, cp);
>> > + pneg_ctxt->ImplVersionLength = cpu_to_le16(len * 2);
>> > + data_ptr += len * 2;
>> > + data_len += len * 2;
>> > +
>> > + /* HostName - from utsname()->nodename */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->nodename,
>> > + SMB2_IMPL_ID_MAX_HOSTNAME_LEN, cp);
>> > + pneg_ctxt->HostNameLength = cpu_to_le16(len * 2);
>> > + data_ptr += len * 2;
>> > + data_len += len * 2;
>> > +
>> > + /* OSName */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, os_name,
>> > + SMB2_IMPL_ID_MAX_OS_NAME_LEN, cp);
>> > + pneg_ctxt->OSNameLength = cpu_to_le16(len * 2);
>> > + data_ptr += len * 2;
>> > + data_len += len * 2;
>> > +
>> > + /* OSVersion - from utsname()->release */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->release,
>> > + SMB2_IMPL_ID_MAX_OS_VERSION_LEN, cp);
>> > + pneg_ctxt->OSVersionLength = cpu_to_le16(len * 2);
>> > + data_ptr += len * 2;
>> > + data_len += len * 2;
>> > +
>> > + /* Arch - from utsname()->machine */
>> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->machine,
>> > + SMB2_IMPL_ID_MAX_ARCH_LEN, cp);
>> > + pneg_ctxt->ArchLength = cpu_to_le16(len * 2);
>> > + data_len += len * 2;
>> > +
>> > + pneg_ctxt->Reserved2 = 0;
>> > + pneg_ctxt->DataLength = cpu_to_le16(data_len + 14); /* 14 = 7 length fields * 2 bytes */
>> > + /* Context size is DataLength + minimal smb2_neg_context, aligned to 8 */
>> > + return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8);
>> > +}
>> > +
>> > static void
>> > assemble_neg_contexts(struct smb2_negotiate_req *req,
>> > struct TCP_Server_Info *server, unsigned int *total_len)
>> > @@ -797,6 +868,13 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
>> > neg_context_count++;
>> > }
>> >
>> > + /* Add implementation ID context */
>> > + ctxt_len = build_implementation_id_ctxt((struct smb2_implementation_id_context *)
>> > + pneg_ctxt);
>> > + *total_len += ctxt_len;
>> > + pneg_ctxt += ctxt_len;
>> > + neg_context_count++;
>> > +
>> > /* check for and add transport_capabilities and signing capabilities */
>> > req->NegotiateContextCount = cpu_to_le16(neg_context_count);
>> >
>> > diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h
>> > index e482c86ceb00d..1ad7b57ce2952 100644
>> > --- a/fs/smb/common/smb2pdu.h
>> > +++ b/fs/smb/common/smb2pdu.h
>> > @@ -457,6 +457,7 @@ struct smb2_tree_disconnect_rsp {
>> > #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6)
>> > #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7)
>> > #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8)
>> > +#define SMB2_IMPLEMENTATION_ID_CONTEXT_ID cpu_to_le16(0xF100)
>> > #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100)
>> >
>> > struct smb2_neg_context {
>> > @@ -596,6 +597,37 @@ struct smb2_signing_capabilities {
>> > /* Followed by padding to 8 byte boundary (required by some servers) */
>> > } __packed;
>> >
>> > +/*
>> > + * For implementation ID context see MS-SMB2 2.2.3.1.8
>> > + * Maximum string lengths per specification
>> > + */
>> > +#define SMB2_IMPL_ID_MAX_DOMAIN_LEN 128
>> > +#define SMB2_IMPL_ID_MAX_NAME_LEN 260
>> > +#define SMB2_IMPL_ID_MAX_VERSION_LEN 260
>> > +#define SMB2_IMPL_ID_MAX_HOSTNAME_LEN 64
>> > +#define SMB2_IMPL_ID_MAX_OS_NAME_LEN 64
>> > +#define SMB2_IMPL_ID_MAX_OS_VERSION_LEN 64
>> > +#define SMB2_IMPL_ID_MAX_ARCH_LEN 64
>> > +
>> > +struct smb2_implementation_id_context {
>> > + __le16 ContextType; /* 9 */
>> > + __le16 DataLength;
>> > + __le32 Reserved;
>> > + __le16 ImplDomainLength;
>> > + __le16 ImplNameLength;
>> > + __le16 ImplVersionLength;
>> > + __le16 HostNameLength;
>> > + __le16 OSNameLength;
>> > + __le16 OSVersionLength;
>> > + __le16 ArchLength;
>> > + __le16 Reserved2;
>> > + /* Followed by variable length UTF-16 strings:
>> > + * ImplDomain, ImplName, ImplVersion, HostName,
>> > + * OSName, OSVersion, Arch
>> > + */
>> > + __u8 Data[];
>> > +} __packed;
>> > +
>> > #define POSIX_CTXT_DATA_LEN 16
>> > struct smb2_posix_neg_context {
>> > __le16 ContextType; /* 0x100 */
>>
>
>
>--
>Regards,
>Shyam
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-09 17:35 ` Ralph Boehme
@ 2026-03-11 23:50 ` Shyam Prasad N
0 siblings, 0 replies; 15+ messages in thread
From: Shyam Prasad N @ 2026-03-11 23:50 UTC (permalink / raw)
To: Ralph Boehme
Cc: linux-cifs, smfrench, pc, bharathsm, dhowells, Shyam Prasad N
On Mon, Mar 9, 2026 at 11:05 PM Ralph Boehme <slow@samba.org> wrote:
>
> Hi Shyam,
>
> On 3/9/26 5:37 PM, Shyam Prasad N wrote:
> > This can be useful for servers like Azure SMB servers, where it is not
> > easy to explain client side behaviour without knowing what exact
> > version of the code is running on the client.
> so it is planned that MS is going to implement this in their servers?
>
> I was kind of assuming this which made me wonder why is this made an
> community extension instead of a protocol feature will full MS backing
> including inclusion in MS-SMB2.
>
> Thanks!
> -slow
>
Hi Ralph,
We are working with the responsible team to get it into MS-SMB2.
However, we also wanted to get an early POC and review comments on the
proposed draft and the client changes.
--
Regards,
Shyam
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-09 17:59 ` Enzo Matsumiya
@ 2026-03-11 23:52 ` Shyam Prasad N
2026-03-12 0:00 ` Steve French
0 siblings, 1 reply; 15+ messages in thread
From: Shyam Prasad N @ 2026-03-11 23:52 UTC (permalink / raw)
To: Enzo Matsumiya
Cc: Ralph Boehme, linux-cifs, smfrench, pc, bharathsm, dhowells,
Shyam Prasad N
On Mon, Mar 9, 2026 at 11:29 PM Enzo Matsumiya <ematsumiya@suse.de> wrote:
>
> On 03/09, Shyam Prasad N wrote:
> >On Mon, Mar 9, 2026 at 9:49 PM Ralph Boehme <slow@samba.org> wrote:
> >>
> >> Hi!
> >>
> >> I wonder which servers are expected to be implementing this? I suppose
> >> this protocol extension is not proposed without a server vendor
> >> interested in actually implementing it, otherwise the whole metrics
> >> story doesn't make sense.
> >
> >Hi Ralph,
> >
> >This is supposed to give the server an idea of what version of cifs.ko
> >the client is actually running.
>
> I agree with others on this point -- cifs.ko version is useless to match
> to a particular behaviour or pinpoint a specific bug.
Acked. Can you suggest an alternative field that will make the matching easier?
>
> >This can be useful for servers like Azure SMB servers, where it is not
> >easy to explain client side behaviour without knowing what exact
> >version of the code is running on the client.
>
> If the proposal is going to be bidirectional, it would be much better,
> for cifs.ko, to have servers sending such information to clients
> instead; even when there's a problem on the server, it'll usually
> reflect on the client (crashes, misbehaviour, etc).
>
> Also useful for cases where customers don't have direct/easy access to
> their SMB infrastructure (e.g. external/3rd party hosting, or 1000s of
> servers mixed with DFS and/or clusters).
Good point. Let me rework the draft on this.
>
>
> Cheers,
>
> Enzo
>
> >> *scratches head*
> >>
> >> Thanks!
> >> -slow
> >>
> >> On 3/4/26 1:27 PM, nspmangalore@gmail.com wrote:
> >> > From: Shyam Prasad N <sprasad@microsoft.com>
> >> >
> >> > MS-SMB2 does not allow any fields for the client to communicate
> >> > the client version details to the server. This change is a
> >> > proof-of-concept to add client details in a new negotiate context.
> >> >
> >> > Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
> >> > ---
> >> > fs/smb/client/smb2pdu.c | 78 +++++++++++++++++++++++++++++++++++++++++
> >> > fs/smb/common/smb2pdu.h | 32 +++++++++++++++++
> >> > 2 files changed, 110 insertions(+)
> >> >
> >> > diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c
> >> > index ef655acf673df..9c89f6b4a6709 100644
> >> > --- a/fs/smb/client/smb2pdu.c
> >> > +++ b/fs/smb/client/smb2pdu.c
> >> > @@ -24,6 +24,7 @@
> >> > #include <linux/pagemap.h>
> >> > #include <linux/xattr.h>
> >> > #include <linux/netfs.h>
> >> > +#include <linux/utsname.h>
> >> > #include <trace/events/netfs.h>
> >> > #include "cifsglob.h"
> >> > #include "cifsproto.h"
> >> > @@ -45,6 +46,7 @@
> >> > #include "cached_dir.h"
> >> > #include "compress.h"
> >> > #include "fs_context.h"
> >> > +#include "cifsfs.h"
> >> >
> >> > /*
> >> > * The following table defines the expected "StructureSize" of SMB2 requests
> >> > @@ -724,6 +726,75 @@ build_posix_ctxt(struct smb2_posix_neg_context *pneg_ctxt)
> >> > pneg_ctxt->Name[15] = 0x7C;
> >> > }
> >> >
> >> > +static unsigned int
> >> > +build_implementation_id_ctxt(struct smb2_implementation_id_context *pneg_ctxt)
> >> > +{
> >> > + struct nls_table *cp = load_nls_default();
> >> > + struct new_utsname *uts = utsname();
> >> > + const char *impl_domain = "kernel.org";
> >> > + const char *impl_name = "fs/smb/client";
> >> > + const char *os_name = "Linux";
> >> > + unsigned int data_len = 0;
> >> > + __u8 *data_ptr;
> >> > + int len;
> >> > +
> >> > + pneg_ctxt->ContextType = SMB2_IMPLEMENTATION_ID_CONTEXT_ID;
> >> > + data_ptr = pneg_ctxt->Data;
> >> > +
> >> > + /* ImplDomain */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_domain,
> >> > + SMB2_IMPL_ID_MAX_DOMAIN_LEN, cp);
> >> > + pneg_ctxt->ImplDomainLength = cpu_to_le16(len * 2);
> >> > + data_ptr += len * 2;
> >> > + data_len += len * 2;
> >> > +
> >> > + /* ImplName */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, impl_name,
> >> > + SMB2_IMPL_ID_MAX_NAME_LEN, cp);
> >> > + pneg_ctxt->ImplNameLength = cpu_to_le16(len * 2);
> >> > + data_ptr += len * 2;
> >> > + data_len += len * 2;
> >> > +
> >> > + /* ImplVersion - CIFS_VERSION from cifsfs.h */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, CIFS_VERSION,
> >> > + SMB2_IMPL_ID_MAX_VERSION_LEN, cp);
> >> > + pneg_ctxt->ImplVersionLength = cpu_to_le16(len * 2);
> >> > + data_ptr += len * 2;
> >> > + data_len += len * 2;
> >> > +
> >> > + /* HostName - from utsname()->nodename */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->nodename,
> >> > + SMB2_IMPL_ID_MAX_HOSTNAME_LEN, cp);
> >> > + pneg_ctxt->HostNameLength = cpu_to_le16(len * 2);
> >> > + data_ptr += len * 2;
> >> > + data_len += len * 2;
> >> > +
> >> > + /* OSName */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, os_name,
> >> > + SMB2_IMPL_ID_MAX_OS_NAME_LEN, cp);
> >> > + pneg_ctxt->OSNameLength = cpu_to_le16(len * 2);
> >> > + data_ptr += len * 2;
> >> > + data_len += len * 2;
> >> > +
> >> > + /* OSVersion - from utsname()->release */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->release,
> >> > + SMB2_IMPL_ID_MAX_OS_VERSION_LEN, cp);
> >> > + pneg_ctxt->OSVersionLength = cpu_to_le16(len * 2);
> >> > + data_ptr += len * 2;
> >> > + data_len += len * 2;
> >> > +
> >> > + /* Arch - from utsname()->machine */
> >> > + len = cifs_strtoUTF16((__le16 *)data_ptr, uts->machine,
> >> > + SMB2_IMPL_ID_MAX_ARCH_LEN, cp);
> >> > + pneg_ctxt->ArchLength = cpu_to_le16(len * 2);
> >> > + data_len += len * 2;
> >> > +
> >> > + pneg_ctxt->Reserved2 = 0;
> >> > + pneg_ctxt->DataLength = cpu_to_le16(data_len + 14); /* 14 = 7 length fields * 2 bytes */
> >> > + /* Context size is DataLength + minimal smb2_neg_context, aligned to 8 */
> >> > + return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8);
> >> > +}
> >> > +
> >> > static void
> >> > assemble_neg_contexts(struct smb2_negotiate_req *req,
> >> > struct TCP_Server_Info *server, unsigned int *total_len)
> >> > @@ -797,6 +868,13 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
> >> > neg_context_count++;
> >> > }
> >> >
> >> > + /* Add implementation ID context */
> >> > + ctxt_len = build_implementation_id_ctxt((struct smb2_implementation_id_context *)
> >> > + pneg_ctxt);
> >> > + *total_len += ctxt_len;
> >> > + pneg_ctxt += ctxt_len;
> >> > + neg_context_count++;
> >> > +
> >> > /* check for and add transport_capabilities and signing capabilities */
> >> > req->NegotiateContextCount = cpu_to_le16(neg_context_count);
> >> >
> >> > diff --git a/fs/smb/common/smb2pdu.h b/fs/smb/common/smb2pdu.h
> >> > index e482c86ceb00d..1ad7b57ce2952 100644
> >> > --- a/fs/smb/common/smb2pdu.h
> >> > +++ b/fs/smb/common/smb2pdu.h
> >> > @@ -457,6 +457,7 @@ struct smb2_tree_disconnect_rsp {
> >> > #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6)
> >> > #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7)
> >> > #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8)
> >> > +#define SMB2_IMPLEMENTATION_ID_CONTEXT_ID cpu_to_le16(0xF100)
> >> > #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100)
> >> >
> >> > struct smb2_neg_context {
> >> > @@ -596,6 +597,37 @@ struct smb2_signing_capabilities {
> >> > /* Followed by padding to 8 byte boundary (required by some servers) */
> >> > } __packed;
> >> >
> >> > +/*
> >> > + * For implementation ID context see MS-SMB2 2.2.3.1.8
> >> > + * Maximum string lengths per specification
> >> > + */
> >> > +#define SMB2_IMPL_ID_MAX_DOMAIN_LEN 128
> >> > +#define SMB2_IMPL_ID_MAX_NAME_LEN 260
> >> > +#define SMB2_IMPL_ID_MAX_VERSION_LEN 260
> >> > +#define SMB2_IMPL_ID_MAX_HOSTNAME_LEN 64
> >> > +#define SMB2_IMPL_ID_MAX_OS_NAME_LEN 64
> >> > +#define SMB2_IMPL_ID_MAX_OS_VERSION_LEN 64
> >> > +#define SMB2_IMPL_ID_MAX_ARCH_LEN 64
> >> > +
> >> > +struct smb2_implementation_id_context {
> >> > + __le16 ContextType; /* 9 */
> >> > + __le16 DataLength;
> >> > + __le32 Reserved;
> >> > + __le16 ImplDomainLength;
> >> > + __le16 ImplNameLength;
> >> > + __le16 ImplVersionLength;
> >> > + __le16 HostNameLength;
> >> > + __le16 OSNameLength;
> >> > + __le16 OSVersionLength;
> >> > + __le16 ArchLength;
> >> > + __le16 Reserved2;
> >> > + /* Followed by variable length UTF-16 strings:
> >> > + * ImplDomain, ImplName, ImplVersion, HostName,
> >> > + * OSName, OSVersion, Arch
> >> > + */
> >> > + __u8 Data[];
> >> > +} __packed;
> >> > +
> >> > #define POSIX_CTXT_DATA_LEN 16
> >> > struct smb2_posix_neg_context {
> >> > __le16 ContextType; /* 0x100 */
> >>
> >
> >
> >--
> >Regards,
> >Shyam
> >
--
Regards,
Shyam
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] cifs: implementation id context as negotiate context
2026-03-11 23:52 ` Shyam Prasad N
@ 2026-03-12 0:00 ` Steve French
0 siblings, 0 replies; 15+ messages in thread
From: Steve French @ 2026-03-12 0:00 UTC (permalink / raw)
To: Shyam Prasad N
Cc: Enzo Matsumiya, Ralph Boehme, linux-cifs, pc, bharathsm, dhowells,
Shyam Prasad N
On Wed, Mar 11, 2026 at 6:52 PM Shyam Prasad N <nspmangalore@gmail.com> wrote:
>
> On Mon, Mar 9, 2026 at 11:29 PM Enzo Matsumiya <ematsumiya@suse.de> wrote:
> >
> > On 03/09, Shyam Prasad N wrote:
> > >On Mon, Mar 9, 2026 at 9:49 PM Ralph Boehme <slow@samba.org> wrote:
> > >>
> > >> Hi!
> > >>
> > >> I wonder which servers are expected to be implementing this? I suppose
> > >> this protocol extension is not proposed without a server vendor
> > >> interested in actually implementing it, otherwise the whole metrics
> > >> story doesn't make sense.
> > >
> > >Hi Ralph,
> > >
> > >This is supposed to give the server an idea of what version of cifs.ko
> > >the client is actually running.
> >
> > I agree with others on this point -- cifs.ko version is useless to match
> > to a particular behaviour or pinpoint a specific bug.
>
> Acked. Can you suggest an alternative field that will make the matching easier?
Kernel version is useful (major/minor #) but I don't see a problem
with using cifs.ko version as well as we do today since we had a few
cases where it could be updated for 'full backports' but in any case
either of these will help narrow client down a lot.
--
Thanks,
Steve
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-03-12 0:00 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-04 12:27 [PATCH] cifs: implementation id context as negotiate context nspmangalore
2026-03-04 12:34 ` Shyam Prasad N
2026-03-06 22:45 ` Henrique Carvalho
2026-03-06 23:04 ` Steve French
2026-03-06 23:19 ` Paulo Alcantara
2026-03-06 23:23 ` Steve French
2026-03-09 16:34 ` Shyam Prasad N
2026-03-06 23:30 ` Henrique Carvalho
2026-03-09 16:19 ` Ralph Boehme
2026-03-09 16:37 ` Shyam Prasad N
2026-03-09 17:35 ` Ralph Boehme
2026-03-11 23:50 ` Shyam Prasad N
2026-03-09 17:59 ` Enzo Matsumiya
2026-03-11 23:52 ` Shyam Prasad N
2026-03-12 0:00 ` Steve French
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox