Commit Graph
47 Commits
Author SHA1 Message Date
Aleksander Morgado 7d5871c59c iface-modem-location: port to use object logging 2020-04-08 16:35:08 +02:00
Aleksander Morgado 00dc961cad iface-modem-location: common helper code to test raw gps 2020-02-07 14:42:16 +00:00
Aleksander Morgado a61caff747 iface-modem-location: plug memleaks when updating gps raw variant
The helper method returning a variant from a MMLocationGpsRaw would
return already a full variant reference instead of a floating one, so
we were really increasing the refcount when doing g_variant_ref_sink()
in the location interface.

Fix this by consolidating all helper methods in libmm-glib that return
variants from the different MMLocationXX objects, so that they all
return full variants instead of floating ones.
2020-02-07 14:42:16 +00:00
Aleksander Morgado 8798ea889d iface-modem-location: fix warnings with -Wimplicit-fallthrough
mm-iface-modem-location.c: In function ‘interface_disabling_step’:
  mm-iface-modem-location.c:1389:18: error: this statement may fall through [-Werror=implicit-fallthrough=]
   1389 |         ctx->step++;
        |         ~~~~~~~~~^~
  mm-iface-modem-location.c:1391:5: note: here
   1391 |     case DISABLING_STEP_DISABLE_GATHERING:
        |     ^~~~
  ...
