Commit Graph
107 Commits
Author SHA1 Message Date
Aleksander Morgado 185e492c0a core: new '--test-multiplex-requested' option
The new option will change the default setting in MBIM and QMI bearers
to "request" when no explicit "multiplex" configuration is given by
the user.

This option will help test the multiplexing support in the modems
before it's made a default in a future release.
2021-08-09 12:22:26 +00:00
Aleksander Morgado c49f3f5f46 bearer-qmi: don't enable multiplexing by default unless in IPA
The next 1.18 release will have multiplexing support, but not enabled
by default, to avoid breaking setups that don't expect the new virtual
net interfaces for the multiplexed sessions.

The exception is Qualcomm SoCs using the IPA driver, where
multiplexing is fully required.
2021-08-09 12:22:26 +00:00
Aleksander Morgado 8d019a399c base-bearer: remove default multiplex support symbol
Using "requested" as a common default for every possible
implementation works, because it can handle setups without
multiplexing capabilities (e.g. plain AT+PPP modems) and also setups
without non-multiplexing capabilities (e.g. IPA based SoCs).

But if we don't want "requested" as default, then there will be
failing cases; e.g. we cannot use "none" as default for all as it
would break IPA, and we cannot use "required" as default for all as it
would break AT+PPP setups.

So, remove the common default, it's not flexible enough.
2021-08-09 12:22:26 +00:00
Aleksander Morgado daf72fe169 base-bearer: setup common default for unknown multiplex fallback
If the user doesn't provide a specific multiplex setting, we'll
fallback to a predefined default.

For now, the default is REQUESTED.
2021-07-13 15:47:38 +02:00
Aleksander Morgado a97bc9912f bearer-qmi: implement reload_connection_status() for the sync operation
The original load_connection_status() method would return an
UNSUPPORTED error if connection monitoring wasn't required (which is
the default in most QMI modems).

The new reload_connection_status() method requires the check to always
be done unconditionally.

We take most of the original logic in the load_connection_status() for
the new reload_connection_status(), and we add the UNSUPPORTED error
logic exclusively in the new load_connection_status().
2021-05-26 13:14:52 +00:00
Aleksander Morgado 59ffa01bb0 bearer-qmi: detailed connection error on disconnection reports
When we receive an indication reporting a network-initiated
disconnection, convert the QMI call end reason into a
MMMobileEquipmentError, and publish it in the new 'ConnectionError'
property.
2021-05-23 01:22:07 +02:00
Aleksander Morgado 43db860c44 base-bearer: report connection error on network initiated disconnections
By default, fallback to "unknown" mobile equipment error when the
modem gets disconnected by the network and we don't have any way to
know a more detailed reason.
2021-05-23 01:22:07 +02:00
Aleksander Morgado b9c66e92ea bearer-qmi: rework connection failure error reporting
On a failed QMI modem connection, we won't return the generic
"CallFailed" error, we'll try to convert the 3GPP verbose call end
reason to a MMMobileEquipmentError.

And if we cannot find a mapping, or if the reported error is not a
3GPP verbose call end reason, we'll return a Unknown
MMMobileEquipmentError with a string message providing detailed error
information.
2021-05-22 22:58:37 +00:00
Aleksander Morgado 0d60b9497b bearer-qmi: implement connection logic using existing profiles 2021-04-29 10:13:22 +00:00
Aleksander Morgado ce383abfe1 bearer-qmi: refactor connection context setup logic
Place all the logic in a separate load_settings_from_bearer() method
that takes care of propagating all bearer settings to the connect
context.
2021-04-29 10:13:22 +00:00
Aleksander Morgado fffe49d03e modem-helpers-qmi: perform validation in allowed_auth_to_qmi_authentication()
If we find that none of the requested auth settings are supported, we
should fail and return an error.

Also, make sure we set the CHAP fallback default only if either user
or password are given.
2021-04-29 10:13:22 +00:00
Aleksander Morgado 26243e7ed7 bearer-qmi: reorder methods in connection state machine
The "ready" methods for each step in the state machine must be ordered
from bottom to top, so that the readers can read the methods in that
order when following the logic.
2021-04-23 22:29:45 +02:00
Aleksander Morgado e7c1eb8287 port-qmi: WDS clients also mux-id specific
In addition to differentiating between IPv4 and IPv6 clients, we also
need to explicitly allocate different clients in different bearer
objects when in multiplexing.
2021-04-23 22:29:40 +02:00
Bjørn Mork 1c6258056e bearer-qmi: fix dual-stack connections
Connecting the second family of a dual stack connections fails with
'PolicyMismatch' when muxing is setup after family selection.

