tests: Add connecting-while-CSA tests

Add a few tests to validate what happens with connections
while an AP is doing CSA:
 - quiet to diff channel (shouldn't connect)
 - quiet to same channel (shouldn't connect)
 - non-quiet to diff channel (shouldn't connect)
 - non-quiet to same channel (should connect)

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2024-03-28 14:06:59 +01:00 committed by Jouni Malinen
parent d43eb71da7
commit 41fd49958d

View file

@ -193,3 +193,67 @@ def test_ap_csa_disable(dev, apdev):
ap.enable() ap.enable()
dev[0].wait_disconnected() dev[0].wait_disconnected()
dev[0].wait_connected() dev[0].wait_connected()
def _assoc_while_csa(dev, apdev, freq_to, blocktx):
params = {
"ssid": "ap-csa",
"hw_mode": "a",
"country_code": "FI",
"channel": "36",
"ieee80211n": "0",
}
ap = hostapd.add_ap(apdev[0], params)
count = 100 if blocktx else 20
delay = 1 + count / 10
cmd = f"CHAN_SWITCH {count} {freq_to}"
if blocktx:
cmd += " blocktx"
ap.request(cmd)
ev = ap.wait_event(["CTRL-EVENT-STARTED-CHANNEL-SWITCH"], timeout=10)
if ev is None:
raise Exception("Channel switch start event not seen")
if f"freq={freq_to}" not in ev:
raise Exception("Unexpected channel in CS started event")
try:
dev[0].connect("ap-csa", key_mgmt="NONE", scan_freq="5180",
wait_connect=False)
if blocktx or freq_to != 5180:
ev = dev[0].wait_event(["CTRL-EVENT-SSID-TEMP-DISABLED",
"CTRL-EVENT-CONNECTED"], timeout=9)
if not ev: # this is fine, at least we didn't connect
return
if not "CTRL-EVENT-SSID-TEMP-DISABLED" in ev:
raise Exception("Erroneously connected!")
if not 'auth_failures=1' in ev:
raise Exception(f'Should have auth failures in "{ev}"')
# wait for CSA to finish and connect then
time.sleep(delay)
dev[0].connect("ap-csa", key_mgmt="NONE", scan_freq=str(freq_to))
else:
dev[0].wait_connected()
if freq_to != 5180:
wait_channel_switch(dev[0], freq_to)
finally:
dev[0].request("DISCONNECT")
dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1)
clear_regdom(ap, dev)
@long_duration_test
def test_assoc_while_csa_same_blocktx(dev, apdev):
"""Check we don't associate while AP is doing quiet CSA (same channel)"""
_assoc_while_csa(dev, apdev, 5180, True)
def test_assoc_while_csa_same(dev, apdev):
"""Check we _do_ associate while AP is doing CSA (same channel)"""
_assoc_while_csa(dev, apdev, 5180, False)
@long_duration_test
def test_assoc_while_csa_diff_blocktx(dev, apdev):
"""Check we don't associate while AP is doing quiet CSA (different channel)"""
_assoc_while_csa(dev, apdev, 5200, True)
@long_duration_test
def test_assoc_while_csa_diff(dev, apdev):
"""Check we don't associate while AP is doing CSA (different channel)"""
_assoc_while_csa(dev, apdev, 5200, False)