2 * Network Configuration Module
4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 #include <vconf-keys.h>
28 #include "wifi-state.h"
29 #include "wifi-background-scan.h"
31 #define SCAN_PERIODIC_DELAY 10
32 #define SCAN_EXPONENTIAL_MIN 4
33 #define SCAN_EXPONENTIAL_MAX 128
36 WIFI_BGSCAN_MODE_EXPONENTIAL = 0x00,
37 WIFI_BGSCAN_MODE_PERIODIC,
41 struct bgscan_timer_data {
47 static gboolean netconfig_wifi_scanning = FALSE;
49 static struct bgscan_timer_data *__netconfig_wifi_bgscan_get_bgscan_data(void)
51 static struct bgscan_timer_data timer_data = {SCAN_EXPONENTIAL_MIN, WIFI_BGSCAN_MODE_EXPONENTIAL, 0};
56 static guint __netconfig_wifi_bgscan_mode(gboolean is_set_mode, guint mode)
58 static guint bgscan_mode = WIFI_BGSCAN_MODE_EXPONENTIAL;
60 if (is_set_mode != TRUE)
63 if (mode < WIFI_BGSCAN_MODE_MAX)
66 DBG("Wi-Fi background scan mode set %d", bgscan_mode);
71 static void __netconfig_wifi_bgscan_set_mode(guint mode)
73 __netconfig_wifi_bgscan_mode(TRUE, mode);
76 static guint __netconfig_wifi_bgscan_get_mode(void)
78 return __netconfig_wifi_bgscan_mode(FALSE, -1);
81 static gboolean __netconfig_wifi_bgscan_request_connman_scan(void)
83 DBusMessage *reply = NULL;
85 if (netconfig_wifi_state_get_service_state() == NETCONFIG_WIFI_CONNECTED)
86 if (__netconfig_wifi_bgscan_get_mode() == WIFI_BGSCAN_MODE_EXPONENTIAL)
89 if (netconfig_wifi_state_get_service_state() == NETCONFIG_WIFI_CONNECTING)
92 netconfig_wifi_set_scanning(TRUE);
94 reply = netconfig_invoke_dbus_method(CONNMAN_SERVICE, CONNMAN_WIFI_TECHNOLOGY_PREFIX,
95 CONNMAN_TECHNOLOGY_INTERFACE, "Scan", NULL);
98 ERR("Error! Request failed");
102 dbus_message_unref(reply);
107 static gboolean __netconfig_wifi_bgscan_request_scan(gpointer data);
109 static void __netconfig_wifi_bgscan_start_timer(struct bgscan_timer_data *data)
114 netconfig_stop_timer(&(data->timer_id));
116 data->mode = __netconfig_wifi_bgscan_get_mode();
118 switch (data->mode) {
119 case WIFI_BGSCAN_MODE_EXPONENTIAL:
121 data->time = SCAN_EXPONENTIAL_MIN;
122 else if ((data->time >= SCAN_EXPONENTIAL_MAX) ||
123 (data->time > SCAN_EXPONENTIAL_MAX / 2))
124 data->time = SCAN_EXPONENTIAL_MAX;
126 data->time = data->time * 2;
129 case WIFI_BGSCAN_MODE_PERIODIC:
130 data->time = SCAN_PERIODIC_DELAY;
134 DBG("Error! Wi-Fi background scan mode [%d]", data->mode);
138 DBG("Register background scan timer with %d seconds", data->time);
140 netconfig_start_timer_seconds(data->time,
141 __netconfig_wifi_bgscan_request_scan, data, &(data->timer_id));
144 static void __netconfig_wifi_bgscan_stop_timer(struct bgscan_timer_data *data)
149 netconfig_stop_timer(&(data->timer_id));
152 static gboolean __netconfig_wifi_bgscan_request_scan(gpointer data)
154 struct bgscan_timer_data *timer = (struct bgscan_timer_data *)data;
155 int pm_state = VCONFKEY_PM_STATE_NORMAL;
160 /* In case of LCD off, we don't need Wi-Fi scan */
161 vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
162 if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
165 __netconfig_wifi_bgscan_stop_timer(timer);
167 DBG("Request Wi-Fi scan to ConnMan");
168 __netconfig_wifi_bgscan_request_connman_scan();
170 __netconfig_wifi_bgscan_start_timer(timer);
175 void netconfig_wifi_bgscan_start(void)
177 struct bgscan_timer_data *timer_data =
178 __netconfig_wifi_bgscan_get_bgscan_data();
180 if (timer_data == NULL)
183 DBG("Wi-Fi background scan start");
185 __netconfig_wifi_bgscan_start_timer(timer_data);
188 void netconfig_wifi_bgscan_stop(void)
190 struct bgscan_timer_data *timer_data =
191 __netconfig_wifi_bgscan_get_bgscan_data();
193 if (timer_data == NULL)
196 DBG("Wi-Fi background scan stop");
198 timer_data->time = SCAN_EXPONENTIAL_MIN;
200 __netconfig_wifi_bgscan_stop_timer(timer_data);
203 gboolean netconfig_wifi_get_bgscan_state(void)
205 struct bgscan_timer_data *timer_data =
206 __netconfig_wifi_bgscan_get_bgscan_data();
208 return ((timer_data->timer_id > (guint)0) ? TRUE : FALSE);
211 gboolean netconfig_wifi_get_scanning(void)
213 return netconfig_wifi_scanning;
216 void netconfig_wifi_set_scanning(gboolean scanning)
218 if (netconfig_wifi_scanning != scanning)
219 netconfig_wifi_scanning = scanning;
222 gboolean netconfig_iface_wifi_set_bgscan(NetconfigWifi *wifi, guint scan_mode, GError **error)
224 struct bgscan_timer_data *timer_data = __netconfig_wifi_bgscan_get_bgscan_data();
226 __netconfig_wifi_bgscan_set_mode(scan_mode);
228 if (timer_data->timer_id != 0)
229 netconfig_wifi_bgscan_stop();
231 netconfig_wifi_bgscan_start();