Commit Graph
3658 Commits
Author SHA1 Message Date
Aleksander Morgado 7a398214f9 iface-modem-simple: clear ongoing connect cancellable on early errors
If the Simple.Connect() operation fails before the bearer connection
process starts (e.g. during the previous SIM-PIN checks or explicit
registration attempt), the ongoing connect cancellable is not being
properly cleared, and this would prevent additional new connection
attempts unless an explicit Simple.Disconnect() is called.

    $ sudo mmcli -m 1 --simple-connect="operator-id=21403,apn=internet"
    error: couldn't connect the modem: 'GDBus.Error:org.freedesktop.ModemManager1.Error.MobileEquipment.NetworkTimeout: Network timeout'
    $ sudo mmcli -m 1 --simple-connect="operator-id=21403,apn=internet"
    error: couldn't connect the modem: 'GDBus.Error:org.freedesktop.ModemManager1.Error.Core.InProgress: Connection request forbidden: operation already in progress'
    $ sudo mmcli -m 1 --simple-connect="operator-id=21403,apn=internet"
    error: couldn't connect the modem: 'GDBus.Error:org.freedesktop.ModemManager1.Error.Core.InProgress: Connection request forbidden: operation already in progress'

Fix this, by making sure the ongoing connect cancellable is always
cleared when completing the DBus method invocation that created it.

Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/169
2019-12-21 09:53:06 +01:00
Aleksander Morgado d83c018f98 core,tests: new test to make sure all error codes are supported
Defining the new error codes in the headers is not enough, we also
need to add support in the error helpers in order to create proper
GErrors with the expected error codes.
2019-12-17 10:52:13 +01:00
Aleksander Morgado 9991f2906f core,error-helpers: add missing ME error codes 2019-12-17 10:52:13 +01:00
Aleksander Morgado ab00796009 base-bearer: avoid conncheck or stats update while disconnecting
We don't want the connection status checks to interfere with the
disconnection logic, e.g. if they're both using the same TTY for both
things.

E.g. the CGACT? from the conncheck gets in the way of the
disconnection logic:

    <debug> [1576037519.710684] Flashing data port (ttyUSB1)...
    <debug> [1576037519.710740] (ttyUSB1): port attributes not fully set
    <debug> [1576037520.287636] (ttyUSB1) device open count is 3 (open)
    <debug> [1576037520.287804] (ttyUSB1): --> 'AT+CGACT?<CR>'
    <debug> [1576037520.711067] (ttyUSB1) device open count is 2 (close)
    <debug> [1576037520.711127] (ttyUSB1): running init sequence...
    <debug> [1576037520.711231] PDP disconnection already sent
    <debug> [1576037520.711263] Disconnected bearer '/org/freedesktop/ModemManager1/Bearer/0'

Instead, fully skip all conncheck and stat updates as long as the
modem is not connected. The actual conncheck and stat update timeouts
will be removed once completely disconnected, as it was before.
2019-12-16 16:34:50 +00:00
Aleksander Morgado 5f0f2cb9d9 base-call: do not require primary port to start a call
If the modem is connected using the primary port, we can just rely on
the secondary port.

    # mmcli --call 0 --start
    error: couldn't start the call: 'GDBus.Error:org.freedesktop.ModemManager1.Error.Core.Connected: Cannot run sequence: port is connected'
2019-12-05 15:45:38 +01:00
Aleksander Morgado 0660b6b162 broadband-modem: trivial fix in logging +CLIP setting 2019-12-04 10:10:39 +01:00
Aleksander Morgado 28869463a1 iface-modem: allow Command() while in Failed state
Allow the generic command API while in FAILED state, in case the modem
integrator has some special commands to recover the device.

Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/163
2019-12-03 09:20:24 +00:00
Aleksander Morgado 03e6375a95 bearer-qmi: current settings are mandatory when using 'static' addressing
If for any reason getting current settings fails and we require static
IP addressing (when using raw-ip), then that must be a hard error,
otherwise we'll end up with the modem reported as connected but
without any IP settings to use:

 <info>  error: couldn't get current settings: QMI protocol error (15): 'OutOfCall'
 <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (registered -> connected)
 <info>  Simple connect state (8/8): All done
 <warn>  Reloading stats failed: Couldn't get packet statistics: QMI protocol error (15): 'OutOfCall'

  # mmcli -b 0
  Bearer '/org/freedesktop/ModemManager1/Bearer/0'
    -------------------------
    Status             |   connected: 'yes'
                       |   suspended: 'no'
                       |   interface: 'wwan1'
                       |  IP timeout: '20'
    -------------------------
    Properties         |         apn: 'm2minternet'
                       |     roaming: 'allowed'
                       |     IP type: 'none'
                       |        user: 'none'
                       |    password: 'none'
                       |      number: 'none'
                       | Rm protocol: 'unknown'
    -------------------------
    IPv4 configuration |   method: 'unknown'
    -------------------------
    IPv6 configuration |   method: 'unknown'
    -------------------------
    Stats              |          Duration: '0'
                       |    Bytes received: 'N/A'
                       | Bytes transmitted: 'N/A'

  # mmcli -m 0

  /org/freedesktop/ModemManager1/Modem/0 (device id '48f6c35f3d0376aa261a91c0cf7e6340d5a91601')
    ...
    Status   |           lock: 'sim-pin2'
             | unlock retries: 'sim-pin (3), sim-pin2 (3), sim-puk (10), sim-puk2 (10)'
             |          state: 'connected'
             |    power state: 'on'
             |    access tech: 'lte'
             | signal quality: '96' (recent)
2019-12-03 08:56:47 +00:00
Aleksander Morgado 76cafbb603 bearer: avoid reporting disconnection error if already disconnected
When we try to disconnect a bearer and the bearer is already
disconnected (e.g. after a cancelled connection attempt), avoid reporting
that as an error:

  <warn>  [1575287560.433398] Error disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0': 'Couldn't disconnect QMI bearer: this bearer is not connected'. Will assume disconnected anyway.
2019-12-03 08:56:47 +00:00
Aleksander Morgado 991e615736 bearer-qmi: handle disconnection indications during connection attempts
If a WDS indication is received telling us that the modem is no longer
connected, abort the ongoing connection attempt right away with an
error and cleanup all allocated clients (implicitly disconnecting them
if required)..

Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/155
2019-12-03 08:56:47 +00:00
Aleksander Morgado ae53b0458b bearer-qmi: common complete method for the connection attempt
Refactor the logic and setup a common complete_connect() method that
helps us complete the GTask associated to the connection attempt.
2019-12-03 08:56:47 +00:00
Aleksander Morgado 2790074c7e bearer-qmi: close QMI port if it was open during connection
If the bearer is using a QMI port that is not the primary one, we need
to explicitly open it during the connection attempt. Keep track of
that, and make sure we close it during normal disconnection or if the
connection attempt fails.
2019-12-03 08:56:47 +00:00
Aleksander Morgado 2bcd1e4271 iface-modem-cdma: don't allow multiple concurrent activation attempts 2019-12-03 08:43:39 +00:00
Aleksander Morgado bfa5fd660c iface-modem-cdma: disallow empty carrier code in automatic activation 2019-12-03 08:43:39 +00:00
Aleksander Morgado a28f88b684 broadband-modem-mbim: implement reset in Intel-based devices 2019-11-28 22:25:36 +01:00
Aleksander Morgado 9ef658f697 iface-modem-voice: plug task memleaks when returning error if cancelled 2019-11-28 17:17:21 +01:00
Aleksander Morgado dc3bd91b53 broadband-modem-mbim: plug task leak when completing USSD operation 2019-11-28 14:58:31 +01:00
Aleksander Morgado d27b108efb iface-modem-signal: avoid logging about signal refresh context if not enabled 2019-11-28 14:47:21 +01:00
Aleksander Morgado 551f0e0250 port-mbim: before attempting to use QMI over MBIM, check device services
If we blindly try to use QMI over MBIM on devices that don't support
it, the logic works ok but it's very slow, given that the QMI device
open operation has several internal retries, and all those end up
timing out.

