Commit Graph

6478 Commits

Author SHA1 Message Date
Aleksander Morgado
7c4220bc68 core,broadband-bearer: fix warnings with -Wswitch-default
mm-broadband-bearer.c: In function ‘cid_selection_3gpp_context_step’:
  mm-broadband-bearer.c:868:5: warning: switch missing default case [-Wswitch-default]
    868 |     switch (ctx->step) {
        |     ^~~~~~
  mm-broadband-bearer.c: In function ‘disconnect’:
  mm-broadband-bearer.c:1842:5: warning: switch missing default case [-Wswitch-default]
   1842 |     switch (MM_BROADBAND_BEARER (self)->priv->connection_type) {
        |     ^~~~~~
  mm-broadband-bearer.c: In function ‘interface_initialization_step’:
  mm-broadband-bearer.c:2124:5: warning: switch missing default case [-Wswitch-default]
   2124 |     switch (ctx->step) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
2a0e4e062f core,base-bearer: fix warnings with -Wswitch-default
mm-base-bearer.c: In function ‘modem_3gpp_registration_state_changed’:
  mm-base-bearer.c:463:5: warning: switch missing default case [-Wswitch-default]
    463 |     switch (state) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
ce5689112d core,base-sim: fix warnings with -Wimplicit-fallthrough
mm-base-sim.c:1590:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
   1590 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-base-sim.c:1592:5: note: here
   1592 |     case INITIALIZATION_STEP_SIM_IDENTIFIER:
        |     ^~~~
  mm-base-sim.c:1606:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
   1606 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-base-sim.c:1608:5: note: here
   1608 |     case INITIALIZATION_STEP_IMSI:
        |     ^~~~
  mm-base-sim.c:1622:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
   1622 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-base-sim.c:1624:5: note: here
   1624 |     case INITIALIZATION_STEP_OPERATOR_ID:
        |     ^~~~
  mm-base-sim.c:1638:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
   1638 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-base-sim.c:1640:5: note: here
   1640 |     case INITIALIZATION_STEP_OPERATOR_NAME:
        |     ^~~~
  mm-base-sim.c:1654:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
   1654 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-base-sim.c:1656:5: note: here
   1656 |     case INITIALIZATION_STEP_EMERGENCY_NUMBERS:
        |     ^~~~
  mm-base-sim.c:1670:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
   1670 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-base-sim.c:1672:5: note: here
   1672 |     case INITIALIZATION_STEP_LAST:
        |     ^~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
850c6636bf core,base-sim: fix warnings with -Wswitch-default
mm-base-sim.c: In function ‘interface_initialization_step’:
  mm-base-sim.c:1587:5: warning: switch missing default case [-Wswitch-default]
   1587 |     switch (ctx->step) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
645f8e10ea core,plugin-manager: fix warnings with -Wswitch-default
mm-plugin-manager.c: In function ‘plugin_supports_port_ready’:
  mm-plugin-manager.c:480:5: warning: switch missing default case [-Wswitch-default]
    480 |     switch (support_result) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
b087549c7d core,log: fix warnings with -Wswitch-enum
mm-log.c: In function ‘glib_to_syslog_priority’:
  mm-log.c:99:5: warning: enumeration value ‘G_LOG_FLAG_RECURSION’ not handled in switch [-Wswitch-enum]
     99 |     switch (level) {
        |     ^~~~~~
  mm-log.c:99:5: warning: enumeration value ‘G_LOG_FLAG_FATAL’ not handled in switch [-Wswitch-enum]
  mm-log.c:99:5: warning: enumeration value ‘G_LOG_LEVEL_INFO’ not handled in switch [-Wswitch-enum]
  mm-log.c:99:5: warning: enumeration value ‘G_LOG_LEVEL_MASK’ not handled in switch [-Wswitch-enum]
2020-01-30 11:59:14 +01:00
Aleksander Morgado
b024381be5 core,log: fix warnings with -Wswitch-default
mm-log.c: In function ‘mm_to_syslog_priority’:
  mm-log.c:82:5: warning: switch missing default case [-Wswitch-default]
     82 |     switch (level) {
        |     ^~~~~~

  mm-log.c: In function ‘log_level_description’:
  mm-log.c:118:5: warning: switch missing default case [-Wswitch-default]
    118 |     switch (level) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
a1f2429790 libqcdm,reset: fix warnings with -Wdiscarded-qualifiers
reset.c: In function ‘main’:
  reset.c:238:17: warning: passing argument 1 of ‘putenv’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    238 |         putenv ("QCDM_DEBUG=1");
        |                 ^~~~~~~~~~~~~~
  In file included from reset.c:22:
  /usr/include/stdlib.h:647:26: note: expected ‘char *’ but argument is of type ‘const char *’
    647 | extern int putenv (char *__string) __THROW __nonnull ((1));
        |                    ~~~~~~^~~~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
305d927ee0 libqcdm,reset: fix warnings with -Wsign-compare
reset.c: In function ‘print_buf’:
  reset.c:47:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
     47 |     for (i = 0; i < len; i++) {
        |                   ^
  reset.c: In function ‘qcdm_wait_reply’:
  reset.c:168:20: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
    168 |     } while (total < sizeof (readbuf));
        |                    ^
2020-01-30 11:59:14 +01:00
Aleksander Morgado
47a380a2ae libqcdm,ipv6pref: fix warnings with -Wdiscarded-qualifiers
ipv6pref.c: In function ‘main’:
  ipv6pref.c:288:11: warning: passing argument 1 of ‘putenv’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    288 |   putenv ("QCDM_DEBUG=1");
        |           ^~~~~~~~~~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
07fe3bed65 libqcdm,ipv6pref: fix warnings with -Wsign-compare
ipv6pref.c: In function ‘print_buf’:
  ipv6pref.c:46:16: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
     46 |  for (i = 0; i < len; i++) {
        |                ^
  ipv6pref.c: In function ‘qcdm_wait_reply’:
  ipv6pref.c:167:17: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
    167 |  } while (total < sizeof (readbuf));
        |                 ^
2020-01-30 11:59:14 +01:00
Aleksander Morgado
c135c66684 libqcdm,modepref: fix warnings with -Wdiscarded-qualifiers
modepref.c: In function ‘main’:
  modepref.c:539:11: warning: passing argument 1 of ‘putenv’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    539 |   putenv ("QCDM_DEBUG=1");
        |           ^~~~~~~~~~~~~~
  In file included from modepref.c:21:
  /usr/include/stdlib.h:647:26: note: expected ‘char *’ but argument is of type ‘const char *’
    647 | extern int putenv (char *__string) __THROW __nonnull ((1));
        |                    ~~~~~~^~~~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
17a00ce1fc libqcdm,modepref: fix warnings with -Wsign-compare
modepref.c: In function ‘print_buf’:
  modepref.c:46:16: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
     46 |  for (i = 0; i < len; i++) {
        |                ^
  modepref.c: In function ‘qcdm_wait_reply’:
  modepref.c:167:17: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
    167 |  } while (total < sizeof (readbuf));
        |                 ^
2020-01-30 11:59:14 +01:00
Aleksander Morgado
4fa669b894 test-qcdm-com: fix warnings with -Wdouble-promotion
test-qcdm-com.c: In function ‘test_com_pilot_sets’:
  test-qcdm-com.c:1085:59: warning: implicit conversion from ‘float’ to ‘double’ when passing argument to function [-Wdouble-promotion]
   1085 |         g_message ("      EC/IO     %d  (%.1f dB)", ecio, db);
        |                                                           ^~
  /usr/include/glib-2.0/glib/gmessages.h:333:32: note: in definition of macro ‘g_message’
    333 |                                __VA_ARGS__)
        |                                ^~~~~~~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
45c0015c08 test-qcdm-com: fix warnings with -Wsign-compare
test-qcdm-com.c: In function ‘print_buf’:
  test-qcdm-com.c:273:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘gsize’ {aka ‘long unsigned int’} [-Wsign-compare]
    273 |     for (i = 0; i < len; i++) {
        |                   ^
  test-qcdm-com.c: In function ‘wait_reply’:
  test-qcdm-com.c:367:20: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
    367 |     } while (total < sizeof (readbuf));
        |                    ^
2020-01-30 11:59:14 +01:00
Aleksander Morgado
06567283b1 libqcdm,logs: fix warnings with -Wdouble-promotion
logs.c: In function ‘qcdm_log_item_evdo_pilot_sets_v2_get_pilot’:
  logs.c:179:94: warning: implicit conversion from ‘float’ to ‘double’ to match other operand of binary expression [-Wdouble-promotion]
    179 |     *out_rssi_dbm = (int32_t) (-110.0 + ((float) MAX (le16toh (pilot->pilot_energy) - 50, 0) / 14.0));
        |
2020-01-30 11:59:14 +01:00
Aleksander Morgado
3c19b48f8c libqcdm,commands: fix warnings with -Wdouble-promotion
commands.c: In function ‘qcdm_cmd_pilot_sets_result_get_pilot’:
  commands.c:756:33: warning: implicit conversion from ‘float’ to ‘double’ to match other operand of binary expression [-Wdouble-promotion]
    756 |     *out_db = (float) set->ecio * -0.5;
        |                                 ^
2020-01-30 11:59:14 +01:00
Aleksander Morgado
9bc5d742dc libqcdm,commands: fix warnings with -Wswitch-default
commands.c: In function ‘nv_mode_pref_from_qcdm’:
  commands.c:109:5: warning: switch missing default case [-Wswitch-default]
    109 |     switch (qcdm) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
cf211c01e9 build-aux: fix warning in the built _get_string() methods with -Wsign-compare
mm-enums-types.c: In function ‘mm_modem_lock_get_string’:
  mm-enums-types.c:165:17: warning: comparison of integer expressions of different signedness: ‘MMModemLock’ {aka ‘enum <anonymous>’} and ‘gint’ {aka ‘const int’} [-Wsign-compare]
    165 |         if (val == mm_modem_lock_values[i].value)
        |                 ^~
2020-01-30 11:59:14 +01:00
Aleksander Morgado
1c078531a0 build: use AX_IS_RELEASE() and AX_COMPILER_FLAGS()
The autoconf macros AX_COMPILER_FLAGS_{CFLAGS|GIR|LDFLAGS} test
for compiler and linker support of various flags, and add the flags to
the generated output.

If the command-line option '--enable-compile-warnings' is specified to
'configure', a number of additional warning options is also added to the
output. This is the default.

This update requires the presence of the GNU autoconf-archive in the
system.
2020-01-30 11:59:14 +01:00
Aleksander Morgado
4bfd955e64 auth-provider: fix reference count in manager and modem objects
The auth provider is now a singleton (since 20ab6550), one single
object that lives throughout the whole program execution, and so we
don't need to keep our own full references around. This fix makes
sure we don't attempt to unref a full auth provider reference we
don't own.

Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/179
2020-01-28 10:33:50 +01:00
Aleksander Morgado
2406a5519f charsets: fix handling of 0x00 bytes at the end of GSM encoded strings
When a GSM-7 encoded string is packed, the process of packing the
septets into bytes may end up with one last byte holding the last bit
of the last septet. When this situation happens, the last byte will
end up with the 7 remaining bits set to 0.

When this packed string is unpacked, the logic to unpack will unpack
those last 7 bits as an additional septet, with the value 0x00.

The 0x00 value encoded in GSM-7 is the '@' character, EXCEPT when this
character is found at the end of the string, in which case the value
should be considered as NUL and trigger the end of string already.

So, fix the conversion logic between GSM-7 and UTF-8, so that whenever
we find the 0x00 character at the end of the string, we ignore it
instead of adding a bogus '@' trailing character.

This commit fixes the "/MM/charsets/gsm7/default-chars" unit test
after having it updated to perform the full conversion cycle:
   UTF-8 -> packed GSM7 -> UTF-8
2020-01-24 09:57:54 +01:00
Aleksander Morgado
6c80577bec tests,charsets: full gsm7/pack/unpack/utf8 sequence in tests 2020-01-24 09:56:53 +01:00
Aleksander Morgado
20ab6550fb auth-provider: refactor and simplify
The auth provider setup is a bit over-engineered. Simplify it by
making a single MMAuthProvider object that may or may not use polkit,
depending on configure options. This object is also setup as a
singleton object using the helper MM_DEFINE_SINGLETON_GETTER().
2020-01-23 11:50:23 +00:00
Aleksander Morgado
a6a3db2184 base-modem: use g_steal_pointer() during dispose
g_steal_pointer() sets the original location to NULL already, so it's
very handy.
2020-01-22 18:21:25 +01:00
Aleksander Morgado
3490f997f9 base-modem: serial ports require 'timed-out' signal disconnection on cleanup
Fixes https://lists.freedesktop.org/archives/modemmanager-devel/2020-January/007686.html
2020-01-22 18:21:17 +01:00
Aleksander Morgado
9b56ce8ccc base-modem: new helper method to cleanup ports during modem dispose
The different types of ports available in the modem will require
different types of cleanup actions. E.g. QMI and MBIM ports need an
explicit device close, and some other port types may need other
cleanups.
2020-01-22 18:19:02 +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
bf76fcd526 port-qmi: use qmi_device_close_async() in the port open logic
The qmi_device_close() synchronous operation is deprecated.
2020-01-22 13:15:08 +01:00
Aleksander Morgado
de8b6dd019 port-mbim: use qmi_device_close_async()
The qmi_device_close() synchronous operation is deprecated.
2020-01-22 13:15:08 +01:00
Aleksander Morgado
31c94a883b broadband-modem-qmi: no longer need QMI port cleanup in finalize()
We're already doing it in dispose() since commit
00bb228472.
2020-01-22 13:11:24 +01:00
Aleksander Morgado
e793e4e6d8 base-modem: fix list iteration closing MBIM ports
The mm_port_mbim_close() operation needs 3 arguments explicitly, so
make sure we provide the two additional ones as NULL.
2020-01-22 13:09:19 +01:00
Aleksander Morgado
5e4b559f48 build: add note for glib < 2.55.1 2020-01-21 10:58:55 +01:00
Aleksander Morgado
ddb7d915a7 libmm-glib: unconditionally define autoptr support for all types
As we now depend on glib 2.48
2020-01-15 18:56:21 +01:00
Aleksander Morgado
40e9434cc3 altair-lte: use autoptr support from glib 2020-01-15 18:56:01 +01:00
Aleksander Morgado
f775721817 build: bump minimum glib required version to 2.48 2020-01-15 18:49:09 +01:00
Aleksander Morgado
00bb228472 broadband-modem-{qmi,mbim}: port cleanups always during dispose()
If we need to disconnect signal handlers for the different port
objects managed in the QMI/MBIM modems, we need to do that during
dispose(), as there is no guarantee at all that the port objects will
exist in the MMBaseModem by the time finalize() is run.

  ModemManager[4183]: <debug> [1579097652.255333] Modem (Sierra) '/sys/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8.4' completely disposed
  ModemManager[4183]: [/dev/cdc-wdm1] unexpected port hangup!
  ModemManager[4183]: [/dev/cdc-wdm1] channel destroyed
  ModemManager[4183]: <info>  [1579097652.258186] Connection to mbim-proxy for /dev/cdc-wdm1 lost, reprobing

  (ModemManager:4183): GLib-GObject-WARNING **: 15:14:12.258: invalid unclassed pointer in cast to 'MMBaseModem'
  ModemManager[4183]: mm_base_modem_set_reprobe: assertion 'MM_IS_BASE_MODEM (self)' failed

  (ModemManager:4183): GLib-GObject-WARNING **: 15:14:12.258: invalid unclassed pointer in cast to 'MMBaseModem'
  ModemManager[4183]: mm_base_modem_set_valid: assertion 'MM_IS_BASE_MODEM (self)' failed
  ModemManager[4183]: [/dev/cdc-wdm1] unexpected port hangup!
  ModemManager[4183]: [/dev/cdc-wdm1] channel destroyed
  ModemManager[4183]: [/dev/cdc-wdm1] MBIM error: Cannot write message: Broken pipe
  ModemManager[4183]: [/dev/cdc-wdm1] MBIM error: Cannot write message: Broken pipe
  ModemManager[4183]: [/dev/cdc-wdm1] MBIM error: Cannot write message: Broken pipe
  ModemManager[4183]: [/dev/cdc-wdm1] MBIM error: Cannot write message: Broken pipe
2020-01-15 15:37:06 +01:00
Aleksander Morgado
246fe710b7 iface-modem-location: fix big memleak when processing location updates
The GVariants that we obtain during the processing of the "previous"
dictionary with g_variant_iter_next() are full references, while the
GVariants that we obtain processing the input MMLocationXX objects are
floating references.

The code was working well with the floating references only, as it was
assumed that g_variant_builder_add() would take ownership of them as
full references; but when the GVariant came from the
g_variant_iter_next() processing, g_variant_builder_add() would take a
full new extra reference, triggering the memory leak.

Fix this, by making sure that we always work with full GVariant
references in all cases, converting the floating ones with
g_variant_ref_sink() and making sure we explicitly unref them after
g_variant_builder_add().

  ==3146== 112 (48 direct, 64 indirect) bytes in 1 blocks are definitely lost in loss record 4,532 of 4,887
  ==3146==    at 0x483877F: malloc (vg_replace_malloc.c:309)
  ==3146==    by 0x50D53DA: g_malloc (gmem.c:99)
  ==3146==    by 0x50F19ED: g_slice_alloc (gslice.c:1024)
  ==3146==    by 0x511D639: g_variant_alloc (gvariant-core.c:486)
  ==3146==    by 0x511D6F9: g_variant_new_from_bytes (gvariant-core.c:529)
  ==3146==    by 0x51146C3: g_variant_new_from_trusted (gvariant.c:326)
  ==3146==    by 0x5115D28: g_variant_new_string (gvariant.c:1264)
  ==3146==    by 0x48EC642: mm_location_3gpp_get_string_variant (mm-location-3gpp.c:294)
  ==3146==    by 0x196350: build_location_dictionary (mm-iface-modem-location.c:162)
  ==3146==    by 0x197E0C: handle_setup_auth_ready (mm-iface-modem-location.c:891)
  ==3146==    by 0x4EC9160: g_task_return_now (gtask.c:1212)
  ==3146==    by 0x4EC92AA: g_task_return (gtask.c:1281)

  ==3146== 41,658 (35,520 direct, 6,138 indirect) bytes in 740 blocks are definitely lost in loss record 4,887 of 4,887
  ==3146==    at 0x483877F: malloc (vg_replace_malloc.c:309)
  ==3146==    by 0x50D53DA: g_malloc (gmem.c:99)
  ==3146==    by 0x50F19ED: g_slice_alloc (gslice.c:1024)
  ==3146==    by 0x511E02B: g_variant_get_child_value (gvariant-core.c:1093)
  ==3146==    by 0x5114FA7: g_variant_get_variant (gvariant.c:748)
  ==3146==    by 0x511B196: g_variant_valist_get_nnp (gvariant.c:4934)
  ==3146==    by 0x511B87B: g_variant_valist_get_leaf (gvariant.c:5051)
  ==3146==    by 0x511BFBF: g_variant_valist_get (gvariant.c:5232)
  ==3146==    by 0x511C145: g_variant_valist_get (gvariant.c:5267)
  ==3146==    by 0x511C953: g_variant_iter_next (gvariant.c:5667)
  ==3146==    by 0x1962F5: build_location_dictionary (mm-iface-modem-location.c:128)
  ==3146==    by 0x19659A: notify_gps_location_update (mm-iface-modem-location.c:231)
2020-01-10 14:05:05 +01:00
Aleksander Morgado
7c66b608c9 iface-modem-location: fix very very unlikely memory leak 2020-01-10 13:21:16 +01:00
Aleksander Morgado
97f9679b70 iface-modem-location: assert if rewriting a variant during iteration
This should never ever happen, so assert
2020-01-10 13:21:05 +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
e3e837a8a7 broadband-modem-qmi: plug memleak when checking unlock status with DMS UIM
==990910== 28 bytes in 1 blocks are definitely lost in loss record 1,943 of 5,051
  ==990910==    at 0x483877F: malloc (vg_replace_malloc.c:309)
  ==990910==    by 0x50D53DA: g_malloc (gmem.c:99)
  ==990910==    by 0x50F19ED: g_slice_alloc (gslice.c:1024)
  ==990910==    by 0x50F1A2D: g_slice_alloc0 (gslice.c:1050)
  ==990910==    by 0x4A3FD4A: __qmi_message_dms_uim_get_pin_status_response_parse (qmi-dms.c:8212)
  ==990910==    by 0x4A6AFEA: uim_get_pin_status_ready (qmi-dms.c:31662)
  ==990910==    by 0x4EADC8B: g_simple_async_result_complete (gsimpleasyncresult.c:802)
  ==990910==    by 0x4EADCBF: complete_in_idle_cb.lto_priv.0 (gsimpleasyncresult.c:814)
  ==990910==    by 0x50CF4AE: g_idle_dispatch (gmain.c:5617)
  ==990910==    by 0x50CC6F0: g_main_dispatch (gmain.c:3179)
  ==990910==    by 0x50CD616: g_main_context_dispatch (gmain.c:3844)
  ==990910==    by 0x50CD81B: g_main_context_iterate (gmain.c:3917)
2020-01-09 14:06:14 +01:00
Aleksander Morgado
fbc1e3f89e device: don't reprobe if device is gone
When a QMI/MBIM device is unplugged, we first get the notification
from the proxy that the communication is broken, and then we get the
kernel event reporting that the cdc-wdm port is gone.

If we reprobe the device as soon as the proxy notifies us that the
communication is broken, we would end up trying to reprobe the cdc-wdm
port when it's already gone, and we end up trying to create a modem
object when we shouldn't:

   <debug> [1577963152.429386] (ttyUSB0) unexpected port hangup!
   <debug> [1577963152.429506] (ttyUSB0) forced to close port
   <debug> [1577963152.429546] (ttyUSB0) device open count is 0 (close)
   <debug> [1577963152.429582] (ttyUSB0) closing serial port...
   <debug> [1577963152.429653] (ttyUSB0) serial port closed
   <debug> [1577963152.430340] (ttyUSB2) unexpected port hangup!
   <debug> [1577963152.430391] (ttyUSB2) forced to close port
   <debug> [1577963152.430418] (ttyUSB2) device open count is 0 (close)
   <debug> [1577963152.430451] (ttyUSB2) closing serial port...
   <debug> [1577963152.430517] (ttyUSB2) serial port closed
   <info>  [1577963152.436932] (tty/ttyUSB0): released by device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3'
   <info>  [1577963152.439176] (tty/ttyUSB1): released by device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3'
   <info>  [1577963152.440409] (tty/ttyUSB2): released by device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3'
   <info>  [1577963152.447977] (net/wwan1): released by device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3'
   Cannot read from istream: connection broken
   <info>  [1577963152.458878] Connection to qmi-proxy for /dev/cdc-wdm1 lost, reprobing
   <debug> [1577963152.459144] [device /sys/devices/pci0000:00/0000:00:14.0/usb2/2-3] unexported modem from path '/org/freedesktop/ModemManager1/Modem/1'
   <debug> [1577963152.460151] (ttyUSB1) forced to close port
   <info>  [1577963152.460182] [device /sys/devices/pci0000:00/0000:00:14.0/usb2/2-3] creating modem with plugin 'Sierra' and '1' ports
   <debug> [1577963152.460199] QMI-powered Sierra modem found...
   <debug> [1577963152.460382] (cdc-wdm1) type 'qmi' claimed by /sys/devices/pci0000:00/0000:00:14.0/usb2/2-3
   <debug> [1577963152.460417] Modem (Sierra) '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3' completely disposed
   <warn>  [1577963152.460431] Could not recreate modem for device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3': Failed to find a net port in the QMI modem
   <debug> [1577963152.460526] Modem (Sierra) '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3' completely disposed
   <info>  [1577963152.460627] (usbmisc/cdc-wdm1): released by device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3'
   <debug> [1577963152.460666] Removing empty device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-3'

Fix this by delaying the reprobing attempt some time, and make sure we
cancel the reprobing if the device detects that all ports are gone.
2020-01-06 20:46:06 +00:00
Aleksander Morgado
941879b43a device: keep reference to object manager server
Instead of having the reference to the object manager server only
while the modem is exported, just keep a reference for as long as the
device object exists. This will make it easier to handle reprobing
logic.
2020-01-06 20:46:06 +00:00
Aleksander Morgado
debec6f650 iface-modem-3gpp: forced registration is not state
The request for forced registration is an implementation detail of
mm_iface_modem_3gpp_register_in_network(), not part of any state to
keep in the private info.
2020-01-06 20:17:08 +00:00
Aleksander Morgado
88983fd157 cinterion: use common re-registration logic when needed
If the modem requires +COPS re-registration after setting modes,
use the common logic provided by the 3GPP interface, which
already knows e.g. whether the registration was automatic or the
actual requested operator id in case of being manual.
2020-01-06 20:17:08 +00:00
Aleksander Morgado
a1966222e9 ublox: use common re-registration logic when needed
If the modem requires +COPS re-registration after setting bands or
modes, use the common logic provided by the 3GPP interface, which
already knows e.g. whether the registration was automatic or the
actual requested operator id in case of being manual.

This will also make the u-blox plugin use the common +COPS set command
implemented in the broadband modem object, which has the fallback to
use the MCCMNC encoded in the current charset if needed.
2020-01-06 20:17:08 +00:00
Aleksander Morgado
32fcac5ce7 iface-modem-3gpp: allow re-registering in network with last settings
This is going to be used by modems that require this operation
e.g. after changing access technology or bands.
2020-01-06 20:17:08 +00:00
Aleksander Morgado
4862e42c86 iface-modem-3gpp: fix manual re-registration to the same operator
We should not assume that a manual registration request to a given
operator is successful if the modem is already registered in that
operator, because if the registration was due to an automatic process,
we cannot make sure the modem won't roam to a different network.

We should only assume that a manual registration is not needed to be
relaunched if the modem is already registered in the requested network
AND if the registration process was manual (i.e. we asked the modem to
lock into a given network).
2020-01-06 20:17:08 +00:00