tests: Wait for AP/GO event in addition to STA

Wait for AP/GO to complete processing before taking the next step in a
test instead of waiting just for STA. This avoids race conditions with
UML time-travel.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2023-12-10 11:33:19 +02:00
parent 8920e03905
commit 9579d4eff9
18 changed files with 245 additions and 35 deletions

View file

@ -492,6 +492,8 @@ def test_radius_das_disconnect(dev, apdev):
params['nas_identifier'] = "nas.example.com"
hapd = hostapd.add_ap(apdev[0], params)
connect(dev[0], "radius-das")
hapd.wait_sta(addr=dev[0].own_addr())
addr = dev[0].p2p_interface_addr()
sta = hapd.get_sta(addr)
id = sta['dot1xAuthSessionId']
@ -622,7 +624,9 @@ def test_radius_das_disconnect(dev, apdev):
send_and_check_reply(srv, req, pyrad.packet.DisconnectACK)
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
dev[0].wait_connected(timeout=10, error="Re-connection timed out")
hapd.wait_sta(addr=dev[0].own_addr())
logger.info("Disconnect-Request with matching Acct-Multi-Session-Id")
sta = hapd.get_sta(addr)
@ -635,7 +639,9 @@ def test_radius_das_disconnect(dev, apdev):
send_and_check_reply(srv, req, pyrad.packet.DisconnectACK)
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
dev[0].wait_connected(timeout=10, error="Re-connection timed out")
hapd.wait_sta(addr=dev[0].own_addr())
logger.info("Disconnect-Request with matching User-Name")
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
@ -645,7 +651,9 @@ def test_radius_das_disconnect(dev, apdev):
send_and_check_reply(srv, req, pyrad.packet.DisconnectACK)
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
dev[0].wait_connected(timeout=10, error="Re-connection timed out")
hapd.wait_sta(addr=dev[0].own_addr())
logger.info("Disconnect-Request with matching Calling-Station-Id")
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
@ -655,12 +663,14 @@ def test_radius_das_disconnect(dev, apdev):
send_and_check_reply(srv, req, pyrad.packet.DisconnectACK)
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
ev = dev[0].wait_event(["CTRL-EVENT-EAP-STARTED", "CTRL-EVENT-CONNECTED"])
if ev is None:
raise Exception("Timeout while waiting for re-connection")
if "CTRL-EVENT-EAP-STARTED" not in ev:
raise Exception("Unexpected skipping of EAP authentication in reconnection")
dev[0].wait_connected(timeout=10, error="Re-connection timed out")
hapd.wait_sta(addr=dev[0].own_addr())
logger.info("Disconnect-Request with matching Calling-Station-Id and non-matching CUI")
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
@ -669,24 +679,30 @@ def test_radius_das_disconnect(dev, apdev):
Event_Timestamp=int(time.time()))
send_and_check_reply(srv, req, pyrad.packet.DisconnectNAK, error_cause=503)
hapd.dump_monitor()
logger.info("Disconnect-Request with matching CUI")
dev[1].connect("radius-das", key_mgmt="WPA-EAP",
eap="GPSK", identity="gpsk-cui",
password="abcdefghijklmnop0123456789abcdef",
scan_freq="2412")
hapd.wait_sta(addr=dev[1].own_addr())
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
Chargeable_User_Identity="gpsk-chargeable-user-identity",
Event_Timestamp=int(time.time()))
send_and_check_reply(srv, req, pyrad.packet.DisconnectACK)
dev[1].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[1].own_addr())
dev[1].wait_connected(timeout=10, error="Re-connection timed out")
hapd.wait_sta(addr=dev[1].own_addr())
ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1)
if ev is not None:
raise Exception("Unexpected disconnection")
connect(dev[2], "radius-das")
hapd.wait_sta(addr=dev[2].own_addr())
logger.info("Disconnect-Request with matching User-Name - multiple sessions matching")
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
@ -704,7 +720,9 @@ def test_radius_das_disconnect(dev, apdev):
send_and_check_reply(srv, req, pyrad.packet.DisconnectACK)
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
dev[0].wait_connected(timeout=10, error="Re-connection timed out")
hapd.wait_sta(addr=dev[0].own_addr())
ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1)
if ev is not None:
@ -715,6 +733,7 @@ def test_radius_das_disconnect(dev, apdev):
multi_sess_id = sta['authMultiSessionId']
dev[0].request("DISCONNECT")
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
NAS_IP_Address="127.0.0.1",
NAS_Identifier="nas.example.com",
@ -727,12 +746,15 @@ def test_radius_das_disconnect(dev, apdev):
if ev is None:
raise Exception("Timeout on EAP start")
dev[0].wait_connected(timeout=15)
hapd.wait_sta(addr=dev[0].own_addr())
logger.info("Disconnect-Request with matching User-Name after disassociation")
dev[0].request("DISCONNECT")
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
dev[2].request("DISCONNECT")
dev[2].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[2].own_addr())
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
NAS_IP_Address="127.0.0.1",
NAS_Identifier="nas.example.com",
@ -756,8 +778,10 @@ def test_radius_das_disconnect(dev, apdev):
if ev is None:
raise Exception("Timeout on EAP start")
dev[0].wait_connected(timeout=15)
hapd.wait_sta(addr=dev[0].own_addr())
dev[0].request("DISCONNECT")
dev[0].wait_disconnected(timeout=10)
hapd.wait_sta_disconnect(addr=dev[0].own_addr())
req = radius_das.DisconnectPacket(dict=dict, secret=b"secret",
NAS_IP_Address="127.0.0.1",
NAS_Identifier="nas.example.com",