Commit Graph

378 Commits

Author SHA1 Message Date
Aleksander Morgado
3d665d2209 libmm-glib,bearer-properties: fix usage of CMP_FLAGS_NO_RM_PROTOCOL 2021-04-09 00:53:12 +02:00
Aleksander Morgado
4b19b9693f libmm-glib,bearer-properties: fix 'allowed-auth' comparison 2021-03-24 11:00:22 +01:00
Aleksander Morgado
7ad2e3ce9c build: add support for the new SAR interface
Include the new SAR interface in the build so that gdbus-codegen
generates support for it in libmm-glib as well as proper documentation
in the API reference.
2021-03-23 08:49:30 +00:00
Teijo Kinnunen
74599e695b sim-qmi,libmm-glib: QMI implementation of get/set preferred networks 2021-03-12 10:42:37 +02:00
Aleksander Morgado
73db7f205c api,bearer: new 'Multiplexed' property
This property will be TRUE if the bearer has the data session
connected through a multiplexed interface.

If the bearer is disconnected, or connected without multiplexing, the
property will report FALSE.
2021-03-10 10:59:22 +01:00
Aleksander Morgado
05b9ab7c25 api,modem: new 'MaxActiveMultiplexedBearers' property
In addition to the amount of bearers a user may connect without
multiplexing enabled (the default until now), we now also expose the
maximum number of bearers a user may connect after enabling
multiplexing over one single network interface (if supported).

The method responsible for creating the MMBearerList is now also
subclassable, so that implementations supporting multiplexing can
provide their own version with their own thresholds.
2021-03-10 10:59:22 +01:00
Aleksander Morgado
35e20a48c8 api,modem: deprecate the 'MaxBearers' property
This property was never initialized with a correct value, we would
always use the same value as used for MaxActiveBearers, which isn't
technically right. Just suggest to ignore this property, and flag
it as deprecated.

In addition to deprecating the API property, we will internally no
longer limit the amount of bearer objects that may be created with
different connection settings. The bearer object exposed in DBus is a
representation of the connection that may be setup, and so we can hold
as many representations as we want as long as the amount of connected
bearers doesn't exceed the maximum amount for each modem.

Leaving around the disconnected modems also serves another purpose.
Each bearer holds information about the amount of times a connection
with it has been attempted, and the amount of data transferred through
it. If we use the Simple.Connect() method to connect the modem using
different bearer settings, we won't lose the information of the past
connection attempts with different settings.
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
Andrew Lassalle
71bad1d862 sim: Fix wrong return type
The function should return a boolean, so using g_return_if_fail is not
correct.
2021-03-09 15:38:16 -08:00
Teijo Kinnunen
8b1ae5afab modem-helpers,mm-base-sim: Sim.SetPreferredNetworks AT implementation
Implement Sim.SetPreferredNetworks method by using the AT+CPOL command.
2021-03-09 16:33:45 +01:00
Teijo Kinnunen
0919abaa2f mmcli,sim: implement --sim-set-preferred-networks function 2021-03-09 08:52:55 +02:00
Teijo Kinnunen
66e93751b8 api,sim: add new Sim.SetPreferredNetworks method
This commit includes D-Bus processing and documentation, but not any
modem access implementation.
2021-03-09 08:52:55 +02:00
Aleksander Morgado
438ff54d03 libmm-glib,tests: include string.h explicitly
For strlen()
2021-03-01 16:02:33 +01:00
Teijo Kinnunen
816beeffcb libmm-glib,modem-helpers,mm-base-sim: implement Sim.PreferredNetworks
The ModemManager1.Sim.PreferredNetworks property contains the preferred
networks (and access technologies, if available) configured to the
SIM card.

This commit implements preferred networks reading with AT+CPOL.
2021-02-26 12:28:01 +01:00
Aleksander Morgado
f10e4af919 libmm-glib,bearer-properties: fix 'allow roaming' comparison
Fix the 'allow roaming' setting comparison, which was breaking the
whole bearer properties comparison logic, and therefore making
Simple.Connect() recreate over and over the bearer with the same
settings.

