Commit Graph
9081 Commits
Author SHA1 Message Date
Guido Günther 0e4bc1b6ea api: Add Cell Broadcast support
Add access to the modem's CellBroadcast interface and to fetch
Cell Broadcast messages.

Closes: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/253
Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01 21:41:10 +00:00
Guido Günther 60357247eb broadband-modem: Add Cell Broadcast implementation
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-01 21:41:10 +00:00
Guido Günther 62f7b76e8e cbm: Add CellBroadcast interface
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-01 21:41:10 +00:00
Guido Günther eedf78d662 part: fix indent 2024-12-01 21:41:10 +00:00
Guido Günther c69a64c0cb cbm: Add parsing bits for cell broadcast messages
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-01 21:41:10 +00:00
Guido Günther 8cb68e87d8 modem-helpers: Add regex to parse CBM out of the serial stream
This will allow us to fetch cell broadcast messages.

Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01 21:41:10 +00:00
Guido Günther 1fb74f266f data: Add a policy rule to access the cellbroadcast API
Allow access to cell broadcast functionality.

Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01 21:41:10 +00:00
Guido Günther a8c10c676e sms: Make sms_decode_text public
This can be used for cell broadcast messages as well

Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01 21:41:10 +00:00
Guido Günther ce8989182c cli: Fix indent
We indent with one space after }

Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01 21:41:10 +00:00
Guido Günther e627062674 cli: Fix copy/paste error in comment
We check call caps not messaging caps

Signed-off-by: Guido Günther <agx@sigxcpu.org>
2024-12-01 21:41:10 +00:00
Lorenzo Zolfanelli 2ca948f403 fcc-unlock: add fcc-unlock specs for new quectel variants
Add symlinks in `fcc-unlock.available.d` for new supported Quectel
variants:

- EM05-G: 2c7c:0313, 2c7c,0314

Fixes #858
2024-11-20 12:24:43 +00:00
Lukas Voegl 68e725d45e broadband-modem-cinterion: implement load_current_modes
Signed-off-by: Lukas Voegl <lvoegl@tdt.de>
2024-11-20 12:07:20 +00:00
Lukas Voegl 32435b430f broadband-modem-cinterion: never discard operator or mode
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-20 12:07:20 +00:00
Aleksander Morgado 3de6cca46d broadband-modem-qmi: don't build operator id in network reject indication if it's unknown 2024-11-20 12:56:57 +01:00
Aleksander Morgado b2d52001e4 broadband-modem-qmi: avoid conditional jump due to uninitialized variable in 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-20 12:56:48 +01:00
Dan Williams ed13e053cd port-probe: fix custom init probing not having open AT port
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: 7937a89a37 port-probe: rework and consolidate port probe flow for AT/QCDM/QMI/MBIM

