Skip to content

Commit b17dbd6

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 b17dbd6

File tree

6 files changed

+29
-15
lines changed

6 files changed

+29
-15
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+
__u32 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) == false)
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: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -544,32 +544,38 @@ static int create_socket(struct interface *iface)
544544
return ret;
545545
}
546546

547+
bool 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 true;
554+
return false;
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;
563+
bool found = false;
553564

554565
switch (event) {
555566
case NETDEV_UP:
556567
if (netdev->priv_flags & IFF_BRIDGE_PORT)
557568
return NOTIFY_OK;
558569

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-
}
570+
found = ksmbd_find_netdev_name_iface_list(netdev->name);
571+
if (found == true && iface->state == IFACE_STATE_DOWN) {
572+
ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
573+
iface->name);
574+
ret = create_socket(iface);
575+
if (ret)
576+
return NOTIFY_OK;
571577
}
572-
if (!found && bind_additional_ifaces) {
578+
if (found == false && bind_additional_ifaces) {
573579
iface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP));
574580
if (!iface)
575581
return NOTIFY_OK;

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+
bool 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)