Skip to content

Commit 0d0d468

Browse files
namjaejeonSteve French
authored andcommitted
ksmbd: add max connections parameter
Add max connections parameter to limit number of maximum simultaneous connections. Fixes: 0626e66 ("cifsd: add server handler for central processing and tranport layers") Cc: [email protected] Reviewed-by: Sergey Senozhatsky <[email protected]> Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 5dc4c99 commit 0d0d468

File tree

4 files changed

+22
-2
lines changed

4 files changed

+22
-2
lines changed

fs/ksmbd/ksmbd_netlink.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ struct ksmbd_startup_request {
106106
__u32 sub_auth[3]; /* Subauth value for Security ID */
107107
__u32 smb2_max_credits; /* MAX credits */
108108
__u32 smbd_max_io_size; /* smbd read write size */
109-
__u32 reserved[127]; /* Reserved room */
109+
__u32 max_connections; /* Number of maximum simultaneous connections */
110+
__u32 reserved[126]; /* Reserved room */
110111
__u32 ifc_list_sz; /* interfaces list size */
111112
__s8 ____payload[];
112113
};

fs/ksmbd/server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct ksmbd_server_config {
4141
unsigned int share_fake_fscaps;
4242
struct smb_sid domain_sid;
4343
unsigned int auth_mechs;
44+
unsigned int max_connections;
4445

4546
char *conf[SERVER_CONF_WORK_GROUP + 1];
4647
};

fs/ksmbd/transport_ipc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,9 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
308308
if (req->smbd_max_io_size)
309309
init_smbd_max_io_size(req->smbd_max_io_size);
310310

311+
if (req->max_connections)
312+
server_conf.max_connections = req->max_connections;
313+
311314
ret = ksmbd_set_netbios_name(req->netbios_name);
312315
ret |= ksmbd_set_server_string(req->server_string);
313316
ret |= ksmbd_set_work_group(req->work_group);

fs/ksmbd/transport_tcp.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#define IFACE_STATE_DOWN BIT(0)
1616
#define IFACE_STATE_CONFIGURED BIT(1)
1717

18+
static atomic_t active_num_conn;
19+
1820
struct interface {
1921
struct task_struct *ksmbd_kthread;
2022
struct socket *ksmbd_socket;
@@ -185,8 +187,10 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)
185187
struct tcp_transport *t;
186188

187189
t = alloc_transport(client_sk);
188-
if (!t)
190+
if (!t) {
191+
sock_release(client_sk);
189192
return -ENOMEM;
193+
}
190194

191195
csin = KSMBD_TCP_PEER_SOCKADDR(KSMBD_TRANS(t)->conn);
192196
if (kernel_getpeername(client_sk, csin) < 0) {
@@ -239,6 +243,15 @@ static int ksmbd_kthread_fn(void *p)
239243
continue;
240244
}
241245

246+
if (server_conf.max_connections &&
247+
atomic_inc_return(&active_num_conn) >= server_conf.max_connections) {
248+
pr_info_ratelimited("Limit the maximum number of connections(%u)\n",
249+
atomic_read(&active_num_conn));
250+
atomic_dec(&active_num_conn);
251+
sock_release(client_sk);
252+
continue;
253+
}
254+
242255
ksmbd_debug(CONN, "connect success: accepted new connection\n");
243256
client_sk->sk->sk_rcvtimeo = KSMBD_TCP_RECV_TIMEOUT;
244257
client_sk->sk->sk_sndtimeo = KSMBD_TCP_SEND_TIMEOUT;
@@ -368,6 +381,8 @@ static int ksmbd_tcp_writev(struct ksmbd_transport *t, struct kvec *iov,
368381
static void ksmbd_tcp_disconnect(struct ksmbd_transport *t)
369382
{
370383
free_transport(TCP_TRANS(t));
384+
if (server_conf.max_connections)
385+
atomic_dec(&active_num_conn);
371386
}
372387

373388
static void tcp_destroy_socket(struct socket *ksmbd_socket)

0 commit comments

Comments
 (0)