aboutsummaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
2025-02-03broadband-modem: exit with error if enable() while in unknown stateAleksander Morgado
We should not assert if the modem is flagged as invalid but an outstanding enabling request is processed. Let's exit gracefully and let the object get properly disposed afterwards. (libc.so.6 - pthread_kill.c: 44) __pthread_kill_implementation (libc.so.6 - raise.c: 26) raise (libc.so.6 - abort.c: 79) abort (libglib-2.0.so.0 - gtestutils.c: 3450) g_assertion_message (libglib-2.0.so.0 - gtestutils.c: 3476) g_assertion_message_expr (ModemManager - mm-broadband-modem.c) enable (ModemManager - mm-iface-modem.c: 2340) handle_enable_auth_ready (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now (libgio-2.0.so.0 - gtask.c: 1378) g_task_return (ModemManager - mm-base-modem.c: 2011) lock_after_authorize_ready (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now (libgio-2.0.so.0 - gtask.c: 1378) g_task_return (ModemManager - mm-base-modem.c: 1841) base_modem_operation_run (ModemManager - mm-base-modem.c: 764) state_operation_ready (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now (libgio-2.0.so.0 - gtask.c: 1323) complete_in_idle_cb (libglib-2.0.so.0 - gmain.c: 3460) g_main_dispatch (libglib-2.0.so.0 - gmain.c: 4200) g_main_context_dispatch (libglib-2.0.so.0 - gmain.c: 4276) g_main_context_iterate (libglib-2.0.so.0 - gmain.c: 4479) g_main_loop_run (ModemManager - main.c: 236) main (libc.so.6 - libc_start_call_main.h: 58) __libc_start_call_main (libc.so.6 - libc-start.c: 360) __libc_start_main_impl (ModemManager + 0x000b8850) _start
2025-01-31shared-telit: fix missing error initialization in load_revision_readyDaniele Palmas
Closes #953
2025-01-23broadband-modem-qmi: separate "system info" and "serving system" indications ↵Valentin Blot
registration Some modems succeed on enabling "system info" and disabling "serving system" in one transaction, even though they don't support "system info". This commit separates the two: first, try to enable "system info", and if it succeeds then disable "serving system".
2025-01-22suspend: support logind not sending PrepareForSleep(true)Arnav Singh
elogind sends PrepareForSleep(false) when resuming but doesn't necessarily send PrepareForSleep(true) when sleeping. This means we didn't necessarily drop our previous inhibitor when it's time to take a new one. So instead of asserting that we dropped our previous inhibitor, just reuse it.
2025-01-17modem-helpers: fix gsize formatLukas Voegl
2024-12-27port-probe: add some QCDM/DIAG response bytes to non-AT responsesDan Williams
Seen on a Qualcomm-based Quectel EG915Q on the diag port: ModemManager[34547]: <dbg> [1732077670.330527] [ttyUSB0/at] <-- ' \0\0\0\8\0\0\0\2\0\0\0\0`%\160$"\6\169\128\200\1\30\197\142\0G\184\225\128\0\1+\127\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254\255\255\255\255\255\255\255\254' Signed-off-by: Dan Williams <dan@ioncontrol.co>
2024-12-27port-probe: explicit close port stepsAleksander Morgado
If by any chance the same ports needs to go through AT and QMI/MBIM probing, make sure the serial port created during AT probing is closed before starting the QMI/MBIM probing.
2024-12-27port-probe: only run custom init on ports that will go through AT probingAleksander Morgado
2024-12-27port-probe: rename serial_probe->probeAleksander Morgado
2024-12-23port-serial: clean up whitespace formattingDan Williams
Remove stray tabs. Signed-off-by: Dan Williams <dan@ioncontrol.co>
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-12-09Netprisma:Add support for more USB devicesMank Wang
2024-12-01broadband-modem: Add Cell Broadcast implementationGuido Günther
The CBMs are read via unsolicted events for which we register an event handler. We don't enable unsolicted events explicitly as this already happens via the `+CNMI=*,*,2,*,*` whens setting up unsolicted events in `modem_messaging_enable_unsolicited_events` (ETSI TS 127 005).
2024-12-01cbm: Add CellBroadcast interfaceGuido Günther
This adds support for the Cell Broadcast interface allowing to receive, list, read and delete Cell Broadcast messages via the org.freedesktop.ModemManager1.Modem.CellBroadcast and org.freedesktop.ModemManager1.Cbm interfaces. Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01part: fix indentGuido Günther
2024-12-01cbm: Add parsing bits for cell broadcast messagesGuido Günther
This allows to parse the CBMs parameters like channel, part number and message text. We parse uncompressed GSM7 and UCS2 encodings as described in 3GPP TS 23.038. Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01modem-helpers: Add regex to parse CBM out of the serial streamGuido Günther
This will allow us to fetch cell broadcast messages. Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01sms: Make sms_decode_text publicGuido Günther
This can be used for cell broadcast messages as well Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-11-20broadband-modem-cinterion: implement load_current_modesLukas Voegl
Signed-off-by: Lukas Voegl <lvoegl@tdt.de>
2024-11-20broadband-modem-cinterion: never discard operator or modeLukas Voegl
When setting an operator, AT+COPS overwrites the currently set allowed mode. Equally, the other way around, when setting the current mode, the configured operator is overwritten. Signed-off-by: Lukas Voegl <lvoegl@tdt.de>
2024-11-20broadband-modem-qmi: don't build operator id in network reject indication if ↵Aleksander Morgado
it's unknown
2024-11-20broadband-modem-qmi: avoid conditional jump due to uninitialized variable in ↵Aleksander Morgado
network reject indications ==3851== Conditional jump or move depends on uninitialised value(s) ==3851== at 0x23CF65: network_reject_indication_cb (mm-broadband-modem-qmi.c:5434) ==3851== by 0x4D00865: g_cclosure_marshal_VOID__BOXEDv (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7200.4) ==3851== by 0x4D196FF: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7200.4) ==3851== by 0x4D19862: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7200.4) ==3851== by 0x4F7C250: process_indication (qmi-nas.c:70290) ==3851== by 0x4DFA6C4: __qmi_client_process_indication (qmi-client.c:172) ==3851== by 0x4DFEE2D: process_indication_idle (qmi-device.c:1697) ==3851== by 0x4A26C43: g_main_context_dispatch (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7200.4) ==3851== by 0x4A7C2B7: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7200.4) ==3851== by 0x4A262B2: g_main_loop_run (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7200.4) ==3851== by 0x178042: main (main.c:236) Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/931
2024-11-20port-probe: fix custom init probing not having open AT portDan Williams
Referenced commit broke custom init flows because the AT port was not opened when custom inits were run, which was the case before the commit landed. Rework probing flow to follow a step model like much of our other code, and ensure that the AT port is opened as part of the custom init flow. Fixes: 7937a89a37e941e9a77cddcce8226c316fe70821 port-probe: rework and consolidate port probe flow for AT/QCDM/QMI/MBIM Signed-off-by: Dan Williams <dan@ioncontrol.co>
2024-11-20plugin,mtk: workaround for invalid rssi threshold on FM350.Bolan Wang
FM350 modems report an invalid rssi threshold (always 0) in the signal-state response message. It results in signal quality not being updated. We can use this patch to workaround this bug.
2024-11-12shared-qmi: don't assume LOC assistance data servers is initialized onceAleksander Morgado
0x00007bcb78abf8b4 (libglib-2.0.so.0 -gtestutils.c:3450) ??g_assertion_message 0x00007bcb78abf928 (libglib-2.0.so.0 -gtestutils.c:3476) ??g_assertion_message_expr 0x00005594f143b221 (ModemManager -mm-shared-qmi.c:6651) loc_location_get_predicted_orbits_data_source_indication_cb 0x00007bcb78866043 (libgobject-2.0.so.0 -gmarshal.c:1686) ??g_cclosure_marshal_VOID__BOXEDv 0x00007bcb7886338b (libgobject-2.0.so.0 -gclosure.c:895) _g_closure_invoke_va 0x00007bcb78878a10 (libgobject-2.0.so.0 -gsignal.c:3472) ??g_signal_emit_valist 0x00007bcb78879486 (libgobject-2.0.so.0 -gsignal.c:3622) ??g_signal_emit 0x00007bcb785acc70 (libqmi-glib.so.5 -qmi-loc.c:16976) process_indication 0x00007bcb78520ede (libqmi-glib.so.5 -qmi-device.c:1697) process_indication_idle 0x00007bcb78a9b75c (libglib-2.0.so.0 -gmain.c:3460) ??g_main_dispatch 0x00007bcb78a9b75c (libglib-2.0.so.0 -gmain.c:4200) ??g_main_context_dispatch 0x00007bcb78a9ba81 (libglib-2.0.so.0 -gmain.c:4276) g_main_context_iterate 0x00007bcb78a9bcff (libglib-2.0.so.0 -gmain.c:4479) ??g_main_loop_run 0x00005594f13a7463 (ModemManager -main.c:236) ??main 0x00007bcb7825c705 (libc.so.6 -libc_start_call_main.h:58) ??__libc_start_call_main 0x00007bcb7825c7c1 (libc.so.6 -libc-start.c:360) ??__libc_start_main_impl 0x00005594f13a6da0 (ModemManager + 0x000b5da0) ??_start
2024-11-09broadband-modem-telit: fix endless loop when enabling events in secondary portDaniele Palmas
2024-11-08fibocom: add NL668-EAU to rules fileFlorian Eckert
The NL668-EAU is a 4G, 3G, 2G CAT4 modem from fibocom. https://www.fibocom.com/en/products/LTECat-NL668-EAU.html Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2024-11-08fibocom: add additional USB_VID for NL668-EAUFlorian Eckert
The NL668-EAU 4G, 3G, 2G CAT4 is a modem from fibocom and is using a diffrent USB_VID for this modem. By adding the new USB_VID, the 'fibocom' plugin is now responsible and not the 'generic' plugin. Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2024-10-29broadband-modem: don't assert Modem interface skeleton during enablingAleksander Morgado
There is no guarantee that during an enabling operation the skeleton for the Modem interface unconditionally exists, e.g. the modem may have been flagged as invalid and untracked from DBus during the operation. Just remove the assertion, because mm_iface_modem_enable() will already cleanly fail if the skeleton object is not found. Thread 0 (crashed), 0 libc.so.6!__pthread_kill_implementation [pthread_kill.c : 44 + 0x0], 1 libc.so.6!raise [raise.c : 26 + 0xb], 2 libc.so.6!abort [abort.c : 79 + 0xa], 3 libglib-2.0.so.0!g_assertion_message [gtestutils.c : 3450 + 0x5], 4 libglib-2.0.so.0!g_assertion_message_expr [gtestutils.c : 3476 + 0x14], 5 ModemManager!enabling_step [mm-broadband-modem.c : 0 + 0x7], 6 libgio-2.0.so.0!g_task_return_now [gtask.c : 1309 + 0x5], 7 libgio-2.0.so.0!g_task_return [gtask.c : 1378 + 0x8], 8 ModemManager!parent_enabling_started_ready [mm-broadband-modem-mbim.c : 3239 + 0xd], 9 libgio-2.0.so.0!g_task_return_now [gtask.c : 1309 + 0x5], 10 libgio-2.0.so.0!complete_in_idle_cb [gtask.c : 1323 + 0x5], 11 libglib-2.0.so.0!g_main_dispatch [gmain.c : 3460 + 0x2],
2024-10-29quectel: fix crash when parsing +CTZU=? responseAleksander Morgado
The logic should consider that mm_parse_uint_list() may return NULL without setting the output GError, in the case where an empty string is given. This should ideally be changed in the mm_parse_uint_list() itself, but that approach is not trivial as the method is being used in multiple different places. This change exclusively tries to solve this crash. 0x000057435d315eca (ModemManager - mm-shared-quectel.c: 1060) ctzu_test_ready 0x00007eea3d019e86 (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now 0x00007eea3d018e50 (libgio-2.0.so.0 - gtask.c: 1378) g_task_return 0x000057435d268eab (ModemManager - mm-base-modem-at.c: 544) at_command_ready 0x00007eea3d019e86 (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now 0x00007eea3d018e50 (libgio-2.0.so.0 - gtask.c: 1378) g_task_return 0x000057435d318a18 (ModemManager - mm-port-serial-at.c: 350) serial_command_ready 0x00007eea3d019e86 (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now 0x00007eea3d018e50 (libgio-2.0.so.0 - gtask.c: 1378) g_task_return 0x000057435d31c7bd (ModemManager - mm-port-serial.c: 734) port_serial_got_response 0x000057435d31cc3e (ModemManager - mm-port-serial.c: 911) parse_response_buffer 0x000057435d31cc3e (ModemManager - mm-port-serial.c: 1028) common_input_available 0x00007eea3d16591b (libglib-2.0.so.0 - gmain.c: 3460) g_main_dispatch 0x00007eea3d16591b (libglib-2.0.so.0 - gmain.c: 4200) g_main_context_dispatch 0x00007eea3d165c37 (libglib-2.0.so.0 - gmain.c: 4276) g_main_context_iterate 0x00007eea3d165eb5 (libglib-2.0.so.0 - gmain.c: 4479) g_main_loop_run 0x000057435d25f5bf (ModemManager - main.c: 236) main 0x00007eea3c980705 (libc.so.6 - libc_start_call_main.h: 58) __libc_start_call_main 0x00007eea3c9807c1 (libc.so.6 - libc-start.c: 360) __libc_start_main_impl 0x000057435d25ef10 (ModemManager + 0x000b3f10) _start 0x00007ffcc0b5d517
2024-10-24bearer-qmi: use QMI port to check for connection status pollingStig M. Baugstø
Signed-off-by: Stig M. Baugstø <1129097-stigma@users.noreply.gitlab.freedesktop.org>
2024-10-24simtech: disable QMI PCO for SIM7100E preventing delayed modem crashStig M. Baugstø
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/884 Signed-off-by: Stig M. Baugstø <1129097-stigma@users.noreply.gitlab.freedesktop.org>
2024-10-24cellient: new generic plugin for Cellient modems with optional QMIStig M. Baugstø
Simple plugin handling Cellient (vid 0x2692) modems. Optional QMI through the WITH_QMI compile flag. Disables QMI WDS PCO for the Qualcomm-branded MPL200 by setting the ID_MM_QMI_PCO_DISABLED udev tag, effectively preventing a modem crash. Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/842 Signed-off-by: Stig M. Baugstø <1129097-stigma@users.noreply.gitlab.freedesktop.org>
2024-10-24bearer-qmi: add udev device tag ID_MM_QMI_PCO_DISABLED to disable PCOStig M. Baugstø
Some modems like the Qualcomm-based Cellient MPL200 and SimTech SIM7100E will crash some time after requesting operator reserved PCO. The new udev tag ID_MM_QMI_PCO_DISABLED disables the PCO settings request when set, indirectly disabling PCO. Signed-off-by: Stig M. Baugstø <1129097-stigma@users.noreply.gitlab.freedesktop.org>
2024-10-21device: log vid:pid information at msg levelAleksander Morgado
The vid:pid information of a given device is useful information, especially when analyzing user provided logs. This change makes the vid:pid information be included at msg level in the same message that reports the plugin in use. It also removes some redundant messages.
2024-10-21iface-modem-3gpp: fix crash when trying to set unknown power stateAleksander Morgado
Certain QMI-based USB modems will report an "unknown" power state upon boot, before our first attempt to set one: $ sudo qmicli --dms-get-operating-mode -d /dev/cdc-wdm0 -p [/dev/cdc-wdm0] Operating mode retrieved: Mode: 'unknown' HW restricted: 'no' Due to this, the logic trying to recover the previous power state during an attach settings update would end up asserting: [modem3] set initial EPS bearer settings state (3/5): recover previous power state ** ERROR:../src/mm-iface-modem.c:4554:mm_iface_modem_set_power_state: code should not be reached Bail out! ERROR:../src/mm-iface-modem.c:4554:mm_iface_modem_set_power_state: code should not be reached Aborted This is a rare case, and instead of handling it in the QMI specific implementation, we can try to fix it in a safer way directly in the logic that handles the attach settings update. If we ever detect that the reported power state is "unknown", we will default it to "on" while emitting a warning.
2024-10-17plugin-manager: disallow port additions to an already cancelled device contextAleksander Morgado
If the DeviceContext is cancelled, we remove it from the list of tracked DeviceContexts in the MMPluginManager, so that new port additions happening at the same time don't end up being added to it. This should allow an early cancellation of the DeviceContext without asserting on g_assert (!device_context->extra_probing_time_id) as there is no chance that a new port addition has reseted the extra probing time timeout. 0x00007c1154f16abf (libc.so.6 - pthread_kill.c: 44) __pthread_kill_implementation 0x00007c1154ecbf0c (libc.so.6 - raise.c: 26) raise 0x00007c1154eb74aa (libc.so.6 - abort.c: 79) abort 0x00007c11556c08a9 (libglib-2.0.so.0 - gtestutils.c: 3450) g_assertion_message 0x00007c11556c091d (libglib-2.0.so.0 - gtestutils.c: 3476) g_assertion_message_expr 0x00005897d1ed6e7b (ModemManager - mm-plugin-manager.c: 805) device_context_unref 0x00005897d1ed6ab9 (ModemManager - mm-plugin-manager.c: 163) common_async_context_free 0x00005897d1ed5dd6 (ModemManager - mm-plugin-manager.c: 1136) port_context_run_ready 0x00007c1155550e86 (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now 0x00007c115554fe50 (libgio-2.0.so.0 - gtask.c: 1378) g_task_return 0x00007c115555047b (libgio-2.0.so.0 - gtask.c: 2022) g_task_return_new_error 0x00005897d1ed581a (ModemManager - mm-plugin-manager.c: 296) port_context_complete 0x00005897d1ed6259 (ModemManager - mm-plugin-manager.c) plugin_supports_port_ready 0x00007c1155550e86 (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now 0x00007c1155550eb9 (libgio-2.0.so.0 - gtask.c: 1323) complete_in_idle_cb 0x00007c115569c91b (libglib-2.0.so.0 - gmain.c: 3460) g_main_dispatch 0x00007c115569c91b (libglib-2.0.so.0 - gmain.c: 4200) g_main_context_dispatch 0x00007c115569cc37 (libglib-2.0.so.0 - gmain.c: 4276) g_main_context_iterate 0x00007c115569ceb5 (libglib-2.0.so.0 - gmain.c: 4479) g_main_loop_run 0x00005897d1e715bf (ModemManager - main.c: 236) main 0x00007c1154eb7705 (libc.so.6 - libc_start_call_main.h: 58) __libc_start_call_main 0x00007c1154eb77c1 (libc.so.6 - libc-start.c: 360) __libc_start_main_impl 0x00005897d1e70f10 (ModemManager + 0x000b3f10) _start 0x00007ffd5acc5057 Manually reproducing this issue was challenging, so adding here the steps taken, for reference. This is with ModemManager running with --no-udev (i.e. port additions reported via mmcli). The key to reproduce the problem is the different timing between the port additions and removals of the three ttyACM ports. COUNT=1 while ((COUNT < 10000)); do echo "$COUNT..." COUNT=$((COUNT + 1)) ( sudo mmcli --report-kernel-event="name=ttyACM0,subsystem=tty,action=add" TIMEOUT="0.0$(((RANDOM % 10) + 1))" sleep $TIMEOUT sudo mmcli --report-kernel-event="name=ttyACM0,subsystem=tty,action=remove" ) & ( sudo mmcli --report-kernel-event="name=ttyACM1,subsystem=tty,action=add" TIMEOUT="0.0$(((RANDOM % 10) + 1))" sleep $TIMEOUT sudo mmcli --report-kernel-event="name=ttyACM1,subsystem=tty,action=remove" ) & ( sudo mmcli --report-kernel-event="name=ttyACM2,subsystem=tty,action=add" TIMEOUT="0.0$(((RANDOM % 10) + 1))" sleep $TIMEOUT sudo mmcli --report-kernel-event="name=ttyACM2,subsystem=tty,action=remove" ) & TIMEOUT="0.0$(((RANDOM % 10) + 1))" sleep $TIMEOUT COUNT=$((COUNT + 1)) done
2024-10-17cinterion: fix propagating NULL GErrorAleksander Morgado
(ModemManager:2925): GLib-CRITICAL **: 09:21:32.082: g_propagate_error: assertion 'src != NULL' failed (ModemManager:2925): GLib-GIO-CRITICAL **: 09:21:32.083: g_task_return_error: assertion 'error != NULL' failed` Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/916
2024-10-16device: fix double free of the GDBusConnectionAleksander Morgado
Fixes a16ad2757dc5c9b94aeb0e4276a4eb3d0007a729
2024-10-07api,core,mmcli: Add new 'API' support to set-default-storage for SMSAkula Susmitha
API support has been added to set default storage for SMS. Changes were made to get, set the deafult storage value.
2024-09-30ublox: remove custom power operation synchronization logicAleksander Morgado
These are already synchronized at interface level, so there is already a guarantee that they won't happen at the same time.
2024-09-30quectel: remove custom power operation synchronization logicAleksander Morgado
The power up and down operations are already synchronized at interface level, so there is already a guarantee that they won't happen at the same time. For the reset and power off operations, it is assumed that the modem will either reset or power off, so there should be no need to sync those operations with others, as the modem object will eventually go away altogether in both cases.
2024-09-30device: don't attempt to export if bus connection has been lostAleksander Morgado
E.g. if aborting the initialization sequence.
2024-09-30base-modem: override disable operations done before modem object removalAleksander Morgado
If we are going to inhibit the modem or fully reprobe it after a SIM switch event, we should forbid further operations done with the modem object. This logic can be tested by queing different operations one after the other, and then adding a last device inhibition ("override" operation) that should trigger the early abort of all non-running operations, e.g.: mmcli -m a -e & sleep 0.2 mmcli -m a --3gpp-set-initial-eps-bearer-settings="apn=internet,ip-type=ipv4v6,force=true" & sleep 0.2 mmcli -m a -d & sleep 0.2 mmcli -m a -e & sleep 0.2 mmcli -m a --set-power-state-low & sleep 0.2 mmcli -m a -e & sleep 0.2 mmcli -m a --inhibit This previous sequence produces MM logs as follows: <dbg> [1726567756.430308] [modem0] [operation 22] default - enable: scheduled <dbg> [1726567756.430806] [modem0] [operation 22] default - enable: lock acquired <dbg> [1726567756.623746] [modem0] [operation 23] default - set-initial-eps-bearer-settings: scheduled <dbg> [1726567756.751743] [modem0] [operation 22] default - enable: lock released <dbg> [1726567756.752027] [modem0] [operation 23] default - set-initial-eps-bearer-settings: lock acquired <dbg> [1726567756.823739] [modem0] [operation 24] default - disable: scheduled <dbg> [1726567757.049581] [modem0] [operation 25] default - enable: scheduled <dbg> [1726567757.250165] [modem0] [operation 26] default - set-power-state: scheduled <dbg> [1726567757.450518] [modem0] [operation 27] default - enable: scheduled <dbg> [1726567757.676362] [modem0] [operation 28] override - disabling: override requested - no new operations will be allowed <dbg> [1726567757.678792] [modem0] [operation 24] default - disable: aborted early <dbg> [1726567757.679866] [modem0] [operation 25] default - enable: aborted early <dbg> [1726567757.680157] [modem0] [operation 26] default - set-power-state: aborted early <dbg> [1726567757.680496] [modem0] [operation 27] default - enable: aborted early <dbg> [1726567759.695780] [modem0] [operation 23] default - set-initial-eps-bearer-settings: lock released <dbg> [1726567759.695935] [modem0] [operation 28] override - disabling: lock acquired <dbg> [1726567759.872196] [modem0] [operation 28] override - disabling: lock released
2024-09-30base-modem: new 'override' operation lock typeAleksander Morgado
If a request to lock the operation with the override type arrives, all pending operations will be immediately cancelled, and no new lock requests will be allowed.
2024-09-30iface-[modem|modem3gpp]: operation lock in all operations that change stateAleksander Morgado
This logic can be tested by queing different operations one after the other, e.g.: mmcli -m a -e & sleep 0.2 mmcli -m a --3gpp-set-initial-eps-bearer-settings="apn=internet,ip-type=ipv4v6,force=true" & sleep 0.2 mmcli -m a -d & sleep 0.2 mmcli -m a -e & sleep 0.2 mmcli -m a --set-power-state-low & sleep 0.2 mmcli -m a -e & This previous sequence produces MM logs as follows: <dbg> [1726567176.214906] [modem0] [operation 15] default - enable: scheduled <dbg> [1726567176.215108] [modem0] [operation 15] default - enable: lock acquired <dbg> [1726567176.436234] [modem0] [operation 16] default - set-initial-eps-bearer-settings: scheduled <dbg> [1726567176.554153] [modem0] [operation 15] default - enable: lock released <dbg> [1726567176.554492] [modem0] [operation 16] default - set-initial-eps-bearer-settings: lock acquired <dbg> [1726567176.619021] [modem0] [operation 17] default - disable: scheduled <dbg> [1726567176.840024] [modem0] [operation 18] default - enable: scheduled <dbg> [1726567177.037155] [modem0] [operation 19] default - set-power-state: scheduled <dbg> [1726567177.240225] [modem0] [operation 20] default - enable: scheduled <dbg> [1726567179.496397] [modem0] [operation 16] default - set-initial-eps-bearer-settings: lock released <dbg> [1726567179.496576] [modem0] [operation 17] default - disable: lock acquired <dbg> [1726567179.672141] [modem0] [operation 17] default - disable: lock released <dbg> [1726567179.672658] [modem0] [operation 18] default - enable: lock acquired <dbg> [1726567179.938481] [modem0] [operation 18] default - enable: lock released <dbg> [1726567179.940470] [modem0] [operation 19] default - set-power-state: lock acquired <dbg> [1726567182.147894] [modem0] [operation 19] default - set-power-state: lock released <dbg> [1726567182.148041] [modem0] [operation 20] default - enable: lock acquired <dbg> [1726567184.494469] [modem0] [operation 20] default - enable: lock released iface-modem-3gpp: operation lock in all operations that change state
2024-09-30base-modem: synchronize initialize/enable/disable/sync operationsAleksander Morgado
Each of these now holds an exclusive lock, so all these operations are synchronized. This logic can be tested by queing different enable/disable operations one after the other, e.g.: mmcli -m a -d & --> Disable 1 sleep 0.2 mmcli -m a -e & --> Enable 1 sleep 0.2 mmcli -m a -e & --> Enable 2 sleep 0.2 mmcli -m a -d & --> Disable 2 sleep 0.2 mmcli -m a -e & --> Enable 3 sleep 0.2 mmcli -m a -d & --> Disable 3 This previous sequence produces MM logs as follows: <dbg> [1726566352.936025] [modem0] [operation 9] default - disable: scheduled --> Disable 1 requested <dbg> [1726566352.936399] [modem0] [operation 9] default - disable: lock acquired --> Disable 1 started <dbg> [1726566353.136445] [modem0] [operation 10] default - enable: scheduled --> Enable 1 requested <dbg> [1726566353.202980] [modem0] [operation 9] default - disable: lock released --> Disable 1 finished <dbg> [1726566353.203526] [modem0] [operation 10] default - enable: lock acquired --> Enable 1 started <dbg> [1726566353.320057] [modem0] [operation 11] default - enable: scheduled --> Enable 2 requested <dbg> [1726566353.440931] [modem0] [operation 10] default - enable: lock released --> Enable 1 finished <dbg> [1726566353.443238] [modem0] [operation 11] default - enable: lock acquired --> Enable 2 started <dbg> [1726566353.452984] [modem0] [operation 11] default - enable: lock released --> Enable 2 finished <dbg> [1726566353.517512] [modem0] [operation 12] default - disable: scheduled --> Disable 2 requested <dbg> [1726566353.517699] [modem0] [operation 12] default - disable: lock acquired --> Disable 2 started <dbg> [1726566353.688695] [modem0] [operation 12] default - disable: lock released --> Disable 2 finished <dbg> [1726566353.718237] [modem0] [operation 13] default - enable: scheduled --> Enable 3 requested <dbg> [1726566353.718417] [modem0] [operation 13] default - enable: lock acquired --> Enable 3 started <dbg> [1726566353.937122] [modem0] [operation 14] default - disable: scheduled --> Disable 3 requested <dbg> [1726566353.970791] [modem0] [operation 13] default - enable: lock released --> Enable 3 finished <dbg> [1726566353.970964] [modem0] [operation 14] default - disable: lock acquired --> Disable 3 started <dbg> [1726566354.170938] [modem0] [operation 14] default - disable: lock released --> Disable 3 finished
2024-09-30base-modem: remove support for parallel enable/disable operationsAleksander Morgado
Follow up changes will introduce support to run exclusive enable and disable operations, effectively ensuring that only one enabling or disabling task is processed at any given time, so the support for completing parallel operations with the same result is no longer needed. That logic was anyway flawed, as it did not consider complex cases like a disable request received between two enable requests, the order of incoming requests was not maintained. The main reason for adding the parallel enable/disable operation logic was for the case where 2 separate users tried to enable the modem at the same time. In that case, we did not want to run 2 separate enabling operations from scratch, and completing one would complete the second one as well. With the new operation lock logic, the same result is achieved, as the 2nd enabling operation would find the modem already enabled, if the 1st one succeeded. This removal is done before introducing the new exclusive operation support in the enable/disable path in order to make it easier and more consistent with other operations that will also be included in the synchronization.
2024-09-30base-modem: add setup to allow exclusive operationsAleksander Morgado
There are certain operations that cannot be run in parallel, e.g. one should not disable and bring the modem to low power mode while there are also incoming requests to enable the modem. This type of errors will typically happen when multiple DBus clients are trying to use the same modem at the same time for different purposes. We do not have any way to have DBus clients take exclusive ownership of a given modem object, so the best we can do for now is trying to synchronize operations that cannot be run together, preserving the order in which they arrived, and running them one by one.
2024-09-30broadband-modem: update modem state before disabling task is completedAleksander Morgado
The modem state property update was happening at disabling task context free time, after the actual task completion has happened. Avoid wrong assumptions on the modem state value in operations scheduled after the task completion, in the same way as done in the enabling sequence.