summaryrefslogtreecommitdiff
path: root/plugins/wifi-legacy.c
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-09-16 00:21:23 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-09-20 15:14:16 +0200
commitcbb031b7308e800149f76537fc7ccbd1a40a0735 (patch)
tree37e27ff80532280e0ed72ad7aed7798615cb98a8 /plugins/wifi-legacy.c
parent3053d4aba0db458ad7adf48041c79734700c5ee0 (diff)
downloadconnman-cbb031b7308e800149f76537fc7ccbd1a40a0735.tar.gz
connman-cbb031b7308e800149f76537fc7ccbd1a40a0735.tar.bz2
connman-cbb031b7308e800149f76537fc7ccbd1a40a0735.zip
Move current wifi plugin to legacy
The current wifi plugin is replaced by the new API one and is renamed to wifi-legacy.c.
Diffstat (limited to 'plugins/wifi-legacy.c')
-rw-r--r--plugins/wifi-legacy.c237
1 files changed, 237 insertions, 0 deletions
diff --git a/plugins/wifi-legacy.c b/plugins/wifi-legacy.c
new file mode 100644
index 00000000..eb7dd83e
--- /dev/null
+++ b/plugins/wifi-legacy.c
@@ -0,0 +1,237 @@
+/*
+ *
+ * Connection Manager
+ *
+ * Copyright (C) 2007-2010 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
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <net/if.h>
+
+#ifndef IFF_LOWER_UP
+#define IFF_LOWER_UP 0x10000
+#endif
+
+#include <dbus/dbus.h>
+#include <glib.h>
+
+#define CONNMAN_API_SUBJECT_TO_CHANGE
+#include <connman/plugin.h>
+#include <connman/device.h>
+#include <connman/rtnl.h>
+#include <connman/log.h>
+
+#include "supplicant.h"
+
+#define CLEANUP_TIMEOUT 8 /* in seconds */
+#define INACTIVE_TIMEOUT 12 /* in seconds */
+
+struct wifi_data {
+ char *identifier;
+ connman_bool_t connected;
+ int index;
+ unsigned flags;
+ unsigned int watch;
+};
+
+static int network_probe(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ return 0;
+}
+
+static void network_remove(struct connman_network *network)
+{
+ DBG("network %p", network);
+}
+
+static int network_connect(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ return supplicant_connect(network);
+}
+
+static int network_disconnect(struct connman_network *network)
+{
+ DBG("network %p", network);
+
+ return supplicant_disconnect(network);
+}
+
+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,
+};
+
+static void wifi_newlink(unsigned flags, unsigned change, void *user_data)
+{
+ struct connman_device *device = user_data;
+ struct wifi_data *wifi = connman_device_get_data(device);
+
+ DBG("index %d flags %d change %d", wifi->index, flags, change);
+
+ if (!change)
+ return;
+
+ if ((wifi->flags & IFF_UP) != (flags & IFF_UP)) {
+ if (flags & IFF_UP) {
+ DBG("interface up");
+ } else {
+ DBG("interface down");
+ }
+ }
+
+ if ((wifi->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
+ if (flags & IFF_LOWER_UP) {
+ DBG("carrier on");
+ } else {
+ DBG("carrier off");
+ }
+ }
+
+ wifi->flags = flags;
+}
+
+static int wifi_probe(struct connman_device *device)
+{
+ struct wifi_data *wifi;
+
+ DBG("device %p", device);
+
+ wifi = g_try_new0(struct wifi_data, 1);
+ if (wifi == NULL)
+ return -ENOMEM;
+
+ wifi->connected = FALSE;
+
+ connman_device_set_data(device, wifi);
+
+ wifi->index = connman_device_get_index(device);
+ wifi->flags = 0;
+
+ wifi->watch = connman_rtnl_add_newlink_watch(wifi->index,
+ wifi_newlink, device);
+
+ return 0;
+}
+
+static void wifi_remove(struct connman_device *device)
+{
+ struct wifi_data *wifi = connman_device_get_data(device);
+
+ DBG("device %p", device);
+
+ connman_device_set_data(device, NULL);
+
+ connman_rtnl_remove_watch(wifi->watch);
+
+ g_free(wifi->identifier);
+ g_free(wifi);
+}
+
+static int wifi_enable(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ return supplicant_start(device);
+}
+
+static int wifi_disable(struct connman_device *device)
+{
+ struct wifi_data *wifi = connman_device_get_data(device);
+
+ DBG("device %p", device);
+
+ wifi->connected = FALSE;
+
+ return supplicant_stop(device);
+}
+
+static int wifi_scan(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ return supplicant_scan(device);
+}
+
+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,
+};
+
+static void wifi_register(void)
+{
+ DBG("");
+
+ if (connman_device_driver_register(&wifi_driver) < 0)
+ connman_error("Failed to register WiFi driver");
+}
+
+static void wifi_unregister(void)
+{
+ DBG("");
+
+ connman_device_driver_unregister(&wifi_driver);
+}
+
+static struct supplicant_driver supplicant = {
+ .name = "wifi",
+ .probe = wifi_register,
+ .remove = wifi_unregister,
+};
+
+static int wifi_init(void)
+{
+ int err;
+
+ err = connman_network_driver_register(&network_driver);
+ if (err < 0)
+ return err;
+
+ err = supplicant_register(&supplicant);
+ if (err < 0) {
+ connman_network_driver_unregister(&network_driver);
+ return err;
+ }
+
+ return 0;
+}
+
+static void wifi_exit(void)
+{
+ supplicant_unregister(&supplicant);
+
+ connman_network_driver_unregister(&network_driver);
+}
+
+CONNMAN_PLUGIN_DEFINE(wifi_legacy, "WiFi interface plugin", VERSION,
+ CONNMAN_PLUGIN_PRIORITY_DEFAULT, wifi_init, wifi_exit)