Commit graph

46 commits

Author SHA1 Message Date
Oliver Sedlbauer
074741e343 modemmanager: move iface cleanup to wrapper script
If the ModemManager process crashes, the interfaces are not cleaned
up properly because the stop_service method is not called. With this
change, the interfaces are cleaned up both when stopping the service
and during a crash. Therefore it is no longer necessary to perform a
cleanup at the beginning.

Signed-off-by: Oliver Sedlbauer <osedlbauer@tdt.de>
2023-10-30 08:53:29 +01:00
Oliver Sedlbauer
d78505bcfa modemmanager: improve cleanup of ifaces
Change workflow to cleanup interfaces using the sysfscache.
The sysfscache stores the processed sysfs-paths. Using this
instead of mmcli -L, the interfaces can be properly cleaned
up even if, for example, ModemManager crashes and mmcli is
no longer usable.

Signed-off-by: Oliver Sedlbauer <osedlbauer@tdt.de>
2023-10-30 08:53:10 +01:00
Oliver Sedlbauer
01fb59f4e2 modemmanager: check status of report-kernel-event
At mm_report_modem_wait a wait status is set. When attempting to report
an event (via hotplug or during startup) and the DBus is not yet available,
the status in the sysfs cache is set to 'processed' incorrectly, even
if mmcli fails.
This is fixed by aborting the operation and logging an error when
the kernel report fails.

Signed-off-by: Oliver Sedlbauer <osedlbauer@tdt.de>
2023-10-25 09:33:22 +02:00
Oliver Sedlbauer
9ae43c14e8 modemmanager: remove sysfscache after dbus ready
The mm_report_events_from_cache method is called during the startup and
informs the ModemManager of kernel events. Additionally, hotplug scripts
inform the ModemManager of kernel events. Processed events are stored in
the sysfs cache. It is possible for a hotplug script to write to the
sysfs cache while the mm_report_events_from_cache method is still waiting
for the ModemManager to be available on the bus during startup.
This could lead to a misbehavior where modems are not recognized.
To ensure a clean state on startup, the sysfs cache is cleared after the
ModemManager is available, ensuring reliable processing of kernel events.

Signed-off-by: Oliver Sedlbauer <osedlbauer@tdt.de>
2023-10-25 09:33:22 +02:00
Florian Eckert
5c63540762
Merge pull request #21993 from osedl/pr/20230901-modemmanager-hardcoded-proto
modemmanager: Remove hardcoded proto check
2023-09-27 13:39:02 +02:00
Oliver Sedlbauer
29590e5d6d modemmanager: Remove hardcoded proto check
Modified the code to correctly determine modem availability based on the
sysfs path provided in the 'device' option, instead of relying  on the
'proto' value. This ensures proper configuration for custom-made protos
that do not match the "modemmanager" identifier.

Signed-off-by: Oliver Sedlbauer <osedlbauer@tdt.de>
2023-09-01 14:07:05 +02:00
Oliver Sedlbauer
ac806e9921 modemmanager: Fix Permission Denied error
The proto_send_update function is sending a notification to netifd
during the teardown section. However, netifd filters link update
notifications executed during teardown, as indicated here:
https://git.openwrt.org/?p=project/netifd.git;a=blob;f=proto-shell.c#l515
This was leading to a Permission Denied error due to its behavior,
making proto_send_update ineffective during teardown.

To address the issue, the proto_send_update function has been removed
from the teardown section. This prevents the Permission Denied error
while ensuring proper operation during teardown.

Additionally, in the 10-report-down helper script, a check has been
implemented to determine if the interface is already down. This check
is crucial to avoid triggering a Permission Denied error, especially
in cases where netifd is already aware of a controlled ifdown operation.

