mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-01-03 18:52:47 +01:00
netdev: preserve cur_rssi_low across reassociation
Fix an issue with the recent changes to signal monitoring from commit
f456501b
("station: retry roaming unless notified of a high RSSI"):
1. driver sends NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW
2. netdev->cur_rssi_low changes from FALSE to TRUE
3. netdev sends NETDEV_EVENT_RSSI_THRESHOLD_LOW to station
4. on roam reassociation, cur_rssi_low is reset to FALSE
5. station still assumes RSSI is low, periodically roams
until netdev sends NETDEV_EVENT_RSSI_THRESHOLD_HIGH
6. driver sends NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH
7. netdev->cur_rssi_low doesn't change (still FALSE)
8. netdev never sends NETDEV_EVENT_RSSI_THRESHOLD_HIGH
9. station remains stuck in an infinite roaming loop
The commit in question introduced the logic in (5). Previously the
assumption in station was - like in netdev - that if the signal was
still low, the driver would send a duplicate LOW event after
reassociation. This change makes netdev follow the same new logic as
station, i.e. assume the same signal state (LOW/HIGH) until told
otherwise by the driver.
This commit is contained in:
parent
fda4734a1b
commit
a04b61ec77
@ -659,6 +659,7 @@ static void netdev_connect_free(struct netdev *netdev)
|
||||
netdev->in_ft = false;
|
||||
netdev->ignore_connect_event = false;
|
||||
netdev->expect_connect_failure = false;
|
||||
netdev->cur_rssi_low = false;
|
||||
|
||||
if (netdev->connect_cmd) {
|
||||
l_genl_msg_unref(netdev->connect_cmd);
|
||||
@ -2810,7 +2811,6 @@ static int netdev_connect_common(struct netdev *netdev,
|
||||
netdev->handshake = hs;
|
||||
netdev->sm = sm;
|
||||
netdev->frequency = bss->frequency;
|
||||
netdev->cur_rssi_low = false; /* Gets updated on the 1st CQM event */
|
||||
netdev->cur_rssi = bss->signal_strength / 100;
|
||||
netdev_rssi_level_init(netdev);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user