summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
authorMahesh <mahe209069@gmail.com>2014-05-14 18:56:15 +0530
committerMahesh <mahe209069@gmail.com>2014-05-15 19:17:45 +0530
commitff6902dc4f034d67d6c3cbdddbe04f61913d5b79 (patch)
tree292ec56e8097dd162f68815d9216b8e660fabade /wifi
parent0ef9a33a471c239824bb3958a99a9dea8a89ee69 (diff)
downloadhardware_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
Diffstat (limited to 'wifi')
-rw-r--r--wifi/wifi.c32
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);
}