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

Reply via email to