File nm-fix-always-prompt-for-new-password.patch of Package NetworkManager.4192

Index: NetworkManager-1.0.12/src/devices/wifi/nm-device-wifi.c
===================================================================
--- NetworkManager-1.0.12.orig/src/devices/wifi/nm-device-wifi.c
+++ NetworkManager-1.0.12/src/devices/wifi/nm-device-wifi.c
@@ -2218,6 +2218,7 @@ need_new_8021x_secrets (NMDeviceWifi *se
 static gboolean
 need_new_wpa_psk (NMDeviceWifi *self,
                   guint32 old_state,
+                  gint disconnect_reason,
                   const char **setting_name)
 {
 	NMSettingWirelessSecurity *s_wsec;
@@ -2238,6 +2239,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;
 	}
@@ -2267,7 +2277,7 @@ handle_8021x_or_psk_auth_fail (NMDeviceW
 	g_assert (connection);
 
 	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_connection_clear_secrets (connection);