2020-01-30 11:59:14 +01:00
Aleksander Morgado 3ab3968e8f iface-modem-location: fix warnings with -Wswitch-default
mm-iface-modem-location.c: In function ‘interface_disabling_step’:
  mm-iface-modem-location.c:1386:5: error: switch missing default case [-Werror=switch-default]
   1386 |     switch (ctx->step) {
        |     ^~~~~~
  mm-iface-modem-location.c: In function ‘interface_enabling_step’:
  mm-iface-modem-location.c:1505:5: error: switch missing default case [-Werror=switch-default]
   1505 |     switch (ctx->step) {
        |     ^~~~~~
  mm-iface-modem-location.c: In function ‘interface_initialization_step’:
  mm-iface-modem-location.c:1709:5: error: switch missing default case [-Werror=switch-default]
   1709 |     switch (ctx->step) {
        |     ^~~~~~
2020-01-30 11:59:14 +01:00
Aleksander Morgado c1ffe15b92 iface-modem-location: fix warnings with -Wswitch-enum
mm-iface-modem-location.c: In function ‘update_location_source_status’:
  mm-iface-modem-location.c:482:5: error: enumeration value ‘MM_MODEM_LOCATION_SOURCE_NONE’ not handled in switch [-Werror=switch-enum]
    482 |     switch (source) {
        |     ^~~~~~
2020-01-30 11:59:14 +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 d5dc9751b6 location,agps: include support for MSB A-GPS 2019-04-09 12:24:39 +00:00
Aleksander Morgado caa1f8fdc1 iface-modem-location: define first and last location sources
Much clearer to understand when looping through them.
2019-04-09 12:24:39 +00:00
Aleksander Morgado b77aa7ab0e location,agps: explicitly specify that MSA A-GPS is implemented
The A-GPS based implementations we currently have assume MSA A-GPS, so
rename the MMModemLocationSource enum value to reflect that.
2019-04-09 12:24:39 +00:00
Aleksander Morgado a0cb8b4dd5 iface-modem-location: allow enabling unmanaged gps even if raw/nmea enabled
But only if the plugin implementation allows to do so.
2019-04-02 08:40:26 +00:00
Aleksander Morgado 0ca95254ae libmm-glib,location-3gpp: don't ignore location updates when MNC is 0
E.g. China Mobile (MCC 460, MNC 0).

    $ mmcli -m toby --location-get

    /org/freedesktop/ModemManager1/Modem/0
      -------------------------
      3GPP location   | Mobile country code: '460'
                      | Mobile network code: '0'
                      |  Location area code: '6188'
                      |             Cell ID: '40955'
      -------------------------
      GPS NMEA traces | Not available
      -------------------------
      Raw GPS         | Not available
      -------------------------
      CDMA BS         | Not available
2018-09-25 19:21:00 +02:00
Aleksander Morgado 6e84f3d459 iface-modem-location: validate SUPL server address
Devices will expect SUPL server given as either IP:PORT or FQDN:PORT,
so just avoid saying we require a 'URL' because it's not true.

We will use a new helper method to parse and validate user-provided
SUPL server address.
2018-09-12 17:14:36 +00:00
Aleksander Morgado 091bf4dbd8 api: support location assistance data
Sometimes SUPL-server based A-GPS is not possible, e.g. if the module
doesn't have Internet connectivity. In such cases, the modem may
support injecting additional "assistance data" that may be downloaded
from the Internet using external means (e.g. WiFi), in order to keep
having a quick time to first fix.

We now support using this location assistance data, with the following
new API elements:

 * A new mask of supported assistance data types is provided in the
   SupportedAssistanceData property.

 * A new list of URLs from where the aassistance data may be
   downloaded is also provided in a new AssistanceDataServers
   property.

 * A new InjectAssistanceData() method is provided, to perform the
   data injection in the module once it's been downloaded to the host
   system.
2018-08-21 13:26:08 +00:00
Aleksander Morgado 7e6b4d7aa9 api,location: give Tracking Area Code field in 3GPP location info
The "location area code" field is given in GSM/UMTS networks
exclusively. LTE networks use the concept of "tracking area code"
instead.

This patch updates the Location interface to Provide separate fields
for LAC and TAC, instead of giving TAC values in the LAC field.
2018-08-08 21:46:28 +02:00
Ben Chan 8101ce3f15 iface-modem-location: port mm_iface_modem_location_enable to use GTask 2017-06-28 10:17:20 +02:00
Ben Chan 7c2c7bc763 iface-modem-location: port mm_iface_modem_location_initialize to use GTask 2017-06-28 10:17:20 +02:00
Ben Chan adc30c7073 iface-modem-location: port setup_gathering to use GTask 2017-06-27 10:27:13 +02:00
Ben Chan ed8cc03f97 iface-modem-location: port mm_iface_modem_location_disable to use GTask 2017-06-27 10:27:13 +02:00
Aleksander Morgado 6c35878f12 location: support updating the GPS refresh time
The default setup uses a refresh time of 30s, which means that even if the GPS
location updates are received at a higher frequency, the DBus interface will
still expose at most one update every 30s.

This patch includes a new "SetGpsRefreshTime()" method in the Location
interface, which takes a single 'u' parameter, specifying the refresh rate to
use, in seconds. This method also allows 0 being passed, which will make the
implementation to publish the GPS location updates are soon as ModemManager
detects them.

Along with the new method, a "GpsRefreshTime" read-only property is exposed
to specify the refresh time in effect.

The new method and property will only be applicable if the device has GPS
capabilities.

https://bugs.freedesktop.org/show_bug.cgi?id=89924
2015-12-19 12:22:30 +01:00
Aleksander Morgado 0dd707a279 iface-modem-location: don't print location info to syslog with info level
Use debug level, which has to be explicitly requested by the user.

https://bugs.freedesktop.org/show_bug.cgi?id=87498
2014-12-26 16:36:32 +01:00
Aleksander Morgado 63f2e72c6c iface-modem-location: load SUPL server setup when initializing interface 2014-09-05 11:30:24 +02:00
Aleksander Morgado d20f3e5d60 iface-modem-location: handle setting SUPL server 2014-09-05 11:30:24 +02:00
Aleksander Morgado fbeee20d5b introspection,api: add SUPL server configuration in the Location interface 2014-09-05 11:28:10 +02:00
Aleksander Morgado ad67d68179 location: new 'unmanaged' GPS setup
Standard GPS setup (raw/nmea) will both enable the GPS module and take full
control of the GPS port. This prevents other processes from reading the NMEA
traces from e.g. a tty. In order to handle this, a new 'unmanaged' GPS location
source is introduced, which will just enable/disable the GPS module, without
reading anything from the GPS port. Of course, both raw/nmea and unmanaged
setups cannot be enabled at the same time.
2014-07-02 12:28:56 +02:00
Aleksander Morgado 4d4ea9c369 iface-modem-location: fix periodic reporting of the GPS location info
The Location property was never being updated properly.
2012-12-24 18:57:39 +01:00
Aleksander Morgado 31ec55aea8 iface-modem-location: implement handling the CDMA BS location source 2012-11-02 08:23:11 +01:00
Aleksander Morgado c16bcdf68c core: make sure objects retrieved with g_object_get() are valid in the ifaces
The interfaces usually retrieve objects (e.g. skeletons) from the Modem object
using g_object_get(), but we didn't make sure that these objects were actually
valid before using them.

This should clean up errors happening when the modem gets unplugged and still
some actions are ongoing.

Should fix https://bugzilla.gnome.org/show_bug.cgi?id=685933
2012-10-11 11:41:15 +02:00
Aleksander Morgado c250fa3797 libmm-glib: remove the `libmm-common.h' header
Both the ModemManager daemon and the mmcli will now include `libmm-glib.h' only.

We also handle two new special `_LIBMM_INSIDE_MM' and `LIBMM_INSIDE_MMCLI'
symbols, which if included before the `libmm-glib.h' library allow us to:

 * Don't include the libmm-glib high level API in the ModemManager daemon, as
   the object names would clash with those in the core.

 * Define some of the methods of helper objects to be included only if compiling
   ModemManager daemon or the mmcli.
2012-10-04 10:17:12 +02:00
Aleksander Morgado 26e95b2d3c iface-modem-location: don't try to update anything if no skeleton available 2012-08-28 17:21:08 +02:00
Aleksander Morgado 3cea187a94 location: update the status before running enabling/disabling sequences
This will allow implementations of location source enabling to actually update
the location information during the enabling phase.
2012-03-29 17:17:52 +02:00
Aleksander Morgado b80fdfdaa8 iface-modem-location: plug memleak and reference count mismatch 2012-03-29 09:18:04 +02:00
Aleksander Morgado 33e569bbab iface-modem-location: handle the raw GPS location source 2012-03-29 09:18:03 +02:00
Aleksander Morgado 53b500c11d iface-modem-location: handle the NMEA-based GPS location source 2012-03-29 09:18:03 +02:00
Aleksander Morgado ceefa2c356 location: rework to allow multiple location sources
Location sources can now be enabled or disabled by using the mask of sources
given in Setup() (similar previous Enable()).
2012-03-29 09:17:53 +02:00
Aleksander Morgado 2c4a69b190 iface-modem-location: let initialization and enabling sequences get cancelled 2012-03-16 14:53:24 +01:00
Aleksander Morgado cc6d4a97fb base-modem: new port getters and peekers
* mm_base_modem_peek_port_* () will return either a port object (no new
reference), or NULL if none available.

You would usually peek() a port if you're going to use it just in the current
method, as there is no way to that reference to get invalid (we're single
threaded).

 * mm_base_modem_get_port_* () will return either NEW references to valid
port objects, or NULL if none available.

And, you would usually get() a port, whenever you want the port object to be
valid even out of the current method, for example when keeping it in the
context of an async operation.

Also, we need to consider that the primary AT port MAY BE NULL when you
peek() or get() it. This is due to the fact that we may be releasing ports
(due to device disconnection) in the middle of async operations.
2012-03-16 14:53:23 +01:00
Aleksander Morgado cd63df938f libmm-common: `MMSimpleStatus' won't be considered internal any more
Renamed `MMCommonSimpleProperties' to `MMSimpleStatus', and removed the
`MMSimpleStatusProperties' provided in libmm-glib. We'll just use the original
one from libmm-common always.
2012-03-16 14:53:20 +01:00
Aleksander Morgado bb352d5da3 libmm-common: `MMLocation3gpp' won't be considered internal any more
Renamed `MMCommonLocation3gpp' to `MMLocation3gpp', and removed the
`MMModemLocation3gpp' provided in libmm-glib. We'll just use the original one
from libmm-common always.
2012-03-16 14:53:19 +01:00
Aleksander Morgado e2a5ab250e iface-modem-location: include policy authorization checks 2012-03-16 14:53:16 +01:00
Aleksander Morgado 21a722b616 core: don't pass primary port to interface initializations
They will all get it themselves.
2012-03-15 14:15:05 +01:00
Aleksander Morgado 3b443b6954 libmm-common: fix usage of main library header 2012-03-15 14:14:52 +01:00
Aleksander Morgado 71125777d3 iface-modem-location: handle 3GPP location 2012-03-15 14:14:52 +01:00
Aleksander Morgado 03c5f4e6fb iface-modem-location: handle enabling/disabling location gathering 2012-03-15 14:14:51 +01:00
Aleksander Morgado d0a845c819 iface-modem-location: new interface for Location-related stuff 2012-03-15 14:14:51 +01:00