tests: Wait for hostapd event in addition to wpa_supplicant

Wait for hostapd to complete processing before taking the next step in a
test instead of waiting just for wpa_supplicant. 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-09 13:04:14 +02:00
parent 37a7b14dd9
commit b0fc0154f5
18 changed files with 153 additions and 31 deletions

View file

@ -294,12 +294,27 @@ class Hostapd:
break break
return None return None
def wait_sta(self, addr=None, timeout=2): def wait_sta(self, addr=None, timeout=2, wait_4way_hs=False):
ev = self.wait_event(["AP-STA-CONNECT"], timeout=timeout) ev = self.wait_event(["AP-STA-CONNECT"], timeout=timeout)
if ev is None: if ev is None:
raise Exception("AP did not report STA connection") raise Exception("AP did not report STA connection")
if addr and addr not in ev: if addr and addr not in ev:
raise Exception("Unexpected STA address in connection event: " + ev) raise Exception("Unexpected STA address in connection event: " + ev)
if wait_4way_hs:
ev2 = self.wait_event(["EAPOL-4WAY-HS-COMPLETED"],
timeout=timeout)
if ev2 is None:
raise Exception("AP did not report 4-way handshake completion")
if addr and addr not in ev2:
raise Exception("Unexpected STA address in 4-way handshake completion event: " + ev2)
return ev
def wait_sta_disconnect(self, addr=None, timeout=2):
ev = self.wait_event(["AP-STA-DISCONNECT"], timeout=timeout)
if ev is None:
raise Exception("AP did not report STA disconnection")
if addr and addr not in ev:
raise Exception("Unexpected STA address in disconnection event: " + ev)
return ev return ev
def wait_ptkinitdone(self, addr, timeout=2): def wait_ptkinitdone(self, addr, timeout=2):

View file