Signed-off-by: Oliver Sedlbauer <osedlbauer@tdt.de>
2023-09-01 13:46:45 +02:00
Florian Eckert
015106346c modemmanager: add setting for allowed and preferred mode
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-08-09 14:13:06 +02:00
Florian Eckert
5fa043000f modemmanager: remove unneeded teardown error reporting
Teardown error reporting is not needed, bacause it overrides init error
reporting.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-08-09 14:10:25 +02:00
Florian Eckert
dbf23705c5 modemmanager: fix white spaces
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-08-09 14:10:20 +02:00
Florian Eckert
89391d4213 modemmanager: improve 'simple connection' option handling
The line to generate the argument list for 'simple connect' is quite
long and is not maintainable. To improve the handling a function
'append_param' was added for appending the 'simple connect' options.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-07-24 13:46:39 +02:00
Francisco Jose Alvarez
7ba2c969b2 modemmanager: Adding support for 'allow_roaming' option
Signed-off-by: Francisco Jose Alvarez <francisco.alvarez@galgus.net>
* Update commit head
* Rebase patch to the latest changes
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-07-24 12:57:39 +02:00
Florian Eckert
2f00e4b8d7 modemmanger: add missing proto_init_update in teardown
Inform netifd with missing 'proto_update', that the interface is not
up anymore.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-07-24 09:42:12 +02:00
Florian Eckert
30911865b2 modemmanager: do not set proto_notify_error on teardown
If on teardown the 'proto_notify_error' is set to 'MM_TEARDOWN_IN_PROGRESS',
then an error which is set on 'setup' is not visible in the ubus
network.interface.<iface> status output.

{
  "up": false,
  "pending": false,
  "available": true,
  "autostart": false,
  "dynamic": false,
  "proto": "modemmanager",
  "data": {
  },
  "errors": [
    {
      "subsystem": "dualsim",
      "code": "MM_TEARDOWN_IN_PROGRESS"
    }
  ]
}

It alway shows the code 'MM_TEARDWON_IN_PROGRESS'!

By removing the line 'proto_notify_error "${interface}" MM_TEARDOWN_IN_PROGRESS'
in teardown, the last error is show in the proto stack from setup.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-07-24 09:41:51 +02:00
Mladen Milinkovic
f3943dbb2a modemmanager: support setting plmn
Signed-off-by: Mladen Milinkovic <maxrd2@smoothware.net>
2023-07-21 16:39:01 +02:00
Florian Eckert
fd63e400ba modemmanager: if an alias name is used do not check sysfs path
If an alias name is used for the modem, then a check if the device exists
in sysfs does not work. To fix this remove the check if the sysfs device
exists. The protocoll handler already checks if the modem is responsible
for this device on the next line.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-06-15 15:45:16 +02:00
Florian Eckert
e66fead6d4 modemmanager: do not cache virtual device events
On small systems with many virtual devices, the modem manager sometimes
could not start because it took too long until all devices for the modem
were recognised. This is because all system events that are stored in
the file events.cache have to be processed. To speed up the processing,
all devices under /sys/devices/virtual are now filtered out so that they
do not have to be processed.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2023-06-15 15:09:55 +02:00
Aleksander Morgado
eb283ea8a3 modemmanager: fix unquoted strings when launching pppd
Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2022-11-11 15:16:03 -08:00
Arkadiusz Drabczyk
cdbc7a67fc modemmanager: fix mm_log() invocations in 25-modemmanager* files
Definition of mm_log() was changed in
45a56a8899 but 25-modemmanager* weren't
changed.

Signed-off-by: Arkadiusz Drabczyk <arkadiusz@drabczyk.org>
2022-07-24 10:35:43 -07:00
Aleksander Morgado
c15e94f6c5 modemmanager: explicitly disconnect even if no bearers found
A network restart where netifd is cleanly restarted involves bringing
the network interfaces down. The 'modemmanager' protocol handler will
run a mmcli --simple-disconnect in this case, but only if there are
bearer objects found.