Switching the order of the family selection and muxing setup to
fix the problem. Looks like family selection must be the very last
WDS request before connecting the client.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
2021-04-23 20:25:12 +02:00
Aleksander Morgado 483f8f0559 port-qmi: new helper macro to check for supported QMAP values 2021-04-14 11:27:27 +02:00
Aleksander Morgado 851a708442 modem-helpers: ip family normalization doesn't need log_object 2021-04-01 11:24:42 +02:00
Aleksander Morgado 2c27a7aadc base-bearer: remove default IP family property
There is no point in providing a configurable default IP family in the
bearer object, because we can always assume IPv4 as being the only
default expected.

Simplify the logic and also provide a new method to get the normalize
the IP family, using IPv4 as default always.
2021-03-31 23:46:31 +02:00
Aleksander Morgado fdfcd30308 bearer-qmi: avoid increasing self reference during dispose()
The reset_bearer_connection() method is called during dispose, and if
a link had been created during the connection attempt, we would be
increasing the reference to the bearer object during dispose(), which
should never happen.

Just avoid passing any callback to the cleanup_link() method, as we
really were using that only for logging purposes.
2021-03-11 11:38:29 +01:00
Aleksander Morgado bd075aeba0 bearer-qmi: if no explicit 'multiplex' setting, default to 'requested' 2021-03-10 15:18:00 +01:00
Aleksander Morgado b0f26a1f0b bearer-qmi: bring master interface up on connection attempt
The user of the ModemManager API will bring up the data network
interface exposed in the Bearer IP settings (i.e. the link interface
when using multiplexing). But for instantiated network links, we also
need to have the master interface brought up before any traffic can go
through the link interface.

We don't check whether the master interface is already up before
attempting to bring it up, we just attempt to bring it up.
2021-03-10 12:58:12 +01:00
Aleksander Morgado 1643c3d3db bearer-qmi: create data port link if multiplex is requested/required
If the user requests or requires to use multiplexing support, try to
create a data port link and bind the WDS client(s) to it.

If the multiplex is requested but not required, we allow link creation
failures or setups where multiplexing isn't supported; we just go on
with the default connection setup without multiplexing, as long as
there is no bearer connected on the same data network interface.

If the multiplex is required and for any reason it cannot be fully
setup, we will fail the connection attempt right away.

The data port link is created in the system via the QmiDevice in the
open MMPortQmi, but it MUST be notified by the kernel (e.g. via udev
or via kernel events) before the connection attempt goes on.
2021-03-10 12:58:12 +01:00
Aleksander Morgado ec73efc551 port-qmi: add support for QMAP data aggregation
We now allow requesting for multiplex support in the set data format
operation of the MMPortQmi.

If multiplexing is supported, we'll configure both the modem (link
layer protocol and data aggregation protocol) and the kernel expected
data format (if qmi_wwan in use).

The logic adds additional preferences over the different choices we
may find in the logic:
  * In newer modems, by default QMAPv5 is preferred over QMAP as data
    aggregation protocol.
  * If using qmi_wwan, by default rmnet (qmap-pass-through) is
    preferred over add_mux/del_mux (raw-ip) kernel expected data
    format.

These preferences are only considered if the specific support is found
in the setup.

Whenever we change the multiplexing support, an internal port reset
operation will be run, in order to bring the state of the setup to a
clean known one.
2021-03-10 10:59:22 +01:00
Aleksander Morgado b45948a20d port-qmi: rework WDA-based logic and avoid setup during port open
The new logic is implemented as a separate async method with its own
state machine, which allows selecting different data format setups
with an strict preference.

Until now, we would not attempt to re-configure the link layer
protocol in the modem interface if we could instead change the
expected data format in the kernel. E.g. a MC7304 exposing one
interface in 802.3 format and another one in raw-ip format would be
used in either 802.3 or raw-ip, depending on the network interface
being connected.

