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.
22 #include <vconf-keys.h>
24 #include <TapiUtility.h>
26 #include <tzplatform_config.h>
28 #if defined TIZEN_P2P_ENABLE && !defined WLAN_CONCURRENT_MODE
29 #include <wifi-direct.h>
37 #include "wifi-power.h"
38 #include "wifi-state.h"
39 #include "wifi-tel-intf.h"
40 #include "netsupplicant.h"
41 #include "network-state.h"
42 #include "network-dpm.h"
43 #include "wifi-firmware.h"
44 #include "wifi-background-scan.h"
47 #define WLAN_SUPPLICANT_SCRIPT "/usr/sbin/wpa_supp.sh"
48 #define P2P_SUPPLICANT_SCRIPT "/usr/sbin/p2p_supp.sh"
50 #define VCONF_WIFI_OFF_STATE_BY_AIRPLANE "file/private/wifi/wifi_off_by_airplane"
51 #define VCONF_WIFI_OFF_STATE_BY_RESTRICTED "file/private/wifi/wifi_off_by_restricted"
52 #define VCONF_WIFI_OFF_STATE_BY_EMERGENCY "file/private/wifi/wifi_off_by_emergency"
53 #if defined TIZEN_WEARABLE
54 #define VCONF_WIFI_WEARABLE_WIFI_USE "db/private/wifi/wearable_wifi_use"
56 #if !defined TIZEN_WEARABLE
57 #define VCONFKEY_SETAPPL_NETWORK_PERMIT_WITH_LCD_OFF_LIMIT "db/setting/network_with_lcd_off_limit"
60 #define WLAN_MAC_INFO tzplatform_mkpath(TZ_SYS_ETC, "/.mac.info")
61 #define WLAN_MAC_ADDR_MAX 20
62 #define VCONF_WIFI_BSSID_ADDRESS "db/wifi/bssid_address"
65 #define ETH_MAC_ADDR_SIZE 6
66 #define VCONF_ETH_MAC_ADDRESS "db/dnet/mac_address"
67 #define NET_EXEC_PATH "/sbin/ifconfig"
68 #define OS_RANDOM_FILE "/dev/urandom"
71 static gboolean connman_wifi_technology_state = FALSE;
72 static gboolean wifi_firmware_recovery_mode = FALSE;
73 static int airplane_mode = 0;
75 #if defined TIZEN_WEARABLE
76 static int psmode_wifi_use = 1;
79 static gboolean __is_wifi_restricted(void)
81 #if defined TIZEN_WEARABLE
84 int restricted_mode = 0;
86 netconfig_vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE, &restricted_mode);
87 if (restricted_mode != 0) {
88 DBG("network restricted mode[%d]", restricted_mode);
95 static void __technology_reply(GObject *source_object, GAsyncResult *res, gpointer user_data)
98 GDBusConnection *conn = NULL;
101 conn = G_DBUS_CONNECTION(source_object);
102 reply = g_dbus_connection_call_finish(conn, res, &error);
106 if (g_strcmp0(error->message, CONNMAN_ERROR_INTERFACE ".AlreadyEnabled") == 0)
107 wifi_state_update_power_state(TRUE);
108 else if (g_strcmp0(error->message, CONNMAN_ERROR_INTERFACE ".AlreadyDisabled") == 0)
109 wifi_state_update_power_state(FALSE);
111 ERR("Fail to request status [%d: %s]", error->code, error->message);
114 ERR("Fail torequest status");
117 DBG("Successfully requested");
120 g_variant_unref(reply);
121 netconfig_gdbus_pending_call_unref();
124 static int __execute_supplicant(gboolean enable)
127 const char *path = WLAN_SUPPLICANT_SCRIPT;
128 char *const args_enable[] = { "/usr/sbin/wpa_supp.sh", "start", NULL };
129 char *const args_disable[] = { "/usr/sbin/wpa_supp.sh", "stop", NULL };
130 char *const envs[] = { NULL };
131 static gboolean enabled = FALSE;
133 if (enabled == enable)
137 rv = netconfig_execute_file(path, args_enable, envs);
139 rv = netconfig_execute_file(path, args_disable, envs);
143 DBG("wpa_supplicant %s", enable == TRUE ? "started" : "stopped");
150 #if defined TIZEN_P2P_ENABLE && defined WLAN_CONCURRENT_MODE
151 static int __netconfig_p2p_supplicant(gboolean enable)
154 const char *path = P2P_SUPPLICANT_SCRIPT;
155 char *const args_enable[] = { P2P_SUPPLICANT_SCRIPT, "start", NULL };
156 char *const args_disable[] = { P2P_SUPPLICANT_SCRIPT, "stop", NULL };
157 char *const envs[] = { NULL };
160 rv = netconfig_execute_file(path, args_enable, envs);
162 rv = netconfig_execute_file(path, args_disable, envs);
166 DBG("p2p_supplicant %s", enable == TRUE ? "started" : "stopped");
172 void netconfig_wifi_recover_firmware(void)
174 wifi_firmware_recovery_mode = TRUE;
176 netconfig_wifi_bgscan_stop();
181 #if defined TIZEN_P2P_ENABLE && !defined WLAN_CONCURRENT_MODE
182 static void __netconfig_wifi_direct_state_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data)
186 wifi_direct_unset_device_state_changed_cb();
187 wifi_direct_deinitialize();
189 if (device_state == WIFI_DIRECT_DEVICE_STATE_DEACTIVATED) {
190 err = wifi_power_on();
192 if (err == -EALREADY)
193 wifi_state_update_power_state(TRUE);
195 wifi_state_emit_power_failed();
200 static gboolean __netconfig_wifi_direct_power_off(void)
202 DBG("Wi-Fi direct is turning off");
204 if (wifi_direct_initialize() < 0)
207 if (wifi_direct_set_device_state_changed_cb(__netconfig_wifi_direct_state_cb, NULL) < 0)
210 if (wifi_direct_deactivate() < 0)
217 static int _load_driver_and_supplicant(void)
220 wifi_tech_state_e tech_state;
222 tech_state = wifi_state_get_technology_state();
223 if (tech_state > NETCONFIG_WIFI_TECH_OFF)
226 err = __execute_supplicant(TRUE);
227 if (err < 0 && err != -EALREADY)
230 err = netconfig_wifi_firmware(NETCONFIG_WIFI_STA, TRUE);
231 if (err < 0 && err != -EALREADY) {
232 __execute_supplicant(FALSE);
236 wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_WPS_ONLY);
241 static int _remove_driver_and_supplicant(void)
245 if (wifi_firmware_recovery_mode != TRUE &&
246 netconfig_wifi_is_wps_enabled() == TRUE) {
247 DBG("Wi-Fi WPS mode");
251 err = netconfig_wifi_firmware(NETCONFIG_WIFI_STA, FALSE);
252 if (err < 0 && err != -EALREADY)
255 err = __execute_supplicant(FALSE);
256 if (err < 0 && err != -EALREADY)
259 wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_OFF);
261 if (wifi_firmware_recovery_mode == TRUE) {
262 if (wifi_power_on() < 0)
263 ERR("Failed to recover Wi-Fi firmware");
265 wifi_firmware_recovery_mode = FALSE;
271 static int _set_connman_technology_power(gboolean enable)
273 gboolean reply = FALSE;
274 GVariant *param0 = NULL;
275 GVariant *params = NULL;
276 char key[] = "Powered";
277 gboolean value_enable = TRUE;
278 gboolean value_disable = FALSE;
280 if (connman_wifi_technology_state == enable)
284 param0 = g_variant_new_boolean(value_enable);
286 param0 = g_variant_new_boolean(value_disable);
288 params = g_variant_new("(sv)", key, param0);
290 reply = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
291 CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE,
292 "SetProperty", params, __technology_reply);
295 ERR("Fail to set technology %s", enable == TRUE ? "enable" : "disable");
299 /* If Wi-Fi powered off,
300 * Do not remove Wi-Fi driver until ConnMan technology state updated
303 connman_wifi_technology_state = enable;
305 /* To be keep safe, early disable Wi-Fi tech state */
307 wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_WPS_ONLY);
312 static void __netconfig_set_wifi_bssid(void)
315 char bssid[WLAN_MAC_ADDR_MAX];
317 FILE *fp = fopen(WLAN_MAC_INFO, "r");
320 ERR("Fail to open file");
324 fseek(fp, 0L, SEEK_SET);
325 rv = fscanf(fp, "%17s", bssid);
328 ERR("Fail to read bssid");
330 netconfig_set_vconf_str(VCONF_WIFI_BSSID_ADDRESS, bssid);
335 int netconfig_wifi_driver_and_supplicant(gboolean enable)
337 /* There are 3 thumb rules for Wi-Fi power management
338 * 1. Do not make exposed API to control wpa_supplicant and driver directly.
339 * It probably breaks ConnMan technology operation.
341 * 2. Do not remove driver and wpa_supplicant if ConnMan already enabled.
342 * It breaks ConnMan technology operation.
344 * 3. Final the best rule: make it as simple as possible.
345 * Simple code enables easy maintenance and reduces logical errors.
348 return _load_driver_and_supplicant();
350 if (connman_wifi_technology_state == TRUE)
353 return _load_driver_and_supplicant();
357 void netconfig_wifi_disable_technology_state_by_only_connman_signal(void)
359 /* Important: it's only done by ConnMan technology signal update */
360 connman_wifi_technology_state = FALSE;
363 int netconfig_wifi_on(void)
366 wifi_tech_state_e wifi_tech_state;
368 wifi_tech_state = wifi_state_get_technology_state();
369 if (wifi_tech_state >= NETCONFIG_WIFI_TECH_POWERED)
372 if (__is_wifi_restricted() == TRUE)
375 if (netconfig_is_wifi_tethering_on() == TRUE) {
376 /* TODO: Wi-Fi tethering turns off here */
378 ERR("Failed to turn tethering off");
382 #if defined TIZEN_P2P_ENABLE && !defined WLAN_CONCURRENT_MODE
383 if (netconfig_is_wifi_direct_on() == TRUE) {
384 if (__netconfig_wifi_direct_power_off() == TRUE)
387 ERR("Failed to turn Wi-Fi direct off");
393 err = wifi_power_driver_and_supplicant(TRUE);
394 if (err < 0 && err != -EALREADY)
397 err = _set_connman_technology_power(TRUE);
399 __netconfig_set_wifi_bssid();
404 int netconfig_wifi_off(void)
408 #if defined TIZEN_P2P_ENABLE && defined WLAN_CONCURRENT_MODE
409 __netconfig_p2p_supplicant(FALSE);
412 err = _set_connman_technology_power(FALSE);
413 if (err == -EALREADY)
414 wifi_state_update_power_state(FALSE);
419 #if defined TIZEN_WEARABLE
420 int netconfig_wifi_on_wearable(gboolean device_picker_test)
426 if (netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use) < 0) {
427 ERR("Fail to get VCONF_WIFI_WEARABLE_WIFI_USE");
432 if (netconfig_vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &ps_mode) < 0) {
433 ERR("Fail to get VCONFKEY_SETAPPL_PSMODE");
437 if (ps_mode > SETTING_PSMODE_NORMAL) {
438 WARN("ps mode is on(%d), Not turn on Wi-Fi", ps_mode);
442 WARN("Not permitted Wi-Fi on");
446 err = wifi_power_driver_and_supplicant(TRUE);
447 if (err < 0 && err != -EALREADY)
450 err = _set_connman_technology_power(TRUE);
452 if (device_picker_test == TRUE)
453 netconfig_wifi_enable_device_picker_test();
458 static void __wearable_wifi_use_changed_cb(keynode_t* node, void* user_data)
463 if (netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
464 ERR("Fail to get VCONFKEY_WIFI_STATE");
469 wifi_use = vconf_keynode_get_int(node);
471 netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use);
475 if (wifi_state > VCONFKEY_WIFI_OFF) {
476 WARN("Wi-Fi is already turned on");
479 wifi_power_on_wearable(TRUE);
481 ERR("## wifi use [OFF]");
482 if (wifi_state == VCONFKEY_WIFI_OFF) {
483 WARN("Wi-Fi is already turned off");
491 static void __netconfig_wifi_restrict_mode(keynode_t *node, void *user_data)
493 int wifi_state = 0, restricted = 0;
494 int wifi_off_by_restricted = 0;
496 netconfig_vconf_get_int(VCONF_WIFI_OFF_STATE_BY_RESTRICTED, &wifi_off_by_restricted);
498 netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
501 restricted = vconf_keynode_get_bool(node);
503 netconfig_vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE, &restricted);
505 DBG("network restricted mode %s", restricted > 0 ? "ON" : "OFF");
506 DBG("Wi-Fi state %d, Wi-Fi was off by restricted mode %s", wifi_state,
507 wifi_off_by_restricted ? "Yes" : "No");
509 if (restricted > 0) {
510 /* network restricted on */
511 if (wifi_state == VCONFKEY_WIFI_OFF)
516 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_RESTRICTED, 1);
518 /* network restricted off */
519 if (!wifi_off_by_restricted)
522 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_RESTRICTED, 0);
524 if (wifi_state > VCONFKEY_WIFI_OFF)
532 static void __netconfig_wifi_airplane_mode(keynode_t *node, void *user_data)
534 int wifi_state = 0, airplane_state = 0;
535 int wifi_off_by_airplane = 0;
537 netconfig_vconf_get_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, &wifi_off_by_airplane);
539 #if defined TIZEN_WEARABLE
540 netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_state)
542 netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
546 airplane_state = vconf_keynode_get_bool(node);
548 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &airplane_state);
550 DBG("airplane mode %s (prev:%d)", airplane_state > 0 ? "ON" : "OFF", airplane_mode);
551 DBG("Wi-Fi state(or use) %d, Wi-Fi was off by flight mode %s", wifi_state,
552 wifi_off_by_airplane ? "Yes" : "No");
554 if (airplane_mode == airplane_state)
557 airplane_mode = airplane_state;
559 if (airplane_state > 0) {
560 /* airplane mode on */
561 if (wifi_state == VCONFKEY_WIFI_OFF)
566 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 1);
567 #if defined TIZEN_WEARABLE
568 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, 0);
571 /* airplane mode off */
572 if (!wifi_off_by_airplane)
575 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 0);
576 #if defined TIZEN_WEARABLE
577 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, 1);
579 if (wifi_state > VCONFKEY_WIFI_OFF)
587 static void __emergency_mode_changed_cb(keynode_t *node, void *user_data)
589 int wifi_state = 0, emergency = 0;
590 int wifi_off_by_emergency = 0;
591 #if !defined TIZEN_WEARABLE
592 int emergency_by_fmm = 0;
594 #if defined TIZEN_WEARABLE
598 netconfig_vconf_get_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, &wifi_off_by_emergency);
599 netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
601 #if !defined TIZEN_WEARABLE
602 netconfig_vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_PERMIT_WITH_LCD_OFF_LIMIT, &emergency_by_fmm);
603 DBG("emergency mode by Find My Mobile (%d)", emergency_by_fmm);
604 if (emergency_by_fmm == 1)
609 emergency = vconf_keynode_get_int(node);
611 netconfig_vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &emergency);
613 DBG("emergency mode %s", emergency > SETTING_PSMODE_POWERFUL ? "ON" : "OFF");
614 DBG("Wi-Fi state %d, Wi-Fi was off by emergency mode %s", wifi_state, wifi_off_by_emergency ? "Yes" : "No");
616 #if defined TIZEN_WEARABLE
617 if (emergency == SETTING_PSMODE_WEARABLE) {
618 /* basic power saving mode on */
619 } else if (emergency == SETTING_PSMODE_WEARABLE_ENHANCED) {
620 /* enhanced power saving mode on */
621 netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use);
622 psmode_wifi_use = wifi_use;
624 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, 0);
626 if (wifi_state == VCONFKEY_WIFI_OFF)
630 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 1);
632 /* power saving mode off */
633 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, psmode_wifi_use);
634 if (!wifi_off_by_emergency)
637 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 0);
638 if (wifi_state > VCONFKEY_WIFI_OFF)
641 wifi_power_on_wearable(TRUE);
644 if (emergency > SETTING_PSMODE_POWERFUL) {
645 /* emergency mode on */
646 if (wifi_state == VCONFKEY_WIFI_OFF)
651 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 1);
653 /* emergency mode off */
654 if (!wifi_off_by_emergency)
657 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 0);
659 if (wifi_state > VCONFKEY_WIFI_OFF)
668 static void __pm_state_changed_cb(keynode_t* node, void* user_data)
672 static int prev_state = VCONFKEY_PM_STATE_NORMAL;
674 if (netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
675 ERR("Fail to get VCONFKEY_WIFI_STATE");
680 * VCONFKEY_PM_STATE_NORMAL = 1,
681 * VCONFKEY_PM_STATE_LCDDIM,
682 * VCONFKEY_PM_STATE_LCDOFF,
683 * VCONFKEY_PM_STATE_SLEEP
686 new_state = vconf_keynode_get_int(node);
688 netconfig_vconf_get_int(VCONFKEY_PM_STATE, &new_state);
690 DBG("wifi state: %d (0 off / 1 on / 2 connected)", wifi_state);
691 DBG("Old PM state: %d, current: %d", prev_state, new_state);
693 if ((new_state == VCONFKEY_PM_STATE_NORMAL) && (prev_state >= VCONFKEY_PM_STATE_LCDOFF)) {
694 netconfig_wifi_bgscan_stop();
695 netconfig_wifi_bgscan_start(TRUE);
698 prev_state = new_state;
701 #if defined TIZEN_TELEPHONY_ENABLE
702 static void _tapi_noti_sim_status_cb(TapiHandle *handle, const char *noti_id,
703 void *data, void *user_data)
705 TelSimCardStatus_t *status = data;
707 if (*status == TAPI_SIM_STATUS_SIM_INIT_COMPLETED) {
708 DBG("Turn Wi-Fi on automatically");
709 #if defined TIZEN_WEARABLE
710 wifi_power_on_wearable(TRUE);
714 netconfig_tel_deinit();
718 static gboolean netconfig_tapi_check_sim_state(void)
720 int ret, card_changed;
721 TelSimCardStatus_t status = TAPI_SIM_STATUS_UNKNOWN;
722 TapiHandle *tapi_handle = NULL;
724 tapi_handle = (TapiHandle *)netconfig_tel_init();
725 if (tapi_handle == NULL) {
726 ERR("Failed to tapi init");
730 ret = tel_get_sim_init_info(tapi_handle, &status, &card_changed);
731 if (ret != TAPI_API_SUCCESS) {
732 ERR("tel_get_sim_init_info() Failed : [%d]", ret);
733 netconfig_tel_deinit();
738 case TAPI_SIM_STATUS_UNKNOWN:
739 case TAPI_SIM_STATUS_CARD_ERROR:
740 case TAPI_SIM_STATUS_CARD_NOT_PRESENT:
741 case TAPI_SIM_STATUS_CARD_BLOCKED:
742 case TAPI_SIM_STATUS_SIM_INIT_COMPLETED:
744 case TAPI_SIM_STATUS_SIM_PIN_REQUIRED:
745 case TAPI_SIM_STATUS_SIM_INITIALIZING:
746 case TAPI_SIM_STATUS_SIM_PUK_REQUIRED:
747 case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED:
748 case TAPI_SIM_STATUS_SIM_NCK_REQUIRED:
749 case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED:
750 case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED:
751 case TAPI_SIM_STATUS_SIM_CCK_REQUIRED:
752 tel_register_noti_event(tapi_handle, TAPI_NOTI_SIM_STATUS,
753 _tapi_noti_sim_status_cb, NULL);
756 ERR("not defined status(%d)", status);
760 netconfig_tel_deinit();
765 static void __netconfig_telephony_ready_changed_cb(keynode_t * node, void *data)
767 int telephony_ready = 0;
770 telephony_ready = vconf_keynode_get_bool(node);
772 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_READY, &telephony_ready);
774 if (telephony_ready != 0) {
775 if (netconfig_tapi_check_sim_state() == FALSE) {
776 DBG("Sim is not initialized yet.");
783 DBG("Turn Wi-Fi on automatically");
785 #if defined TIZEN_WEARABLE
786 wifi_power_on_wearable(TRUE);
792 vconf_ignore_key_changed(VCONFKEY_TELEPHONY_READY, __netconfig_telephony_ready_changed_cb);
796 int wifi_power_driver_and_supplicant(gboolean enable)
798 /* There are 3 thumb rules for Wi-Fi power management
799 * 1. Do not make exposed API to control wpa_supplicant and driver directly.
800 * It probably breaks ConnMan technology operation.
802 * 2. Do not remove driver and wpa_supplicant if ConnMan already enabled.
803 * It breaks ConnMan technology operation.
805 * 3. Final the best rule: make it as simple as possible.
806 * Simple code enables easy maintenance and reduces logical errors.
808 if (enable == TRUE) {
809 return _load_driver_and_supplicant();
811 if (connman_wifi_technology_state == TRUE)
814 return _remove_driver_and_supplicant();
818 void wifi_power_disable_technology_state_by_only_connman_signal(void)
820 /* Important: it's only done by ConnMan technology signal update */
821 connman_wifi_technology_state = FALSE;
824 void wifi_power_recover_firmware(void)
826 wifi_firmware_recovery_mode = TRUE;
828 netconfig_wifi_bgscan_stop();
833 int wifi_power_on(void)
836 wifi_tech_state_e tech_state;
838 tech_state = wifi_state_get_technology_state();
839 if (tech_state >= NETCONFIG_WIFI_TECH_POWERED)
842 if (__is_wifi_restricted() == TRUE)
845 if (netconfig_is_wifi_tethering_on() == TRUE) {
846 /* TODO: Wi-Fi tethering turns off here */
848 ERR("Failed to turn tethering off");
852 #if defined TIZEN_P2P_ENABLE && !defined WLAN_CONCURRENT_MODE
853 if (netconfig_is_wifi_direct_on() == TRUE) {
854 if (__netconfig_wifi_direct_power_off() == TRUE)
857 ERR("Failed to turn Wi-Fi direct off");
863 err = wifi_power_driver_and_supplicant(TRUE);
864 if (err < 0 && err != -EALREADY)
867 err = _set_connman_technology_power(TRUE);
872 int wifi_power_off(void)
876 err = _set_connman_technology_power(FALSE);
877 if (err == -EALREADY)
878 wifi_state_update_power_state(FALSE);
883 #if defined TIZEN_WEARABLE
884 int wifi_power_on_wearable(gboolean device_picker_test)
888 wifi_tech_state_e tech_state;
890 tech_state = wifi_state_get_technology_state();
891 if (tech_state >= NETCONFIG_WIFI_TECH_POWERED)
894 if (netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use) < 0) {
895 ERR("Fail to get VCONF_WIFI_WEARABLE_WIFI_USE");
900 WARN("VCONF_WIFI_WEARABLE_WIFI_USE is OFF");
904 err = wifi_power_driver_and_supplicant(TRUE);
905 if (err < 0 && err != -EALREADY)
908 err = _set_connman_technology_power(TRUE);
910 if (device_picker_test == TRUE)
911 netconfig_wifi_enable_device_picker_test();
917 void wifi_power_initialize(void)
919 int wifi_last_power_state = 0;
921 /* Initialize Airplane mode */
922 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &airplane_mode);
923 DBG("Airplane[%s]", airplane_mode > 0 ? "ON" : "OFF");
925 /* Update the last Wi-Fi power state */
926 netconfig_vconf_get_int(VCONF_WIFI_LAST_POWER_STATE, &wifi_last_power_state);
927 if (wifi_last_power_state > VCONFKEY_WIFI_OFF) {
928 #if defined TIZEN_TELEPHONY_ENABLE
929 int telephony_ready = 0;
930 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_READY, &telephony_ready);
931 if (telephony_ready == 0) {
932 DBG("Telephony API is not initialized yet");
933 vconf_notify_key_changed(VCONFKEY_TELEPHONY_READY,
934 __netconfig_telephony_ready_changed_cb, NULL);
936 if (netconfig_tapi_check_sim_state() == FALSE)
937 DBG("SIM is not initialized yet");
940 DBG("Turn Wi-Fi on automatically");
941 #if defined TIZEN_WEARABLE
942 wifi_power_on_wearable(TRUE);
948 #if defined TIZEN_WEARABLE
949 vconf_notify_key_changed(VCONF_WIFI_WEARABLE_WIFI_USE, __wearable_wifi_use_changed_cb, NULL);
951 vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
952 __netconfig_wifi_airplane_mode, NULL);
954 vconf_notify_key_changed(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE,
955 __netconfig_wifi_restrict_mode, NULL);
956 vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
957 __netconfig_wifi_airplane_mode, NULL);
960 vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, __emergency_mode_changed_cb, NULL);
961 vconf_notify_key_changed(VCONFKEY_PM_STATE, __pm_state_changed_cb, NULL);
964 void wifi_power_deinitialize(void)
968 gboolean handle_load_driver(Wifi *wifi,
969 GDBusMethodInvocation *context, gboolean device_picker_test)
973 DBG("Wi-Fi power on requested");
975 g_return_val_if_fail(wifi != NULL, FALSE);
977 if (!netconfig_dpm_update_from_wifi()) {
978 DBG("DPM policy restricts Wi-Fi");
979 netconfig_error_permission_denied(context);
983 #if defined TIZEN_WLAN_BOARD_SPRD
984 wifi_firmware_download();
987 #if defined TIZEN_WEARABLE
988 err = wifi_power_on_wearable(device_picker_test);
990 err = wifi_power_on();
992 if (device_picker_test == TRUE)
993 netconfig_wifi_enable_device_picker_test();
996 if (err == -EINPROGRESS)
997 netconfig_error_inprogress(context);
998 else if (err == -EALREADY)
999 netconfig_error_already_exists(context);
1000 else if (err == -EPERM)
1001 netconfig_error_permission_denied(context);
1003 netconfig_error_wifi_driver_failed(context);
1009 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 0);
1010 __netconfig_set_wifi_bssid();
1012 wifi_complete_load_driver(wifi, context);
1016 gboolean handle_remove_driver(Wifi *wifi, GDBusMethodInvocation *context)
1020 DBG("Wi-Fi power off requested");
1022 g_return_val_if_fail(wifi != NULL, FALSE);
1024 err = wifi_power_off();
1026 if (err == -EINPROGRESS)
1027 netconfig_error_inprogress(context);
1028 else if (err == -EALREADY)
1029 netconfig_error_already_exists(context);
1030 else if (err == -EPERM)
1031 netconfig_error_permission_denied(context);
1033 netconfig_error_wifi_driver_failed(context);
1037 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 0);
1039 wifi_complete_remove_driver(wifi, context);
1043 gboolean handle_load_p2p_driver(Wifi *wifi, GDBusMethodInvocation *context)
1047 wifi_complete_load_p2p_driver(wifi, context);
1051 gboolean handle_remove_p2p_driver(Wifi *wifi, GDBusMethodInvocation *context)
1055 wifi_complete_remove_p2p_driver(wifi, context);
1059 #if defined TIZEN_TV
1060 static int __netconfig_get_random_mac(unsigned char *mac_buf, int mac_len)
1062 DBG("Generate Random Mac address of ethernet");
1066 fp = fopen(OS_RANDOM_FILE, "rb");
1069 ERR("Could not open /dev/urandom");
1072 rc = fread(mac_buf, 1, mac_len, fp);
1076 return rc != mac_len ? -1 : 0;
1079 void __netconfig_set_ether_macaddr()
1082 DBG("Set wired Mac address ");
1083 char *mac_addr = NULL;
1086 mac_addr = vconf_get_str(VCONF_ETH_MAC_ADDRESS);
1087 if (mac_addr == NULL) {
1088 DBG("vconf_get_str Failed\n");
1091 /* Checking Invalid MAC Address */
1092 if ((strlen(mac_addr) == 0)) {
1093 ERR("Failed to get valid MAC Address from vconf");
1094 /*Generate the Random Mac address*/
1095 unsigned char rand_mac_add[ETH_MAC_ADDR_SIZE+1];
1097 if (__netconfig_get_random_mac(rand_mac_add, ETH_MAC_ADDR_SIZE == -1)) {
1099 ERR("Could not generate the Random Mac address");
1104 rand_mac_add[0] &= 0xFE; /*Clear multicase bit*/
1105 rand_mac_add[0] |= 0x02; /*set local assignment bit*/
1107 /*Set the Mac address in Vconf*/
1108 snprintf(mac_addr, WLAN_MAC_ADDR_MAX, "%x:%x:%x:%x:%x:%x",
1109 rand_mac_add[0], rand_mac_add[1],
1110 rand_mac_add[2], rand_mac_add[3],
1111 rand_mac_add[4], rand_mac_add[5]);
1113 netconfig_set_vconf_str(VCONF_ETH_MAC_ADDRESS, mac_addr);
1116 DBG("MAC Address of eth0 [%s]", mac_addr);
1117 const char *path = NET_EXEC_PATH;
1118 char *const args[] = { "/sbin/ifconfig", "eth0", "hw",
1119 "ether", mac_addr, "up", NULL};
1120 char *const envs[] = { NULL };
1121 rv = netconfig_execute_file(path, args, envs);
1124 ERR("Unable to execute system command");