diff options
author | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-12-11 16:36:25 +0200 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2013-01-04 12:59:34 +0200 |
commit | bb4ade7dc5d9c734a81b50313c9ff54b9f4ca7dc (patch) | |
tree | cd529207ad23dafe1114f90ba0450ecea78880f6 /plugins/iwmx.c | |
parent | bea636b41eb231e4f1f77added504ff9a7c97d6e (diff) | |
download | connman-bb4ade7dc5d9c734a81b50313c9ff54b9f4ca7dc.tar.gz connman-bb4ade7dc5d9c734a81b50313c9ff54b9f4ca7dc.tar.bz2 connman-bb4ade7dc5d9c734a81b50313c9ff54b9f4ca7dc.zip |
plugins: Remove WiMAX plugin files
Diffstat (limited to 'plugins/iwmx.c')
-rw-r--r-- | plugins/iwmx.c | 591 |
1 files changed, 0 insertions, 591 deletions
diff --git a/plugins/iwmx.c b/plugins/iwmx.c deleted file mode 100644 index c936706a..00000000 --- a/plugins/iwmx.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * - * Connection Manager - * - * Copyright (C) 2007-2012 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 <stdio.h> -#include <errno.h> -#include <string.h> - -#include <glib.h> - -#define CONNMAN_API_SUBJECT_TO_CHANGE -#include <connman/plugin.h> -#include <connman/device.h> -#include <connman/inet.h> -#include <connman/log.h> - -#include <WiMaxAPI.h> -#include <WiMaxAPIEx.h> - -#include "iwmx.h" - -/* - * Connman plugin interface - * - * This part deals with the connman internals - */ - -/* WiMAX network driver probe/remove, nops */ -static int iwmx_cm_network_probe(struct connman_network *nw) -{ - return 0; -} - -static void iwmx_cm_network_remove(struct connman_network *nw) -{ -} - -/* - * Called by connman when it wants us to tell the device to connect to - * the network @network_el; the device is @network_el->parent. - * - * We do a synchronous call to start the connection; the logic - * attached to the status change callback will update the connman - * internals once the change happens. - */ -static int iwmx_cm_network_connect(struct connman_network *nw) -{ - int result; - struct wmxsdk *wmxsdk; - const char *station_name = connman_network_get_identifier(nw); - - wmxsdk = connman_device_get_data(connman_network_get_device(nw)); - result = iwmx_sdk_connect(wmxsdk, nw); - DBG("(nw %p [%s] wmxsdk %p) = %d\n", nw, station_name, wmxsdk, result); - return result; -} - -/* - * Called by connman to have the device @nw->parent - * disconnected from @nw. - * - * We do a synchronous call to start the disconnection; the logic - * attached to the status change callback will update the connman - * internals once the change happens. - */ -static int iwmx_cm_network_disconnect(struct connman_network *nw) -{ - int result; - struct wmxsdk *wmxsdk; - const char *station_name = connman_network_get_identifier(nw); - - wmxsdk = connman_device_get_data(connman_network_get_device(nw)); - result = iwmx_sdk_disconnect(wmxsdk); - DBG("(nw %p [%s] wmxsdk %p) = %d\n", nw, station_name, wmxsdk, result); - return 0; -} - -/* - * "Driver" for the networks detected by a device. - */ -static struct connman_network_driver iwmx_cm_network_driver = { - .name = "iwmx", - .type = CONNMAN_NETWORK_TYPE_WIMAX, - .probe = iwmx_cm_network_probe, - .remove = iwmx_cm_network_remove, - .connect = iwmx_cm_network_connect, - .disconnect = iwmx_cm_network_disconnect, -}; - -/* - * A (maybe) new network is available, create/update its data - * - * If the network is new, we create and register a new element; if it - * is not, we reuse the one in the list. - * - * NOTE: - * wmxsdk->network_mutex has to be locked - */ -struct connman_network *__iwmx_cm_network_available( - struct wmxsdk *wmxsdk, const char *station_name, - const void *sdk_nspname, size_t sdk_nspname_size, - int strength) -{ - struct connman_network *nw = NULL; - struct connman_device *dev = wmxsdk->dev; - char group[3 * strlen(station_name) + 1]; - unsigned cnt; - - nw = connman_device_get_network(dev, station_name); - if (nw == NULL) { - DBG("new network %s", station_name); - nw = connman_network_create(station_name, - CONNMAN_NETWORK_TYPE_WIMAX); - connman_network_register(nw); - connman_network_set_index(nw, connman_device_get_index(dev)); - connman_network_set_name(nw, station_name); - connman_network_set_blob(nw, "WiMAX.NSP.name", - sdk_nspname, sdk_nspname_size); - /* FIXME: add roaming info? */ - /* Set the group name -- this has to be a unique - * [a-zA-Z0-9_] string common to all the networks that - * are actually the same provider. In WiMAX each - * network from the CAPI is a single provider, so we - * just set this as the network name, encoded in - * hex. */ - for (cnt = 0; station_name[cnt] != 0; cnt++) - sprintf(group + 3 * cnt, "%02x", station_name[cnt]); - group[3 * cnt + 1] = 0; - connman_network_set_group(nw, station_name); - if (connman_device_add_network(dev, nw) < 0) { - connman_network_unregister(nw); - connman_network_unref(nw); - goto error_add; - } - } else - DBG("updating network %s nw %p\n", station_name, nw); - connman_network_set_available(nw, TRUE); - connman_network_set_strength(nw, strength); -error_add: - return nw; -} - -/* - * A new network is available [locking version] - * - * See __iwmx_cm_network_available() for docs - */ -struct connman_network *iwmx_cm_network_available( - struct wmxsdk *wmxsdk, const char *station_name, - const void *sdk_nspname, size_t sdk_nspname_size, - int strength) -{ - struct connman_network *nw; - - g_static_mutex_lock(&wmxsdk->network_mutex); - nw = __iwmx_cm_network_available(wmxsdk, station_name, - sdk_nspname, sdk_nspname_size, - strength); - g_static_mutex_unlock(&wmxsdk->network_mutex); - return nw; -} - -/* - * The device has been enabled, make sure connman knows - */ -static void iwmx_cm_dev_enabled(struct wmxsdk *wmxsdk) -{ - struct connman_device *dev = wmxsdk->dev; - connman_inet_ifup(connman_device_get_index(dev)); - connman_device_set_powered(dev, TRUE); -} - -/* - * The device has been disabled, make sure connman is aware of it. - */ -static void iwmx_cm_dev_disabled(struct wmxsdk *wmxsdk) -{ - struct connman_device *dev = wmxsdk->dev; - connman_inet_ifdown(connman_device_get_index(dev)); - connman_device_set_powered(dev, FALSE); -} - -/* - * The device has been (externally to connman) connnected to a - * network, make sure connman knows. - * - * When the device is connected to a network, this function is called - * to change connman's internal state to reflect the fact. - * - * If the change came from an external entity, that means that our - * connect code wasn't called. Our connect code sets - * @wmxsdk->connecting_nw to the network we were connecting - * to. If it is unset, it means an external entity forced the device - * to connect. In that case, we need to find out which network it was - * connected to, and create/lookup a @nw for it. - * - * Once the nw is set, then we are done. - */ -static void iwmx_cm_dev_connected(struct wmxsdk *wmxsdk) -{ - struct connman_network *nw; - - g_mutex_lock(wmxsdk->connect_mutex); - nw = wmxsdk->connecting_nw; - if (nw == NULL) { - nw = __iwmx_sdk_get_connected_network(wmxsdk); - if (nw == NULL) { - connman_error("wmxsdk: can't find connected network\n"); - goto error_nw_find; - } - } - wmxsdk->nw = connman_network_ref(nw); - wmxsdk->connecting_nw = NULL; - connman_network_set_ipv4_method(nw, CONNMAN_IPCONFIG_METHOD_DHCP); - connman_network_set_connected(nw, TRUE); - DBG("connected to network %s\n", - connman_network_get_identifier(nw)); -error_nw_find: - g_mutex_unlock(wmxsdk->connect_mutex); -} - -/* - * The device has been (externally to connman) disconnnected, make - * sure connman knows - * - * We need to reverse the steps done in iwmx_cm_dev_connected(). - * If the event was caused by an external entity and we had no record - * of being connected to a network...well, bad luck. We'll just - * pretend it happened ok. - */ -static void __iwmx_cm_dev_disconnected(struct wmxsdk *wmxsdk) -{ - struct connman_network *nw = wmxsdk->nw; - - if (nw != NULL) { - DBG("disconnected from network %s\n", - connman_network_get_identifier(nw)); - connman_network_set_connected(nw, FALSE); - connman_network_unregister(nw); - connman_network_unref(nw); - wmxsdk->nw = NULL; - } else - DBG("disconnected from unknown network\n"); -} - -/* - * The device has been disconnnected, make sure connman knows - * - * See __iwmx_cm_dev_disconnect() for more information. - */ -static void iwmx_cm_dev_disconnected(struct wmxsdk *wmxsdk) -{ - g_mutex_lock(wmxsdk->connect_mutex); - __iwmx_cm_dev_disconnected(wmxsdk); - g_mutex_unlock(wmxsdk->connect_mutex); -} - -/* - * Handle a change in state - * - * This is were most of the action happens. When the device changes - * state, this will catch it (through the state change callback or an - * explicit call) and call iwmx_cm_dev_*ed() to indicate to connman what - * happened. - * - * Finally, cache the new device status. - */ -void __iwmx_cm_state_change(struct wmxsdk *wmxsdk, - WIMAX_API_DEVICE_STATUS __new_status) -{ - WIMAX_API_DEVICE_STATUS __old_status = wmxsdk->status; - WIMAX_API_DEVICE_STATUS old_status; - WIMAX_API_DEVICE_STATUS new_status; - - /* - * Simplify state transition computations. - * - * For practical effects, some states are the same - */ - -#if HAVE_IWMXSDK_STATUS_IDLE - /* Conection_Idle is the same as Data_Connected */ - if (__old_status == WIMAX_API_DEVICE_STATUS_Connection_Idle) - old_status = WIMAX_API_DEVICE_STATUS_Data_Connected; - else - old_status = __old_status; - if (__new_status == WIMAX_API_DEVICE_STATUS_Connection_Idle) - new_status = WIMAX_API_DEVICE_STATUS_Data_Connected; - else - new_status = __new_status; -#endif /* #if HAVE_IWMXSDK_STATUS_IDLE */ - /* Radio off: all are just RF_OFF_SW (the highest) */ - switch (__old_status) { - case WIMAX_API_DEVICE_STATUS_RF_OFF_HW_SW: - case WIMAX_API_DEVICE_STATUS_RF_OFF_HW: - case WIMAX_API_DEVICE_STATUS_RF_OFF_SW: - old_status = WIMAX_API_DEVICE_STATUS_RF_OFF_SW; - break; - default: - old_status = __old_status; - break; - } - - switch (__new_status) { - case WIMAX_API_DEVICE_STATUS_RF_OFF_HW_SW: - case WIMAX_API_DEVICE_STATUS_RF_OFF_HW: - case WIMAX_API_DEVICE_STATUS_RF_OFF_SW: - new_status = WIMAX_API_DEVICE_STATUS_RF_OFF_SW; - break; - default: - new_status = __new_status; - break; - } - - /* If no real state change, do nothing */ - if (old_status == new_status) { - DBG("no state changed\n"); - return; - } else - DBG("state change from %d (%d: %s) to %d (%d: %s)\n", - old_status, __old_status, - iwmx_sdk_dev_status_to_str(__old_status), - new_status, __new_status, - iwmx_sdk_dev_status_to_str(__new_status)); - - /* Cleanup old state */ - switch (old_status) { - case WIMAX_API_DEVICE_STATUS_UnInitialized: - /* This means the plugin is starting but the device is - * in some state already, so we need to update our - * internal knowledge of it. */ - if (new_status > WIMAX_API_DEVICE_STATUS_RF_OFF_SW) - iwmx_cm_dev_enabled(wmxsdk); - break; - case WIMAX_API_DEVICE_STATUS_RF_OFF_SW: - /* This means the radio is being turned on, so enable - * the device ( unless going to uninitialized). */ - if (new_status != WIMAX_API_DEVICE_STATUS_RF_OFF_SW) - iwmx_cm_dev_enabled(wmxsdk); - break; - case WIMAX_API_DEVICE_STATUS_Ready: - break; - case WIMAX_API_DEVICE_STATUS_Scanning: - break; - case WIMAX_API_DEVICE_STATUS_Connecting: - break; - case WIMAX_API_DEVICE_STATUS_Data_Connected: - iwmx_cm_dev_disconnected(wmxsdk); - break; - default: - connman_error("wmxsdk: unknown old status %d\n", old_status); - return; - }; - - /* Implement new state */ - switch (new_status) { - case WIMAX_API_DEVICE_STATUS_UnInitialized: - break; - case WIMAX_API_DEVICE_STATUS_RF_OFF_SW: - /* This means the radio is being turned off, so - * disable the device unless coming from uninitialized. */ - if (old_status != WIMAX_API_DEVICE_STATUS_UnInitialized) - iwmx_cm_dev_disabled(wmxsdk); - break; - case WIMAX_API_DEVICE_STATUS_Ready: - break; - case WIMAX_API_DEVICE_STATUS_Scanning: - break; - case WIMAX_API_DEVICE_STATUS_Connecting: - break; - case WIMAX_API_DEVICE_STATUS_Data_Connected: - iwmx_cm_dev_connected(wmxsdk); - break; - default: - connman_error("wmxsdk: unknown new status %d\n", old_status); - return; - }; - wmxsdk->status = __new_status; -} - -/* - * Implement a device state transition [locking version] - * - * See __iwmx_cm_state_change() - */ -void iwmx_cm_state_change(struct wmxsdk *wmxsdk, - WIMAX_API_DEVICE_STATUS __new_status) -{ - g_mutex_lock(wmxsdk->status_mutex); - __iwmx_cm_state_change(wmxsdk, __new_status); - g_mutex_unlock(wmxsdk->status_mutex); -} - -/* - * Read the cached device status - */ -WIMAX_API_DEVICE_STATUS iwmx_cm_status_get(struct wmxsdk *wmxsdk) -{ - WIMAX_API_DEVICE_STATUS status; - - g_mutex_lock(wmxsdk->status_mutex); - status = wmxsdk->status; - g_mutex_unlock(wmxsdk->status_mutex); - return status; -} - -/* - * Called by connman when a device is enabled by the user - * - * We need to turn the radio on; the state change function will poke - * the internals. - */ -static int iwmx_cm_enable(struct connman_device *dev) -{ - int result; - struct wmxsdk *wmxsdk = connman_device_get_data(dev); - - connman_inet_ifup(connman_device_get_index(dev)); - result = iwmx_sdk_rf_state_set(wmxsdk, WIMAX_API_RF_ON); - return result; -} - -/* - * Called by connman when a device is disabled by the user - * - * Simple: just make sure the radio is off; the state change function - * will poke the internals. - */ -static int iwmx_cm_disable(struct connman_device *dev) -{ - int result; - struct wmxsdk *wmxsdk = connman_device_get_data(dev); - - result = iwmx_sdk_rf_state_set(wmxsdk, WIMAX_API_RF_OFF); - connman_inet_ifdown(connman_device_get_index(dev)); - return 0; -} - -/* - * Probe deferred call from when the mainloop is idle - * - * probe() schedules this to be called from the mainloop when idle to - * do a device status evaluation. Needed because of an internal race - * condition in connman. FIXME: deploy into _probe() when fixed. - */ -static gboolean __iwmx_cm_probe_dpc(gpointer _wmxsdk) -{ - int result; - struct wmxsdk *wmxsdk = _wmxsdk; - result = iwmx_sdk_get_device_status(wmxsdk); - if (result < 0) - connman_error("wmxsdk: can't get status: %d\n", result); - else - iwmx_cm_state_change(wmxsdk, result); - return FALSE; -} - -/* - * Called by connman when a new device pops in - * - * We allocate our private structure, register with the WiMAX API, - * open their device, subscribe to all the callbacks. - * - * At the end, we launch a deferred call (to work around current - * connman issues that need to be fixed in the future) and update the - * device's status. This allows us to pick up the current status and - * adapt connman's idea of the device to it. - */ -static int iwmx_cm_probe(struct connman_device *dev) -{ - int result; - struct wmxsdk *wmxsdk = NULL; - - wmxsdk = connman_device_get_data(dev); - if (wmxsdk == NULL) - /* not called from a discovery done by the WiMAX - * Network Service, ignore */ - return -ENODEV; - - result = iwmx_sdk_setup(wmxsdk); - if (result < 0) - goto error_setup; - - /* There is a race condition in the connman core that doesn't - * allow us to call this directly and things to work properly - * FIXME FIXME FIXME: merge _dpc call in here when connman is fixed */ - g_idle_add(__iwmx_cm_probe_dpc, wmxsdk); - return 0; - - iwmx_sdk_remove(wmxsdk); -error_setup: - return result; -} - -/* - * Called when a device is removed from connman - * - * Cleanup all that is done in _probe. Remove callbacks, unregister - * from the WiMAX API. - */ -static void iwmx_cm_remove(struct connman_device *dev) -{ - struct wmxsdk *wmxsdk = connman_device_get_data(dev); - iwmx_sdk_remove(wmxsdk); -} - -/* - * Called by connman to ask the device to scan for networks - * - * We have set in the WiMAX API the scan result callbacks, so we just - * start a simple scan (not a wide one). - * - * First we obtain the current list of networks and pass it to the - * callback processor. Then we start an scan cycle. - */ -static int iwmx_cm_scan(struct connman_device *dev, - const char *ssid, unsigned int ssid_len, - const char *identity, const char* passphrase, - void *user_data) -{ - struct wmxsdk *wmxsdk = connman_device_get_data(dev); - return iwmx_sdk_scan(wmxsdk); -} - -/* - * Driver for a WiMAX API based device. - */ -static struct connman_device_driver iwmx_cm_device_driver = { - .name = "iwmx", - .type = CONNMAN_DEVICE_TYPE_WIMAX, - .probe = iwmx_cm_probe, - .remove = iwmx_cm_remove, - .enable = iwmx_cm_enable, - .disable = iwmx_cm_disable, - .scan = iwmx_cm_scan, -}; - -static int iwmx_cm_init(void) -{ - int result; - - result = connman_device_driver_register(&iwmx_cm_device_driver); - if (result < 0) - goto error_driver_register; - result = connman_network_driver_register(&iwmx_cm_network_driver); - if (result < 0) - goto error_network_driver_register; - result = iwmx_sdk_api_init(); - if (result < 0) - goto error_iwmx_sdk_init; - return 0; - -error_iwmx_sdk_init: - connman_network_driver_unregister(&iwmx_cm_network_driver); -error_network_driver_register: - connman_device_driver_unregister(&iwmx_cm_device_driver); -error_driver_register: - return result; -} - -static void iwmx_cm_exit(void) -{ - iwmx_sdk_api_exit(); - connman_network_driver_unregister(&iwmx_cm_network_driver); - connman_device_driver_unregister(&iwmx_cm_device_driver); -} - -CONNMAN_PLUGIN_DEFINE(iwmx, "Intel WiMAX SDK / Common API plugin", - CONNMAN_VERSION, CONNMAN_PLUGIN_PRIORITY_LOW, - iwmx_cm_init, iwmx_cm_exit); |