Commit Graph
103 Commits
Author SHA1 Message Date
Ben Chan 7ac30db4b7 iface-modem-3gpp: port mm_iface_modem_3gpp_register_in_network to use GTask 2017-06-30 11:39:14 +02:00
Ben Chan 1bfe5434bb iface-modem-3gpp: port mm_iface_modem_3gpp_reload_current_registration_info to use GTask 2017-06-30 10:56:47 +02:00
Ben Chan c973eb41b2 iface-modem-3gpp: port mm_iface_modem_3gpp_disable to use GTask 2017-06-30 10:56:47 +02:00
Ben Chan da8b069f80 iface-modem-3gpp: port mm_iface_modem_3gpp_enable to use GTask 2017-06-30 10:56:47 +02:00
Ben Chan c08de58668 iface-modem-3gpp: port mm_iface_modem_3gpp_initialize to use GTask 2017-06-30 10:56:47 +02:00
Aleksander Morgado 8ad868cea2 iface-modem: consolidate signal quality and access tech polling
Plugins have two ways to update signal quality and access technology
values: via unsolicited messages or via polling periodically.

Instead of keeping separate contexts for polling signal quality and
access technology values, we setup a common timeout to trigger
both. This allows us to simplify in which case the explicit update is
required, whenever one is needed to be explicitly updated, the other
one should also be.

The logic now also allows plugins to return an UNSUPPORTED error in
either load_signal_quality() and/or load_access_technologies() to tell
the interface logic that the polling of the specific item shouldn't be
performed (e.g. if the updates are expected via unsolicited messages).

If both signal quality and access technology polling is flagged as
disabled, we totally disable the polling logic internally.

The new SignalCheckContext is bound to the lifetime of the object so
that we can keep the value of the supported flags until the object is
destroyed.
2017-06-06 15:20:51 +02:00
Dan Williams 230e732a24 iface-modem-3gpp: use mm_3gpp_parse_operator_id() instead of custom code 2017-03-17 22:48:39 -05:00
Aleksander Morgado fe460b2f54 3gpp: update registration state enumeration with CSFB related states
Introduce "sms only" and "CSFB not preferred" home/roaming states to be reported
for the CS context, while already registered on LTE.

Based on 3GPP TS 27.007 v13.5.0.
2016-10-12 13:24:08 +02:00
Aleksander Morgado ffde429843 core: use G_SOURCE_REMOVE and G_SOURCE_CONTINUE in GSourceFuncs 2015-12-02 17:07:39 +01:00
Aleksander Morgado 5b568e97f8 iface-modem-3gpp: allow LAC/CID updates reported while registering
When changing from idle to registered we'll load registration info before really
reporting that we're registered (so that clients can get the new registration
info directly). During this time, we should also allow LAC/CID updates triggered
in the location interface.

