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 ofono@ofono.org https://lists.ofono.org/mailman/listinfo/ofono