Fix NULL dereferencing
[platform/core/connectivity/net-config.git] / src / wifi-state.c
index 52db93b..1472718 100755 (executable)
@@ -507,10 +507,19 @@ void wifi_state_update_power_state(const char *interface_name, gboolean powered)
         * It includes Wi-Fi state configuration
         */
        tech_state = wifi_state_get_technology_state(interface_name);
+       if (tech_state == NETCONFIG_WIFI_TECH_UNKNOWN)
+               wifi_state_update_device_list();
 
        if (powered == TRUE) {
                if (tech_state < NETCONFIG_WIFI_TECH_POWERED && netconfig_is_wifi_tethering_on() != TRUE) {
                        DBG("Wi-Fi turned on or waken up from power-save mode");
+                       gchar *mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
+
+                       if (mac_addr != NULL) {
+                               if (strlen(mac_addr) == 0)
+                                       netconfig_set_mac_address_from_file();
+                               g_free(mac_addr);
+                       }
 
                        wifi_state_set_powered(interface_name, TRUE);
                        wifi_state_set_technology_state(interface_name, NETCONFIG_WIFI_TECH_POWERED);
@@ -525,7 +534,7 @@ void wifi_state_update_power_state(const char *interface_name, gboolean powered)
                        netconfig_set_system_event(SYS_EVT_WIFI_STATE, EKEY_WIFI_STATE, EVAL_WIFI_ON);
 
                        netconfig_wifi_bgscan_stop(interface_name);
-                       netconfig_wifi_bgscan_set_interval(interface_name, SCAN_EXPONENTIAL_MIN);
+                       netconfig_wifi_bgscan_set_exp_interval(interface_name, SCAN_EXPONENTIAL_MIN);
                        netconfig_wifi_bgscan_start(interface_name, TRUE);
 
                        /* Add callback to track change in notification setting */
@@ -643,6 +652,8 @@ gboolean wifi_state_update_device_list(void)
                return updated;
        }
 
+       DBG("Wi-Fi g_device_list: %p", g_device_list);
+
        device_list = g_device_list;
        g_device_list = NULL;
 
@@ -691,6 +702,14 @@ gboolean wifi_state_update_device_list(void)
                                                if (g_strcmp0(dev_key, "Powered") == 0) {
                                                        if (device_data) {
                                                                device_data->powered = g_variant_get_boolean(dev_var);
+
+                                                               if (device_data->tech_state == NETCONFIG_WIFI_TECH_UNKNOWN)
+                                                                       device_data->tech_state = NETCONFIG_WIFI_TECH_OFF;
+
+                                                               if (device_data->interface_name)
+                                                                       wifi_state_update_power_state(
+                                                                                       device_data->interface_name, device_data->powered);
+
                                                                if (device_data->powered == TRUE)
                                                                        device_data->tech_state = NETCONFIG_WIFI_TECH_POWERED;
                                                                else
@@ -717,6 +736,9 @@ gboolean wifi_state_update_device_list(void)
 
        g_slist_free_full(device_list, __device_free_data);
 
+       if (network_update_timer_id && updated)
+               netconfig_stop_timer(&network_update_timer_id);
+
        return updated;
 }
 
@@ -791,7 +813,7 @@ void wifi_state_set_service_state(const char *interface_name,
                netconfig_wifi_indicator_stop(interface_name);
 
                netconfig_wifi_bgscan_stop(interface_name);
-               netconfig_wifi_bgscan_set_interval(interface_name, SCAN_EXPONENTIAL_MIN);
+               netconfig_wifi_bgscan_set_exp_interval(interface_name, SCAN_EXPONENTIAL_MIN);
                netconfig_wifi_bgscan_start(interface_name, TRUE);
        } else if ((old_state > NETCONFIG_WIFI_IDLE && old_state < NETCONFIG_WIFI_CONNECTED) && new_state == NETCONFIG_WIFI_IDLE) {
                /* in ipv6 case disconnect/association -> association */
@@ -799,6 +821,11 @@ void wifi_state_set_service_state(const char *interface_name,
 
                netconfig_wifi_bgscan_stop(interface_name);
                netconfig_wifi_bgscan_start(interface_name, TRUE);
+       } else if (old_state == NETCONFIG_WIFI_FAILURE && new_state == NETCONFIG_WIFI_IDLE) {
+               DBG("reset the bg scan period, in failure case");
+               netconfig_wifi_bgscan_stop(interface_name);
+               netconfig_wifi_bgscan_set_exp_interval(interface_name, SCAN_EXPONENTIAL_MIN);
+               netconfig_wifi_bgscan_start(interface_name, FALSE);
        }
 
        _wifi_state_changed(interface_name, new_state);