summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2009-07-06 19:40:38 +0200
committerMarcel Holtmann <marcel@holtmann.org>2009-07-07 00:19:51 -0700
commit96eeda41738a6ae19fafb6abc8dd153d93c678ae (patch)
tree82d76ddcc0cc1459916a626c6bd7453bc6d0f64f
parent428dd297c3662be73b932b403f039c7a03f173e3 (diff)
downloadconnman-96eeda41738a6ae19fafb6abc8dd153d93c678ae.tar.gz
connman-96eeda41738a6ae19fafb6abc8dd153d93c678ae.tar.bz2
connman-96eeda41738a6ae19fafb6abc8dd153d93c678ae.zip
Only create new network if it doesn't exists
When calling join_network(), we shouldnt create a new network when the one we're trying to join is already on the network list. So this patch looks for a matching network and connect to it, instead of always creating a 00_00_00_00_00_00 network. Obviously, if the network is not in the network list we do create the network.
-rw-r--r--src/device.c76
1 files changed, 73 insertions, 3 deletions
diff --git a/src/device.c b/src/device.c
index d2f6db2f..4b71287b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -483,14 +483,59 @@ static void convert_name(const char *ssid, char *name,
}
}
+static struct connman_network *find_network(struct connman_device *device,
+ const void *ssid, const char *address,
+ const char *security, const char *mode)
+{
+ GHashTableIter network_iter;
+ gpointer key, value;
+
+ if (ssid == NULL)
+ return NULL;
+
+ g_hash_table_iter_init(&network_iter, device->networks);
+ while (g_hash_table_iter_next(&network_iter, &key, &value) == TRUE) {
+ const void *tmp_ssid;
+ const char *tmp_security, *tmp_mode, *tmp_address;
+ unsigned int tmp_ssid_size;
+
+ tmp_ssid = connman_network_get_blob(value, "WiFi.SSID",
+ &tmp_ssid_size);
+ tmp_security = connman_network_get_string(value,
+ "WiFi.Security");
+ tmp_mode = connman_network_get_string(value, "WiFi.Mode");
+ tmp_address = connman_network_get_string(value, "Address");
+
+ if (tmp_ssid_size < 1)
+ continue;
+
+ if (tmp_ssid && memcmp(ssid, tmp_ssid, tmp_ssid_size))
+ continue;
+
+ if (security && tmp_security &&
+ g_strcmp0(security, tmp_security))
+ continue;
+
+ if (mode && tmp_mode && g_strcmp0(mode, tmp_mode))
+ continue;
+
+ if (address && tmp_address && g_strcmp0(address, tmp_address))
+ continue;
+
+ return connman_network_ref(value);
+ }
+
+ return NULL;
+}
+
static DBusMessage *join_network(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct connman_device *device = data;
- struct connman_network *network;
+ struct connman_network *network, *found_network;
enum connman_network_type type;
unsigned int ssid_size;
- const char *group, *mode, *security;
+ const char *group, *mode, *security, *address;
const void *ssid;
DBusMessageIter iter, array;
int err, index;
@@ -555,8 +600,33 @@ static DBusMessage *join_network(DBusConnection *conn,
}
ssid = connman_network_get_blob(network, "WiFi.SSID", &ssid_size);
- mode = connman_network_get_string(network, "WiFi.Mode");
security = connman_network_get_string(network, "WiFi.Security");
+ mode = connman_network_get_string(network, "WiFi.Mode");
+ address = connman_network_get_string(network, "Address");
+
+ found_network = find_network(device, ssid, address, security, mode);
+ if (found_network != NULL) {
+ const char* passphrase;
+
+ passphrase = connman_network_get_string(network,
+ "WiFi.Passphrase");
+ if (passphrase != NULL)
+ connman_network_set_string(found_network,
+ "WiFi.Passphrase",
+ passphrase);
+ connman_network_unref(network);
+ network = found_network;
+
+ err = __connman_network_connect(found_network);
+
+ connman_network_unref(found_network);
+
+ if (err < 0)
+ return __connman_error_failed(msg, -err);
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+ }
+
group = build_group(ssid, ssid_size, mode, security);
connman_network_set_group(network, group);