E.g. when receiving this QMI message, we're not processing LAC/CID because when
they get reported, the registration state was not yet 'registered':

    [/dev/cdc-wdm0] Received message (translated)...
    >>>>>> QMUX:
    >>>>>>   length  = 67
    >>>>>>   flags   = 0x80
    >>>>>>   service = "nas"
    >>>>>>   client  = 1
    >>>>>> QMI:
    >>>>>>   flags       = "indication"
    >>>>>>   transaction = 0
    >>>>>>   tlv_length  = 55
    >>>>>>   message     = "Serving System" (0x0024)
    >>>>>> TLV:
    >>>>>>   type       = "MNC PCS Digit Include Status" (0x29)
    >>>>>>   length     = 5
    >>>>>>   value      = D6:00:01:00:00
    >>>>>>   translated = [ mcc = '214' mnc = '1' includes_pcs_digit = 'no' ]
    >>>>>> TLV:
    >>>>>>   type       = "LTE TAC" (0x25)
    >>>>>>   length     = 2
    >>>>>>   value      = 08:01
    >>>>>>   translated = 264
    >>>>>> TLV:
    >>>>>>   type       = "Detailed Service Status" (0x22)
    >>>>>>   length     = 5
    >>>>>>   value      = 02:03:00:01:00
    >>>>>>   translated = [ status = 'available' capability = 'cs-ps' hdr_status = 'none' hdr_hybrid = 'yes' forbidden = 'no' ]
    >>>>>> TLV:
    >>>>>>   type       = "CID 3GPP" (0x1e)
    >>>>>>   length     = 4
    >>>>>>   value      = 01:A1:4D:04
    >>>>>>   translated = 72196353
    >>>>>> TLV:
    >>>>>>   type       = "LAC 3GPP" (0x1d)
    >>>>>>   length     = 2
    >>>>>>   value      = FE:FF
    >>>>>>   translated = 65534
    >>>>>> TLV:
    >>>>>>   type       = "Current PLMN" (0x12)
    >>>>>>   length     = 5
    >>>>>>   value      = D6:00:01:00:00
    >>>>>>   translated = [ mcc = '214' mnc = '1' description = '' ]
    >>>>>> TLV:
    >>>>>>   type       = "Data Service Capability" (0x11)
    >>>>>>   length     = 2
    >>>>>>   value      = 01:0B
    >>>>>>   translated = { [0] = 'lte '}
    >>>>>> TLV:
    >>>>>>   type       = "Serving System" (0x01)
    >>>>>>   length     = 6
    >>>>>>   value      = 01:01:01:02:01:08
    >>>>>>   translated = [ registration_state = 'registered' cs_attach_state = 'attached' ps_attach_state = 'attached' selected_network = '3gpp' radio_interfaces = '{ [0] = 'lte '}' ]
    <debug> [1444895382.427216] Processing 3GPP info...
    <info>  [1444895382.433423] Modem /org/freedesktop/ModemManager1/Modem/3: 3GPP Registration state changed (idle -> registering)

    [ Here we tried to update LAC/CID ]

    <debug> [1444895382.439668] Modem /org/freedesktop/ModemManager1/Modem/3: 3GPP location updated (MCC: '214', MNC: '1', Location area code: '0', Cell ID: '0')
    <info>  [1444895382.446788] Modem /org/freedesktop/ModemManager1/Modem/3: 3GPP Registration state changed (registering -> home)
    <info>  [1444895382.452383] Modem /org/freedesktop/ModemManager1/Modem/3: state changed (enabled -> registered)
2015-10-15 11:35:58 +02:00
Aleksander Morgado 0579ac076a mm-broadband-modem: trigger registration checks only after enabling all ifaces
Given that the Location interface requires 3GPP info reported by the 3GPP
interface, we should only trigger registration checks once the Location
interface has been already enabled and ready to be used. If we don't do this,
we'll end up e.g. getting initial MCCMNC values but never reaching the Location
interface properly.