This logic changes now, and we now by default always prefer raw-ip
over 802.3. E.g. the same MC7304 would now always be used in raw-ip
mode, regardless of whether the interface was by default in raw-ip or
not. Obviously, raw-ip will only be used if the kernel data format can
be changed. If the qmi_wwan driver in use is older than 4.5, the
default link layer protocol attempted would be 802.3, if the modem
supports it.

In addition to this change in logic, we also now avoid setting up the
WDA data format as soon as the port is opened; instead we defer that
logic until a connection request arrives, because once QMAP support is
integrated, we'll need to know whether the user requested the
multiplexing support or not. Therefore, during port open we just
query current state and during the connection attempt we reconfigure
either modem or kernel or both.

If WDA is unsupported, the logic falls back to CTL-based link layer
protocol configuration, as it use to.

The logic now also supports WDA Set/Get Data Format operations with
the newest modems that require the explicit endpoint info TLV. As soon
as the first failure is reported asking for the endpoint TLV, we'll
flag the port as requiring the endpoint info always.
2021-03-10 10:59:22 +01:00
Aleksander Morgado 064e92e9b7 api,simple: new 'multiplex' setting in bearer properties
Both the Simple.Connect() and Modem.CreateBearer() are updated to
allow a new 'multiplex' setting in the properties provided by the user
in both of these methods.

The new setting expects a MMBearerMultiplexSupport enum indicating
what kind of multiplex needs the user has:
 * none: if multiplex must not be used.
 * requested: if multiplex should be used if available.
 * required: if multiplex must be used.

The underlying implementations will take care of accepting or
rejecting the setting depending on the system and modem capabilities.
2021-03-10 10:59:19 +01:00
Aleksander Morgado 399a042dad bearer-qmi: support binding to data port
Allow plugins to specify a QmiSioPort value to bind to. This is used
e.g. in the RPMSG+BAM-DMUX setup in order to allow any RPMSG port to
control all the available net ports.
2020-11-20 09:24:51 +00:00
Aleksander Morgado 5d150ed23e core,plugins: consolidate connection/disconnection timeout values
Each different plugin or protocol had a different connection attempt
value. E.g. QMI and MBIM both used 60s max for the connection attempt,
while the u-blox plugin had up to 180s for ECM based connection
setups.

This commit consolidates all plugins and protocols to use the same
timeout values for commands that may take long to respond, e.g. a
connection atempt under low signal quality conditions.

A value of 180s for the connection attempt steps and 120s for a
disconnection attempt step is considered. Note, though, that in some
cases (like a IPv4v6 setup attempt using QMI) we may have more than
one such long step, so this doesn't mean that a connection attempt
will always take less than 180s.

Users of the connection/disconnection APIs should be able to handle
the case where the attempt times out in their side (e.g. with a lower
DBus request timeout), and which would not mean the actual request
they did really failed. E.g. a connection attempt with a DBus timeout
of 30s may fail in the user with a timeout error, but the attempt
would still go on for as much as the plugin/protocol needs.

Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/270
2020-11-14 09:41:43 +00:00
Aleksander Morgado b8f6fb59ed broadband-modem-qmi: peeking QMI port only in QMI modems
Move the logic out of the base modem, and make it applicable only for
QMI modems.
2020-11-09 18:41:57 +01:00
Eric Caruso 408a3d58c2 mm-bearer-qmi: remove default_ip_family_set check
According to QC, we should set the IP family in both the
Set IP Family and Start Network messages. After removing this
check the member is never read, only written; this means it's
effectively dead and can be removed.
2020-10-08 07:54:50 +00:00
Aleksander Morgado 7cd373589c bearer-qmi: if connection aborted, ensure network handles are released
If the connection attempt is aborted before finishing (either network
triggered or user triggered), we need to make sure that we run a 'Stop
Network' request for every 'Start Network' that had succeeded until
then, or otherwise we'll no longer be able to re-run a 'Start Network'
with the same settings and get a proper packet data handle.

E.g. in this sequence we attempt a IPv4v6 connection. The logic starts
setting up the IPv4 path:

    Wed Jul 29 14:44:06 2020 daemon.info [1567]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (registered -> connecting)
    Wed Jul 29 14:44:06 2020 daemon.debug [1567]: <debug> Launching connection with QMI port (usb/cdc-wdm0) and data port (net/wwan0)
    Wed Jul 29 14:44:06 2020 daemon.debug [1567]: <debug> Defaulting to use static IP method
    Wed Jul 29 14:44:06 2020 daemon.debug [1567]: <debug> Running IPv4 connection setup
    ...

