Monthly Archives: October 2016
Naming devices in ModemManager

No more “which is now the index of this modem…?”
DBus object path and index
When modems are detected by ModemManager
and exposed in DBus
, they are assigned an unique DBus object path, with a common prefix and a unique index number, e.g.:
/org/freedesktop/ModemManager1/Modem/0
This path is the one used by the mmcli
command line tool to operate on a modem, so users can identify the device by the full path or just by the index, e.g. this two calls are totally equivalent:
$ mmcli -m /org/freedesktop/ModemManager1/Modem/0 $ mmcli -m 0
This logic looks good, except for the fact that there isn’t a fixed DBus
object path for each modem detected: i.e. the index given to a device is the next one available, and if the device is power cycled or unplugged and replugged, a different index will be given to it.
EquipmentIdentifier
Systems like NetworkManager
handle this index change gracefully, just by assuming that the exposed device isn’t the same one as the one exposed earlier with a different index. If settings need to be applied to a specific device, they will be stored associated with the EquipmentIdentifier
property of the modem, which is the same across reboots (i.e. the IMEI for GSM/UMTS/LTE devices).
User-provided names
The 1.8 stable release of ModemManager
will come with support for user-provided names assigned to devices. A use case of this new feature is for example those custom systems where the user would like to assign a name to a device based on the USB port in which it is connected (e.g. assuming the USB hardware layout doesn’t change across reboots).
The user can specify the names (UID
, unique IDs) just by tagging in udev
the physical device that owns all ports of a modem with the new ID_MM_PHYSDEV_UID
property. This tags need to be applied before the ID_MM_CANDIDATE
properties, and therefore the rules file should be named before the 80-mm-candidate.rules
one, for example like this:
$ cat /lib/udev/rules.d/78-mm-naming.rules ACTION!="add|change|move|bind", GOTO="mm_naming_rules_end" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.5",ENV{ID_MM_PHYSDEV_UID}="USB1" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.2",ENV{ID_MM_PHYSDEV_UID}="USB2" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.3",ENV{ID_MM_PHYSDEV_UID}="USB3" DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5.4",ENV{ID_MM_PHYSDEV_UID}="USB4" LABEL="mm_naming_rules_end"
The value of the new ID_MM_PHYSDEV_UID
property will be used in the Device
property exposed in the DBus
object, and can also be used directly in mmcli
calls instead of the path or index, e.g.:
$ mmcli -m USB4 ... ------------------------- System | device: 'USB4' | drivers: 'qmi_wwan, qcserial' | plugin: 'Sierra' | primary port: 'cdc-wdm2' ...
Given that the same property value will always be set for the modem in a specific device path, this user provided names may unequivocally identify a specific modem even when the device is power-cycled, unplugged and replugged or even the whole system rebooted.
Binding the property to the device path is just an example of what could be done. There is no restriction on what the logic is to apply the ID_MM_PHYSDEV_UID
property, so users may also choose other different approaches.
This support is already in ModemManager
git master, and as already said, will be included in the stable 1.8 release, whenever that is.
TL;DR? ModemManager
now supports assigning unique names to devices that stay even across full system reboots.