diff options
author | Mahesh <mahe209069@gmail.com> | 2014-05-14 18:56:15 +0530 |
---|---|---|
committer | Mahesh <mahe209069@gmail.com> | 2014-05-15 19:17:45 +0530 |
commit | ff6902dc4f034d67d6c3cbdddbe04f61913d5b79 (patch) | |
tree | 292ec56e8097dd162f68815d9216b8e660fabade | |
parent | 0ef9a33a471c239824bb3958a99a9dea8a89ee69 (diff) | |
download | hardware_libhardware_legacy-ff6902dc4f034d67d6c3cbdddbe04f61913d5b79.zip hardware_libhardware_legacy-ff6902dc4f034d67d6c3cbdddbe04f61913d5b79.tar.gz hardware_libhardware_legacy-ff6902dc4f034d67d6c3cbdddbe04f61913d5b79.tar.bz2 |
Changes to restart supplicant on crash
specify timeout value in poll to check if the supplicant
connection is active, if not we should indicate
terminate command to framework to restart supplicant.
Change-Id: I8e602b9cb07a13c3f0b96813b2fc89f46457473e
-rw-r--r-- | wifi/wifi.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/wifi/wifi.c b/wifi/wifi.c index 21f4577..5c16e3e 100644 --- a/wifi/wifi.c +++ b/wifi/wifi.c @@ -687,6 +687,18 @@ int wifi_send_command(const char *cmd, char *reply, size_t *reply_len) return 0; } +int wifi_supplicant_connection_active() +{ + char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; + + if (property_get(supplicant_prop_name, supp_status, NULL)) { + if (strcmp(supp_status, "stopped") == 0) + return -1; + } + + return 0; +} + int wifi_ctrl_recv(char *reply, size_t *reply_len) { int res; @@ -698,11 +710,21 @@ int wifi_ctrl_recv(char *reply, size_t *reply_len) rfds[0].events |= POLLIN; rfds[1].fd = exit_sockets[1]; rfds[1].events |= POLLIN; - res = TEMP_FAILURE_RETRY(poll(rfds, 2, -1)); - if (res < 0) { - ALOGE("Error poll = %d", res); - return res; - } + do { + res = TEMP_FAILURE_RETRY(poll(rfds, 2, 30000)); + if (res < 0) { + ALOGE("Error poll = %d", res); + return res; + } else if (res == 0) { + /* timed out, check if supplicant is active + * or not .. + */ + res = wifi_supplicant_connection_active(); + if (res < 0) + return -2; + } + } while (res == 0); + if (rfds[0].revents & POLLIN) { return wpa_ctrl_recv(monitor_conn, reply, reply_len); } |