Fixes 5629f47a59
2021-02-25 15:23:36 +01:00
Aleksander Morgado
5480cb67b2 libmm-glib,tests: add ishexstr/hexstr2bin/bin2hexstr unit tests 2021-02-23 11:35:11 +00:00
Aleksander Morgado
34de613dea libmm-glib,common-helpers: make hexstr2bin() return a guint8 array
It makes much more sense than returning a gchar array, as gchar is
signed.
2021-02-23 11:35:11 +00:00
Aleksander Morgado
6d8610d63e libmm-glib,common-helpers: ishexstr() fails on empty input string 2021-02-23 11:35:11 +00:00
Aleksander Morgado
8c30a6b6f8 libmm-glib,common-helpers: hexstr2bin fails on empty input string
Also, remove the trailing NUL byte that was appended to the output
binary stream, as it's not needed in any case.
2021-02-23 11:35:11 +00:00
Aleksander Morgado
a211981d4a libmm-glib,common-helpers: make hexstr2bin() accept input string length
Optionally given explicitly, and -1 can be used to assume it's
NUL-terminated.
2021-02-23 11:35:11 +00:00
Aleksander Morgado
657cabcfce libmm-glib,common-helpers: make hexstr2bin() return a GError
This util method checks whether the input string is a valid hex
string, so make sure we return a GError on failure.
2021-02-23 11:35:11 +00:00
Aleksander Morgado
6dd5ced86d libmm-glib,simple-connect-properties: add missing APIs to get/set RM protocol
Probably not a big deal, since no one has asked for these in the past
years, but let's add them for completeness with the DBus API.
2021-02-17 23:41:24 +01:00
Aleksander Morgado
c4f215c9cb libmm-glib,bearer-properties: consume 'rm-protocol' setting 2021-02-17 23:40:59 +01:00
Aleksander Morgado
5629f47a59 libmm-glib,bearer-properties: allow loose comparisons
When comparing bearer properties provided by the user versus loaded
from the modem, we shouldn't be very strict, e.g.:
 * Password or other fields may not be readable from the device.
 * Some fields may not apply at all (e.g. RM protocol for EPS bearers)
 * NULL strings could be assumed equal to empty strings.
 * If no explicit IP type specified, an IPv4 default may be assumed.
 * If no explicit allowed auth specified, 'none' default may be
   assumed.

These loose comparisons are applied when managing the initial EPS
bearer settings and status, and we keep the strict comparison only
during the connection attempt lookup of a bearer with certain
settings, as those bearer objects are all created in the same place
with the same rules.
2020-12-21 12:05:57 +00:00
Eric Caruso
61739ab934 libmm-glib,mmcli: add mm_sim_get_eid and add EID to mmcli output
This exposes the new EID property of the SIM object on mmcli.
2020-10-19 20:38:43 +00:00
Aleksander Morgado
924cf1af3c api,modem: new 'SetPrimarySimSlot' method
This new method allows changing the SIM slot considered as primary,
when the modem supports multiple SIM slots.

The generic handling of this method will make sure that the modem
object and all its SIM objects are re-probed from scratch as soon as a
successful SIM slot switch happens.

Implementations may report MM_CORE_ERROR_EXISTS when the switch
doesn't need to happen (e.g. if the requested SIM slot is already the
active one).
2020-08-28 14:59:06 +00:00
Aleksander Morgado
e7409b6898 api,modem: new 'SimSlots' and 'PrimarySimSlot' properties
The 'SimSlots' property exposes an array of SIM object paths, with one
array item for each available SIM slot in the system. If a valid SIM
card is found in a given slot, the path of the SIM object will be
exposed in the array item; if no valid SIM card is found, the empty
object path ("/") will be exposed instead.

The 'PrimarySimSlot' property exposes which of the SIM slots available
in the system is the one configured as being primary. In a Multi-SIM
Single-Standby setup, the primary slot will be the one corresponding
to the single active SIM in the system. In a Multi-SIM Multi-Standby
setup, the primary slot will be the one configured to act as primary
(e.g. the one that will be used for the data connection) among all the
active SIM cards found.
2020-08-28 14:59:06 +00:00
Aleksander Morgado
86a183778b api,sim: new 'Active' property
In preparation for the multi-SIM setup, we need a way to tell whether
a given SIM card is active or not in the system.

On systems with one single SIM slot, the available SIM card will
always be active.

On Multi-SIM Single-Standby setups we may have multiple SIM slots with
multiple SIM cards, but only one of them will be active at any given
time.

