summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2011-01-26 16:50:40 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2011-01-27 11:09:11 +0100
commitc7303952b859a404d2c9f46450bc777743f78b0e (patch)
treeff3598d96e9ccfe4951d5dfce70abf1b47d6bd27
parent894d6aada90e56880934f93c26cb04f99ed9b162 (diff)
downloadconnman-c7303952b859a404d2c9f46450bc777743f78b0e.tar.gz
connman-c7303952b859a404d2c9f46450bc777743f78b0e.tar.bz2
connman-c7303952b859a404d2c9f46450bc777743f78b0e.zip
ofono: be proactive with registration status
Return error immediately if connection attempts are known to fail.
-rw-r--r--plugins/ofono.c62
1 files changed, 41 insertions, 21 deletions
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 3afe0f89..480f7f75 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -86,6 +86,8 @@ struct modem_data {
dbus_bool_t attached;
dbus_bool_t roaming_allowed;
+ connman_bool_t registered;
+ connman_bool_t roaming;
uint8_t strength, has_strength;
};
@@ -487,9 +489,15 @@ static int network_connect(struct connman_network *network)
if (modem == NULL)
return -ENODEV;
+ if (modem->registered == FALSE)
+ return -ENOLINK;
+
if (modem->powered == FALSE)
return -ENOLINK;
+ if (modem->roaming_allowed == FALSE && modem->roaming == TRUE)
+ return -ENOLINK;
+
return set_network_active(network, TRUE);
}
@@ -544,7 +552,6 @@ static int add_network(struct connman_device *device,
char *ident;
const char *hash_path;
char const *operator;
- char const *reg_status;
dbus_bool_t active = FALSE;
DBG("modem %p device %p path %s", modem, device, path);
@@ -588,12 +595,7 @@ static int add_network(struct connman_device *device,
if (modem->has_strength)
connman_network_set_strength(network, modem->strength);
- reg_status = connman_device_get_string(device, "RegistrationStatus");
-
- if (!g_strcmp0(reg_status, "roaming"))
- connman_network_set_roaming(network, TRUE);
- else if (!g_strcmp0(reg_status, "registered"))
- connman_network_set_roaming(network, FALSE);
+ connman_network_set_roaming(network, modem->roaming);
while (dbus_message_iter_get_arg_type(dict) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;
@@ -765,24 +767,34 @@ static void modem_roaming_changed(struct modem_data *modem,
char const *status)
{
struct connman_device *device = modem->device;
- connman_bool_t roaming;
+ connman_bool_t roaming = FALSE;
+ connman_bool_t registered = FALSE;
+ connman_bool_t was_roaming = modem->roaming;
GHashTableIter i;
gpointer value;
- if (device == NULL)
- return;
-
- connman_device_set_string(device, "RegistrationStatus", status);
-
if (g_str_equal(status, "roaming"))
roaming = TRUE;
else if (g_str_equal(status, "registered"))
- roaming = FALSE;
- else
+ registered = TRUE;
+
+ registered = registered || roaming;
+
+ if (modem->roaming == roaming && modem->registered == registered)
return;
- for (g_hash_table_iter_init(&i, network_hash);
- g_hash_table_iter_next(&i, NULL, &value);) {
+ modem->registered = registered;
+ modem->roaming = roaming;
+
+ if (roaming == was_roaming)
+ return;
+
+ if (device == NULL)
+ return;
+
+ g_hash_table_iter_init(&i, network_hash);
+
+ while (g_hash_table_iter_next(&i, NULL, &value)) {
struct connman_network *network = value;
if (connman_network_get_device(network) == device) {
@@ -792,6 +804,12 @@ static void modem_roaming_changed(struct modem_data *modem,
}
}
+static void modem_registration_removed(struct modem_data *modem)
+{
+ modem->registered = FALSE;
+ modem->roaming = FALSE;
+}
+
static void modem_registration_changed(struct modem_data *modem,
DBusMessageIter *entry)
{
@@ -1344,9 +1362,9 @@ static gboolean modem_changed(DBusConnection *connection, DBusMessage *message,
} else if (g_str_equal(key, "Interfaces") == TRUE) {
gboolean has_sim = modem_has_sim(&value);
gboolean has_reg = modem_has_reg(&value);
- gboolean added_reg = has_reg && !modem->has_reg;
+ gboolean had_reg = modem->has_reg;
gboolean has_gprs = modem_has_gprs(&value);
- gboolean added_gprs = has_gprs && !modem->has_gprs;
+ gboolean had_gprs = modem->has_gprs;
modem->has_sim = has_sim;
modem->has_reg = has_reg;
@@ -1358,10 +1376,12 @@ static gboolean modem_changed(DBusConnection *connection, DBusMessage *message,
} else if (!has_sim) {
modem_remove_device(modem);
} else {
- if (added_reg)
+ if (has_reg && !had_reg)
check_registration(modem);
+ else if (had_reg && !has_reg)
+ modem_registration_removed(modem);
- if (added_gprs) {
+ if (has_gprs && !had_gprs) {
gprs_change_powered(modem->path, TRUE);
check_gprs(modem);
}