Avoid that lost time by checking the list of services supported by the
MBIM modem, and if the QMI over MBIM service is not listed, we'll
avoid trying to open the QMI device right away.
2019-11-27 17:30:07 +01:00
Aleksander Morgado 8fcc470a5c plugin-manager: always make sure all needed symbols are available
Never do lazy loading, we'll always make sure that a plugin will only
be fully loaded if all the symbols it requires are already available.
2019-11-27 10:11:43 +00:00
Aleksander Morgado b1c3f1eb1c plugin-manager: dynamically load 'shared' util libraries 2019-11-27 10:11:43 +00:00
Aleksander Morgado b4dcb76d5a plugin-manager: allow new ports up to 1500ms since last port added
Until now we had only a 2500ms timeout initialized since the first
port was exposed until we decided we were ready to consider all ports
notified by the kernel.

With this new logic, we add an additional condition: even if the
2500ms initial timeout has elapsed already, we leave an additional
1500ms since the last port addition for new ports to appear.

This new logic is useful when relying on the ReportKernelEvent() DBus
method, as it is the user the one responsible for reporting the kernel
events instead of udev. Now, the user is not forced to make sure all
ports are exposed in 2500ms; instead, we also allow ports to be
reported in more than 2500ms as long as the time between port
additions reported is less than 1500ms.

Note that this does not mean that the whole probing time will now
always be 4000ms. On well behaved systems (like when based on udev)
this new 'extra' probing timeout may expire long before the 'min'
probing timeout we already had as well.

E.g. in this setup, the reporting of the NET port was done 1100ms
later than the last ttyUSB3, and that was already too late as the
original 2500ms threshold had already expired.

 [1573536994.593874] (tty/ttyUSB0): first port in device /sys/devices/platform/ehci-platform/usb1/1-1
 [1573536994.596659] [plugin manager] task 1: port grabbed: ttyUSB0
 [1573536995.093579] (tty/ttyUSB1): additional port in device /sys/devices/platform/ehci-platform/usb1/1-1
 [1573536995.094172] [plugin manager] task 1: port grabbed: ttyUSB1
 [1573536995.603206] (tty/ttyUSB2): additional port in device /sys/devices/platform/ehci-platform/usb1/1-1
 [1573536995.603822] [plugin manager] task 1: port grabbed: ttyUSB2
 [1573536996.111564] (tty/ttyUSB3): additional port in device /sys/devices/platform/ehci-platform/usb1/1-1
 [1573536996.112257] [plugin manager] task 1: port grabbed: ttyUSB3
 [1573536996.814816] [device /sys/devices/platform/ehci-platform/usb1/1-1] creating modem with plugin 'Quectel' and '4' ports
 [1573536997.265820] (net/wwan0): additional port in device /sys/devices/platform/ehci-platform/usb1/1-1
 [1573536997.296935] (usbmisc/cdc-wdm0): additional port in device /sys/devices/platform/ehci-platform/usb1/1-1
2019-11-27 08:29:37 +00:00
Aleksander Morgado 8f21f40674 broadband-modem-mbim: avoid LTE attach config/status if unsupported
If we know that the LTE attach status/configuration CIDs in the Basic
Connect Extensions service are unsupported, don't even try to use
them, so that we avoid timeouts in the requests.
2019-11-27 09:03:22 +01:00
Aleksander Morgado c523d5bdc3 bearer-qmi: plug memleaks when connection attempt fails early
The data and qmi objects were not being correctly disposed on several
error conditions.
2019-11-25 15:08:20 +01:00
Aleksander Morgado 260d34be76 bearer-qmi: plug memleaks during network disconnection 2019-11-25 12:29:33 +01:00
Amol Lad 7297b3fc90 mbim: release all allocated CIDs during shutdown 2019-11-23 14:57:48 +05:30
Aleksander Morgado 5e8c64d092 iface-modem-simple: don't assert ongoing connect cancellable
[11642]: <debug> [1573665255.321490] Couldn't reload current power state: QMI operation failed: Transaction timed out
    [11642]: <debug> [1573665255.321697] No need to change power state: already in 'on' power state
    [11642]: <debug> [1573665255.330864] Modem (Quectel) '/sys/devices/platform/ehci-platform/usb1/1-1' completely disposed
    **
    ERROR:mm-iface-modem-simple.c:44:private_free: assertion failed: (!priv->ongoing_connect)

If the modem goes away in the middle of a connection attempt, there's
no explicit connection cancellation performed, we just cleanup the
modem object. In this case, the ongoing attempt cancellable will still
exist, so just clean it up as well.
2019-11-13 18:23:21 +01:00
Aleksander Morgado 3da82d1050 plugin-manager: cancel timeouts when device probing is cancelled
There is no need to wait for the minimum wait/probing time before we
can cancel the device probing.
2019-11-13 15:43:11 +01:00
Aleksander Morgado 76e862597c plugin-manager: fix waiting the minimum probing time
The device port probings were being finished before the minimum
probing time, making this timeout effectively useless.
2019-11-13 15:38:45 +01:00
Aleksander Morgado 4a0de586db base-call: if start() fails, always terminated 2019-10-17 10:51:50 +02:00
Aleksander Morgado 2c0281aac9 call: disallow non-emergency calls when in emergency-only state 2019-10-17 10:51:50 +02:00
Aleksander Morgado d6f9d5e9ec sim: load emergency numbers from EF_ECC 2019-10-17 10:51:50 +02:00
Aleksander Morgado 1f6c006976 api,sim: new 'Emergency Numbers' property 2019-10-17 08:31:46 +00:00
Aleksander Morgado 57e7841308 iface-modem-voice: always completely reinitialize the interface
The supported voice features may be different before and after SIM-PIN
unlock, so do not cache the result of the support check operation.
2019-10-17 08:31:46 +00:00
Aleksander Morgado 98066d24b7 broadband-modem: don't cache voice support check AT commands
The result of these commands may be different before and after SIM-PIN
unlock, so never cache them.
2019-10-17 08:31:46 +00:00
Aleksander Morgado 5fef14176a broadband-modem: ignore SIM-related errors in voice support check 2019-10-17 08:31:46 +00:00
Aleksander Morgado 6347a7d783 base-call: catch terminated errors before ATD replies
If we get one of the in-call termination errors before ATD replies OK,
we need to cancel the start() operation right away and return an
error to the caller.

Otherwise, the Call will be reported as "terminated" right away, but
the caller would not get an error back until 90s later:

    $ sudo mmcli --call 0 --start
    error: couldn't start the call: 'GDBus.Error:org.freedesktop.ModemManager1.Error.Serial.ResponseTimeout: Serial command timed out'
2019-10-17 08:31:46 +00:00
Aleksander Morgado eaf6654750 broadband-modem: keep ports context open while in-call
This is so that we can receive and process URCs even if the modem is
not fully enabled yet.
2019-10-17 08:31:46 +00:00
Aleksander Morgado c99f767f04 broadband-modem: reorder generic port context logic in sources 2019-10-17 08:31:46 +00:00
Aleksander Morgado ba1f3af342 broadband-modem: new generic ports_context_open()
Used during initialization, enabling and sim hotswap context setup.
The secondary AT and QCDM ports will only be open during enabling.
2019-10-17 08:31:46 +00:00
Aleksander Morgado 7c8d0d1718 broadband-modem: skip redundant ATE0/AT+CMEE=1 settings
These are already given in the logic behind the
"MM_PORT_SERIAL_AT_INIT_SEQUENCE"  property:

    (ttyACM1): --> 'ATE0<CR>'
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
    (ttyACM1): --> 'ATV1<CR>'
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
    (ttyACM1): --> 'AT+CMEE=1<CR>'
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
    (ttyACM1): --> 'ATX4<CR>'
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
    (ttyACM1): --> 'AT&C1<CR>'
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
    (ttyACM1): --> 'ATE0<CR>'               --> redundant
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
    (ttyACM1): --> 'AT+CMEE=1<CR>'          --> redundant
    (ttyACM1): <-- '<CR><LF>OK<CR><LF>'
