Add max connections parameter to limit number of maximum simultaneous connections. Signed-off-by: Namjae Jeon <linkinjeon@xxxxxxxxxx> --- v2: - set default value as 512 and max 65536 value. include/linux/ksmbd_server.h | 3 ++- include/tools.h | 2 ++ ksmbd.conf.5.in | 5 ++--- ksmbd.conf.example | 3 ++- mountd/ipc.c | 1 + tools/config_parser.c | 11 +++++++++++ tools/management/share.c | 6 ++++++ 7 files changed, 26 insertions(+), 5 deletions(-) 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..ca20044 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; @@ -83,6 +84,7 @@ extern struct smbconf_global global_conf; #define KSMBD_CONF_DEFAULT_TCP_PORT 445 #define KSMBD_CONF_FILE_MAX 10000 +#define KSMBD_CONF_MAX_CONNECTIONS 65536 #define PATH_PWDDB SYSCONFDIR "/ksmbd/ksmbdpwd.db" #define PATH_SMBCONF SYSCONFDIR "/ksmbd/ksmbd.conf" diff --git a/ksmbd.conf.5.in b/ksmbd.conf.5.in index a1dfb4a..3376af6 100644 --- a/ksmbd.conf.5.in +++ b/ksmbd.conf.5.in @@ -172,11 +172,10 @@ 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. -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..5f73c19 100644 --- a/tools/config_parser.c +++ b/tools/config_parser.c @@ -548,6 +548,16 @@ 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 > 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 +566,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 = 512; } static void global_conf_create(void) diff --git a/tools/management/share.c b/tools/management/share.c index 295b1b6..0655427 100644 --- a/tools/management/share.c +++ b/tools/management/share.c @@ -585,6 +585,11 @@ 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 > 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 +648,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 = 512; share->force_uid = KSMBD_SHARE_INVALID_UID; share->force_gid = KSMBD_SHARE_INVALID_GID; -- 2.25.1