So, fix this by triggering all registration checks (CDMA and 3GPP) only after
having enabled all interfaces.
2015-10-15 09:15:36 +02:00
Dan Williams 9186e2aa39 iface-modem-3gpp: used DENIED registration state if others are UNKNOWN
If all other registration states are UNKNOWN, use a registration state
of DENIED as the global modem state.
2015-02-23 10:25:14 -06:00
Aleksander Morgado 5358d6fea0 sim: rename 'MMSim' to 'MMBaseSim'
Just so that we don't have same header names in src/ and /libmm-glib.
2014-07-06 16:55:29 +02:00
Aleksander Morgado 8a47dce5fb iface-modem-3gpp: request access tech update after registration attempt 2014-02-28 16:35:18 +01:00
Thieu Le 87f0f808bf altair-lte: set subscription state using PCO
This patch sets the subscription state using Verizon's PCO values.
2014-01-18 14:08:31 +01:00
Thieu Le f9a4f87d52 iface-modem-3gpp: add SubscriptionState property 2013-10-09 09:59:42 +02:00
Aleksander Morgado 2bb0a23b1f iface-modem-3gpp: remove the deferred registration updates
We should really notify registration updates right away in the DBus interface.
2013-05-20 09:08:35 +02:00
ori inbar 98772f2ec9 iface-modem-3gpp: handle access technology change in operator_loading state
This patch fixes a problem of disregarding CEREG/CGREG/CREG reported
access technology since we are in "registering" state - meaning we are
loading operator name+code. now even in this transition state the ACT
is updated.
2013-03-28 20:13:20 +01:00
Aleksander Morgado d9cf4fe91c iface-modem-3gpp: let plugins ignore facility locks
Plugins may decide which facility locks can be completely skipped from the list
being checked.
2013-03-28 20:06:53 +01:00
Ben Chan 3678ae5378 iface-modem-3gpp: handle non-deferrable registration state updates
This patch changes MMIfaceModem3gpp to differentiate between deferrable
and non-deferrable 3GPP registration state updates. Periodic or
unsolicited registration state updates are deferrable, while internal
updates, e.g. due to modem being disabled, are non-deferrable.
2013-03-05 19:31:17 +01:00
Aleksander Morgado 9ee9845b1e iface-modem-3gpp: avoid re-setting deferred registration update while disabling
Don't clear the current deferred registration update until having disabled
and cleaned up unsolicited registrations state messages, or we may end up
re-setting the deferred registration update again meanwhile
2013-03-01 18:21:19 +01:00
Ben Chan f93bba25f2 iface-modem-3gpp: clear deferred registration state update when disabling 2013-03-01 08:44:43 +01:00
Ben Chan 8488782e14 iface-modem-3gpp: defer registration state update when registration is lost
This patch defers the update of 3GPP registration state by 15 seconds
when the registration state changes from 'registered' (home / roaming)
to 'searching'. This allows a temporary loss of 3GPP registration to
recover itself when relying on ModemManager to explicitly disconnect and
reconnect to the network.
2013-02-25 09:10:56 +01:00
Ben Chan 85b67ed8d9 modem: use +CEREG to determine EPS network registration status
This patch adds the support for solicited/unsolicited EPS network
registration status via AT+CEREG, which is configurable via the
'iface-modem-3gpp-eps-network-supported' property of the
MMIfaceModem3gpp interface and is disabled by default.
2013-02-15 08:53:45 +01:00
Ben Chan bc399d9cf8 iface-modem-3gpp,iface-modem-cdma: check for deallocated RegistrationCheckContext
This patch fixes a crash in periodic_registration_checks_ready() due to
access of an already deallocated RegistrationCheckContext.

Thread 0 *CRASHED* ( SIGSEGV @ 0x00000000 )

0x7fc344d355cd   [ModemManager]             - mm-iface-modem-cdma.c:1112   periodic_registration_checks_ready
0x7fc3449ea266   [libgio-2.0.so.0.3200.4]   - gsimpleasyncresult.c:767     g_simple_async_result_complete
0x7fc3449ea368   [libgio-2.0.so.0.3200.4]   - gsimpleasyncresult.c:779     complete_in_idle_cb
0x7fc344851dc4   [libglib-2.0.so.0.3200.4]  - gmain.c:2539                 g_main_context_dispatch
0x7fc344852147   [libglib-2.0.so.0.3200.4]  - gmain.c:3146                 g_main_context_iterate
0x7fc3448525a1   [libglib-2.0.so.0.3200.4]  - gmain.c:3340                 g_main_loop_run
0x7fc344d0f154   [ModemManager]             - main.c:158                   main
0x7fc34426a474   [libc-2.15.so]             - libc-start.c:234             __libc_start_main
0x7fc344d0eb68   [ModemManager]             + 0x0001bb68
2013-01-03 22:28:34 +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 c2b246414c iface-modem-3gpp: update state to REGISTERED after loading operator code/name
Call managers all want to be able to set the operator ID and/or name as soon as
we get registered. We will consider now that whenever we get into registered
state we already have operator code and name updated to the proper values.

Applications shouldn't, though, just rely on those values to be valid as long as
we're registered, as the modem may re-register automatically in some other
network (e.g. going from a roaming network to the home network).

