iface-modem: fix reporting state while registration is denied

When registration is denied, we should be reporting the modem with
'enabled' state instead of 'registered'. This was not happening
because the logic to build the consolidated state (for 3GPP+3GPP2
modems) was using as default initial state the current old state, and
so if the old one was 'registered' it never allowed getting a
consolidated state of 'enabled', because 'registered' > 'enabled'.

Instead of using the old initial state, the consolidated modem state
should use 'enabled' as default initial value, which is the lowest
among 'enabled, 'searching' and 'registered'.
This commit is contained in:
Aleksander Morgado
2019-05-30 13:18:32 +00:00
committed by Dan Williams
parent 7f822fbc50
commit aa22387937
+9 -6
View File
@@ -425,7 +425,7 @@ bearer_list_updated (MMBearerList *bearer_list,
/*****************************************************************************/
static MMModemState get_current_consolidated_state (MMIfaceModem *self, MMModemState modem_state);
static MMModemState get_consolidated_subsystem_state (MMIfaceModem *self);
typedef struct {
MMBaseBearer *self;
@@ -490,7 +490,7 @@ bearer_status_changed (MMBaseBearer *bearer,
new_state = MM_MODEM_STATE_DISCONNECTING;
break;
case MM_BEARER_STATUS_DISCONNECTED:
new_state = get_current_consolidated_state (self, MM_MODEM_STATE_UNKNOWN);
new_state = get_consolidated_subsystem_state (self);
break;
}
@@ -1518,7 +1518,7 @@ __iface_modem_update_state_internal (MMIfaceModem *self,
/* Enabled may really be searching or registered */
if (new_state == MM_MODEM_STATE_ENABLED)
new_state = get_current_consolidated_state (self, new_state);
new_state = get_consolidated_subsystem_state (self);
/* Update state only if different */
if (new_state != old_state) {
@@ -1612,9 +1612,12 @@ subsystem_state_array_free (GArray *array)
}
static MMModemState
get_current_consolidated_state (MMIfaceModem *self, MMModemState modem_state)
get_consolidated_subsystem_state (MMIfaceModem *self)
{
MMModemState consolidated = modem_state;
/* Use as initial state ENABLED, which is the minimum one expected. Do not
* use the old modem state as initial state, as that would disallow reporting
* e.g. ENABLED if the old state was REGISTERED (as ENABLED < REGISTERED). */
MMModemState consolidated = MM_MODEM_STATE_ENABLED;
GArray *subsystem_states;
if (G_UNLIKELY (!state_update_context_quark))
@@ -1698,7 +1701,7 @@ get_updated_consolidated_state (MMIfaceModem *self,
g_array_append_val (subsystem_states, s);
}
return get_current_consolidated_state (self, modem_state);
return get_consolidated_subsystem_state (self);
}
void