summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2021-02-05 16:34:04 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2021-02-09 08:55:52 +0100
commit16d649ea92a1c481a59395d8672224e9e40563a3 (patch)
treea9eea672acf1c3fd19151a3d4ac6d3d46d0206cb
parent60800b33b48b3f0d9788b1b7c124c688f8bad815 (diff)
downloadNetworkManager-bg/wifi-scan.tar.gz
wifi: auto-activate devices as soon as the first scan finishesbg/wifi-scan
Currently if we detect that a scan finished in _scan_notify_is_scanning(), we call immediately _scan_kickoff() (which might start a new scan) and then we check again whether the device can autoactivate or whether to remove the wifi-scan pending action. This means that if the scan takes long enough, when _scan_notify_is_scanning() is called, it is already time to start another scan and the device activation will be delayed. It will be delayed until the scan duration becomes shorter than the exponentially-growing periodic scan interval. Fix this by delaying the next scan immediately after a scan result. Co-authored-by: Thomas Haller <thaller@redhat.com> https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/574
-rw-r--r--src/core/devices/wifi/nm-device-wifi.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/core/devices/wifi/nm-device-wifi.c b/src/core/devices/wifi/nm-device-wifi.c
index 6375412ce8..d9fdb4cc68 100644
--- a/src/core/devices/wifi/nm-device-wifi.c
+++ b/src/core/devices/wifi/nm-device-wifi.c
@@ -1745,6 +1745,23 @@ _scan_kickoff(NMDeviceWifi *self)
return;
}
+ if (priv->scan_last_complete_msec + 200 > now_msec) {
+ gint32 timeout_msec = priv->scan_last_complete_msec + 200 - now_msec;
+
+ /* after a scan just completed, it is ratelimited for another 200 msec. This is in
+ * addition to our rate limiting above (where scanning can take longer than our rate limit
+ * duration).
+ *
+ * This gives the device a chance to autoconnect. Also, if a scanning just completed,
+ * we want to back off a bit before starting again. */
+ _LOGT_scan("kickoff: don't scan (rate limited for another %d.%03d sec after previous scan)",
+ timeout_msec / 1000,
+ timeout_msec % 1000);
+ nm_clear_g_source(&priv->scan_kickoff_timeout_id);
+ priv->scan_kickoff_timeout_id = g_timeout_add(timeout_msec, _scan_kickoff_timeout_cb, self);
+ return;
+ }
+
if (priv->scan_explicit_requested) {
if (!priv->scan_explicit_allowed) {
_LOGT_scan("kickoff: don't scan (explicit scan requested but not allowed)");