On Multi-SIM Multi-Standby setups we may have multiple SIM slots with
multiple SIM cards that may be active at the same time. E.g. the QMI
protocol allows up to 5 different active SIM cards (primary,
secondary, tertiary...).
2020-08-28 14:59:06 +00:00
Walter Hagstrom
88923ffe39 iface-modem-signal: added 5G signal information
Extended the ModemManager Signal interface to include 5G signal
information for RSRP, RSRQ and SINR via libqmi.  Also extended mmci
to print 5G signal info.
2020-07-04 05:50:41 +02:00
Aleksander Morgado
619b054e5c libmm-glib,location: avoid warnings when no traces available
ModemManager[201411]: <debug> [1593417744.011884] [modem0/ttyUSB1/gps] <-- '$GPVTG,,T,,M,,N,,K,N*2C<CR><LF>$GPGSA,A,1,,,,,,,,,,,,,,,*1E<CR><LF>$GPGGA,,,,,,0,,,,,,,,*66<CR><LF>$GPRMC,,V,,,,,,,,,,N*53<CR><LF>'

    (ModemManager:201411): GLib-CRITICAL **: 10:02:24.054: g_strjoinv: assertion 'str_array != NULL' failed

    Thread 1 "ModemManager" received signal SIGTRAP, Trace/breakpoint trap.
    0x00007ffff7832473 in g_logv () from /usr/lib/libglib-2.0.so.0
    (gdb) bt
    #0  0x00007ffff7832473 in g_logv () at /usr/lib/libglib-2.0.so.0
    #1  0x00007ffff78326f0 in g_log () at /usr/lib/libglib-2.0.so.0
    #2  0x00007ffff7846b5e in g_strjoinv () at /usr/lib/libglib-2.0.so.0
    #3  0x00007ffff7ee9663 in mm_location_gps_nmea_get_string_variant (self=0x5555557dde50) at mm-location-gps-nmea.c:246
    #4  0x00005555555e7c47 in build_location_dictionary (previous=0x0, location_3gpp=0x55555573e660, location_gps_nmea=0x5555557dde50, location_gps_raw=0x0, location_cdma_bs=0x0)
        at mm-iface-modem-location.c:183
    ...
    (gdb) fr 3
    #3  0x00007ffff7ee9663 in mm_location_gps_nmea_get_string_variant (self=0x5555557dde50) at mm-location-gps-nmea.c:246
    246	    built = g_strjoinv ("\r\n", traces);
    (gdb) p traces
    $1 = (GStrv) 0x0
2020-06-29 08:53:00 +00:00
Aleksander Morgado
8bf1329481 libmm-glib,helpers: use locale-independent strtod()
Otherwise parsing may fail, e.g. as in this unit test:

  # Start of smoni tests
  # DEBUG: testing SMONI response: ^SMONI: 2G,71,-61,262,02,0143,83BA,33,33,3,6,G,NOCONN
  # DEBUG: testing SMONI response: ^SMONI: 2G,SEARCH,SEARCH
  # DEBUG: testing SMONI response: ^SMONI: 2G,673,-89,262,07,4EED,A500,16,16,7,4,G,5,-107,LIMSRV
  # DEBUG: testing SMONI response: ^SMONI: 2G,673,-80,262,07,4EED,A500,35,35,7,4,G,643,4,0,-80,0,S_FR
  # DEBUG: testing SMONI response: ^SMONI: 3G,10564,296,-7.5,-79,262,02,0143,00228FF,-92,-78,NOCONN
  **
  ERROR:cinterion/tests/test-modem-helpers-cinterion.c:1036:test_smoni_response: assertion failed (fabs (ecn0 - smoni_response_tests[i].ecn0) < 0.1): (0,5 < 0,1)
  Bail out! ERROR:cinterion/tests/test-modem-helpers-cinterion.c:1036:test_smoni_response: assertion failed (fabs (ecn0 - smoni_response_tests[i].ecn0) < 0.1): (0,5 < 0,1)
  Aborted (core dumped)