If the network restart happened *during* the connection attempt
procedure, while the modem is e.g. being registered in the network, no
bearer objects exist yet, and so, we would skip doing anything during
the interface teardown operation. This would lead to the original
connection attempt succeeding, so leaving the modem in ModemManager
in connected state, while the associated interface in netifd is
reported down.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2022-07-05 21:59:51 -07:00
Aleksander Morgado
bc754f31cf modemmanager: report network initiated disconnections to netifd
The new connection dispatcher scripts support integrated in
ModemManager 1.18.8 allows us to provide a openwrt-specific dispatcher
script used to report netifd that the underlying network connection is
down.

See also https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/775

Fixes https://github.com/openwrt/openwrt/issues/8368
Fixes https://github.com/openwrt/packages/issues/14096

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2022-05-14 21:39:50 -07:00
Aleksander Morgado
ab061c8ddd modemmanager: remove 2s timeout before reporting cached events
When ModemManager is started on boot we may end up with hotplug events
reported directly to the daemon, plus some others already cached in
the cache file before the daemon was started.

If the cached events correspond to the same device that is still
notifying ports directly, we may end up with a modem object created
before the cached events have been emitted, so the modem may not
handle all control/data ports it should.

E.g.:

  - modem detected
  - hotplug event for wwan0 port, cached as MM not running
  - hotplug event for cdc-wdm0 port, cached as MM not running
  - hotplug event for ttyUSB0, cached as MM not running
  - MM starts
  - hotplug event for ttyUSB1, directly processed as MM is running
  - hotplug event for ttyUSB2, directly processed as MM is running
  - modem object created with ttyUSB1 and ttyUSB2
  - 2s after MM starts, cached events for wwan0, cdc-wdm0 and ttyUSB0
    happen, but are ignored because the modem object has already been
    created

MM expects that ports of the same device are reported with less than
1500ms in between ports. In other words, if ports are reported more
than 1500ms after the last reported port, they may get ignored.

If we remove the 2s timeout, the report of the cached events will
happen as soon as MM starts, which makes it much more likely to happen
in the timeslot that MM expects for ports of the same device reported.
The logic is still not perfect, and we may also need to increase that
1500ms timeout inside MM, but removing the 2s timeout right away here
makes sense.

This 2s timeout was introduced along with the new wrapper launcher for
the daemon, it didn't exist before.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2022-01-13 15:54:02 -08:00
Florian Eckert
45a56a8899 modemmanager: refactoring hotplug debug logging
The output of the hotplug is very chatty and floods the log with
messages that are not necessary in functioning operation.

So that the log can be filtered. A log level was added to each message
as the first opiton on mm_log function call.

In addition, the facility of the hotplug script has been set to daemon,
which in my view fits better than user.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2021-12-14 09:17:34 +01:00
Florian Eckert
dc7095baff ModemManager: add service options
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2021-12-14 09:17:02 +01:00
Florian Eckert
0b027b131c ModemManager: refactoring procd init script
The way the init script is written now, we get a bad output when calling
the ubus service backend.

ubus call service list "{'verbose':true,'name':'modemmanager'}"
>{
>        "modemmanager": {
>                "instances": {
>                        "instance1": {
>                                "running": true,
>                                "pid": 20511,
>                                "command": [
>                                        "sh",
>                                        "-c",
>                                        ".
>/usr/share/ModemManager/modemmanager.common;    \t
>mkdir -m 0755 -p /var/run/modemmanager;          \t
>mm_cleanup_interfaces;                            \t
>( mm_report_events_from_cache ) >/dev/null 2>&1 & \t
>/usr/sbin/ModemManager"
>                                ],
>                                "term_timeout": 5,
>                                "respawn": {
>                                        "threshold": 3600,
>                                        "timeout": 5,
>                                        "retry": 5
>                                },
>                                "pidfile":"/var/run/modemmanager/modemmanager.pid"
>                        }
>                }
>        }
>}"

I also get the output in the log that the PID file cannot be created.

> daemon.err procd: Failed to remove pidfile: :No such file or directory

