mirror of git://git.sysmocom.de/ofono
Refactor: Make GPRS use information from netreg
This commit is contained in:
parent
53414483d3
commit
939be2adc2
149
src/gprs.c
149
src/gprs.c
|
@ -38,6 +38,7 @@
|
||||||
#define DATA_CONTEXT_INTERFACE "org.ofono.PrimaryDataContext"
|
#define DATA_CONTEXT_INTERFACE "org.ofono.PrimaryDataContext"
|
||||||
|
|
||||||
#define GPRS_FLAG_ATTACHING 0x1
|
#define GPRS_FLAG_ATTACHING 0x1
|
||||||
|
#define GPRS_FLAG_DETACHED_AFTER_ROAMING 0x2
|
||||||
|
|
||||||
static GSList *g_drivers = NULL;
|
static GSList *g_drivers = NULL;
|
||||||
static GSList *g_context_drivers = NULL;
|
static GSList *g_context_drivers = NULL;
|
||||||
|
@ -51,6 +52,7 @@ enum gprs_context_type {
|
||||||
struct ofono_gprs {
|
struct ofono_gprs {
|
||||||
GSList *contexts;
|
GSList *contexts;
|
||||||
ofono_bool_t attached;
|
ofono_bool_t attached;
|
||||||
|
ofono_bool_t driver_attached;
|
||||||
ofono_bool_t roaming_allowed;
|
ofono_bool_t roaming_allowed;
|
||||||
ofono_bool_t powered;
|
ofono_bool_t powered;
|
||||||
int status;
|
int status;
|
||||||
|
@ -61,6 +63,10 @@ struct ofono_gprs {
|
||||||
int next_context_id;
|
int next_context_id;
|
||||||
int cid_min;
|
int cid_min;
|
||||||
int cid_max;
|
int cid_max;
|
||||||
|
int netreg_status;
|
||||||
|
struct ofono_netreg *netreg;
|
||||||
|
unsigned int netreg_watch;
|
||||||
|
unsigned int status_watch;
|
||||||
DBusMessage *pending;
|
DBusMessage *pending;
|
||||||
struct ofono_gprs_context *context_driver;
|
struct ofono_gprs_context *context_driver;
|
||||||
const struct ofono_gprs_driver *driver;
|
const struct ofono_gprs_driver *driver;
|
||||||
|
@ -506,23 +512,32 @@ static char **gprs_contexts_path_list(GSList *context_list)
|
||||||
return objlist;
|
return objlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gprs_attach_callback(const struct ofono_error *error, void *data)
|
static void gprs_set_attached(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
struct ofono_gprs *gprs = data;
|
|
||||||
DBusConnection *conn = ofono_dbus_get_connection();
|
DBusConnection *conn = ofono_dbus_get_connection();
|
||||||
const char *path;
|
const char *path;
|
||||||
dbus_bool_t value;
|
dbus_bool_t value;
|
||||||
|
ofono_bool_t attached = gprs->driver_attached &&
|
||||||
|
!(gprs->flags & GPRS_FLAG_DETACHED_AFTER_ROAMING);
|
||||||
|
|
||||||
if (error->type == OFONO_ERROR_TYPE_NO_ERROR &&
|
if (attached != gprs->attached) {
|
||||||
(gprs->flags & GPRS_FLAG_ATTACHING)) {
|
gprs->attached = attached;
|
||||||
gprs->attached = !gprs->attached;
|
|
||||||
|
|
||||||
path = __ofono_atom_get_path(gprs->atom);
|
path = __ofono_atom_get_path(gprs->atom);
|
||||||
value = gprs->attached;
|
value = attached;
|
||||||
ofono_dbus_signal_property_changed(conn, path,
|
ofono_dbus_signal_property_changed(conn, path,
|
||||||
DATA_CONNECTION_MANAGER_INTERFACE,
|
DATA_CONNECTION_MANAGER_INTERFACE,
|
||||||
"Attached", DBUS_TYPE_BOOLEAN, &value);
|
"Attached", DBUS_TYPE_BOOLEAN, &value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gprs_attach_callback(const struct ofono_error *error, void *data)
|
||||||
|
{
|
||||||
|
struct ofono_gprs *gprs = data;
|
||||||
|
|
||||||
|
if (error->type == OFONO_ERROR_TYPE_NO_ERROR &&
|
||||||
|
(gprs->flags & GPRS_FLAG_ATTACHING))
|
||||||
|
gprs->driver_attached = !gprs->driver_attached;
|
||||||
|
|
||||||
gprs->flags &= ~GPRS_FLAG_ATTACHING;
|
gprs->flags &= ~GPRS_FLAG_ATTACHING;
|
||||||
|
|
||||||
|
@ -531,18 +546,21 @@ static void gprs_attach_callback(const struct ofono_error *error, void *data)
|
||||||
|
|
||||||
static void gprs_netreg_update(struct ofono_gprs *gprs)
|
static void gprs_netreg_update(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
DBusConnection *conn = ofono_dbus_get_connection();
|
|
||||||
int attach;
|
int attach;
|
||||||
int operator_ok;
|
int operator_ok;
|
||||||
const char *path;
|
|
||||||
dbus_bool_t value = 0;
|
|
||||||
|
|
||||||
operator_ok = gprs->roaming_allowed ||
|
operator_ok = gprs->roaming_allowed ||
|
||||||
(gprs->status != NETWORK_REGISTRATION_STATUS_ROAMING);
|
(gprs->status != NETWORK_REGISTRATION_STATUS_ROAMING &&
|
||||||
|
!(gprs->flags & GPRS_FLAG_DETACHED_AFTER_ROAMING));
|
||||||
|
|
||||||
|
if (gprs->powered && !operator_ok)
|
||||||
|
gprs->flags |= GPRS_FLAG_DETACHED_AFTER_ROAMING;
|
||||||
|
|
||||||
|
gprs_set_attached(gprs);
|
||||||
|
|
||||||
attach = gprs->powered && operator_ok;
|
attach = gprs->powered && operator_ok;
|
||||||
|
|
||||||
if (gprs->attached != attach &&
|
if (gprs->driver_attached != attach &&
|
||||||
!(gprs->flags & GPRS_FLAG_ATTACHING) &&
|
!(gprs->flags & GPRS_FLAG_ATTACHING) &&
|
||||||
!(attach && gprs->status ==
|
!(attach && gprs->status ==
|
||||||
NETWORK_REGISTRATION_STATUS_SEARCHING)) {
|
NETWORK_REGISTRATION_STATUS_SEARCHING)) {
|
||||||
|
@ -550,19 +568,35 @@ static void gprs_netreg_update(struct ofono_gprs *gprs)
|
||||||
|
|
||||||
gprs->driver->set_attached(gprs, attach, gprs_attach_callback,
|
gprs->driver->set_attached(gprs, attach, gprs_attach_callback,
|
||||||
gprs);
|
gprs);
|
||||||
|
|
||||||
/* Prevent further attempts to attach */
|
|
||||||
if (!attach && gprs->powered) {
|
|
||||||
gprs->powered = 0;
|
|
||||||
|
|
||||||
path = __ofono_atom_get_path(gprs->atom);
|
|
||||||
ofono_dbus_signal_property_changed(conn, path,
|
|
||||||
DATA_CONNECTION_MANAGER_INTERFACE,
|
|
||||||
"Powered", DBUS_TYPE_BOOLEAN, &value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void netreg_status_changed(int status, int lac, int ci, int tech,
|
||||||
|
const struct ofono_network_operator *op,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct ofono_gprs *gprs = data;
|
||||||
|
|
||||||
|
DBG("%d, %d, %d, %d, %p", status, lac, ci, tech, op);
|
||||||
|
|
||||||
|
if (gprs->netreg_status == status)
|
||||||
|
return;
|
||||||
|
gprs->netreg_status = status;
|
||||||
|
|
||||||
|
if (!(gprs->flags & GPRS_FLAG_DETACHED_AFTER_ROAMING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (status != NETWORK_REGISTRATION_STATUS_REGISTERED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* If the circuit switched radio just registered to home PLMN then
|
||||||
|
* we also make an attempt to attach.
|
||||||
|
*/
|
||||||
|
gprs->flags &= ~GPRS_FLAG_DETACHED_AFTER_ROAMING;
|
||||||
|
|
||||||
|
gprs_netreg_update(gprs);
|
||||||
|
}
|
||||||
|
|
||||||
static DBusMessage *gprs_get_properties(DBusConnection *conn,
|
static DBusMessage *gprs_get_properties(DBusConnection *conn,
|
||||||
DBusMessage *msg, void *data)
|
DBusMessage *msg, void *data)
|
||||||
{
|
{
|
||||||
|
@ -667,6 +701,8 @@ static DBusMessage *gprs_set_property(DBusConnection *conn,
|
||||||
return dbus_message_new_method_return(msg);
|
return dbus_message_new_method_return(msg);
|
||||||
|
|
||||||
gprs->roaming_allowed = value;
|
gprs->roaming_allowed = value;
|
||||||
|
gprs->flags &= ~GPRS_FLAG_DETACHED_AFTER_ROAMING;
|
||||||
|
|
||||||
gprs_netreg_update(gprs);
|
gprs_netreg_update(gprs);
|
||||||
} else if (!strcmp(property, "Powered")) {
|
} else if (!strcmp(property, "Powered")) {
|
||||||
if (!gprs->driver->set_attached)
|
if (!gprs->driver->set_attached)
|
||||||
|
@ -681,6 +717,8 @@ static DBusMessage *gprs_set_property(DBusConnection *conn,
|
||||||
return dbus_message_new_method_return(msg);
|
return dbus_message_new_method_return(msg);
|
||||||
|
|
||||||
gprs->powered = value;
|
gprs->powered = value;
|
||||||
|
gprs->flags &= ~GPRS_FLAG_DETACHED_AFTER_ROAMING;
|
||||||
|
|
||||||
gprs_netreg_update(gprs);
|
gprs_netreg_update(gprs);
|
||||||
} else
|
} else
|
||||||
return __ofono_error_invalid_args(msg);
|
return __ofono_error_invalid_args(msg);
|
||||||
|
@ -854,17 +892,9 @@ static GDBusSignalTable manager_signals[] = {
|
||||||
|
|
||||||
void ofono_gprs_attach_notify(struct ofono_gprs *gprs, int attached)
|
void ofono_gprs_attach_notify(struct ofono_gprs *gprs, int attached)
|
||||||
{
|
{
|
||||||
DBusConnection *conn = ofono_dbus_get_connection();
|
if (gprs->driver_attached != attached &&
|
||||||
const char *path;
|
!(gprs->flags & GPRS_FLAG_ATTACHING)) {
|
||||||
dbus_bool_t value = 0;
|
gprs->driver_attached = attached;
|
||||||
|
|
||||||
if (gprs->attached && !(gprs->flags & GPRS_FLAG_ATTACHING)) {
|
|
||||||
gprs->attached = 0;
|
|
||||||
|
|
||||||
path = __ofono_atom_get_path(gprs->atom);
|
|
||||||
ofono_dbus_signal_property_changed(conn, path,
|
|
||||||
DATA_CONNECTION_MANAGER_INTERFACE,
|
|
||||||
"Attached", DBUS_TYPE_BOOLEAN, &value);
|
|
||||||
|
|
||||||
gprs_netreg_update(gprs);
|
gprs_netreg_update(gprs);
|
||||||
}
|
}
|
||||||
|
@ -875,7 +905,7 @@ static void set_registration_status(struct ofono_gprs *gprs, int status)
|
||||||
const char *str_status = registration_status_to_string(status);
|
const char *str_status = registration_status_to_string(status);
|
||||||
const char *path = __ofono_atom_get_path(gprs->atom);
|
const char *path = __ofono_atom_get_path(gprs->atom);
|
||||||
DBusConnection *conn = ofono_dbus_get_connection();
|
DBusConnection *conn = ofono_dbus_get_connection();
|
||||||
dbus_bool_t attached;
|
ofono_bool_t attached;
|
||||||
|
|
||||||
gprs->status = status;
|
gprs->status = status;
|
||||||
|
|
||||||
|
@ -886,15 +916,8 @@ static void set_registration_status(struct ofono_gprs *gprs, int status)
|
||||||
|
|
||||||
attached = (status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
|
attached = (status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
|
||||||
status == NETWORK_REGISTRATION_STATUS_ROAMING);
|
status == NETWORK_REGISTRATION_STATUS_ROAMING);
|
||||||
if (gprs->attached != (int) attached &&
|
if (!(gprs->flags & GPRS_FLAG_ATTACHING))
|
||||||
!(gprs->flags & GPRS_FLAG_ATTACHING)) {
|
gprs->driver_attached = attached;
|
||||||
gprs->attached = (int) attached;
|
|
||||||
|
|
||||||
ofono_dbus_signal_property_changed(conn, path,
|
|
||||||
DATA_CONNECTION_MANAGER_INTERFACE,
|
|
||||||
"Attached", DBUS_TYPE_BOOLEAN,
|
|
||||||
&attached);
|
|
||||||
}
|
|
||||||
|
|
||||||
gprs_netreg_update(gprs);
|
gprs_netreg_update(gprs);
|
||||||
}
|
}
|
||||||
|
@ -1136,6 +1159,18 @@ static void gprs_unregister(struct ofono_atom *atom)
|
||||||
|
|
||||||
g_slist_free(gprs->contexts);
|
g_slist_free(gprs->contexts);
|
||||||
|
|
||||||
|
if (gprs->netreg_watch) {
|
||||||
|
if (gprs->status_watch) {
|
||||||
|
__ofono_netreg_remove_status_watch(gprs->netreg,
|
||||||
|
gprs->status_watch);
|
||||||
|
gprs->status_watch = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__ofono_modem_remove_atom_watch(modem, gprs->netreg_watch);
|
||||||
|
gprs->netreg_watch = 0;
|
||||||
|
gprs->netreg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ofono_modem_remove_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE);
|
ofono_modem_remove_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE);
|
||||||
g_dbus_unregister_interface(conn, path,
|
g_dbus_unregister_interface(conn, path,
|
||||||
DATA_CONNECTION_MANAGER_INTERFACE);
|
DATA_CONNECTION_MANAGER_INTERFACE);
|
||||||
|
@ -1195,11 +1230,30 @@ struct ofono_gprs *ofono_gprs_create(struct ofono_modem *modem,
|
||||||
return gprs;
|
return gprs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void netreg_watch(struct ofono_atom *atom,
|
||||||
|
enum ofono_atom_watch_condition cond,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct ofono_gprs *gprs = data;
|
||||||
|
|
||||||
|
if (cond != OFONO_ATOM_WATCH_CONDITION_REGISTERED) {
|
||||||
|
gprs->status_watch = 0;
|
||||||
|
gprs->netreg = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gprs->netreg = __ofono_atom_get_data(atom);
|
||||||
|
gprs->netreg_status = ofono_netreg_get_status(gprs->netreg);
|
||||||
|
gprs->status_watch = __ofono_netreg_add_status_watch(gprs->netreg,
|
||||||
|
netreg_status_changed, gprs, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void ofono_gprs_register(struct ofono_gprs *gprs)
|
void ofono_gprs_register(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
DBusConnection *conn = ofono_dbus_get_connection();
|
DBusConnection *conn = ofono_dbus_get_connection();
|
||||||
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
|
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
|
||||||
const char *path = __ofono_atom_get_path(gprs->atom);
|
const char *path = __ofono_atom_get_path(gprs->atom);
|
||||||
|
struct ofono_atom *netreg_atom;
|
||||||
|
|
||||||
if (!g_dbus_register_interface(conn, path,
|
if (!g_dbus_register_interface(conn, path,
|
||||||
DATA_CONNECTION_MANAGER_INTERFACE,
|
DATA_CONNECTION_MANAGER_INTERFACE,
|
||||||
|
@ -1213,6 +1267,17 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
|
||||||
|
|
||||||
ofono_modem_add_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE);
|
ofono_modem_add_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE);
|
||||||
|
|
||||||
|
gprs->netreg_watch = __ofono_modem_add_atom_watch(modem,
|
||||||
|
OFONO_ATOM_TYPE_NETREG,
|
||||||
|
netreg_watch, gprs, NULL);
|
||||||
|
|
||||||
|
netreg_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_NETREG);
|
||||||
|
|
||||||
|
if (netreg_atom && __ofono_atom_get_registered(netreg_atom))
|
||||||
|
netreg_watch(netreg_atom,
|
||||||
|
OFONO_ATOM_WATCH_CONDITION_REGISTERED, gprs);
|
||||||
|
|
||||||
|
|
||||||
__ofono_atom_register(gprs->atom, gprs_unregister);
|
__ofono_atom_register(gprs->atom, gprs_unregister);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue