2 * Network Configuration Module
4 * Copyright (c) 2000 - 2012 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.
24 #include <sys/ioctl.h>
25 #include <netinet/in.h>
26 #include <netinet/ip.h>
27 #include <linux/wireless.h>
29 #include <vconf-keys.h>
34 #include "wifi-state.h"
35 #include "network-state.h"
36 #include "network-statistics.h"
37 #include "netsupplicant.h"
38 #include "wifi-indicator.h"
40 #define VCONFKEY_WIFI_SNR_MIN -89
42 #if !defined TIZEN_WEARABLE
43 #define WIFI_INDICATOR_INTERVAL 1
45 #define WIFI_INDICATOR_INTERVAL 10
48 #if defined TIZEN_WEARABLE
49 #define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1 (19200 * 1024)
50 #define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2 (2560 * 1024)
51 #define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3 (1536 * 1024)
53 #define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1 (19200 * 1024)
54 #define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2 (7680 * 1024)
55 #define NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3 (3840 * 1024)
57 #define NETCONFIG_PROCWIRELESS "/proc/net/wireless"
59 static int netconfig_wifi_rssi = VCONFKEY_WIFI_SNR_MIN;
60 static guint netconfig_wifi_indicator_timer = 0;
62 int netconfig_wifi_get_rssi(void)
64 return netconfig_wifi_rssi;
67 static int __netconfig_wifi_update_and_get_rssi(void)
70 GVariant *message = NULL;
71 GVariant *value = NULL;
76 int rssi_dbm = VCONFKEY_WIFI_SNR_MIN;
78 if_path = netconfig_wifi_get_supplicant_interface();
79 if (if_path == NULL) {
80 ERR("Fail to get wpa_supplicant DBus path");
84 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE, if_path,
85 SUPPLICANT_INTERFACE ".Interface", "SignalPoll", NULL);
88 if (message == NULL) {
89 ERR("Fail to get SignalPoll from wpa_supplicant");
93 g_variant_get(message, "(v)", &value);
95 g_variant_get(value, "a{sv}", &iter);
97 ERR("Fail to get list from SignalPoll");
101 while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
102 key_value = g_variant_get_int32(variant);
104 if (g_strcmp0(key, "rssi") == 0) {
105 rssi_dbm = (int)key_value;
106 DBG("Currently signal dbm value [%d]", rssi_dbm);
107 g_variant_unref(variant);
113 g_variant_iter_free(iter);
116 g_variant_unref(value);
118 netconfig_wifi_rssi = rssi_dbm;
123 int netconfig_wifi_rssi_level(const int rssi_dbm)
127 /* Wi-Fi Signal Strength Display
136 else if (rssi_dbm >= -74)
138 else if (rssi_dbm >= -82)
146 static void __netconfig_wifi_set_rssi_level(const int snr_level)
148 static int last_snr_level = 0;
150 if (snr_level != last_snr_level) {
151 netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, snr_level);
152 last_snr_level = snr_level;
156 static void __netconfig_wifi_data_activity_booster(int level)
158 gboolean reply = FALSE;
159 GVariant *params = NULL;
167 static int old_level = 0;
176 params = g_variant_new("(ii)", level1, lock);
179 params = g_variant_new("(ii)", level2, lock);
182 params = g_variant_new("(ii)", level3, lock);
185 ERR("Invalid level");
189 reply = netconfig_invoke_dbus_method_nonblock(
190 "org.tizen.system.deviced",
191 "/Org/Tizen/System/DeviceD/PmQos",
192 "org.tizen.system.deviced.PmQos",
200 /* disable previous booster */
201 if (old_level == 0 || old_level == level)
206 params = g_variant_new("(ii)", level1, unlock);
209 params = g_variant_new("(ii)", level2, unlock);
212 params = g_variant_new("(ii)", level3, unlock);
215 ERR("Invalid level");
219 reply = netconfig_invoke_dbus_method_nonblock(
220 "org.tizen.system.deviced",
221 "/Org/Tizen/System/DeviceD/PmQos",
222 "org.tizen.system.deviced.PmQos",
232 static void __netconfig_wifi_update_indicator(void)
234 static int last_transfer_state = 0;
235 static guint64 netconfig_wifi_tx_bytes = 0;
236 static guint64 netconfig_wifi_rx_bytes = 0;
237 static int booster_tic = 0;
238 static int old_level = 0;
239 int booster_level = 0;
240 guint64 tx, rx, tx_diff, rx_diff;
243 if (netconfig_wifi_get_bytes_statistics(&tx, &rx) == TRUE) {
244 tx_diff = tx - netconfig_wifi_tx_bytes;
245 rx_diff = rx - netconfig_wifi_rx_bytes;
249 transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_TXRX;
251 transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_TX;
254 transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_RX;
256 transfer_state = VCONFKEY_WIFI_TRANSFER_STATE_NONE;
259 if (transfer_state != last_transfer_state) {
260 netconfig_set_vconf_int(VCONFKEY_WIFI_TRANSFER_STATE, transfer_state);
261 last_transfer_state = transfer_state;
264 /* NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER */
265 if (tx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1 ||
266 rx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL1)
268 else if (tx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2 ||
269 rx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL2)
271 else if (tx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3 ||
272 rx_diff >= NETCONFIG_WIFI_DATA_ACTIVITY_BOOSTER_LEVEL3)
275 if (old_level == booster_level) {
276 if (--booster_tic <= 0) {
277 __netconfig_wifi_data_activity_booster(booster_level);
282 __netconfig_wifi_data_activity_booster(booster_level);
284 if (booster_level > 0)
290 old_level = booster_level;
292 netconfig_wifi_tx_bytes = tx;
293 netconfig_wifi_rx_bytes = rx;
297 static gboolean __wifi_indicator_monitor(gpointer data)
301 int pm_state = VCONFKEY_PM_STATE_NORMAL;
303 if (wifi_state_get_service_state() != NETCONFIG_WIFI_CONNECTED)
306 /* In case of LCD off, we don't need to update Wi-Fi indicator */
307 netconfig_vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
308 if (pm_state >= VCONFKEY_PM_STATE_LCDOFF)
311 rssi_dbm = __netconfig_wifi_update_and_get_rssi();
312 /* INFO("%d dbm", rssi_dbm); */
313 snr_level = netconfig_wifi_rssi_level(rssi_dbm);
314 __netconfig_wifi_set_rssi_level(snr_level);
316 __netconfig_wifi_update_indicator();
321 void netconfig_wifi_indicator_start(void)
323 INFO("Start Wi-Fi indicator");
325 netconfig_set_vconf_int(VCONFKEY_WIFI_STRENGTH, VCONFKEY_WIFI_STRENGTH_MAX);
326 netconfig_start_timer_seconds(WIFI_INDICATOR_INTERVAL, __wifi_indicator_monitor, NULL, &netconfig_wifi_indicator_timer);
329 void netconfig_wifi_indicator_stop(void)
331 INFO("Stop Wi-Fi indicator");
333 netconfig_stop_timer(&netconfig_wifi_indicator_timer);
335 netconfig_wifi_rssi = VCONFKEY_WIFI_SNR_MIN;