aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2016-09-29core: allow building and running without udevAleksander Morgado
Instead of relying on the udev daemon and GUDev to manage the devices reported by the kernel, we can now run ModemManager relying solely on the kernel events reported via the new ReportKernelEvent() API. Therefore, the '--no-auto-scan' option is implicit for the ModemManager daemon when udev is disabled in the build. Additionally, a new custom implementation of the kernel device object is provided, which uses sysfs to load the properties and attributes required in each kernel device, instead of using a GUdevDevice. The udev rule files are kept in place, and a simple custom parser is provided which preloads all rules in memory once and then applies them to the different kernel objects reported via ReportKernelEvent(), e.g. to set port type hints. A simple unit test setup is prepared to validate the udev rules during the `check' Makefile target.
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: allow disabling auto-scan and notifying ports one by one via APIAleksander Morgado
This commit enables a new core ModemManager daemon option, so that automatic detection of available modems is totally disabled: '--no-auto-scan'. Note that this option also replaces the previously used '--test-no-auto-scan' option, which was only used during tests. Along with the new ModemManager option, a new ReportKernelEvent() method in the API is defined, which allows notifying the daemon of which interfaces it should be accessing, as well as the main details of each interface. The only mandatory parameters in the new method are 'action' (add/remove), 'name' (the name of the interface) and 'subsystem' (the subsystem of the interface). The mmcli tool has support for using the new api method via several new options: * The '--report-kernel-event' option allows specifying device ports one by one, and is a direct mapping of the ReportKernelEvent() method: $ sudo mmcli --report-kernel-event="action=add,name=wwan0,subsystem=net" $ sudo mmcli --report-kernel-event="action=add,name=cdc-wdm0,subsystem=usbmisc" * The '--report-kernel-event-auto-scan' option uses udev monitoring to notify events automatically to the daemon. This allows to operate in a way equivalent to the default daemon operation (with implicit auto-scan). Worth noting that the ReportKernelEvent() method is only usable when '--no-auto-scan' is explicitly used in the daemon. An error will be reported if the method is tried while standard udev monitoring is enabled (implicit if auto scan isn't explicitly disabled in the daemon). If mmcli is going to be used only to report 'real time' events, an optional '--initial-kernel-events=[PATH]' may be given in the ModemManager call to automatically process a set of port kernel events one by one on boot. The file may e.g. contain: action=add,name=wwan0,subsystem=net action=add,name=cdc-wdm0,subsystem=usbmisc
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-09-28mmcli,ussd: don't rely on lock status to allow actionsAleksander Morgado
Commit 001f35234e16d7aeb2ed1282ba3b57aea73c5a9e fixed this very same thing in all the other interface actions, but 3GPP USSD actions were not fixed. https://bugs.freedesktop.org/show_bug.cgi?id=97954
2016-09-22base-modem: add missing 'reprobe' property setupAleksander Morgado
The sim hotswap logic likely just uses the getter/setter methods, but we should anyway fix the property definition bits.
2016-09-22blacklist: add another Infineon flashloader deviceDaniele Palmas
This patch adds another Infineon flashloader device 0x8087/0x0801 to the blacklist Reference to the kernel commit: github.com/torvalds/linux/commit/f190fd92458da3e869b4e2c6289e2c617490ae53
2016-09-18huawei: fix interface class/subclass/protocol matchingAleksander Morgado
Commit a66871a2876be2236f634ff6b5e59d20de1ce5df introduced an additional ATTRS{idVendor} match condition in the same rules matching by interface class, subclass and protocol. We shouldn't be doing that because we cannot mix parent attribute matchings from different parents.
2016-09-18dell,telit: set one tag per rule matchAleksander Morgado
2016-09-18udev: fix tagging per interface numberAleksander Morgado
Commit 7ff57f9808f35d434b638a67b84481271c67c90e introduced a change to try to use ATTRS{bInterfaceNumber} as a common way to match by interface number, but this logic is broken because all the rules that we use to match by interface number (attribute in the interface device) also require matching by idVendor and idProduct (attributes in the physdev device), and udev rules forbid matches from more than one parent device at a time. We could use ATTR{bInterfaceNumber} (instead of ATTRS) to tag the actual USB interface device, but that would require a change in all the plugins to look for the tag not in the TTY device, but in its parent. So, recover the original behavior, where a hidden property is created containing the first bInterfaceNumber found in the list of parent devices, and then run the matches against idVendor and idProduct only if the hidden property is found with the expected value.
2016-09-18udev: fix SUBSYSTEMS and ATTRS{idVendor} checksAleksander Morgado
Rules with a single condition where a parent property is checked with != don't work properly. E.g.: SUBSYSTEMS!="usb", GOTO="end" or: ATTRS{idVendor}!="abcd", GOTO="end" Instead, we can mix both those previous parent rules and match them: SUBSYSTEMS=="usb",ATTRS{idVendor}=="abcd", GOTO="next" GOTO="end" LABEL="next" # Apply rules here LABEL="end" In this case both SUBSYSTEMS and ATTRS conditions apply to the parent usb_device (idVendor attribute is only available in the usb_device), so they apply to all ports of the same device.
2016-09-08broadband-modem-huawei: fix missing return in unsolicited voice message enableDan Williams
2016-08-31broadband-modem-huawei: implement Modem.Signal extended signal info interfaceDan Williams
Implement the detailed signal info interface for some Huawei 3GPP modems including those based on HiSilicon chipsets like the E3276. Known not to work on many Qualcomm-based Huawei modems like E392, E397, and E367 as they don't support the ^HCSQ command, but they do support QMI and so have access to the extended signal interface via QMI.
2016-08-29blacklist: add blacklist udev rule for U-blox7 GPS/GLOSNASS USB dongle.Tabor Kelly
Signed-off-by: Tabor Kelly <t.kelly@trailtech.net>
2016-08-15core: use MM-specific logging methods always instead of the generic GLib onesAleksander Morgado
2016-08-12api,signal: fix LTE signal dictionary docstringDan Williams
2016-08-10core: minor coding style changesAleksander Morgado
2016-08-10telit: add support to SIM hot swapCarlo Lobrano
MMBroadbandModemTelit: * added logic to set MMBroadbandModem's SIM_HOT_SWAP property to TRUE * added function to enable QSS unsolicited * added QSS unsolicited handler
2016-08-10modem: support SIM hot swapCarlo Lobrano
BaseModem added reprobe property. MMDevice added logic to recreate the modem if it is set invalid and "to reprobe" MMBroadbandModem * added initialization step for SIM hot swap: 1. keep dedicated ports open to listen to modem's unsolicited 2. dedicated error management in case of initialization failure due to SIM missing * added function to be called in order to act upon SIM insertion/removal: 1. close dedicated ports 2. set the modem to be reprobed 3. disable modem * added SIM HOT SWAP boolean property MMIfaceModem * added initialization step for SIM hot swap, if supported by the plugin * dedicated error management in case of initialization failure due to SIM missing
2016-08-10api,signal: Ec/Io is in dB, not dBmAleksander Morgado
2016-08-10libmm-glib,helpers: don't warn when trying to read invalid match info indexAleksander Morgado
We may want to use the mm_get_()_from_match_info() calls to read optional items, so that the method returns FALSE if the item index doesn't apply. So, avoid the implicit warning issued by g_return_val_if_fail().
2016-08-06device: ignored ports are also owned by the device, so include them in lookupAleksander Morgado
2016-08-06mtk,udev: single 'usb' subsystems checkAleksander Morgado
2016-08-06udev: simpler check for rfcomm device namesAleksander Morgado
Just the same kind of match we use for cdc-wdm devices.
2016-08-06zte,udev: avoid making the rules tty-only, and simplify single vendor checkAleksander Morgado
The rules were matched only against devices with an exact 'tty' subsystem, and that means that we were not properly adding additional tags on e.g. wwan or cdc-wdm devices.
2016-08-06simtech,udev: simplify single vendor checkAleksander Morgado
2016-08-06nokia,udev: simplify single vendor checkAleksander Morgado
2016-08-06telit,udev: single 'usb' subsystems check and simplified single vendor checkAleksander Morgado
2016-08-06mbm,udev: additional per-vendor conditions for quicker processingAleksander Morgado
2016-08-06huawei,udev: single 'usb' systems check, and per-rule vendor-specific conditionsAleksander Morgado
2016-08-06longcheer,udev: single 'usb' subsystems checkAleksander Morgado
2016-08-06cinterion,udev: ensure 'usb' subsystems before idVendor/idProduct rulesAleksander Morgado
2016-08-06haier,udev: simplify single vendor checkAleksander Morgado
2016-08-06x22x,udev: single 'usb' subsystems checkAleksander Morgado
2016-08-06udev: replace ENV{.MM_USBIFNUM} conditions with ATTRS{bInterfaceNumber}Aleksander Morgado
2016-08-06udev: replace ENV{ID_VENDOR_ID} conditions with ATTRS{idVendor}Aleksander Morgado
2016-08-06udev: remove ENV{DEVTYPE}!="usb_device" rulesAleksander Morgado
They're actually a subcase of SUBSYSTEM!="usb", which we apply just before.
2016-08-02base-call: formatting cleanupsDan Williams
2016-07-27broadband-modem/libqcdm: add signal strength from QCDM EVDO Pilot Sets log ↵Dan Williams
messages When a CDMA-only modem is registered with the EVDO network, its not possible to read signal strength in the following cases: 1) while a data connection is active on single-AT-port modems, because the AT port is used for PPP and not available for AT+CSQ, AT+CIND or vendor-specific signal strength commands 2) when the modem reports only CDMA 1x signal strength with AT+CSQ Now that we have a reasonable interpretation of RSSI from the QCDM EVDO Pilot Sets V2 log messgae, use that when other means of getting signal strength aren't available.
2016-07-27blacklist: include some more ArduinosLubomir Rintel
All "2a03 dog hunter AG" devices seem to be Arduinos. https://bugzilla.redhat.com/show_bug.cgi?id=1261040
2016-07-26telit: adding a short delay after SIM unlockCarlo Lobrano
A short delay is necessary with some SIMs when they have just been unlocked. Using 1 second as secure margin.
2016-07-26iface-modem: inverted steps in update_lock_info_context_stepCarlo Lobrano
Inverted steps UPDATE_LOCK_INFO_CONTEXT_STEP_RETRIES and UPDATE_LOCK_INFO_CONTEXT_STEP_AFTER_UNLOCK. Soon after the unlock, the SIM can be busy and loading unlock retries might fail. When implemented, let run "after unlock" logic before any other step in update lock info, when SIM is not locked this change does not have any effect since "after unlock" is not executed.
2016-07-26build: post release version bump to 1.7.0Aleksander Morgado
2016-07-26release: bump version to 1.6.0Aleksander Morgado
2016-07-26build: updated copyright years up to 2016Aleksander Morgado
2016-07-25examples: avoid warning in modem-watcher-python exampleAleksander Morgado
PyGIWarning: ModemManager was imported without specifying a version first. Use gi.require_version('ModemManager', '1.0') before import to ensure that the right version gets loaded.
2016-07-25examples: add SMS sender in pythonAleksander Morgado
2016-07-21build: don't disable the aliasing checksLubomir Rintel
We now don't break the strict aliasing rules. Also, having a compiler flag that disables a warning among the flags that are meant to add extra sanity checking is not correct either: --enable-extra-warnings=no would generate a bad aliasin warning while the --enable-extra-warnings=yes would not.
2016-07-21qcdm: avoid upsetting the compiler with wrong aliasingLubomir Rintel
We shouldn't be accessiing u_int8_t * as u_int16_t *. Let's construct the 16-bit value by or-ing the 8-bit halves directly; avoiding the endianness conversion too.