X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=plugins%2Fwifi.c;h=92e578717383f52d9c209c3537503df576116eac;hb=6f24662363c391c653d4a90518b0ff664f3ae5c4;hp=640b708594f7bc143ac58de9ad750f0ff0671941;hpb=bcb649ac5e1814b1ef4516229c0be8695adf9055;p=connman diff --git a/plugins/wifi.c b/plugins/wifi.c index 640b708..92e5787 100644 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2009 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,284 +23,158 @@ #include #endif -#include +#include + #include +#include +#define CONNMAN_API_SUBJECT_TO_CHANGE #include -#include +#include #include +#include "inet.h" #include "supplicant.h" -static struct connman_element *dhcp_element = NULL; +#define CLEANUP_TIMEOUT 8 /* in seconds */ +#define INACTIVE_TIMEOUT 12 /* in seconds */ + +struct wifi_data { + char *identifier; + connman_bool_t connected; +}; -static int network_probe(struct connman_element *element) +static int network_probe(struct connman_network *network) { - DBG("element %p name %s", element, element->name); + DBG("network %p", network); return 0; } -static void network_remove(struct connman_element *element) +static void network_remove(struct connman_network *network) { - DBG("element %p name %s", element, element->name); + DBG("network %p", network); } -static int network_connect(struct connman_element *element) +static int network_connect(struct connman_network *network) { - DBG("element %p name %s", element, element->name); - - if (dhcp_element != NULL) { - connman_element_unregister(dhcp_element); - dhcp_element = NULL; - } - - __supplicant_disconnect(element); - - element->connected = FALSE; - - connman_element_update(element); - - g_free(element->parent->network.identifier); - element->parent->network.identifier = element->network.identifier; - - if (__supplicant_connect(element, element->network.identifier) < 0) - connman_error("Failed to initiate connect"); + DBG("network %p", network); - return 0; + return supplicant_connect(network); } -static int network_disconnect(struct connman_element *element) +static int network_disconnect(struct connman_network *network) { - DBG("element %p name %s", element, element->name); - - if (dhcp_element != NULL) { - connman_element_unregister(dhcp_element); - dhcp_element = NULL; - } - - __supplicant_disconnect(element); - - element->connected = FALSE; - - connman_element_update(element); + DBG("network %p", network); - return 0; + return supplicant_disconnect(network); } -static struct connman_driver network_driver = { - .name = "wifi-network", - .type = CONNMAN_ELEMENT_TYPE_NETWORK, - .subtype = CONNMAN_ELEMENT_SUBTYPE_WIFI, +static struct connman_network_driver network_driver = { + .name = "wifi", + .type = CONNMAN_NETWORK_TYPE_WIFI, .probe = network_probe, .remove = network_remove, .connect = network_connect, .disconnect = network_disconnect, }; -struct wifi_data { - GStaticMutex mutex; - GSList *list; -}; - -static struct connman_element *find_element(struct wifi_data *data, - const char *identifier) +static int wifi_probe(struct connman_device *device) { - GSList *list; + struct wifi_data *data; - for (list = data->list; list; list = list->next) { - struct connman_element *element = list->data; + DBG("device %p", device); - if (element->network.identifier == NULL) - continue; + data = g_try_new0(struct wifi_data, 1); + if (data == NULL) + return -ENOMEM; - if (g_str_equal(element->network.identifier, - identifier) == TRUE) - return element; - } + data->connected = FALSE; + + connman_device_set_data(device, data); - return NULL; + return 0; } -static void state_change(struct connman_element *parent, - enum supplicant_state state) +static void wifi_remove(struct connman_device *device) { - struct wifi_data *data = connman_element_get_data(parent); - struct connman_element *element; - - DBG("state %d", state); - - if (parent->network.identifier == NULL) - return; - - element = find_element(data, parent->network.identifier); - if (element == NULL) - return; - - if (state == STATE_COMPLETED) { - struct connman_element *dhcp; - - dhcp = connman_element_create(); + struct wifi_data *data = connman_device_get_data(device); - dhcp->type = CONNMAN_ELEMENT_TYPE_DHCP; - dhcp->netdev.index = element->netdev.index; - dhcp->netdev.name = g_strdup(element->netdev.name); + DBG("device %p", device); - dhcp_element = dhcp; + connman_device_set_data(device, NULL); - element->connected = TRUE; - - connman_element_update(element); - - connman_element_register(dhcp, element); - } + g_free(data->identifier); + g_free(data); } -static void scan_result(struct connman_element *parent, - struct supplicant_network *network) +static int wifi_enable(struct connman_device *device) { - struct wifi_data *data = connman_element_get_data(parent); - struct connman_element *element; - gchar *temp; - int i; - - DBG("network %p identifier %s", network, network->identifier); - - if (data == NULL) - return; - - if (network->identifier == NULL) - return; - - if (network->identifier[0] == '\0') - return; - - temp = g_strdup(network->identifier); + DBG("device %p", device); - for (i = 0; i < strlen(temp); i++) { - if (temp[i] == ' ' || temp[i] == '.' || temp[i] == '-') - temp[i] = '_'; - if (temp[i] == '(' || temp[i] == ')') - temp[i] = '_'; - if (g_ascii_isprint(temp[i]) == FALSE) - temp[i] = '_'; - temp[i] = g_ascii_tolower(temp[i]); - } - - g_static_mutex_lock(&data->mutex); - - element = find_element(data, network->identifier); - if (element == NULL) { - element = connman_element_create(); - - element->type = CONNMAN_ELEMENT_TYPE_NETWORK; - element->name = temp; - - element->network.identifier = g_strdup(network->identifier); - - element->netdev.index = parent->netdev.index; - element->netdev.name = g_strdup(parent->netdev.name); - - data->list = g_slist_append(data->list, element); - - connman_element_add_static_property(element, "SSID", - DBUS_TYPE_STRING, &network->identifier); - - connman_element_register(element, parent); - } else - g_free(temp); - - g_static_mutex_unlock(&data->mutex); + return supplicant_start(device); } -static struct supplicant_callback wifi_callback = { - .state_change = state_change, - .scan_result = scan_result, -}; - -static int wifi_probe(struct connman_element *element) +static int wifi_disable(struct connman_device *device) { - struct wifi_data *data; - int err; + struct wifi_data *data = connman_device_get_data(device); - DBG("element %p name %s", element, element->name); + DBG("device %p", device); - data = g_try_new0(struct wifi_data, 1); - if (data == NULL) - return -ENOMEM; - - g_static_mutex_init(&data->mutex); - - connman_element_set_data(element, data); - - err = __supplicant_start(element, &wifi_callback); - if (err < 0) - return err; + data->connected = FALSE; - __supplicant_scan(element); - - return 0; + return supplicant_stop(device); } -static void wifi_remove(struct connman_element *element) +static int wifi_scan(struct connman_device *device) { - struct wifi_data *data = connman_element_get_data(element); - GSList *list; - - DBG("element %p name %s", element, element->name); + DBG("device %p", device); - __supplicant_stop(element); - - connman_element_set_data(element, NULL); - - if (data == NULL) - return; - - g_static_mutex_lock(&data->mutex); - - for (list = data->list; list; list = list->next) { - struct connman_element *network = list->data; - - connman_element_unregister(network); - connman_element_unref(network); - } + return supplicant_scan(device); +} - g_slist_free(data->list); +static struct connman_device_driver wifi_driver = { + .name = "wifi", + .type = CONNMAN_DEVICE_TYPE_WIFI, + .probe = wifi_probe, + .remove = wifi_remove, + .enable = wifi_enable, + .disable = wifi_disable, + .scan = wifi_scan, +}; - g_static_mutex_unlock(&data->mutex); +static void wifi_register(void) +{ + DBG(""); - g_free(data); + if (connman_device_driver_register(&wifi_driver) < 0) + connman_error("Failed to register WiFi driver"); } -static int wifi_update(struct connman_element *element) +static void wifi_unregister(void) { - DBG("element %p name %s", element, element->name); + DBG(""); - __supplicant_scan(element); - - return 0; + connman_device_driver_unregister(&wifi_driver); } -static struct connman_driver wifi_driver = { - .name = "wifi-device", - .type = CONNMAN_ELEMENT_TYPE_DEVICE, - .subtype = CONNMAN_ELEMENT_SUBTYPE_WIFI, - .probe = wifi_probe, - .remove = wifi_remove, - .update = wifi_update, +static struct supplicant_driver supplicant = { + .name = "wifi", + .probe = wifi_register, + .remove = wifi_unregister, }; static int wifi_init(void) { int err; - err = connman_driver_register(&network_driver); + err = connman_network_driver_register(&network_driver); if (err < 0) return err; - err = connman_driver_register(&wifi_driver); + err = supplicant_register(&supplicant); if (err < 0) { - connman_driver_unregister(&network_driver); + connman_network_driver_unregister(&network_driver); return err; } @@ -309,9 +183,10 @@ static int wifi_init(void) static void wifi_exit(void) { - connman_driver_unregister(&network_driver); - connman_driver_unregister(&wifi_driver); + supplicant_unregister(&supplicant); + + connman_network_driver_unregister(&network_driver); } -CONNMAN_PLUGIN_DEFINE("wifi", "WiFi interface plugin", VERSION, +CONNMAN_PLUGIN_DEFINE(wifi, "WiFi interface plugin", VERSION, wifi_init, wifi_exit)