The changes in this commit fixes this issues, by moving startup into a
wrapper script.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2021-12-06 14:49:43 +01:00
Aleksander Morgado
9bc5942529 modemmanager: fix physdev sysfs path detection in PCIe modems
The PCIe physdev path lookup relies on the 'vendor' and 'device'
attribute files, instead of the 'idVendor' and 'idProduct' ones, which
are USB specific.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2021-11-12 11:00:04 -08:00
Aleksander Morgado
2a31359c47 modemmanager: add support for wwan subsystem in hotplug
WWAN devices may now be exposed in the new 'wwan' subsystem in the
kernel (since 5.13), initially applicable to devices exposed in PCIe
(no USB), but at some point may also apply to USB devices that until
now were exposed via other subsystems (e.g. usbmisc, tty).

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2021-10-19 21:39:26 +02:00
Rosen Penev
520a619e58
Merge pull request #13009 from valexi7/master
modemmanager: Added options
2020-12-09 00:55:54 -08:00
Aleksander Morgado
a7108c9e12 modemmanager: include all init commands in the procd instance
If procd relaunches the ModemManager daemon after e.g. a crash, we
also want it to notify all cached hotplug events, or otherwise we
would end up leaving the daemon running without the full initial
processing done.

This change modifies the init script to include all the required init
commands as part of the procd instance command, so that procd launches
all of them on every respawn.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2020-11-02 10:55:17 +01:00
Aleksander Morgado
9a16087fd6 modemmanager: increase initial timeout for event reporting
When the ModemManager daemon is started by the init script, we're
explicitly calling mm_report_events_from_cache() so that all the
hotplug events that happened before that moment are properly notified
to the newly launched daemon.

This initial reporting of events does a wait for the ModemManager
process to be available in DBus, and if the daemon isn't registered in
the bus in a given time, the process is considered failed:

  Sun Sep  6 16:20:02 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:02 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:03 2020 [2180]: <info>  ModemManager (version 1.14.6) starting in system bus...
  Sun Sep  6 16:20:03 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:04 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:05 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:05 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:06 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:06 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:07 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:07 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:08 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:08 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:09 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:09 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:10 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:10 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:11 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:11 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:12 2020 ModemManager: hotplug: checking if ModemManager is available...
  Sun Sep  6 16:20:12 2020 ModemManager: hotplug: ModemManager not yet available
  Sun Sep  6 16:20:12 2020 ModemManager: hotplug: error: couldn't report initial kernel events: ModemManager not running

Update the default wait time for this initial event notification from
10s to 60s, because there are cases where the daemon is slower to
boot, e.g. during the first boot after a sysupgrade.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2020-10-30 23:29:55 +01:00
Valtteri Holopainen
46f5937ad1 modemmanager: added new proto options
Added signal refresh rate option
modemmanager: update readme.md
Added description for added proto options.

Added compile option to compile --with-at-command-via-dbus for allowing
AT commands to modem without --debug flag

 Changes to be committed:
	modified:   net/modemmanager/Config.in
	modified:   net/modemmanager/Makefile
	modified:   net/modemmanager/files/modemmanager.init
	modified:   net/modemmanager/files/modemmanager.proto
	modified:   README.md

Signed-off-by: Valtteri Holopainen <valtsu@gmail.com>
2020-08-13 12:56:31 +03:00
Nicholas Smith
377a33730d modemmanager: add error message notifications to proto handler
Signed-off-by: Nicholas Smith <nicholas.smith@telcoantennas.com.au>
2020-07-10 20:28:31 +10:00
Rosen Penev
8a965ca029
Merge pull request #12086 from aleksander0m/aleksander/mm-auth
Authentication protocol setup in ModemManager
2020-06-28 20:01:26 -07:00
Aleksander Morgado
41552c1cc2 modemmanager: set interface MTU based on bearer settings
Using the same method used by other protocol handlers like uqmi.

