From: Daniel Wagner <[email protected]>
---
src/connman.h | 1 +
src/device.c | 6 ++++++
src/service.c | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/src/connman.h b/src/connman.h
index 408b809..681b29f 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -470,6 +470,7 @@ struct connman_service
*__connman_service_create_from_network(struct connman_net
struct connman_service *__connman_service_create_from_provider(struct
connman_provider *provider);
void __connman_service_update_from_network(struct connman_network *network);
void __connman_service_remove_from_network(struct connman_network *network);
+void __connman_service_reset_from_networks(struct connman_service *service,
GHashTable *networks);
void __connman_service_create_ip4config(struct connman_service *service,
int index);
diff --git a/src/device.c b/src/device.c
index 1465fce..601f727 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1108,6 +1108,7 @@ int connman_device_remove_network(struct connman_device
*device,
const char *identifier)
{
struct connman_network *network;
+ struct connman_service *service;
DBG("device %p identifier %s", device, identifier);
@@ -1115,10 +1116,15 @@ int connman_device_remove_network(struct connman_device
*device,
if (network == NULL)
return 0;
+ service = __connman_service_lookup_from_network(network);
+
__connman_network_set_device(network, NULL);
g_hash_table_remove(device->networks, identifier);
+ if (service != NULL)
+ __connman_service_reset_from_networks(service,
device->networks);
+
return 0;
}
diff --git a/src/service.c b/src/service.c
index e793d75..7919454 100644
--- a/src/service.c
+++ b/src/service.c
@@ -4944,6 +4944,43 @@ void __connman_service_remove_from_network(struct
connman_network *network)
__connman_service_put(service);
}
+void __connman_service_reset_from_networks(struct connman_service *service,
+ GHashTable *networks)
+{
+ struct connman_network *network;
+ GHashTableIter iter;
+ gpointer key, value;
+
+ DBG("service %p", service);
+
+ network = NULL;
+
+ g_hash_table_iter_init(&iter, networks);
+
+ while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+ struct connman_network *iter_network = value;
+ uint8_t strength, iter_strength;
+
+ if (network == NULL) {
+ network = iter_network;
+ continue;
+ }
+
+ strength = connman_network_get_strength(network);
+ iter_strength = connman_network_get_strength(iter_network);
+
+ if (iter_strength > strength)
+ network = iter_network;
+ }
+
+ if (network == NULL) {
+ service->network = NULL;
+ return;
+ }
+
+ __connman_service_create_from_network(network);
+}
+
/**
* __connman_service_create_from_provider:
* @provider: provider structure
--
1.7.6
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman