With some huawei USB keys (E3372, MS2372h), when switching from WCDMA to
LTE network, a network attachment loss is reported during a short time.
Forcing data detach in this case is a bad idea. Consequences can be a loop
like that:
t0) Attached to WCDMA network
t1) Switch to LTE network
t1+xs) Attachment loss reported
t1+(x+2)s) Attached to WCDMA network
t2) Switch to LTE network
t2) Attachment loss reported
t2+2s) Attached to WCDMA network
With this patch we force gprs detach only if unpowered or roaming while
roaming is not allowed. We don't force gprs detach if we loose network.
---
src/gprs.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/src/gprs.c b/src/gprs.c
index edd17f2..320505a 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -1676,15 +1676,24 @@ static void gprs_netreg_removed(struct ofono_gprs *gprs)
static void gprs_netreg_update(struct ofono_gprs *gprs)
{
ofono_bool_t attach;
+ ofono_bool_t force_detach;
+
+ DBG("netreg:%u, powered:%u, roaming_allowed:%u, driver_attached:%u",
+ gprs->netreg_status, gprs->powered,
+ gprs->roaming_allowed, gprs->driver_attached);
attach = gprs->netreg_status == NETWORK_REGISTRATION_STATUS_REGISTERED;
+ attach |= gprs->netreg_status == NETWORK_REGISTRATION_STATUS_ROAMING;
- attach = attach || (gprs->roaming_allowed &&
- gprs->netreg_status == NETWORK_REGISTRATION_STATUS_ROAMING);
+ if (!attach)
+ return;
- attach = attach && gprs->powered;
+ force_detach = !gprs->powered || (!gprs->roaming_allowed &&
+ gprs->netreg_status == NETWORK_REGISTRATION_STATUS_ROAMING);
- DBG("attach: %u, driver_attached: %u", attach, gprs->driver_attached);
+ if ((force_detach && !gprs->driver_attached) ||
+ (!force_detach && gprs->driver_attached))
+ return;
if (ofono_netreg_get_technology(gprs->netreg) ==
ACCESS_TECHNOLOGY_EUTRAN && have_read_settings(gprs))
@@ -1692,9 +1701,6 @@ static void gprs_netreg_update(struct ofono_gprs *gprs)
* For LTE we set attached status only on successful
* context activation.
*/
- return;
-
- if (gprs->driver_attached == attach)
return;
if (gprs->flags & GPRS_FLAG_ATTACHING) {
@@ -1703,9 +1709,9 @@ static void gprs_netreg_update(struct ofono_gprs *gprs)
}
gprs->flags |= GPRS_FLAG_ATTACHING;
-
- gprs->driver_attached = attach;
- gprs->driver->set_attached(gprs, attach, gprs_attach_callback, gprs);
+ gprs->driver_attached = !gprs->driver_attached;
+ gprs->driver->set_attached(gprs, gprs->driver_attached,
+ gprs_attach_callback, gprs);
}
static void netreg_status_changed(int status, int lac, int ci, int tech,
--
2.7.4
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono