From: Marcel Holtmann Date: Mon, 5 Jan 2009 03:50:18 +0000 (+0100) Subject: Add support for automatic connection policy X-Git-Tag: 0.7~56 X-Git-Url: http://git.maemo.org/git/?p=connman;a=commitdiff_plain;h=9b05cebe93ad885ee2a2156f6310eb7da365e581 Add support for automatic connection policy --- diff --git a/src/connman.h b/src/connman.h index e36b45d..0b902dc 100644 --- a/src/connman.h +++ b/src/connman.h @@ -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 diff --git a/src/device.c b/src/device.c index 1bc0d83..b4a4b0f 100644 --- a/src/device.c +++ b/src/device.c @@ -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 diff --git a/src/network.c b/src/network.c index eed3c08..ae3e1e3 100644 --- a/src/network.c +++ b/src/network.c @@ -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; }