[arch-projects] [projects][PATCH] wpa_actiond: Wait for three "failed" PONGs before disconnecting

Emil Velikov emil.l.velikov at gmail.com
Mon Oct 23 12:56:17 UTC 2017


On 9 October 2017 at 09:22, Bartłomiej Piotrowski
<bpiotrowski at archlinux.org> wrote:
> On 2017-09-29 15:03, Emil Velikov via arch-projects wrote:
>> On 21 August 2017 at 10:34, Emil Velikov <emil.l.velikov at gmail.com> wrote:
>>> 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 at gmail.com>
>>> ---
>>> Hi all,
>>>
>>> Using [projects] since [wpa_actiond] gets kicked by the email filter.
>>> Can anyone update the message to include a list of supported tags, or
>>> link to an article/wiki with information?
>>>
>>> Back on topic:
>>>
>>> This is a small patch I had for 2 months and I thought about getting
>>> upstreamed.
>>>
>>> In particular - on certain workloads my system can get really low on
>>> memory (and available fds).
>>>
>>> With the patch in place, wpa_actiond no longer kills my connection
>>> although in practise I never seen two consecutive "wpa_supplicant failed
>>> to reply (PONG)" messages.
>>>
>>> My patch could be completely bonkers, so any suggestions how to address
>>> this correctly will be appreciated.
>>> ---
>>>  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;
>>>      }
>>>    }
>>>
>>> --
>> Humble ping anyone?
>>
>> Thanks
>> Emil
>>
>
> I don't think anyone maintains wpa_actiond these days. I will look at
> your change this week, but forking it completely wouldn't be insane.
>
Thanks Bartłomiej.

Forking the project for such trivial corner case seems like an overkill.

To the best of your knowledge, is Arch moving away from this project/package?
Or simply wpa_actiond has reached its peak and development (hence
maintainer) is MIA?

-Emil


More information about the arch-projects mailing list