gprs: lte: set attached after successful activation

Otherwise the attached state gets to be set before the actual LTE
automatic context is ready. This triggers a race between connman
and ofono: connman sees status attached before the context is active
so connman will try to activate another context with same apn and will
fail over and over again.
This commit is contained in:
Dragos Tatulea 2016-11-22 17:48:09 +01:00 committed by Denis Kenzior
parent 627b5df8a2
commit c2b489dca8
1 changed files with 27 additions and 23 deletions

View File

@ -959,6 +959,24 @@ static void pri_deactivate_callback(const struct ofono_error *error, void *data)
}
}
static void gprs_set_attached_property(struct ofono_gprs *gprs,
ofono_bool_t attached)
{
const char *path;
DBusConnection *conn = ofono_dbus_get_connection();
dbus_bool_t value = attached;
if (gprs->attached == attached)
return;
gprs->attached = attached;
path = __ofono_atom_get_path(gprs->atom);
ofono_dbus_signal_property_changed(conn, path,
OFONO_CONNECTION_MANAGER_INTERFACE,
"Attached", DBUS_TYPE_BOOLEAN, &value);
}
static void pri_read_settings_callback(const struct ofono_error *error,
void *data)
{
@ -987,6 +1005,9 @@ static void pri_read_settings_callback(const struct ofono_error *error,
}
value = pri_ctx->active;
gprs_set_attached_property(pri_ctx->gprs, TRUE);
ofono_dbus_signal_property_changed(conn, pri_ctx->path,
OFONO_CONNECTION_CONTEXT_INTERFACE,
"Active", DBUS_TYPE_BOOLEAN, &value);
@ -1596,24 +1617,6 @@ static void release_active_contexts(struct ofono_gprs *gprs)
}
}
static void gprs_set_attached_property(struct ofono_gprs *gprs,
ofono_bool_t attached)
{
const char *path;
DBusConnection *conn = ofono_dbus_get_connection();
dbus_bool_t value = attached;
if (gprs->attached == attached)
return;
gprs->attached = attached;
path = __ofono_atom_get_path(gprs->atom);
ofono_dbus_signal_property_changed(conn, path,
OFONO_CONNECTION_MANAGER_INTERFACE,
"Attached", DBUS_TYPE_BOOLEAN, &value);
}
static void gprs_attached_update(struct ofono_gprs *gprs)
{
ofono_bool_t attached;
@ -1717,11 +1720,12 @@ static void gprs_netreg_update(struct ofono_gprs *gprs)
DBG("attach: %u, driver_attached: %u", attach, gprs->driver_attached);
if (ofono_netreg_get_technology(gprs->netreg) ==
ACCESS_TECHNOLOGY_EUTRAN) {
/* Ignore attach logic for LTE. There is no such concept. */
gprs_set_attached_property(gprs, attach);
return;
}
ACCESS_TECHNOLOGY_EUTRAN)
/*
* For LTE we set attached status only on successful
* context activation.
*/
return;
if (gprs->driver_attached == attach)
return;