diff mbox series

[v3] ksmbd-tools: add max connections parameter to global section

Message ID 20221231082107.9997-1-linkinjeon@kernel.org
State New
Headers show
Series [v3] ksmbd-tools: add max connections parameter to global section | expand

Commit Message

Namjae Jeon Dec. 31, 2022, 8:21 a.m. UTC
Add max connections parameter to limit number of maximum simultaneous
connections. The default value is 512. And the maximum value is 64k.
Values greater than 64k or 0 will be silently set to 64k.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
---
 v2:
   - set default value as 512 and max 65536 value.
 v3:
   - add the macro for default value.
   - Set to allowable maximum value(64k) for "max connections = 0".

 include/linux/ksmbd_server.h |  3 ++-
 include/tools.h              |  4 ++++
 ksmbd.conf.5.in              |  6 +++---
 ksmbd.conf.example           |  3 ++-
 mountd/ipc.c                 |  1 +
 tools/config_parser.c        | 12 ++++++++++++
 tools/management/share.c     |  7 +++++++
 7 files changed, 31 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/include/linux/ksmbd_server.h b/include/linux/ksmbd_server.h
index 8ec004f..64099f2 100644
--- a/include/linux/ksmbd_server.h
+++ b/include/linux/ksmbd_server.h
@@ -49,7 +49,8 @@  struct ksmbd_startup_request {
 	__u32	sub_auth[3];
 	__u32	smb2_max_credits;
 	__u32	smbd_max_io_size;	/* smbd read write size */
-	__u32   reserved[127];		/* Reserved room */
+	__u32	max_connections;	/* Number of maximum simultaneous connections */
+	__u32   reserved[126];		/* Reserved room */
 	__u32	ifc_list_sz;
 	__s8	____payload[];
 };
diff --git a/include/tools.h b/include/tools.h
index f6f51f8..254606e 100644
--- a/include/tools.h
+++ b/include/tools.h
@@ -53,6 +53,7 @@  struct smbconf_global {
 	unsigned int		smb2_max_trans;
 	unsigned int		smb2_max_credits;
 	unsigned int		smbd_max_io_size;
+	unsigned int		max_connections;
 	unsigned int		share_fake_fscaps;
 	unsigned int		gen_subauth[3];
 	char			*krb5_keytab_file;
@@ -84,6 +85,9 @@  extern struct smbconf_global global_conf;
 
 #define KSMBD_CONF_FILE_MAX		10000
 
+#define KSMBD_CONF_DEFAULT_CONNECTIONS	512
+#define KSMBD_CONF_MAX_CONNECTIONS	65536
+
 #define PATH_PWDDB		SYSCONFDIR "/ksmbd/ksmbdpwd.db"
 #define PATH_SMBCONF		SYSCONFDIR "/ksmbd/ksmbd.conf"
 #define PATH_SMBCONF_FALLBACK	SYSCONFDIR "/ksmbd/smb.conf"
diff --git a/ksmbd.conf.5.in b/ksmbd.conf.5.in
index a1dfb4a..0e7fdc6 100644
--- a/ksmbd.conf.5.in
+++ b/ksmbd.conf.5.in
@@ -172,11 +172,11 @@  Maximum number of simultaneous sessions to all shares.
 
 Default: \fBmax active sessions = 1024\fR \" KSMBD_CONF_DEFAULT_SESS_CAP
 .TP
-\fBmax connections\fR (S)
+\fBmax connections\fR (G)
 Maximum number of simultaneous connections to the share.
-With \fBmax connections = 0\fR, any number of connections may be made.
+The maximum value is 64k. Values greater than 64k or 0 will be silently set to 64k.
 
-Default: \fBmax connections = 0\fR
+Default: \fBmax connections = 512\fR
 .TP
 \fBmax open files\fR (G)
 Maximum number of simultaneous open files for a client.
diff --git a/ksmbd.conf.example b/ksmbd.conf.example
index 6ce4ec7..4dd2a65 100644
--- a/ksmbd.conf.example
+++ b/ksmbd.conf.example
@@ -30,6 +30,7 @@ 
 	smbd max io size = 8MB
 	tcp port = 445
 	workgroup = WORKGROUP
+	max connections = 512
 
 	; share parameters for all sections
 	browseable = yes
@@ -44,7 +45,7 @@ 
 	hide dot files = yes
 	inherit owner = no
 	invalid users = 
-	max connections = 0
+	max connections = 512
 	oplocks = yes
 	path = 
 	read list = 
diff --git a/mountd/ipc.c b/mountd/ipc.c
index 9d4c1ca..382f5ed 100644
--- a/mountd/ipc.c
+++ b/mountd/ipc.c
@@ -175,6 +175,7 @@  static int ipc_ksmbd_starting_up(void)
 	ev->smb2_max_write = global_conf.smb2_max_write;
 	ev->smb2_max_trans = global_conf.smb2_max_trans;
 	ev->smbd_max_io_size = global_conf.smbd_max_io_size;
+	ev->max_connections = global_conf.max_connections;
 	ev->share_fake_fscaps = global_conf.share_fake_fscaps;
 	memcpy(ev->sub_auth, global_conf.gen_subauth, sizeof(ev->sub_auth));
 	ev->smb2_max_credits = global_conf.smb2_max_credits;
diff --git a/tools/config_parser.c b/tools/config_parser.c
index 2dc6b34..a675b51 100644
--- a/tools/config_parser.c
+++ b/tools/config_parser.c
@@ -548,6 +548,17 @@  static gboolean global_group_kv(gpointer _k, gpointer _v, gpointer user_data)
 		return TRUE;
 	}
 
+	if (!cp_key_cmp(_k, "max connections")) {
+		global_conf.max_connections = memparse(_v);
+		if (!global_conf.max_connections ||
+		    global_conf.max_connections > KSMBD_CONF_MAX_CONNECTIONS) {
+			pr_info("Limits exceeding the maximum simultaneous connections(%d)\n",
+				KSMBD_CONF_MAX_CONNECTIONS);
+			global_conf.max_connections = KSMBD_CONF_MAX_CONNECTIONS;
+		}
+		return TRUE;
+	}
+
 	/* At this point, this is an option that must be applied to all shares */
 	return FALSE;
 }
@@ -556,6 +567,7 @@  static void global_conf_default(void)
 {
 	/* The SPARSE_FILES file system capability flag is set by default */
 	global_conf.share_fake_fscaps = 64;
+	global_conf.max_connections = KSMBD_CONF_DEFAULT_CONNECTIONS;
 }
 
 static void global_conf_create(void)
diff --git a/tools/management/share.c b/tools/management/share.c
index 295b1b6..3af3f48 100644
--- a/tools/management/share.c
+++ b/tools/management/share.c
@@ -585,6 +585,12 @@  static void process_group_kv(gpointer _k, gpointer _v, gpointer user_data)
 
 	if (shm_share_config(k, KSMBD_SHARE_CONF_MAX_CONNECTIONS)) {
 		share->max_connections = cp_get_group_kv_long_base(v, 10);
+		if (!share->max_connections ||
+		    share->max_connections > KSMBD_CONF_MAX_CONNECTIONS) {
+			pr_info("Limits exceeding the maximum simultaneous connections(%d)\n",
+				KSMBD_CONF_MAX_CONNECTIONS);
+			share->max_connections = KSMBD_CONF_MAX_CONNECTIONS;
+		}
 		return;
 	}
 
@@ -643,6 +649,7 @@  static void init_share_from_group(struct ksmbd_share *share,
 	share->directory_mask = KSMBD_SHARE_DEFAULT_DIRECTORY_MASK;
 	share->force_create_mode = 0;
 	share->force_directory_mode = 0;
+	share->max_connections = KSMBD_CONF_DEFAULT_CONNECTIONS;
 
 	share->force_uid = KSMBD_SHARE_INVALID_UID;
 	share->force_gid = KSMBD_SHARE_INVALID_GID;