@ -205,6 +205,7 @@ def connect_cli(go, client, social=False, freq=None):
res = client.p2p_connect_group(go.p2p_dev_addr(), pin, timeout=60, res = client.p2p_connect_group(go.p2p_dev_addr(), pin, timeout=60,
social=social, freq=freq) social=social, freq=freq)
logger.info("Client connected") logger.info("Client connected")
go.wait_sta(client.p2p_interface_addr())
hwsim_utils.test_connectivity_p2p(go, client) hwsim_utils.test_connectivity_p2p(go, client)
return res return res
@ -295,6 +296,12 @@ def go_neg_pin_authorized(i_dev, r_dev, i_intent=None, r_intent=None,
r_res = r_dev.p2p_go_neg_auth_result(expect_failure=expect_failure) r_res = r_dev.p2p_go_neg_auth_result(expect_failure=expect_failure)
logger.debug("i_res: " + str(i_res)) logger.debug("i_res: " + str(i_res))
logger.debug("r_res: " + str(r_res)) logger.debug("r_res: " + str(r_res))
if not expect_failure and i_res and r_res and \
i_res['result'] == 'success' and r_res['result'] == 'success':
if i_res['role'] == 'GO':
i_dev.wait_sta(addr=r_dev.p2p_interface_addr())
if r_res['role'] == 'GO':
r_dev.wait_sta(addr=i_dev.p2p_interface_addr())
r_dev.dump_monitor() r_dev.dump_monitor()
i_dev.dump_monitor() i_dev.dump_monitor()
if i_go_neg_status: if i_go_neg_status:

View file

@ -1259,12 +1259,18 @@ def test_ap_wpa2_eap_aka_sql(dev, apdev, params):
logger.info("AKA fast re-authentication") logger.info("AKA fast re-authentication")
eap_reauth(dev[0], "AKA") eap_reauth(dev[0], "AKA")
ev = hapd.wait_event(["EAPOL-4WAY-HS-COMPLETED"], timeout=1)
if ev is None:
raise Exception("hostapd did not report 4-way handshake completion")
logger.info("AKA full auth with pseudonym") logger.info("AKA full auth with pseudonym")
with con: with con:
cur = con.cursor() cur = con.cursor()
cur.execute("DELETE FROM reauth WHERE permanent='0232010000000000'") cur.execute("DELETE FROM reauth WHERE permanent='0232010000000000'")
eap_reauth(dev[0], "AKA") eap_reauth(dev[0], "AKA")
ev = hapd.wait_event(["EAPOL-4WAY-HS-COMPLETED"], timeout=1)
if ev is None:
raise Exception("hostapd did not report 4-way handshake completion")
logger.info("AKA full auth with permanent identity") logger.info("AKA full auth with permanent identity")
with con: with con:
@ -1272,6 +1278,9 @@ def test_ap_wpa2_eap_aka_sql(dev, apdev, params):
cur.execute("DELETE FROM reauth WHERE permanent='0232010000000000'") cur.execute("DELETE FROM reauth WHERE permanent='0232010000000000'")
cur.execute("DELETE FROM pseudonyms WHERE permanent='0232010000000000'") cur.execute("DELETE FROM pseudonyms WHERE permanent='0232010000000000'")
eap_reauth(dev[0], "AKA") eap_reauth(dev[0], "AKA")
ev = hapd.wait_event(["EAPOL-4WAY-HS-COMPLETED"], timeout=1)
if ev is None:
raise Exception("hostapd did not report 4-way handshake completion")
logger.info("AKA reauth with mismatching MK") logger.info("AKA reauth with mismatching MK")
with con: with con:
@ -1286,12 +1295,20 @@ def test_ap_wpa2_eap_aka_sql(dev, apdev, params):
cur = con.cursor() cur = con.cursor()
cur.execute("UPDATE reauth SET counter='10' WHERE permanent='0232010000000000'") cur.execute("UPDATE reauth SET counter='10' WHERE permanent='0232010000000000'")
eap_reauth(dev[0], "AKA") eap_reauth(dev[0], "AKA")
ev = hapd.wait_event(["EAPOL-4WAY-HS-COMPLETED"], timeout=1)
if ev is None:
raise Exception("hostapd did not report 4-way handshake completion")
with con: with con:
cur = con.cursor() cur = con.cursor()
cur.execute("UPDATE reauth SET counter='10' WHERE permanent='0232010000000000'") cur.execute("UPDATE reauth SET counter='10' WHERE permanent='0232010000000000'")
logger.info("AKA reauth with mismatching counter") logger.info("AKA reauth with mismatching counter")
eap_reauth(dev[0], "AKA") eap_reauth(dev[0], "AKA")
ev = hapd.wait_event(["EAPOL-4WAY-HS-COMPLETED"], timeout=1)
if ev is None:
raise Exception("hostapd did not report 4-way handshake completion")
dev[0].request("REMOVE_NETWORK all") dev[0].request("REMOVE_NETWORK all")
dev[0].wait_disconnected()
hapd.wait_sta_disconnect()
eap_connect(dev[0], hapd, "AKA", "0232010000000000", eap_connect(dev[0], hapd, "AKA", "0232010000000000",
password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123")
@ -1300,6 +1317,9 @@ def test_ap_wpa2_eap_aka_sql(dev, apdev, params):
cur.execute("UPDATE reauth SET counter='1001' WHERE permanent='0232010000000000'") cur.execute("UPDATE reauth SET counter='1001' WHERE permanent='0232010000000000'")
logger.info("AKA reauth with max reauth count reached") logger.info("AKA reauth with max reauth count reached")
eap_reauth(dev[0], "AKA") eap_reauth(dev[0], "AKA")
ev = hapd.wait_event(["EAPOL-4WAY-HS-COMPLETED"], timeout=1)
if ev is None:
raise Exception("hostapd did not report 4-way handshake completion")
def test_ap_wpa2_eap_aka_sql_fallback_to_pseudonym_id(dev, apdev, params): def test_ap_wpa2_eap_aka_sql_fallback_to_pseudonym_id(dev, apdev, params):
"""WPA2-Enterprise connection using EAP-AKA (SQL) and fallback to pseudonym using AKA-Identity""" """WPA2-Enterprise connection using EAP-AKA (SQL) and fallback to pseudonym using AKA-Identity"""

View file

@ -55,15 +55,19 @@ def hs20_ap_params(ssid="test-hs20"):
params['anqp_3gpp_cell_net'] = "244,91" params['anqp_3gpp_cell_net'] = "244,91"
return params return params
def check_auto_select(dev, bssid): def check_auto_select(dev, bssid, hapd=None):
dev.scan_for_bss(bssid, freq="2412") dev.scan_for_bss(bssid, freq="2412")
dev.request("INTERWORKING_SELECT auto freq=2412") dev.request("INTERWORKING_SELECT auto freq=2412")
ev = dev.wait_connected(timeout=15) ev = dev.wait_connected(timeout=15)
if bssid not in ev: if bssid not in ev:
raise Exception("Connected to incorrect network") raise Exception("Connected to incorrect network")
if hapd:
hapd.wait_sta()
dev.request("REMOVE_NETWORK all") dev.request("REMOVE_NETWORK all")
dev.wait_disconnected() dev.wait_disconnected()
dev.dump_monitor() dev.dump_monitor()
if hapd:
hapd.wait_sta_disconnect()
def interworking_select(dev, bssid, type=None, no_match=False, freq=None): def interworking_select(dev, bssid, type=None, no_match=False, freq=None):
dev.dump_monitor() dev.dump_monitor()
@ -1485,7 +1489,7 @@ def test_ap_hs20_gas_while_associated(dev, apdev):
bssid = apdev[0]['bssid'] bssid = apdev[0]['bssid']
params = hs20_ap_params() params = hs20_ap_params()
params['hessid'] = bssid params['hessid'] = bssid
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].hs20_enable() dev[0].hs20_enable()
id = dev[0].add_cred_values({'realm': "example.com", id = dev[0].add_cred_values({'realm': "example.com",
@ -1495,6 +1499,7 @@ def test_ap_hs20_gas_while_associated(dev, apdev):
'domain': "example.com"}) 'domain': "example.com"})
interworking_select(dev[0], bssid, "home", freq="2412") interworking_select(dev[0], bssid, "home", freq="2412")
interworking_connect(dev[0], bssid, "TTLS") interworking_connect(dev[0], bssid, "TTLS")
hapd.wait_sta()
logger.info("Verifying GAS query while associated") logger.info("Verifying GAS query while associated")
dev[0].request("FETCH_ANQP") dev[0].request("FETCH_ANQP")
@ -1509,7 +1514,7 @@ def test_ap_hs20_gas_with_another_ap_while_associated(dev, apdev):
bssid = apdev[0]['bssid'] bssid = apdev[0]['bssid']
params = hs20_ap_params() params = hs20_ap_params()
params['hessid'] = bssid params['hessid'] = bssid
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
bssid2 = apdev[1]['bssid'] bssid2 = apdev[1]['bssid']
params = hs20_ap_params() params = hs20_ap_params()
@ -1525,6 +1530,7 @@ def test_ap_hs20_gas_with_another_ap_while_associated(dev, apdev):
'domain': "example.com"}) 'domain': "example.com"})
interworking_select(dev[0], bssid, "home", freq="2412") interworking_select(dev[0], bssid, "home", freq="2412")
interworking_connect(dev[0], bssid, "TTLS") interworking_connect(dev[0], bssid, "TTLS")
hapd.wait_sta()
dev[0].dump_monitor() dev[0].dump_monitor()
logger.info("Verifying GAS query with same AP while associated") logger.info("Verifying GAS query with same AP while associated")
@ -2253,7 +2259,7 @@ def test_ap_hs20_req_conn_capab(dev, apdev):
check_eap_capa(dev[0], "MSCHAPV2") check_eap_capa(dev[0], "MSCHAPV2")
bssid = apdev[0]['bssid'] bssid = apdev[0]['bssid']
params = hs20_ap_params() params = hs20_ap_params()
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].hs20_enable() dev[0].hs20_enable()
dev[0].scan_for_bss(bssid, freq="2412") dev[0].scan_for_bss(bssid, freq="2412")
@ -2269,7 +2275,7 @@ def test_ap_hs20_req_conn_capab(dev, apdev):
check_conn_capab_selection(dev[0], "roaming", True) check_conn_capab_selection(dev[0], "roaming", True)
logger.info("Verify that req_conn_capab does not prevent connection if no other network is available") logger.info("Verify that req_conn_capab does not prevent connection if no other network is available")
check_auto_select(dev[0], bssid) check_auto_select(dev[0], bssid, hapd=hapd)
logger.info("Additional req_conn_capab checks") logger.info("Additional req_conn_capab checks")
@ -2324,25 +2330,25 @@ def test_ap_hs20_req_conn_capab_and_roaming_partner_preference(dev, apdev):
params = hs20_ap_params() params = hs20_ap_params()
params['domain_name'] = "roaming.example.org" params['domain_name'] = "roaming.example.org"
params['hs20_conn_capab'] = ["1:0:2", "6:22:1", "17:5060:0", "50:0:1"] params['hs20_conn_capab'] = ["1:0:2", "6:22:1", "17:5060:0", "50:0:1"]
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
bssid2 = apdev[1]['bssid'] bssid2 = apdev[1]['bssid']
params = hs20_ap_params(ssid="test-hs20-b") params = hs20_ap_params(ssid="test-hs20-b")
params['domain_name'] = "roaming.example.net" params['domain_name'] = "roaming.example.net"
hostapd.add_ap(apdev[1], params) hapd2 = hostapd.add_ap(apdev[1], params)
values = default_cred() values = default_cred()
values['roaming_partner'] = "roaming.example.net,1,127,*" values['roaming_partner'] = "roaming.example.net,1,127,*"
id = dev[0].add_cred_values(values) id = dev[0].add_cred_values(values)
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
dev[0].set_cred(id, "req_conn_capab", "50") dev[0].set_cred(id, "req_conn_capab", "50")
check_auto_select(dev[0], bssid) check_auto_select(dev[0], bssid, hapd=hapd)
dev[0].remove_cred(id) dev[0].remove_cred(id)
id = dev[0].add_cred_values(values) id = dev[0].add_cred_values(values)
dev[0].set_cred(id, "req_conn_capab", "51") dev[0].set_cred(id, "req_conn_capab", "51")
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
def check_bandwidth_selection(dev, type, below): def check_bandwidth_selection(dev, type, below):
dev.request("INTERWORKING_SELECT freq=2412") dev.request("INTERWORKING_SELECT freq=2412")
@ -2374,7 +2380,7 @@ def test_ap_hs20_min_bandwidth_home(dev, apdev):
check_eap_capa(dev[0], "MSCHAPV2") check_eap_capa(dev[0], "MSCHAPV2")
bssid = apdev[0]['bssid'] bssid = apdev[0]['bssid']
params = hs20_ap_params() params = hs20_ap_params()
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].hs20_enable() dev[0].hs20_enable()
dev[0].scan_for_bss(bssid, freq="2412") dev[0].scan_for_bss(bssid, freq="2412")
@ -2396,14 +2402,14 @@ def test_ap_hs20_min_bandwidth_home(dev, apdev):
values = bw_cred(domain="example.com", dl_home=5491, ul_home=59) values = bw_cred(domain="example.com", dl_home=5491, ul_home=59)
id = dev[0].add_cred_values(values) id = dev[0].add_cred_values(values)
check_bandwidth_selection(dev[0], "home", True) check_bandwidth_selection(dev[0], "home", True)
check_auto_select(dev[0], bssid) check_auto_select(dev[0], bssid, hapd=hapd)
bssid2 = apdev[1]['bssid'] bssid2 = apdev[1]['bssid']
params = hs20_ap_params(ssid="test-hs20-b") params = hs20_ap_params(ssid="test-hs20-b")
params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000" params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
hostapd.add_ap(apdev[1], params) hapd2 = hostapd.add_ap(apdev[1], params)
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
def test_ap_hs20_min_bandwidth_home2(dev, apdev): def test_ap_hs20_min_bandwidth_home2(dev, apdev):
"""Hotspot 2.0 network selection with min bandwidth - special cases""" """Hotspot 2.0 network selection with min bandwidth - special cases"""
@ -2446,7 +2452,7 @@ def test_ap_hs20_min_bandwidth_home_hidden_ssid_in_scan_res(dev, apdev):
hapd_global.remove(apdev[0]['ifname']) hapd_global.remove(apdev[0]['ifname'])
params = hs20_ap_params() params = hs20_ap_params()
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].hs20_enable() dev[0].hs20_enable()
dev[0].scan_for_bss(bssid, freq="2412") dev[0].scan_for_bss(bssid, freq="2412")
@ -2468,14 +2474,14 @@ def test_ap_hs20_min_bandwidth_home_hidden_ssid_in_scan_res(dev, apdev):
values = bw_cred(domain="example.com", dl_home=5491, ul_home=59) values = bw_cred(domain="example.com", dl_home=5491, ul_home=59)
id = dev[0].add_cred_values(values) id = dev[0].add_cred_values(values)
check_bandwidth_selection(dev[0], "home", True) check_bandwidth_selection(dev[0], "home", True)
check_auto_select(dev[0], bssid) check_auto_select(dev[0], bssid, hapd=hapd)
bssid2 = apdev[1]['bssid'] bssid2 = apdev[1]['bssid']
params = hs20_ap_params(ssid="test-hs20-b") params = hs20_ap_params(ssid="test-hs20-b")
params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000" params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
hostapd.add_ap(apdev[1], params) hapd2 = hostapd.add_ap(apdev[1], params)
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
dev[0].flush_scan_cache() dev[0].flush_scan_cache()
@ -2484,7 +2490,7 @@ def test_ap_hs20_min_bandwidth_roaming(dev, apdev):
check_eap_capa(dev[0], "MSCHAPV2") check_eap_capa(dev[0], "MSCHAPV2")
bssid = apdev[0]['bssid'] bssid = apdev[0]['bssid']
params = hs20_ap_params() params = hs20_ap_params()
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].hs20_enable() dev[0].hs20_enable()
dev[0].scan_for_bss(bssid, freq="2412") dev[0].scan_for_bss(bssid, freq="2412")
@ -2506,14 +2512,14 @@ def test_ap_hs20_min_bandwidth_roaming(dev, apdev):
values = bw_cred(domain="example.org", dl_roaming=5491, ul_roaming=59) values = bw_cred(domain="example.org", dl_roaming=5491, ul_roaming=59)
id = dev[0].add_cred_values(values) id = dev[0].add_cred_values(values)
check_bandwidth_selection(dev[0], "roaming", True) check_bandwidth_selection(dev[0], "roaming", True)
check_auto_select(dev[0], bssid) check_auto_select(dev[0], bssid, hapd=hapd)
bssid2 = apdev[1]['bssid'] bssid2 = apdev[1]['bssid']
params = hs20_ap_params(ssid="test-hs20-b") params = hs20_ap_params(ssid="test-hs20-b")
params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000" params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
hostapd.add_ap(apdev[1], params) hapd2 = hostapd.add_ap(apdev[1], params)
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
def test_ap_hs20_min_bandwidth_and_roaming_partner_preference(dev, apdev): def test_ap_hs20_min_bandwidth_and_roaming_partner_preference(dev, apdev):
"""Hotspot 2.0 and minimum bandwidth with roaming partner preference""" """Hotspot 2.0 and minimum bandwidth with roaming partner preference"""
@ -2522,23 +2528,23 @@ def test_ap_hs20_min_bandwidth_and_roaming_partner_preference(dev, apdev):
params = hs20_ap_params() params = hs20_ap_params()
params['domain_name'] = "roaming.example.org" params['domain_name'] = "roaming.example.org"
params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000" params['hs20_wan_metrics'] = "01:8000:1000:1:1:3000"
hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
bssid2 = apdev[1]['bssid'] bssid2 = apdev[1]['bssid']
params = hs20_ap_params(ssid="test-hs20-b") params = hs20_ap_params(ssid="test-hs20-b")
params['domain_name'] = "roaming.example.net" params['domain_name'] = "roaming.example.net"
hostapd.add_ap(apdev[1], params) hapd2 = hostapd.add_ap(apdev[1], params)
values = default_cred() values = default_cred()
values['roaming_partner'] = "roaming.example.net,1,127,*" values['roaming_partner'] = "roaming.example.net,1,127,*"
id = dev[0].add_cred_values(values) id = dev[0].add_cred_values(values)
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
dev[0].set_cred(id, "min_dl_bandwidth_roaming", "6000") dev[0].set_cred(id, "min_dl_bandwidth_roaming", "6000")
check_auto_select(dev[0], bssid) check_auto_select(dev[0], bssid, hapd=hapd)
dev[0].set_cred(id, "min_dl_bandwidth_roaming", "10000") dev[0].set_cred(id, "min_dl_bandwidth_roaming", "10000")
check_auto_select(dev[0], bssid2) check_auto_select(dev[0], bssid2, hapd=hapd2)
def test_ap_hs20_min_bandwidth_no_wan_metrics(dev, apdev): def test_ap_hs20_min_bandwidth_no_wan_metrics(dev, apdev):
"""Hotspot 2.0 network selection with min bandwidth but no WAN Metrics""" """Hotspot 2.0 network selection with min bandwidth but no WAN Metrics"""

