diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-20 07:38:32 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-20 07:38:32 -0800 |
commit | 1c83481e3c1a4e0df017147fdfa7d856dd3012ed (patch) | |
tree | a60e0ed36ef1d3a43530c46562c86c9cd431744c | |
parent | 652994d394bb4dcfae4a98bf591f443037966146 (diff) | |
download | platform_hardware_libhardware_legacy-1c83481e3c1a4e0df017147fdfa7d856dd3012ed.tar.gz platform_hardware_libhardware_legacy-1c83481e3c1a4e0df017147fdfa7d856dd3012ed.tar.bz2 platform_hardware_libhardware_legacy-1c83481e3c1a4e0df017147fdfa7d856dd3012ed.zip |
auto import from //branches/cupcake/...@132569
-rw-r--r-- | wifi/wifi.c | 133 |
1 files changed, 89 insertions, 44 deletions
diff --git a/wifi/wifi.c b/wifi/wifi.c index 91ff4cd..0778e77 100644 --- a/wifi/wifi.c +++ b/wifi/wifi.c @@ -28,6 +28,10 @@ #include "cutils/misc.h" #include "cutils/properties.h" #include "private/android_filesystem_config.h" +#ifdef HAVE_LIBC_SYSTEM_PROPERTIES +#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ +#include <sys/_system_properties.h> +#endif static struct wpa_ctrl *ctrl_conn; static struct wpa_ctrl *monitor_conn; @@ -190,30 +194,6 @@ int wifi_unload_driver() return -1; } -static int control_supplicant(int startIt) -{ - char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; - const char *ctrl_prop = (startIt ? "ctl.start" : "ctl.stop"); - const char *desired_status = (startIt ? "running" : "stopped"); - int count = 200; /* wait at most 20 seconds for completion */ - - if (property_get(SUPP_PROP_NAME, supp_status, NULL) - && strcmp(supp_status, desired_status) == 0) { - return 0; /* supplicant already running */ - } - property_set(ctrl_prop, SUPPLICANT_NAME); - sched_yield(); - - while (count-- > 0) { - if (property_get(SUPP_PROP_NAME, supp_status, NULL)) { - if (strcmp(supp_status, desired_status) == 0) - return 0; - } - usleep(100000); - } - return -1; -} - int ensure_config_file_exists() { char buf[2048]; @@ -265,23 +245,104 @@ int ensure_config_file_exists() int wifi_start_supplicant() { + char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; + int count = 200; /* wait at most 20 seconds for completion */ +#ifdef HAVE_LIBC_SYSTEM_PROPERTIES + const prop_info *pi; + unsigned serial = 0; +#endif + + /* Check whether already running */ + if (property_get(SUPP_PROP_NAME, supp_status, NULL) + && strcmp(supp_status, "running") == 0) { + return 0; + } + /* Before starting the daemon, make sure its config file exists */ if (ensure_config_file_exists() < 0) { LOGE("Wi-Fi will not be enabled"); return -1; } - return control_supplicant(1); + + /* Clear out any stale socket files that might be left over. */ + wpa_ctrl_cleanup(); + +#ifdef HAVE_LIBC_SYSTEM_PROPERTIES + /* + * Get a reference to the status property, so we can distinguish + * the case where it goes stopped => running => stopped (i.e., + * it start up, but fails right away) from the case in which + * it starts in the stopped state and never manages to start + * running at all. + */ + pi = __system_property_find(SUPP_PROP_NAME); + if (pi != NULL) { + serial = pi->serial; + } +#endif + property_set("ctl.start", SUPPLICANT_NAME); + sched_yield(); + + while (count-- > 0) { + #ifdef HAVE_LIBC_SYSTEM_PROPERTIES + if (pi == NULL) { + pi = __system_property_find(SUPP_PROP_NAME); + } + if (pi != NULL) { + __system_property_read(pi, NULL, supp_status); + if (strcmp(supp_status, "running") == 0) { + return 0; + } else if (pi->serial != serial && + strcmp(supp_status, "stopped") == 0) { + return -1; + } + } +#else + if (property_get(SUPP_PROP_NAME, supp_status, NULL)) { + if (strcmp(supp_status, "running") == 0) + return 0; + } +#endif + usleep(100000); + } + return -1; } int wifi_stop_supplicant() { - return control_supplicant(0); + char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; + int count = 50; /* wait at most 5 seconds for completion */ + + /* Check whether supplicant already stopped */ + if (property_get(SUPP_PROP_NAME, supp_status, NULL) + && strcmp(supp_status, "stopped") == 0) { + return 0; + } + + property_set("ctl.stop", SUPPLICANT_NAME); + sched_yield(); + + while (count-- > 0) { + if (property_get(SUPP_PROP_NAME, supp_status, NULL)) { + if (strcmp(supp_status, "stopped") == 0) + return 0; + } + usleep(100000); + } + return -1; } int wifi_connect_to_supplicant() { char ifname[256]; - static int cleaned_up = 0; + char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; + + /* Make sure supplicant is running */ + if (!property_get(SUPP_PROP_NAME, supp_status, NULL) + || strcmp(supp_status, "running") != 0) { + LOGE("Supplicant not running, cannot connect"); + return -1; + } property_get("wifi.interface", iface, "sta"); @@ -293,24 +354,8 @@ int wifi_connect_to_supplicant() ctrl_conn = wpa_ctrl_open(ifname); if (ctrl_conn == NULL) { - LOGD("Unable to open connection to supplicant on \"%s\": %s", + LOGE("Unable to open connection to supplicant on \"%s\": %s", ifname, strerror(errno)); - /* - * errno == ENOENT means the supplicant daemon isn't - * running. Take this opportunity to clear out any - * stale socket files that might be left over. Note - * there's a possible race with the command line client - * trying to connect to the daemon, but it would require - * that the supplicant be started and the command line - * client connect to it during the window between the - * error check and the removal of the files. And in - * any event, the remedy is that the user would simply - * have to run the command line program again. - */ - if (!cleaned_up && (errno == ENOENT || errno == EADDRINUSE)) { - cleaned_up = 1; /* do this just once */ - wpa_ctrl_cleanup(); - } return -1; } monitor_conn = wpa_ctrl_open(ifname); |