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>
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 "netsupplicant.h"
40 #include "network-state.h"
41 #include "network-dpm.h"
42 #include "wifi-firmware.h"
43 #include "wifi-background-scan.h"
46 #define WLAN_SUPPLICANT_SCRIPT "/usr/bin/wpa_supp.sh"
47 #define P2P_SUPPLICANT_SCRIPT "/usr/bin/p2p_supp.sh"
49 #define VCONF_WIFI_OFF_STATE_BY_AIRPLANE "file/private/wifi/wifi_off_by_airplane"
50 #define VCONF_WIFI_OFF_STATE_BY_RESTRICTED "file/private/wifi/wifi_off_by_restricted"
51 #define VCONF_WIFI_OFF_STATE_BY_EMERGENCY "file/private/wifi/wifi_off_by_emergency"
52 #if defined TIZEN_WEARABLE
53 #define VCONF_WIFI_WEARABLE_WIFI_USE "db/private/wifi/wearable_wifi_use"
55 #if !defined TIZEN_WEARABLE
56 #define VCONFKEY_SETAPPL_NETWORK_PERMIT_WITH_LCD_OFF_LIMIT "db/setting/network_with_lcd_off_limit"
59 #define WLAN_MAC_INFO tzplatform_mkpath(TZ_SYS_ETC, "/.mac.info")
60 #define WLAN_MAC_ADDRESS_FILEPATH "/sys/class/net/wlan0/address"
61 #define WLAN_MAC_ADDR_MAX 20
62 #define VCONF_WIFI_BSSID_ADDRESS "db/wifi/bssid_address"
64 #define ETH_MAC_ADDR_SIZE 6
65 #define VCONF_ETH_MAC_ADDRESS "db/dnet/mac_address"
66 #define NET_EXEC_PATH "/sbin/ifconfig"
67 #define OS_RANDOM_FILE "/dev/urandom"
69 static gboolean connman_wifi_technology_state = FALSE;
70 static gboolean wifi_firmware_recovery_mode = FALSE;
71 static int airplane_mode = 0;
73 #if defined TIZEN_WEARABLE
74 static int psmode_wifi_use = 1;
77 static gboolean __is_wifi_restricted(void)
79 #if defined TIZEN_WEARABLE
82 int restricted_mode = 0;
84 netconfig_vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE, &restricted_mode);
85 if (restricted_mode != 0) {
86 DBG("network restricted mode[%d]", restricted_mode);
93 static void __technology_reply(GObject *source_object, GAsyncResult *res, gpointer user_data)
96 GDBusConnection *conn = NULL;
99 conn = G_DBUS_CONNECTION(source_object);
100 reply = g_dbus_connection_call_finish(conn, res, &error);
104 if (g_strstr_len(error->message, strlen(error->message),
105 CONNMAN_ERROR_INTERFACE ".AlreadyEnabled") != NULL) {
106 wifi_state_update_power_state(TRUE);
107 } else if (g_strstr_len(error->message, strlen(error->message),
108 CONNMAN_ERROR_INTERFACE ".AlreadyDisabled") != NULL) {
109 wifi_state_update_power_state(FALSE);
111 ERR("Fail to request status [%d: %s]", error->code, error->message);
112 wifi_state_update_power_state(FALSE);
116 ERR("Fail to request status");
117 wifi_state_update_power_state(FALSE);
120 DBG("Successfully requested");
123 g_variant_unref(reply);
124 netconfig_gdbus_pending_call_unref();
127 static int __execute_supplicant(gboolean enable)
130 const char *path = WLAN_SUPPLICANT_SCRIPT;
131 char *const args_enable[] = { "/usr/bin/wpa_supp.sh", "start", NULL };
132 char *const args_disable[] = { "/usr/bin/wpa_supp.sh", "stop", NULL };
133 char *const envs[] = { NULL };
134 static gboolean enabled = FALSE;
136 if (enabled == enable)
140 rv = netconfig_execute_file(path, args_enable, envs);
142 rv = netconfig_execute_file(path, args_disable, envs);
146 DBG("wpa_supplicant %s", enable == TRUE ? "started" : "stopped");
153 #if defined TIZEN_P2P_ENABLE && defined WLAN_CONCURRENT_MODE
154 static int __netconfig_p2p_supplicant(gboolean enable)
157 const char *path = P2P_SUPPLICANT_SCRIPT;
158 char *const args_enable[] = { P2P_SUPPLICANT_SCRIPT, "start", NULL };
159 char *const args_disable[] = { P2P_SUPPLICANT_SCRIPT, "stop", NULL };
160 char *const envs[] = { NULL };
163 rv = netconfig_execute_file(path, args_enable, envs);
165 rv = netconfig_execute_file(path, args_disable, envs);
169 DBG("p2p_supplicant %s", enable == TRUE ? "started" : "stopped");
175 void netconfig_wifi_recover_firmware(void)
177 wifi_firmware_recovery_mode = TRUE;
179 netconfig_wifi_bgscan_stop();
184 #if defined TIZEN_P2P_ENABLE && !defined WLAN_CONCURRENT_MODE
185 static void __netconfig_wifi_direct_state_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data)
189 wifi_direct_unset_device_state_changed_cb();
190 wifi_direct_deinitialize();
192 if (device_state == WIFI_DIRECT_DEVICE_STATE_DEACTIVATED) {
193 err = wifi_power_on();
195 if (err == -EALREADY)
196 wifi_state_update_power_state(TRUE);
198 wifi_state_emit_power_failed();
203 static gboolean __netconfig_wifi_direct_power_off(void)
205 DBG("Wi-Fi direct is turning off");
207 if (wifi_direct_initialize() < 0)
210 if (wifi_direct_set_device_state_changed_cb(__netconfig_wifi_direct_state_cb, NULL) < 0)
213 if (wifi_direct_deactivate() < 0)
220 static int _load_driver_and_supplicant(void)
223 wifi_tech_state_e tech_state;
225 tech_state = wifi_state_get_technology_state();
226 if (tech_state > NETCONFIG_WIFI_TECH_OFF)
229 err = __execute_supplicant(TRUE);
230 if (err < 0 && err != -EALREADY)
233 err = netconfig_wifi_firmware(NETCONFIG_WIFI_STA, TRUE);
234 if (err < 0 && err != -EALREADY) {
235 __execute_supplicant(FALSE);
239 wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_WPS_ONLY);
244 static int _remove_driver_and_supplicant(void)
248 INFO("remove driver and supplicant");
249 if (wifi_firmware_recovery_mode != TRUE &&
250 netconfig_wifi_is_wps_enabled() == TRUE) {
251 DBG("Wi-Fi WPS mode");
255 err = netconfig_wifi_firmware(NETCONFIG_WIFI_STA, FALSE);
256 if (err < 0 && err != -EALREADY)
259 err = __execute_supplicant(FALSE);
260 if (err < 0 && err != -EALREADY)
263 wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_OFF);
265 // reset service state
266 wifi_state_set_service_state(NETCONFIG_WIFI_IDLE);
268 if (wifi_firmware_recovery_mode == TRUE) {
269 if (wifi_power_on() < 0)
270 ERR("Failed to recover Wi-Fi firmware");
272 wifi_firmware_recovery_mode = FALSE;
278 static int _set_connman_technology_power(gboolean enable)
280 gboolean reply = FALSE;
281 GVariant *param0 = NULL;
282 GVariant *params = NULL;
283 char key[] = "Powered";
284 gboolean value_enable = TRUE;
285 gboolean value_disable = FALSE;
287 if (connman_wifi_technology_state == enable)
291 param0 = g_variant_new_boolean(value_enable);
293 param0 = g_variant_new_boolean(value_disable);
295 params = g_variant_new("(sv)", key, param0);
297 reply = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
298 CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE,
299 "SetProperty", params, __technology_reply);
302 ERR("Fail to set technology %s", enable == TRUE ? "enable" : "disable");
306 /* If Wi-Fi powered off,
307 * Do not remove Wi-Fi driver until ConnMan technology state updated
310 connman_wifi_technology_state = enable;
312 /* To be keep safe, early disable Wi-Fi tech state */
314 wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_WPS_ONLY);
319 static void __netconfig_set_wifi_bssid(void)
322 char bssid[WLAN_MAC_ADDR_MAX];
324 FILE *fp = fopen(WLAN_MAC_INFO, "r");
327 ERR("Fail to open %s", WLAN_MAC_INFO);
328 fp = fopen(WLAN_MAC_ADDRESS_FILEPATH, "r");
330 ERR("Fail to open %s", WLAN_MAC_ADDRESS_FILEPATH);
335 fseek(fp, 0L, SEEK_SET);
336 rv = fscanf(fp, "%17s", bssid);
339 ERR("Fail to read bssid");
341 netconfig_set_vconf_str(VCONF_WIFI_BSSID_ADDRESS, bssid);
346 void netconfig_wifi_disable_technology_state_by_only_connman_signal(void)
348 /* Important: it's only done by ConnMan technology signal update */
349 connman_wifi_technology_state = FALSE;
352 #if defined TIZEN_WEARABLE
353 int netconfig_wifi_on_wearable(gboolean device_picker_test)
359 if (netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use) < 0) {
360 ERR("Fail to get VCONF_WIFI_WEARABLE_WIFI_USE");
365 if (netconfig_vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &ps_mode) < 0) {
366 ERR("Fail to get VCONFKEY_SETAPPL_PSMODE");
370 if (ps_mode > SETTING_PSMODE_NORMAL) {
371 WARN("ps mode is on(%d), Not turn on Wi-Fi", ps_mode);
375 WARN("Not permitted Wi-Fi on");
379 err = wifi_power_driver_and_supplicant(TRUE);
380 if (err < 0 && err != -EALREADY)
383 err = _set_connman_technology_power(TRUE);
385 if (device_picker_test == TRUE)
386 netconfig_wifi_enable_device_picker_test();
391 static void __wearable_wifi_use_changed_cb(keynode_t* node, void* user_data)
396 if (netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
397 ERR("Fail to get VCONFKEY_WIFI_STATE");
402 wifi_use = vconf_keynode_get_int(node);
404 netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use);
408 if (wifi_state > VCONFKEY_WIFI_OFF) {
409 WARN("Wi-Fi is already turned on");
412 wifi_power_on_wearable(TRUE);
414 ERR("## wifi use [OFF]");
415 if (wifi_state == VCONFKEY_WIFI_OFF) {
416 WARN("Wi-Fi is already turned off");
424 static void __netconfig_wifi_restrict_mode(keynode_t *node, void *user_data)
426 int wifi_state = 0, restricted = 0;
427 int wifi_off_by_restricted = 0;
429 netconfig_vconf_get_int(VCONF_WIFI_OFF_STATE_BY_RESTRICTED, &wifi_off_by_restricted);
431 netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
434 restricted = vconf_keynode_get_bool(node);
436 netconfig_vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE, &restricted);
438 DBG("network restricted mode %s", restricted > 0 ? "ON" : "OFF");
439 DBG("Wi-Fi state %d, Wi-Fi was off by restricted mode %s", wifi_state,
440 wifi_off_by_restricted ? "Yes" : "No");
442 if (restricted > 0) {
443 /* network restricted on */
444 if (wifi_state == VCONFKEY_WIFI_OFF)
449 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_RESTRICTED, 1);
451 /* network restricted off */
452 if (!wifi_off_by_restricted)
455 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_RESTRICTED, 0);
457 if (wifi_state > VCONFKEY_WIFI_OFF)
465 static void __netconfig_wifi_airplane_mode(keynode_t *node, void *user_data)
467 int wifi_state = 0, airplane_state = 0;
468 int wifi_off_by_airplane = 0;
470 netconfig_vconf_get_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, &wifi_off_by_airplane);
472 #if defined TIZEN_WEARABLE
473 netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_state)
475 netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
479 airplane_state = vconf_keynode_get_bool(node);
481 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &airplane_state);
483 DBG("airplane mode %s (prev:%d)", airplane_state > 0 ? "ON" : "OFF", airplane_mode);
484 DBG("Wi-Fi state(or use) %d, Wi-Fi was off by flight mode %s", wifi_state,
485 wifi_off_by_airplane ? "Yes" : "No");
487 if (airplane_mode == airplane_state)
490 airplane_mode = airplane_state;
492 if (airplane_state > 0) {
493 /* airplane mode on */
494 if (wifi_state == VCONFKEY_WIFI_OFF)
499 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 1);
500 #if defined TIZEN_WEARABLE
501 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, 0);
504 /* airplane mode off */
505 if (!wifi_off_by_airplane)
508 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 0);
509 #if defined TIZEN_WEARABLE
510 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, 1);
512 if (wifi_state > VCONFKEY_WIFI_OFF)
520 static void __emergency_mode_changed_cb(keynode_t *node, void *user_data)
522 int wifi_state = 0, emergency = 0;
523 int wifi_off_by_emergency = 0;
524 #if !defined TIZEN_WEARABLE
525 int emergency_by_fmm = 0;
527 #if defined TIZEN_WEARABLE
531 netconfig_vconf_get_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, &wifi_off_by_emergency);
532 netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
534 #if !defined TIZEN_WEARABLE
535 netconfig_vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_PERMIT_WITH_LCD_OFF_LIMIT, &emergency_by_fmm);
536 DBG("emergency mode by Find My Mobile (%d)", emergency_by_fmm);
537 if (emergency_by_fmm == 1)
542 emergency = vconf_keynode_get_int(node);
544 netconfig_vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &emergency);
546 DBG("emergency mode %s", emergency > SETTING_PSMODE_POWERFUL ? "ON" : "OFF");
547 DBG("Wi-Fi state %d, Wi-Fi was off by emergency mode %s", wifi_state, wifi_off_by_emergency ? "Yes" : "No");
549 #if defined TIZEN_WEARABLE
550 if (emergency == SETTING_PSMODE_WEARABLE) {
551 /* basic power saving mode on */
552 } else if (emergency == SETTING_PSMODE_WEARABLE_ENHANCED) {
553 /* enhanced power saving mode on */
554 netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use);
555 psmode_wifi_use = wifi_use;
557 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, 0);
559 if (wifi_state == VCONFKEY_WIFI_OFF)
563 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 1);
565 /* power saving mode off */
566 netconfig_set_vconf_int(VCONF_WIFI_WEARABLE_WIFI_USE, psmode_wifi_use);
567 if (!wifi_off_by_emergency)
570 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 0);
571 if (wifi_state > VCONFKEY_WIFI_OFF)
574 wifi_power_on_wearable(TRUE);
577 if (emergency > SETTING_PSMODE_POWERFUL) {
578 /* emergency mode on */
579 if (wifi_state == VCONFKEY_WIFI_OFF)
584 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 1);
586 /* emergency mode off */
587 if (!wifi_off_by_emergency)
590 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_EMERGENCY, 0);
592 if (wifi_state > VCONFKEY_WIFI_OFF)
601 static void __pm_state_changed_cb(keynode_t* node, void* user_data)
605 static int prev_state = VCONFKEY_PM_STATE_NORMAL;
607 if (netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
608 ERR("Fail to get VCONFKEY_WIFI_STATE");
613 * VCONFKEY_PM_STATE_NORMAL = 1,
614 * VCONFKEY_PM_STATE_LCDDIM,
615 * VCONFKEY_PM_STATE_LCDOFF,
616 * VCONFKEY_PM_STATE_SLEEP
619 new_state = vconf_keynode_get_int(node);
621 netconfig_vconf_get_int(VCONFKEY_PM_STATE, &new_state);
623 DBG("wifi state: %d (0 off / 1 on / 2 connected)", wifi_state);
624 DBG("Old PM state: %d, current: %d", prev_state, new_state);
626 if ((new_state == VCONFKEY_PM_STATE_NORMAL) && (prev_state >= VCONFKEY_PM_STATE_LCDOFF)) {
627 netconfig_wifi_bgscan_stop();
628 netconfig_wifi_bgscan_start(TRUE);
631 prev_state = new_state;
634 static void __netconfig_telephony_ready_changed_cb(keynode_t * node, void *data)
636 int telephony_ready = 0;
639 telephony_ready = vconf_keynode_get_bool(node);
641 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_READY, &telephony_ready);
643 if (telephony_ready != 0) {
644 if (netconfig_tapi_check_sim_state() == FALSE) {
645 DBG("Sim is not initialized yet.");
652 DBG("Turn Wi-Fi on automatically");
654 #if defined TIZEN_WEARABLE
655 wifi_power_on_wearable(TRUE);
661 vconf_ignore_key_changed(VCONFKEY_TELEPHONY_READY, __netconfig_telephony_ready_changed_cb);
664 int wifi_power_driver_and_supplicant(gboolean enable)
666 /* There are 3 thumb rules for Wi-Fi power management
667 * 1. Do not make exposed API to control wpa_supplicant and driver directly.
668 * It probably breaks ConnMan technology operation.
670 * 2. Do not remove driver and wpa_supplicant if ConnMan already enabled.
671 * It breaks ConnMan technology operation.
673 * 3. Final the best rule: make it as simple as possible.
674 * Simple code enables easy maintenance and reduces logical errors.
676 if (enable == TRUE) {
677 return _load_driver_and_supplicant();
679 if (connman_wifi_technology_state == TRUE)
682 return _remove_driver_and_supplicant();
686 void wifi_power_disable_technology_state_by_only_connman_signal(void)
688 /* Important: it's only done by ConnMan technology signal update */
689 connman_wifi_technology_state = FALSE;
692 void wifi_power_recover_firmware(void)
694 wifi_firmware_recovery_mode = TRUE;
696 netconfig_wifi_bgscan_stop();
701 int wifi_power_on(void)
704 wifi_tech_state_e tech_state;
706 tech_state = wifi_state_get_technology_state();
707 if (tech_state >= NETCONFIG_WIFI_TECH_POWERED) {
708 /* There can be a scenario where wifi is automatically *
709 * activated by connman if wifi was powered in last boot. *
710 * So we should update connman_wifi_technology_state variable *
711 * if it is found that wifi_tech_state variable is *
712 * NETCONFIG_WIFI_TECH_POWERED and connman_wifi_technology_state *
713 * variable is FALSE. Earlier connman_wifi_technology_state *
714 * variable was only updated when wifi was Powered on from *
715 * net-config resulting in variable not getting updated. *
716 * This caused wifi to not get deactivated after reboot if *
717 * last power state was activated */
718 ERR("Net-Config WiFi connman technology state %d",
719 connman_wifi_technology_state);
720 if (connman_wifi_technology_state == FALSE)
721 connman_wifi_technology_state = TRUE;
725 if (__is_wifi_restricted() == TRUE)
728 if (netconfig_is_wifi_tethering_on() == TRUE) {
729 /* TODO: Wi-Fi tethering turns off here */
731 ERR("Failed to turn tethering off");
735 #if defined TIZEN_P2P_ENABLE && !defined WLAN_CONCURRENT_MODE
736 if (netconfig_is_wifi_direct_on() == TRUE) {
737 if (__netconfig_wifi_direct_power_off() == TRUE)
740 ERR("Failed to turn Wi-Fi direct off");
746 err = wifi_power_driver_and_supplicant(TRUE);
747 if (err < 0 && err != -EALREADY)
750 err = _set_connman_technology_power(TRUE);
755 int wifi_power_off(void)
759 err = _set_connman_technology_power(FALSE);
760 if (err == -EALREADY)
761 wifi_state_update_power_state(FALSE);
766 #if defined TIZEN_WEARABLE
767 int wifi_power_on_wearable(gboolean device_picker_test)
771 wifi_tech_state_e tech_state;
773 tech_state = wifi_state_get_technology_state();
774 if (tech_state >= NETCONFIG_WIFI_TECH_POWERED)
777 if (netconfig_vconf_get_int(VCONF_WIFI_WEARABLE_WIFI_USE, &wifi_use) < 0) {
778 ERR("Fail to get VCONF_WIFI_WEARABLE_WIFI_USE");
783 WARN("VCONF_WIFI_WEARABLE_WIFI_USE is OFF");
787 err = wifi_power_driver_and_supplicant(TRUE);
788 if (err < 0 && err != -EALREADY)
791 err = _set_connman_technology_power(TRUE);
793 if (device_picker_test == TRUE)
794 netconfig_wifi_enable_device_picker_test();
800 void wifi_power_initialize(void)
802 int wifi_last_power_state = 0;
804 /* Initialize Airplane mode */
805 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &airplane_mode);
806 DBG("Airplane[%s]", airplane_mode > 0 ? "ON" : "OFF");
808 /* Update the last Wi-Fi power state */
809 netconfig_vconf_get_int(VCONF_WIFI_LAST_POWER_STATE, &wifi_last_power_state);
810 if (wifi_last_power_state > VCONFKEY_WIFI_OFF) {
811 if (TIZEN_TELEPHONY_ENABLE) {
812 int telephony_ready = 0;
813 netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_READY, &telephony_ready);
814 if (telephony_ready == 0) {
815 DBG("Telephony API is not initialized yet");
816 vconf_notify_key_changed(VCONFKEY_TELEPHONY_READY,
817 __netconfig_telephony_ready_changed_cb, NULL);
819 if (netconfig_tapi_check_sim_state() == FALSE)
820 DBG("SIM is not initialized yet");
823 DBG("Turn Wi-Fi on automatically");
824 #if defined TIZEN_WEARABLE
825 wifi_power_on_wearable(TRUE);
831 #if defined TIZEN_WEARABLE
832 vconf_notify_key_changed(VCONF_WIFI_WEARABLE_WIFI_USE, __wearable_wifi_use_changed_cb, NULL);
834 vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
835 __netconfig_wifi_airplane_mode, NULL);
837 vconf_notify_key_changed(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE,
838 __netconfig_wifi_restrict_mode, NULL);
839 vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
840 __netconfig_wifi_airplane_mode, NULL);
843 vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, __emergency_mode_changed_cb, NULL);
844 vconf_notify_key_changed(VCONFKEY_PM_STATE, __pm_state_changed_cb, NULL);
847 void wifi_power_deinitialize(void)
851 gboolean handle_load_driver(Wifi *wifi,
852 GDBusMethodInvocation *context, gboolean device_picker_test)
856 DBG("Wi-Fi power on requested");
858 g_return_val_if_fail(wifi != NULL, FALSE);
860 if (!netconfig_dpm_update_from_wifi()) {
861 DBG("DPM policy restricts Wi-Fi");
862 netconfig_error_permission_denied(context);
866 if (TIZEN_WLAN_BOARD_SPRD)
867 wifi_firmware_download();
869 #if defined TIZEN_WEARABLE
870 err = wifi_power_on_wearable(device_picker_test);
872 err = wifi_power_on();
874 if (device_picker_test == TRUE)
875 netconfig_wifi_enable_device_picker_test();
878 if (err == -EINPROGRESS)
879 netconfig_error_inprogress(context);
880 else if (err == -EALREADY)
881 netconfig_error_already_exists(context);
882 else if (err == -EPERM)
883 netconfig_error_permission_denied(context);
885 netconfig_error_wifi_driver_failed(context);
891 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 0);
892 __netconfig_set_wifi_bssid();
894 wifi_complete_load_driver(wifi, context);
898 gboolean handle_remove_driver(Wifi *wifi, GDBusMethodInvocation *context)
902 DBG("Wi-Fi power off requested");
904 g_return_val_if_fail(wifi != NULL, FALSE);
906 err = wifi_power_off();
908 if (err == -EINPROGRESS)
909 netconfig_error_inprogress(context);
910 else if (err == -EALREADY)
911 netconfig_error_already_exists(context);
912 else if (err == -EPERM)
913 netconfig_error_permission_denied(context);
915 netconfig_error_wifi_driver_failed(context);
919 netconfig_set_vconf_int(VCONF_WIFI_OFF_STATE_BY_AIRPLANE, 0);
921 wifi_complete_remove_driver(wifi, context);
925 gboolean handle_load_p2p_driver(Wifi *wifi, GDBusMethodInvocation *context)
929 wifi_complete_load_p2p_driver(wifi, context);
933 gboolean handle_remove_p2p_driver(Wifi *wifi, GDBusMethodInvocation *context)
937 wifi_complete_remove_p2p_driver(wifi, context);
941 static int __netconfig_get_random_mac(unsigned char *mac_buf, int mac_len)
943 DBG("Generate Random Mac address of ethernet");
947 fp = fopen(OS_RANDOM_FILE, "rb");
950 ERR("Could not open /dev/urandom");
953 rc = fread(mac_buf, 1, mac_len, fp);
957 return rc != mac_len ? -1 : 0;
960 void __netconfig_set_ether_macaddr()
962 DBG("Set wired Mac address ");
963 char *mac_addr = NULL;
964 char rand_addr[WLAN_MAC_ADDR_MAX];
967 mac_addr = vconf_get_str(VCONF_ETH_MAC_ADDRESS);
968 if (mac_addr == NULL) {
969 DBG("vconf_get_str Failed\n");
972 /* Checking Invalid MAC Address */
973 if ((strlen(mac_addr) == 0)) {
974 ERR("Failed to get valid MAC Address from vconf");
975 /*Generate the Random Mac address*/
976 unsigned char rand_mac_add[ETH_MAC_ADDR_SIZE+1];
978 if (__netconfig_get_random_mac(rand_mac_add, ETH_MAC_ADDR_SIZE) == -1) {
980 ERR("Could not generate the Random Mac address");
985 rand_mac_add[0] &= 0xFE; /*Clear multicase bit*/
986 rand_mac_add[0] |= 0x02; /*set local assignment bit*/
988 /*Set the Mac address in Vconf*/
989 snprintf(rand_addr, WLAN_MAC_ADDR_MAX, "%x:%x:%x:%x:%x:%x",
990 rand_mac_add[0], rand_mac_add[1],
991 rand_mac_add[2], rand_mac_add[3],
992 rand_mac_add[4], rand_mac_add[5]);
994 netconfig_set_vconf_str(VCONF_ETH_MAC_ADDRESS, rand_addr);
995 } else { /* Valid MAC address */
996 g_strlcpy(rand_addr, mac_addr, WLAN_MAC_ADDR_MAX);
999 DBG("MAC Address of eth0 [%s]", rand_addr);
1000 const char *path = NET_EXEC_PATH;
1001 char *const args[] = { "/sbin/ifconfig", "eth0", "hw",
1002 "ether", rand_addr, "up", NULL};
1003 char *const envs[] = { NULL };
1004 rv = netconfig_execute_file(path, args, envs);
1007 ERR("Unable to execute system command");