Add support for disconnecting networks first
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 21 Jan 2009 00:55:57 +0000 (01:55 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 21 Jan 2009 00:55:57 +0000 (01:55 +0100)
include/network.h
src/connman.h
src/device.c
src/network.c

index 2232dfd..f5d2e95 100644 (file)
@@ -72,6 +72,7 @@ extern int connman_network_set_available(struct connman_network *network,
 extern connman_bool_t connman_network_get_available(struct connman_network *network);
 extern int connman_network_set_connected(struct connman_network *network,
                                                connman_bool_t connected);
+extern connman_bool_t connman_network_get_connected(struct connman_network *network);
 extern int connman_network_set_remember(struct connman_network *network,
                                                connman_bool_t remember);
 extern connman_bool_t connman_network_get_remember(struct connman_network *network);
index 912aea1..b007cca 100644 (file)
@@ -163,6 +163,8 @@ void __connman_device_cleanup(void);
 void __connman_device_increase_connections(struct connman_device *device);
 void __connman_device_decrease_connections(struct connman_device *device);
 
+void __connman_device_disconnect(struct connman_device *device);
+
 connman_bool_t __connman_device_has_driver(struct connman_device *device);
 
 int __connman_device_set_offlinemode(connman_bool_t offlinemode);
@@ -175,6 +177,8 @@ void __connman_network_cleanup(void);
 void __connman_network_set_device(struct connman_network *network,
                                        struct connman_device *device);
 
+int __connman_network_disconnect(struct connman_network *network);
+
 connman_bool_t __connman_network_has_driver(struct connman_network *network);
 
 #include <connman/rtnl.h>
index ea72b25..74196b7 100644 (file)
@@ -996,6 +996,25 @@ int connman_device_set_carrier(struct connman_device *device,
        return 0;
 }
 
+void __connman_device_disconnect(struct connman_device *device)
+{
+       GHashTableIter iter;
+       gpointer key, value;
+
+       DBG("device %p", device);
+
+       g_hash_table_iter_init(&iter, device->networks);
+
+       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+               struct connman_network *network = value;
+
+               if (connman_network_get_connected(network) == FALSE)
+                       continue;
+
+               __connman_network_disconnect(network);
+       }
+}
+
 static void connect_known_network(struct connman_device *device)
 {
        struct connman_network *network = NULL;
index 3e27e7e..6571da6 100644 (file)
@@ -233,6 +233,12 @@ static DBusMessage *do_connect(DBusConnection *conn,
                return __connman_error_failed(msg);
 
        if (network->driver && network->driver->connect) {
+               enum connman_device_mode mode;
+
+               mode = connman_device_get_mode(network->device);
+               if (mode == CONNMAN_DEVICE_MODE_NETWORK_SINGLE)
+                       __connman_device_disconnect(network->device);
+
                err = network->driver->connect(network);
                if (err < 0 && err != -EINPROGRESS)
                        return __connman_error_failed(msg);
@@ -684,6 +690,17 @@ int connman_network_set_connected(struct connman_network *network,
 }
 
 /**
+ * connman_network_get_connected:
+ * @network: network structure
+ *
+ * Get network connection status
+ */
+connman_bool_t connman_network_get_connected(struct connman_network *network)
+{
+       return network->connected;
+}
+
+/**
  * connman_network_set_remember:
  * @network: network structure
  * @remember: remember state
@@ -756,6 +773,19 @@ int connman_network_connect(struct connman_network *network)
        return 0;
 }
 
+int __connman_network_disconnect(struct connman_network *network)
+{
+       if (network->connected == FALSE)
+               return -ENOTCONN;
+
+       if (network->driver && network->driver->disconnect)
+               return network->driver->disconnect(network);
+
+       network->connected = FALSE;
+
+       return 0;
+}
+
 /**
  * connman_network_set_string:
  * @network: network structure