View file

@ -646,8 +646,8 @@ def test_ap_wpa2_bridge_fdb(dev, apdev):
bssid=apdev[0]['bssid']) bssid=apdev[0]['bssid'])
dev[1].connect(ssid, psk=passphrase, scan_freq="2412", dev[1].connect(ssid, psk=passphrase, scan_freq="2412",
bssid=apdev[0]['bssid']) bssid=apdev[0]['bssid'])
hapd.wait_sta() hapd.wait_sta(wait_4way_hs=True)
hapd.wait_sta() hapd.wait_sta(wait_4way_hs=True)
addr0 = dev[0].p2p_interface_addr() addr0 = dev[0].p2p_interface_addr()
hwsim_utils.test_connectivity_sta(dev[0], dev[1]) hwsim_utils.test_connectivity_sta(dev[0], dev[1])
err, macs1 = hapd.cmd_execute(['brctl', 'showmacs', 'ap-br0']) err, macs1 = hapd.cmd_execute(['brctl', 'showmacs', 'ap-br0'])

View file

@ -45,6 +45,7 @@ def test_ap_qosmap(dev, apdev):
params['qos_map_set'] = '53,2,22,6,8,15,0,7,255,255,16,31,32,39,255,255,40,47,48,55' params['qos_map_set'] = '53,2,22,6,8,15,0,7,255,255,16,31,32,39,255,255,40,47,48,55'
hapd = hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412") dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412")
hapd.wait_sta()
time.sleep(0.1) time.sleep(0.1)
addr = dev[0].p2p_interface_addr() addr = dev[0].p2p_interface_addr()
dev[0].request("DATA_TEST_CONFIG 1") dev[0].request("DATA_TEST_CONFIG 1")
@ -82,6 +83,8 @@ def test_ap_qosmap_default(dev, apdev):
params = {"ssid": ssid} params = {"ssid": ssid}
hapd = hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412") dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412")
hapd.wait_sta()
time.sleep(0.1)
addr = dev[0].p2p_interface_addr() addr = dev[0].p2p_interface_addr()
dev[0].request("DATA_TEST_CONFIG 1") dev[0].request("DATA_TEST_CONFIG 1")
hapd.request("DATA_TEST_CONFIG 1") hapd.request("DATA_TEST_CONFIG 1")
@ -119,6 +122,8 @@ def test_ap_qosmap_default_acm(dev, apdev):
hapd = hostapd.add_ap(apdev[0], params) hapd = hostapd.add_ap(apdev[0], params)
dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412") dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412")
addr = dev[0].p2p_interface_addr() addr = dev[0].p2p_interface_addr()
hapd.wait_sta()
time.sleep(0.1)
dev[0].request("DATA_TEST_CONFIG 1") dev[0].request("DATA_TEST_CONFIG 1")
hapd.request("DATA_TEST_CONFIG 1") hapd.request("DATA_TEST_CONFIG 1")
Wlantest.setup(hapd) Wlantest.setup(hapd)
@ -163,6 +168,8 @@ def test_ap_qosmap_invalid(dev, apdev):
raise Exception("SET_QOS_MAP_SET accepted during forced driver failure") raise Exception("SET_QOS_MAP_SET accepted during forced driver failure")
dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412") dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412")
hapd.wait_sta()
time.sleep(0.1)
with alloc_fail(hapd, 1, with alloc_fail(hapd, 1,
"wpabuf_alloc;hostapd_ctrl_iface_send_qos_map_conf"): "wpabuf_alloc;hostapd_ctrl_iface_send_qos_map_conf"):
if "FAIL" not in hapd.request("SEND_QOS_MAP_CONF " + dev[0].own_addr()): if "FAIL" not in hapd.request("SEND_QOS_MAP_CONF " + dev[0].own_addr()):