Fixes https://github.com/openwrt/packages/issues/11383

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2020-05-25 15:35:50 +02:00
Aleksander Morgado
c5c5620f20 modemmanager: allow specifying list of authentication protocols
ModemManager allows specifying which are the authentication protocols
to be used during the user/password context authentication with the
peer.

This protocol update allows users to provide a new 'allowedauth'
option in the interface configuration, which is then used in two
different places:
 * It is sent to ModemManager in the --simple-connect call so that
   modems with a network interface can perform the authentication
   using their own vendor-specific protocol.
 * If the connection is done using PPP, this list of protocols is used
   to configure the pppd call.

If the new 'allowedauth' option is not given, all auth protocols are
implicitly allowed.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2020-05-14 09:19:54 +02:00
Aleksander Morgado
5f11888b12 modemmanager: install common utils in /usr/share/ModemManager
The modemmanager.common file includes several utility functions that
are used in several places like the protocol handler and in hotplug
scripts. These utilities should not be installed in /etc as they're
not configuration.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-27 09:28:10 +01:00
Aleksander Morgado
ecad39fd60 modemmanager: don't flag the 'device' option as 'device' type
Unlike other modem protocol handlers like the ones implemented by uqmi
or umbim, in the modemmanager protocol handler the 'device' option
does not specify a device node in /dev. Therefore, we shouldn't flag
the option as 'device' type (dt_type_device).

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-27 09:28:10 +01:00
Aleksander Morgado
a684cdbab0 modemmanager: fix device unplug handling
When a USB modem device is unplugged, we had to do two different
things: first, cleanup the sysfs cache; and second, set interface as
unavailable.

Those two things were never being done properly due to several
different issues:

 * The parent sysfs path retrieval logic relies on checking for which
 sysfs path has the vid/pid files. This logic obviously only works
 when the device is available, and cannot be used on e.g. removal
 events.

 * The command to cleanup the modem wait status from the sysfs cache
 was not removing the previous state properly, because the sysfs path
 variable wasn't escaped properly for the sed command.

This patch handles those issues in order to have a proper device
removal handling, by making sure the sysfs path is properly escaped in
the sed command, and by introducing a new hotplug script that runs
when the full USB device is removed.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-27 09:28:10 +01:00
Aleksander Morgado
cc4ee2fd3c modemmanager: flag as available and no_device when initializing
Otherwise, if the modem is reseted, netifd will think that the device
is gone forever.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-27 09:28:10 +01:00
Aleksander Morgado
92781ecc7f modemmanager: add default proto configs
Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-27 09:28:10 +01:00
Aleksander Morgado
470fcc221b modemmanager: fix 'any' iptype setting
When the user requests 'any' as 'iptype', we may get either IPv4 or
IPv6 settings.

Simplify the logic by not requiring any explicit iptype before loading
the method reported by the bearer object for IPv4 and IPv6; just load
the methods right away and setup settings based on those.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-15 15:41:25 +01:00
Aleksander Morgado
859becef19 modemmanager: add IPv6/IPv4v6 support
Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-08 11:27:13 +01:00
Aleksander Morgado
fc47c47b39 modemmanager: add proto dynamic defaults on dhcp setup
Also, explicitly close the JSON object.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-07 10:01:39 +01:00
Aleksander Morgado
fa3f9542de modemmanager: add missing path for PID file
The procd based init setup uses a custom `pidfile` parameter, but the
used MODEMMANAGER_PID_FILE was not being defined anywhere.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-07 10:01:39 +01:00
Aleksander Morgado
35b93c81ff modemmanager: fix bearer disconnection logic
The bearer status wasn't being loaded in key/value mode, and therefore
would always fail to load the IPv4 config method.

Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
2019-11-07 10:01:39 +01:00
Nicholas Smith
180fb0d622 modemmanager: add ModemManager to packages
Signed-off-by: Nicholas Smith <nicholas.smith@telcoantennas.com.au>
2019-09-27 11:26:51 +10:00