The 'Start Network' for IPv4 succeeds and we get a proper packet data
handle:

    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: [/dev/cdc-wdm0] sent generic request (translated)... <<<<<< QMUX: <<<<<<   length  = 23 <<<<<<   flags   = 0x00 <<<<<<   service = "wds" <<<<<<   client  = 20 <<<<<< QMI: <<<<<<   flags       = "none" <<<<<<   transaction = 3075 <<<<<<   tlv_length  = 11 <<<<<<   message     = "Start Network" (0x0020) <<<<<< TLV: <<<<<<   type       = "APN" (0x14) <<<<<<   length     = 8 <<<<<<   value      = 69:6E:74:65:72:6E:65:74 <<<<<<   translated = internet
    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: [/dev/cdc-wdm0] received generic response (translated)... <<<<<< QMUX: <<<<<<   length  = 26 <<<<<<   flags   = 0x80 <<<<<<   service = "wds" <<<<<<   client  = 20 <<<<<< QMI: <<<<<<   flags       = "response" <<<<<<   transaction = 3075 <<<<<<   tlv_length  = 14 <<<<<<   message     = "Start Network" (0x0020) <<<<<< TLV: <<<<<<   type       = "Result" (0x02) <<<<<<   length     = 4 <<<<<<   value      = 00:00:00:00 <<<<<<   translated = SUCCESS <<<<<< TLV: <<<<<<   type       = "Packet Data Handle" (0x01) <<<<<<   length     = 4 <<<<<<   value      = 80:CD:AD:81 <<<<<<   translated = 2175651200

Then, we start the IPv6 connection path:
    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: <debug> Running IPv6 connection setup
    ...

But, because we suddenly are not registered in the network, the
connection is aborted, and we don't cleanup the IPv4 path at this
point, as this patch wasn't available.

    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: <debug> Bearer not allowed to connect, not registered in 3GPP network
    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: <debug> Forcing disconnection of bearer '/org/freedesktop/ModemManager1/Bearer/56'
    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: transaction 0xe1 aborted, but message is not abortable
    Wed Jul 29 14:44:07 2020 daemon.info [1567]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connecting -> enabled)
    Wed Jul 29 14:44:07 2020 daemon.debug [1567]: <debug> Couldn't connect bearer '/org/freedesktop/ModemManager1/Bearer/56': 'operation cancelled'

We then attempt a new connection request with the same settings:

    Wed Jul 29 14:44:22 2020 daemon.info [1567]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (registered -> connecting)
    Wed Jul 29 14:44:22 2020 daemon.debug [1567]: <debug> Launching connection with QMI port (usb/cdc-wdm0) and data port (net/wwan0)
    Wed Jul 29 14:44:22 2020 daemon.debug [1567]: <debug> Defaulting to use static IP method
    Wed Jul 29 14:44:22 2020 daemon.debug [1567]: <debug> Running IPv4 connection setup

And we see how the 'Start Network' command fails with a 'No Effect'
error, as the IPv4 was left connected earlier. Due to this, the modem
is assumed connected, but we won't have a valid packet data handle to
stop the connection cleanly:

    Wed Jul 29 14:44:22 2020 daemon.debug [1567]: [/dev/cdc-wdm0] sent generic request (translated)... <<<<<< QMUX: <<<<<<   length  = 23 <<<<<<   flags   = 0x00 <<<<<<   service = "wds" <<<<<<   client  = 20 <<<<<< QMI: <<<<<<   flags       = "none" <<<<<<   transaction = 3080 <<<<<<   tlv_length  = 11 <<<<<<   message     = "Start Network" (0x0020) <<<<<< TLV: <<<<<<   type       = "APN" (0x14) <<<<<<   length     = 8 <<<<<<   value      = 69:6E:74:65:72:6E:65:74 <<<<<<   translated = internet
    Wed Jul 29 14:44:23 2020 daemon.debug [1567]: [/dev/cdc-wdm0] received generic response (translated)... <<<<<< QMUX: <<<<<<   length  = 26 <<<<<<   flags   = 0x80 <<<<<<   service = "wds" <<<<<<   client  = 20 <<<<<< QMI: <<<<<<   flags       = "response" <<<<<<   transaction = 3080 <<<<<<   tlv_length  = 14 <<<<<<   message     = "Start Network" (0x0020) <<<<<< TLV: <<<<<<   type       = "Result" (0x02) <<<<<<   length     = 4 <<<<<<   value      = 01:00:1A:00 <<<<<<   translated = FAILURE: NoEffect <<<<<< TLV: <<<<<<   type       = "Packet Data Handle" (0x01) <<<<<<   length     = 4 <<<<<<   value      = 00:00:00:00 <<<<<<   translated = 0