Signed-off-by: Dan Williams <dan@ioncontrol.co>
2024-11-20 11:50:43 +00:00
Bolan Wang 1d43bb0dac plugin,mtk: workaround for invalid rssi threshold on FM350.
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-20 10:38:23 +00:00
Aleksander Morgado 87e1e8b2d4 shared-qmi: don't assume LOC assistance data servers is initialized once
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-12 18:21:25 +00:00
Daniele Palmas 3457df7df0 broadband-modem-telit: fix endless loop when enabling events in secondary port 2024-11-09 02:45:51 +00:00
Florian Eckert 33107894ee fibocom: add NL668-EAU to rules file
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-08 09:05:09 +01:00
Florian Eckert cf2fd4d2e1 fibocom: add additional USB_VID for NL668-EAU
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-11-08 09:04:38 +01:00
Aleksander Morgado 9a76a00095 broadband-modem: don't assert Modem interface skeleton during enabling
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-29 18:16:27 +00:00
Aleksander Morgado cb6a56fa0c quectel: fix crash when parsing +CTZU=? response
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-29 08:39:05 +00:00
Stig M. Baugstø 5056ee0d7b bearer-qmi: use QMI port to check for connection status polling
Signed-off-by: Stig M. Baugstø <1129097-stigma@users.noreply.gitlab.freedesktop.org>
2024-10-24 15:26:02 +02:00
Stig M. Baugstø 1050e7a49e simtech: disable QMI PCO for SIM7100E preventing delayed modem crash
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-24 15:23:32 +02:00
Stig M. Baugstø 0c167a5124 cellient: new generic plugin for Cellient modems with optional QMI
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-24 15:21:57 +02:00
Stig M. Baugstø 78508b7dce bearer-qmi: add udev device tag ID_MM_QMI_PCO_DISABLED to disable PCO
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-24 15:21:02 +02:00
Aleksander Morgado ea9438ab98 device: log vid:pid information at msg level
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-21 09:41:14 +00:00
Aleksander Morgado 6c1888f76c iface-modem-3gpp: fix crash when trying to set unknown power state
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-21 09:14:00 +00:00
Aleksander Morgado 891b1a41f9 plugin-manager: disallow port additions to an already cancelled device context
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-17 10:50:19 +00:00
Aleksander Morgado 7ec338dafe cinterion: fix propagating NULL GError
(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-17 09:11:11 +00:00
Aleksander Morgado edd9cc2e95 device: fix double free of the GDBusConnection
Fixes a16ad2757d
2024-10-16 23:45:22 +02:00
Aleksander Morgado 70e761d91c build: unstable release version bump to 1.23.12 2024-10-14 08:03:15 +00:00
Aleksander Morgado d1ed88638e api,enums: remove doc for undeclared enum value 2024-10-07 13:44:34 +00:00
Aleksander Morgado 1f828e3802 api: fix MM_BEARER_IP_FAMILY_ANY ABI break introduced in 1.20
The value was changed in commit 4ab2c80858 from
0xFFFFFFFF to 0xFFFFFFF7. Revert that ABI break.
2024-10-07 13:39:02 +00:00
Aleksander Morgado 0f2e86b2a6 docs: add missing references to sections file 2024-10-07 13:39:02 +00:00
Aleksander Morgado 80da775433 docs: add symbol indices for 1.22 and 1.24 2024-10-07 12:03:27 +00:00
Aleksander Morgado 93a57f0d3a docs: add 2024 as copyright year 2024-10-07 12:02:10 +00:00
Akula Susmitha f22d099f38 api,core,mmcli: Add new 'API' support to set-default-storage for SMS
API support has been added to set default storage for SMS.
Changes were made to get, set the deafult storage value.
2024-10-07 16:35:09 +05:30
Aleksander Morgado a63c300437 ublox: remove custom power operation synchronization logic
These are already synchronized at interface level, so there is already
a guarantee that they won't happen at the same time.
2024-09-30 11:07:20 +00:00
Aleksander Morgado 87dc3d36b4 quectel: remove custom power operation synchronization logic
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-30 11:07:19 +00:00
Aleksander Morgado a16ad2757d device: don't attempt to export if bus connection has been lost
E.g. if aborting the initialization sequence.
2024-09-30 11:07:18 +00:00
Aleksander Morgado dfc0f8ebfd base-modem: override disable operations done before modem object removal
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-30 11:07:11 +00:00
Aleksander Morgado 0aef4c422f base-modem: new 'override' operation lock type
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-30 11:07:05 +00:00
Aleksander Morgado 3510ffc418 iface-[modem|modem3gpp]: operation lock in all operations that change state
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-30 11:07:02 +00:00
Aleksander Morgado be668462c0 base-modem: synchronize initialize/enable/disable/sync operations
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-30 07:55:05 +00:00
Aleksander Morgado 8e0cbd9c94 base-modem: remove support for parallel enable/disable operations
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-30 07:55:05 +00:00
Aleksander Morgado a24a6ee4c5 base-modem: add setup to allow exclusive operations
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-30 07:54:56 +00:00
Aleksander Morgado 8e8e88b75d broadband-modem: update modem state before disabling task is completed
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.
2024-09-30 07:51:53 +00:00
Aleksander Morgado 17929188d8 broadband-modem: update modem state before enabling task is completed
The modem state property update was happening at enabling task context
free time, after the actual task completion has happened. Due to this,
scheduling a new enable request right after finishing one would end up
with the logic asserting, as the new enable operation would be
scheduled while the modem was still reporting "enabling" state.

  ModemManager[7673]: <inf> [1722359278.131123] [modem0] processing user request to enable modem...
  **
  ERROR:../src/mm-broadband-modem.c:12487:enable: code should not be reached
  Bail out! ERROR:../src/mm-broadband-modem.c:12487:enable: code should not be reached
  Aborted
2024-09-30 07:51:53 +00:00