diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2016-10-05 13:32:41 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2016-10-12 13:24:08 +0200 |
commit | fe460b2f54b6a035a207815252fe87ee3a06351c (patch) | |
tree | d58b5312284d7fe4f0d5af29bd15e53595165cce /src/mm-iface-modem-3gpp.c | |
parent | a561f6edf0317ee4eb86e6811cd8cd5a7fbf5e60 (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.c | 75 |
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; |