View file

@ -593,6 +593,7 @@ def test_ap_vlan_without_station(dev, apdev, p):
time.sleep(.1) time.sleep(.1)
dev[0].connect("test-vlan", psk="12345678x", scan_freq="2412") dev[0].connect("test-vlan", psk="12345678x", scan_freq="2412")
hapd.wait_sta()
# inject some traffic # inject some traffic
sa = hapd.own_addr() sa = hapd.own_addr()

View file

@ -10327,6 +10327,10 @@ def test_ap_wps_random_uuid(dev, apdev, params):
wpas.interface_remove("wlan5") wpas.interface_remove("wlan5")
for j in range(3):
ev = hapd.wait_event(["WPS-ENROLLEE-SEEN"], timeout=1)
if ev:
logger.info("Ignored extra event at the end: " + ev)
hapd.dump_monitor() hapd.dump_monitor()
logger.info("Seen UUIDs: " + str(uuid)) logger.info("Seen UUIDs: " + str(uuid))

View file

@ -5584,6 +5584,7 @@ def test_eap_proto_sim_errors(dev, apdev):
dev[0].request("REMOVE_NETWORK all") dev[0].request("REMOVE_NETWORK all")
dev[0].dump_monitor() dev[0].dump_monitor()
hapd2.dump_monitor()
tests = ["eap_sim_msg_add_encr_start;eap_sim_response_notification", tests = ["eap_sim_msg_add_encr_start;eap_sim_response_notification",
"aes_128_cbc_encrypt;eap_sim_response_notification"] "aes_128_cbc_encrypt;eap_sim_response_notification"]
for func in tests: for func in tests:
@ -5593,6 +5594,7 @@ def test_eap_proto_sim_errors(dev, apdev):
eap="SIM", identity="1232010000000000", eap="SIM", identity="1232010000000000",
phase1="result_ind=1", phase1="result_ind=1",
password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581") password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581")
hapd2.wait_sta()
dev[0].request("REAUTHENTICATE") dev[0].request("REAUTHENTICATE")
ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5) ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5)
if ev is None: if ev is None:
@ -5601,7 +5603,9 @@ def test_eap_proto_sim_errors(dev, apdev):
wait_fail_trigger(dev[0], "GET_FAIL") wait_fail_trigger(dev[0], "GET_FAIL")
dev[0].request("REMOVE_NETWORK all") dev[0].request("REMOVE_NETWORK all")
dev[0].dump_monitor() dev[0].dump_monitor()
hapd2.wait_sta_disconnect()
hapd2.dump_monitor()
tests = ["eap_sim_parse_encr;eap_sim_process_notification_reauth"] tests = ["eap_sim_parse_encr;eap_sim_process_notification_reauth"]
for func in tests: for func in tests:
with alloc_fail(dev[0], 1, func): with alloc_fail(dev[0], 1, func):
@ -5610,6 +5614,7 @@ def test_eap_proto_sim_errors(dev, apdev):
eap="SIM", identity="1232010000000000", eap="SIM", identity="1232010000000000",
phase1="result_ind=1", phase1="result_ind=1",
password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581") password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581")
hapd2.wait_sta()
dev[0].request("REAUTHENTICATE") dev[0].request("REAUTHENTICATE")
ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5) ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5)
if ev is None: if ev is None:
@ -5618,6 +5623,7 @@ def test_eap_proto_sim_errors(dev, apdev):
wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
dev[0].request("REMOVE_NETWORK all") dev[0].request("REMOVE_NETWORK all")
dev[0].dump_monitor() dev[0].dump_monitor()
hapd2.wait_sta_disconnect()
def test_eap_proto_aka_errors(dev, apdev): def test_eap_proto_aka_errors(dev, apdev):
"""EAP-AKA protocol tests (error paths)""" """EAP-AKA protocol tests (error paths)"""
@ -5694,6 +5700,7 @@ def test_eap_proto_aka_errors(dev, apdev):
dev[0].wait_disconnected() dev[0].wait_disconnected()
dev[0].dump_monitor() dev[0].dump_monitor()
hapd2.dump_monitor()
tests = ["eap_sim_msg_add_encr_start;eap_aka_response_notification", tests = ["eap_sim_msg_add_encr_start;eap_aka_response_notification",
"aes_128_cbc_encrypt;eap_aka_response_notification"] "aes_128_cbc_encrypt;eap_aka_response_notification"]
for func in tests: for func in tests:
@ -5703,6 +5710,7 @@ def test_eap_proto_aka_errors(dev, apdev):
eap="AKA", identity="0232010000000000", eap="AKA", identity="0232010000000000",
phase1="result_ind=1", phase1="result_ind=1",
password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123")
hapd2.wait_sta()
dev[0].request("REAUTHENTICATE") dev[0].request("REAUTHENTICATE")
ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5) ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5)
if ev is None: if ev is None:
@ -5711,7 +5719,9 @@ def test_eap_proto_aka_errors(dev, apdev):
wait_fail_trigger(dev[0], "GET_FAIL") wait_fail_trigger(dev[0], "GET_FAIL")
dev[0].request("REMOVE_NETWORK all") dev[0].request("REMOVE_NETWORK all")
dev[0].dump_monitor() dev[0].dump_monitor()
hapd2.wait_sta_disconnect()
hapd2.dump_monitor()
tests = ["eap_sim_parse_encr;eap_aka_process_notification_reauth"] tests = ["eap_sim_parse_encr;eap_aka_process_notification_reauth"]
for func in tests: for func in tests:
with alloc_fail(dev[0], 1, func): with alloc_fail(dev[0], 1, func):
@ -5720,6 +5730,7 @@ def test_eap_proto_aka_errors(dev, apdev):
eap="AKA", identity="0232010000000000", eap="AKA", identity="0232010000000000",
phase1="result_ind=1", phase1="result_ind=1",
password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123")
hapd2.wait_sta()
dev[0].request("REAUTHENTICATE") dev[0].request("REAUTHENTICATE")
ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5) ev = dev[0].wait_event(["CTRL-EVENT-EAP-METHOD"], timeout=5)
if ev is None: if ev is None:
@ -5728,6 +5739,7 @@ def test_eap_proto_aka_errors(dev, apdev):
wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
dev[0].request("REMOVE_NETWORK all") dev[0].request("REMOVE_NETWORK all")
dev[0].dump_monitor() dev[0].dump_monitor()
hapd2.wait_sta_disconnect()
def test_eap_proto_aka_prime_errors(dev, apdev): def test_eap_proto_aka_prime_errors(dev, apdev):
"""EAP-AKA' protocol tests (error paths)""" """EAP-AKA' protocol tests (error paths)"""

