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;
156 int hotspot_wifi_state = VCONFKEY_MOBILE_HOTSPOT_WIFI_OFF;
161 /* If Wi-Fi tethering is pending on, don't trigger scan event*/
162 vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_WIFI_STATE, &hotspot_wifi_state);
163 if (hotspot_wifi_state == VCONFKEY_MOBILE_HOTSPOT_WIFI_PENDING_ON) {
164 DBG("hotspot_wifi_state %d", hotspot_wifi_state);
168 /* In case of LCD off, we don't need Wi-Fi scan */
169 vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
170 if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
173 __netconfig_wifi_bgscan_stop_timer(timer);
175 DBG("Request Wi-Fi scan to ConnMan");
176 __netconfig_wifi_bgscan_request_connman_scan();
178 __netconfig_wifi_bgscan_start_timer(timer);
183 static void __netconfig_wifi_bgscan_mode_cb(keynode_t* node, void* user_data)
188 if (vconf_get_int(VCONFKEY_WIFI_BGSCAN_MODE, &value) < 0) {
189 ERR("VCONFKEY_WIFI_BGSCAN_MODE get failed");
193 DBG("Background scanning mode is changed : %d", value);
195 __netconfig_wifi_bgscan_set_mode((guint)value);
197 if (vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
198 ERR("VCONFKEY_WIFI_STATE get failed");
202 if (wifi_state == VCONFKEY_WIFI_OFF)
205 struct bgscan_timer_data *timer_data = __netconfig_wifi_bgscan_get_bgscan_data();
207 if (timer_data->timer_id != 0)
208 netconfig_wifi_bgscan_stop();
210 netconfig_wifi_bgscan_start();
213 void netconfig_wifi_bgscan_start(void)
215 struct bgscan_timer_data *timer_data =
216 __netconfig_wifi_bgscan_get_bgscan_data();
218 if (timer_data == NULL)
221 DBG("Wi-Fi background scan start");
223 __netconfig_wifi_bgscan_start_timer(timer_data);
226 void netconfig_wifi_bgscan_stop(void)
228 struct bgscan_timer_data *timer_data =
229 __netconfig_wifi_bgscan_get_bgscan_data();
231 if (timer_data == NULL)
234 DBG("Wi-Fi background scan stop");
236 timer_data->time = SCAN_EXPONENTIAL_MIN;
238 __netconfig_wifi_bgscan_stop_timer(timer_data);
241 gboolean netconfig_wifi_get_bgscan_state(void)
243 struct bgscan_timer_data *timer_data =
244 __netconfig_wifi_bgscan_get_bgscan_data();
246 return ((timer_data->timer_id > (guint)0) ? TRUE : FALSE);
249 gboolean netconfig_wifi_get_scanning(void)
251 return netconfig_wifi_scanning;
254 void netconfig_wifi_set_scanning(gboolean scanning)
256 if (netconfig_wifi_scanning != scanning)
257 netconfig_wifi_scanning = scanning;
260 gboolean netconfig_iface_wifi_set_bgscan(NetconfigWifi *wifi, guint scan_mode, GError **error)
262 struct bgscan_timer_data *timer_data = __netconfig_wifi_bgscan_get_bgscan_data();
264 __netconfig_wifi_bgscan_set_mode(scan_mode);
266 if (timer_data->timer_id != 0)
267 netconfig_wifi_bgscan_stop();
269 netconfig_wifi_bgscan_start();
274 void netconfig_wifi_init_bgscan()
276 guint scan_mode = __netconfig_wifi_bgscan_get_mode();
278 if (scan_mode == WIFI_BGSCAN_MODE_PERIODIC)
279 vconf_set_int(VCONFKEY_WIFI_BGSCAN_MODE, VCONFKEY_WIFI_BGSCAN_MODE_PERIODIC);
281 vconf_set_int(VCONFKEY_WIFI_BGSCAN_MODE, VCONFKEY_WIFI_BGSCAN_MODE_EXPONENTIAL);
283 if (vconf_notify_key_changed(VCONFKEY_WIFI_BGSCAN_MODE,
284 __netconfig_wifi_bgscan_mode_cb, NULL))
285 DBG("Failed to set notify callback");
288 void netconfig_wifi_deinit_bgscan()
290 if (vconf_ignore_key_changed(VCONFKEY_WIFI_BGSCAN_MODE,
291 __netconfig_wifi_bgscan_mode_cb))
292 DBG("Failed to unset notify callback");