2020-08-12 11:36:21 +00:00
Giacinto Cifelli 4d58278d7f changed default authentication algorithm to CHAP
CHAP is almost universal nowadays, and so it is a better default
than PAP

Not changed for uBlox, that prefers an error if not specified,
and for Huawei, which uses NONE with user/pwd and has 2 CHAP choices
2020-07-24 16:34:40 +02:00
Aleksander Morgado c6d213d652 broadband-modem-qmi,bearer-qmi: avoid depending on the client version
The QMI client version is an information provided by the QMI protocol
only when QMUX or MBIM backends are used, it won't be available when
e.g. QRTR is used. The logic in ModemManager should not rely on this
information.
2020-06-23 12:29:05 +00:00
Aleksander Morgado 83952c5a30 bearer-qmi: get correct bearer object pointer from task
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/207
2020-05-08 13:24:14 +02:00
Aleksander Morgado ba89d59471 bearer-qmi: port to use object logging 2020-04-08 16:35:08 +02:00
Aleksander Morgado 0db74e1d86 bearer-qmi: fix warnings with -Wimplicit-fallthrough
mm-bearer-qmi.c:168:18: error: this statement may fall through [-Werror=implicit-fallthrough=]
    168 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-bearer-qmi.c:169:5: note: here
    169 |     case RELOAD_STATS_CONTEXT_STEP_IPV4:
        |     ^~~~
  ...
