From b50ff27d3f1469b54daddbe45606a6c7bef8ff7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20R=C3=B6jfors?= Date: Tue, 20 Aug 2019 17:56:50 +0200 Subject: [PATCH] gprs: Check for LTE in gprs_attached_update Since we have a different condition for the attach state when running on LTE, we should consider it in gprs_attached_update. Previously it's done in some instances. But for instance if the driver got detached from GPRS but now running on LTE with a context up, we would be deattached. --- src/gprs.c | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/gprs.c b/src/gprs.c index bba482cb..5829a577 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -1571,13 +1571,34 @@ static void release_active_contexts(struct ofono_gprs *gprs) } } +static gboolean on_lte(struct ofono_gprs *gprs) +{ + if (ofono_netreg_get_technology(gprs->netreg) == + ACCESS_TECHNOLOGY_EUTRAN && have_read_settings(gprs)) + return TRUE; + + return FALSE; +} + static void gprs_attached_update(struct ofono_gprs *gprs) { ofono_bool_t attached; + int status = gprs->status; - attached = gprs->driver_attached && - (gprs->status == NETWORK_REGISTRATION_STATUS_REGISTERED || - gprs->status == NETWORK_REGISTRATION_STATUS_ROAMING); + if (on_lte(gprs)) + /* + * For LTE we attached status reflects successful context + * activation. + * Since we in gprs_netreg_update not even try to attach + * to GPRS if we are running on LTE, we can on some modems + * expect the gprs status to be unknown. That must not + * result in detaching... + */ + attached = have_active_contexts(gprs); + else + attached = gprs->driver_attached && + (status == NETWORK_REGISTRATION_STATUS_REGISTERED || + status == NETWORK_REGISTRATION_STATUS_ROAMING); if (attached == gprs->attached) return; @@ -1591,11 +1612,13 @@ static void gprs_attached_update(struct ofono_gprs *gprs) if (attached == FALSE) { release_active_contexts(gprs); gprs->bearer = -1; - } else if (have_active_contexts(gprs) == TRUE) { + } else if (have_active_contexts(gprs) == TRUE && !on_lte(gprs)) { /* * Some times the context activates after a detach event and * right before an attach. We close it to avoid unexpected open * contexts. + * Skip that for LTE since the condition to be attached on LTE + * is that a context gets activated */ release_active_contexts(gprs); gprs->flags |= GPRS_FLAG_ATTACHED_UPDATE; @@ -1660,15 +1683,6 @@ static void gprs_netreg_removed(struct ofono_gprs *gprs) gprs_attached_update(gprs); } -static gboolean on_lte(struct ofono_gprs *gprs) -{ - if (ofono_netreg_get_technology(gprs->netreg) == - ACCESS_TECHNOLOGY_EUTRAN && have_read_settings(gprs)) - return TRUE; - - return FALSE; -} - static void gprs_netreg_update(struct ofono_gprs *gprs) { ofono_bool_t attach; @@ -2573,16 +2587,7 @@ void ofono_gprs_status_notify(struct ofono_gprs *gprs, int status) if (status != NETWORK_REGISTRATION_STATUS_REGISTERED && status != NETWORK_REGISTRATION_STATUS_ROAMING) { - /* - * For LTE we attached status reflects successful context - * activation. - * Since we in gprs_netreg_update not even try to attach - * to GPRS if we are running on LTE, we can on some modems - * expect the gprs status to be unknown. That must not - * result in detaching... - */ - if (!on_lte(gprs)) - gprs_attached_update(gprs); + gprs_attached_update(gprs); return; }