mirror of git://git.sysmocom.de/ofono
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:
parent
30fd4b3e34
commit
b50ff27d3f
51
src/gprs.c
51
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)
|
static void gprs_attached_update(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
ofono_bool_t attached;
|
ofono_bool_t attached;
|
||||||
|
int status = gprs->status;
|
||||||
|
|
||||||
attached = gprs->driver_attached &&
|
if (on_lte(gprs))
|
||||||
(gprs->status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
|
/*
|
||||||
gprs->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...
|
||||||
|
*/
|
||||||
|
attached = have_active_contexts(gprs);
|
||||||
|
else
|
||||||
|
attached = gprs->driver_attached &&
|
||||||
|
(status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
|
||||||
|
status == NETWORK_REGISTRATION_STATUS_ROAMING);
|
||||||
|
|
||||||
if (attached == gprs->attached)
|
if (attached == gprs->attached)
|
||||||
return;
|
return;
|
||||||
|
@ -1591,11 +1612,13 @@ static void gprs_attached_update(struct ofono_gprs *gprs)
|
||||||
if (attached == FALSE) {
|
if (attached == FALSE) {
|
||||||
release_active_contexts(gprs);
|
release_active_contexts(gprs);
|
||||||
gprs->bearer = -1;
|
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
|
* Some times the context activates after a detach event and
|
||||||
* right before an attach. We close it to avoid unexpected open
|
* right before an attach. We close it to avoid unexpected open
|
||||||
* contexts.
|
* contexts.
|
||||||
|
* Skip that for LTE since the condition to be attached on LTE
|
||||||
|
* is that a context gets activated
|
||||||
*/
|
*/
|
||||||
release_active_contexts(gprs);
|
release_active_contexts(gprs);
|
||||||
gprs->flags |= GPRS_FLAG_ATTACHED_UPDATE;
|
gprs->flags |= GPRS_FLAG_ATTACHED_UPDATE;
|
||||||
|
@ -1660,15 +1683,6 @@ static void gprs_netreg_removed(struct ofono_gprs *gprs)
|
||||||
gprs_attached_update(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)
|
static void gprs_netreg_update(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
ofono_bool_t attach;
|
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 &&
|
if (status != NETWORK_REGISTRATION_STATUS_REGISTERED &&
|
||||||
status != NETWORK_REGISTRATION_STATUS_ROAMING) {
|
status != NETWORK_REGISTRATION_STATUS_ROAMING) {
|
||||||
/*
|
gprs_attached_update(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...
|
|
||||||
*/
|
|
||||||
if (!on_lte(gprs))
|
|
||||||
gprs_attached_update(gprs);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue