This patch fix the race condition that caused more than one service
to start connecting at the same fime by:
* Make sure is_connecting always returning the right status of
the network and dont allow the small intevel until get the
G_SUPPLICANT_STATE_AUTHENTICATING or G_SUPPLICANT_STATE_ASSOCIATING
signal from supplicant.
* Fix serving soring so connecting service will make it in the top
so auto_connect search will work.
* Dont need device->connected in end scan to decide to call
auto_connect.
This patch used Samuel patch and add to it.
case CONNMAN_SERVICE_STATE_UNKNOWN:
case CONNMAN_SERVICE_STATE_IDLE:
case CONNMAN_SERVICE_STATE_FAILURE:
+ if (service->network != NULL)
+ return __connman_network_get_connecting(
+ service->network);
case CONNMAN_SERVICE_STATE_DISCONNECT:
---
src/device.c | 3 ---
src/network.c | 4 ++--
src/service.c | 8 ++++++++
3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/device.c b/src/device.c
index 65ff88c..c2a0c7b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -854,9 +854,6 @@ int connman_device_set_scanning(struct connman_device
*device,
if (device->connections > 0)
return 0;
- if (device->disconnected == TRUE)
- return 0;
-
__connman_service_auto_connect();
return 0;
diff --git a/src/network.c b/src/network.c
index 57d873a..81f963e 100644
--- a/src/network.c
+++ b/src/network.c
@@ -896,10 +896,10 @@ int __connman_network_connect(struct connman_network
*network)
if (network->device == NULL)
return -ENODEV;
- __connman_device_disconnect(network->device);
-
network->connecting = TRUE;
+ __connman_device_disconnect(network->device);
+
service = __connman_service_lookup_from_network(network);
err = network->driver->connect(network);
diff --git a/src/service.c b/src/service.c
index f06de26..cca1ab8 100644
--- a/src/service.c
+++ b/src/service.c
@@ -308,6 +308,9 @@ static connman_bool_t is_connecting(struct connman_service
*service)
case CONNMAN_SERVICE_STATE_UNKNOWN:
case CONNMAN_SERVICE_STATE_IDLE:
case CONNMAN_SERVICE_STATE_FAILURE:
+ if (service->network != NULL)
+ return __connman_network_get_connecting(
+ service->network);
case CONNMAN_SERVICE_STATE_DISCONNECT:
case CONNMAN_SERVICE_STATE_READY:
case CONNMAN_SERVICE_STATE_ONLINE:
@@ -2798,6 +2801,11 @@ static gint service_compare(gconstpointer a,
gconstpointer b,
return -1;
if (is_connected(service_b) == TRUE)
return 1;
+
+ if (is_connecting(service_a) == TRUE)
+ return -1;
+ if (is_connecting(service_b) == TRUE)
+ return 1;
}
if (service_a->order > service_b->order)
--
1.7.3.3
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman