wifi: don't autoconnect to networks that have never been successful
authorDan Williams <dcbw@redhat.com>
Thu, 13 Sep 2012 03:54:44 +0000 (22:54 -0500)
committerDan Williams <dcbw@redhat.com>
Thu, 20 Sep 2012 15:11:36 +0000 (10:11 -0500)
If you accidentally click on an wifi network in the menu, and you
don't know the password, and cancel, the connection always stuck
around and was available for autoconnection.  That's annoying, and
it's a few clicks to go delete them.  But better yet, we can
slightly repurpose the 'timestamp' property of connections to
determine whether or not they've been successfully connected in the
past; NM stores timestamps for all connections as of version 0.9.

So if a wifi connection hasn't ever been successful (which means it
has a timestamp in the timestamp cache, but that timestamp is zero),
don't try to autoconnect it.

Preloaded connections without a timestamp will still be autoconnected
at least once (as they always have) because they won't yet have a
timestamp in the timestamp cache.

TODO
src/nm-device-wifi.c

diff --git a/TODO b/TODO
index a2f7ee9..cdea070 100644 (file)
--- a/TODO
+++ b/TODO
@@ -53,38 +53,6 @@ provide Ad-Hoc connection sharing support for those devices and switch between
 Ad-Hoc and AP mode depending on device capabilities.
 
 
-* Reconnect to WiFi Networks Only If They Succeeded Once
-
-Currently, NetworkManager will attempt to connect to a previously attempted
-WiFi network even if that network was never successfully connected to.  This
-causes confusion because sometimes users will randomly try various WiFi networks
-hoping to find an open AP, and then wonder why NM tries to reconnect to any of
-those APs later when none of them worked originally due to AP-side MAC filtering
-or other failures.  What should happen is that NetworkManager should set a flag
-on a connection when that connection is successfully connected at least once,
-and only autoconnect the wifi network if that flag is present *and* the
-NMSettingConnection's 'autoconnect' property is TRUE.
-
-This is a bit tricky because we want to consider all connections that don't have
-this flag as having succeeded so that we don't break users' existing connections,
-while holding all newly created connections to this policy.  This flag should
-be determined and set for all connections, even if we only use it to determine
-WiFi behavior for now.
-
-This flag should be a new gboolean property on the NMSettingConnection object
-called "connect-success", with a default value of TRUE.  It should default to
-TRUE to ensure that existing connections are assumed to have connected
-successfully in the past.  New connections created via the AddConnection and
-AddAndActivateConnection D-Bus method calls should have the 'connect-success'
-property explicitly set to FALSE.  Then, in nm-device.c's device_state_changed()
-function where the NM_DEVICE_STATE_ACTIVATED state is handled, the
-'connect-success' property should be set to TRUE.
-
-For WiFi then, in nm-device-wifi.c's get_best_auto_connection() method, the
-'connect-success' property should be checked and if it is FALSE, the connection
-is not considered for auto-activation.
-
-
 * Implement NM_DEVICE_STATE_DISCONNECTING
 
 To allow for "pre-down" scenarios, this state should be implemented before a
index 6f0cf57..6119c9d 100644 (file)
@@ -1357,6 +1357,7 @@ real_get_best_auto_connection (NMDevice *dev,
                gboolean mac_blacklist_found = FALSE;
                NMSettingIP4Config *s_ip4;
                const char *method = NULL;
+               guint64 timestamp = 0;
 
                s_con = nm_connection_get_setting_connection (connection);
                if (s_con == NULL)
@@ -1366,6 +1367,15 @@ real_get_best_auto_connection (NMDevice *dev,
                if (!nm_setting_connection_get_autoconnect (s_con))
                        continue;
 
+               /* Don't autoconnect to networks that have been tried at least once
+                * but haven't been successful, since these are often accidental choices
+                * from the menu and the user may not know the password.
+                */
+               if (nm_settings_connection_get_timestamp (NM_SETTINGS_CONNECTION (connection), &timestamp)) {
+                       if (timestamp == 0)
+                               continue;
+               }
+
                s_wireless = nm_connection_get_setting_wireless (connection);
                if (!s_wireless)
                        continue;