summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-08-21 13:38:04 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-08-23 14:19:14 +0300
commit3a8be9689f01e359a3325b1a9afbfb653883aed1 (patch)
tree20f6837405f9b5bd65ef0b1331b34f7e181619e1
parent7e151a7520740b586fe4f2adad1aa21864ef5321 (diff)
downloadconnman-3a8be9689f01e359a3325b1a9afbfb653883aed1.tar.gz
connman-3a8be9689f01e359a3325b1a9afbfb653883aed1.tar.bz2
connman-3a8be9689f01e359a3325b1a9afbfb653883aed1.zip
device: Refactor device scan function
In wifi plugin this means that we combine three wifi scan functions (normal, fast, hidden) into one scan function.
-rw-r--r--include/device.h4
-rw-r--r--plugins/iwmx.c5
-rw-r--r--plugins/wifi.c144
-rw-r--r--src/device.c12
4 files changed, 71 insertions, 94 deletions
diff --git a/include/device.h b/include/device.h
index d066296f..5339e98b 100644
--- a/include/device.h
+++ b/include/device.h
@@ -121,9 +121,7 @@ struct connman_device_driver {
void (*remove) (struct connman_device *device);
int (*enable) (struct connman_device *device);
int (*disable) (struct connman_device *device);
- int (*scan) (struct connman_device *device);
- int (*scan_fast) (struct connman_device *device);
- int (*scan_hidden)(struct connman_device *device,
+ int (*scan)(struct connman_device *device,
const char *ssid, unsigned int ssid_len,
const char *identity, const char* passphrase,
void *user_data);
diff --git a/plugins/iwmx.c b/plugins/iwmx.c
index 7c1e792c..c936706a 100644
--- a/plugins/iwmx.c
+++ b/plugins/iwmx.c
@@ -534,7 +534,10 @@ static void iwmx_cm_remove(struct connman_device *dev)
* 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)
+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);
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 409c060c..eec1cfbd 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -902,24 +902,34 @@ static int get_latest_connections(int max_ssids,
return num_ssids;
}
-static int wifi_scan(struct connman_device *device)
+static int wifi_scan_simple(struct connman_device *device)
{
reset_autoscan(device);
return throw_wifi_scan(device, scan_callback_hidden);
}
-static int wifi_scan_fast(struct connman_device *device)
+/*
+ * Note that the hidden scan is only used when connecting to this specific
+ * hidden AP first time. It is not used when system autoconnects to hidden AP.
+ */
+static int wifi_scan(struct connman_device *device,
+ const char *ssid, unsigned int ssid_len,
+ const char *identity, const char* passphrase,
+ gpointer user_data)
{
struct wifi_data *wifi = connman_device_get_data(device);
GSupplicantScanParams *scan_params = NULL;
+ struct scan_ssid *scan_ssid;
+ struct hidden_params *hidden;
int ret;
int driver_max_ssids = 0;
+ connman_bool_t do_hidden;
if (wifi == NULL)
return -ENODEV;
- DBG("device %p %p", device, wifi->interface);
+ DBG("device %p wifi %p hidden ssid %s", device, wifi->interface, ssid);
if (wifi->tethering == TRUE)
return 0;
@@ -927,107 +937,77 @@ static int wifi_scan_fast(struct connman_device *device)
if (connman_device_get_scanning(device) == TRUE)
return -EALREADY;
- driver_max_ssids = g_supplicant_interface_get_max_scan_ssids(
- wifi->interface);
- DBG("max ssids %d", driver_max_ssids);
- if (driver_max_ssids == 0)
- return wifi_scan(device);
-
- scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
- if (scan_params == NULL)
- return -ENOMEM;
+ if (ssid == NULL || ssid_len == 0 || ssid_len > 32) {
+ do_hidden = FALSE;
+ } else {
+ if (wifi->hidden != NULL)
+ return -EBUSY;
- ret = get_latest_connections(driver_max_ssids, scan_params);
- if (ret <= 0) {
- g_supplicant_free_scan_params(scan_params);
- return wifi_scan(device);
+ do_hidden = TRUE;
}
- connman_device_ref(device);
- reset_autoscan(device);
-
- ret = g_supplicant_interface_scan(wifi->interface, scan_params,
- scan_callback, device);
- if (ret == 0)
- connman_device_set_scanning(device, TRUE);
- else {
- g_supplicant_free_scan_params(scan_params);
- connman_device_unref(device);
+ if (do_hidden == FALSE) {
+ driver_max_ssids = g_supplicant_interface_get_max_scan_ssids(
+ wifi->interface);
+ DBG("max ssids %d", driver_max_ssids);
+ if (driver_max_ssids == 0)
+ return wifi_scan_simple(device);
}
- return ret;
-}
-
-/*
- * This func is only used when connecting to this specific AP first time.
- * It is not used when system autoconnects to hidden AP.
- */
-static int wifi_scan_hidden(struct connman_device *device,
- const char *ssid, unsigned int ssid_len,
- const char *identity, const char* passphrase,
- gpointer user_data)
-{
- struct wifi_data *wifi = connman_device_get_data(device);
- GSupplicantScanParams *scan_params = NULL;
- struct scan_ssid *scan_ssid;
- struct hidden_params *hidden;
- int ret;
-
- if (wifi == NULL)
- return -ENODEV;
-
- DBG("hidden SSID %s", ssid);
-
- if (wifi->tethering == TRUE || wifi->hidden != NULL)
- return -EBUSY;
-
- if (ssid == NULL || ssid_len == 0 || ssid_len > 32)
- return -EINVAL;
-
- if (connman_device_get_scanning(device) == TRUE)
- return -EALREADY;
-
scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
if (scan_params == NULL)
return -ENOMEM;
- scan_ssid = g_try_new(struct scan_ssid, 1);
- if (scan_ssid == NULL) {
- g_free(scan_params);
- return -ENOMEM;
- }
+ if (do_hidden == TRUE) {
+ scan_ssid = g_try_new(struct scan_ssid, 1);
+ if (scan_ssid == NULL) {
+ g_free(scan_params);
+ return -ENOMEM;
+ }
+
+ memcpy(scan_ssid->ssid, ssid, ssid_len);
+ scan_ssid->ssid_len = ssid_len;
+ scan_params->ssids = g_slist_prepend(scan_params->ssids,
+ scan_ssid);
+ scan_params->num_ssids = 1;
- memcpy(scan_ssid->ssid, ssid, ssid_len);
- scan_ssid->ssid_len = ssid_len;
- scan_params->ssids = g_slist_prepend(scan_params->ssids, scan_ssid);
+ hidden = g_try_new0(struct hidden_params, 1);
+ if (hidden == NULL) {
+ g_free(scan_params);
+ return -ENOMEM;
+ }
- scan_params->num_ssids = 1;
+ memcpy(hidden->ssid, ssid, ssid_len);
+ hidden->ssid_len = ssid_len;
+ hidden->identity = g_strdup(identity);
+ hidden->passphrase = g_strdup(passphrase);
+ hidden->user_data = user_data;
+ wifi->hidden = hidden;
- hidden = g_try_new0(struct hidden_params, 1);
- if (hidden == NULL) {
- g_free(scan_params);
- return -ENOMEM;
+ } else {
+ ret = get_latest_connections(driver_max_ssids, scan_params);
+ if (ret <= 0) {
+ g_supplicant_free_scan_params(scan_params);
+ return wifi_scan_simple(device);
+ }
}
- memcpy(hidden->ssid, ssid, ssid_len);
- hidden->ssid_len = ssid_len;
- hidden->identity = g_strdup(identity);
- hidden->passphrase = g_strdup(passphrase);
- hidden->user_data = user_data;
- wifi->hidden = hidden;
connman_device_ref(device);
reset_autoscan(device);
ret = g_supplicant_interface_scan(wifi->interface, scan_params,
- scan_callback, device);
+ scan_callback, device);
if (ret == 0)
connman_device_set_scanning(device, TRUE);
else {
- connman_device_unref(device);
g_supplicant_free_scan_params(scan_params);
- hidden_free(wifi->hidden);
- wifi->hidden = NULL;
+ connman_device_unref(device);
+
+ if (do_hidden == TRUE) {
+ hidden_free(wifi->hidden);
+ wifi->hidden = NULL;
+ }
}
return ret;
@@ -1072,8 +1052,6 @@ static struct connman_device_driver wifi_ng_driver = {
.enable = wifi_enable,
.disable = wifi_disable,
.scan = wifi_scan,
- .scan_fast = wifi_scan_fast,
- .scan_hidden = wifi_scan_hidden,
.set_regdom = wifi_set_regdom,
};
diff --git a/src/device.c b/src/device.c
index 13c2c5d0..f0f78914 100644
--- a/src/device.c
+++ b/src/device.c
@@ -589,10 +589,8 @@ int connman_device_set_powered(struct connman_device *device,
connman_device_set_disconnected(device, FALSE);
device->scanning = FALSE;
- if (device->driver && device->driver->scan_fast)
- device->driver->scan_fast(device);
- else if (device->driver && device->driver->scan)
- device->driver->scan(device);
+ if (device->driver && device->driver->scan)
+ device->driver->scan(device, NULL, 0, NULL, NULL, NULL);
return 0;
}
@@ -605,7 +603,7 @@ static int device_scan(struct connman_device *device)
if (device->powered == FALSE)
return -ENOLINK;
- return device->driver->scan(device);
+ return device->driver->scan(device, NULL, 0, NULL, NULL, NULL);
}
int __connman_device_disconnect(struct connman_device *device)
@@ -1118,13 +1116,13 @@ int __connman_device_request_hidden_scan(struct connman_device *device,
DBG("device %p", device);
if (device == NULL || device->driver == NULL ||
- device->driver->scan_hidden == NULL)
+ device->driver->scan == NULL)
return -EINVAL;
if (device->scanning == TRUE)
return -EALREADY;
- return device->driver->scan_hidden(device, ssid, ssid_len,
+ return device->driver->scan(device, ssid, ssid_len,
identity, passphrase, user_data);
}