From 28cd59a016382fb18af783544f85284ffbfdc178 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 16 Dec 2016 11:34:29 -0600 Subject: [PATCH] wifi: don't request new PSK for locally-generated WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY errors This usually indicates that the driver missed beacons from the AP, due to driver bugs or faulty power-save management. It doesn't mean that the PSK is wrong. (cherry picked from commit 0c5aa6e48b713a5626c20303c683f7d96ee13184) --- src/devices/wifi/nm-device-wifi.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index c58b3fa875..15ad6e65db 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -1856,6 +1856,7 @@ need_new_8021x_secrets (NMDeviceWifi *self, static gboolean need_new_wpa_psk (NMDeviceWifi *self, guint32 old_state, + gint disconnect_reason, const char **setting_name) { NMSettingWirelessSecurity *s_wsec; @@ -1876,6 +1877,15 @@ need_new_wpa_psk (NMDeviceWifi *self, key_mgmt = nm_setting_wireless_security_get_key_mgmt (s_wsec); if (g_strcmp0 (key_mgmt, "wpa-psk") == 0) { + /* -4 (locally-generated WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY) usually + * means the driver missed beacons from the AP. This usually happens + * due to driver bugs or faulty power-save management. It doesn't + * indicate that the PSK is wrong. + */ + #define LOCAL_WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY -4 + if (disconnect_reason == LOCAL_WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY) + return FALSE; + *setting_name = NM_SETTING_WIRELESS_SECURITY_SETTING_NAME; return TRUE; } @@ -1901,7 +1911,7 @@ handle_8021x_or_psk_auth_fail (NMDeviceWifi *self, g_return_val_if_fail (req != NULL, FALSE); if ( need_new_8021x_secrets (self, old_state, &setting_name) - || need_new_wpa_psk (self, old_state, &setting_name)) { + || need_new_wpa_psk (self, old_state, disconnect_reason, &setting_name)) { nm_act_request_clear_secrets (req);