---
src/station.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/station.c b/src/station.c
index 38d0757c..d9eb8d09 100644
--- a/src/station.c
+++ b/src/station.c
@@ -2246,6 +2246,8 @@ static void station_roam_scan_triggered(int err, void *user_data)
return;
}
+ station_debug_event(station, "roam-scan-triggered");
+
/*
* Do not update the Scanning property as we won't be updating the
* list of networks.
--
2.31.1
Show replies by date
The crash itself is caused by new roam scans overwriting the previous
scan ID. To simulate this both BSS's are set to very low signal strength
which will cause IWD to attempt a roam but find no better BSS candidates.
IWD will then attempt a roam scan again. During this we kill hostapd which
sends a disconnect and should trigger a crash without the fix.
---
autotests/testPSK-roam/connection_test.py | 2 +
autotests/testPSK-roam/main.conf | 3 +
.../testPSK-roam/roam_ap_disconnect_test.py | 80 +++++++++++++++++++
3 files changed, 85 insertions(+)
create mode 100644 autotests/testPSK-roam/roam_ap_disconnect_test.py
diff --git a/autotests/testPSK-roam/connection_test.py
b/autotests/testPSK-roam/connection_test.py
index 8d9b22ad..92fdeb04 100644
--- a/autotests/testPSK-roam/connection_test.py
+++ b/autotests/testPSK-roam/connection_test.py
@@ -203,6 +203,8 @@ class Test(unittest.TestCase):
def tearDownClass(cls):
IWD.clear_storage()
cls.bss_hostapd = None
+ cls.rule0.enabled = False
+ cls.rule0.remove()
if __name__ == '__main__':
unittest.main(exit=True)
diff --git a/autotests/testPSK-roam/main.conf b/autotests/testPSK-roam/main.conf
index 9452fb6b..3d93ff57 100644
--- a/autotests/testPSK-roam/main.conf
+++ b/autotests/testPSK-roam/main.conf
@@ -1,2 +1,5 @@
[Scan]
DisableMacAddressRandomization=true
+
+[General]
+RoamRetryInterval=1
diff --git a/autotests/testPSK-roam/roam_ap_disconnect_test.py
b/autotests/testPSK-roam/roam_ap_disconnect_test.py
new file mode 100644
index 00000000..eee7077e
--- /dev/null
+++ b/autotests/testPSK-roam/roam_ap_disconnect_test.py
@@ -0,0 +1,80 @@
+#! /usr/bin/python3
+
+import unittest
+import sys, os
+
+sys.path.append('../util')
+from iwd import IWD
+from iwd import NetworkType
+from hwsim import Hwsim
+from hostapd import HostapdCLI
+
+class Test(unittest.TestCase):
+ #
+ # Tests a crash reported where multiple roam scans combined with an AP
+ # disconnect result in a crash getting scan results.
+ #
+ def test_ap_disconnect(self):
+ wd = IWD(True)
+ device = wd.list_devices(1)[0]
+
+ ordered_network = device.get_ordered_network('TestFT', full_scan=True)
+
+ self.assertEqual(ordered_network.type, NetworkType.psk)
+
+ condition = 'not obj.connected'
+ wd.wait_for_object_condition(ordered_network.network_object, condition)
+
+ device.connect_bssid(self.bss_hostapd[0].bssid)
+
+ condition = 'obj.state == DeviceState.connected'
+ wd.wait_for_object_condition(device, condition)
+
+ # Since both BSS's have low signal, the roam should fail and trigger
+ # another roam scan.
+ device.wait_for_event('no-roam-candidates', timeout=30)
+ device.wait_for_event('roam-scan-triggered', timeout=30)
+
+ # Hostapd sends disconnect
+ self.bss_hostapd[0].deauthenticate(device.address)
+
+ # IWD should recover, and not crash
+ condition = 'obj.state == DeviceState.disconnected'
+ wd.wait_for_object_condition(device, condition)
+
+ def tearDown(self):
+ os.system('ip link set "' + self.bss_hostapd[0].ifname + '"
down')
+ os.system('ip link set "' + self.bss_hostapd[1].ifname + '"
down')
+ os.system('ip link set "' + self.bss_hostapd[0].ifname + '"
up')
+ os.system('ip link set "' + self.bss_hostapd[1].ifname + '"
up')
+
+ @classmethod
+ def setUpClass(cls):
+ hwsim = Hwsim()
+
+ IWD.copy_to_storage('TestFT.psk')
+
+ cls.bss_hostapd = [ HostapdCLI(config='ft-psk-ccmp-1.conf'),
+ HostapdCLI(config='ft-psk-ccmp-2.conf') ]
+ cls.bss_hostapd[1].disable()
+
+ cls.bss_hostapd[0].set_value('ocv', '0')
+ cls.bss_hostapd[0].set_value('ieee80211w', '0')
+
+ cls.rule0 = hwsim.rules.create()
+ cls.rule0.source = 'any'
+ cls.rule0.bidirectional = True
+ cls.rule0.signal = -8000
+ cls.rule0.enabled = True
+
+ cls.bss_hostapd[0].reload()
+ cls.bss_hostapd[0].wait_for_event("AP-ENABLED")
+
+ @classmethod
+ def tearDownClass(cls):
+ IWD.clear_storage()
+ cls.bss_hostapd = None
+ cls.rule0.remove()
+
+if __name__ == '__main__':
+ unittest.main(exit=True)
--
2.31.1