2020-01-30 11:59:14 +01:00
Aleksander Morgado be516b5aa8 bearer-qmi: fix warnings with -Wswitch-default
mm-bearer-qmi.c: In function ‘reload_stats_context_step’:
  mm-bearer-qmi.c:165:5: error: switch missing default case [-Werror=switch-default]
    165 |     switch (ctx->step) {
        |     ^~~~~~
  mm-bearer-qmi.c: In function ‘connection_status_context_step’:
  mm-bearer-qmi.c:310:5: error: switch missing default case [-Werror=switch-default]
    310 |     switch (ctx->step) {
        |     ^~~~~~
  mm-bearer-qmi.c: In function ‘connect_context_step’:
  mm-bearer-qmi.c:1290:5: error: switch missing default case [-Werror=switch-default]
   1290 |     switch (ctx->step) {
        |     ^~~~~~
  mm-bearer-qmi.c: In function ‘disconnect_context_step’:
  mm-bearer-qmi.c:1954:5: error: switch missing default case [-Werror=switch-default]
   1954 |     switch (ctx->step) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado 377691afd4 port-qmi: asynchronous close operation always
To be in sync with the qmi_device_close_async() underlying method,
given that the synchronous one is deprecated.
2020-01-22 13:56:59 +01:00
Aleksander Morgado 33b1962615 bearer-qmi: simplify dispose() just by reseting connection data 2020-01-09 15:15:55 +01:00
Aleksander Morgado 29e64f59af bearer-qmi: plug memleak when disposing connected bearer
Also, explicitly close the QMI port if we had it open for the
connected bearer.

   ==991919== 6,533 (48 direct, 6,485 indirect) bytes in 1 blocks are definitely lost in loss record 5,171 of 5,177
   ==991919==    at 0x5048291: g_type_create_instance (gtype.c:1844)
   ==991919==    by 0x502DFC4: g_object_new_internal (gobject.c:1827)
   ==991919==    by 0x502EFA9: g_object_new_valist (gobject.c:2152)
   ==991919==    by 0x502DB9E: g_object_new (gobject.c:1670)
   ==991919==    by 0x2215CA: mm_port_qmi_new (mm-port-qmi.c:615)
   ==991919==    by 0x16C892: mm_base_modem_grab_port (mm-base-modem.c:295)
   ==991919==    by 0x1CEEE5: mm_plugin_create_modem (mm-plugin.c:1048)
   ==991919==    by 0x157E1E: mm_device_create_modem (mm-device.c:413)
   ==991919==    by 0x1535A0: device_support_check_ready (mm-base-manager.c:195)
   ==991919==    by 0x4EC9160: g_task_return_now (gtask.c:1212)
   ==991919==    by 0x4EC92AA: g_task_return (gtask.c:1281)
   ==991919==    by 0x4EC9E34: g_task_return_pointer (gtask.c:1689)
2020-01-09 15:15:18 +01: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 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
Lubomir Rintel 50fc46c170 bearer-qmi: do not call cleanup_event_report_unsolicited_events() w/o indication_id
If a disconnection fails (because stop_network() failed), base-bearer
flips the state back to CONNECTED. Oops. At that point something is
clearly messed up, but it seems correct to assume the bearer is
connected.

Nevertheless, we will have already have unhooked the unsolicited events
reporting. A subsequent attempt to disconnect the bearer will trip the
assertion:

  #0  0x00007ffff75f2eb5 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
  #1  0x00007ffff75dd895 in __GI_abort () at abort.c:79
  #2  0x00007ffff77beb53 in g_assertion_message
      (domain=<optimized out>, file=<optimized out>, line=<optimized out>, func=0x5088e0 <__FUNCTION__.56253> "cleanup_event_report_unsolicited_events", message=<optimized out>) at ../glib/gtestutils.c:2878
  #3  0x00007ffff781a96f in g_assertion_message_expr
      (domain=domain@entry=0x0, file=file@entry=0x507aad "mm-bearer-qmi.c", line=line@entry=1138, func=func@entry=0x5088e0 <__FUNCTION__.56253> "cleanup_event_report_unsolicited_events", expr=expr@entry=0x507ae5 "*indication_id != 0") at ../glib/gtestutils.c:2904
  #4  0x00000000004a0c49 in cleanup_event_report_unsolicited_events (client=<optimized out>, indication_id=0x5bb30c, self=<optimized out>)
      at mm-bearer-qmi.c:1138
  #5  0x00000000004a0c49 in cleanup_event_report_unsolicited_events
      (client=<optimized out>, indication_id=indication_id@entry=0x5bb30c, self=0x5bb420 [MMBearerQmi]) at mm-bearer-qmi.c:1132
  #6  0x00000000004a0ee3 in disconnect_context_step (task=0x7fffe8012100 [GTask]) at mm-bearer-qmi.c:1854
  #7  0x000000000046e889 in disconnect_auth_ready (self=<optimized out>, res=<optimized out>, ctx=ctx@entry=0x654630)
      at mm-iface-modem-simple.c:865
  #8  0x00007ffff79cfa9a in g_task_return_now (task=0x7fffe8012640 [GTask]) at ../gio/gtask.c:1209
  ...

Add checks for indication_id to calls to
cleanup_event_report_unsolicited_events() on
DISCONNECT_STEP_STOP_NETWORK_IPV4 or DISCONNECT_STEP_STOP_NETWORK_IPV6, as
is done elsewhere.
2019-05-14 09:49:15 +02:00
Lubomir Rintel aaea6c77f2 bearer-qmi: remove unused DisconnectContext::data 2019-05-14 09:46:46 +02:00
Ville Skyttä 90b89bb9f4 *: Spelling fixes 2018-01-25 09:52:12 +01:00
Aleksander Morgado 850107acbf bearer-qmi: fix logic if error setting up WDS event report indications
If we get an error when setting up the WDS event report indications,
make sure we run connect_context_step() after having set the next step
as CONNECT_STEP_LAST.
2017-12-21 14:43:08 +01:00
Aleksander Morgado 7119b8ebb2 bearer-qmi: new optional connection status monitoring
This update makes it possible to request connection status polling for
QMI modems via the ID_MM_QMI_CONNECTION_STATUS_POLLING_ENABLE tag.

If not given, the connection status polling will be disabled by
default, and the QMI modem will rely on WDS indications only.
2017-11-23 14:20:39 +01:00