diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2017-10-13 10:50:49 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-12-05 10:58:29 +0100 |
commit | 7bfd5270ef846582d97314f3e9e550129317d631 (patch) | |
tree | 15f2d60885b52b4aafbc6320f671a539fa7c1385 | |
parent | f270a09cb2df37c134e567049a5fe09c73d7fd3c (diff) |
filter: let the user tag modems explicitly
The user can tag modems (either full devices or ports independently)
to be explicitly probed by ModemManager, using the new
"ID_MM_DEVICE_PROCESS" udev tag, e.g.:
$ sudo vim /lib/udev/rules.d/78-mm-whitelist-internal-modem.rules
ACTION!="add|change|move", GOTO="mm_whitelist_internal_modem_end"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{ID_MM_DEVICE_PROCESS}="1"
LABEL="mm_whitelist_internal_modem_end"
$ sudo udevadm control --reload
$ sudo udevadm trigger
This rule runs before any other filter rule.
This tag may be used e.g. by manufacturers building systems with
built-in modems that will always be available.
Distributions targeting support for multiple modem devices shouldn't
use this udev tag.
-rw-r--r-- | src/mm-filter.c | 11 | ||||
-rw-r--r-- | src/mm-filter.h | 18 |
2 files changed, 21 insertions, 8 deletions
diff --git a/src/mm-filter.c b/src/mm-filter.c index ee82c1dc..cdf60c5f 100644 --- a/src/mm-filter.c +++ b/src/mm-filter.c @@ -45,6 +45,16 @@ mm_filter_port (MMFilter *self, subsystem = mm_kernel_device_get_subsystem (port); name = mm_kernel_device_get_name (port); + /* If the device is explicitly whitelisted, we process every port. Also + * allow specifying this flag per-port instead of for the full device, e.g. + * for platform tty ports where there's only one port anyway. */ + if ((self->priv->enabled_rules & MM_FILTER_RULE_EXPLICIT_WHITELIST) && + (mm_kernel_device_get_global_property_as_boolean (port, "ID_MM_DEVICE_PROCESS") || + mm_kernel_device_get_property_as_boolean (port, "ID_MM_DEVICE_PROCESS"))) { + mm_dbg ("[filter] (%s/%s) port allowed: device is whitelisted", subsystem, name); + return TRUE; + } + /* If this is a virtual device, don't allow it */ if ((self->priv->enabled_rules & MM_FILTER_RULE_VIRTUAL) && (!mm_kernel_device_get_physdev_sysfs_path (port))) { @@ -156,6 +166,7 @@ mm_filter_new (MMFilterRule enabled_rules) #define RULE_ENABLED_STR(flag) ((self->priv->enabled_rules & flag) ? "yes" : "no") mm_dbg ("[filter] created"); + mm_dbg ("[filter] explicit whitelist: %s", RULE_ENABLED_STR (MM_FILTER_RULE_EXPLICIT_WHITELIST)); mm_dbg ("[filter] virtual devices forbidden: %s", RULE_ENABLED_STR (MM_FILTER_RULE_VIRTUAL)); mm_dbg ("[filter] net devices allowed: %s", RULE_ENABLED_STR (MM_FILTER_RULE_NET)); mm_dbg ("[filter] cdc-wdm devices allowed: %s", RULE_ENABLED_STR (MM_FILTER_RULE_CDC_WDM)); diff --git a/src/mm-filter.h b/src/mm-filter.h index bde394c6..0de3fa68 100644 --- a/src/mm-filter.h +++ b/src/mm-filter.h @@ -45,17 +45,19 @@ GType mm_filter_get_type (void); typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_NONE = 0, - MM_FILTER_RULE_VIRTUAL = 1 << 0, - MM_FILTER_RULE_NET = 1 << 1, - MM_FILTER_RULE_CDC_WDM = 1 << 2, - MM_FILTER_RULE_TTY = 1 << 3, - MM_FILTER_RULE_TTY_BLACKLIST = 1 << 4, - MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY = 1 << 5, - MM_FILTER_RULE_TTY_PLATFORM_DRIVER = 1 << 6, + MM_FILTER_RULE_EXPLICIT_WHITELIST = 1 << 0, + MM_FILTER_RULE_VIRTUAL = 1 << 1, + MM_FILTER_RULE_NET = 1 << 2, + MM_FILTER_RULE_CDC_WDM = 1 << 3, + MM_FILTER_RULE_TTY = 1 << 4, + MM_FILTER_RULE_TTY_BLACKLIST = 1 << 5, + MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY = 1 << 6, + MM_FILTER_RULE_TTY_PLATFORM_DRIVER = 1 << 7, } MMFilterRule; #define MM_FILTER_RULE_ALL \ - (MM_FILTER_RULE_VIRTUAL | \ + (MM_FILTER_RULE_EXPLICIT_WHITELIST | \ + MM_FILTER_RULE_VIRTUAL | \ MM_FILTER_RULE_NET | \ MM_FILTER_RULE_CDC_WDM | \ MM_FILTER_RULE_TTY | \ |