From 0064506b824a1b7963d4fd1e136450453946a5e0 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 7 Jan 2009 17:25:25 +0100 Subject: [PATCH] Use priority and strength to select known network --- include/network.h | 2 ++ src/device.c | 31 ++++++++++++++++++++++++++++--- src/network.c | 24 +++++++++++++++++++++++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/include/network.h b/include/network.h index dd435eb..2232dfd 100644 --- a/include/network.h +++ b/include/network.h @@ -84,6 +84,8 @@ extern const char *connman_network_get_string(struct connman_network *network, const char *key); extern int connman_network_set_uint8(struct connman_network *network, const char *key, connman_uint8_t value); +extern connman_uint8_t connman_network_get_uint8(struct connman_network *network, + const char *key); extern int connman_network_set_blob(struct connman_network *network, const char *key, const void *data, unsigned int size); extern const void *connman_network_get_blob(struct connman_network *network, diff --git a/src/device.c b/src/device.c index d865ad4..55e07f9 100644 --- a/src/device.c +++ b/src/device.c @@ -976,6 +976,7 @@ int connman_device_set_carrier(struct connman_device *device, static void connect_known_network(struct connman_device *device) { + struct connman_network *network = NULL; GHashTableIter iter; gpointer key, value; unsigned int count = 0; @@ -985,13 +986,37 @@ static void connect_known_network(struct connman_device *device) g_hash_table_iter_init(&iter, device->networks); while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { - struct connman_network *network = value; - int err; + connman_uint8_t old_priority, new_priority; + connman_uint8_t old_strength, new_strength; count++; - if (connman_network_get_remember(network) == FALSE) + if (connman_network_get_remember(value) == FALSE) + continue; + + if (network == NULL) { + network = value; + continue; + } + + old_priority = connman_network_get_uint8(network, "Priority"); + new_priority = connman_network_get_uint8(value, "Priority"); + + if (new_priority != old_priority) { + if (new_priority > old_priority) + network = value; continue; + } + + old_strength = connman_network_get_uint8(network, "Strength"); + old_strength = connman_network_get_uint8(value, "Strength"); + + if (new_strength > old_strength) + network = value; + } + + if (network != NULL) { + int err; err = connman_network_connect(network); if (err == 0 || err == -EINPROGRESS) diff --git a/src/network.c b/src/network.c index 2cf4f08..2c6d6b8 100644 --- a/src/network.c +++ b/src/network.c @@ -814,7 +814,9 @@ int connman_network_set_uint8(struct connman_network *network, { DBG("network %p key %s value %d", network, key, value); - if (g_str_equal(key, "Strength") == TRUE) { + if (g_str_equal(key, "Priority") == TRUE) + network->priority = value; + else if (g_str_equal(key, "Strength") == TRUE) { network->strength = value; connman_element_set_static_property(&network->element, "Strength", DBUS_TYPE_BYTE, &value); @@ -824,6 +826,26 @@ int connman_network_set_uint8(struct connman_network *network, } /** + * connman_network_get_uint8: + * @network: network structure + * @key: unique identifier + * + * Get integer value for specific key + */ +connman_uint8_t connman_network_get_uint8(struct connman_network *network, + const char *key) +{ + DBG("network %p key %s", network, key); + + if (g_str_equal(key, "Priority") == TRUE) + return network->priority; + else if (g_str_equal(key, "Strength") == TRUE) + return network->strength; + + return 0; +} + +/** * connman_network_set_blob: * @network: network structure * @key: unique identifier -- 1.7.9.5