From b17dbd653d1528b6fb957e66f27c83ed2b0ca6e0 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Fri, 10 Jan 2025 10:21:16 +0900 Subject: [PATCH] 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 --- ksmbd_netlink.h | 3 ++- server.h | 1 + smb2pdu.c | 4 ++++ transport_ipc.c | 1 + transport_tcp.c | 34 ++++++++++++++++++++-------------- transport_tcp.h | 1 + 6 files changed, 29 insertions(+), 15 deletions(-) diff --git a/ksmbd_netlink.h b/ksmbd_netlink.h index 3d01d9d15..c81f0c566 100644 --- a/ksmbd_netlink.h +++ b/ksmbd_netlink.h @@ -111,7 +111,8 @@ struct ksmbd_startup_request { __u32 smb2_max_credits; /* MAX credits */ __u32 smbd_max_io_size; /* smbd read write size */ __u32 max_connections; /* Number of maximum simultaneous connections */ - __u32 reserved[126]; /* Reserved room */ + __s8 bind_interfaces_only; + __u32 reserved[503]; /* Reserved room */ __u32 ifc_list_sz; /* interfaces list size */ __s8 ____payload[]; }; diff --git a/server.h b/server.h index 94187628f..995555feb 100644 --- a/server.h +++ b/server.h @@ -46,6 +46,7 @@ struct ksmbd_server_config { char *conf[SERVER_CONF_WORK_GROUP + 1]; struct task_struct *dh_task; + bool bind_interfaces_only; }; extern struct ksmbd_server_config server_conf; diff --git a/smb2pdu.c b/smb2pdu.c index 191e03b55..bdfe7114c 100644 --- a/smb2pdu.c +++ b/smb2pdu.c @@ -44,6 +44,7 @@ #include "mgmt/user_session.h" #include "mgmt/ksmbd_ida.h" #include "ndr.h" +#include "transport_tcp.h" static void __wbuf(struct ksmbd_work *work, void **req, void **rsp) { @@ -8364,6 +8365,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, if (netdev->type == ARPHRD_LOOPBACK) continue; + if (ksmbd_find_netdev_name_iface_list(netdev->name) == false) + continue; + flags = dev_get_flags(netdev); if (!(flags & IFF_RUNNING)) continue; diff --git a/transport_ipc.c b/transport_ipc.c index 1ceb65ce9..78900c369 100644 --- a/transport_ipc.c +++ b/transport_ipc.c @@ -335,6 +335,7 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req) ret = ksmbd_set_netbios_name(req->netbios_name); ret |= ksmbd_set_server_string(req->server_string); ret |= ksmbd_set_work_group(req->work_group); + server_conf.bind_interfaces_only = req->bind_interfaces_only; ret |= ksmbd_tcp_set_interfaces(KSMBD_STARTUP_CONFIG_INTERFACES(req), req->ifc_list_sz); if (ret) { diff --git a/transport_tcp.c b/transport_tcp.c index 365b144e2..81d1c7ff6 100644 --- a/transport_tcp.c +++ b/transport_tcp.c @@ -544,32 +544,38 @@ static int create_socket(struct interface *iface) return ret; } +bool ksmbd_find_netdev_name_iface_list(char *netdev_name) +{ + struct interface *iface; + + list_for_each_entry(iface, &iface_list, entry) + if (!strcmp(iface->name, netdev_name)) + return true; + return false; +} + static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event, void *ptr) { struct net_device *netdev = netdev_notifier_info_to_dev(ptr); struct interface *iface; - int ret, found = 0; + int ret; + bool found = false; switch (event) { case NETDEV_UP: if (netdev->priv_flags & IFF_BRIDGE_PORT) return NOTIFY_OK; - list_for_each_entry(iface, &iface_list, entry) { - if (!strcmp(iface->name, netdev->name)) { - found = 1; - if (iface->state != IFACE_STATE_DOWN) - break; - ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n", - iface->name); - ret = create_socket(iface); - if (ret) - return NOTIFY_OK; - break; - } + found = ksmbd_find_netdev_name_iface_list(netdev->name); + if (found == true && iface->state == IFACE_STATE_DOWN) { + ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n", + iface->name); + ret = create_socket(iface); + if (ret) + return NOTIFY_OK; } - if (!found && bind_additional_ifaces) { + if (found == false && bind_additional_ifaces) { iface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP)); if (!iface) return NOTIFY_OK; diff --git a/transport_tcp.h b/transport_tcp.h index e338bebe3..4a36ba5cf 100644 --- a/transport_tcp.h +++ b/transport_tcp.h @@ -7,6 +7,7 @@ #define __KSMBD_TRANSPORT_TCP_H__ int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz); +bool ksmbd_find_netdev_name_iface_list(char *netdev_name); int ksmbd_tcp_init(void); void ksmbd_tcp_destroy(void);