Skip to content

Commit 5e4a4b8

Browse files
committed
ksmbd: extend the existing connection limiting mechanism to support IPv6
Update the connection tracking logic to handle both IPv4 and IPv6 address families. Cc: [email protected] Fixes: e6bb91939740 ("ksmbd: limit repeated connections from clients with the same IP") Signed-off-by: Namjae Jeon <[email protected]>
1 parent ffdd1a1 commit 5e4a4b8

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

connection.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ struct ksmbd_conn {
4646
struct mutex srv_mutex;
4747
int status;
4848
unsigned int cli_cap;
49-
__be32 inet_addr;
49+
union {
50+
__be32 inet_addr;
51+
u8 inet6_addr[16];
52+
};
5053
char *request_buf;
5154
struct ksmbd_transport *transport;
5255
struct nls_table *local_nls;

transport_tcp.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,10 @@ static struct tcp_transport *alloc_transport(struct socket *client_sk)
115115
return NULL;
116116
}
117117

118-
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
118+
if (client_sk->sk->sk_family == AF_INET6)
119+
memcpy(&conn->inet6_addr, &client_sk->sk->sk_v6_daddr, 16);
120+
else
121+
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
119122
conn->transport = KSMBD_TRANS(t);
120123
KSMBD_TRANS(t)->conn = conn;
121124
KSMBD_TRANS(t)->ops = &ksmbd_tcp_transport_ops;
@@ -259,7 +262,6 @@ static int ksmbd_kthread_fn(void *p)
259262
{
260263
struct socket *client_sk = NULL;
261264
struct interface *iface = (struct interface *)p;
262-
struct inet_sock *csk_inet;
263265
struct ksmbd_conn *conn;
264266
int ret;
265267

@@ -282,10 +284,16 @@ static int ksmbd_kthread_fn(void *p)
282284
/*
283285
* Limits repeated connections from clients with the same IP.
284286
*/
285-
csk_inet = inet_sk(client_sk->sk);
286287
down_read(&conn_list_lock);
287288
list_for_each_entry(conn, &conn_list, conns_list)
288-
if (csk_inet->inet_daddr == conn->inet_addr) {
289+
if (client_sk->sk->sk_family == AF_INET6) {
290+
if (memcmp(&client_sk->sk->sk_v6_daddr,
291+
&conn->inet6_addr, 16) == 0) {
292+
ret = -EAGAIN;
293+
break;
294+
}
295+
} else if (inet_sk(client_sk->sk)->inet_daddr ==
296+
conn->inet_addr) {
289297
ret = -EAGAIN;
290298
break;
291299
}

0 commit comments

Comments
 (0)