2 * Network Configuration Module
4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Danny JS Seo <S.Seo@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
25 #include <vconf-keys.h>
26 #include <wifi-direct.h>
33 #include "netconfig.h"
35 #include "wifi-state.h"
36 #include "wifi-background-scan.h"
38 gboolean netconfig_iface_wifi_load_driver(NetconfigWifi *wifi, GError **error);
39 gboolean netconfig_iface_wifi_remove_driver(NetconfigWifi *wifi, GError **error);
41 #include "netconfig-iface-wifi-glue.h"
43 #define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
45 #define WLAN_DRIVER_SCRIPT "/usr/bin/wlan.sh"
47 #define PROP_DEFAULT FALSE
48 #define PROP_DEFAULT_STR NULL
61 struct NetconfigWifiClass {
64 /* method and signals */
65 void (*driver_loaded) (NetconfigWifi *wifi, gchar *mac);
68 struct NetconfigWifi {
72 DBusGConnection *conn;
76 static guint32 signals[SIG_LAST] = { 0, };
78 G_DEFINE_TYPE(NetconfigWifi, netconfig_wifi, G_TYPE_OBJECT);
81 static void __netconfig_wifi_gobject_get_property(GObject *object, guint prop_id,
82 GValue *value, GParamSpec *pspec)
87 static void __netconfig_wifi_gobject_set_property(GObject *object, guint prop_id,
88 const GValue *value, GParamSpec *pspec)
90 NetconfigWifi *wifi = NETCONFIG_WIFI(object);
95 wifi->conn = g_value_get_boxed(value);
96 INFO("wifi(%p) set conn(%p)", wifi, wifi->conn);
105 wifi->path = g_value_dup_string(value);
106 INFO("wifi(%p) path(%s)", wifi, wifi->path);
112 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
116 static void netconfig_wifi_init(NetconfigWifi *wifi)
118 DBG("wifi initialize");
121 wifi->path = g_strdup(PROP_DEFAULT_STR);
124 static void netconfig_wifi_class_init(NetconfigWifiClass *klass)
126 GObjectClass *object_class = G_OBJECT_CLASS(klass);
128 DBG("class initialize");
130 object_class->get_property = __netconfig_wifi_gobject_get_property;
131 object_class->set_property = __netconfig_wifi_gobject_set_property;
134 dbus_g_object_type_install_info(NETCONFIG_TYPE_WIFI,
135 &dbus_glib_netconfig_iface_wifi_object_info);
138 g_object_class_install_property(object_class, PROP_WIFI_CONN,
139 g_param_spec_boxed("conn", "CONNECTION", "DBus connection",
140 DBUS_TYPE_G_CONNECTION,
141 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
143 g_object_class_install_property(object_class, PROP_WIFI_PATH,
144 g_param_spec_string("path", "PATH", "Object Path",
146 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
149 signals[SIG_WIFI_DRIVER] = g_signal_new("driver-loaded",
150 G_OBJECT_CLASS_TYPE(klass),
152 G_STRUCT_OFFSET(NetconfigWifiClass,
155 g_cclosure_marshal_VOID__STRING,
156 G_TYPE_NONE, 1, G_TYPE_STRING);
160 static gboolean __netconfig_wifi_enable_technology(void)
162 DBusMessage *reply = NULL;
163 char path[DBUS_PATH_MAX_BUFLEN] = "/";
164 char request[] = CONNMAN_MANAGER_INTERFACE ".EnableTechnology";
165 char param1[] = "string:wifi";
166 char *param_array[] = {
173 param_array[0] = path;
174 param_array[1] = request;
175 param_array[2] = param1;
177 reply = netconfig_dbus_send_request(CONNMAN_SERVICE, param_array);
179 ERR("Error! Request failed");
184 dbus_message_unref(reply);
189 static gboolean __netconfig_wifi_disable_technology(void)
191 DBusMessage *reply = NULL;
192 char path[DBUS_PATH_MAX_BUFLEN] = "/";
193 char request[] = CONNMAN_MANAGER_INTERFACE ".DisableTechnology";
194 char param1[] = "string:wifi";
195 char *param_array[] = {
202 param_array[0] = path;
203 param_array[1] = request;
204 param_array[2] = param1;
206 reply = netconfig_dbus_send_request(CONNMAN_SERVICE, param_array);
208 ERR("Error! Request failed");
213 dbus_message_unref(reply);
218 static gboolean __netconfig_wifi_load_driver(void)
221 const char *path = WLAN_DRIVER_SCRIPT;
222 char *const args[] = { "wlan.sh", "start" };
223 char *const envs[] = { NULL };
225 if (netconfig_emulator_is_emulated() == TRUE)
228 rv = netconfig_execute_file(path, args, envs);
230 DBG("failed to load wireless device driver");
234 DBG("Successfully loaded wireless device drivers");
238 static gboolean __netconfig_wifi_remove_driver(void)
241 const char *path = WLAN_DRIVER_SCRIPT;
242 char *const args[] = { "wlan.sh", "stop" };
243 char *const env[] = { NULL };
245 if (netconfig_emulator_is_emulated() == TRUE)
248 rv = netconfig_execute_file(path, args, env);
250 DBG("failed to remove(unload) driver for wireless device");
254 DBG("Successfully removed(unloaded) wireless driver");
258 static gboolean __netconfig_wifi_try_to_load_driver(void);
259 static gboolean __netconfig_wifi_try_to_remove_driver(void);
261 static void __netconfig_wifi_direct_state_cb(int error_code,
262 wifi_direct_device_state_e device_state, void *user_data)
264 wifi_direct_unset_device_state_changed_cb();
265 wifi_direct_deinitialize();
267 if (device_state == WIFI_DIRECT_DEVICE_STATE_DEACTIVATED) {
268 __netconfig_wifi_try_to_load_driver();
273 /* TODO: error report */
276 static gboolean __netconfig_wifi_direct_power_off(void)
278 DBG("Wi-Fi direct is turning off");
280 if (wifi_direct_initialize() < 0)
283 if (wifi_direct_set_device_state_changed_cb(
284 __netconfig_wifi_direct_state_cb, NULL) < 0)
287 if (wifi_direct_deactivate() < 0)
293 static gboolean __netconfig_wifi_try_to_load_driver(void)
296 gchar *wifi_tech_state = NULL;
298 if (netconfig_is_wifi_tethering_on() == TRUE) {
299 /* TODO: Wi-Fi tethering turns off here */
304 if (netconfig_is_wifi_direct_on() == TRUE) {
305 if (__netconfig_wifi_direct_power_off() == TRUE)
311 if (__netconfig_wifi_load_driver() != TRUE) {
312 __netconfig_wifi_remove_driver();
317 for (count = 0; count < 3; count++) {
318 __netconfig_wifi_enable_technology();
320 wifi_tech_state = netconfig_wifi_get_technology_state();
321 INFO("Wi-Fi technology state: %s", wifi_tech_state);
323 if (g_str_equal(wifi_tech_state, "EnabledTechnologies") == TRUE) {
324 netconfig_wifi_update_power_state(TRUE);
326 netconfig_wifi_device_picker_service_start();
331 g_free(wifi_tech_state);
333 wifi_tech_state = NULL;
336 __netconfig_wifi_try_to_remove_driver();
341 static gboolean __netconfig_wifi_try_to_remove_driver(void)
344 gchar *wifi_tech_state = NULL;
346 netconfig_wifi_device_picker_service_stop();
348 for (count = 0; count < 3; count++) {
349 __netconfig_wifi_disable_technology();
351 wifi_tech_state = netconfig_wifi_get_technology_state();
352 INFO("Wi-Fi technology state: %s", wifi_tech_state);
354 if (g_str_equal(wifi_tech_state, "EnabledTechnologies") != TRUE) {
355 netconfig_wifi_update_power_state(FALSE);
357 return __netconfig_wifi_remove_driver();
360 g_free(wifi_tech_state);
362 wifi_tech_state = NULL;
365 return __netconfig_wifi_remove_driver();
368 static void __netconfig_wifi_airplane_mode(keynode_t* node,
373 static gboolean powered_off_by_flightmode = FALSE;
375 vconf_get_bool(VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL, &value);
376 vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
378 DBG("flight mode %s", value > 0 ? "ON" : "OFF");
379 DBG("Wi-Fi state %d, Wi-Fi was off by flight mode %s",
380 wifi_state, powered_off_by_flightmode == TRUE ? "Yes" : "No");
383 /* flight mode enabled */
384 if (wifi_state == VCONFKEY_WIFI_OFF)
387 DBG("Turning Wi-Fi off");
389 __netconfig_wifi_try_to_remove_driver();
391 powered_off_by_flightmode = TRUE;
392 } else if (value == 0) {
393 /* flight mode disabled */
394 if (wifi_state > VCONFKEY_WIFI_OFF)
397 if (powered_off_by_flightmode != TRUE)
400 __netconfig_wifi_try_to_load_driver();
402 powered_off_by_flightmode = FALSE;
404 DBG("Invalid value (%d)", value);
407 static void __netconfig_wifi_pm_state_mode(keynode_t* node,
412 static int prev_state = VCONFKEY_PM_STATE_NORMAL;
414 /*** vconf-keys.h ***
415 * VCONFKEY_PM_STATE_NORMAL = 1,
416 * VCONFKEY_PM_STATE_LCDDIM,
417 * VCONFKEY_PM_STATE_LCDOFF,
418 * VCONFKEY_PM_STATE_SLEEP
421 if(vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) == 0) {
422 DBG("wifi state : %d (0 off / 1 on / 2 connected)", wifi_state);
423 if(wifi_state <= VCONFKEY_WIFI_OFF)
427 if(vconf_get_int(VCONFKEY_PM_STATE, &value) < 0) {
428 ERR("VCONFKEY_PM_STATE get failed");
432 DBG("Old state: %d, current: %d", prev_state, value);
434 if((value == VCONFKEY_PM_STATE_NORMAL) && (prev_state >= VCONFKEY_PM_STATE_LCDOFF)) {
435 DBG("PM state : Wake UP!");
437 netconfig_wifi_bgscan_stop();
438 netconfig_wifi_bgscan_start();
444 static void __netconfig_wifi_power_configuration(void)
446 int wifi_last_state = 0;
448 vconf_notify_key_changed(VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL,
449 __netconfig_wifi_airplane_mode, NULL);
451 vconf_notify_key_changed(VCONFKEY_PM_STATE,
452 __netconfig_wifi_pm_state_mode, NULL);
454 vconf_get_int(VCONF_WIFI_LAST_POWER_ON_STATE, &wifi_last_state);
456 if (wifi_last_state == WIFI_POWER_ON) {
457 DBG("Turn Wi-Fi on automatically");
459 __netconfig_wifi_try_to_load_driver();
463 gpointer netconfig_wifi_create_and_init(DBusGConnection *conn)
467 g_return_val_if_fail(conn != NULL, NULL);
469 object = g_object_new(NETCONFIG_TYPE_WIFI, "conn", conn, "path",
470 NETCONFIG_WIFI_PATH, NULL);
472 INFO("create wifi(%p)", object);
474 dbus_g_connection_register_g_object(conn, NETCONFIG_WIFI_PATH, object);
476 INFO("wifi(%p) register DBus path(%s)", object, NETCONFIG_WIFI_PATH);
478 __netconfig_wifi_power_configuration();
483 gboolean netconfig_iface_wifi_load_driver(NetconfigWifi *wifi, GError **error)
485 DBG("Wi-Fi turned on");
487 g_return_val_if_fail(wifi != NULL, FALSE);
489 if (__netconfig_wifi_try_to_load_driver() != TRUE) {
490 netconfig_error_wifi_driver_failed(error);
498 gboolean netconfig_iface_wifi_remove_driver(NetconfigWifi *wifi, GError **error)
500 DBG("Wi-Fi turned off");
502 g_return_val_if_fail(wifi != NULL, FALSE);
504 if (__netconfig_wifi_try_to_remove_driver() != TRUE) {
505 netconfig_error_wifi_driver_failed(error);