This change involves not setting the state to REGISTERED until operator name
and code loading sequences have been run. We will still signal in the log the
change, with a new 'registering' intermediate state indication.
2012-09-14 06:43:49 +02:00
Aleksander Morgado fe4d94788b iface-modem-3gpp: provide separate methods to update access tech and location 2012-08-29 17:26:45 +02:00
Aleksander Morgado f796c6d906 iface-modem-3gpp: log about which registration check will be run 2012-08-29 17:26:45 +02:00
Aleksander Morgado a6ff9b2a17 iface-modem-3gpp: implement the network registration request logic
In the generic broadband modem implementation we'll just implement the specific
command to request auto/manual network registration, and we leave all the other
logic (waiting for the new registration status and all that) in the interface,
as it is really common for every possible implementation.
2012-08-29 17:26:44 +02:00
Aleksander Morgado ae9e2df294 iface-modem-3gpp: don't try to update anything if no skeleton available 2012-08-28 17:25:32 +02:00
Aleksander Morgado 45e8aa50df iface-modem-3gpp: when disabled, cleanup interface properties 2012-08-06 20:18:15 +02:00
Aleksander Morgado 278842108c iface-modem-3gpp: refactor registration sequences
Once upon a time it was a good idea to have separate steps for CS and PS related
actions, so that plugins could override specific steps with a great detail. That
idea turned out to be not very useful, as the only case which requires custom
CS/PS registration actions is the QMI-enabled modem, and that one has commands
to act on both registration actions at the same time. So, we now consolidate
all steps, so that the implementation of the interface needs to provide all the
logic to setup/enable/disable/cleanup/check registrations in each mode.

Also, we consolidate how the unsolicited registration messages are handled, so
that it's equivalent to other unsolicited messages:
 * 'Setup' will configure ports to process the unsolicited messages.
 * 'Enable' will tell the modem to send unsolicited messages.
 * 'Disable' will tell the modem not to send unsolicited messages.
 * 'Cleanup will configure ports to ignore the unsolicited messages.
2012-08-06 20:17:00 +02:00
Aleksander Morgado 4aaafc54c7 iface-modem-3gpp: removed the 'setup indicators' step
The previous logic would first request to check if indicators were supported,
and only then allow to setup/enable/cleanup/disable unsolicited events. This
behaviour is very specific to the generic 3GPP case, and therefore it shouldn't
be handled in the even more generic 3GPP interface. The logic is still kept,
but handled within the MMBroadbandModem object.
2012-08-06 20:15:41 +02:00
Aleksander Morgado 05289d094b iface-modem-3gpp: fix variant ref count 2012-07-25 12:00:28 +02:00
Aleksander Morgado 209f4d4420 iface-modem-[3gpp|cdma]: remove contexts with timeouts when shutting down
Following the same logic as in commit 9ddcf92a, those contexts in the interface
which contain the setup of a timeout are cleared before removing the DBus
skeleton objects, so that we make sure they are not fired out once these have
been disposed.
2012-07-13 09:09:15 +02:00
Aleksander Morgado 7518772d4b core: fatal errors in iface initializations force the modem into a FAILED state
Modems which end up being found unusable (e.g. no SIM, fatal SIM error, no
capabilities) will be exposed in DBus, but just with the Modem interface and
in a FAILED state which allows no actions.
2012-03-30 13:47:00 +02:00
Aleksander Morgado 43bd3f95ae 3gpp: let operator name/code reloading be requested by implementations 2012-03-29 17:16:38 +02:00
Aleksander Morgado dc376bb725 3gpp: errors when reloading operator name/code will reset the values in the interface 2012-03-29 17:15:48 +02:00
Aleksander Morgado 3046059aff iface-modem-3gpp: if already registered as requested, don't try to register from scratch 2012-03-16 15:52:36 +01:00
Aleksander Morgado 0d4b644572 iface-modem-3gpp: let initialization and enabling sequences get cancelled 2012-03-16 14:53:24 +01:00
Aleksander Morgado d27e40ae9a core: new `Initializing' state in the global modem state machine
We need to define a state to be used while the modem is being initialized, so
that we forbid any operation on the modem on already exported interfaces, while
there are interfaces pending to get exported.

This Initializing state will also cover the state between having the SIM
unlocked (which launches re-initialization) and being completely initialized.
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 491d8e03f9 iface-modem-3gpp: update facilities mask when SIM PIN lock enabling status changes 2012-03-16 14:53:19 +01:00
Aleksander Morgado eb87c2fe07 iface-modem-3gpp: load initial set of enabled facility locks 2012-03-16 14:53:18 +01:00
Aleksander Morgado 12786d21cf core: remove uses of `MMModemStateReason'
Use `MMModemStateChangeReason' instead.
2012-03-16 14:53:17 +01:00
Aleksander Morgado 71a3de4486 iface-modem-3gpp: include policy authorization checks 2012-03-16 14:53:15 +01:00
Aleksander Morgado 049d4434f9 iface-modem-3gpp: include in the API the mask of all 3GPP access technologies 2012-03-16 14:28:14 +01:00