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(&registration_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_);