def test_go_neg_with_bss_on_disallowed_chan(dev, apdev): """P2P channel selection: GO negotiation with station interface on a disallowed channel""" with HWSimRadio(n_channels=2) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) wpas.request("SET p2p_no_group_iface 0") if wpas.get_mcc() < 2: raise Exception("New radio does not support MCC") try: hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'bss-2.4ghz', "channel": '1' }) # make sure PBC overlap from old test cases is not maintained dev[1].flush_scan_cache() wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412") wpas.request("P2P_SET disallow_freq 2412") #wpas as GO [i_res, r_res] = go_neg_pbc(i_dev=wpas, i_intent=10, r_dev=dev[1], r_intent=1) check_grpform_results(i_res, r_res) if i_res['role'] != "GO": raise Exception("GO not selected according to go_intent") if i_res['freq'] == "2412": raise Exception("Group formed on a disallowed channel") hwsim_utils.test_connectivity(wpas, hapd) wpas.remove_group(i_res['ifname']) dev[1].wait_go_ending_session() dev[1].flush_scan_cache() wpas.dump_monitor() dev[1].dump_monitor() #wpas as client [i_res2, r_res2] = go_neg_pbc(i_dev=wpas, i_intent=1, r_dev=dev[1], r_intent=10) check_grpform_results(i_res2, r_res2) if i_res2['role'] != "client": raise Exception("GO not selected according to go_intent") if i_res2['freq'] == "2412": raise Exception("Group formed on a disallowed channel") hwsim_utils.test_connectivity(wpas, hapd) dev[1].remove_group(r_res2['ifname']) wpas.wait_go_ending_session() ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=5) if ev is None: raise Exception("Group removal not indicated") wpas.request("DISCONNECT") hapd.disable() finally: wpas.request("P2P_SET disallow_freq ")
def test_p2p_device_grpform(dev, apdev): """P2P group formation with driver using cfg80211 P2P Device""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=wpas, r_intent=0) check_grpform_results(i_res, r_res) wpas.dump_monitor() remove_group(dev[0], wpas) wpas.dump_monitor() res = wpas.global_request("IFNAME=p2p-dev-" + iface + " STATUS-DRIVER") lines = res.splitlines() found = False for l in lines: try: [name,value] = l.split('=', 1) if name == "wdev_id": found = True break except ValueError: pass if not found: raise Exception("wdev_id not found")
def test_p2p_device_grpform(dev, apdev): """P2P group formation with driver using cfg80211 P2P Device""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=wpas, r_intent=0) check_grpform_results(i_res, r_res) wpas.dump_monitor() remove_group(dev[0], wpas) wpas.dump_monitor() if not r_res['ifname'].startswith('p2p-' + iface): raise Exception("Unexpected group ifname: " + r_res['ifname']) res = wpas.global_request("IFNAME=p2p-dev-" + iface + " STATUS-DRIVER") lines = res.splitlines() found = False for l in lines: try: [name, value] = l.split('=', 1) if name == "wdev_id": found = True break except ValueError: pass if not found: raise Exception("wdev_id not found")
def test_connect_cmd_disconnect_event(dev, apdev): """Connection using cfg80211 connect command getting disconnected by the AP""" params = {"ssid": "sta-connect"} hapd = hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") if "OK" not in hapd.request("DEAUTHENTICATE " + wpas.p2p_interface_addr()): raise Exception("DEAUTHENTICATE command failed") ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5) if ev is None: raise Exception("Disconnection event timed out") # This event was actually based on deauthenticate event since we force # connect command to be used with a driver that supports auth+assoc for # testing purposes. Anyway, wait some time to allow the debug log to capture # the following NL80211_CMD_DISCONNECT event. time.sleep(0.1) wpas.dump_monitor() # Clean up to avoid causing issue for following test cases wpas.request("REMOVE_NETWORK all") wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=2) wpas.flush_scan_cache() wpas.dump_monitor() wpas.interface_remove("wlan5") del wpas
def test_pmksa_cache_opportunistic_connect(dev, apdev): """Opportunistic PMKSA caching with connect API""" params = hostapd.wpa2_eap_params(ssid="test-pmksa-cache") params['okc'] = "1" hostapd.add_ap(apdev[0], params) bssid = apdev[0]['bssid'] wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("test-pmksa-cache", proto="RSN", key_mgmt="WPA-EAP", eap="GPSK", identity="gpsk user", password="******", okc=True, scan_freq="2412") pmksa = wpas.get_pmksa(bssid) if pmksa is None: raise Exception("No PMKSA cache entry created") if pmksa['opportunistic'] != '0': raise Exception("Unexpected opportunistic PMKSA cache entry") hostapd.add_ap(apdev[1], params) bssid2 = apdev[1]['bssid'] wpas.dump_monitor() logger.info("Roam to AP2") wpas.scan_for_bss(bssid2, freq="2412", force_scan=True) wpas.request("ROAM " + bssid2) ev = wpas.wait_event(["CTRL-EVENT-EAP-STARTED", "CTRL-EVENT-CONNECTED"], timeout=10) if ev is None: raise Exception("Roaming with the AP timed out") if "CTRL-EVENT-EAP-STARTED" in ev: raise Exception("Unexpected EAP exchange") pmksa2 = wpas.get_pmksa(bssid2) if pmksa2 is None: raise Exception("No PMKSA cache entry created") wpas.dump_monitor() logger.info("Roam back to AP1") wpas.scan(freq="2412") wpas.request("ROAM " + bssid) ev = wpas.wait_event(["CTRL-EVENT-EAP-STARTED", "CTRL-EVENT-CONNECTED"], timeout=10) if ev is None: raise Exception("Roaming with the AP timed out") if "CTRL-EVENT-EAP-STARTED" in ev: raise Exception("Unexpected EAP exchange") pmksa1b = wpas.get_pmksa(bssid) if pmksa1b is None: raise Exception("No PMKSA cache entry found") if pmksa['pmkid'] != pmksa1b['pmkid']: raise Exception("Unexpected PMKID change for AP1")
def test_sta_dynamic_ext_mac_addr_change_for_connection(dev, apdev): """Dynamically added wpa_supplicant interface with external MAC address change for connection""" params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") hapd = hostapd.add_ap(apdev[0], params) bssid = apdev[0]['ifname'] wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") wpas.scan_for_bss(bssid, freq=2412) subprocess.call(['ifconfig', wpas.ifname, 'down']) if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED": raise Exception("Unexpected wpa_state") prev_addr = wpas.own_addr() new_addr = '02:11:22:33:44:55' try: subprocess.call( ['ip', 'link', 'set', 'dev', wpas.ifname, 'address', new_addr]) subprocess.call(['ifconfig', wpas.ifname, 'up']) wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412", wait_connect=False) ev = wpas.wait_event( ["CTRL-EVENT-CONNECTED", "CTRL-EVENT-SCAN-RESULTS"], timeout=10) if "CTRL-EVENT-SCAN-RESULTS" in ev: raise Exception("Unexpected scan after MAC address change") hapd.wait_sta() hwsim_utils.test_connectivity(wpas, hapd) sta = hapd.get_sta(new_addr) if sta['addr'] != new_addr: raise Exception("STA association with new address not found") wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor() subprocess.call(['ifconfig', wpas.ifname, 'down']) time.sleep(0.1) res = wpas.get_bss(bssid) if res is None: raise Exception( "BSS entry not maintained after interface disabling") ev = wpas.wait_event(["CTRL-EVENT-BSS-REMOVED"], timeout=5.5) if ev is None: raise Exception( "BSS entry not removed after interface has been disabled for a while" ) res2 = wpas.get_bss(bssid) if res2 is not None: raise Exception( "Unexpected BSS entry found on a disabled interface") finally: subprocess.call(['ifconfig', wpas.ifname, 'down']) subprocess.call( ['ip', 'link', 'set', 'dev', wpas.ifname, 'address', prev_addr]) subprocess.call(['ifconfig', wpas.ifname, 'up'])
def test_p2p_device_grpform2(dev, apdev): """P2P group formation with driver using cfg80211 P2P Device (reverse)""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) [i_res, r_res] = go_neg_pin_authorized(i_dev=wpas, i_intent=15, r_dev=dev[0], r_intent=0) check_grpform_results(i_res, r_res) wpas.dump_monitor() remove_group(wpas, dev[0]) wpas.dump_monitor()
def test_go_neg_with_bss_on_disallowed_chan(dev, apdev): """P2P channel selection: GO negotiation with station interface on a disallowed channel""" with HWSimRadio(n_channels=2) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) wpas.global_request("SET p2p_no_group_iface 0") if wpas.get_mcc() < 2: raise Exception("New radio does not support MCC") try: hapd = hostapd.add_ap(apdev[0], { "ssid": 'bss-2.4ghz', "channel": '1' }) # make sure PBC overlap from old test cases is not maintained dev[1].flush_scan_cache() wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412") wpas.global_request("P2P_SET disallow_freq 2412") #wpas as GO [i_res, r_res] = go_neg_pbc(i_dev=wpas, i_intent=10, r_dev=dev[1], r_intent=1) check_grpform_results(i_res, r_res) if i_res['role'] != "GO": raise Exception("GO not selected according to go_intent") if i_res['freq'] == "2412": raise Exception("Group formed on a disallowed channel") hwsim_utils.test_connectivity(wpas, hapd) wpas.remove_group(i_res['ifname']) dev[1].wait_go_ending_session() dev[1].flush_scan_cache() wpas.dump_monitor() dev[1].dump_monitor() #wpas as client [i_res2, r_res2] = go_neg_pbc(i_dev=wpas, i_intent=1, r_dev=dev[1], r_intent=10) check_grpform_results(i_res2, r_res2) if i_res2['role'] != "client": raise Exception("GO not selected according to go_intent") if i_res2['freq'] == "2412": raise Exception("Group formed on a disallowed channel") hwsim_utils.test_connectivity(wpas, hapd) dev[1].remove_group(r_res2['ifname']) wpas.wait_go_ending_session() ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=5) if ev is None: raise Exception("Group removal not indicated") wpas.request("DISCONNECT") hapd.disable() finally: wpas.global_request("P2P_SET disallow_freq ")
def test_connect_cmd_wpa2_psk(dev, apdev): """WPA2-PSK connection using cfg80211 connect command""" params = hostapd.wpa2_params(ssid="sta-connect", passphrase="12345678") hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", psk="12345678", scan_freq="2412") wpas.dump_monitor() wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_wpa2_psk(dev, apdev): """WPA2-PSK connection using cfg80211 connect command""" params = hostapd.wpa2_params(ssid="sta-connect", passphrase="12345678") hostapd.add_ap(apdev[0]['ifname'], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", psk="12345678", scan_freq="2412") wpas.dump_monitor() wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_p2p_device_grpform2(dev, apdev): """P2P group formation with driver using cfg80211 P2P Device (reverse)""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) [i_res, r_res] = go_neg_pin_authorized(i_dev=wpas, i_intent=15, r_dev=dev[0], r_intent=0) check_grpform_results(i_res, r_res) wpas.dump_monitor() remove_group(wpas, dev[0]) wpas.dump_monitor() if not i_res['ifname'].startswith('p2p-' + iface): raise Exception("Unexpected group ifname: " + i_res['ifname'])
def test_pmksa_cache_opportunistic_connect(dev, apdev): """Opportunistic PMKSA caching with connect API""" params = hostapd.wpa2_eap_params(ssid="test-pmksa-cache") params['okc'] = "1" hostapd.add_ap(apdev[0]['ifname'], params) bssid = apdev[0]['bssid'] wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("test-pmksa-cache", proto="RSN", key_mgmt="WPA-EAP", eap="GPSK", identity="gpsk user", password="******", okc=True, scan_freq="2412") pmksa = wpas.get_pmksa(bssid) if pmksa is None: raise Exception("No PMKSA cache entry created") if pmksa['opportunistic'] != '0': raise Exception("Unexpected opportunistic PMKSA cache entry") hostapd.add_ap(apdev[1]['ifname'], params) bssid2 = apdev[1]['bssid'] wpas.dump_monitor() logger.info("Roam to AP2") wpas.scan(freq="2412") wpas.request("ROAM " + bssid2) ev = wpas.wait_event(["CTRL-EVENT-EAP-STARTED", "CTRL-EVENT-CONNECTED"], timeout=10) if ev is None: raise Exception("Roaming with the AP timed out") if "CTRL-EVENT-EAP-STARTED" in ev: raise Exception("Unexpected EAP exchange") pmksa2 = wpas.get_pmksa(bssid2) if pmksa2 is None: raise Exception("No PMKSA cache entry created") wpas.dump_monitor() logger.info("Roam back to AP1") wpas.scan(freq="2412") wpas.request("ROAM " + bssid) ev = wpas.wait_event(["CTRL-EVENT-EAP-STARTED", "CTRL-EVENT-CONNECTED"], timeout=10) if ev is None: raise Exception("Roaming with the AP timed out") if "CTRL-EVENT-EAP-STARTED" in ev: raise Exception("Unexpected EAP exchange") pmksa1b = wpas.get_pmksa(bssid) if pmksa1b is None: raise Exception("No PMKSA cache entry found") if pmksa['pmkid'] != pmksa1b['pmkid']: raise Exception("Unexpected PMKID change for AP1")
def test_p2p_device_grpform_no_group_iface2(dev, apdev): """P2P group formation with driver using cfg80211 P2P Device but no separate group interface (reverse)""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) wpas.global_request("SET p2p_no_group_iface 1") [i_res, r_res] = go_neg_pin_authorized(i_dev=wpas, i_intent=15, r_dev=dev[0], r_intent=0) check_grpform_results(i_res, r_res) wpas.dump_monitor() remove_group(dev[0], wpas) wpas.dump_monitor() if i_res['ifname'] != iface: raise Exception("Unexpected group ifname: " + i_res['ifname'])
def test_connect_cmd_wep(dev, apdev): """WEP Open System using cfg80211 connect command""" params = { "ssid": "sta-connect-wep", "wep_key0": '"hello"' } hapd = hostapd.add_ap(apdev[0]['ifname'], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", wep_key0='"hello"') wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_p2p_management(dev, apdev): """Open connection using cfg80211 connect command and AP using P2P management""" params = {"ssid": "sta-connect", "manage_p2p": "1", "allow_cross_connection": "0"} hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") wpas.dump_monitor() wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_p2p_management(dev, apdev): """Open connection using cfg80211 connect command and AP using P2P management""" params = { "ssid": "sta-connect", "manage_p2p": "1", "allow_cross_connection": "0" } hostapd.add_ap(apdev[0]['ifname'], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") wpas.dump_monitor() wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_autogo_ifdown(dev): """P2P autonomous GO and external ifdown""" wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") res = autogo(wpas) wpas.dump_monitor() wpas.interface_remove("wlan5") wpas.interface_add("wlan5") res = autogo(wpas) wpas.dump_monitor() subprocess.call(['ifconfig', res['ifname'], 'down']) ev = wpas.wait_global_event(["P2P-GROUP-REMOVED"], timeout=10) if ev is None: raise Exception("Group removal not reported") if res['ifname'] not in ev: raise Exception("Unexpected group removal event: " + ev)
def test_autogo_ifdown(dev): """P2P autonomous GO and external ifdown""" wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") res = autogo(wpas) wpas.dump_monitor() wpas.interface_remove("wlan5") wpas.interface_add("wlan5") res = autogo(wpas) wpas.dump_monitor() subprocess.call(['sudo', 'ifconfig', res['ifname'], 'down']) ev = wpas.wait_global_event(["P2P-GROUP-REMOVED"], timeout=10) if ev is None: raise Exception("Group removal not reported") if res['ifname'] not in ev: raise Exception("Unexpected group removal event: " + ev)
def start_wpas_ap(ssid): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="use_monitor=1") id = wpas.add_network() wpas.set_network(id, "mode", "2") wpas.set_network_quoted(id, "ssid", ssid) wpas.set_network(id, "proto", "WPA2") wpas.set_network(id, "key_mgmt", "WPA-PSK-SHA256") wpas.set_network(id, "ieee80211w", "2") wpas.set_network_quoted(id, "psk", "12345678") wpas.set_network(id, "pairwise", "CCMP") wpas.set_network(id, "group", "CCMP") wpas.set_network(id, "frequency", "2412") wpas.set_network(id, "scan_freq", "2412") wpas.connect_network(id) wpas.dump_monitor() return wpas
def test_connect_cmd_roam(dev, apdev): """cfg80211 connect command to trigger roam""" params = {"ssid": "sta-connect"} hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") wpas.dump_monitor() hostapd.add_ap(apdev[1], params) wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) wpas.roam(apdev[1]['bssid']) time.sleep(0.1) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_roam(dev, apdev): """cfg80211 connect command to trigger roam""" params = { "ssid": "sta-connect" } hostapd.add_ap(apdev[0]['ifname'], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") wpas.dump_monitor() hostapd.add_ap(apdev[1]['ifname'], params) wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) wpas.roam(apdev[1]['bssid']) time.sleep(0.1) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_wpa_psk_roam(dev, apdev): """WPA2/WPA-PSK connection using cfg80211 connect command to trigger roam""" params = hostapd.wpa2_params(ssid="sta-connect", passphrase="12345678") hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", psk="12345678", scan_freq="2412") wpas.dump_monitor() params = hostapd.wpa_params(ssid="sta-connect", passphrase="12345678") hostapd.add_ap(apdev[1], params) wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) wpas.roam(apdev[1]['bssid']) time.sleep(0.1) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_reject_assoc(dev, apdev): """Connection using cfg80211 connect command getting rejected""" params = {"ssid": "sta-connect", "require_ht": "1"} hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", disable_ht="1", wait_connect=False) ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15) if ev is None: raise Exception("Association rejection timed out") if "status_code=27" not in ev: raise Exception("Unexpected rejection status code") wpas.request("DISCONNECT") wpas.dump_monitor()
def test_p2p_device_incorrect_command_interface2(dev, apdev): """cfg80211 P2P Device and P2P_GROUP_ADD command on incorrect interface""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) if "OK" not in wpas.request('P2P_GROUP_ADD'): raise Exception("P2P_GROUP_ADD failed") ev = wpas.wait_global_event(["P2P-GROUP-STARTED"], timeout=15) if ev is None: raise Exception("Group formation timed out") res = wpas.group_form_result(ev) wpas.dump_monitor() logger.info("Group results: " + str(res)) wpas.remove_group() if not res['ifname'].startswith('p2p-' + iface + '-'): raise Exception("Unexpected group ifname: " + res['ifname']) wpas.dump_monitor()
def test_connect_cmd_concurrent_grpform_while_connecting(dev, apdev): """Concurrent P2P group formation while connecting to an AP using cfg80211 connect command""" logger.info("Start connection to an infrastructure AP") hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" }) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("test-open", key_mgmt="NONE", wait_connect=False) wpas.dump_monitor() logger.info("Form a P2P group while connecting to an AP") wpas.request("SET p2p_no_group_iface 0") [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_freq=2412, r_dev=wpas, r_freq=2412) check_grpform_results(i_res, r_res) remove_group(dev[0], wpas) wpas.dump_monitor() logger.info("Confirm AP connection after P2P group removal") hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_autogo_join_auto_go_not_found(dev): """P2P_CONNECT-auto not finding GO""" wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") wpas.request("P2P_SET listen_channel 1") wpas.global_request("SET p2p_no_group_iface 0") autogo(wpas, freq=2412) addr = wpas.p2p_dev_addr() bssid = wpas.p2p_interface_addr() wpas.dump_monitor() dev[1].global_request("SET p2p_no_group_iface 0") dev[1].scan_for_bss(bssid, freq=2412) # This makes the GO not show up in the scan iteration following the # P2P_CONNECT command by stopping beaconing and handling Probe Request # frames externally (but not really replying to them). P2P listen mode is # needed to keep the GO listening on the operating channel for the PD # exchange. if "OK" not in wpas.group_request("STOP_AP"): raise Exception("STOP_AP failed") wpas.dump_monitor() wpas.group_request("SET ext_mgmt_frame_handling 1") wpas.p2p_listen() wpas.dump_monitor() time.sleep(0.02) dev[1].global_request("P2P_CONNECT " + addr + " pbc auto") ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG-ENABLED"], 15) wpas.dump_monitor() if ev is None: raise Exception("Could not trigger old-scan-only case") return ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG"], 15) wpas.remove_group() if ev is None: raise Exception("Fallback to GO Negotiation not seen") if "reason=GO-not-found" not in ev: raise Exception("Unexpected reason for fallback: " + ev) wpas.dump_monitor()
def test_autogo_force_diff_channel(dev, apdev): """P2P autonomous GO and station interface operate on different channels""" with HWSimRadio(n_channels=2) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) if wpas.get_mcc() < 2: raise Exception("New radio does not support MCC") wpas.request("SET p2p_no_group_iface 0") hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'ap-test', "channel": '1' }) wpas.connect("ap-test", key_mgmt="NONE", scan_freq="2412") wpas.dump_monitor() channels = {2: 2417, 5: 2432, 9: 2452} for key in channels: res_go = autogo(wpas, channels[key]) wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) if int(res_go['freq']) == 2412: raise Exception("Group operation channel is: 2412 excepted: " + res_go['freq']) wpas.remove_group(res_go['ifname']) wpas.dump_monitor()
def test_connect_cmd_wep_shared(dev, apdev): """WEP Shared key using cfg80211 connect command""" params = { "ssid": "sta-connect-wep", "wep_key0": '"hello"', "auth_algs": "2" } hapd = hostapd.add_ap(apdev[0], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") id = wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", auth_alg="SHARED", wep_key0='"hello"') wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.remove_network(id) wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", auth_alg="OPEN SHARED", wep_key0='"hello"') wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_connect_cmd_concurrent_grpform_while_connecting(dev, apdev): """Concurrent P2P group formation while connecting to an AP using cfg80211 connect command""" logger.info("Start connection to an infrastructure AP") hapd = hostapd.add_ap(apdev[0], {"ssid": "test-open"}) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("test-open", key_mgmt="NONE", wait_connect=False) wpas.dump_monitor() logger.info("Form a P2P group while connecting to an AP") wpas.request("SET p2p_no_group_iface 0") [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_freq=2412, r_dev=wpas, r_freq=2412) check_grpform_results(i_res, r_res) remove_group(dev[0], wpas) wpas.dump_monitor() logger.info("Confirm AP connection after P2P group removal") hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_p2p_device_autogo_chan_switch(dev): """P2P autonomous GO switching channels with cfg80211 P2P Device""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) wpas.global_request("SET p2p_no_group_iface 1") autogo(wpas, freq=2417) connect_cli(wpas, dev[1]) res = wpas.group_request("CHAN_SWITCH 5 2422") if "FAIL" in res: # for now, skip test since mac80211_hwsim support is not yet widely # deployed raise HwsimSkip("Assume mac80211_hwsim did not support channel switching") ev = wpas.wait_group_event(["AP-CSA-FINISHED"], timeout=10) if ev is None: raise Exception("CSA finished event timed out") if "freq=2422" not in ev: raise Exception("Unexpected cahnnel in CSA finished event") wpas.dump_monitor() dev[1].dump_monitor() time.sleep(0.1) hwsim_utils.test_connectivity_p2p(wpas, dev[1])
def test_p2p_device_incorrect_command_interface(dev, apdev): """cfg80211 P2P Device and P2P_* command on incorrect interface""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) dev[0].p2p_listen() wpas.request('P2P_FIND type=social') ev = wpas.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10) if ev is None: raise Exception("Peer not found") ev = wpas.wait_event(["P2P-DEVICE-FOUND"], timeout=0.1) if ev is not None: raise Exception( "Unexpected P2P-DEVICE-FOUND event on station interface") wpas.dump_monitor() pin = wpas.wps_read_pin() dev[0].p2p_go_neg_auth(wpas.p2p_dev_addr(), pin, "enter", go_intent=14, freq=2412) wpas.request('P2P_STOP_FIND') wpas.dump_monitor() if "OK" not in wpas.request('P2P_CONNECT ' + dev[0].p2p_dev_addr() + ' ' + pin + ' display go_intent=1'): raise Exception("P2P_CONNECT failed") ev = wpas.wait_global_event(["P2P-GROUP-STARTED"], timeout=15) if ev is None: raise Exception("Group formation timed out") wpas.group_form_result(ev) wpas.dump_monitor() ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15) if ev is None: raise Exception("Group formation timed out(2)") dev[0].group_form_result(ev) dev[0].remove_group() wpas.wait_go_ending_session() wpas.dump_monitor()
def run_p2p_device_nfc_invite(dev, apdev, no_group_iface): with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface) set_ip_addr_info(dev[0]) logger.info("Start autonomous GO") dev[0].p2p_start_go() logger.info("Write NFC Tag on the P2P Client") res = wpas.global_request("P2P_LISTEN") if "FAIL" in res: raise Exception("Failed to start Listen mode") wpas.dump_monitor() pw = wpas.global_request("WPS_NFC_TOKEN NDEF").rstrip() if "FAIL" in pw: raise Exception("Failed to generate password token") res = wpas.global_request("P2P_SET nfc_tag 1").rstrip() if "FAIL" in res: raise Exception("Failed to enable NFC Tag for P2P static handover") sel = wpas.global_request( "NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG").rstrip() if "FAIL" in sel: raise Exception( "Failed to generate NFC connection handover select") wpas.dump_monitor() logger.info("Read NFC Tag on the GO to trigger invitation") res = dev[0].global_request("WPS_NFC_TAG_READ " + sel) if "FAIL" in res: raise Exception( "Failed to provide NFC tag contents to wpa_supplicant") ev = wpas.wait_global_event(grpform_events, timeout=20) if ev is None: raise Exception("Joining the group timed out") res = wpas.group_form_result(ev) wpas.dump_monitor() hwsim_utils.test_connectivity_p2p(dev[0], wpas) check_ip_addr(res) wpas.dump_monitor()
def test_p2p_device_nfc_invite(dev, apdev): """P2P NFC invitiation with driver using cfg80211 P2P Device""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) set_ip_addr_info(dev[0]) logger.info("Start autonomous GO") dev[0].p2p_start_go() logger.info("Write NFC Tag on the P2P Client") res = wpas.global_request("P2P_LISTEN") if "FAIL" in res: raise Exception("Failed to start Listen mode") wpas.dump_monitor() pw = wpas.global_request("WPS_NFC_TOKEN NDEF").rstrip() if "FAIL" in pw: raise Exception("Failed to generate password token") res = wpas.global_request("P2P_SET nfc_tag 1").rstrip() if "FAIL" in res: raise Exception("Failed to enable NFC Tag for P2P static handover") sel = wpas.global_request("NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG").rstrip() if "FAIL" in sel: raise Exception("Failed to generate NFC connection handover select") wpas.dump_monitor() logger.info("Read NFC Tag on the GO to trigger invitation") res = dev[0].global_request("WPS_NFC_TAG_READ " + sel) if "FAIL" in res: raise Exception("Failed to provide NFC tag contents to wpa_supplicant") ev = wpas.wait_global_event(grpform_events, timeout=20) if ev is None: raise Exception("Joining the group timed out") res = wpas.group_form_result(ev) wpas.dump_monitor() hwsim_utils.test_connectivity_p2p(dev[0], wpas) check_ip_addr(res) wpas.dump_monitor()
def test_p2p_device_incorrect_command_interface(dev, apdev): """cfg80211 P2P Device and P2P_* command on incorrect interface""" with HWSimRadio(use_p2p_device=True) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) dev[0].p2p_listen() wpas.request('P2P_FIND type=social') ev = wpas.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10) if ev is None: raise Exception("Peer not found") ev = wpas.wait_event(["P2P-DEVICE-FOUND"], timeout=0.1) if ev is not None: raise Exception("Unexpected P2P-DEVICE-FOUND event on station interface") wpas.dump_monitor() pin = wpas.wps_read_pin() dev[0].p2p_go_neg_auth(wpas.p2p_dev_addr(), pin, "enter", go_intent=14, freq=2412) wpas.request('P2P_STOP_FIND') wpas.dump_monitor() if "OK" not in wpas.request('P2P_CONNECT ' + dev[0].p2p_dev_addr() + ' ' + pin + ' display go_intent=1'): raise Exception("P2P_CONNECT failed") ev = wpas.wait_global_event(["P2P-GROUP-STARTED"], timeout=15) if ev is None: raise Exception("Group formation timed out") wpas.group_form_result(ev) wpas.dump_monitor() ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15) if ev is None: raise Exception("Group formation timed out(2)") dev[0].group_form_result(ev) dev[0].remove_group() wpas.wait_go_ending_session() wpas.dump_monitor()
def test_connect_cmd_bssid_hint(dev, apdev): """cfg80211 connect command with bssid_hint""" params = {"ssid": "sta-connect"} hostapd.add_ap(apdev[0], params) hostapd.add_ap(apdev[1], params) # This does not really give full coverage with mac80211_hwsim since the # driver does not end up claiming support for driver-based BSS selection. # Anyway, some test coverage can be achieved for setting the parameter and # checking that it does not prevent connection with another BSSID. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", bssid_hint=apdev[0]['bssid']) wpas.request("REMOVE_NETWORK all") wpas.wait_disconnected() wpas.dump_monitor() wpas.request("BSS_FLUSH 0") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", bssid_hint='22:33:44:55:66:77') wpas.request("REMOVE_NETWORK all") wpas.wait_disconnected() wpas.dump_monitor() # Additional coverage using ap_scan=2 to prevent scan entry -based selection # within wpa_supplicant from overriding bssid_hint. try: if "OK" not in wpas.request("AP_SCAN 2"): raise Exception("Failed to set AP_SCAN 2") wpas.request("BSS_FLUSH 0") wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", bssid_hint='22:33:44:55:66:77') wpas.request("REMOVE_NETWORK all") wpas.wait_disconnected() wpas.dump_monitor() finally: wpas.request("AP_SCAN 1") wpas.flush_scan_cache()
def test_connect_cmd_wep_shared(dev, apdev): """WEP Shared key using cfg80211 connect command""" params = { "ssid": "sta-connect-wep", "wep_key0": '"hello"', "auth_algs": "2" } hapd = hostapd.add_ap(apdev[0]['ifname'], params) wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") id = wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", auth_alg="SHARED", wep_key0='"hello"') wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.remove_network(id) wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", auth_alg="OPEN SHARED", wep_key0='"hello"') wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) wpas.request("DISCONNECT") wpas.wait_disconnected() wpas.dump_monitor()
def test_autogo_force_diff_channel(dev, apdev): """P2P autonomous GO and station interface operate on different channels""" with HWSimRadio(n_channels=2) as (radio, iface): wpas = WpaSupplicant(global_iface="/tmp/wpas-wlan5") wpas.interface_add(iface) if wpas.get_mcc() < 2: raise Exception("New radio does not support MCC") wpas.request("SET p2p_no_group_iface 0") hapd = hostapd.add_ap(apdev[0]["ifname"], {"ssid": "ap-test", "channel": "1"}) wpas.connect("ap-test", key_mgmt="NONE", scan_freq="2412") wpas.dump_monitor() channels = {2: 2417, 5: 2432, 9: 2452} for key in channels: res_go = autogo(wpas, channels[key]) wpas.dump_monitor() hwsim_utils.test_connectivity(wpas, hapd) if int(res_go["freq"]) == 2412: raise Exception("Group operation channel is: 2412 excepted: " + res_go["freq"]) wpas.remove_group(res_go["ifname"]) wpas.dump_monitor()
def test_scan_fail(dev, apdev): """Scan failures""" with fail_test(dev[0], 1, "wpa_driver_nl80211_scan"): dev[0].request("DISCONNECT") if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") dev[0].dump_monitor() for i in range(1, 5): with alloc_fail(dev[0], i, "wpa_scan_clone_params;wpa_supplicant_trigger_scan"): if "OK" not in dev[0].request("SCAN ssid 112233 freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") dev[0].dump_monitor() with alloc_fail(dev[0], 1, "radio_add_work;wpa_supplicant_trigger_scan"): if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") dev[0].dump_monitor() try: if "OK" not in dev[0].request("SET filter_ssids 1"): raise Exception("SET failed") id = dev[0].connect("test-scan", key_mgmt="NONE", only_add_network=True) with alloc_fail(dev[0], 1, "wpa_supplicant_build_filter_ssids"): # While the filter list cannot be created due to memory allocation # failure, this scan is expected to be completed without SSID # filtering. if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"]) if ev is None: raise Exception("Scan did not complete") dev[0].remove_network(id) finally: dev[0].request("SET filter_ssids 0") dev[0].dump_monitor() with alloc_fail(dev[0], 1, "nl80211_get_scan_results"): if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=5) if ev is None: raise Exception("Did not see scan started event") wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") dev[0].dump_monitor() try: if "OK" not in dev[0].request("SET setband 2G"): raise Exception("SET setband failed") with alloc_fail(dev[0], 1, "=wpa_setband_scan_freqs_list"): # While the frequency list cannot be created due to memory # allocation failure, this scan is expected to be completed without # frequency filtering. if "OK" not in dev[0].request("SCAN"): raise Exception("SCAN failed") wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") dev[0].request("ABORT_SCAN") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"]) if ev is None: raise Exception("Scan did not complete") finally: dev[0].request("SET setband AUTO") dev[0].dump_monitor() wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") wpas.request("SET preassoc_mac_addr 1") with fail_test(wpas, 1, "nl80211_set_mac_addr;wpas_trigger_scan_cb"): if "OK" not in wpas.request("SCAN freq=2412"): raise Exception("SCAN failed") ev = wpas.wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") wpas.request("SET preassoc_mac_addr 0") wpas.dump_monitor() hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) with alloc_fail(dev[0], 1, "wpa_bss_add"): dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
def test_ap_pmf_sta_sa_query(dev, apdev): """WPA2-PSK AP with station using SA Query""" ssid = "assoc-comeback" addr = dev[0].own_addr() wt = Wlantest() wt.flush() wt.add_passphrase("12345678") wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="use_monitor=1") id = wpas.add_network() wpas.set_network(id, "mode", "2") wpas.set_network_quoted(id, "ssid", ssid) wpas.set_network(id, "proto", "WPA2") wpas.set_network(id, "key_mgmt", "WPA-PSK-SHA256") wpas.set_network(id, "ieee80211w", "2") wpas.set_network_quoted(id, "psk", "12345678") wpas.set_network(id, "pairwise", "CCMP") wpas.set_network(id, "group", "CCMP") wpas.set_network(id, "frequency", "2412") wpas.connect_network(id) bssid = wpas.own_addr() wpas.dump_monitor() dev[0].connect(ssid, psk="12345678", ieee80211w="1", key_mgmt="WPA-PSK WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") wpas.dump_monitor() wpas.request("DEAUTHENTICATE " + addr + " test=0") wpas.dump_monitor() wpas.request("DISASSOCIATE " + addr + " test=0") wpas.dump_monitor() ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1) if ev is not None: raise Exception("Unexpected disconnection") wpas.request("DEAUTHENTICATE " + addr + " reason=6 test=0") wpas.dump_monitor() wpas.request("DISASSOCIATE " + addr + " reason=7 test=0") wpas.dump_monitor() ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1) if ev is not None: raise Exception("Unexpected disconnection") if wt.get_sta_counter("valid_saqueryreq_tx", bssid, addr) < 1: raise Exception("STA did not send SA Query") if wt.get_sta_counter("valid_saqueryresp_rx", bssid, addr) < 1: raise Exception("AP did not reply to SA Query") wpas.dump_monitor()
def test_wpas_config_file(dev, apdev, params): """wpa_supplicant config file parsing/writing""" config = os.path.join(params['logdir'], 'wpas_config_file.conf') if os.path.exists(config): try: os.remove(config) except: pass try: os.rmdir(config) except: pass wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') try: wpas.interface_add("wlan5", config=config) initialized = True except: initialized = False if initialized: raise Exception("Missing config file did not result in an error") try: with open(config, "w") as f: f.write("update_config=1 \t\r\n") f.write("# foo\n") f.write("\n") f.write(" \t\reapol_version=2") for i in range(0, 100): f.write(" ") f.write("foo\n") f.write("device_name=name#foo\n") wpas.interface_add("wlan5", config=config) capa = {} capa['mesh'] = "MESH" in wpas.get_capability("modes") capa['sae'] = "SAE" in wpas.get_capability("auth_alg") id = wpas.add_network() wpas.set_network_quoted(id, "ssid", "foo") wpas.set_network_quoted(id, "psk", "12345678") wpas.set_network(id, "bssid", "00:11:22:33:44:55") wpas.set_network(id, "proto", "RSN") wpas.set_network(id, "key_mgmt", "WPA-PSK-SHA256") wpas.set_network(id, "pairwise", "CCMP") wpas.set_network(id, "group", "CCMP") wpas.set_network(id, "auth_alg", "OPEN") id = wpas.add_cred() wpas.set_cred(id, "priority", "3") wpas.set_cred(id, "sp_priority", "6") wpas.set_cred(id, "update_identifier", "4") wpas.set_cred(id, "ocsp", "1") wpas.set_cred(id, "eap", "TTLS") wpas.set_cred(id, "req_conn_capab", "6:1234") wpas.set_cred_quoted(id, "realm", "example.com") wpas.set_cred_quoted(id, "provisioning_sp", "example.com") wpas.set_cred_quoted(id, "domain", "example.com") wpas.set_cred_quoted(id, "domain_suffix_match", "example.com") wpas.set_cred(id, "roaming_consortium", "112233") wpas.set_cred(id, "required_roaming_consortium", "112233") wpas.set_cred_quoted(id, "roaming_consortiums", "112233,aabbccddee,445566") wpas.set_cred_quoted(id, "roaming_partner", "roaming.example.net,1,127,*") wpas.set_cred_quoted(id, "ca_cert", "/tmp/ca.pem") wpas.set_cred_quoted(id, "username", "user") wpas.set_cred_quoted(id, "password", "secret") ev = wpas.wait_event(["CRED-MODIFIED 0 password"]) wpas.request("SET blob foo 12345678") for field, value in config_checks: if supported_param(capa, field): wpas.set(field, value) if "OK" not in wpas.request("SAVE_CONFIG"): raise Exception("Failed to save configuration file") if "OK" not in wpas.global_request("SAVE_CONFIG"): raise Exception("Failed to save configuration file") wpas.interface_remove("wlan5") data1 = check_config(capa, config) wpas.interface_add("wlan5", config=config) if len(wpas.list_networks()) != 1: raise Exception("Unexpected number of networks") if len(wpas.request("LIST_CREDS").splitlines()) != 2: raise Exception("Unexpected number of credentials") val = wpas.get_cred(0, "roaming_consortiums") if val != "112233,aabbccddee,445566": raise Exception("Unexpected roaming_consortiums value: " + val) if "OK" not in wpas.request("SAVE_CONFIG"): raise Exception("Failed to save configuration file") data2 = check_config(capa, config) if data1 != data2: logger.debug(data1) logger.debug(data2) raise Exception("Unexpected configuration change") wpas.request("SET update_config 0") wpas.global_request("SET update_config 0") if "OK" in wpas.request("SAVE_CONFIG"): raise Exception("SAVE_CONFIG succeeded unexpectedly") if "OK" in wpas.global_request("SAVE_CONFIG"): raise Exception("SAVE_CONFIG (global) succeeded unexpectedly") # replace the config file with a directory to break writing/renaming os.remove(config) os.mkdir(config) wpas.request("SET update_config 1") wpas.global_request("SET update_config 1") if "OK" in wpas.request("SAVE_CONFIG"): raise Exception("SAVE_CONFIG succeeded unexpectedly") if "OK" in wpas.global_request("SAVE_CONFIG"): raise Exception("SAVE_CONFIG (global) succeeded unexpectedly") finally: try: os.rmdir(config) except: pass wpas.dump_monitor() wpas.request("SET country 00") wpas.wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=1)
class FstSTA(FstDevice): def __init__(self, iface, fst_group, fst_pri, fst_llt=None, rsn=False): """If fst_group is empty, then FST parameters will not be set If fst_llt is empty, the parameter will not be set and the default value is expected to be configured.""" FstDevice.__init__(self, iface, fst_group, fst_pri, fst_llt, rsn) self.connected = None # FstAP object the station is connected to def start(self): """Current implementation involves running another instance of wpa_supplicant with fixed FST STAs configurations. When any type of dynamic STA loading is implemented, rewrite the function similarly to FstAP.""" h = self.get_instance() h.interface_add(self.iface, drv_params="force_connect_cmd=1") if not h.global_ping(): raise Exception("Could not ping FST wpa_supplicant") if len(self.fst_group) != 0: self.send_iface_attach_request(self.iface, self.fst_group, self.fst_llt, self.fst_pri) return None def stop(self): """Removes the STA. In a static (temporary) implementation does nothing, the STA will be removed when the fst wpa_supplicant process is killed by fstap.cleanup().""" h = self.get_instance() h.dump_monitor() if len(self.fst_group) != 0: self.remove_all_sessions() self.send_iface_detach_request(self.iface) h.dump_monitor() h.interface_remove(self.iface) h.close_ctrl() del h self.instance = None def get_instance(self): """Return the Hostapd/WpaSupplicant instance""" if self.instance is None: self.instance = WpaSupplicant(global_iface='/tmp/wpas-wlan5') return self.instance def get_own_mac_address(self): """Gets the device's own MAC address""" h = self.get_instance() status = h.get_status() return status['address'] def get_actual_peer_addr(self): """Gets the peer address. A connected station address is returned""" h = self.get_instance() status = h.get_status() return status['bssid'] def grequest(self, req): """Send request on the global control interface""" logger.debug("FstSTA::grequest: " + req) h = self.get_instance() return h.global_request(req) def wait_gevent(self, events, timeout=None): """Wait for a list of events on the global interface""" h = self.get_instance() if timeout is not None: return h.wait_global_event(events, timeout=timeout) else: return h.wait_global_event(events) def scan(self, freq=None, no_wait=False, only_new=False): """Issue Scan with given parameters. Returns the BSS dictionary for the AP found (the 1st BSS found. TODO: What if the AP required is not the 1st in list?) or None if no BSS found. None call be also a result of no_wait=True. Note, request("SCAN_RESULTS") can be used to get all the results at once.""" h = self.get_instance() h.dump_monitor() h.scan(None, freq, no_wait, only_new) r = h.get_bss('0') h.dump_monitor() return r def connect(self, ap, **kwargs): """Connects to the given AP""" if not isinstance(ap, FstAP): raise Exception("Bad AP object to connect to") h = self.get_instance() hap = ap.get_instance() h.dump_monitor() h.connect(ap.get_ssid(), **kwargs) h.dump_monitor() self.connected = ap def connect_to_external_ap(self, ap, ssid, check_connection=True, **kwargs): """Connects to the given external AP""" if not isinstance(ap, hostapd.Hostapd): raise Exception("Bad AP object to connect to") h = self.get_instance() h.dump_monitor() h.connect(ssid, **kwargs) self.connected = ap if check_connection: ev = ap.wait_event(["AP-STA-CONNECTED"], timeout=10) if ev is None: self.connected = None raise Exception("No connection event received from %s" % ssid) h.dump_monitor() def disconnect(self, check_disconnect=True): """Disconnects from the AP the station is currently connected to""" if self.connected is not None: h = self.get_instance() h.dump_monitor() h.request("DISCONNECT") if check_disconnect: hap = self.connected.get_instance() ev = hap.wait_event(["AP-STA-DISCONNECTED"], timeout=10) if ev is None: raise Exception("No disconnection event received from %s" % self.connected.get_ssid()) h.dump_monitor() self.connected = None def disconnect_from_external_ap(self, check_disconnect=True): """Disconnects from the external AP the station is currently connected to""" if self.connected is not None: h = self.get_instance() h.dump_monitor() h.request("DISCONNECT") if check_disconnect: hap = self.connected ev = hap.wait_event(["AP-STA-DISCONNECTED"], timeout=10) if ev is None: raise Exception("No disconnection event received from AP") h.dump_monitor() self.connected = None def dump_monitor(self): """Dump control interface monitor events""" if self.instance: self.instance.dump_monitor()
def test_ap_pmf_sta_sa_query_no_response(dev, apdev): """WPA2-PSK AP with station using SA Query and getting no response""" ssid = "assoc-comeback" addr = dev[0].own_addr() wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="use_monitor=1") id = wpas.add_network() wpas.set_network(id, "mode", "2") wpas.set_network_quoted(id, "ssid", ssid) wpas.set_network(id, "proto", "WPA2") wpas.set_network(id, "key_mgmt", "WPA-PSK-SHA256") wpas.set_network(id, "ieee80211w", "2") wpas.set_network_quoted(id, "psk", "12345678") wpas.set_network(id, "pairwise", "CCMP") wpas.set_network(id, "group", "CCMP") wpas.set_network(id, "frequency", "2412") wpas.connect_network(id) bssid = wpas.own_addr() wpas.dump_monitor() dev[0].connect(ssid, psk="12345678", ieee80211w="1", key_mgmt="WPA-PSK WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") wpas.dump_monitor() wpas.request("DEAUTHENTICATE " + addr + " test=0") wpas.dump_monitor() wpas.request("DISASSOCIATE " + addr + " test=0") wpas.dump_monitor() ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1) if ev is not None: raise Exception("Unexpected disconnection") wpas.request("SET ext_mgmt_frame_handling 1") wpas.request("DEAUTHENTICATE " + addr + " reason=6 test=0") wpas.dump_monitor() wpas.request("DISASSOCIATE " + addr + " reason=7 test=0") wpas.dump_monitor() dev[0].wait_disconnected() wpas.dump_monitor() wpas.request("SET ext_mgmt_frame_handling 0") dev[0].wait_connected() wpas.dump_monitor()
def test_p2p_delay_go_csa(dev, apdev, params): """P2P GO CSA delayed when inviting a P2P Device to an active P2P Group""" with HWSimRadio(n_channels=2) as (radio, iface): wpas = WpaSupplicant(global_iface="/tmp/wpas-wlan5") wpas.interface_add(iface) wpas.global_request("SET p2p_no_group_iface 0") if wpas.get_mcc() < 2: raise Exception("New radio does not support MCC") addr0 = wpas.p2p_dev_addr() addr1 = dev[1].p2p_dev_addr() try: dev[1].p2p_listen() if not wpas.discover_peer(addr1, social=True): raise Exception("Peer " + addr1 + " not found") wpas.p2p_stop_find() hapd = hostapd.add_ap(apdev[0]["ifname"], {"ssid": "bss-2.4ghz", "channel": "1"}) wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412") wpas.global_request("SET p2p_go_freq_change_policy 0") wpas.dump_monitor() logger.info("Start GO on channel 6") res = autogo(wpas, freq=2437) if res["freq"] != "2437": raise Exception("GO set on a freq=%s instead of 2437" % res["freq"]) # Start find on dev[1] to run scans with dev[2] in parallel dev[1].p2p_find(social=True) # Use another client device to stop the initial client connection # timeout on the GO if not dev[2].discover_peer(addr0, social=True): raise Exception("Peer2 did not find the GO") dev[2].p2p_stop_find() pin = dev[2].wps_read_pin() wpas.p2p_go_authorize_client(pin) dev[2].global_request("P2P_CONNECT " + addr0 + " " + pin + " join freq=2437") ev = dev[2].wait_global_event(["P2P-GROUP-STARTED"], timeout=10) if ev is None: raise Exception("Peer2 did not get connected") if not dev[1].discover_peer(addr0, social=True): raise Exception("Peer did not find the GO") pin = dev[1].wps_read_pin() dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " join auth") dev[1].p2p_listen() # Force P2P GO channel switch on successful invitation signaling wpas.group_request("SET p2p_go_csa_on_inv 1") logger.info("Starting invitation") wpas.p2p_go_authorize_client(pin) wpas.global_request("P2P_INVITE group=" + wpas.group_ifname + " peer=" + addr1) ev = dev[1].wait_global_event(["P2P-INVITATION-RECEIVED", "P2P-GROUP-STARTED"], timeout=10) if ev is None: raise Exception("Timeout on invitation on peer") if "P2P-INVITATION-RECEIVED" in ev: raise Exception("Unexpected request to accept pre-authorized invitation") # A P2P GO move is not expected at this stage, as during the # invitation signaling, the P2P GO includes only its current # operating channel in the channel list, and as the invitation # response can only include channels that were also in the # invitation request channel list, the group common channels # includes only the current P2P GO operating channel. ev = wpas.wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP", "AP-CSA-FINISHED"], timeout=1) if ev is not None: raise Exception("Unexpected + " + ev + " event") finally: wpas.global_request("SET p2p_go_freq_change_policy 2")
class FstSTA (FstDevice): def __init__(self, iface, fst_group, fst_pri, fst_llt=None, rsn=False): """If fst_group is empty, then FST parameters will not be set If fst_llt is empty, the parameter will not be set and the default value is expected to be configured.""" FstDevice.__init__(self, iface, fst_group, fst_pri, fst_llt, rsn) self.connected = None # FstAP object the station is connected to def start(self): """Current implementation involves running another instance of wpa_supplicant with fixed FST STAs configurations. When any type of dynamic STA loading is implemented, rewrite the function similarly to FstAP.""" h = self.get_instance() h.interface_add(self.iface, drv_params="force_connect_cmd=1") if not h.global_ping(): raise Exception("Could not ping FST wpa_supplicant") if len(self.fst_group) != 0: self.send_iface_attach_request(self.iface, self.fst_group, self.fst_llt, self.fst_pri) return None def stop(self): """Removes the STA. In a static (temporary) implementation does nothing, the STA will be removed when the fst wpa_supplicant process is killed by fstap.cleanup().""" h = self.get_instance() h.dump_monitor() if len(self.fst_group) != 0: self.remove_all_sessions() self.send_iface_detach_request(self.iface) h.dump_monitor() h.interface_remove(self.iface) h.close_ctrl() del h self.instance = None def get_instance(self): """Return the Hostapd/WpaSupplicant instance""" if self.instance is None: self.instance = WpaSupplicant(global_iface='/tmp/wpas-wlan5') return self.instance def get_own_mac_address(self): """Gets the device's own MAC address""" h = self.get_instance() status = h.get_status() return status['address'] def get_actual_peer_addr(self): """Gets the peer address. A connected station address is returned""" h = self.get_instance() status = h.get_status() return status['bssid'] def grequest(self, req): """Send request on the global control interface""" logger.debug("FstSTA::grequest: " + req) h = self.get_instance() return h.global_request(req) def wait_gevent(self, events, timeout=None): """Wait for a list of events on the global interface""" h = self.get_instance() if timeout is not None: return h.wait_global_event(events, timeout=timeout) else: return h.wait_global_event(events) def scan(self, freq=None, no_wait=False, only_new=False): """Issue Scan with given parameters. Returns the BSS dictionary for the AP found (the 1st BSS found. TODO: What if the AP required is not the 1st in list?) or None if no BSS found. None call be also a result of no_wait=True. Note, request("SCAN_RESULTS") can be used to get all the results at once.""" h = self.get_instance() h.dump_monitor() h.scan(None, freq, no_wait, only_new) r = h.get_bss('0') h.dump_monitor() return r def connect(self, ap, **kwargs): """Connects to the given AP""" if not isinstance(ap, FstAP): raise Exception("Bad AP object to connect to") h = self.get_instance() hap = ap.get_instance() h.dump_monitor() h.connect(ap.get_ssid(), **kwargs) h.dump_monitor() self.connected = ap def connect_to_external_ap(self, ap, ssid, check_connection=True, **kwargs): """Connects to the given external AP""" if not isinstance(ap, hostapd.Hostapd): raise Exception("Bad AP object to connect to") h = self.get_instance() h.dump_monitor() h.connect(ssid, **kwargs) self.connected = ap if check_connection: ev = ap.wait_event([ "AP-STA-CONNECTED" ], timeout=10) if ev is None: self.connected = None raise Exception("No connection event received from %s" % ssid) h.dump_monitor() def disconnect(self, check_disconnect=True): """Disconnects from the AP the station is currently connected to""" if self.connected is not None: h = self.get_instance() h.dump_monitor() h.request("DISCONNECT") if check_disconnect: hap = self.connected.get_instance() ev = hap.wait_event([ "AP-STA-DISCONNECTED" ], timeout=10) if ev is None: raise Exception("No disconnection event received from %s" % self.connected.get_ssid()) h.dump_monitor() self.connected = None def disconnect_from_external_ap(self, check_disconnect=True): """Disconnects from the external AP the station is currently connected to""" if self.connected is not None: h = self.get_instance() h.dump_monitor() h.request("DISCONNECT") if check_disconnect: hap = self.connected ev = hap.wait_event([ "AP-STA-DISCONNECTED" ], timeout=10) if ev is None: raise Exception("No disconnection event received from AP") h.dump_monitor() self.connected = None def dump_monitor(self): """Dump control interface monitor events""" if self.instance: self.instance.dump_monitor()
def test_scan_fail(dev, apdev): """Scan failures""" with fail_test(dev[0], 1, "wpa_driver_nl80211_scan"): dev[0].request("DISCONNECT") if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") dev[0].dump_monitor() for i in range(1, 5): with alloc_fail(dev[0], i, "wpa_scan_clone_params;wpa_supplicant_trigger_scan"): if "OK" not in dev[0].request("SCAN ssid 112233 freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") dev[0].dump_monitor() with alloc_fail(dev[0], 1, "radio_add_work;wpa_supplicant_trigger_scan"): if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") dev[0].dump_monitor() try: if "OK" not in dev[0].request("SET filter_ssids 1"): raise Exception("SET failed") id = dev[0].connect("test-scan", key_mgmt="NONE", only_add_network=True) with alloc_fail(dev[0], 1, "wpa_supplicant_build_filter_ssids"): # While the filter list cannot be created due to memory allocation # failure, this scan is expected to be completed without SSID # filtering. if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"]) if ev is None: raise Exception("Scan did not complete") dev[0].remove_network(id) finally: dev[0].request("SET filter_ssids 0") dev[0].dump_monitor() with alloc_fail(dev[0], 1, "nl80211_get_scan_results"): if "OK" not in dev[0].request("SCAN freq=2412"): raise Exception("SCAN failed") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=5) if ev is None: raise Exception("Did not see scan started event") wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") dev[0].dump_monitor() try: if "OK" not in dev[0].request("SET setband 2G"): raise Exception("SET setband failed") with alloc_fail(dev[0], 1, "=wpa_setband_scan_freqs_list"): # While the frequency list cannot be created due to memory # allocation failure, this scan is expected to be completed without # frequency filtering. if "OK" not in dev[0].request("SCAN"): raise Exception("SCAN failed") wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") dev[0].request("ABORT_SCAN") ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"]) if ev is None: raise Exception("Scan did not complete") finally: dev[0].request("SET setband AUTO") dev[0].dump_monitor() wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") wpas.request("SET preassoc_mac_addr 1") with fail_test(wpas, 1, "nl80211_set_mac_addr;wpas_trigger_scan_cb"): if "OK" not in wpas.request("SCAN freq=2412"): raise Exception("SCAN failed") ev = wpas.wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=5) if ev is None: raise Exception("Did not see scan failure event") wpas.request("SET preassoc_mac_addr 0") wpas.dump_monitor() hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) with alloc_fail(dev[0], 1, "wpa_bss_add"): dev[0].scan_for_bss(apdev[0]['bssid'], freq="2412")
def test_p2p_delay_go_csa(dev, apdev, params): """P2P GO CSA delayed when inviting a P2P Device to an active P2P Group""" with HWSimRadio(n_channels=2) as (radio, iface): wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add(iface) wpas.global_request("SET p2p_no_group_iface 0") if wpas.get_mcc() < 2: raise Exception("New radio does not support MCC") addr0 = wpas.p2p_dev_addr() addr1 = dev[1].p2p_dev_addr() try: dev[1].p2p_listen() if not wpas.discover_peer(addr1, social=True): raise Exception("Peer " + addr1 + " not found") wpas.p2p_stop_find() hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'bss-2.4ghz', "channel": '1' }) wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412") wpas.global_request("SET p2p_go_freq_change_policy 0") wpas.dump_monitor() logger.info("Start GO on channel 6") res = autogo(wpas, freq=2437) if res['freq'] != "2437": raise Exception("GO set on a freq=%s instead of 2437" % res['freq']) # Start find on dev[1] to run scans with dev[2] in parallel dev[1].p2p_find(social=True) # Use another client device to stop the initial client connection # timeout on the GO if not dev[2].discover_peer(addr0, social=True): raise Exception("Peer2 did not find the GO") dev[2].p2p_stop_find() pin = dev[2].wps_read_pin() wpas.p2p_go_authorize_client(pin) dev[2].global_request("P2P_CONNECT " + addr0 + " " + pin + " join freq=2437") ev = dev[2].wait_global_event(["P2P-GROUP-STARTED"], timeout=10) if ev is None: raise Exception("Peer2 did not get connected") if not dev[1].discover_peer(addr0, social=True): raise Exception("Peer did not find the GO") pin = dev[1].wps_read_pin() dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " join auth") dev[1].p2p_listen() # Force P2P GO channel switch on successful invitation signaling wpas.group_request("SET p2p_go_csa_on_inv 1") logger.info("Starting invitation") wpas.p2p_go_authorize_client(pin) wpas.global_request("P2P_INVITE group=" + wpas.group_ifname + " peer=" + addr1) ev = dev[1].wait_global_event( ["P2P-INVITATION-RECEIVED", "P2P-GROUP-STARTED"], timeout=10) if ev is None: raise Exception("Timeout on invitation on peer") if "P2P-INVITATION-RECEIVED" in ev: raise Exception( "Unexpected request to accept pre-authorized invitation") # A P2P GO move is not expected at this stage, as during the # invitation signaling, the P2P GO includes only its current # operating channel in the channel list, and as the invitation # response can only include channels that were also in the # invitation request channel list, the group common channels # includes only the current P2P GO operating channel. ev = wpas.wait_group_event( ["P2P-REMOVE-AND-REFORM-GROUP", "AP-CSA-FINISHED"], timeout=1) if ev is not None: raise Exception("Unexpected + " + ev + " event") finally: wpas.global_request("SET p2p_go_freq_change_policy 2")
def test_ap_pmf_sta_sa_query(dev, apdev): """WPA2-PSK AP with station using SA Query""" ssid = "assoc-comeback" addr = dev[0].own_addr() wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5", drv_params="use_monitor=1") id = wpas.add_network() wpas.set_network(id, "mode", "2") wpas.set_network_quoted(id, "ssid", ssid) wpas.set_network(id, "proto", "WPA2") wpas.set_network(id, "key_mgmt", "WPA-PSK-SHA256") wpas.set_network(id, "ieee80211w", "2") wpas.set_network_quoted(id, "psk", "12345678") wpas.set_network(id, "pairwise", "CCMP") wpas.set_network(id, "group", "CCMP") wpas.set_network(id, "frequency", "2412") wpas.connect_network(id) bssid = wpas.own_addr() wpas.dump_monitor() Wlantest.setup(wpas) wt = Wlantest() wt.flush() wt.add_passphrase("12345678") dev[0].connect(ssid, psk="12345678", ieee80211w="1", key_mgmt="WPA-PSK WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") wpas.dump_monitor() wpas.request("DEAUTHENTICATE " + addr + " test=0") wpas.dump_monitor() wpas.request("DISASSOCIATE " + addr + " test=0") wpas.dump_monitor() ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1) if ev is not None: raise Exception("Unexpected disconnection") wpas.request("DEAUTHENTICATE " + addr + " reason=6 test=0") wpas.dump_monitor() wpas.request("DISASSOCIATE " + addr + " reason=7 test=0") wpas.dump_monitor() ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=1) if ev is not None: raise Exception("Unexpected disconnection") if wt.get_sta_counter("valid_saqueryreq_tx", bssid, addr) < 1: raise Exception("STA did not send SA Query") if wt.get_sta_counter("valid_saqueryresp_rx", bssid, addr) < 1: raise Exception("AP did not reply to SA Query") wpas.dump_monitor()