View file

@ -205,8 +205,10 @@ def test_fils_sk_pmksa_caching_ocv(dev, apdev, params):
if pmksa is None: if pmksa is None:
raise Exception("No PMKSA cache entry created") raise Exception("No PMKSA cache entry created")
hapd.wait_sta()
dev[0].request("DISCONNECT") dev[0].request("DISCONNECT")
dev[0].wait_disconnected() dev[0].wait_disconnected()
hapd.wait_sta_disconnect()
dev[0].dump_monitor() dev[0].dump_monitor()
dev[0].select_network(id, freq=2412) dev[0].select_network(id, freq=2412)
@ -216,6 +218,7 @@ def test_fils_sk_pmksa_caching_ocv(dev, apdev, params):
raise Exception("Connection using PMKSA caching timed out") raise Exception("Connection using PMKSA caching timed out")
if "CTRL-EVENT-EAP-STARTED" in ev: if "CTRL-EVENT-EAP-STARTED" in ev:
raise Exception("Unexpected EAP exchange") raise Exception("Unexpected EAP exchange")
hapd.wait_sta()
hwsim_utils.test_connectivity(dev[0], hapd) hwsim_utils.test_connectivity(dev[0], hapd)
pmksa2 = dev[0].get_pmksa(bssid) pmksa2 = dev[0].get_pmksa(bssid)
if pmksa2 is None: if pmksa2 is None:
@ -231,6 +234,9 @@ def test_fils_sk_pmksa_caching_ocv(dev, apdev, params):
ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=5) ev = dev[0].wait_event(["CTRL-EVENT-EAP-SUCCESS"], timeout=5)
if ev is None: if ev is None:
raise Exception("EAP authentication did not succeed") raise Exception("EAP authentication did not succeed")
ev = hapd.wait_event(["CTRL-EVENT-EAP-SUCCESS2"], timeout=1)
if ev is None:
raise Exception("hostapd did not report EAP-Success on reauth")
time.sleep(0.1) time.sleep(0.1)
hwsim_utils.test_connectivity(dev[0], hapd) hwsim_utils.test_connectivity(dev[0], hapd)
@ -346,6 +352,7 @@ def test_fils_sk_pmksa_caching_ctrl_ext(dev, apdev, params):
if "ffee" not in res1: if "ffee" not in res1:
raise Exception("FILS Cache Identifier not seen in PMKSA cache entry") raise Exception("FILS Cache Identifier not seen in PMKSA cache entry")
hapd.wait_sta()
dev[0].request("DISCONNECT") dev[0].request("DISCONNECT")
dev[0].wait_disconnected() dev[0].wait_disconnected()
hapd_as.disable() hapd_as.disable()

