Skip to content

Commit c0d4111

Browse files
namjaejeonsmfrench
authored andcommitted
ksmbd: extend the connection limiting mechanism to support IPv6
Update the connection tracking logic to handle both IPv4 and IPv6 address families. Cc: [email protected] Fixes: e6bb919 ("ksmbd: limit repeated connections from clients with the same IP") Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent bac7b99 commit c0d4111

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

fs/smb/server/connection.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@ 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+
#if IS_ENABLED(CONFIG_IPV6)
52+
u8 inet6_addr[16];
53+
#endif
54+
};
5055
char *request_buf;
5156
struct ksmbd_transport *transport;
5257
struct nls_table *local_nls;

fs/smb/server/transport_tcp.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,14 @@ static struct tcp_transport *alloc_transport(struct socket *client_sk)
8585
return NULL;
8686
}
8787

88+
#if IS_ENABLED(CONFIG_IPV6)
89+
if (client_sk->sk->sk_family == AF_INET6)
90+
memcpy(&conn->inet6_addr, &client_sk->sk->sk_v6_daddr, 16);
91+
else
92+
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
93+
#else
8894
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
95+
#endif
8996
conn->transport = KSMBD_TRANS(t);
9097
KSMBD_TRANS(t)->conn = conn;
9198
KSMBD_TRANS(t)->ops = &ksmbd_tcp_transport_ops;
@@ -229,7 +236,6 @@ static int ksmbd_kthread_fn(void *p)
229236
{
230237
struct socket *client_sk = NULL;
231238
struct interface *iface = (struct interface *)p;
232-
struct inet_sock *csk_inet;
233239
struct ksmbd_conn *conn;
234240
int ret;
235241

@@ -252,13 +258,27 @@ static int ksmbd_kthread_fn(void *p)
252258
/*
253259
* Limits repeated connections from clients with the same IP.
254260
*/
255-
csk_inet = inet_sk(client_sk->sk);
256261
down_read(&conn_list_lock);
257262
list_for_each_entry(conn, &conn_list, conns_list)
258-
if (csk_inet->inet_daddr == conn->inet_addr) {
263+
#if IS_ENABLED(CONFIG_IPV6)
264+
if (client_sk->sk->sk_family == AF_INET6) {
265+
if (memcmp(&client_sk->sk->sk_v6_daddr,
266+
&conn->inet6_addr, 16) == 0) {
267+
ret = -EAGAIN;
268+
break;
269+
}
270+
} else if (inet_sk(client_sk->sk)->inet_daddr ==
271+
conn->inet_addr) {
272+
ret = -EAGAIN;
273+
break;
274+
}
275+
#else
276+
if (inet_sk(client_sk->sk)->inet_daddr ==
277+
conn->inet_addr) {
259278
ret = -EAGAIN;
260279
break;
261280
}
281+
#endif
262282
up_read(&conn_list_lock);
263283
if (ret == -EAGAIN)
264284
continue;

0 commit comments

Comments
 (0)