#include "util.h"
#include "netdbus.h"
#include "wifi-state.h"
+#include "wifi-scan.h"
#include "wifi-background-scan.h"
-#if defined TIZEN_WEARABLE
-#define SCAN_PERIODIC_DELAY 15
-#define SCAN_EXPONENTIAL_MIN 5
-#define SCAN_EXPONENTIAL_MAX 320
-#else
-#define SCAN_PERIODIC_DELAY 10
-#define SCAN_EXPONENTIAL_MIN 4
-#define SCAN_EXPONENTIAL_MAX 128
-#endif
-
-enum {
- WIFI_BGSCAN_MODE_EXPONENTIAL = 0x00,
- WIFI_BGSCAN_MODE_PERIODIC,
- WIFI_BGSCAN_MODE_MAX,
-};
-
-struct bgscan_timer_data {
- guint time;
- guint mode;
- guint timer_id;
-};
-
-static gboolean netconfig_wifi_scanning = FALSE;
-static gboolean netconfig_bgscan_paused = FALSE;
-
-static struct bgscan_timer_data *__netconfig_wifi_bgscan_get_bgscan_data(void)
+void netconfig_wifi_bgscan_start(const char *interface_name, gboolean immediate_scan)
{
- static struct bgscan_timer_data timer_data =
- {SCAN_EXPONENTIAL_MIN, WIFI_BGSCAN_MODE_EXPONENTIAL, 0};
+ wifi_tech_state_e wifi_tech_state;
+ wifi_service_state_e wifi_service_state;
+ int ug_state = VCONFKEY_WIFI_UG_RUN_STATE_OFF;
+ guint bg_mode = WIFI_BGSCAN_MODE_EXPONENTIAL;
- return &timer_data;
-}
+ netconfig_vconf_get_int(VCONFKEY_WIFI_UG_RUN_STATE, &ug_state);
-static guint __netconfig_wifi_bgscan_mode(gboolean is_set_mode, guint mode)
-{
- static guint bgscan_mode = WIFI_BGSCAN_MODE_EXPONENTIAL;
+ if (netconfig_wifi_bgscan_get_timer_id(interface_name) > 0)
+ netconfig_wifi_bgscan_stop_timer(interface_name);
- if (is_set_mode != TRUE)
- return bgscan_mode;
+ wifi_tech_state = wifi_state_get_technology_state(interface_name);
+ wifi_service_state = wifi_state_get_service_state(interface_name);
+ DBG("[%s] Wi-Fi tech state [%s] service state [%s]", interface_name,
+ _convert_wifi_technology_state_to_string(wifi_tech_state),
+ _convert_wifi_service_state_to_string(wifi_service_state));
- if (mode < WIFI_BGSCAN_MODE_MAX)
- bgscan_mode = mode;
+ if (wifi_tech_state < NETCONFIG_WIFI_TECH_POWERED)
+ return;
- DBG("Wi-Fi background scan mode set %d", bgscan_mode);
+ bg_mode = netconfig_wifi_bgscan_get_mode(interface_name);
- return bgscan_mode;
-}
+ if (wifi_service_state == NETCONFIG_WIFI_CONNECTED &&
+ (bg_mode == WIFI_BGSCAN_MODE_EXPONENTIAL ||
+ (bg_mode == WIFI_BGSCAN_MODE_PERIODIC &&
+ ug_state != VCONFKEY_WIFI_UG_RUN_STATE_ON_FOREGROUND)))
+ return;
-static void __netconfig_wifi_bgscan_set_mode(guint mode)
-{
- __netconfig_wifi_bgscan_mode(TRUE, mode);
-}
+ DBG("[%s] Wi-Fi background scan started or re-started(%d)",
+ interface_name, immediate_scan);
-static guint __netconfig_wifi_bgscan_get_mode(void)
-{
- return __netconfig_wifi_bgscan_mode(FALSE, -1);
+ netconfig_wifi_bgscan_start_timer(interface_name, immediate_scan);
}
-static gboolean __netconfig_wifi_bgscan_request_connman_scan(int retries)
+void netconfig_wifi_bgscan_stop(const char *interface_name)
{
- gboolean reply = FALSE;
- guint state = netconfig_wifi_state_get_service_state();
-
- if (state == NETCONFIG_WIFI_CONNECTED)
- if (__netconfig_wifi_bgscan_get_mode() == WIFI_BGSCAN_MODE_EXPONENTIAL)
- return TRUE;
-
- if (state == NETCONFIG_WIFI_ASSOCIATION ||state == NETCONFIG_WIFI_CONFIGURATION) {
- /* During Wi-Fi connecting, Wi-Fi can be disappeared.
- * After 1 sec, try scan even if connecting state */
- if (retries < 2)
- return FALSE;
- }
-
- netconfig_wifi_set_scanning(TRUE);
-
- reply = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
- CONNMAN_WIFI_TECHNOLOGY_PREFIX,
- CONNMAN_TECHNOLOGY_INTERFACE, "Scan", NULL, NULL);
- if (reply != TRUE)
- netconfig_wifi_set_scanning(FALSE);
-
- return reply;
+ netconfig_wifi_bgscan_stop_timer(interface_name);
}
-static gboolean __netconfig_wifi_bgscan_next_scan(gpointer data);
-
-static gboolean __netconfig_wifi_bgscan_immediate_scan(gpointer data)
+void netconfig_wifi_bgscan_restart(const gchar *interface_name)
{
- static int retries = 0;
-
-#if !defined TIZEN_WEARABLE
- if (netconfig_wifi_is_bgscan_paused())
- return FALSE;
-#endif
-
- if (__netconfig_wifi_bgscan_request_connman_scan(retries) == TRUE) {
- retries = 0;
- return FALSE;
- } else if (retries > 2) {
- retries = 0;
- return FALSE;
- }
-
- retries++;
+ int pm_state = VCONFKEY_PM_STATE_NORMAL;
- return TRUE;
+ /* In case of LCD off, we don't need Wi-Fi scan right now */
+ netconfig_vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
+ if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
+ netconfig_wifi_bgscan_start(interface_name, FALSE);
+ else
+ netconfig_wifi_bgscan_start(interface_name, TRUE);
}
-static void __netconfig_wifi_bgscan_start_timer(gboolean immediate_scan,
- struct bgscan_timer_data *data)
+gboolean handle_set_bgscan(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname, guint scan_mode)
{
- if (!data)
- return;
-
- netconfig_stop_timer(&(data->timer_id));
-
- data->mode = __netconfig_wifi_bgscan_get_mode();
-
- if (data->time < SCAN_EXPONENTIAL_MIN)
- data->time = SCAN_EXPONENTIAL_MIN;
-
- switch (data->mode) {
- case WIFI_BGSCAN_MODE_EXPONENTIAL:
- if (immediate_scan == TRUE) {
- if ((data->time * 2) > SCAN_EXPONENTIAL_MAX)
- data->time = SCAN_EXPONENTIAL_MAX;
- else
- data->time = data->time * 2;
- }
+ gint old_mode = 0;
- break;
- case WIFI_BGSCAN_MODE_PERIODIC:
- if ((data->time * 2) > SCAN_PERIODIC_DELAY)
- data->time = SCAN_PERIODIC_DELAY;
- else
- data->time = data->time * 2;
+ old_mode = netconfig_wifi_bgscan_get_mode(ifname);
+ if (old_mode == scan_mode) {
+ wifi_complete_set_bgscan(wifi, context);
+ return TRUE;
+ }
- break;
- default:
- DBG("Invalid Wi-Fi background scan mode[%d]", data->mode);
- return;
+ if (netconfig_wifi_bgscan_set_mode(ifname, scan_mode) != TRUE) {
+ ERR("Invalid mode [%d]", scan_mode);
+ netconfig_error_invalid_parameter(context);
+ return TRUE;
}
- if (immediate_scan == TRUE)
- g_timeout_add(500, __netconfig_wifi_bgscan_immediate_scan, NULL);
+ INFO("[%s] Wi-Fi scan mode is changed [%d]", ifname, scan_mode);
- DBG("Scan immediately[%d], mode[%d], next[%d]",
- immediate_scan, data->mode, data->time);
+ netconfig_wifi_bgscan_restart(ifname);
- netconfig_start_timer_seconds(data->time,
- __netconfig_wifi_bgscan_next_scan, data, &(data->timer_id));
+ wifi_complete_set_bgscan(wifi, context);
+ return TRUE;
}
-static void __netconfig_wifi_bgscan_stop_timer(struct bgscan_timer_data *data)
+gboolean handle_set_bgscan_interval(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname, const gchar *mode, guint interval)
{
- if (data == NULL)
- return;
+ guint old_interval = 0;
+ gboolean rv = FALSE;
- netconfig_stop_timer(&(data->timer_id));
-}
+ if (g_strcmp0(mode, "Periodic") == 0) {
+ old_interval = netconfig_wifi_bgscan_get_periodic_interval(ifname);
+ } else if (g_strcmp0(mode, "Exponential") == 0) {
+ old_interval = netconfig_wifi_bgscan_get_exp_interval(ifname);
+ } else {
+ ERR("invalid mode %s", mode);
+ netconfig_error_invalid_parameter(context);
+ return TRUE;
+ }
-static gboolean __netconfig_wifi_bgscan_next_scan(gpointer data)
-{
- struct bgscan_timer_data *timer = (struct bgscan_timer_data *)data;
- int pm_state = VCONFKEY_PM_STATE_NORMAL;
+ if (old_interval == interval) {
+ wifi_complete_set_bgscan_interval(wifi, context);
+ return TRUE;
+ }
- if (timer == NULL)
- return FALSE;
+ if (g_strcmp0(mode, "Periodic") == 0)
+ rv = netconfig_wifi_bgscan_set_periodic_interval(ifname, interval);
+ else
+ rv = netconfig_wifi_bgscan_set_exp_interval(ifname, interval);
- /* In case of LCD off, we don't need Wi-Fi scan */
- vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
- if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
+ if (!rv) {
+ netconfig_error_invalid_parameter(context);
return TRUE;
+ }
- __netconfig_wifi_bgscan_start_timer(TRUE, timer);
-
- return FALSE;
-}
+ INFO("[%s] Wi-Fi periodic scan interval is changed to [%d] from [%d]",
+ ifname, interval, old_interval);
-void netconfig_wifi_set_bgscan_pause(gboolean pause)
-{
- DBG("[%s] Wi-Fi background scan", pause ? "Pause" : "Resume");
- netconfig_bgscan_paused = pause;
-}
+ netconfig_wifi_bgscan_restart(ifname);
-gboolean netconfig_wifi_is_bgscan_paused(void)
-{
- DBG("Wi-Fi background scan is [%s]", netconfig_bgscan_paused ? "Paused" : "Runnable");
- return netconfig_bgscan_paused;
+ wifi_complete_set_bgscan_interval(wifi, context);
+ return TRUE;
}
-void netconfig_wifi_bgscan_start(gboolean immediate_scan)
+gboolean handle_get_bgscan_interval(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname, const gchar *mode)
{
- enum netconfig_wifi_tech_state wifi_tech_state;
- struct bgscan_timer_data *timer_data =
- __netconfig_wifi_bgscan_get_bgscan_data();
-
- if (timer_data == NULL)
- return;
-
- wifi_tech_state = netconfig_wifi_state_get_technology_state();
- if (wifi_tech_state < NETCONFIG_WIFI_TECH_POWERED)
- return;
+ guint bgscan_interval = 0;
- DBG("Wi-Fi background scan started or re-started(%d)", immediate_scan);
+ if (g_strcmp0(mode, "Periodic") == 0) {
+ bgscan_interval = netconfig_wifi_bgscan_get_periodic_interval(ifname);
+ } else if (g_strcmp0(mode, "Exponential") == 0) {
+ bgscan_interval = netconfig_wifi_bgscan_get_exp_interval(ifname);
+ } else {
+ ERR("invalid mode %s", mode);
+ netconfig_error_invalid_parameter(context);
+ return TRUE;
+ }
- __netconfig_wifi_bgscan_start_timer(immediate_scan, timer_data);
+ wifi_complete_get_bgscan_interval(wifi, context, bgscan_interval);
+ return TRUE;
}
-void netconfig_wifi_bgscan_stop(void)
+gboolean handle_resume_bgscan(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname)
{
- struct bgscan_timer_data *timer_data =
- __netconfig_wifi_bgscan_get_bgscan_data();
+ netconfig_wifi_bgscan_set_pause(ifname, FALSE);
- if (timer_data == NULL)
- return;
-
- DBG("Wi-Fi background scan stop");
-
- timer_data->time = SCAN_EXPONENTIAL_MIN;
-
- __netconfig_wifi_bgscan_stop_timer(timer_data);
+ wifi_complete_resume_bgscan(wifi, context);
+ return TRUE;
}
-gboolean netconfig_wifi_get_bgscan_state(void)
+gboolean handle_pause_bgscan(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname)
{
- struct bgscan_timer_data *timer_data =
- __netconfig_wifi_bgscan_get_bgscan_data();
+ netconfig_wifi_bgscan_set_pause(ifname, TRUE);
- return ((timer_data->timer_id > (guint)0) ? TRUE : FALSE);
+ wifi_complete_pause_bgscan(wifi, context);
+ return TRUE;
}
-gboolean netconfig_wifi_get_scanning(void)
+gboolean handle_reset_bgscan_interval(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname)
{
- return netconfig_wifi_scanning;
-}
+ netconfig_wifi_bgscan_set_exp_interval(ifname, SCAN_EXPONENTIAL_MIN);
-void netconfig_wifi_set_scanning(gboolean scanning)
-{
- if (netconfig_wifi_scanning != scanning)
- netconfig_wifi_scanning = scanning;
+ wifi_complete_reset_bgscan_interval(wifi, context);
+ return TRUE;
}
-gboolean handle_set_bgscan(Wifi *wifi, GDBusMethodInvocation *context,
- guint scan_mode)
+gboolean handle_get_autoscan(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname)
{
- gint old_mode = 0;
- int pm_state = VCONFKEY_PM_STATE_NORMAL;
-
- old_mode = __netconfig_wifi_bgscan_get_mode();
- if (old_mode == scan_mode){
- wifi_complete_set_bgscan(wifi, context);
- return TRUE;
- }
- __netconfig_wifi_bgscan_set_mode(scan_mode);
+ gboolean autoscan = 0;
- netconfig_wifi_bgscan_stop();
+ autoscan = netconfig_wifi_bgscan_is_paused(ifname);
- /* In case of LCD off, we don't need Wi-Fi scan right now */
- vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
- if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
- netconfig_wifi_bgscan_start(FALSE);
- else
- netconfig_wifi_bgscan_start(TRUE);
-
- wifi_complete_set_bgscan(wifi, context);
+ wifi_complete_get_autoscan(wifi, context, autoscan);
return TRUE;
}
-gboolean handle_resume_bgscan(Wifi *wifi, GDBusMethodInvocation *context)
+gboolean handle_get_autoscanmode(Wifi *wifi, GDBusMethodInvocation *context,
+ const gchar *ifname)
{
- netconfig_wifi_set_bgscan_pause(FALSE);
+ guint autoscanmode = 0;
- wifi_complete_resume_bgscan (wifi, context);
- return TRUE;
-}
+ autoscanmode = netconfig_wifi_bgscan_get_mode(ifname);
-gboolean handle_pause_bgscan(Wifi *wifi, GDBusMethodInvocation *context)
-{
- netconfig_wifi_set_bgscan_pause(TRUE);
-
- wifi_complete_pause_bgscan(wifi, context);
+ wifi_complete_get_autoscanmode(wifi, context, autoscanmode);
return TRUE;
}