cromo: Ignore loss of registration when starting a data session.
The Gobi modem sometimes re-registers itself when starting a data
session. The re-registration causes shill to recreate the cellular
service which breaks various tests that expect the cellular service
to remain the same during a connect request.
BUG=chromium-os:36171
TEST=cellular_ModemControl, network_3GModemControl
Change-Id: Ic813d9d3e25b2789f50395389a8fb2fafd255af0
Reviewed-on: https://gerrit.chromium.org/gerrit/38466
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/gobi_gsm_modem.cc b/gobi_gsm_modem.cc
index a75d0d5..e6772f9 100644
--- a/gobi_gsm_modem.cc
+++ b/gobi_gsm_modem.cc
@@ -63,10 +63,24 @@
break;
case MM_MODEM_GSM_NETWORK_REG_STATUS_HOME:
case MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING:
- mm_modem_state = MM_MODEM_STATE_REGISTERED;
+ // The modem may reregister with the network when starting the data
+ // session. Ignore the state changes associated with the
+ // reregistration.
+ if ((mm_state() == MM_MODEM_STATE_REGISTERED ||
+ mm_state() == MM_MODEM_STATE_CONNECTING) &&
+ session_starter_in_flight_)
+ mm_modem_state = MM_MODEM_STATE_CONNECTING;
+ else
+ mm_modem_state = MM_MODEM_STATE_REGISTERED;
break;
case MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING:
- mm_modem_state = MM_MODEM_STATE_SEARCHING;
+ // The modem may reregister with the network when starting the data
+ // session. Ignore the state changes associated with the
+ // reregistration.
+ if (session_starter_in_flight_)
+ mm_modem_state = MM_MODEM_STATE_CONNECTING;
+ else
+ mm_modem_state = MM_MODEM_STATE_SEARCHING;
break;
case MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN:
mm_modem_state = MM_MODEM_STATE_ENABLED; // ???
@@ -145,19 +159,35 @@
// a DataCapabilitiesHandler callback!
GetGsmRegistrationInfo(®istration_status,
&operator_code, &operator_name, error);
+ // The modem may reregister with the network when starting the data
+ // session. Ignore the state changes associated with the reregistration.
+ if (registration_status == MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING &&
+ session_starter_in_flight_)
+ return;
switch(registration_status) {
case MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE:
- case MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING:
case MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED:
RegistrationInfo(registration_status, operator_code, operator_name);
SetMmState(MM_MODEM_STATE_ENABLED, MM_MODEM_STATE_CHANGED_REASON_UNKNOWN);
break;
+ case MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING:
+ RegistrationInfo(registration_status, operator_code, operator_name);
+ SetMmState(MM_MODEM_STATE_SEARCHING,
+ MM_MODEM_STATE_CHANGED_REASON_UNKNOWN);
+ break;
case MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN:
// Ignore the unknown state. The registration state will
// eventually be reported as IDLE, SEACHING, DENIED, etc...
break;
case MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING:
case MM_MODEM_GSM_NETWORK_REG_STATUS_HOME:
+ // The modem may reregister with the network when starting the data
+ // session. Ignore the state changes associated with the
+ // reregistration.
+ if (mm_state() == MM_MODEM_STATE_REGISTERED &&
+ session_starter_in_flight_)
+ SetMmState(MM_MODEM_STATE_CONNECTING,
+ MM_MODEM_STATE_CHANGED_REASON_UNKNOWN);
SendNetworkTechnologySignal(
DataCapabilitiesToMmAccessTechnology(num_data_caps, data_caps));
break;
diff --git a/gobi_modem.cc b/gobi_modem.cc
index c3a0d9e..d2c7eb7 100644
--- a/gobi_modem.cc
+++ b/gobi_modem.cc
@@ -715,7 +715,9 @@
username,
password);
session_starter_in_flight_ = true;
- SetMmState(MM_MODEM_STATE_CONNECTING, MM_MODEM_STATE_CHANGED_REASON_UNKNOWN);
+ if (mm_state_ == MM_MODEM_STATE_REGISTERED)
+ SetMmState(MM_MODEM_STATE_CONNECTING,
+ MM_MODEM_STATE_CHANGED_REASON_UNKNOWN);
starter->StartDataSession(error);
return_later(&starter->continuation_tag_);