aboutsummaryrefslogtreecommitdiff
path: root/src/mm-plugin.c
AgeCommit message (Collapse)Author
2025-04-25api,modem: new 'IgnoredPorts' propertyLukas Voegl
Expose a new list of 'IgnoredPorts' via D-Bus and therefore remove the use of `MM_MODEM_PORT_TYPE_IGNORED` Signed-off-by: Lukas Voegl <lvoegl@tdt.de>
2025-03-11treewide: Fix typosGuido Günther
Signed-off-by: Guido Günther <agx@sigxcpu.org>
2025-02-21base-modem: add subsystem device ID propertySushrut Shree Trivedi
Subsystem device ID can be used for identifying PCI modems, so expose the property. Signed-off-by: Sushrut Shree Trivedi <quic_sushruts@quicinc.com>
2024-12-19device,plugin: reset MMDevice's hotplugged after creating the modemMichal Mazur
The hotplugged flag was added to simplify modem probe on first time it is created. Before the re-probe it must be set to FALSE to destroy all existing netlink interfaces and force full reconfiguration.
2024-09-17helpers: consolidate some uses of mm_kernel_device_get_subsystem()Dan Williams
Signed-off-by: Dan Williams <dan@ioncontrol.co>
2024-07-31port-probe: detect XMMRPC portsThomas Vogt
2024-02-19plugin: include MM_PLUGIN_ALLOWED_SINGLE_AT in port probingGarfield Watkins
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/822
2023-10-06core: use more inclusive words in logsAleksander Morgado
2023-09-18api,modem: new 'Physdev' propertyLukas Voegl
Signed-off-by: Lukas Voegl <lvoegl@tdt.de>
2023-04-13udev: new ID_MM_REQUIRED tagAleksander Morgado
Users with QMI or MBIM capable modems may want to ensure that these are never managed using plain AT commands, as that also involves using PPP. This fallback to AT could happen if the QMI or MBIM port probing fails for whatever reason. The new `ID_MM_REQUIRED` udev tag allows specifying that a given port MUST be successfully grabbed when creating a new modem object, or otherwise the modem object will not be created at all (even if there are other fallback control ports like AT that could have been used). Use this tag with caution. It is assumed that when this tag is used some other external process may be monitoring the existence of the modem object in DBus as exposed by ModemManager, and if it does not appear for any reason then the modem would be reseted with some other mechanism (e.g. GPIOs, if available). If no such mechanism to autorecover the modem is in place, using this tag may leave the modem exposed in the kernel but ignored by ModemManager. This tag must be applied on the specific port for which the existence and usability must be ensured. E.g. flagging the MBIM port of the Fibocom L850 module as required: $ vim /lib/udev/rules.d/78-mm-test.rules ACTION!="add|change|move|bind", GOTO="mm_test_rules_end" SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="?*", ENV{.MM_USBIFNUM}="$attr{bInterfaceNumber}" ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0007", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_REQUIRED}="1" LABEL="mm_test_rules_end" $ sudo udevadm control --reload $ sudo udevadm trigger $ sudo udevadm info -p /sys/class/usbmisc/cdc-wdm0 ... E: ID_MM_REQUIRED=1 E: ID_MM_CANDIDATE=1
2023-04-13plugin: refactor how list of probe flags is builtAleksander Morgado
To make it clearer that the initial list of flags must be the one based on which ones are expected in the subsystem and which one the plugin is requesting.
2023-04-13port-probe: perform auto detection of port type hints for cdc_wdmAleksander Morgado
Do not do this in the plugin; instead, do it along with the logic that looks for port type hints in udev, so that we can properly warn if things don't match.
2022-06-19port-probe: avoid QCDM port probing if not for specific pluginsDaniele Palmas
The QCDM/DIAG port is usually nowadays exclusively used by applications gathering traces from the modem, so avoid port probing and grabbing when plugins set the property MM_PLUGIN_ALLOWED_QCDM. A new property MM_PLUGIN_REQUIRED_QCDM is created for those plugins requiring the QCDM port for properly using a modem.
2022-05-24filter: add vendor id/subsystem vendor id filterDaniele Palmas
Some PCI modems prefer customizing the subsytem vendor ID, instead of the vendor ID. Add a filter for the couple vendor/subsystem vendor IDs.
2022-05-24base-modem: add subsystem vendor ID propertyDaniele Palmas
Subsystem vendor ID can be used for identifying PCI modems, so expose the property.
2021-04-21base: Add support for wwan subsystemLoic Poulain
Add support for the Linux wwan subsystem that started to expose control channel as character devices (e.g. /dev/wwan0p1MBIM...). Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
2021-04-14plugin: probe QRTR ports for QMI supportAndrew Lassalle
2020-11-20core: new 'rpmsg' subsystemAleksander Morgado
Most older Qualcomm SoCs (e.g. MSM8916, MSM8974, ...) communicate with the integrated modem via shared memory (SMD channels). This is similar to QRTR on newer SoCs, but without the "network" layer. In fact, the older SoCs also have QRTR, but the modem QMI services are not exposed there. The mainline Linux kernel exposes SMD channels via the "remote processor messaging bus" (rpmsg). Through special IOCTL calls it is possible to create a char device for a rpmsg/SMD channel. We can then use these to send QMI/AT messages to the modem, much like the ordinary serial char devices when using a Qualcomm modem through USB. This commit introduces support for the new 'rpmsg' subsystem, which allows exporting QMI-capable and AT-capable ports. By default NO rpmsg port is flagged as candidate, it is assumed that the plugin adding support for the rpmsg subsystem will add specific rules to do so (e.g. so that non-modem ports are explicitly not flagged as candidate). All rpmsg ports will be probed for AT or QMI capabilities, unless explicit port type hints (e.g. ID_MM_PORT_TYPE_QMI or ID_MM_PORT_TYPE_AT_PRIMARY) are set. These changes are highly based on the initial integration work done by Stephan Gerhold <stephan@gerhold.net> in postmarketOS, see: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/363
2020-11-13plugin: build probing needs based on subsystemAleksander Morgado
Don't rely on the QMI or MBIM ports named cdc-wdm, use the device subsystem instead.
2020-11-13base-manager: automatic required subsystem detectionAleksander Morgado
Instead of assuming we require a fixed set of subsystems to monitor, compile the full list based on what the plugins have requested themselves.
2020-11-13core: stop monitoring the 'usb' subsystemAleksander Morgado
Back in Linux < 3.6 days, the cdc-wdm ports exposed by the QMI driver were flagged as owned by the 'usb' subsystem. That changed in 3.6 when the subsystem was renamed to 'usbmisc': https://mail.gnome.org/archives/networkmanager-list/2012-June/msg00125.html This patch removes all monitoring of the 'usb' subsystem completely, which is anyway a valid subsystem but for which we shouldn't need any special handling. Right now, with newer kernels, we were using that monitoring exclusively to get notified of full USB device remove events, which is really not required as we already process the port removals one by one. We simplify the logic everywhere that attempted to match either the 'usb' or 'usbmisc' subsystems, and we no longer require the explicit checks for the port name being named 'cdc-wdm[0-9]*' in the code, as that is already taken care of by the ID_MM_CANDIDATE udev tag rule.
2020-11-09plugin: network interface force ignore rules for certain drivers onlyAleksander Morgado
The rules to force ignoring certain network ports because the modem is using some specific drivers should definitely only be applied for the very known qmi_wwan and cdc_mbim drivers. If network ports for QMI or MBIM modems are exposed using different network drivers, don't ignore them.
2020-07-03plugin: define an autofree value to NULLAdrien Plazas
This satisfies -Werror=maybe-uninitialized.
2020-06-04filter: setup automatic per-vid checks in the plugin whitelistAleksander Morgado
Until now, the plugin whitelist rule in the filter would only handle those plugins that require specific udev tags, and those that had explicit full vid:pid pairs. This update makes a new implicit automatic whitelist for all devices that match any of the vids managed by the different plugins. Looking at the current list of devices in the blacklist and greylist maintained by ModemManager, there are no devices falling under the list of supported plugin vids that would need to be blacklisted; except for u-blox GPS modules: huawei -> 0x12d1 -> None in blacklist/greylist thuraya -> 0x1a26 -> None in blacklist/greylist telit -> 0x1bc7 -> None in blacklist/greylist dLink -> 0x2001 -> None in blacklist/greylist wavecom -> 0x114f -> None in blacklist/greylist x22x -> 0x1bbb,0x0b3c -> None in blacklist/greylist anydata -> 0x16d5 -> None in blacklist/greylist quectel -> 0x2c7c -> None in blacklist/greylist haier -> 0x201e -> None in blacklist/greylist novatel -> 0x1410 -> None in blacklist/greylist dell -> 0x413c -> None in blacklist/greylist option -> 0x0af0,0x1931 -> None in blacklist/greylist nokia -> 0x0421 -> None in blacklist/greylist cinterion -> 0x1e2d,0x0681 -> None in blacklist/greylist simtech -> 0x1e0e -> None in blacklist/greylist iridium -> 0x1edd -> None in blacklist/greylist pantech -> 0x106c -> None in blacklist/greylist longcheer -> 0x1c9e,0x1bbb -> None in blacklist/greylist linktop -> 0x230d -> None in blacklist/greylist sierra -> 0x1199 -> None in blacklist/greylist ublox -> 0x1546 -------------> GPS chips blacklisted !!!!! foxconn -> 0x0489 -> None in blacklist/greylist broadmobi -> 0x2020 -> None in blacklist/greylist fibocom -> 0x2cb7 -> None in blacklist/greylist tplink -> 0x2357 -> None in blacklist/greylist zte -> 0x19d2 -> None in blacklist/greylist The rules used to blacklist the u-blox GPS chips have already been moved to the u-blox plugin itself, and now they use the broader ID_MM_DEVICE_IGNORE tag that applies in all filter modes.
2020-04-08plugin: don't match generic plugin by nameAleksander Morgado
2020-04-08plugin: port to use object loggingAleksander Morgado
2020-01-30plugin: fix warnings with -Wdiscarded-qualifiersAleksander Morgado
mm-plugin.c:50:33: error: initialization discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers] 50 | static gchar *virtual_port[] = {"smd0", NULL}; | ^~~~~~
2019-09-17mm-plugin: fix inverted condition in port grabbingEric Caruso
If QMI support was not compiled in, then every net port that wasn't a QMI port would be force-ignored unless it had the qmi_wwan driver. Instead, we want to ignore ports with only the qmi_wwan driver.
2019-09-11filter: update plugin whitelist logic to use 'allowed product ids'Aleksander Morgado
Several plugins define the specific device vid:pid pairs they support. Let's use this information as a direct indication that ModemManager can probe the devices.
2019-09-06filter: new plugin whitelist logicAleksander Morgado
Several plugins define specific udev tags that must be available in the device in order for the plugins to use them. Let's use these tags as a direct indication that ModemManager can probe the devices. In particular, this change would make all Ericsson MBM modems probed right away also in STRICT filter mode, without needing to check the ttyACM interface type or the available net ports.
2019-05-23plugin: ignore unwanted net portsAleksander Morgado
* For QMI modems, make sure we only grab QMI data ports (flag the rest as ignored). * For MBIM modems, make sure we only grab MBIM data ports (flag the rest as ignored). * For other plugins that use NET ports in their logic, make sure we only grab non-QMI and non-MBIM data ports.
2018-08-21plugin: new properties to support Intel XMM capability probingAleksander Morgado
2018-01-25*: Spelling fixesVille Skyttä
2017-08-11plugin: fix forbidden_product_strings check in apply_post_probing_filtersBen Chan
This patch fixes a bug in apply_post_probing_filters() where it iterates through `self->priv->forbidden_product_strings' but incorrectly accesses `self->priv->product_strings[i]' inside the loop. `self->priv->forbidden_product_strings[i]' should be accessed instead.
2017-07-07plugin: check error returned by g_task_propagate_error insteadBen Chan
mm_plugin_supports_port_finish directly casts the value returned by g_task_propagate_int to MMPluginSupportsResult enum value, which implicitly assumes MM_PLUGIN_SUPPORTS_PORT_UNKNOWN equals to -1. Instead of relying on such an implicit assumption, this patch modifies the code to check if the GError argument to g_task_propagate_error is populated instead.
2017-03-22kernel-device: device-specific properties in either port or physdevAleksander Morgado
There are 2 main types of udev properties: device-specific and port-specific. The port-specific properties are set independently per port (e.g. port type hints set per interface number for a given vid:pid). The device-specific properties apply to all ports in the device. Some of these properties are currently expected in the physical device (e.g. ID_MM_PLATFORM_DRIVER_PROBE) while some others are expected in each port (e.g. the plugin udev tag filters). This patch tries to simplify the logic and just assume that the device specific tags may be given in either the physical device or the port device, by providing separate APIs to retrieve port-specific or device-specific (global) properties. If the same tag is given in both the device and the port, the one in the device takes preference. For the generic backend, these new APIs are really useless, as all device-specific and port-specific properties are always stored in the port object themselves (there is no 'tree' of devices in the generic backend, no 'physdev' device). For the udev backend, though, there really is a difference, as the tags may be set in port or device. https://bugs.freedesktop.org/show_bug.cgi?id=100156
2016-11-21kerneldevice,generic: load virtual devices without default rulesAleksander Morgado
This is so that "make check" doesn't depend on having the rule files installed in the default udev rules directory, which currently would break the build: TEST: test-service-generic... (pid=2601) /MM/Service/Generic/enable-disable: Activating service name='org.freedesktop.ModemManager1' Successfully activated service 'org.freedesktop.ModemManager1' ** (/home/aleksander/Development/foss/ModemManager/plugins/.libs/lt-test-service-generic:2601): ERROR **: Error setting test profile: GDBus.Error:org.freedesktop.ModemManager1.Error.Core.Failed: Failed to find primary AT port FAIL GTester: last random seed: R02S3897abaae9df36f8d2eeb679406ab675 make[3]: *** [Makefile:3804: test-nonrecursive] Terminated
2016-09-29core: use the kernel device object in the port object and the plugin interfaceAleksander Morgado
The mm_base_modem_grab_port() now receives a MMKernelDevice directly from the plugin, which is then stored in the MMPort corresponding to the port. This means that we have direct access to e.g. all properties set by udev rules everywhere, and we don't need additional GUdevClient objects (e.g. like the one used in the Huawei plugin to detect NDISDUP support during runtime). For virtual ports (e.g. generated during unit tests), we have a new 'generic' kernel device object which just provides the values from the kernel device properties given during its creation.
2016-09-29core: new kernel device object instead of an explicit GUdevDeviceAleksander Morgado
Instead of relying constantly on GUdevDevice objects reported by GUdev, we now use a new generic object (MMKernelDevice) for which we provide an initial GUdev based backend.
2016-09-29core: allow identifying devices by a user-provided 'uid'Aleksander Morgado
All ports of the same modem reported by the kernel will all be associated with a common 'uid' (unique id), which uniquely identifies the physical device. This logic was already in place, what we do now is avoid calling it the 'sysfs path' of the physical device, because we may not want to use that to identify a device. This logic now also enables the possibility of "naming" the modems in a unique way by setting the "ID_MM_PHYSDEV_UID" property in the "usb_device" that owns all the ports. E.g. a custom device has 4 modems in 4 different USB ports. The device path of each USB device will always be the same, so the naming rules could go like this: $ vim /usr/lib/udev/rules.d/78-mm-naming.rules ACTION!="add|change|move", GOTO="mm_naming_rules_end" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.1", ENV{ID_MM_PHYSDEV_UID}="USB-MODEM-1" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.2", ENV{ID_MM_PHYSDEV_UID}="USB-MODEM-2" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.3", ENV{ID_MM_PHYSDEV_UID}="USB-MODEM-3" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.4", ENV{ID_MM_PHYSDEV_UID}="USB-MODEM-4" LABEL="mm_naming_rules_end" Each of the modems found will have a unique UID retrieved from the previous list of rules. Then, "mmcli" has also been updated to allow using the UID instead of the modem DBus path or index, e.g.: $ sudo mmcli -m USB-MODEM-1 /org/freedesktop/ModemManager1/Modem/0 (device id '988d83252c0598f670c2d69d5f41e077204a92fd') ------------------------- Hardware | manufacturer: 'ZTE CORPORATION' | model: 'MF637' | revision: 'BD_W7P673A3F3V1.0.0B04' | supported: 'gsm-umts' | current: 'gsm-umts' | equipment id: '356516027657837' ------------------------- System | device: 'USB-MODEM-1' | drivers: 'option' | plugin: 'ZTE' | primary port: 'ttyUSB5' | ports: 'ttyUSB5 (at)' ... $ sudo mmcli -m USB-MODEM-1 --enable ...
2016-03-09port-probe: allow cancellationAleksander Morgado
2016-03-09plugin: allow cancellation of the port probe operationAleksander Morgado
2015-02-18plugin: add implicit QMI and MBIM forbidden drivers checkAleksander Morgado
2015-02-16plugin: allow having both 'drivers' and 'forbidden drivers' filtersAleksander Morgado
2015-02-16plugin: let vendor/product filter be complementaryAleksander Morgado
So that a plugin can specify a full VID and a specific PID subset of another VID as supported.
2015-01-29plugin: avoid segfault when port driver is unknownAleksander Morgado
Based on a patch from Bastiaan Jacques <bastiaan@bjacques.org> https://bugzilla.redhat.com/show_bug.cgi?id=1177799 https://bugs.freedesktop.org/show_bug.cgi?id=88864
2014-09-05plugin: allow to explicitly ignore any kind of port via udevAleksander Morgado
The new 'ID_MM_PORT_IGNORE' tag will tell ModemManager to fully avoid using a given port. Note that it is key to not only flag the port probe as ignored, but also to fully ignore the ports in e.g. mm_port_probe_list_has_qmi_port() as those methods will be used to decide which kind of modem object to create. We don't want to create a QMI-based modem which may have all QMI ports blacklisted.
2014-09-05plugin: if no QMI or no MBIM still grab the WWAN ports, flagged as ignoredAleksander Morgado
E.g. this would be the result when having ModemManager compiled without QMI support, and a modem with 2 QMI/WWAN pairs: $ mmcli -m 2 /org/freedesktop/ModemManager1/Modem/2 (device id '417e4dcff7f232b62cfe6c972e2099701848fd7f') ------------------------- Hardware | manufacturer: 'Sierra Wireless, Incorporated' | model: 'MC7304' | revision: 'SWI9X15C_05.05.02.00 r19147 carmd-fwbuild1 2013/11/15 13:54:28' | supported: 'gsm-umts' | current: 'gsm-umts' | equipment id: 'unknown' ------------------------- System | device: '/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7' | drivers: 'qcserial, qmi_wwan' | plugin: 'Gobi' | primary port: 'ttyUSB8' | ports: 'ttyUSB8 (at), wwp0s29u1u7i8 (unknown), ttyUSB6 (qcdm), wwp0s29u1u7i10 (unknown)' The /dev/cdc-wdm ports don't even appear (as they were not even probed), but the newly ignored WWAN ports do appear in the list, but flagged as UNKNOWN type (instead of NET).
2014-07-27plugin: improve probing decision logic for QMI and MBIMAleksander Morgado
So, we may have modems with multiple /dev/cdc-wdm ports, like Ericsson modems, where only 1 of them is MBIM. With the previous logic, we would probe all /dev/cdc-wdm ports for MBIM as soon as one of the ports was handled by the cdc_mbim driver. That is totally not optimal, as we are already know that they are not MBIM (not handled by cdc_mbim). Instead, fix the logic to just probe for MBIM or QMI if the actual driver managing the port is MBIM or QMI.
2014-06-23port: store parent sysfs path in each MMPortAleksander Morgado