Add support for automatic connection policy
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 5 Jan 2009 03:50:18 +0000 (04:50 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 5 Jan 2009 03:50:18 +0000 (04:50 +0100)
src/connman.h
src/device.c
src/network.c

index e36b45d..0b902dc 100644 (file)
@@ -150,6 +150,9 @@ static inline void __connman_udev_cleanup(void)
 int __connman_device_init(void);
 void __connman_device_cleanup(void);
 
+void __connman_device_increase_connections(struct connman_device *device);
+void __connman_device_decrease_connections(struct connman_device *device);
+
 connman_bool_t __connman_device_has_driver(struct connman_device *device);
 
 #include <connman/network.h>
index 1bc0d83..b4a4b0f 100644 (file)
@@ -39,6 +39,7 @@ struct connman_device {
        char *name;
        char *node;
        char *interface;
+       unsigned int connections;
 
        struct connman_device_driver *driver;
        void *driver_data;
@@ -884,6 +885,15 @@ int connman_device_set_powered(struct connman_device *device,
 
        g_dbus_send_message(connection, signal);
 
+       if (powered == FALSE)
+               return 0;
+
+       if (device->policy != CONNMAN_DEVICE_POLICY_AUTO)
+               return 0;
+
+       if (device->driver->scan)
+               device->driver->scan(device);
+
        return 0;
 }
 
@@ -932,6 +942,11 @@ int connman_device_set_carrier(struct connman_device *device,
        return 0;
 }
 
+static void connect_known_network(struct connman_device *device)
+{
+       DBG("device %p", device);
+}
+
 /**
  * connman_device_set_scanning:
  * @device: device structure
@@ -972,6 +987,17 @@ int connman_device_set_scanning(struct connman_device *device,
 
        g_dbus_send_message(connection, signal);
 
+       if (scanning == TRUE)
+               return 0;
+
+       if (device->connections > 0)
+               return 0;
+
+       if (device->policy != CONNMAN_DEVICE_POLICY_AUTO)
+               return 0;
+
+       connect_known_network(device);
+
        return 0;
 }
 
@@ -1019,6 +1045,16 @@ const char *connman_device_get_string(struct connman_device *device,
        return NULL;
 }
 
+void __connman_device_increase_connections(struct connman_device *device)
+{
+       device->connections++;
+}
+
+void __connman_device_decrease_connections(struct connman_device *device)
+{
+       device->connections--;
+}
+
 /**
  * connman_device_add_network:
  * @device: device structure
index eed3c08..ae3e1e3 100644 (file)
@@ -490,6 +490,8 @@ int connman_network_set_connected(struct connman_network *network,
                        break;
                }
 
+               __connman_device_increase_connections(network->device);
+
                element = connman_element_create(NULL);
                if (element != NULL) {
                        element->type    = type;
@@ -497,12 +499,15 @@ int connman_network_set_connected(struct connman_network *network,
                        element->index   = network->element.index;
 
                        if (connman_element_register(element,
-                                                       &network->element) < 0)
+                                               &network->element) < 0)
                                connman_element_unref(element);
                }
-       } else
+       } else {
                connman_element_unregister_children(&network->element);
 
+               __connman_device_decrease_connections(network->device);
+       }
+
        return 0;
 }