Skip to content

Commit 88e6e7f

Browse files
committed
ksmbd: browse interfaces list on FSCTL_QUERY_INTERFACE_INFO IOCTL
ksmbd.mount will give each interfaces list and bind_interfaces_only flags to ksmbd server. Previously, the interfaces list was sent only when bind_interfaces_only was enabled. ksmbd server browse only interfaces list given from ksmbd.conf on FSCTL_QUERY_INTERFACE_INFO IOCTL. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
1 parent f52745f commit 88e6e7f

File tree

6 files changed

+41
-42
lines changed

6 files changed

+41
-42
lines changed

ksmbd_netlink.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ struct ksmbd_startup_request {
111111
__u32 smb2_max_credits; /* MAX credits */
112112
__u32 smbd_max_io_size; /* smbd read write size */
113113
__u32 max_connections; /* Number of maximum simultaneous connections */
114-
__u32 reserved[126]; /* Reserved room */
114+
__s8 bind_interfaces_only;
115+
__s8 reserved[503]; /* Reserved room */
115116
__u32 ifc_list_sz; /* interfaces list size */
116117
__s8 ____payload[];
117118
};

server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct ksmbd_server_config {
4646

4747
char *conf[SERVER_CONF_WORK_GROUP + 1];
4848
struct task_struct *dh_task;
49+
bool bind_interfaces_only;
4950
};
5051

5152
extern struct ksmbd_server_config server_conf;

smb2pdu.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "mgmt/user_session.h"
4545
#include "mgmt/ksmbd_ida.h"
4646
#include "ndr.h"
47+
#include "transport_tcp.h"
4748

4849
static void __wbuf(struct ksmbd_work *work, void **req, void **rsp)
4950
{
@@ -8364,6 +8365,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn,
83648365
if (netdev->type == ARPHRD_LOOPBACK)
83658366
continue;
83668367

8368+
if (!ksmbd_find_netdev_name_iface_list(netdev->name))
8369+
continue;
8370+
83678371
flags = dev_get_flags(netdev);
83688372
if (!(flags & IFF_RUNNING))
83698373
continue;

transport_ipc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
335335
ret = ksmbd_set_netbios_name(req->netbios_name);
336336
ret |= ksmbd_set_server_string(req->server_string);
337337
ret |= ksmbd_set_work_group(req->work_group);
338+
server_conf.bind_interfaces_only = req->bind_interfaces_only;
338339
ret |= ksmbd_tcp_set_interfaces(KSMBD_STARTUP_CONFIG_INTERFACES(req),
339340
req->ifc_list_sz);
340341
if (ret) {

transport_tcp.c

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -544,32 +544,37 @@ static int create_socket(struct interface *iface)
544544
return ret;
545545
}
546546

547+
struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name)
548+
{
549+
struct interface *iface;
550+
551+
list_for_each_entry(iface, &iface_list, entry)
552+
if (!strcmp(iface->name, netdev_name))
553+
return iface;
554+
return NULL;
555+
}
556+
547557
static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,
548558
void *ptr)
549559
{
550560
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
551561
struct interface *iface;
552-
int ret, found = 0;
562+
int ret;
553563

554564
switch (event) {
555565
case NETDEV_UP:
556566
if (netdev->priv_flags & IFF_BRIDGE_PORT)
557567
return NOTIFY_OK;
558568

559-
list_for_each_entry(iface, &iface_list, entry) {
560-
if (!strcmp(iface->name, netdev->name)) {
561-
found = 1;
562-
if (iface->state != IFACE_STATE_DOWN)
563-
break;
564-
ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
565-
iface->name);
566-
ret = create_socket(iface);
567-
if (ret)
568-
return NOTIFY_OK;
569-
break;
570-
}
569+
iface = ksmbd_find_netdev_name_iface_list(netdev->name);
570+
if (iface && iface->state == IFACE_STATE_DOWN) {
571+
ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
572+
iface->name);
573+
ret = create_socket(iface);
574+
if (ret)
575+
return NOTIFY_OK;
571576
}
572-
if (!found && bind_additional_ifaces) {
577+
if (!iface && bind_additional_ifaces) {
573578
iface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP));
574579
if (!iface)
575580
return NOTIFY_OK;
@@ -581,21 +586,19 @@ static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,
581586
}
582587
break;
583588
case NETDEV_DOWN:
584-
list_for_each_entry(iface, &iface_list, entry) {
585-
if (!strcmp(iface->name, netdev->name) &&
586-
iface->state == IFACE_STATE_CONFIGURED) {
587-
ksmbd_debug(CONN, "netdev-down event: netdev(%s) is going down\n",
588-
iface->name);
589-
tcp_stop_kthread(iface->ksmbd_kthread);
590-
iface->ksmbd_kthread = NULL;
591-
mutex_lock(&iface->sock_release_lock);
592-
tcp_destroy_socket(iface->ksmbd_socket);
593-
iface->ksmbd_socket = NULL;
594-
mutex_unlock(&iface->sock_release_lock);
595-
596-
iface->state = IFACE_STATE_DOWN;
597-
break;
598-
}
589+
iface = ksmbd_find_netdev_name_iface_list(netdev->name);
590+
if (iface && iface->state == IFACE_STATE_CONFIGURED) {
591+
ksmbd_debug(CONN, "netdev-down event: netdev(%s) is going down\n",
592+
iface->name);
593+
tcp_stop_kthread(iface->ksmbd_kthread);
594+
iface->ksmbd_kthread = NULL;
595+
mutex_lock(&iface->sock_release_lock);
596+
tcp_destroy_socket(iface->ksmbd_socket);
597+
iface->ksmbd_socket = NULL;
598+
mutex_unlock(&iface->sock_release_lock);
599+
600+
iface->state = IFACE_STATE_DOWN;
601+
break;
599602
}
600603
break;
601604
}
@@ -664,18 +667,6 @@ int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz)
664667
int sz = 0;
665668

666669
if (!ifc_list_sz) {
667-
struct net_device *netdev;
668-
669-
rtnl_lock();
670-
for_each_netdev(&init_net, netdev) {
671-
if (netdev->priv_flags & IFF_BRIDGE_PORT)
672-
continue;
673-
if (!alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP))) {
674-
rtnl_unlock();
675-
return -ENOMEM;
676-
}
677-
}
678-
rtnl_unlock();
679670
bind_additional_ifaces = 1;
680671
return 0;
681672
}

transport_tcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define __KSMBD_TRANSPORT_TCP_H__
88

99
int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz);
10+
struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name);
1011
int ksmbd_tcp_init(void);
1112
void ksmbd_tcp_destroy(void);
1213

0 commit comments

Comments
 (0)