diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2017-10-12 22:07:38 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-12-05 10:58:28 +0100 |
commit | 4e26661e67c4bde6f2a5314fb4130844a32b9f54 (patch) | |
tree | adb463666c5c63535f7ca68029c80096c3859b51 /src/mm-base-manager.c | |
parent | d04f98d9666c8c0031f16c05b31614ea7c179e42 (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.c | 31 |
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); |