aboutsummaryrefslogtreecommitdiff
path: root/src/mm-iface-modem-3gpp.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2016-10-05 13:32:41 +0200
committerAleksander Morgado <aleksander@aleksander.es>2016-10-12 13:24:08 +0200
commitfe460b2f54b6a035a207815252fe87ee3a06351c (patch)
treed58b5312284d7fe4f0d5af29bd15e53595165cce /src/mm-iface-modem-3gpp.c
parenta561f6edf0317ee4eb86e6811cd8cd5a7fbf5e60 (diff)
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.
Diffstat (limited to 'src/mm-iface-modem-3gpp.c')
-rw-r--r--src/mm-iface-modem-3gpp.c75
1 files changed, 64 insertions, 11 deletions
diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c
index baf743fb..d38c4ca4 100644
--- a/src/mm-iface-modem-3gpp.c
+++ b/src/mm-iface-modem-3gpp.c
@@ -137,12 +137,11 @@ get_consolidated_reg_state (RegistrationStateContext *ctx)
ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)
return ctx->eps;
- if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
- return ctx->cs;
- if (ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
- return ctx->ps;
- if (ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
- return ctx->eps;
+ /* Searching? */
+ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING ||
+ ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING ||
+ ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
+ return MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
/* If one state is DENIED and the others are UNKNOWN, use DENIED */
if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED &&
@@ -158,7 +157,41 @@ get_consolidated_reg_state (RegistrationStateContext *ctx)
ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED)
return ctx->eps;
- return ctx->cs;
+ /* Emergency services? */
+ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY ||
+ ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY ||
+ ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY)
+ return MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY;
+
+ /* Support for additional registration states reported when on LTE.
+ *
+ * For example, we may see the modem registered in LTE (EPS==HOME), and we
+ * may get "SMS only" reported for CS.
+ *
+ * We give these states a very low priority w.r.t. the other ones as they
+ * are really likely never used (i.e. we would get as consolidated the LTE
+ * registration state, not the CS fall back state).
+ *
+ * We also warn in that case, because ideally we should always report the
+ * LTE registration state first, not this one.
+ */
+ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_SMS_ONLY ||
+ ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_SMS_ONLY ||
+ ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_CSFB_NOT_PREFERRED ||
+ ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED) {
+ mm_warn ("3GPP CSFB registration state is consolidated: %s",
+ mm_modem_3gpp_registration_state_get_string (ctx->cs));
+ return ctx->cs;
+ }
+
+ /* Idle? */
+ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE ||
+ ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE ||
+ ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE)
+ return MM_MODEM_3GPP_REGISTRATION_STATE_IDLE;
+
+ /* Just unknown at this point */
+ return MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
}
/*****************************************************************************/
@@ -269,7 +302,11 @@ run_registration_checks_ready (MMIfaceModem3gpp *self,
/* If we got registered, end registration checks */
if (current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
+ current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING ||
+ current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_SMS_ONLY ||
+ current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_SMS_ONLY ||
+ current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_CSFB_NOT_PREFERRED ||
+ current_registration_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED) {
/* Request immediate access tech update */
mm_iface_modem_refresh_access_technologies (MM_IFACE_MODEM (ctx->self));
mm_dbg ("Modem is currently registered in a 3GPP network");
@@ -1035,6 +1072,10 @@ mm_iface_modem_3gpp_update_access_technologies (MMIfaceModem3gpp *self,
* but only if something valid to report */
if (state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_SMS_ONLY ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_SMS_ONLY ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_CSFB_NOT_PREFERRED ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED ||
ctx->reloading_registration_info) {
if (access_tech != MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN)
mm_iface_modem_update_access_technologies (MM_IFACE_MODEM (self),
@@ -1070,7 +1111,11 @@ mm_iface_modem_3gpp_update_location (MMIfaceModem3gpp *self,
* change to registered), we also allow LAC/CID updates. */
if (ctx->reloading_registration_info ||
state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_SMS_ONLY ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_SMS_ONLY ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_CSFB_NOT_PREFERRED ||
+ state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED) {
if (location_area_code > 0 && cell_id > 0)
mm_iface_modem_location_3gpp_update_lac_ci (MM_IFACE_MODEM_LOCATION (self),
location_area_code,
@@ -1123,7 +1168,11 @@ update_non_registered_state (MMIfaceModem3gpp *self,
* registration reject error code. If b), we want to make sure we
* preserve the subscription state */
if (old_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- old_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)
+ old_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING ||
+ old_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_SMS_ONLY ||
+ old_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_SMS_ONLY ||
+ old_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_CSFB_NOT_PREFERRED ||
+ old_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED)
clear_subscription_state (self);
/* The property in the interface is bound to the property
@@ -1161,7 +1210,11 @@ update_registration_state (MMIfaceModem3gpp *self,
return;
if (new_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- new_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
+ new_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING ||
+ new_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_SMS_ONLY ||
+ new_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_SMS_ONLY ||
+ new_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME_CSFB_NOT_PREFERRED ||
+ new_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED) {
/* If already reloading registration info, skip it */
if (ctx->reloading_registration_info)
return;