aboutsummaryrefslogtreecommitdiff
path: root/src/mm-base-manager.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-10-12 22:07:38 +0200
committerAleksander Morgado <aleksander@aleksander.es>2017-12-05 10:58:28 +0100
commit4e26661e67c4bde6f2a5314fb4130844a32b9f54 (patch)
treeadb463666c5c63535f7ca68029c80096c3859b51 /src/mm-base-manager.c
parentd04f98d9666c8c0031f16c05b31614ea7c179e42 (diff)
filter: new object to run the port/device filter logic
This new object allows configuring the filter rules applied to the device ports. By default, for now, it implements the same rules as the MMKernelDevice is_candidate() method, which is obsoleted.
Diffstat (limited to 'src/mm-base-manager.c')
-rw-r--r--src/mm-base-manager.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c
index 016c1ee2..04369092 100644
--- a/src/mm-base-manager.c
+++ b/src/mm-base-manager.c
@@ -39,6 +39,7 @@
#include "mm-plugin-manager.h"
#include "mm-auth.h"
#include "mm-plugin.h"
+#include "mm-filter.h"
#include "mm-log.h"
static void initable_iface_init (GInitableIface *iface);
@@ -73,6 +74,8 @@ struct _MMBaseManagerPrivate {
GCancellable *authp_cancellable;
/* The Plugin Manager object */
MMPluginManager *plugin_manager;
+ /* The port/device filter */
+ MMFilter *filter;
/* The container of devices being prepared */
GHashTable *devices;
/* The Object Manager server */
@@ -286,7 +289,16 @@ device_added (MMBaseManager *manager,
mm_kernel_device_get_name (port),
mm_kernel_device_get_sysfs_path (port));
- if (!mm_kernel_device_is_candidate (port, manual_scan)) {
+ /* Ignore devices that aren't completely configured by udev yet. If
+ * ModemManager is started in parallel with udev, explicitly requesting
+ * devices may return devices for which not all udev rules have yet been
+ * applied (a bug in udev/gudev). Since we often need those rules to match
+ * the device to a specific ModemManager driver, we need to ensure that all
+ * rules have been processed before handling a device.
+ *
+ * This udev tag applies to each port in a device. In other words, the flag
+ * may be set in some ports, but not in others */
+ if (!mm_kernel_device_get_property_as_boolean (port, "ID_MM_CANDIDATE")) {
/* This could mean that device changed, losing its ID_MM_CANDIDATE
* flags (such as Bluetooth RFCOMM devices upon disconnect.
* Try to forget it. */
@@ -297,6 +309,10 @@ device_added (MMBaseManager *manager,
return;
}
+ /* Run port filter */
+ if (!mm_filter_port (manager->priv->filter, port, manual_scan))
+ return;
+
/* If already added, ignore new event */
if (find_device_by_port (manager, port)) {
mm_dbg ("(%s/%s): port already added",
@@ -1110,6 +1126,16 @@ initable_init (GInitable *initable,
g_signal_connect (priv->udev, "uevent", G_CALLBACK (handle_uevent), initable);
#endif
+ /* Create filter */
+ priv->filter = mm_filter_new (MM_FILTER_RULE_VIRTUAL |
+ MM_FILTER_RULE_NET |
+ MM_FILTER_RULE_CDC_WDM |
+ MM_FILTER_RULE_TTY |
+ MM_FILTER_RULE_TTY_VIRTUAL_CONSOLE |
+ MM_FILTER_RULE_TTY_BLACKLIST |
+ MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY |
+ MM_FILTER_RULE_TTY_PLATFORM_DRIVER);
+
/* Create plugin manager */
priv->plugin_manager = mm_plugin_manager_new (priv->plugin_dir, error);
if (!priv->plugin_manager)
@@ -1159,6 +1185,9 @@ finalize (GObject *object)
g_object_unref (priv->udev);
#endif
+ if (priv->filter)
+ g_object_unref (priv->filter);
+
if (priv->plugin_manager)
g_object_unref (priv->plugin_manager);