View file

@ -2239,6 +2239,7 @@ def test_fst_session_respond_fail(dev, apdev, test_params):
sta = sta1.get_instance() sta = sta1.get_instance()
sta.request("DISCONNECT") sta.request("DISCONNECT")
sta.wait_disconnected() sta.wait_disconnected()
ap1.hapd.wait_sta_disconnect()
req = "FST-MANAGER SESSION_RESPOND %s reject" % ev['id'] req = "FST-MANAGER SESSION_RESPOND %s reject" % ev['id']
s = ap1.grequest(req) s = ap1.grequest(req)
if not s.startswith("FAIL"): if not s.startswith("FAIL"):

View file

@ -439,10 +439,13 @@ def test_autogo_passphrase_len(dev):
dev[2].dump_monitor() dev[2].dump_monitor()
dev[2].request("WPS_PIN any " + pin) dev[2].request("WPS_PIN any " + pin)
dev[2].wait_connected(timeout=30) dev[2].wait_connected(timeout=30)
dev[0].wait_sta(addr=dev[2].own_addr())
status = dev[2].get_status() status = dev[2].get_status()
if status['wpa_state'] != 'COMPLETED': if status['wpa_state'] != 'COMPLETED':
raise Exception("Not fully connected") raise Exception("Not fully connected")
dev[2].request("DISCONNECT") dev[2].request("DISCONNECT")
dev[2].wait_disconnected()
dev[0].wait_sta_disconnect()
logger.info("Connect legacy non-WPS client") logger.info("Connect legacy non-WPS client")
dev[2].request("FLUSH") dev[2].request("FLUSH")
@ -450,6 +453,7 @@ def test_autogo_passphrase_len(dev):
dev[2].connect(ssid=res['ssid'], psk=res['passphrase'], proto='RSN', dev[2].connect(ssid=res['ssid'], psk=res['passphrase'], proto='RSN',
key_mgmt='WPA-PSK', pairwise='CCMP', group='CCMP', key_mgmt='WPA-PSK', pairwise='CCMP', group='CCMP',
scan_freq=res['freq']) scan_freq=res['freq'])
dev[0].wait_sta(addr=dev[2].own_addr())
hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2]) hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
dev[2].request("DISCONNECT") dev[2].request("DISCONNECT")

