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.
This commit is contained in:
Richard Röjfors 2019-08-20 17:56:50 +02:00 committed by Denis Kenzior
parent 30fd4b3e34
commit b50ff27d3f
1 changed files with 28 additions and 23 deletions

View File

@ -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;
}