#define NET_EXEC_PATH "/sbin/ifconfig"
#define OS_RANDOM_FILE "/dev/urandom"
+#define NETCONFIG_TECH_WAITING_INTERVAL 500
+#define NETCONFIG_TECH_WAITING_COUNT 6
+
static gboolean connman_wifi_technology_state = FALSE;
static gboolean wifi_firmware_recovery_mode = FALSE;
static int airplane_mode = 0;
return 0;
}
+static gboolean __check_and_set_technology_enable(gpointer data)
+{
+ static int retry_count = NETCONFIG_TECH_WAITING_COUNT;
+ gboolean value_enable = TRUE;
+ gboolean reply = FALSE;
+ GVariant *param0 = NULL;
+ GVariant *params = NULL;
+ char key[] = "Powered";
+
+ if (wifi_state_is_technology_available() == FALSE) {
+ retry_count--;
+ if (retry_count > 0)
+ return TRUE;
+ }
+
+ param0 = g_variant_new_boolean(value_enable);
+ params = g_variant_new("(sv)", key, param0);
+
+ reply = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
+ CONNMAN_WIFI_TECHNOLOGY_PREFIX,
+ CONNMAN_TECHNOLOGY_INTERFACE,
+ "SetProperty", params, __technology_reply);
+
+ if (reply != TRUE) {
+ ERR("Fail to set technology enable");
+ wifi_state_update_power_state(FALSE);
+
+ retry_count = NETCONFIG_TECH_WAITING_COUNT;
+ return FALSE;
+ }
+
+ retry_count = NETCONFIG_TECH_WAITING_COUNT;
+ return FALSE;
+}
+
static int _set_connman_technology_power(gboolean enable)
{
gboolean reply = FALSE;
if (connman_wifi_technology_state == enable)
return -EALREADY;
+ if (enable && wifi_state_is_technology_available() == FALSE) {
+ netconfig_start_timer(NETCONFIG_TECH_WAITING_INTERVAL,
+ __check_and_set_technology_enable, NULL, NULL);
+ connman_wifi_technology_state = enable;
+ return 0;
+ }
+
if (enable == TRUE)
param0 = g_variant_new_boolean(value_enable);
else
return g_tech_state;
}
+gboolean wifi_state_is_technology_available(void)
+{
+ GVariant *message = NULL;
+ GVariantIter *iter, *next;
+ const char *path;
+ gboolean ret = FALSE;
+
+ message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
+ CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
+ "GetTechnologies", NULL);
+ if (message == NULL) {
+ ERR("Failed to get_technology_state");
+ return FALSE;
+ }
+
+ g_variant_get(message, "(a(oa{sv}))", &iter);
+ while (g_variant_iter_loop(iter, "(oa{sv})", &path, &next)) {
+ if (path != NULL && g_strcmp0(path, CONNMAN_WIFI_TECHNOLOGY_PREFIX) == 0)
+ ret = TRUE;
+ }
+
+ g_variant_unref(message);
+ g_variant_iter_free(iter);
+
+ DBG("Wi-Fi technology is %s", ret ? "available" : "unavailable");
+ return ret;
+}
+
void wifi_state_set_connected_essid(void)
{
__set_wifi_connected_essid();