View file

@ -308,6 +308,7 @@ def test_grpform_per_sta_psk(dev):
pin = dev[2].wps_read_pin() pin = dev[2].wps_read_pin()
dev[0].p2p_go_authorize_client(pin) dev[0].p2p_go_authorize_client(pin)
c_res = dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60) c_res = dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
dev[0].wait_sta(dev[2].p2p_interface_addr())
check_grpform_results(i_res, c_res) check_grpform_results(i_res, c_res)
if r_res['psk'] == c_res['psk']: if r_res['psk'] == c_res['psk']:

View file

@ -124,11 +124,15 @@ def test_persistent_group_per_sta_psk(dev):
raise Exception("Timeout on group restart") raise Exception("Timeout on group restart")
dev[i].group_form_result(ev) dev[i].group_form_result(ev)
dev[0].wait_sta()
dev[0].wait_sta()
logger.info("Leave persistent group and rejoin it") logger.info("Leave persistent group and rejoin it")
dev[2].remove_group() dev[2].remove_group()
ev = dev[2].wait_global_event(["P2P-GROUP-REMOVED"], timeout=3) ev = dev[2].wait_global_event(["P2P-GROUP-REMOVED"], timeout=3)
if ev is None: if ev is None:
raise Exception("Group removal event timed out") raise Exception("Group removal event timed out")
dev[0].wait_sta_disconnect()
if not dev[2].discover_peer(addr0, social=True): if not dev[2].discover_peer(addr0, social=True):
raise Exception("Peer " + addr0 + " not found") raise Exception("Peer " + addr0 + " not found")
dev[2].dump_monitor() dev[2].dump_monitor()
@ -140,6 +144,7 @@ def test_persistent_group_per_sta_psk(dev):
cli_res = dev[2].group_form_result(ev) cli_res = dev[2].group_form_result(ev)
if not cli_res['persistent']: if not cli_res['persistent']:
raise Exception("Persistent group not restarted as persistent (cli)") raise Exception("Persistent group not restarted as persistent (cli)")
dev[0].wait_sta(addr=dev[2].p2p_interface_addr())
hwsim_utils.test_connectivity_p2p(dev[1], dev[2]) hwsim_utils.test_connectivity_p2p(dev[1], dev[2])
logger.info("Remove one of the clients from the group without removing persistent group information for the client") logger.info("Remove one of the clients from the group without removing persistent group information for the client")

