diff options
Diffstat (limited to 'testing/wpa_actiond/wait-for-three-failed-PONGs-before-disco.patch')
-rw-r--r-- | testing/wpa_actiond/wait-for-three-failed-PONGs-before-disco.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/testing/wpa_actiond/wait-for-three-failed-PONGs-before-disco.patch b/testing/wpa_actiond/wait-for-three-failed-PONGs-before-disco.patch new file mode 100644 index 00000000000..3e0f22b68ad --- /dev/null +++ b/testing/wpa_actiond/wait-for-three-failed-PONGs-before-disco.patch @@ -0,0 +1,72 @@ +From 8b74c8b3f69e501560e5f0c25cbcbc4aefcbc0ed Mon Sep 17 00:00:00 2001 +From: Emil Velikov <emil.l.velikov@gmail.com> +Date: Mon, 21 Aug 2017 11:34:00 +0200 +Subject: [PATCH] wpa_actiond: Wait for three "failed" PONGs before + disconnecting + +When the system is very low on resources, select() may return 0 even +when wpa_supplicant is alive and kicking. + +Don't disconnect as soon at that occurs - wait three times and clearly +log it. + +Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com> +--- + wpa_actiond.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/wpa_actiond.c b/wpa_actiond.c +index d60d885..03a9d7f 100644 +--- a/wpa_actiond.c ++++ b/wpa_actiond.c +@@ -292,6 +292,7 @@ static void loop(const char *iface, const char *ctrlpath, const int disconnect_t + /* path to control socket */ + char *ctrlsock = NULL; + int ctrlsocklen; ++ int pong_failures = 0; + + ssid[0] = '\0'; + old_ssid[0] = '\0'; +@@ -359,6 +360,7 @@ static void loop(const char *iface, const char *ctrlpath, const int disconnect_t + } + logevent(WPA_ACTIOND_LOG_TERMINATE, iface, ""); + state = WPA_ACTIOND_STATE_TERMINATED; ++ pong_failures = 0; + break; + case 0: + if (state == WPA_ACTIOND_STATE_CONNECTION_LOST) { +@@ -372,8 +374,15 @@ static void loop(const char *iface, const char *ctrlpath, const int disconnect_t + reply_len = 0; + reply[reply_len] = '\0'; + if(!str_match(reply, "PONG")) { ++ if (pong_failures <= 3) { ++ logevent(WPA_ACTIOND_LOG_CUSTOM_ERROR, iface, "wpa_supplicant failed to reply (PONG)"); ++ pong_failures++; ++ break; ++ } ++ + /* supplicant has been terminated */ + if(state == WPA_ACTIOND_STATE_CONNECTED || state == WPA_ACTIOND_STATE_CONNECTION_LOST) { ++ logevent(WPA_ACTIOND_LOG_CUSTOM_ERROR, iface, "wpa_supplicant failed to reply three times in a row - disconnecting"); + logevent(WPA_ACTIOND_LOG_DISCONNECTED, iface, ssid); + action(WPA_ACTIOND_ACTION_DISCONNECT, iface, ssid, idstr, wpa_ctrl_get_fd(ctrl), script); + } +@@ -381,6 +390,7 @@ static void loop(const char *iface, const char *ctrlpath, const int disconnect_t + state = WPA_ACTIOND_STATE_TERMINATED; + } + } ++ pong_failures = 0; + break; + default: + /* event received */ +@@ -446,6 +456,7 @@ static void loop(const char *iface, const char *ctrlpath, const int disconnect_t + /* we are not interested in this event */ + break; + } ++ pong_failures = 0; + } + } + +-- +2.15.0 + |