2020-05-19 13:44:23 +02:00
Aleksander Morgado
79daa3099e api,bearer: add 'total-rx-bytes', 'total-tx-bytes' and 'total-duration' stats
Compiling the amount of bytes transferred and received during all
tracked connection attempts, as well as the total duration of all the
connections.
2020-04-10 11:45:03 +00:00
Aleksander Morgado
f325ef5902 api,bearer: add 'attempts' and 'failed-attempts' statistics
When we're reusing over and over the same bearer object, we can
provide statistical information about the number of connection
attempts that have been done and how many of them failed.
2020-04-10 11:45:03 +00:00
Aleksander Morgado
ccb45a8941 libmm-glib,helpers: ignore all leading whitespaces when parsing numbers 2020-04-09 12:38:50 +00:00
Aleksander Morgado
1c7304eb71 libmm-glib,helpers: allow reading hex strings from match info 2020-04-09 12:38:50 +00:00
Aleksander Morgado
539562af01 libmm-glib,helpers: skip quotes when reading numbers from match infos
Useful when the regex applied to the parseable strings don't have an
special ignore rule for the quotes.
2020-04-09 12:38:50 +00:00
Aleksander Morgado
7354dc928f api: new 5GNR capability 2020-04-09 12:38:50 +00:00
Aleksander Morgado
0cd76bf1c4 api: deprecate MM_MODEM_CAPABILITY_LTE_ADVANCED
It's not used anywhere.
2020-04-09 12:38:49 +00:00
Aleksander Morgado
6de1363174 api,modem: improve capabilities related documentation
And remove the unused mm_common_build_capability_combinations_any()
method in the common non-public library code.
2020-04-09 06:46:02 +02: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
280363e0d6 libmm-glib,helpers: allow \r\n in string to number conversions
It's not uncommon that we may want to parse a simple AT response that
contains a single number by doing mm_strip_tag() followed by
mm_get_uint_from_str(). In order to do this, we need to have the
helper methods that convert strings to numbers support \r\n characters
at the end of the string, as we would have in AT responses.
2020-01-31 15:48:16 +01:00
Aleksander Morgado
11f04851ce libmm-glib,location-gps-nmea: avoid using deprecated build_full() method
mm-location-gps-nmea.c: In function ‘mm_location_gps_nmea_get_string_variant’:
  mm-location-gps-nmea.c:245:5: warning: ‘mm_location_gps_nmea_build_full’ is deprecated: Use 'mm_location_gps_nmea_get_traces' instead [-Wdeprecated-declarations]
    245 |     built = mm_location_gps_nmea_build_full (self);
        |     ^~~~~
2020-01-31 15:18:35 +01:00
Aleksander Morgado
02eafb5821 libmm-glib,test: avoid using deprecated mm_pco_list_free()
test-pco.c: In function ‘test_pco_list_add’:
  test-pco.c:82:5: warning: ‘mm_pco_list_free’ is deprecated [-Wdeprecated-declarations]
     82 |     mm_pco_list_free (list);
        |     ^~~~~~~~~~~~~~~~
  In file included from ../../libmm-glib/libmm-glib.h:82,
                   from test-pco.c:17:
  ../../libmm-glib/mm-pco.h:67:6: note: declared here
     67 | void mm_pco_list_free (GList *pco_list);
        |      ^~~~~~~~~~~~~~~~
2020-01-31 15:18:35 +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
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
baa68f5a4a libmm-glib,simple-connect-properties: cleaner error handling
If processing a key-value pair as a bearer property fails, we need to
know if it failed due to the key being unknown or due to some other
reason (e.g. failure parsing value of a known key).

We'll only try with the Simple.Connect properties if the key is
reported as unknown in the bearer properties.

This will help us better identify errors if e.g. an invalid value is
given to a known key. E.g. "yes" was invalid for allow-roaming here:

    daemon.notice netifd: wan (30476): simple connect=apn=internet,ip-type=ipv4,allow-roaming=yes
    daemon.notice netifd: wan (30476): Error parsing connect string: 'Invalid properties string, unexpected key 'allow-roaming''
2020-01-06 14:46:36 +01:00
Aleksander Morgado
15e8a78a15 libmm-glib,common-helpers: allow yes/no as booleans in string
E.g. so that the settings passed on Simple.Connect() or
Bearer.Connect() are parsed correctly from the user string:

  daemon.notice netifd: wan (30476): simple connect=apn=internet,ip-type=ipv4,allow-roaming=yes
  daemon.notice netifd: wan (30476): Error parsing connect string:
  'Invalid properties string, unexpected key 'allow-roaming''

This also goes inline with e.g. the --create-bearer help in the man
page that suggests using yes/no for the allow-roaming setting.
2020-01-06 14:39:45 +01:00
Aleksander Morgado
70910a6713 libmm-glib,nmea: deprecate mm_location_gps_nmea_build_full()
The new mm_location_gps_nmea_get_traces() is a much more generic way
to retrieve the full list of traces and suits the libmm-glib API much
better.
2020-01-01 09:22:41 +01:00
Aleksander Morgado
9805ffe1b0 libmm-glib,nmea: new method to get list of traces
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/120
2019-12-31 16:42:44 +01:00
Aleksander Morgado
fcbffbd123 libmm-glib,3gpp: make MMModem3gppNetwork a boxed type
So that bindings know how to free the list of structs.

This commit ends up triggering an API break in the bindings generated
via GObject introspection, because the methods to access the items of
a MMModem3gppNetwork are no longer treated as Modem3gpp class methods.

E.g. instead of:
  ModemManager.Modem3gpp.network_get_operator_code(network)
We should now do:
  network.get_operator_code()

There is no API break in libmm-glib.
2019-12-13 18:04:02 +01:00