View file

@ -1115,6 +1115,7 @@ def test_pmksa_cache_ctrl_ext_ft(dev, apdev):
eap="GPSK", identity="gpsk user", eap="GPSK", identity="gpsk user",
password="abcdefghijklmnop0123456789abcdef", password="abcdefghijklmnop0123456789abcdef",
scan_freq="2412") scan_freq="2412")
hapd.wait_sta()
res1 = dev[0].request("PMKSA_GET %d" % id) res1 = dev[0].request("PMKSA_GET %d" % id)
logger.info("PMKSA_GET: " + res1) logger.info("PMKSA_GET: " + res1)
@ -1127,6 +1128,7 @@ def test_pmksa_cache_ctrl_ext_ft(dev, apdev):
dev[0].wait_disconnected() dev[0].wait_disconnected()
dev[0].dump_monitor() dev[0].dump_monitor()
dev[0].request("PMKSA_FLUSH") dev[0].request("PMKSA_FLUSH")
hapd.wait_sta_disconnect()
id = dev[0].connect("test-pmksa-cache", proto="RSN", key_mgmt="FT-EAP", id = dev[0].connect("test-pmksa-cache", proto="RSN", key_mgmt="FT-EAP",
eap="GPSK", identity="gpsk user", eap="GPSK", identity="gpsk user",

View file

@ -227,9 +227,11 @@ def test_sae_pk_modes(dev, apdev):
val = dev[0].get_status_field("sae_pk") val = dev[0].get_status_field("sae_pk")
if val != str(expected): if val != str(expected):
raise Exception("Unexpected sae_pk=%d result %s" % (sae_pk, val)) raise Exception("Unexpected sae_pk=%d result %s" % (sae_pk, val))
hapd.wait_sta()
dev[0].request("REMOVE_NETWORK *") dev[0].request("REMOVE_NETWORK *")
dev[0].wait_disconnected() dev[0].wait_disconnected()
dev[0].dump_monitor() dev[0].dump_monitor()
hapd.wait_sta_disconnect()
def test_sae_pk_not_on_ap(dev, apdev): def test_sae_pk_not_on_ap(dev, apdev):
"""SAE-PK password, but no PK on AP""" """SAE-PK password, but no PK on AP"""

View file

@ -221,6 +221,7 @@ def test_wnm_ess_disassoc_imminent_pmf(dev, apdev):
dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2", dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2",
key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412")
addr = dev[0].p2p_interface_addr() addr = dev[0].p2p_interface_addr()
hapd.wait_sta(wait_4way_hs=True)
hapd.request("ESS_DISASSOC " + addr + " 10 http://example.com/session-info") hapd.request("ESS_DISASSOC " + addr + " 10 http://example.com/session-info")
ev = dev[0].wait_event(["ESS-DISASSOC-IMMINENT"]) ev = dev[0].wait_event(["ESS-DISASSOC-IMMINENT"])
if ev is None: if ev is None:
@ -472,6 +473,7 @@ def test_wnm_sleep_mode_rsn_ocv_failure(dev, apdev):
dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2", ocv="1", dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2", ocv="1",
key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412")
hapd.wait_sta()
# Failed to allocate buffer for OCI element in WNM-Sleep Mode frame # Failed to allocate buffer for OCI element in WNM-Sleep Mode frame
with alloc_fail(hapd, 2, "ieee802_11_send_wnmsleep_resp"): with alloc_fail(hapd, 2, "ieee802_11_send_wnmsleep_resp"):
if "OK" not in dev[0].request("WNM_SLEEP enter"): if "OK" not in dev[0].request("WNM_SLEEP enter"):

View file

@ -797,7 +797,6 @@ class WpaSupplicant:
if expect_failure: if expect_failure:
return None return None
raise Exception("Group formation timed out") raise Exception("Group formation timed out")
self.dump_monitor()
return self.group_form_result(ev, expect_failure, go_neg_res) return self.group_form_result(ev, expect_failure, go_neg_res)
def p2p_go_neg_init(self, peer, pin, method, timeout=0, go_intent=None, def p2p_go_neg_init(self, peer, pin, method, timeout=0, go_intent=None,
@ -1700,3 +1699,30 @@ class WpaSupplicant:
vals['kdk'] = kdk vals['kdk'] = kdk
return vals return vals
return None return None
def wait_sta(self, addr=None, timeout=2, wait_4way_hs=False):
ev = self.wait_group_event(["AP-STA-CONNECT"], timeout=timeout)
if ev is None:
ev = self.wait_event(["AP-STA-CONNECT"], timeout=timeout)
if ev is None:
raise Exception("AP did not report STA connection")
if addr and addr not in ev:
raise Exception("Unexpected STA address in connection event: " + ev)
if wait_4way_hs:
ev2 = self.wait_group_event(["EAPOL-4WAY-HS-COMPLETED"],
timeout=timeout)
if ev2 is None:
raise Exception("AP did not report 4-way handshake completion")
if addr and addr not in ev2:
raise Exception("Unexpected STA address in 4-way handshake completion event: " + ev2)
return ev
def wait_sta_disconnect(self, addr=None, timeout=2):
ev = self.wait_group_event(["AP-STA-DISCONNECT"], timeout=timeout)
if ev is None:
ev = self.wait_event(["AP-STA-CONNECT"], timeout=timeout)
if ev is None:
raise Exception("AP did not report STA disconnection")
if addr and addr not in ev:
raise Exception("Unexpected STA address in disconnection event: " + ev)
return ev