2019-10-17 08:31:46 +00:00
Aleksander Morgado 657833a400 voice,api: new 'EmergencyOnly' boolean flag
This new flag allows users of the API to know whether general purpose
voice calls are allowed or otherwise only voice calls to the
registered emergency numbers should be performed.

ModemManager won't really do any distinction between emergency and
non-emergency calls at this point, this flag is just an early
indication for the user of the API that no normal voice call should be
attempted.
2019-10-17 08:31:46 +00:00
Aleksander Morgado 7971844318 iface-modem-voice: all methods available even if not enabled 2019-10-17 08:31:46 +00:00
Aleksander Morgado ed3a1264af iface-modem-voice: call list setup during initialization
We're going to allow emergency calls at any point, so prepare the call
list handling logic during initialization, not when the modem is first
enabled.
2019-10-17 08:31:46 +00:00
Aleksander Morgado 00a39cd060 broadband-modem: voice interface available in failed/locked state 2019-10-17 08:31:46 +00:00
Aleksander Morgado 27405a44ca broadband-modem: new initialization step when failed/locked
Instead of using the firmware step as fallback when the modem goes
into failed or locked state, use an independent step in the
initialization state machine, just to make it clearer.
2019-10-17 08:31:46 +00:00
Aleksander Morgado d555c4c45c iface-modem-simple: allow single ongoing Connect() attempt
We only allow one single Simple.Connect() attempt at a time. If more
than one arrives, the second and next ones will be forbidden.

The ongoing connection attempt can now always be cancelled via
Simple.Disconnect(), not only *after* the bearer object connection has
started. i.e. if Simple.Disconnect() is called e.g. while waiting to
be registered, we would also be cancelled properly.
2019-10-17 08:07:10 +00:00
Aleksander Morgado f228d0dd6f base-bearer,iface-modem-simple: log user requests to connect/disconnect 2019-10-17 08:07:10 +00:00
Aleksander Morgado e3a1364ddc core: allow flagging ports as 'audio'
Instead of flagging them as 'ignored' so that they aren't probed, we
can also flag them as 'audio' now, so that the logic knows which port
to report as used for audio in the Call object.
2019-10-15 13:19:10 +02:00
Aleksander Morgado 1a17996ccb iface-modem-voice: ignore unknown calls reported as terminated
If the full list reporting includes calls in terminated state (e.g. on
modems managed by the Simtech plugin), then ignore those no longer
known to us, because it just means that they have already been
processed.

    <debug> [1571060859.227759] (ttyUSB2): <-- '<CR><LF>+CLCC: 1,0,6,0,0,"639335936",129<CR><LF>'
    <debug> [1571060859.227890] Reported 1 ongoing calls
    <debug> [1571060859.227913] call at index 1: direction outgoing, state terminated, number 639335936
    <debug> [1571060859.227946] call info matched (matched direction/state no, matched index yes, matched terminated no) with call at '/org/freedesktop/ModemManager1/Call/1'
    <debug> [1571060859.227963]   state updated: terminated
    <info>  [1571060859.227978] Call state changed: dialing -> terminated (unknown)
    <debug> [1571060859.228173] (ttyUSB3): <-- '<CR><LF>+CLCC: 1,0,6,0,0,"639335936",129<CR><LF>'
    <debug> [1571060859.228234] Reported 1 ongoing calls
    <debug> [1571060859.228251] call at index 1: direction outgoing, state terminated, number 639335936
    <warn>  [1571060859.228274] unexpected outgoing call to number '639335936' report2ed in call list: state terminated
2019-10-14 15:54:56 +02:00