After successfully passing the 525 tests on a remote setup mark the tests as remote compatible. Signed-off-by: Jonathan Afek <jonathanx.afek@xxxxxxxxx> --- tests/hwsim/test_ap_ciphers.py | 7 +++ tests/hwsim/test_ap_config.py | 2 + tests/hwsim/test_ap_csa.py | 10 +++++ tests/hwsim/test_ap_dynamic.py | 7 +++ tests/hwsim/test_ap_ft.py | 11 +++++ tests/hwsim/test_ap_hs20.py | 12 +++++ tests/hwsim/test_ap_ht.py | 12 +++++ tests/hwsim/test_ap_open.py | 18 ++++++++ tests/hwsim/test_ap_params.py | 13 ++++++ tests/hwsim/test_ap_pmf.py | 10 +++++ tests/hwsim/test_ap_psk.py | 37 +++++++++++++++ tests/hwsim/test_ap_qosmap.py | 5 +++ tests/hwsim/test_ap_roam.py | 7 +++ tests/hwsim/test_ap_tdls.py | 2 + tests/hwsim/test_ap_vlan.py | 3 ++ tests/hwsim/test_ap_wps.py | 85 +++++++++++++++++++++++++++++++++++ tests/hwsim/test_autoscan.py | 2 + tests/hwsim/test_cfg80211.py | 4 ++ tests/hwsim/test_dfs.py | 2 + tests/hwsim/test_ext_password.py | 2 + tests/hwsim/test_gas.py | 3 ++ tests/hwsim/test_hapd_ctrl.py | 18 ++++++++ tests/hwsim/test_hostapd_oom.py | 4 ++ tests/hwsim/test_ibss.py | 2 + tests/hwsim/test_ieee8021x.py | 2 + tests/hwsim/test_mbo.py | 5 +++ tests/hwsim/test_monitor_interface.py | 2 + tests/hwsim/test_nfc_p2p.py | 3 ++ tests/hwsim/test_nfc_wps.py | 8 ++++ tests/hwsim/test_p2p_autogo.py | 10 +++++ tests/hwsim/test_p2p_channel.py | 8 ++++ tests/hwsim/test_p2p_concurrency.py | 9 ++++ tests/hwsim/test_p2p_discovery.py | 7 +++ tests/hwsim/test_p2p_ext.py | 3 ++ tests/hwsim/test_p2p_grpform.py | 36 +++++++++++++++ tests/hwsim/test_p2p_invitation.py | 5 +++ tests/hwsim/test_p2p_messages.py | 8 ++++ tests/hwsim/test_p2p_persistent.py | 16 +++++++ tests/hwsim/test_p2p_service.py | 17 +++++++ tests/hwsim/test_p2p_set.py | 3 ++ tests/hwsim/test_p2p_wifi_display.py | 2 + tests/hwsim/test_p2ps.py | 30 +++++++++++++ tests/hwsim/test_peerkey.py | 3 ++ tests/hwsim/test_radius.py | 3 ++ tests/hwsim/test_sae.py | 19 ++++++++ tests/hwsim/test_scan.py | 22 +++++++++ tests/hwsim/test_ssid.py | 8 ++++ tests/hwsim/test_wep.py | 4 ++ tests/hwsim/test_wnm.py | 15 +++++++ tests/hwsim/test_wpas_ap.py | 9 ++++ tests/hwsim/test_wpas_ctrl.py | 39 ++++++++++++++++ tests/hwsim/test_wpas_wmm_ac.py | 4 ++ 52 files changed, 578 insertions(+) diff --git a/tests/hwsim/test_ap_ciphers.py b/tests/hwsim/test_ap_ciphers.py index 34dddb9..7af7a4a 100644 --- a/tests/hwsim/test_ap_ciphers.py +++ b/tests/hwsim/test_ap_ciphers.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -63,11 +64,13 @@ def check_group_mgmt_cipher(dev, ap, cipher): if res != group_mgmt: raise Exception("Unexpected group mgmt cipher: " + res) +@remote_compatible def test_ap_cipher_tkip(dev, apdev): """WPA2-PSK/TKIP connection""" skip_with_fips(dev[0]) check_cipher(dev[0], apdev[0], "TKIP") +@remote_compatible def test_ap_cipher_tkip_countermeasures_ap(dev, apdev): """WPA-PSK/TKIP countermeasures (detected by AP)""" skip_with_fips(dev[0]) @@ -100,6 +103,7 @@ def test_ap_cipher_tkip_countermeasures_ap(dev, apdev): if ev is not None: raise Exception("Unexpected connection during TKIP countermeasures") +@remote_compatible def test_ap_cipher_tkip_countermeasures_sta(dev, apdev): """WPA-PSK/TKIP countermeasures (detected by STA)""" skip_with_fips(dev[0]) @@ -132,6 +136,7 @@ def test_ap_cipher_tkip_countermeasures_sta(dev, apdev): if ev is not None: raise Exception("Unexpected connection during TKIP countermeasures") +@remote_compatible def test_ap_cipher_ccmp(dev, apdev): """WPA2-PSK/CCMP connection""" check_cipher(dev[0], apdev[0], "CCMP") @@ -148,6 +153,7 @@ def test_ap_cipher_gcmp_256(dev, apdev): """WPA2-PSK/GCMP-256 connection""" check_cipher(dev[0], apdev[0], "GCMP-256") +@remote_compatible def test_ap_cipher_mixed_wpa_wpa2(dev, apdev): """WPA2-PSK/CCMP/ and WPA-PSK/TKIP mixed configuration""" skip_with_fips(dev[0]) @@ -190,6 +196,7 @@ def test_ap_cipher_mixed_wpa_wpa2(dev, apdev): hwsim_utils.test_connectivity(dev[1], hapd) hwsim_utils.test_connectivity(dev[0], dev[1]) +@remote_compatible def test_ap_cipher_bip(dev, apdev): """WPA2-PSK with BIP""" check_group_mgmt_cipher(dev[0], apdev[0], "AES-128-CMAC") diff --git a/tests/hwsim/test_ap_config.py b/tests/hwsim/test_ap_config.py index 9bb5db9..7fb3bf6 100644 --- a/tests/hwsim/test_ap_config.py +++ b/tests/hwsim/test_ap_config.py @@ -4,8 +4,10 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import hostapd +@remote_compatible def test_ap_config_errors(dev, apdev): """Various hostapd configuration errors""" diff --git a/tests/hwsim/test_ap_csa.py b/tests/hwsim/test_ap_csa.py index 48f1a88..e946cb4 100644 --- a/tests/hwsim/test_ap_csa.py +++ b/tests/hwsim/test_ap_csa.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -36,6 +37,7 @@ def csa_supported(dev): if (int(res['capa.flags'], 0) & 0x80000000) == 0: raise HwsimSkip("CSA not supported") +@remote_compatible def test_ap_csa_1_switch(dev, apdev): """AP Channel Switch, one switch""" csa_supported(dev[0]) @@ -45,6 +47,7 @@ def test_ap_csa_1_switch(dev, apdev): switch_channel(ap, 10, 2462) hwsim_utils.test_connectivity(dev[0], ap) +@remote_compatible def test_ap_csa_2_switches(dev, apdev): """AP Channel Switch, two switches""" csa_supported(dev[0]) @@ -56,6 +59,7 @@ def test_ap_csa_2_switches(dev, apdev): switch_channel(ap, 10, 2412) hwsim_utils.test_connectivity(dev[0], ap) +@remote_compatible def test_ap_csa_1_switch_count_0(dev, apdev): """AP Channel Switch, one switch with count 0""" csa_supported(dev[0]) @@ -66,6 +70,7 @@ def test_ap_csa_1_switch_count_0(dev, apdev): # this does not result in CSA currently, so do not bother checking # connectivity +@remote_compatible def test_ap_csa_2_switches_count_0(dev, apdev): """AP Channel Switch, two switches with count 0""" csa_supported(dev[0]) @@ -79,6 +84,7 @@ def test_ap_csa_2_switches_count_0(dev, apdev): # this does not result in CSA currently, so do not bother checking # connectivity +@remote_compatible def test_ap_csa_1_switch_count_1(dev, apdev): """AP Channel Switch, one switch with count 1""" csa_supported(dev[0]) @@ -89,6 +95,7 @@ def test_ap_csa_1_switch_count_1(dev, apdev): # this does not result in CSA currently, so do not bother checking # connectivity +@remote_compatible def test_ap_csa_2_switches_count_1(dev, apdev): """AP Channel Switch, two switches with count 1""" csa_supported(dev[0]) @@ -102,6 +109,7 @@ def test_ap_csa_2_switches_count_1(dev, apdev): # this does not result in CSA currently, so do not bother checking # connectivity +@remote_compatible def test_ap_csa_1_switch_count_2(dev, apdev): """AP Channel Switch, one switch with count 2""" csa_supported(dev[0]) @@ -111,6 +119,7 @@ def test_ap_csa_1_switch_count_2(dev, apdev): switch_channel(ap, 2, 2462) hwsim_utils.test_connectivity(dev[0], ap) +@remote_compatible def test_ap_csa_ecsa_only(dev, apdev): """AP Channel Switch, one switch with only ECSA IE""" csa_supported(dev[0]) @@ -120,6 +129,7 @@ def test_ap_csa_ecsa_only(dev, apdev): switch_channel(ap, 10, 2462) hwsim_utils.test_connectivity(dev[0], ap) +@remote_compatible def test_ap_csa_invalid(dev, apdev): """AP Channel Switch - invalid channel""" csa_supported(dev[0]) diff --git a/tests/hwsim/test_ap_dynamic.py b/tests/hwsim/test_ap_dynamic.py index 85ab35c..5c4bbc2 100644 --- a/tests/hwsim/test_ap_dynamic.py +++ b/tests/hwsim/test_ap_dynamic.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import subprocess import logging @@ -15,6 +16,7 @@ import hostapd from utils import alloc_fail from test_ap_acs import force_prev_ap_on_24g +@remote_compatible def test_ap_change_ssid(dev, apdev): """Dynamic SSID change with hostapd and WPA2-PSK""" params = hostapd.wpa2_params(ssid="test-wpa2-psk-start", @@ -210,6 +212,7 @@ def invalid_ap(ap): raise Exception("ENABLE command succeeded unexpectedly") return hapd +@remote_compatible def test_ap_invalid_config(dev, apdev): """Try to start AP with invalid configuration and fix configuration""" hapd = invalid_ap(apdev[0]) @@ -219,6 +222,7 @@ def test_ap_invalid_config(dev, apdev): hapd.enable() dev[0].connect("invalid-config", key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ap_invalid_config2(dev, apdev): """Try to start AP with invalid configuration and remove interface""" hapd = invalid_ap(apdev[0]) @@ -259,6 +263,7 @@ def test_ap_remove_during_acs3(dev, apdev): hapd.enable() hostapd.remove_bss(apdev[0], ifname2) +@remote_compatible def test_ap_remove_during_ht_coex_scan(dev, apdev): """Remove interface during HT co-ex scan""" params = hostapd.wpa2_params(ssid="test-ht-remove", passphrase="12345678") @@ -294,6 +299,7 @@ def test_ap_remove_during_ht_coex_scan3(dev, apdev): hapd.enable() hostapd.remove_bss(apdev[0], ifname2) +@remote_compatible def test_ap_enable_disable_reenable(dev, apdev): """Enable, disable, re-enable AP""" hapd = hostapd.add_ap(apdev[0], {}, no_enable=True) @@ -435,6 +441,7 @@ def test_ap_multi_bss(dev, apdev): if 'rx_packets' not in sta1 or int(sta1['rx_packets']) < 1: raise Exception("sta1 did not report receiving packets") +@remote_compatible def test_ap_add_with_driver(dev, apdev): """Add hostapd interface with driver specified""" ifname = apdev[0]['ifname'] diff --git a/tests/hwsim/test_ap_ft.py b/tests/hwsim/test_ap_ft.py index ccdefb2..0ed93fe 100644 --- a/tests/hwsim/test_ap_ft.py +++ b/tests/hwsim/test_ap_ft.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import os import time @@ -230,6 +231,7 @@ def test_ap_ft_over_ds_many(dev, apdev): run_roams(dev[0], apdev, hapd0, hapd1, ssid, passphrase, over_ds=True, roams=50) +@remote_compatible def test_ap_ft_over_ds_unknown_target(dev, apdev): """WPA2-PSK-FT AP""" ssid = "test-ft" @@ -242,6 +244,7 @@ def test_ap_ft_over_ds_unknown_target(dev, apdev): scan_freq="2412") dev[0].roam_over_ds("02:11:22:33:44:55", fail_test=True) +@remote_compatible def test_ap_ft_over_ds_unexpected(dev, apdev): """WPA2-PSK-FT AP over DS and unexpected response""" ssid = "test-ft" @@ -473,6 +476,7 @@ def test_ap_ft_eap_pull(dev, apdev): run_roams(dev[0], apdev, hapd, hapd1, ssid, passphrase, eap=True) +@remote_compatible def test_ap_ft_mismatching_rrb_key_push(dev, apdev): """WPA2-PSK-FT AP over DS with mismatching RRB key (push)""" ssid = "test-ft" @@ -488,6 +492,7 @@ def test_ap_ft_mismatching_rrb_key_push(dev, apdev): run_roams(dev[0], apdev, hapd0, hapd1, ssid, passphrase, over_ds=True, fail_test=True) +@remote_compatible def test_ap_ft_mismatching_rrb_key_pull(dev, apdev): """WPA2-PSK-FT AP over DS with mismatching RRB key (pull)""" ssid = "test-ft" @@ -503,6 +508,7 @@ def test_ap_ft_mismatching_rrb_key_pull(dev, apdev): run_roams(dev[0], apdev, hapd0, hapd1, ssid, passphrase, over_ds=True, fail_test=True) +@remote_compatible def test_ap_ft_mismatching_r0kh_id_pull(dev, apdev): """WPA2-PSK-FT AP over DS with mismatching R0KH-ID (pull)""" ssid = "test-ft" @@ -522,6 +528,7 @@ def test_ap_ft_mismatching_r0kh_id_pull(dev, apdev): dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412") dev[0].roam_over_ds(apdev[1]['bssid'], fail_test=True) +@remote_compatible def test_ap_ft_mismatching_rrb_r0kh_push(dev, apdev): """WPA2-PSK-FT AP over DS with mismatching R0KH key (push)""" ssid = "test-ft" @@ -537,6 +544,7 @@ def test_ap_ft_mismatching_rrb_r0kh_push(dev, apdev): run_roams(dev[0], apdev, hapd0, hapd1, ssid, passphrase, over_ds=True, fail_test=True) +@remote_compatible def test_ap_ft_mismatching_rrb_r0kh_pull(dev, apdev): """WPA2-PSK-FT AP over DS with mismatching R0KH key (pull)""" ssid = "test-ft" @@ -693,6 +701,7 @@ def test_ft_psk_key_lifetime_in_memory(dev, apdev, params): verify_not_present(buf, tk, fname, "TK") verify_not_present(buf, gtk, fname, "GTK") +@remote_compatible def test_ap_ft_invalid_resp(dev, apdev): """WPA2-PSK-FT AP and invalid response IEs""" ssid = "test-ft" @@ -844,6 +853,7 @@ def test_ap_ft_over_ds_proto(dev, apdev): msg['payload'] = binascii.unhexlify("0602020000000000" + "020000000400" + "0000" + "3603a1b201" + "3766000000000000000000000000000000000000c4e67ac1999bebd00ff4ae4d5dcaf87896bb060b469f7c78d49623fb395c3455ffffff6b693fe6f8d8c5dfac0a22344750775bd09437f98b238c9f87b97f790c0106000102030406030a6e6173312e77312e6669") hapd0.mgmt_tx(msg) +@remote_compatible def test_ap_ft_rrb(dev, apdev): """WPA2-PSK-FT RRB protocol testing""" ssid = "test-ft" @@ -935,6 +945,7 @@ def test_ap_ft_rrb(dev, apdev): if "OK" not in dev[0].request("DATA_TEST_FRAME " + binascii.hexlify(pkt)): raise Exception("DATA_TEST_FRAME failed") +@remote_compatible def test_rsn_ie_proto_ft_psk_sta(dev, apdev): """RSN element protocol testing for FT-PSK + PMF cases on STA side""" bssid = apdev[0]['bssid'] diff --git a/tests/hwsim/test_ap_hs20.py b/tests/hwsim/test_ap_hs20.py index 1d2ca1e..428fae2 100644 --- a/tests/hwsim/test_ap_hs20.py +++ b/tests/hwsim/test_ap_hs20.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import base64 import binascii import struct @@ -283,6 +284,7 @@ def test_ap_nai_home_realm_query(dev, apdev): if "NAI Realm list" not in ev: raise Exception("Missing NAI Realm list: " + ev) +@remote_compatible def test_ap_interworking_scan_filtering(dev, apdev): """Interworking scan filtering with HESSID and access network type""" try: @@ -563,6 +565,7 @@ def test_ap_hs20_auto_interworking(dev, apdev): if status['hs20'] != "2": raise Exception("Unexpected HS 2.0 support indication") +@remote_compatible def test_ap_hs20_auto_interworking_no_match(dev, apdev): """Hotspot 2.0 connection with auto_interworking=1 and no matching network""" hapd = hostapd.add_ap(apdev[0], { "ssid": "mismatch" }) @@ -602,6 +605,7 @@ def test_ap_hs20_auto_interworking_no_match(dev, apdev): dev[0].dump_monitor() dev[0].request("DISCONNECT") +@remote_compatible def test_ap_hs20_auto_interworking_no_cred_match(dev, apdev): """Hotspot 2.0 connection with auto_interworking=1 but no cred match""" bssid = apdev[0]['bssid'] @@ -638,6 +642,7 @@ def eap_test(dev, ap, eap_params, method, user): interworking_select(dev, bssid, freq="2412") interworking_connect(dev, bssid, method) +@remote_compatible def test_ap_hs20_eap_unknown(dev, apdev): """Hotspot 2.0 connection with unknown EAP method""" bssid = apdev[0]['bssid'] @@ -663,6 +668,7 @@ def test_ap_hs20_eap_peap_gtc(dev, apdev): """Hotspot 2.0 connection with PEAP/GTC""" eap_test(dev[0], apdev[0], "25[3:6]", "PEAP", "user") +@remote_compatible def test_ap_hs20_eap_peap_unknown(dev, apdev): """Hotspot 2.0 connection with PEAP/unknown""" bssid = apdev[0]['bssid'] @@ -689,6 +695,7 @@ def test_ap_hs20_eap_ttls_eap_mschapv2(dev, apdev): check_eap_capa(dev[0], "MSCHAPV2") eap_test(dev[0], apdev[0], "21[3:26][6:7][99:99]", "TTLS", "user") +@remote_compatible def test_ap_hs20_eap_ttls_eap_unknown(dev, apdev): """Hotspot 2.0 connection with TTLS/EAP-unknown""" bssid = apdev[0]['bssid'] @@ -700,6 +707,7 @@ def test_ap_hs20_eap_ttls_eap_unknown(dev, apdev): dev[0].add_cred_values(default_cred()) interworking_select(dev[0], None, no_match=True, freq="2412") +@remote_compatible def test_ap_hs20_eap_ttls_eap_unsupported(dev, apdev): """Hotspot 2.0 connection with TTLS/EAP-OTP(unsupported)""" bssid = apdev[0]['bssid'] @@ -711,6 +719,7 @@ def test_ap_hs20_eap_ttls_eap_unsupported(dev, apdev): dev[0].add_cred_values(default_cred()) interworking_select(dev[0], None, no_match=True, freq="2412") +@remote_compatible def test_ap_hs20_eap_ttls_unknown(dev, apdev): """Hotspot 2.0 connection with TTLS/unknown""" bssid = apdev[0]['bssid'] @@ -748,6 +757,7 @@ def test_ap_hs20_eap_tls(dev, apdev): interworking_select(dev[0], bssid, freq="2412") interworking_connect(dev[0], bssid, "TLS") +@remote_compatible def test_ap_hs20_eap_cert_unknown(dev, apdev): """Hotspot 2.0 connection with certificate, but unknown EAP method""" bssid = apdev[0]['bssid'] @@ -763,6 +773,7 @@ def test_ap_hs20_eap_cert_unknown(dev, apdev): 'private_key': "auth_serv/user.key"}) interworking_select(dev[0], None, no_match=True, freq="2412") +@remote_compatible def test_ap_hs20_eap_cert_unsupported(dev, apdev): """Hotspot 2.0 connection with certificate, but unsupported TTLS""" bssid = apdev[0]['bssid'] @@ -778,6 +789,7 @@ def test_ap_hs20_eap_cert_unsupported(dev, apdev): 'private_key': "auth_serv/user.key"}) interworking_select(dev[0], None, no_match=True, freq="2412") +@remote_compatible def test_ap_hs20_eap_invalid_cred(dev, apdev): """Hotspot 2.0 connection with invalid cred configuration""" bssid = apdev[0]['bssid'] diff --git a/tests/hwsim/test_ap_ht.py b/tests/hwsim/test_ap_ht.py index 2a23751..52af8e5 100644 --- a/tests/hwsim/test_ap_ht.py +++ b/tests/hwsim/test_ap_ht.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -56,6 +57,7 @@ def test_ap_ht40_scan(dev, apdev): dev[0].connect("test-ht40", key_mgmt="NONE", scan_freq=freq) +@remote_compatible def test_ap_ht40_scan_conflict(dev, apdev): """HT40 co-ex scan conflict""" clear_scan_cache(apdev[0]) @@ -96,6 +98,7 @@ def test_ap_ht40_scan_conflict(dev, apdev): dev[0].connect("test-ht40", key_mgmt="NONE", scan_freq=freq) +@remote_compatible def test_ap_ht40_scan_conflict2(dev, apdev): """HT40 co-ex scan conflict (HT40-)""" clear_scan_cache(apdev[0]) @@ -182,6 +185,7 @@ def test_ap_ht40_scan_not_affected(dev, apdev): dev[0].connect("test-ht40", key_mgmt="NONE", scan_freq=freq) +@remote_compatible def test_ap_ht40_scan_legacy_conflict(dev, apdev): """HT40 co-ex scan conflict with legacy 20 MHz AP""" clear_scan_cache(apdev[0]) @@ -221,6 +225,7 @@ def test_ap_ht40_scan_legacy_conflict(dev, apdev): dev[0].connect("test-ht40", key_mgmt="NONE", scan_freq=freq) +@remote_compatible def test_ap_ht40_scan_ht20_conflict(dev, apdev): """HT40 co-ex scan conflict with HT 20 MHz AP""" clear_scan_cache(apdev[0]) @@ -783,6 +788,7 @@ def test_ap_require_ht(dev, apdev): ampdu_density="1", disable_ht40="1", disable_sgi="1", disable_ldpc="1") +@remote_compatible def test_ap_require_ht_limited_rates(dev, apdev): """Require HT with limited supported rates""" params = { "ssid": "require-ht", @@ -800,6 +806,7 @@ def test_ap_require_ht_limited_rates(dev, apdev): if "status_code=27" not in ev: raise Exception("Unexpected rejection status code") +@remote_compatible def test_ap_ht_capab_not_supported(dev, apdev): """HT configuration with driver not supporting all ht_capab entries""" params = { "ssid": "test-ht40", @@ -1027,6 +1034,7 @@ def test_ap_ht40_csa3(dev, apdev): hostapd.cmd_execute(apdev[0], ['iw', 'reg', 'set', '00']) dev[0].flush_scan_cache() +@remote_compatible def test_ap_ht_smps(dev, apdev): """SMPS AP configuration options""" params = { "ssid": "ht1", "ht_capab": "[SMPS-STATIC]" } @@ -1042,6 +1050,7 @@ def test_ap_ht_smps(dev, apdev): hwsim_utils.test_connectivity(dev[0], hapd) hwsim_utils.test_connectivity(dev[1], hapd2) +@remote_compatible def test_prefer_ht20(dev, apdev): """Preference on HT20 over no-HT""" params = { "ssid": "test", @@ -1097,6 +1106,7 @@ def test_prefer_ht40(dev, apdev): if est != "135000": raise Exception("Unexpected BSS1 est_throughput: " + est) +@remote_compatible def test_prefer_ht20_during_roam(dev, apdev): """Preference on HT20 over no-HT in roaming consideration""" params = { "ssid": "test", @@ -1120,6 +1130,7 @@ def test_prefer_ht20_during_roam(dev, apdev): if dev[0].get_status_field('bssid') != bssid2: raise Exception("Unexpected BSS selected") +@remote_compatible def test_ap_ht40_5ghz_invalid_pair(dev, apdev): """HT40 on 5 GHz with invalid channel pair""" clear_scan_cache(apdev[0]) @@ -1140,6 +1151,7 @@ def test_ap_ht40_5ghz_invalid_pair(dev, apdev): finally: hostapd.cmd_execute(apdev[0], ['iw', 'reg', 'set', '00']) +@remote_compatible def test_ap_ht40_5ghz_disabled_sec(dev, apdev): """HT40 on 5 GHz with disabled secondary channel""" clear_scan_cache(apdev[0]) diff --git a/tests/hwsim/test_ap_open.py b/tests/hwsim/test_ap_open.py index 69d2564..06497ea 100644 --- a/tests/hwsim/test_ap_open.py +++ b/tests/hwsim/test_ap_open.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import struct @@ -17,6 +18,7 @@ from tshark import run_tshark from utils import alloc_fail from wpasupplicant import WpaSupplicant +@remote_compatible def test_ap_open(dev, apdev): """AP with open mode (no security) configuration""" _test_ap_open(dev, apdev) @@ -49,6 +51,7 @@ def test_ap_open_packet_loss(dev, apdev): for i in range(0, 3): dev[i].wait_connected(timeout=20) +@remote_compatible def test_ap_open_unknown_action(dev, apdev): """AP with open mode configuration and unknown Action frame""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -75,6 +78,7 @@ def test_ap_open_invalid_wmm_action(dev, apdev): if ev is None or "result=SUCCESS" not in ev: raise Exception("AP did not ack Action frame") +@remote_compatible def test_ap_open_reconnect_on_inactivity_disconnect(dev, apdev): """Reconnect to open mode AP after inactivity related disconnection""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -83,6 +87,7 @@ def test_ap_open_reconnect_on_inactivity_disconnect(dev, apdev): dev[0].wait_disconnected(timeout=5) dev[0].wait_connected(timeout=2, error="Timeout on reconnection") +@remote_compatible def test_ap_open_assoc_timeout(dev, apdev): """AP timing out association""" ssid = "test" @@ -123,6 +128,7 @@ def test_ap_open_assoc_timeout(dev, apdev): hapd.set("ext_mgmt_frame_handling", "0") dev[0].wait_connected(timeout=15) +@remote_compatible def test_ap_open_id_str(dev, apdev): """AP with open mode and id_str""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -134,6 +140,7 @@ def test_ap_open_id_str(dev, apdev): if dev[0].get_status_field("id_str") != "foo": raise Exception("id_str mismatch") +@remote_compatible def test_ap_open_select_any(dev, apdev): """AP with open mode and select any network""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -152,6 +159,7 @@ def test_ap_open_select_any(dev, apdev): dev[0].select_network("any") dev[0].wait_connected(timeout=10) +@remote_compatible def test_ap_open_unexpected_assoc_event(dev, apdev): """AP with open mode and unexpected association event""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -173,6 +181,7 @@ def test_ap_open_unexpected_assoc_event(dev, apdev): apdev[0]['bssid']]) dev[0].wait_disconnected(timeout=15) +@remote_compatible def test_ap_bss_load(dev, apdev): """AP with open mode (no security) configuration""" hapd = hostapd.add_ap(apdev[0], @@ -300,6 +309,7 @@ def _test_ap_open_wpas_in_bridge(dev, apdev): wpas.connect("open", key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ap_open_start_disabled(dev, apdev): """AP with open mode and beaconing disabled""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open", @@ -315,6 +325,7 @@ def test_ap_open_start_disabled(dev, apdev): dev[0].scan_for_bss(bssid, freq=2412) dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ap_open_start_disabled2(dev, apdev): """AP with open mode and beaconing disabled (2)""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open", @@ -336,6 +347,7 @@ def test_ap_open_start_disabled2(dev, apdev): dev[0].request("RECONNECT") dev[0].wait_connected() +@remote_compatible def test_ap_open_ifdown(dev, apdev): """AP with open mode and external ifconfig down""" params = { "ssid": "open", @@ -409,6 +421,7 @@ def test_ap_open_disconnect_in_ps(dev, apdev, params): if state != 2: raise Exception("Didn't observe TIM bit getting set and unset (state=%d)" % state) +@remote_compatible def test_ap_open_select_network(dev, apdev): """Open mode connection and SELECT_NETWORK to change network""" hapd1 = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -435,6 +448,7 @@ def test_ap_open_select_network(dev, apdev): if bssid1 in res or bssid2 in res: raise Exception("Unexpected blacklist entry(2)") +@remote_compatible def test_ap_open_disable_enable(dev, apdev): """AP with open mode getting disabled and re-enabled""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -486,6 +500,7 @@ def test_ap_open_sta_enable_disable(dev, apdev): wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") sta_enable_disable(wpas, bssid) +@remote_compatible def test_ap_open_select_twice(dev, apdev): """AP with open mode and select network twice""" id = dev[0].connect("open", key_mgmt="NONE", scan_freq="2412", @@ -500,6 +515,7 @@ def test_ap_open_select_twice(dev, apdev): dev[0].select_network(id) dev[0].wait_connected(timeout=3) +@remote_compatible def test_ap_open_reassoc_not_found(dev, apdev): """AP with open mode and REASSOCIATE not finding a match""" id = dev[0].connect("open", key_mgmt="NONE", scan_freq="2412", @@ -519,6 +535,7 @@ def test_ap_open_reassoc_not_found(dev, apdev): raise Exception("No result reported") dev[0].request("DISCONNECT") +@remote_compatible def test_ap_open_sta_statistics(dev, apdev): """AP with open mode and STA statistics""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -538,6 +555,7 @@ def test_ap_open_sta_statistics(dev, apdev): # unrelated traffic, so for now, just print out the results in the log for # manual checks. +@remote_compatible def test_ap_open_poll_sta(dev, apdev): """AP with open mode and STA poll""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) diff --git a/tests/hwsim/test_ap_params.py b/tests/hwsim/test_ap_params.py index 4dff354..9f5423b 100644 --- a/tests/hwsim/test_ap_params.py +++ b/tests/hwsim/test_ap_params.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import os @@ -13,6 +14,7 @@ import hostapd from tshark import run_tshark from utils import alloc_fail +@remote_compatible def test_ap_fragmentation_rts_set_high(dev, apdev): """WPA2-PSK AP with fragmentation and RTS thresholds larger than frame length""" ssid = "test-wpa2-psk" @@ -24,6 +26,7 @@ def test_ap_fragmentation_rts_set_high(dev, apdev): dev[0].connect(ssid, psk=passphrase, scan_freq="2412") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_fragmentation_open(dev, apdev): """Open AP with fragmentation threshold""" ssid = "fragmentation" @@ -34,6 +37,7 @@ def test_ap_fragmentation_open(dev, apdev): dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_fragmentation_wpa2(dev, apdev): """WPA2-PSK AP with fragmentation threshold""" ssid = "test-wpa2-psk" @@ -80,6 +84,7 @@ def test_ap_element_parse(dev, apdev): if "38050102030405" not in bss['ie']: raise Exception("Timeout element not shown in scan results") +@remote_compatible def test_ap_element_parse_oom(dev, apdev): """Information element parsing OOM""" bssid = apdev[0]['bssid'] @@ -150,6 +155,7 @@ def test_ap_acl_deny(dev, apdev): if ev is not None: raise Exception("Unexpected association") +@remote_compatible def test_ap_wds_sta(dev, apdev): """WPA2-PSK AP with STA using 4addr mode""" ssid = "test-wpa2-psk" @@ -172,6 +178,7 @@ def test_ap_wds_sta(dev, apdev): dev[0].cmd_execute(['ip', 'link', 'set', 'dev', 'wds-br0', 'down']) dev[0].cmd_execute(['brctl', 'delbr', 'wds-br0']) +@remote_compatible def test_ap_inactivity_poll(dev, apdev): """AP using inactivity poll""" ssid = "test-wpa2-psk" @@ -190,6 +197,7 @@ def test_ap_inactivity_poll(dev, apdev): if ev is None: raise Exception("STA disconnection on inactivity was not reported") +@remote_compatible def test_ap_inactivity_disconnect(dev, apdev): """AP using inactivity disconnect""" ssid = "test-wpa2-psk" @@ -209,6 +217,7 @@ def test_ap_inactivity_disconnect(dev, apdev): if ev is None: raise Exception("STA disconnection on inactivity was not reported") +@remote_compatible def test_ap_basic_rates(dev, apdev): """Open AP with lots of basic rates""" ssid = "basic rates" @@ -218,6 +227,7 @@ def test_ap_basic_rates(dev, apdev): hostapd.add_ap(apdev[0], params) dev[0].connect(ssid, key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ap_short_preamble(dev, apdev): """Open AP with short preamble""" ssid = "short preamble" @@ -249,6 +259,7 @@ def test_ap_spectrum_management_required(dev, apdev): hostapd.cmd_execute(apdev[0], ['iw', 'reg', 'set', '00']) dev[0].flush_scan_cache() +@remote_compatible def test_ap_max_listen_interval(dev, apdev): """Open AP with maximum listen interval limit""" ssid = "listen" @@ -263,6 +274,7 @@ def test_ap_max_listen_interval(dev, apdev): if "status_code=51" not in ev: raise Exception("Unexpected ASSOC-REJECT reason") +@remote_compatible def test_ap_max_num_sta(dev, apdev): """Open AP with maximum STA count""" ssid = "max" @@ -305,6 +317,7 @@ def test_ap_max_num_sta_no_probe_resp(dev, apdev, params): if seen: raise Exception("AP found unexpectedly") +@remote_compatible def test_ap_tx_queue_params(dev, apdev): """Open AP with TX queue params set""" ssid = "tx" diff --git a/tests/hwsim/test_ap_pmf.py b/tests/hwsim/test_ap_pmf.py index 28d5489..17565b6 100644 --- a/tests/hwsim/test_ap_pmf.py +++ b/tests/hwsim/test_ap_pmf.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -13,6 +14,7 @@ import hostapd from wlantest import Wlantest from wpasupplicant import WpaSupplicant +@remote_compatible def test_ap_pmf_required(dev, apdev): """WPA2-PSK AP with PMF required""" ssid = "test-pmf-required" @@ -50,6 +52,7 @@ def test_ap_pmf_required(dev, apdev): dev[1].p2p_interface_addr()) < 1: raise Exception("STA did not reply to SA Query") +@remote_compatible def test_ap_pmf_optional(dev, apdev): """WPA2-PSK AP with PMF optional""" ssid = "test-pmf-optional" @@ -73,6 +76,7 @@ def test_ap_pmf_optional(dev, apdev): wt.require_sta_pmf(apdev[0]['bssid'], dev[0].p2p_interface_addr()) wt.require_sta_pmf_mandatory(apdev[0]['bssid'], dev[1].p2p_interface_addr()) +@remote_compatible def test_ap_pmf_optional_2akm(dev, apdev): """WPA2-PSK AP with PMF optional (2 AKMs)""" ssid = "test-pmf-optional-2akm" @@ -100,6 +104,7 @@ def test_ap_pmf_optional_2akm(dev, apdev): wt.require_sta_key_mgmt(apdev[0]['bssid'], dev[1].p2p_interface_addr(), "PSK-SHA256") +@remote_compatible def test_ap_pmf_negative(dev, apdev): """WPA2-PSK AP without PMF (negative test)""" ssid = "test-pmf-negative" @@ -123,6 +128,7 @@ def test_ap_pmf_negative(dev, apdev): logger.debug("Ignore expected exception: " + str(e)) wt.require_ap_no_pmf(apdev[0]['bssid']) +@remote_compatible def test_ap_pmf_assoc_comeback(dev, apdev): """WPA2-PSK AP with PMF association comeback""" ssid = "assoc-comeback" @@ -147,6 +153,7 @@ def test_ap_pmf_assoc_comeback(dev, apdev): dev[0].p2p_interface_addr()) < 1: raise Exception("AP did not use association comeback request") +@remote_compatible def test_ap_pmf_assoc_comeback2(dev, apdev): """WPA2-PSK AP with PMF association comeback (using DROP_SA)""" ssid = "assoc-comeback" @@ -354,6 +361,7 @@ def test_ap_pmf_optional_eap(dev, apdev): ca_cert="auth_serv/ca.pem", phase2="auth=PAP", ieee80211w="2", scan_freq="2412") +@remote_compatible def test_ap_pmf_required_sha1(dev, apdev): """WPA2-PSK AP with PMF required with SHA1 AKM""" ssid = "test-pmf-required-sha1" @@ -374,6 +382,7 @@ def test_ap_pmf_required_sha1(dev, apdev): raise Exception("Scan results missing RSN element info") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_pmf_toggle(dev, apdev): """WPA2-PSK AP with PMF optional and changing PMF on reassociation""" try: @@ -429,6 +438,7 @@ def _test_ap_pmf_toggle(dev, apdev): if "yes" not in [l for l in data.splitlines() if "MFP" in l][0]: raise Exception("Kernel STA entry did not have MFP enabled") +@remote_compatible def test_ap_pmf_required_sta_no_pmf(dev, apdev): """WPA2-PSK AP with PMF required and PMF disabled on STA""" ssid = "test-pmf-required" diff --git a/tests/hwsim/test_ap_psk.py b/tests/hwsim/test_ap_psk.py index 3e43610..d5efeaa 100644 --- a/tests/hwsim/test_ap_psk.py +++ b/tests/hwsim/test_ap_psk.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii from Crypto.Cipher import AES import hashlib @@ -27,6 +28,7 @@ def check_mib(dev, vals): if mib[v[0]] != v[1]: raise Exception("Unexpected {} = {} (expected {})".format(v[0], mib[v[0]], v[1])) +@remote_compatible def test_ap_wpa2_psk(dev, apdev): """WPA2-PSK AP with PSK instead of passphrase""" ssid = "test-wpa2-psk" @@ -68,6 +70,7 @@ def test_ap_wpa2_psk_file(dev, apdev): raise Exception("Timed out while waiting for failure report") dev[1].request("REMOVE_NETWORK all") +@remote_compatible def test_ap_wpa2_psk_mem(dev, apdev): """WPA2-PSK AP with passphrase only in memory""" try: @@ -102,6 +105,7 @@ def _test_ap_wpa2_psk_mem(dev, apdev): dev[1].request("CTRL-RSP-PSK_PASSPHRASE-" + id + ':' + psk) dev[1].wait_connected(timeout=10) +@remote_compatible def test_ap_wpa2_ptk_rekey(dev, apdev): """WPA2-PSK AP and PTK rekey enforced by station""" ssid = "test-wpa2-psk" @@ -114,6 +118,7 @@ def test_ap_wpa2_ptk_rekey(dev, apdev): raise Exception("PTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa2_ptk_rekey_ap(dev, apdev): """WPA2-PSK AP and PTK rekey enforced by AP""" ssid = "test-wpa2-psk" @@ -127,6 +132,7 @@ def test_ap_wpa2_ptk_rekey_ap(dev, apdev): raise Exception("PTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa2_sha256_ptk_rekey(dev, apdev): """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by station""" ssid = "test-wpa2-psk" @@ -143,6 +149,7 @@ def test_ap_wpa2_sha256_ptk_rekey(dev, apdev): check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"), ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ]) +@remote_compatible def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev): """WPA2-PSK/SHA256 AKM AP and PTK rekey enforced by AP""" ssid = "test-wpa2-psk" @@ -160,6 +167,7 @@ def test_ap_wpa2_sha256_ptk_rekey_ap(dev, apdev): check_mib(dev[0], [ ("dot11RSNAAuthenticationSuiteRequested", "00-0f-ac-6"), ("dot11RSNAAuthenticationSuiteSelected", "00-0f-ac-6") ]) +@remote_compatible def test_ap_wpa_ptk_rekey(dev, apdev): """WPA-PSK/TKIP AP and PTK rekey enforced by station""" skip_with_fips(dev[0]) @@ -175,6 +183,7 @@ def test_ap_wpa_ptk_rekey(dev, apdev): raise Exception("PTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa_ptk_rekey_ap(dev, apdev): """WPA-PSK/TKIP AP and PTK rekey enforced by AP""" skip_with_fips(dev[0]) @@ -189,6 +198,7 @@ def test_ap_wpa_ptk_rekey_ap(dev, apdev): raise Exception("PTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa_ccmp(dev, apdev): """WPA-PSK/CCMP""" ssid = "test-wpa-psk" @@ -270,6 +280,7 @@ def test_ap_wpa2_psk_file(dev, apdev): except: pass +@remote_compatible def test_ap_wpa2_psk_wildcard_ssid(dev, apdev): """WPA2-PSK AP and wildcard SSID configuration""" ssid = "test-wpa2-psk" @@ -281,6 +292,7 @@ def test_ap_wpa2_psk_wildcard_ssid(dev, apdev): scan_freq="2412") dev[1].connect("", bssid=apdev[0]['bssid'], raw_psk=psk, scan_freq="2412") +@remote_compatible def test_ap_wpa2_gtk_rekey(dev, apdev): """WPA2-PSK AP and GTK rekey enforced by AP""" ssid = "test-wpa2-psk" @@ -294,6 +306,7 @@ def test_ap_wpa2_gtk_rekey(dev, apdev): raise Exception("GTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa_gtk_rekey(dev, apdev): """WPA-PSK/TKIP AP and GTK rekey enforced by AP""" skip_with_fips(dev[0]) @@ -308,6 +321,7 @@ def test_ap_wpa_gtk_rekey(dev, apdev): raise Exception("GTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa2_gmk_rekey(dev, apdev): """WPA2-PSK AP and GMK and GTK rekey enforced by AP""" ssid = "test-wpa2-psk" @@ -323,6 +337,7 @@ def test_ap_wpa2_gmk_rekey(dev, apdev): raise Exception("GTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa2_strict_rekey(dev, apdev): """WPA2-PSK AP and strict GTK rekey enforced by AP""" ssid = "test-wpa2-psk" @@ -338,6 +353,7 @@ def test_ap_wpa2_strict_rekey(dev, apdev): raise Exception("GTK rekey timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa2_bridge_fdb(dev, apdev): """Bridge FDB entry removal""" hapd = None @@ -371,6 +387,7 @@ def test_ap_wpa2_bridge_fdb(dev, apdev): hostapd.cmd_execute(apdev[0], ['ip', 'link', 'set', 'dev', 'ap-br0', 'down']) hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', 'ap-br0']) +@remote_compatible def test_ap_wpa2_already_in_bridge(dev, apdev): """hostapd behavior with interface already in bridge""" ifname = apdev[0]['ifname'] @@ -394,6 +411,7 @@ def test_ap_wpa2_already_in_bridge(dev, apdev): hostapd.cmd_execute(apdev[0], ['iw', ifname, 'set', 'type', 'station']) hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', br_ifname]) +@remote_compatible def test_ap_wpa2_in_different_bridge(dev, apdev): """hostapd behavior with interface in different bridge""" ifname = apdev[0]['ifname'] @@ -428,6 +446,7 @@ def test_ap_wpa2_in_different_bridge(dev, apdev): hostapd.cmd_execute(apdev[0], ['brctl', 'delif', br_ifname, ifname, "2>", "/dev/null"]) hostapd.cmd_execute(apdev[0], ['brctl', 'delbr', br_ifname]) +@remote_compatible def test_ap_wpa2_ext_add_to_bridge(dev, apdev): """hostapd behavior with interface added to bridge externally""" ifname = apdev[0]['ifname'] @@ -702,6 +721,7 @@ def eapol_test(apdev, dev, wpa2=True): snonce = binascii.unhexlify('1111111111111111111111111111111111111111111111111111111111111111') return (bssid,ssid,hapd,snonce,pmk,addr,rsne) +@remote_compatible def test_ap_wpa2_psk_ext_eapol(dev, apdev): """WPA2-PSK AP using external EAPOL supplicant""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -729,6 +749,7 @@ def test_ap_wpa2_psk_ext_eapol(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa2_psk_ext_eapol_retry1(dev, apdev): """WPA2 4-way handshake with EAPOL-Key 1/4 retransmitted""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -755,6 +776,7 @@ def test_ap_wpa2_psk_ext_eapol_retry1(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa2_psk_ext_eapol_retry1b(dev, apdev): """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -776,6 +798,7 @@ def test_ap_wpa2_psk_ext_eapol_retry1b(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa2_psk_ext_eapol_retry1c(dev, apdev): """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -799,6 +822,7 @@ def test_ap_wpa2_psk_ext_eapol_retry1c(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa2_psk_ext_eapol_retry1d(dev, apdev): """WPA2 4-way handshake with EAPOL-Key 1/4 and 2/4 retransmitted and SNonce changing and older used""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -822,6 +846,7 @@ def test_ap_wpa2_psk_ext_eapol_retry1d(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa2_psk_ext_eapol_type_diff(dev, apdev): """WPA2 4-way handshake using external EAPOL supplicant""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -852,6 +877,7 @@ def test_ap_wpa2_psk_ext_eapol_type_diff(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa_psk_ext_eapol(dev, apdev): """WPA2-PSK AP using external EAPOL supplicant""" (bssid,ssid,hapd,snonce,pmk,addr,wpae) = eapol_test(apdev[0], dev[0], @@ -879,6 +905,7 @@ def test_ap_wpa_psk_ext_eapol(dev, apdev): reply_eapol("4/4", hapd, addr, msg, 0x030a, None, None, kck) hapd_connected(hapd) +@remote_compatible def test_ap_wpa2_psk_ext_eapol_key_info(dev, apdev): """WPA2-PSK 4-way handshake with strange key info values""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -1355,6 +1382,7 @@ def test_ap_wpa2_psk_supp_proto_unexpected_group_msg(dev, apdev): raise Exception("Unexpected group key message not reported") dev[0].wait_disconnected(timeout=1) +@remote_compatible def test_ap_wpa2_psk_supp_proto_msg_1_invalid_kde(dev, apdev): """WPA2-PSK supplicant protocol testing: invalid KDE in msg 1/4""" (bssid,ssid,hapd,snonce,pmk,addr,rsne) = eapol_test(apdev[0], dev[0]) @@ -1831,6 +1859,7 @@ def test_wpa2_psk_key_lifetime_in_memory(dev, apdev, params): verify_not_present(buf, tk, fname, "TK") verify_not_present(buf, gtk, fname, "GTK") +@remote_compatible def test_ap_wpa2_psk_wep(dev, apdev): """WPA2-PSK AP and WEP enabled""" ssid = "test-wpa2-psk" @@ -1875,6 +1904,7 @@ def _test_ap_wpa2_psk_wpas_in_bridge(dev, apdev): wpas.connect(ssid, psk=passphrase, scan_freq="2412") wpas.dump_monitor() +@remote_compatible def test_ap_wpa2_psk_ifdown(dev, apdev): """AP with open mode and external ifconfig down""" ssid = "test-wpa2-psk" @@ -1964,6 +1994,7 @@ def test_ap_wpa2_psk_drop_first_msg_4(dev, apdev): # case, this exception can be uncommented here. #raise Exception("Unexpected disconnection") +@remote_compatible def test_ap_wpa2_psk_disable_enable(dev, apdev): """WPA2-PSK AP getting disabled and re-enabled""" ssid = "test-wpa2-psk" @@ -1981,6 +2012,7 @@ def test_ap_wpa2_psk_disable_enable(dev, apdev): dev[0].wait_connected() hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_wpa2_psk_incorrect_passphrase(dev, apdev): """WPA2-PSK AP and station using incorrect passphrase""" ssid = "test-wpa2-psk" @@ -2000,6 +2032,7 @@ def test_ap_wpa2_psk_incorrect_passphrase(dev, apdev): dev[0].wait_connected(timeout=20) +@remote_compatible def test_ap_wpa_ie_parsing(dev, apdev): """WPA IE parsing""" skip_with_fips(dev[0]) @@ -2060,6 +2093,7 @@ def test_ap_wpa_ie_parsing(dev, apdev): finally: dev[0].request("VENDOR_ELEM_REMOVE 13 *") +@remote_compatible def test_ap_wpa2_psk_no_random(dev, apdev): """WPA2-PSK AP and no random numbers available""" ssid = "test-wpa2-psk" @@ -2078,6 +2112,7 @@ def test_ap_wpa2_psk_no_random(dev, apdev): dev[0].select_network(id, freq=2412) dev[0].wait_connected() +@remote_compatible def test_rsn_ie_proto_psk_sta(dev, apdev): """RSN element protocol testing for PSK cases on STA side""" bssid = apdev[0]['bssid'] @@ -2117,6 +2152,7 @@ def test_rsn_ie_proto_psk_sta(dev, apdev): dev[0].select_network(id, freq=2412) dev[0].wait_connected() +@remote_compatible def test_ap_cli_order(dev, apdev): ssid = "test-rsn-setup" passphrase = 'zzzzzzzz' @@ -2146,6 +2182,7 @@ def set_test_assoc_ie(dev, ie): if "OK" not in dev.request("TEST_ASSOC_IE " + ie): raise Exception("Could not set TEST_ASSOC_IE") +@remote_compatible def test_ap_wpa2_psk_assoc_rsn(dev, apdev): """WPA2-PSK AP and association request RSN IE differences""" ssid = "test-wpa2-psk" diff --git a/tests/hwsim/test_ap_qosmap.py b/tests/hwsim/test_ap_qosmap.py index a98176b..2462787 100644 --- a/tests/hwsim/test_ap_qosmap.py +++ b/tests/hwsim/test_ap_qosmap.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -34,6 +35,7 @@ def check_qos_map(ap, hapd, dev, sta, dscp, tid, ap_tid=None): logger.info("Expected RX DSCP " + str(dscp) + " with TID " + str(ap_tid) + " but counters: " + str(rx)) raise Exception("No AP->STA data frame using the expected TID") +@remote_compatible def test_ap_qosmap(dev, apdev): """QoS mapping""" drv_flags = dev[0].get_driver_status_field("capa.flags") @@ -73,6 +75,7 @@ def test_ap_qosmap(dev, apdev): dev[0].request("DATA_TEST_CONFIG 0") hapd.request("DATA_TEST_CONFIG 0") +@remote_compatible def test_ap_qosmap_default(dev, apdev): """QoS mapping with default values""" ssid = "test-qosmap-default" @@ -87,6 +90,7 @@ def test_ap_qosmap_default(dev, apdev): dev[0].request("DATA_TEST_CONFIG 0") hapd.request("DATA_TEST_CONFIG 0") +@remote_compatible def test_ap_qosmap_default_acm(dev, apdev): """QoS mapping with default values and ACM=1 for VO/VI""" ssid = "test-qosmap-default" @@ -126,6 +130,7 @@ def test_ap_qosmap_default_acm(dev, apdev): dev[0].request("DATA_TEST_CONFIG 0") hapd.request("DATA_TEST_CONFIG 0") +@remote_compatible def test_ap_qosmap_invalid(dev, apdev): """QoS mapping ctrl_iface error handling""" ssid = "test-qosmap" diff --git a/tests/hwsim/test_ap_roam.py b/tests/hwsim/test_ap_roam.py index 89d0d9c..11d9755 100644 --- a/tests/hwsim/test_ap_roam.py +++ b/tests/hwsim/test_ap_roam.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -11,6 +12,7 @@ logger = logging.getLogger() import hwsim_utils import hostapd +@remote_compatible def test_ap_roam_open(dev, apdev): """Roam between two open APs""" hapd0 = hostapd.add_ap(apdev[0], { "ssid": "test-open" }) @@ -23,6 +25,7 @@ def test_ap_roam_open(dev, apdev): dev[0].roam(apdev[0]['bssid']) hwsim_utils.test_connectivity(dev[0], hapd0) +@remote_compatible def test_ap_roam_open_failed(dev, apdev): """Roam failure due to rejected authentication""" hapd0 = hostapd.add_ap(apdev[0], { "ssid": "test-open" }) @@ -44,6 +47,7 @@ def test_ap_roam_open_failed(dev, apdev): dev[0].wait_connected(timeout=5) hwsim_utils.test_connectivity(dev[0], hapd0) +@remote_compatible def test_ap_roam_wpa2_psk(dev, apdev): """Roam between two WPA2-PSK APs""" params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678") @@ -89,6 +93,7 @@ def test_ap_roam_wpa2_psk_failed(dev, apdev, params): dev[0].wait_connected(timeout=5) hwsim_utils.test_connectivity(dev[0], hapd0) +@remote_compatible def test_ap_reassociation_to_same_bss(dev, apdev): """Reassociate to the same BSS""" hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" }) @@ -108,6 +113,7 @@ def test_ap_reassociation_to_same_bss(dev, apdev): dev[0].wait_connected(timeout=10, error="Reattach timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_ap_roam_set_bssid(dev, apdev): """Roam control""" hostapd.add_ap(apdev[0], { "ssid": "test-open" }) @@ -124,6 +130,7 @@ def test_ap_roam_set_bssid(dev, apdev): dev[0].set_network(id, "bssid", apdev[0]['bssid']) dev[0].set_network(id, "bssid", apdev[1]['bssid']) +@remote_compatible def test_ap_roam_wpa2_psk_race(dev, apdev): """Roam between two WPA2-PSK APs and try to hit a disconnection race""" params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678") diff --git a/tests/hwsim/test_ap_tdls.py b/tests/hwsim/test_ap_tdls.py index c1ade5f..b3503a7 100644 --- a/tests/hwsim/test_ap_tdls.py +++ b/tests/hwsim/test_ap_tdls.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -163,6 +164,7 @@ def check_tdls_link(sta0, sta1, connected=True): if connected: raise Exception("Expected TDLS link status to be connected") +@remote_compatible def test_ap_tdls_discovery(dev, apdev): """WPA2-PSK AP and two stations using TDLS discovery""" hapd = start_ap_wpa2_psk(apdev[0]) diff --git a/tests/hwsim/test_ap_vlan.py b/tests/hwsim/test_ap_vlan.py index 7ca4eda..b8e533a 100644 --- a/tests/hwsim/test_ap_vlan.py +++ b/tests/hwsim/test_ap_vlan.py @@ -6,6 +6,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import subprocess import logging @@ -531,6 +532,7 @@ def test_ap_vlan_without_station(dev, apdev, p): stderr=open('/dev/null', 'w')) subprocess.call(['brctl', 'delbr', 'brvlan1']) +@remote_compatible def test_ap_open_per_sta_vif(dev, apdev): """AP VLAN with open network""" params = { "ssid": "test-vlan-open", @@ -541,6 +543,7 @@ def test_ap_open_per_sta_vif(dev, apdev): hwsim_utils.test_connectivity_iface(dev[0], hapd, apdev[0]['ifname'] + ".4096") +@remote_compatible def test_ap_vlan_open_per_sta_vif(dev, apdev): """AP VLAN (dynamic) with open network""" params = { "ssid": "test-vlan-open", diff --git a/tests/hwsim/test_ap_wps.py b/tests/hwsim/test_ap_wps.py index db12257..6e64af7 100644 --- a/tests/hwsim/test_ap_wps.py +++ b/tests/hwsim/test_ap_wps.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import base64 import binascii from Crypto.Cipher import AES @@ -38,6 +39,7 @@ def wps_start_ap(apdev, ssid="test-wps-conf"): "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP" } return hostapd.add_ap(apdev, params) +@remote_compatible def test_ap_wps_init(dev, apdev): """Initial AP configuration with first WPS Enrollee""" ssid = "test-wps" @@ -159,6 +161,7 @@ def test_ap_wps_init_2ap_pin(dev, apdev): if "[WPS-AUTH]" in bss['flags']: raise Exception("WPS-AUTH flag not cleared from AP2") +@remote_compatible def test_ap_wps_init_through_wps_config(dev, apdev): """Initial AP configuration using wps_config command""" ssid = "test-wps-init-config" @@ -177,6 +180,7 @@ def test_ap_wps_init_through_wps_config(dev, apdev): dev[0].connect(ssid, psk="12345678", scan_freq="2412", proto="WPA2", pairwise="CCMP", group="CCMP") +@remote_compatible def test_ap_wps_init_through_wps_config_2(dev, apdev): """AP configuration using wps_config and wps_cred_processing=2""" ssid = "test-wps-init-config" @@ -191,6 +195,7 @@ def test_ap_wps_init_through_wps_config_2(dev, apdev): if "100e" not in ev: raise Exception("WPS-NEW-AP-SETTINGS did not include Credential") +@remote_compatible def test_ap_wps_invalid_wps_config_passphrase(dev, apdev): """AP configuration using wps_config command with invalid passphrase""" ssid = "test-wps-init-config" @@ -279,6 +284,7 @@ def test_ap_wps_conf_chan14(dev, apdev): subprocess.call(['iw', 'reg', 'set', '00']) dev[0].flush_scan_cache() +@remote_compatible def test_ap_wps_twice(dev, apdev): """WPS provisioning with twice to change passphrase""" ssid = "test-wps-twice" @@ -307,6 +313,7 @@ def test_ap_wps_twice(dev, apdev): if len(networks) > 1: raise Exception("Unexpected duplicated network block present") +@remote_compatible def test_ap_wps_incorrect_pin(dev, apdev): """WPS PIN provisioning with incorrect PIN""" ssid = "test-wps-incorrect-pin" @@ -349,6 +356,7 @@ def test_ap_wps_incorrect_pin(dev, apdev): raise Exception("PIN error detected on incorrect message") dev[0].wait_disconnected(timeout=10) +@remote_compatible def test_ap_wps_conf_pin(dev, apdev): """WPS PIN provisioning with configured AP""" ssid = "test-wps-conf-pin" @@ -444,6 +452,7 @@ def test_ap_wps_conf_pin_mixed_mode(dev, apdev): dev[0].request("SET wps_force_auth_types ") dev[0].request("SET wps_force_encr_types ") +@remote_compatible def test_ap_wps_conf_pin_v1(dev, apdev): """WPS PIN provisioning with configured WPS v1.0 AP""" ssid = "test-wps-conf-pin-v1" @@ -469,6 +478,7 @@ def test_ap_wps_conf_pin_v1(dev, apdev): dev[0].wait_connected(timeout=30) hapd.request("SET wps_version_number 0x20") +@remote_compatible def test_ap_wps_conf_pin_2sta(dev, apdev): """Two stations trying to use WPS PIN at the same time""" ssid = "test-wps-conf-pin2" @@ -490,6 +500,7 @@ def test_ap_wps_conf_pin_2sta(dev, apdev): dev[0].wait_connected(timeout=30) dev[1].wait_connected(timeout=30) +@remote_compatible def test_ap_wps_conf_pin_timeout(dev, apdev): """WPS PIN provisioning with configured AP timing out PIN""" ssid = "test-wps-conf-pin" @@ -900,6 +911,7 @@ def test_ap_wps_setup_locked_2(dev, apdev): dev[0].request("WPS_CANCEL") dev[0].wait_disconnected() +@remote_compatible def test_ap_wps_pbc_overlap_2ap(dev, apdev): """WPS PBC session overlap with two active APs""" params = { "ssid": "wps1", "eap_server": "1", "wps_state": "2", @@ -925,6 +937,7 @@ def test_ap_wps_pbc_overlap_2ap(dev, apdev): hapd2.request("DISABLE") dev[0].flush_scan_cache() +@remote_compatible def test_ap_wps_pbc_overlap_2sta(dev, apdev): """WPS PBC session overlap with two active STAs""" ssid = "test-wps-pbc-overlap" @@ -962,6 +975,7 @@ def test_ap_wps_pbc_overlap_2sta(dev, apdev): dev[0].flush_scan_cache() dev[1].flush_scan_cache() +@remote_compatible def test_ap_wps_cancel(dev, apdev): """WPS AP cancelling enabled config method""" ssid = "test-wps-ap-cancel" @@ -1486,6 +1500,7 @@ def _test_ap_wps_er_v10_add_enrollee_pin(dev, apdev): if ev is None: raise Exception("WPS ER did not report success") +@remote_compatible def test_ap_wps_er_config_ap(dev, apdev): """WPS ER configuring AP over UPnP""" try: @@ -1540,6 +1555,7 @@ def _test_ap_wps_er_config_ap(dev, apdev): if "OK" not in dev[0].request("WPS_ER_STOP"): raise Exception("WPS_ER_STOP failed") +@remote_compatible def test_ap_wps_er_cache_ap_settings(dev, apdev): """WPS ER caching AP settings""" try: @@ -1833,6 +1849,7 @@ def _test_ap_wps_er_set_sel_reg_oom(dev, apdev): dev[0].request("WPS_ER_STOP") +@remote_compatible def test_ap_wps_er_learn_oom(dev, apdev): """WPS ER learn OOM""" try: @@ -1935,6 +1952,7 @@ def test_ap_wps_fragmentation(dev, apdev): if status['key_mgmt'] != 'WPA2-PSK': raise Exception("Unexpected key_mgmt") +@remote_compatible def test_ap_wps_new_version_sta(dev, apdev): """WPS compatibility with new version number on the station""" ssid = "test-wps-ver" @@ -1951,6 +1969,7 @@ def test_ap_wps_new_version_sta(dev, apdev): dev[0].request("WPS_PBC " + apdev[0]['bssid']) dev[0].wait_connected(timeout=30) +@remote_compatible def test_ap_wps_new_version_ap(dev, apdev): """WPS compatibility with new version number on the AP""" ssid = "test-wps-ver" @@ -1968,6 +1987,7 @@ def test_ap_wps_new_version_ap(dev, apdev): dev[0].wait_connected(timeout=30) hapd.request("SET wps_version_number 0x20") +@remote_compatible def test_ap_wps_check_pin(dev, apdev): """Verify PIN checking through control interface""" hapd = hostapd.add_ap(apdev[0], @@ -2037,6 +2057,7 @@ def test_ap_wps_wep_enroll(dev, apdev): if "msg=12" not in ev or "reason=2 (WEP Prohibited)" not in ev: raise Exception("Unexpected WPS-FAIL event: " + ev) +@remote_compatible def test_ap_wps_ie_fragmentation(dev, apdev): """WPS AP using fragmented WPS IE""" ssid = "test-wps-ie-fragmentation" @@ -3400,6 +3421,7 @@ def test_ap_wps_upnp_http_proto_chunked(dev, apdev): pass conn.close() +@remote_compatible def test_ap_wps_disabled(dev, apdev): """WPS operations while WPS is disabled""" ssid = "test-wps-disabled" @@ -3432,6 +3454,7 @@ def test_ap_wps_mixed_cred(dev, apdev): if pairwise != "CCMP TKIP" and pairwise != "CCMP GCMP TKIP": raise Exception("Unexpected merged pairwise field value: " + pairwise) +@remote_compatible def test_ap_wps_while_connected(dev, apdev): """WPS PBC provisioning while connected to another AP""" ssid = "test-wps-conf" @@ -3452,6 +3475,7 @@ def test_ap_wps_while_connected(dev, apdev): if status['bssid'] != apdev[0]['bssid']: raise Exception("Unexpected BSSID") +@remote_compatible def test_ap_wps_while_connected_no_autoconnect(dev, apdev): """WPS PBC provisioning while connected to another AP and STA_AUTOCONNECT disabled""" ssid = "test-wps-conf" @@ -3477,6 +3501,7 @@ def test_ap_wps_while_connected_no_autoconnect(dev, apdev): finally: dev[0].request("STA_AUTOCONNECT 1") +@remote_compatible def test_ap_wps_from_event(dev, apdev): """WPS PBC event on AP to enable PBC""" ssid = "test-wps-conf" @@ -3532,6 +3557,7 @@ def test_ap_wps_ap_scan_2(dev, apdev): wpas.wait_connected(timeout=30) wpas.dump_monitor() +@remote_compatible def test_ap_wps_eapol_workaround(dev, apdev): """EAPOL workaround code path for 802.1X header length mismatch""" ssid = "test-wps" @@ -3638,6 +3664,7 @@ def test_ap_wps_iteration_error(dev, apdev): raise Exception("No WPS-CRED-RECEIVED for the second AP") dev[0].wait_connected(timeout=15) +@remote_compatible def test_ap_wps_priority(dev, apdev): """WPS PIN provisioning with configured AP and wps_priority""" ssid = "test-wps-conf-pin" @@ -3661,6 +3688,7 @@ def test_ap_wps_priority(dev, apdev): finally: dev[0].request("SET wps_priority 0") +@remote_compatible def test_ap_wps_and_non_wps(dev, apdev): """WPS and non-WPS AP in single hostapd process""" params = { "ssid": "wps", "eap_server": "1", "wps_state": "1" } @@ -3696,6 +3724,7 @@ def test_ap_wps_init_oom(dev, apdev): hapd.request("WPS_PIN any " + pin) dev[0].wait_connected(timeout=30) +@remote_compatible def test_ap_wps_er_oom(dev, apdev): """WPS ER OOM in XML processing""" try: @@ -3744,6 +3773,7 @@ def _test_ap_wps_er_oom(dev, apdev): if ev is None: raise Exception("Enrollee discovery timed out") +@remote_compatible def test_ap_wps_er_init_oom(dev, apdev): """WPS ER and OOM during init""" try: @@ -3768,6 +3798,7 @@ def _test_ap_wps_er_init_oom(dev, apdev): if "FAIL" not in dev[0].request("WPS_ER_START ifname=lo"): raise Exception("WPS_ER_START succeeded during os_get_random failure") +@remote_compatible def test_ap_wps_er_init_fail(dev, apdev): """WPS ER init failure""" if "FAIL" not in dev[0].request("WPS_ER_START ifname=does-not-exist"): @@ -4866,6 +4897,7 @@ def test_ap_wps_init_oom(dev, apdev): dev[0].flush_scan_cache() +@remote_compatible def test_ap_wps_invalid_assoc_req_elem(dev, apdev): """WPS and invalid IE in Association Request frame""" ssid = "test-wps" @@ -4905,6 +4937,7 @@ def test_ap_wps_pbc_pin_mismatch(dev, apdev): hapd.request("WPS_CANCEL") dev[0].flush_scan_cache() +@remote_compatible def test_ap_wps_ie_invalid(dev, apdev): """WPS PIN attempt with AP that has invalid WSC IE""" ssid = "test-wps" @@ -4921,6 +4954,7 @@ def test_ap_wps_ie_invalid(dev, apdev): raise Exception("Scan did not complete") dev[0].request("WPS_CANCEL") +@remote_compatible def test_ap_wps_scan_prio_order(dev, apdev): """WPS scan priority ordering""" ssid = "test-wps" @@ -4995,6 +5029,7 @@ def test_ap_wps_assoc_resp_ie_oom(dev, apdev): raise Exception("Association not seen") dev[0].request("WPS_CANCEL") +@remote_compatible def test_ap_wps_bss_info_errors(dev, apdev): """WPS BSS info errors""" params = { "ssid": "1", @@ -5043,17 +5078,20 @@ def wps_run_pbc_fail(apdev, dev): hapd = wps_start_ap(apdev) wps_run_pbc_fail_ap(apdev, dev, hapd) +@remote_compatible def test_ap_wps_pk_oom(dev, apdev): """WPS and public key OOM""" with alloc_fail(dev[0], 1, "wps_build_public_key"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_pk_oom_ap(dev, apdev): """WPS and public key OOM on AP""" hapd = wps_start_ap(apdev[0]) with alloc_fail(hapd, 1, "wps_build_public_key"): wps_run_pbc_fail_ap(apdev[0], dev[0], hapd) +@remote_compatible def test_ap_wps_encr_oom_ap(dev, apdev): """WPS and encrypted settings decryption OOM on AP""" hapd = wps_start_ap(apdev[0]) @@ -5068,32 +5106,38 @@ def test_ap_wps_encr_oom_ap(dev, apdev): dev[0].request("WPS_CANCEL") dev[0].wait_disconnected() +@remote_compatible def test_ap_wps_encr_no_random_ap(dev, apdev): """WPS and no random data available for encryption on AP""" hapd = wps_start_ap(apdev[0]) with fail_test(hapd, 1, "os_get_random;wps_build_encr_settings"): wps_run_pbc_fail_ap(apdev[0], dev[0], hapd) +@remote_compatible def test_ap_wps_e_hash_no_random_sta(dev, apdev): """WPS and no random data available for e-hash on STA""" with fail_test(dev[0], 1, "os_get_random;wps_build_e_hash"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_m1_no_random(dev, apdev): """WPS and no random for M1 on STA""" with fail_test(dev[0], 1, "os_get_random;wps_build_m1"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_m1_oom(dev, apdev): """WPS and OOM for M1 on STA""" with alloc_fail(dev[0], 1, "wps_build_m1"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_m3_oom(dev, apdev): """WPS and OOM for M3 on STA""" with alloc_fail(dev[0], 1, "wps_build_m3"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_m5_oom(dev, apdev): """WPS and OOM for M5 on STA""" hapd = wps_start_ap(apdev[0]) @@ -5109,12 +5153,14 @@ def test_ap_wps_m5_oom(dev, apdev): dev[0].wait_disconnected() dev[0].flush_scan_cache() +@remote_compatible def test_ap_wps_m5_no_random(dev, apdev): """WPS and no random for M5 on STA""" with fail_test(dev[0], 1, "os_get_random;wps_build_encr_settings;wps_build_m5"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_m7_oom(dev, apdev): """WPS and OOM for M7 on STA""" hapd = wps_start_ap(apdev[0]) @@ -5130,12 +5176,14 @@ def test_ap_wps_m7_oom(dev, apdev): dev[0].wait_disconnected() dev[0].flush_scan_cache() +@remote_compatible def test_ap_wps_m7_no_random(dev, apdev): """WPS and no random for M7 on STA""" with fail_test(dev[0], 1, "os_get_random;wps_build_encr_settings;wps_build_m7"): wps_run_pbc_fail(apdev[0], dev[0]) +@remote_compatible def test_ap_wps_wsc_done_oom(dev, apdev): """WPS and OOM for WSC_Done on STA""" with alloc_fail(dev[0], 1, "wps_build_wsc_done"): @@ -5797,6 +5845,7 @@ def test_ap_wps_m4_msg_type_m2d(dev, apdev): """WPS and M4 but Message Type M2D""" wps_m4_but_other(dev[0], apdev[0], "M4/M2D", "06") +@remote_compatible def test_ap_wps_config_methods(dev, apdev): """WPS configuration method parsing""" ssid = "test-wps-conf" @@ -7734,10 +7783,12 @@ def test_wps_ext_ap_settings_success(dev, apdev): ap_settings += build_wsc_attr(ATTR_MAC_ADDR, binascii.unhexlify(apdev[0]['bssid'].replace(':', ''))) wps_run_ap_settings_proto(dev, apdev, ap_settings, True) +@remote_compatible def test_wps_ext_ap_settings_missing(dev, apdev): """WPS and AP Settings: missing""" wps_run_ap_settings_proto(dev, apdev, None, False) +@remote_compatible def test_wps_ext_ap_settings_mac_addr_mismatch(dev, apdev): """WPS and AP Settings: MAC Address mismatch""" ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01') @@ -7748,6 +7799,7 @@ def test_wps_ext_ap_settings_mac_addr_mismatch(dev, apdev): ap_settings += build_wsc_attr(ATTR_MAC_ADDR, '\x00\x00\x00\x00\x00\x00') wps_run_ap_settings_proto(dev, apdev, ap_settings, True) +@remote_compatible def test_wps_ext_ap_settings_mac_addr_missing(dev, apdev): """WPS and AP Settings: missing MAC Address""" ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01') @@ -7757,6 +7809,7 @@ def test_wps_ext_ap_settings_mac_addr_missing(dev, apdev): ap_settings += build_wsc_attr(ATTR_NETWORK_KEY, '') wps_run_ap_settings_proto(dev, apdev, ap_settings, False) +@remote_compatible def test_wps_ext_ap_settings_reject_encr_type(dev, apdev): """WPS and AP Settings: reject Encr Type""" ap_settings = build_wsc_attr(ATTR_NETWORK_INDEX, '\x01') @@ -7767,6 +7820,7 @@ def test_wps_ext_ap_settings_reject_encr_type(dev, apdev): ap_settings += build_wsc_attr(ATTR_MAC_ADDR, binascii.unhexlify(apdev[0]['bssid'].replace(':', ''))) wps_run_ap_settings_proto(dev, apdev, ap_settings, False) +@remote_compatible def test_wps_ext_ap_settings_m2d(dev, apdev): """WPS and AP Settings: M2D""" addr,bssid,hapd = wps_start_ext_reg(apdev[0], dev[0]) @@ -7804,6 +7858,7 @@ def wps_wait_ap_nack(hapd, dev, e_nonce, r_nonce): send_wsc_msg(hapd, dev.own_addr(), nack) dev.wait_disconnected() +@remote_compatible def test_wps_ext_m3_missing_e_hash1(dev, apdev): """WPS proto: M3 missing E-Hash1""" pin = "12345670" @@ -7848,6 +7903,7 @@ def test_wps_ext_m3_missing_e_hash1(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m3_missing_e_hash2(dev, apdev): """WPS proto: M3 missing E-Hash2""" pin = "12345670" @@ -7892,6 +7948,7 @@ def test_wps_ext_m3_missing_e_hash2(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m5_missing_e_snonce1(dev, apdev): """WPS proto: M5 missing E-SNonce1""" pin = "12345670" @@ -7951,6 +8008,7 @@ def test_wps_ext_m5_missing_e_snonce1(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m5_e_snonce1_mismatch(dev, apdev): """WPS proto: M5 E-SNonce1 mismatch""" pin = "12345670" @@ -8082,6 +8140,7 @@ def test_wps_ext_m7_missing_e_snonce2(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m7_e_snonce2_mismatch(dev, apdev): """WPS proto: M7 E-SNonce2 mismatch""" pin = "12345670" @@ -8154,6 +8213,7 @@ def test_wps_ext_m7_e_snonce2_mismatch(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m1_pubkey_oom(dev, apdev): """WPS proto: M1 PubKey OOM""" pin = "12345670" @@ -8184,6 +8244,7 @@ def wps_wait_eap_failure(hapd, dev): raise Exception("EAP-Failure not reported") dev.wait_disconnected() +@remote_compatible def test_wps_ext_m3_m1(dev, apdev): """WPS proto: M3 replaced with M1""" pin = "12345670" @@ -8228,6 +8289,7 @@ def test_wps_ext_m3_m1(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m5_m3(dev, apdev): """WPS proto: M5 replaced with M3""" pin = "12345670" @@ -8286,6 +8348,7 @@ def test_wps_ext_m5_m3(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m3_m2(dev, apdev): """WPS proto: M3 replaced with M2""" pin = "12345670" @@ -8328,6 +8391,7 @@ def test_wps_ext_m3_m2(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m3_m5(dev, apdev): """WPS proto: M3 replaced with M5""" pin = "12345670" @@ -8372,6 +8436,7 @@ def test_wps_ext_m3_m5(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m3_m7(dev, apdev): """WPS proto: M3 replaced with M7""" pin = "12345670" @@ -8416,6 +8481,7 @@ def test_wps_ext_m3_m7(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m3_done(dev, apdev): """WPS proto: M3 replaced with WSC_Done""" pin = "12345670" @@ -8457,6 +8523,7 @@ def test_wps_ext_m3_done(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_nack_invalid(dev, apdev): """WPS proto: M2 followed by invalid NACK""" pin = "12345670" @@ -8495,6 +8562,7 @@ def test_wps_ext_m2_nack_invalid(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_nack_no_msg_type(dev, apdev): """WPS proto: M2 followed by NACK without Msg Type""" pin = "12345670" @@ -8533,6 +8601,7 @@ def test_wps_ext_m2_nack_no_msg_type(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_nack_invalid_msg_type(dev, apdev): """WPS proto: M2 followed by NACK with invalid Msg Type""" pin = "12345670" @@ -8571,6 +8640,7 @@ def test_wps_ext_m2_nack_invalid_msg_type(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_nack_e_nonce_mismatch(dev, apdev): """WPS proto: M2 followed by NACK with e-nonce mismatch""" pin = "12345670" @@ -8609,6 +8679,7 @@ def test_wps_ext_m2_nack_e_nonce_mismatch(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_nack_no_config_error(dev, apdev): """WPS proto: M2 followed by NACK without Config Error""" pin = "12345670" @@ -8647,6 +8718,7 @@ def test_wps_ext_m2_nack_no_config_error(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_ack_invalid(dev, apdev): """WPS proto: M2 followed by invalid ACK""" pin = "12345670" @@ -8685,6 +8757,7 @@ def test_wps_ext_m2_ack_invalid(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_ack(dev, apdev): """WPS proto: M2 followed by ACK""" pin = "12345670" @@ -8722,6 +8795,7 @@ def test_wps_ext_m2_ack(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_ack_no_msg_type(dev, apdev): """WPS proto: M2 followed by ACK missing Msg Type""" pin = "12345670" @@ -8760,6 +8834,7 @@ def test_wps_ext_m2_ack_no_msg_type(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_ack_invalid_msg_type(dev, apdev): """WPS proto: M2 followed by ACK with invalid Msg Type""" pin = "12345670" @@ -8798,6 +8873,7 @@ def test_wps_ext_m2_ack_invalid_msg_type(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m2_ack_e_nonce_mismatch(dev, apdev): """WPS proto: M2 followed by ACK with e-nonce mismatch""" pin = "12345670" @@ -8836,6 +8912,7 @@ def test_wps_ext_m2_ack_e_nonce_mismatch(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m1_invalid(dev, apdev): """WPS proto: M1 failing parsing""" pin = "12345670" @@ -8947,6 +9024,7 @@ def wps_ext_wsc_done(dev, apdev): msg, m8_attrs, raw_m8_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M8) return hapd, msg, e_nonce, r_nonce +@remote_compatible def test_wps_ext_wsc_done_invalid(dev, apdev): """WPS proto: invalid WSC_Done""" hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev) @@ -8958,6 +9036,7 @@ def test_wps_ext_wsc_done_invalid(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_wsc_done_no_msg_type(dev, apdev): """WPS proto: invalid WSC_Done""" hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev) @@ -8972,6 +9051,7 @@ def test_wps_ext_wsc_done_no_msg_type(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_wsc_done_wrong_msg_type(dev, apdev): """WPS proto: WSC_Done with wrong Msg Type""" hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev) @@ -8986,6 +9066,7 @@ def test_wps_ext_wsc_done_wrong_msg_type(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_wsc_done_no_e_nonce(dev, apdev): """WPS proto: WSC_Done without e_nonce""" hapd, msg, e_nonce, r_nonce = wps_ext_wsc_done(dev, apdev) @@ -9014,6 +9095,7 @@ def test_wps_ext_wsc_done_no_r_nonce(dev, apdev): wps_wait_eap_failure(hapd, dev[0]) +@remote_compatible def test_wps_ext_m7_no_encr_settings(dev, apdev): """WPS proto: M7 without Encr Settings""" pin = "12345670" @@ -9086,6 +9168,7 @@ def test_wps_ext_m7_no_encr_settings(dev, apdev): wps_wait_ap_nack(hapd, dev[0], e_nonce, r_nonce) +@remote_compatible def test_wps_ext_m1_workaround(dev, apdev): """WPS proto: M1 Manufacturer/Model workaround""" pin = "12345670" @@ -9112,6 +9195,7 @@ def test_wps_ext_m1_workaround(dev, apdev): logger.debug("Receive M2 from AP") msg, m2_attrs, raw_m2_attrs = recv_wsc_msg(hapd, WSC_MSG, WPS_M2) +@remote_compatible def test_ap_wps_disable_enable(dev, apdev): """WPS and DISABLE/ENABLE AP""" hapd = wps_start_ap(apdev[0]) @@ -9281,6 +9365,7 @@ def wait_scan_stopped(dev): logger.debug("Waiting for scan to complete") time.sleep(0.1) +@remote_compatible def test_ap_wps_eap_wsc_errors(dev, apdev): """WPS and EAP-WSC error cases""" ssid = "test-wps-conf-pin" diff --git a/tests/hwsim/test_autoscan.py b/tests/hwsim/test_autoscan.py index 2c1dde7..25db662 100644 --- a/tests/hwsim/test_autoscan.py +++ b/tests/hwsim/test_autoscan.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -51,6 +52,7 @@ def test_autoscan_periodic(dev, apdev): finally: dev[0].request("AUTOSCAN ") +@remote_compatible def test_autoscan_exponential(dev, apdev): """autoscan_exponential""" hostapd.add_ap(apdev[0], { "ssid": "autoscan" }) diff --git a/tests/hwsim/test_cfg80211.py b/tests/hwsim/test_cfg80211.py index 56d197b..36d1979 100644 --- a/tests/hwsim/test_cfg80211.py +++ b/tests/hwsim/test_cfg80211.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import binascii @@ -22,6 +23,7 @@ def nl80211_command(dev, cmd, attr): raise Exception("nl80211 command failed") return binascii.unhexlify(res) +@remote_compatible def test_cfg80211_disassociate(dev, apdev): """cfg80211 disassociation command""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -93,6 +95,7 @@ def test_cfg80211_tx_frame(dev, apdev, params): if freq[1] != "2412": raise Exception("Second Action frame on unexpected channel: %s MHz" % freq[1]) +@remote_compatible def test_cfg80211_wep_key_idx_change(dev, apdev): """WEP Shared Key authentication and key index change without deauth""" hapd = hostapd.add_ap(apdev[0], @@ -122,6 +125,7 @@ def test_cfg80211_wep_key_idx_change(dev, apdev): dev[0].wait_connected(timeout=10, error="Reassociation timed out") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_cfg80211_hostapd_ext_sta_remove(dev, apdev): """cfg80211 DEL_STATION issued externally to hostapd""" hapd = hostapd.add_ap(apdev[0], diff --git a/tests/hwsim/test_dfs.py b/tests/hwsim/test_dfs.py index 9bf6e54..53d5694 100644 --- a/tests/hwsim/test_dfs.py +++ b/tests/hwsim/test_dfs.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import os import subprocess import time @@ -213,6 +214,7 @@ def test_dfs_radar(dev, apdev): subprocess.call(['iw', 'reg', 'set', '00']) dev[0].flush_scan_cache() +@remote_compatible def test_dfs_radar_on_non_dfs_channel(dev, apdev): """DFS radar detection test code on non-DFS channel""" params = { "ssid": "radar" } diff --git a/tests/hwsim/test_ext_password.py b/tests/hwsim/test_ext_password.py index b90fc88..e89e51d 100644 --- a/tests/hwsim/test_ext_password.py +++ b/tests/hwsim/test_ext_password.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() @@ -14,6 +15,7 @@ from test_ap_hs20 import hs20_ap_params from test_ap_hs20 import interworking_select from test_ap_hs20 import interworking_connect +@remote_compatible def test_ext_password_psk(dev, apdev): """External password storage for PSK""" params = hostapd.wpa2_params(ssid="ext-pw-psk", passphrase="12345678") diff --git a/tests/hwsim/test_gas.py b/tests/hwsim/test_gas.py index 609033e..cdc90fd 100644 --- a/tests/hwsim/test_gas.py +++ b/tests/hwsim/test_gas.py @@ -5,6 +5,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import binascii import logging @@ -298,6 +299,7 @@ def test_gas_comeback_delay(dev, apdev): if ev is None: raise Exception("Operation timed out") +@remote_compatible def test_gas_stop_fetch_anqp(dev, apdev): """Stop FETCH_ANQP operation""" hapd = start_ap(apdev[0]) @@ -911,6 +913,7 @@ def test_gas_query_deinit(dev, apdev): # GAS query has not yet been started. wpas.interface_remove("wlan5") +@remote_compatible def test_gas_anqp_oom_wpas(dev, apdev): """GAS/ANQP query and OOM in wpa_supplicant""" hapd = start_ap(apdev[0]) diff --git a/tests/hwsim/test_hapd_ctrl.py b/tests/hwsim/test_hapd_ctrl.py index f395d75..8d51060 100644 --- a/tests/hwsim/test_hapd_ctrl.py +++ b/tests/hwsim/test_hapd_ctrl.py @@ -4,10 +4,12 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import hostapd import hwsim_utils from utils import skip_with_fips +@remote_compatible def test_hapd_ctrl_status(dev, apdev): """hostapd ctrl_iface STATUS commands""" ssid = "hapd-ctrl" @@ -31,6 +33,7 @@ def test_hapd_ctrl_status(dev, apdev): if driver['addr'] != bssid: raise Exception("Unexpected addr") +@remote_compatible def test_hapd_ctrl_p2p_manager(dev, apdev): """hostapd as P2P Device manager""" ssid = "hapd-p2p-mgr" @@ -51,6 +54,7 @@ def test_hapd_ctrl_p2p_manager(dev, apdev): dev[0].wait_disconnected(timeout=5) dev[0].wait_connected(timeout=10, error="Re-connection timed out") +@remote_compatible def test_hapd_ctrl_sta(dev, apdev): """hostapd and STA ctrl_iface commands""" ssid = "hapd-ctrl-sta" @@ -73,6 +77,7 @@ def test_hapd_ctrl_sta(dev, apdev): if "FAIL" not in hapd.request("STA-NEXT 00:11:22:33:44"): raise Exception("Unexpected STA-NEXT success") +@remote_compatible def test_hapd_ctrl_disconnect(dev, apdev): """hostapd and disconnection ctrl_iface commands""" ssid = "hapd-ctrl" @@ -98,6 +103,7 @@ def test_hapd_ctrl_disconnect(dev, apdev): dev[0].wait_disconnected(timeout=5) dev[0].wait_connected(timeout=10, error="Re-connection timed out") +@remote_compatible def test_hapd_ctrl_chan_switch(dev, apdev): """hostapd and CHAN_SWITCH ctrl_iface command""" ssid = "hapd-ctrl" @@ -112,6 +118,7 @@ def test_hapd_ctrl_chan_switch(dev, apdev): if "FAIL" not in hapd.request("CHAN_SWITCH 0 2432 center_freq1=123 center_freq2=234 bandwidth=1000 sec_channel_offset=20 ht vht"): raise Exception("Unexpected CHAN_SWITCH success") +@remote_compatible def test_hapd_ctrl_level(dev, apdev): """hostapd and LEVEL ctrl_iface command""" ssid = "hapd-ctrl" @@ -120,6 +127,7 @@ def test_hapd_ctrl_level(dev, apdev): if "FAIL" not in hapd.request("LEVEL 0"): raise Exception("Unexpected LEVEL success on non-monitor interface") +@remote_compatible def test_hapd_ctrl_new_sta(dev, apdev): """hostapd and NEW_STA ctrl_iface command""" ssid = "hapd-ctrl" @@ -132,6 +140,7 @@ def test_hapd_ctrl_new_sta(dev, apdev): if "AUTHORIZED" not in hapd.request("STA 00:11:22:33:44:55"): raise Exception("Unexpected NEW_STA STA status") +@remote_compatible def test_hapd_ctrl_get(dev, apdev): """hostapd and GET ctrl_iface command""" ssid = "hapd-ctrl" @@ -142,6 +151,7 @@ def test_hapd_ctrl_get(dev, apdev): if "FAIL" in hapd.request("GET version"): raise Exception("Unexpected GET version failure") +@remote_compatible def test_hapd_ctrl_unknown(dev, apdev): """hostapd and unknown ctrl_iface command""" ssid = "hapd-ctrl" @@ -150,6 +160,7 @@ def test_hapd_ctrl_unknown(dev, apdev): if "UNKNOWN COMMAND" not in hapd.request("FOO"): raise Exception("Unexpected response") +@remote_compatible def test_hapd_ctrl_hs20_wnm_notif(dev, apdev): """hostapd and HS20_WNM_NOTIF ctrl_iface command""" ssid = "hapd-ctrl" @@ -160,6 +171,7 @@ def test_hapd_ctrl_hs20_wnm_notif(dev, apdev): if "FAIL" not in hapd.request("HS20_WNM_NOTIF 00:11:22:33:44:55http://example.com/"): raise Exception("Unexpected HS20_WNM_NOTIF success") +@remote_compatible def test_hapd_ctrl_hs20_deauth_req(dev, apdev): """hostapd and HS20_DEAUTH_REQ ctrl_iface command""" ssid = "hapd-ctrl" @@ -172,6 +184,7 @@ def test_hapd_ctrl_hs20_deauth_req(dev, apdev): if "FAIL" not in hapd.request("HS20_DEAUTH_REQ 00:11:22:33:44:55 1"): raise Exception("Unexpected HS20_DEAUTH_REQ success") +@remote_compatible def test_hapd_ctrl_disassoc_imminent(dev, apdev): """hostapd and DISASSOC_IMMINENT ctrl_iface command""" ssid = "hapd-ctrl" @@ -191,6 +204,7 @@ def test_hapd_ctrl_disassoc_imminent(dev, apdev): if ev is None: raise Exception("Scan timed out") +@remote_compatible def test_hapd_ctrl_ess_disassoc(dev, apdev): """hostapd and ESS_DISASSOC ctrl_iface command""" ssid = "hapd-ctrl" @@ -243,6 +257,7 @@ def test_hapd_ctrl_set_accept_mac_file(dev, apdev): if ev is not None: raise Exception("Unexpected disconnection") +@remote_compatible def test_hapd_ctrl_set_error_cases(dev, apdev): """hostapd and SET error cases""" ssid = "hapd-ctrl" @@ -440,6 +455,7 @@ def test_hapd_ctrl_set_error_cases(dev, apdev): if "OK" not in hapd.request("SET " + e): raise Exception("Unexpected SET failure: '%s'" % e) +@remote_compatible def test_hapd_ctrl_global(dev, apdev): """hostapd and GET ctrl_iface command""" ssid = "hapd-ctrl" @@ -516,6 +532,7 @@ def test_hapd_dup_network_global_wpa(dev, apdev): if "FAIL" in dst_hapd.request("STA " + addr): raise Exception("Could not connect using duplicated wpa params") +@remote_compatible def test_hapd_ctrl_log_level(dev, apdev): """hostapd ctrl_iface LOG_LEVEL""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -559,6 +576,7 @@ def test_hapd_ctrl_log_level(dev, apdev): if "Timestamp: 1" not in level: raise Exception("Unexpected timestamp(3): " + level) +@remote_compatible def test_hapd_ctrl_disconnect_no_tx(dev, apdev): """hostapd disconnecting STA without transmitting Deauth/Disassoc""" ssid = "hapd-test" diff --git a/tests/hwsim/test_hostapd_oom.py b/tests/hwsim/test_hostapd_oom.py index ab885d2..a3c0296 100644 --- a/tests/hwsim/test_hostapd_oom.py +++ b/tests/hwsim/test_hostapd_oom.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -37,6 +38,7 @@ def hostapd_oom_loop(apdev, params, start_func="main"): except Exception, e: logger.info("Iteration %d - %s" % (i, str(e))) +@remote_compatible def test_hostapd_oom_open(dev, apdev): """hostapd failing to setup open mode due to OOM""" params = { "ssid": "open" } @@ -48,6 +50,7 @@ def test_hostapd_oom_wpa2_psk(dev, apdev): params['wpa_psk_file'] = 'hostapd.wpa_psk' hostapd_oom_loop(apdev, params) +@remote_compatible def test_hostapd_oom_wpa2_eap(dev, apdev): """hostapd failing to setup WPA2-EAP mode due to OOM""" params = hostapd.wpa2_eap_params(ssid="test") @@ -56,6 +59,7 @@ def test_hostapd_oom_wpa2_eap(dev, apdev): params['acct_server_shared_secret'] = "radius" hostapd_oom_loop(apdev, params) +@remote_compatible def test_hostapd_oom_wpa2_eap_radius(dev, apdev): """hostapd failing to setup WPA2-EAP mode due to OOM in RADIUS""" params = hostapd.wpa2_eap_params(ssid="test") diff --git a/tests/hwsim/test_ibss.py b/tests/hwsim/test_ibss.py index cc6bfc1..c9c57d3 100644 --- a/tests/hwsim/test_ibss.py +++ b/tests/hwsim/test_ibss.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -348,6 +349,7 @@ def test_ibss_wep(dev): connect_ibss_cmd(dev[1], id) bssid1 = wait_ibss_connection(dev[1]) +@remote_compatible def test_ibss_rsn_error_case(dev): """IBSS RSN regression test for IBSS_RSN prior IBSS setup""" if "FAIL" not in dev[0].request("IBSS_RSN 02:03:04:05:06:07"): diff --git a/tests/hwsim/test_ieee8021x.py b/tests/hwsim/test_ieee8021x.py index 8db8ae8..a6f6753 100644 --- a/tests/hwsim/test_ieee8021x.py +++ b/tests/hwsim/test_ieee8021x.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import hmac import logging @@ -133,6 +134,7 @@ def test_ieee8021x_proto(dev, apdev): if int(stop[val]) <= int(start[val]): raise Exception(val + " did not increase") +@remote_compatible def test_ieee8021x_eapol_start(dev, apdev): """IEEE 802.1X and EAPOL-Start retransmissions""" params = hostapd.radius_params() diff --git a/tests/hwsim/test_mbo.py b/tests/hwsim/test_mbo.py index f0e8c96..329585c 100644 --- a/tests/hwsim/test_mbo.py +++ b/tests/hwsim/test_mbo.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() @@ -59,6 +60,7 @@ def test_mbo_assoc_disallow(dev, apdev, params): if "Destination address: " + hapd2.own_addr() in out: raise Exception("Association request sent to disallowed AP 2") +@remote_compatible def test_mbo_cell_capa_update(dev, apdev): """MBO cellular data capability update""" ssid = "test-wnm-mbo" @@ -85,6 +87,7 @@ def test_mbo_cell_capa_update(dev, apdev): if sta['mbo_cell_capa'] != '3': raise Exception("mbo_cell_capa not updated properly") +@remote_compatible def test_mbo_cell_capa_update_pmf(dev, apdev): """MBO cellular data capability update with PMF required""" ssid = "test-wnm-mbo" @@ -116,6 +119,7 @@ def test_mbo_cell_capa_update_pmf(dev, apdev): if sta['mbo_cell_capa'] != '3': raise Exception("mbo_cell_capa not updated properly") +@remote_compatible def test_mbo_non_pref_chan(dev, apdev): """MBO non-preferred channel list""" ssid = "test-wnm-mbo" @@ -199,6 +203,7 @@ def test_mbo_non_pref_chan(dev, apdev): if 'non_pref_chan[0]' in sta: raise Exception("Unexpected non_pref_chan[0] value (update 4)") +@remote_compatible def test_mbo_sta_supp_op_classes(dev, apdev): """MBO STA supported operating classes""" ssid = "test-wnm-mbo" diff --git a/tests/hwsim/test_monitor_interface.py b/tests/hwsim/test_monitor_interface.py index cc8345b..bfc9a15 100644 --- a/tests/hwsim/test_monitor_interface.py +++ b/tests/hwsim/test_monitor_interface.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -50,6 +51,7 @@ def test_monitor_iface_multi_bss(dev, apdev): dev[0].connect("monitor-iface", key_mgmt="NONE", scan_freq="2412") dev[1].connect("bss-2", key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_monitor_iface_unknown_sta(dev, apdev): """AP mode monitor interface and Data frame from unknown STA""" ssid = "monitor-iface-pmf" diff --git a/tests/hwsim/test_nfc_p2p.py b/tests/hwsim/test_nfc_p2p.py index 24ae075..3139dc4 100644 --- a/tests/hwsim/test_nfc_p2p.py +++ b/tests/hwsim/test_nfc_p2p.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger(__name__) @@ -808,6 +809,7 @@ def _test_nfc_p2p_ip_addr_assignment2(dev): if res['ip_addr'] == res0['ip_addr']: raise Exception("Same IP address assigned to both clients") +@remote_compatible def test_nfc_p2p_tag_enable_disable(dev): """NFC tag enable/disable for P2P""" if "FAIL" in dev[0].request("WPS_NFC_TOKEN NDEF").rstrip(): @@ -827,6 +829,7 @@ def test_nfc_p2p_tag_enable_disable(dev): if "OK" not in dev[0].request("P2P_SET nfc_tag 0"): raise Exception("Failed to disable NFC Tag for P2P static handover") +@remote_compatible def test_nfc_p2p_static_handover_invalid(dev): """NFC static handover with invalid contents""" logger.info("Unknown OOB GO Neg channel") diff --git a/tests/hwsim/test_nfc_wps.py b/tests/hwsim/test_nfc_wps.py index b65c787..0b6cd11 100644 --- a/tests/hwsim/test_nfc_wps.py +++ b/tests/hwsim/test_nfc_wps.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import subprocess import logging @@ -34,6 +35,7 @@ def ap_wps_params(ssid): "wpa_passphrase": "12345678", "wpa": "2", "wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP"} +@remote_compatible def test_nfc_wps_password_token_sta(dev, apdev): """NFC tag with password token on the station/Enrollee""" ssid = "test-wps-nfc-pw-token-conf" @@ -93,6 +95,7 @@ def test_nfc_wps_config_token_init(dev, apdev): dev[0].wait_connected(timeout=15) check_wpa2_connection(dev[0], apdev[0], hapd, ssid, mixed=True) +@remote_compatible def test_nfc_wps_password_token_sta_init(dev, apdev): """Initial AP configuration with first WPS NFC Enrollee""" ssid = "test-wps-nfc-pw-token-init" @@ -112,6 +115,7 @@ def test_nfc_wps_password_token_sta_init(dev, apdev): dev[0].wait_connected(timeout=30) check_wpa2_connection(dev[0], apdev[0], hapd, ssid, mixed=True) +@remote_compatible def test_nfc_wps_password_token_ap(dev, apdev): """WPS registrar configuring an AP using AP password token""" ssid = "test-wps-nfc-pw-token-init" @@ -180,6 +184,7 @@ def _test_nfc_wps_handover_init(dev, apdev): if "FAIL" not in hapd.request("NFC_GET_HANDOVER_SEL NDEF WPS-CR"): raise Exception("Unexpected NFC_GET_HANDOVER_SEL success during OOM") +@remote_compatible def test_nfc_wps_handover_errors(dev, apdev): """WPS AP NFC handover report error cases""" ssid = "test-wps-nfc-handover" @@ -415,6 +420,7 @@ def start_ap_er(er, ap, ssid): er.request("WPS_ER_SET_CONFIG " + ap_uuid + " 0") return hapd +@remote_compatible def test_nfc_wps_er_pw_token(dev, apdev): """WPS NFC password token from Enrollee to ER""" try: @@ -444,6 +450,7 @@ def _test_nfc_wps_er_pw_token(dev, apdev): dev[1].wait_connected(timeout=15) check_wpa2_connection(dev[1], apdev[0], hapd, ssid) +@remote_compatible def test_nfc_wps_er_config_token(dev, apdev): """WPS NFC configuration token from ER to Enrollee""" try: @@ -564,6 +571,7 @@ def _test_nfc_wps_er_handover_pk_hash_mismatch_er(dev, apdev): if "WPS-FAIL" not in ev: raise Exception("Public key hash mismatch not detected") +@remote_compatible def test_nfc_invalid_ndef_record(dev, apdev): """Invalid NFC NDEF record handling""" tests = [ "11223344", diff --git a/tests/hwsim/test_p2p_autogo.py b/tests/hwsim/test_p2p_autogo.py index 2f05d0e..42482d6 100644 --- a/tests/hwsim/test_p2p_autogo.py +++ b/tests/hwsim/test_p2p_autogo.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import subprocess import logging @@ -176,6 +177,7 @@ def test_autogo_m2d(dev): if ev is None: raise Exception("No M2D event on group interface (2)") +@remote_compatible def test_autogo_fail(dev): """P2P autonomous GO and incorrect PIN""" autogo(dev[0], freq=2412) @@ -339,6 +341,7 @@ def test_autogo_chan_switch(dev): time.sleep(0.1) hwsim_utils.test_connectivity_p2p(dev[0], dev[1]) +@remote_compatible def test_autogo_extra_cred(dev): """P2P autonomous GO sending two WPS credentials""" if "FAIL" in dev[0].request("SET wps_testing_dummy_cred 1"): @@ -365,6 +368,7 @@ def test_autogo_ifdown(dev): if res['ifname'] not in ev: raise Exception("Unexpected group removal event: " + ev) +@remote_compatible def test_autogo_start_during_scan(dev): """P2P autonomous GO started during ongoing manual scan""" try: @@ -418,6 +422,7 @@ def test_autogo_passphrase_len(dev): finally: dev[0].request("SET p2p_passphrase_len 8") +@remote_compatible def test_autogo_bridge(dev): """P2P autonomous GO in a bridge""" try: @@ -448,6 +453,7 @@ def test_autogo_bridge(dev): dev[0].cmd_execute(['ip', 'link', 'set', 'dev', 'p2p-br0', 'down', '2>', '/dev/null']) dev[0].cmd_execute(['brctl', 'delbr', 'p2p-br0', '2>', '/dev/null']) +@remote_compatible def test_presence_req_on_group_interface(dev): """P2P_PRESENCE_REQ on group interface""" dev[1].global_request("SET p2p_no_group_iface 0") @@ -525,6 +531,7 @@ def test_autogo_join_auto(dev): dev[1].wait_go_ending_session() dev[1].flush_scan_cache() +@remote_compatible def test_autogo_join_auto_go_neg(dev): """P2P_CONNECT-auto fallback to GO Neg""" dev[1].flush_scan_cache() @@ -561,6 +568,7 @@ def test_autogo_join_auto_go_neg(dev): dev[1].wait_go_ending_session() dev[1].flush_scan_cache() +@remote_compatible def test_autogo_join_auto_go_neg_after_seeing_go(dev): """P2P_CONNECT-auto fallback to GO Neg after seeing GO""" autogo(dev[0], freq=2412) @@ -706,6 +714,7 @@ def rx_pd_req(dev): p2p['freq'] = msg['freq'] return p2p +@remote_compatible def test_autogo_scan(dev): """P2P autonomous GO and no P2P IE in Probe Response scan results""" addr0 = dev[0].p2p_dev_addr() @@ -781,6 +790,7 @@ def test_autogo_scan(dev): dev[0].remove_group() dev[1].wait_go_ending_session() +@remote_compatible def test_autogo_join_before_found(dev): """P2P client joining a group before having found GO Device Address""" dev[0].global_request("SET p2p_no_group_iface 0") diff --git a/tests/hwsim/test_p2p_channel.py b/tests/hwsim/test_p2p_channel.py index 326122e..b9589e3 100644 --- a/tests/hwsim/test_p2p_channel.py +++ b/tests/hwsim/test_p2p_channel.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import os @@ -189,6 +190,7 @@ def test_p2p_channel_avoid(dev): dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES") dev[1].flush_scan_cache() +@remote_compatible def test_autogo_following_bss(dev, apdev): """P2P autonomous GO operate on the same channel as station interface""" if dev[0].get_mcc() > 1: @@ -208,6 +210,7 @@ def test_autogo_following_bss(dev, apdev): hwsim_utils.test_connectivity(dev[0], hapd) dev[0].remove_group(res_go['ifname']) +@remote_compatible def test_go_neg_with_bss_connected(dev, apdev): """P2P channel selection: GO negotiation when station interface is connected""" @@ -404,6 +407,7 @@ def test_go_neg_forced_freq_diff_than_bss_freq(dev, apdev): subprocess.call(['iw', 'reg', 'set', '00']) wpas.flush_scan_cache() +@remote_compatible def test_go_pref_chan_bss_on_diff_chan(dev, apdev): """P2P channel selection: Station on different channel than GO configured pref channel""" @@ -446,6 +450,7 @@ def test_go_pref_chan_bss_on_disallowed_chan(dev, apdev): wpas.global_request("P2P_SET disallow_freq ") wpas.global_request("SET p2p_pref_chan ") +@remote_compatible def test_no_go_freq(dev, apdev): """P2P channel selection: no GO freq""" try: @@ -476,6 +481,7 @@ def test_no_go_freq(dev, apdev): finally: dev[0].global_request("SET p2p_no_go_freq ") +@remote_compatible def test_go_neg_peers_force_diff_freq(dev, apdev): """P2P channel selection when peers for different frequency""" try: @@ -485,6 +491,7 @@ def test_go_neg_peers_force_diff_freq(dev, apdev): return raise Exception("Unexpected group formation success") +@remote_compatible def test_autogo_random_channel(dev, apdev): """P2P channel selection: GO instantiated on random channel 1, 6, 11""" freqs = [] @@ -501,6 +508,7 @@ def test_autogo_random_channel(dev, apdev): if i == 20: raise Exception("GO created 20 times and not all social channels were selected. freqs not selected: " + str(list(set(go_freqs) - set(freqs)))) +@remote_compatible def test_p2p_autogo_pref_chan_disallowed(dev, apdev): """P2P channel selection: GO preferred channels are disallowed""" try: diff --git a/tests/hwsim/test_p2p_concurrency.py b/tests/hwsim/test_p2p_concurrency.py index cf0aea1..81545cc 100644 --- a/tests/hwsim/test_p2p_concurrency.py +++ b/tests/hwsim/test_p2p_concurrency.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import subprocess @@ -15,6 +16,7 @@ from p2p_utils import * from test_ap_ht import clear_scan_cache from utils import HwsimSkip +@remote_compatible def test_concurrent_autogo(dev, apdev): """Concurrent P2P autonomous GO""" logger.info("Connect to an infrastructure AP") @@ -130,6 +132,7 @@ def test_concurrent_autogo_crossconnect(dev, apdev): raise Exception("Timeout on cross connection disabled event") dev[0].global_request("P2P_SET cross_connect 0") +@remote_compatible def test_concurrent_p2pcli(dev, apdev): """Concurrent P2P client join""" logger.info("Connect to an infrastructure AP") @@ -151,6 +154,7 @@ def test_concurrent_p2pcli(dev, apdev): logger.info("Confirm AP connection after P2P group removal") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_concurrent_grpform_go(dev, apdev): """Concurrent P2P group formation to become GO""" logger.info("Connect to an infrastructure AP") @@ -169,6 +173,7 @@ def test_concurrent_grpform_go(dev, apdev): logger.info("Confirm AP connection after P2P group removal") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_concurrent_grpform_cli(dev, apdev): """Concurrent P2P group formation to become P2P Client""" logger.info("Connect to an infrastructure AP") @@ -187,6 +192,7 @@ def test_concurrent_grpform_cli(dev, apdev): logger.info("Confirm AP connection after P2P group removal") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_concurrent_grpform_while_connecting(dev, apdev): """Concurrent P2P group formation while connecting to an AP""" logger.info("Start connection to an infrastructure AP") @@ -204,6 +210,7 @@ def test_concurrent_grpform_while_connecting(dev, apdev): logger.info("Confirm AP connection after P2P group removal") hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_concurrent_grpform_while_connecting2(dev, apdev): """Concurrent P2P group formation while connecting to an AP (2)""" logger.info("Start connection to an infrastructure AP") @@ -223,6 +230,7 @@ def test_concurrent_grpform_while_connecting2(dev, apdev): dev[0].wait_completed() hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_concurrent_grpform_while_connecting3(dev, apdev): """Concurrent P2P group formation while connecting to an AP (3)""" logger.info("Start connection to an infrastructure AP") @@ -241,6 +249,7 @@ def test_concurrent_grpform_while_connecting3(dev, apdev): dev[0].wait_completed() hwsim_utils.test_connectivity(dev[0], hapd) +@remote_compatible def test_concurrent_persistent_group(dev, apdev): """Concurrent P2P persistent group""" logger.info("Connect to an infrastructure AP") diff --git a/tests/hwsim/test_p2p_discovery.py b/tests/hwsim/test_p2p_discovery.py index 5f3ebac..0092f0c 100644 --- a/tests/hwsim/test_p2p_discovery.py +++ b/tests/hwsim/test_p2p_discovery.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import os @@ -15,6 +16,7 @@ from p2p_utils import * from test_gas import start_ap from test_cfg80211 import nl80211_remain_on_channel +@remote_compatible def test_discovery(dev): """P2P device discovery and provision discovery""" addr0 = dev[0].p2p_dev_addr() @@ -97,6 +99,7 @@ def test_discovery(dev): if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 00:11:22:33:44:55 foo"): raise Exception("Invalid P2P_PROV_DISC accepted") +@remote_compatible def test_discovery_pd_retries(dev): """P2P device discovery and provision discovery retries""" addr0 = dev[0].p2p_dev_addr() @@ -211,6 +214,7 @@ def _test_discovery_ctrl_char_in_devname(dev): if devname != "Device_B": raise Exception("Unexpected device_name from peer: " + devname) +@remote_compatible def test_discovery_dev_type(dev): """P2P device discovery with Device Type filter""" dev[1].request("SET sec_device_type 1-0050F204-2") @@ -492,6 +496,7 @@ def test_p2p_listen_and_offchannel_tx(dev): dev[2].p2p_stop_find() dev[0].p2p_stop_find() +@remote_compatible def test_p2p_listen_and_scan(dev): """P2P_LISTEN and scan""" dev[0].p2p_listen() @@ -536,6 +541,7 @@ def test_p2p_config_methods(dev): wpas.p2p_stop_find() +@remote_compatible def test_discovery_after_gas(dev, apdev): """P2P device discovery after GAS/ANQP exchange""" hapd = start_ap(apdev[0]) @@ -561,6 +567,7 @@ def test_discovery_after_gas(dev, apdev): if end - start > 1.3: raise Exception("Device discovery took unexpectedly long time") +@remote_compatible def test_discovery_listen_find(dev): """P2P_LISTEN immediately followed by P2P_FIND""" # Request an external remain-on-channel operation to delay start of the ROC diff --git a/tests/hwsim/test_p2p_ext.py b/tests/hwsim/test_p2p_ext.py index bb6297d..9d2d569 100644 --- a/tests/hwsim/test_p2p_ext.py +++ b/tests/hwsim/test_p2p_ext.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import os @@ -11,6 +12,7 @@ import os from tshark import run_tshark from p2p_utils import * +@remote_compatible def test_p2p_ext_discovery(dev): """P2P device discovery with vendor specific extensions""" addr0 = dev[0].p2p_dev_addr() @@ -71,6 +73,7 @@ def test_p2p_ext_discovery(dev): finally: dev[0].request("VENDOR_ELEM_REMOVE 1 *") +@remote_compatible def test_p2p_ext_discovery_go(dev): """P2P device discovery with vendor specific extensions for GO""" addr0 = dev[0].p2p_dev_addr() diff --git a/tests/hwsim/test_p2p_grpform.py b/tests/hwsim/test_p2p_grpform.py index 4de874a..9b442d2 100644 --- a/tests/hwsim/test_p2p_grpform.py +++ b/tests/hwsim/test_p2p_grpform.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import logging logger = logging.getLogger() @@ -19,6 +20,7 @@ from wpasupplicant import WpaSupplicant from p2p_utils import * from test_p2p_messages import parse_p2p_public_action, p2p_hdr, p2p_attr_capability, p2p_attr_go_intent, p2p_attr_config_timeout, p2p_attr_listen_channel, p2p_attr_intended_interface_addr, p2p_attr_channel_list, p2p_attr_device_info, p2p_attr_operating_channel, ie_p2p, ie_wsc, mgmt_tx, P2P_GO_NEG_REQ +@remote_compatible def test_grpform(dev): """P2P group formation using PIN and authorized connection (init -> GO)""" try: @@ -85,6 +87,7 @@ def test_grpform_c(dev): if r_res['ifname'] in utils.get_ifnames(): raise Exception("Group interface netdev was not removed") +@remote_compatible def test_grpform2(dev): """P2P group formation using PIN and authorized connection (resp -> GO)""" go_neg_pin_authorized(i_dev=dev[0], i_intent=0, r_dev=dev[1], r_intent=15) @@ -101,6 +104,7 @@ def test_grpform2_c(dev): if r_res['ifname'] in utils.get_ifnames(): raise Exception("Group interface netdev was not removed") +@remote_compatible def test_grpform3(dev): """P2P group formation using PIN and re-init GO Negotiation""" go_neg_pin(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0) @@ -117,6 +121,7 @@ def test_grpform3_c(dev): if r_res['ifname'] in utils.get_ifnames(): raise Exception("Group interface netdev was not removed") +@remote_compatible def test_grpform4(dev): """P2P group formation response during p2p_find""" addr1 = dev[1].p2p_dev_addr() @@ -132,6 +137,7 @@ def test_grpform4(dev): dev[1].p2p_stop_find() dev[0].p2p_stop_find() +@remote_compatible def test_grpform_pbc(dev): """P2P group formation using PBC and re-init GO Negotiation""" [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0) @@ -140,6 +146,7 @@ def test_grpform_pbc(dev): raise Exception("Unexpected device roles") remove_group(dev[0], dev[1]) +@remote_compatible def test_grpform_pd(dev): """P2P group formation with PD-before-GO-Neg workaround""" [i_res, r_res] = go_neg_pbc(i_dev=dev[0], provdisc=True, r_dev=dev[1], r_listen=True) @@ -236,18 +243,22 @@ def _test_grpform_ext_listen_oper(dev): if not found: raise Exception("Could not discover peer that was supposed to use extended listen") +@remote_compatible def test_both_go_intent_15(dev): """P2P GO Negotiation with both devices using GO intent 15""" go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=15, expect_failure=True, i_go_neg_status=9) +@remote_compatible def test_both_go_neg_display(dev): """P2P GO Negotiation with both devices trying to display PIN""" go_neg_pin_authorized(i_dev=dev[0], r_dev=dev[1], expect_failure=True, i_go_neg_status=10, i_method='display', r_method='display') +@remote_compatible def test_both_go_neg_enter(dev): """P2P GO Negotiation with both devices trying to enter PIN""" go_neg_pin_authorized(i_dev=dev[0], r_dev=dev[1], expect_failure=True, i_go_neg_status=10, i_method='enter', r_method='enter') +@remote_compatible def test_go_neg_pbc_vs_pin(dev): """P2P GO Negotiation with one device using PBC and the other PIN""" addr0 = dev[0].p2p_dev_addr() @@ -268,6 +279,7 @@ def test_go_neg_pbc_vs_pin(dev): if "status=10" not in ev: raise Exception("Unexpected failure reason: " + ev) +@remote_compatible def test_go_neg_pin_vs_pbc(dev): """P2P GO Negotiation with one device using PIN and the other PBC""" addr0 = dev[0].p2p_dev_addr() @@ -324,6 +336,7 @@ def test_grpform_per_sta_psk_wps(dev): dev[2].request("DISCONNECT") dev[1].wait_go_ending_session() +@remote_compatible def test_grpform_force_chan_go(dev): """P2P group formation forced channel selection by GO""" [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, @@ -335,6 +348,7 @@ def test_grpform_force_chan_go(dev): raise Exception("Unexpected channel - did not follow GO's forced channel") remove_group(dev[0], dev[1]) +@remote_compatible def test_grpform_force_chan_cli(dev): """P2P group formation forced channel selection by client""" [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0, @@ -346,12 +360,14 @@ def test_grpform_force_chan_cli(dev): raise Exception("Unexpected channel - did not follow GO's forced channel") remove_group(dev[0], dev[1]) +@remote_compatible def test_grpform_force_chan_conflict(dev): """P2P group formation fails due to forced channel mismatch""" go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422, r_dev=dev[1], r_intent=15, r_freq=2427, expect_failure=True, i_go_neg_status=7) +@remote_compatible def test_grpform_pref_chan_go(dev): """P2P group formation preferred channel selection by GO""" try: @@ -366,6 +382,7 @@ def test_grpform_pref_chan_go(dev): finally: dev[0].request("SET p2p_pref_chan ") +@remote_compatible def test_grpform_pref_chan_go_overridden(dev): """P2P group formation preferred channel selection by GO overridden by client""" try: @@ -381,6 +398,7 @@ def test_grpform_pref_chan_go_overridden(dev): finally: dev[1].request("SET p2p_pref_chan ") +@remote_compatible def test_grpform_no_go_freq_forcing_chan(dev): """P2P group formation with no-GO freq forcing channel""" try: @@ -395,6 +413,7 @@ def test_grpform_no_go_freq_forcing_chan(dev): finally: dev[1].request("SET p2p_no_go_freq ") +@remote_compatible def test_grpform_no_go_freq_conflict(dev): """P2P group formation fails due to no-GO range forced by client""" try: @@ -405,6 +424,7 @@ def test_grpform_no_go_freq_conflict(dev): finally: dev[1].request("SET p2p_no_go_freq ") +@remote_compatible def test_grpform_no_5ghz_world_roaming(dev): """P2P group formation with world roaming regulatory""" [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0, @@ -415,6 +435,7 @@ def test_grpform_no_5ghz_world_roaming(dev): raise Exception("Unexpected channel - did not follow world roaming rules") remove_group(dev[0], dev[1]) +@remote_compatible def test_grpform_no_5ghz_add_cli(dev): """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1""" try: @@ -431,6 +452,7 @@ def test_grpform_no_5ghz_add_cli(dev): dev[0].request("SET p2p_add_cli_chan 0") dev[1].request("SET p2p_add_cli_chan 0") +@remote_compatible def test_grpform_no_5ghz_add_cli2(dev): """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse)""" try: @@ -447,6 +469,7 @@ def test_grpform_no_5ghz_add_cli2(dev): dev[0].request("SET p2p_add_cli_chan 0") dev[1].request("SET p2p_add_cli_chan 0") +@remote_compatible def test_grpform_no_5ghz_add_cli3(dev): """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (intent 15)""" try: @@ -463,6 +486,7 @@ def test_grpform_no_5ghz_add_cli3(dev): dev[0].request("SET p2p_add_cli_chan 0") dev[1].request("SET p2p_add_cli_chan 0") +@remote_compatible def test_grpform_no_5ghz_add_cli4(dev): """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse; intent 15)""" try: @@ -479,6 +503,7 @@ def test_grpform_no_5ghz_add_cli4(dev): dev[0].request("SET p2p_add_cli_chan 0") dev[1].request("SET p2p_add_cli_chan 0") +@remote_compatible def test_grpform_incorrect_pin(dev): """P2P GO Negotiation with incorrect PIN""" dev[1].p2p_listen() @@ -513,6 +538,7 @@ def test_grpform_incorrect_pin(dev): if ev is None: raise Exception("Group formation failure timed out") +@remote_compatible def test_grpform_reject(dev): """User rejecting group formation attempt by a P2P peer""" addr0 = dev[0].p2p_dev_addr() @@ -533,6 +559,7 @@ def test_grpform_reject(dev): if "status=11" not in ev: raise Exception("Unexpected status code in rejection") +@remote_compatible def test_grpform_pd_no_probe_resp(dev): """GO Negotiation after PD, but no Probe Response""" addr0 = dev[0].p2p_dev_addr() @@ -618,6 +645,7 @@ def clear_pbc_overlap(dev, ap): dev[1].flush_scan_cache() time.sleep(0.1) +@remote_compatible def test_grpform_pbc_overlap(dev, apdev): """P2P group formation during PBC overlap""" params = { "ssid": "wps", "eap_server": "1", "wps_state": "1" } @@ -655,6 +683,7 @@ def test_grpform_pbc_overlap(dev, apdev): clear_pbc_overlap(dev, apdev[0]) +@remote_compatible def test_grpform_pbc_overlap_group_iface(dev, apdev): """P2P group formation during PBC overlap using group interfaces""" # Note: Need to include P2P IE from the AP to get the P2P interface BSS @@ -693,6 +722,7 @@ def test_grpform_pbc_overlap_group_iface(dev, apdev): clear_pbc_overlap(dev, apdev[0]) +@remote_compatible def test_grpform_goneg_fail_with_group_iface(dev): """P2P group formation fails while using group interface""" dev[0].request("SET p2p_no_group_iface 0") @@ -818,6 +848,7 @@ def test_grpform_no_wsc_done(dev): if mode != "P2P GO - group formation": raise Exception("Unexpected mode on GO during group formation: " + mode) +@remote_compatible def test_grpform_wait_peer(dev): """P2P group formation wait for peer to become ready""" addr0 = dev[0].p2p_dev_addr() @@ -842,6 +873,7 @@ def test_grpform_wait_peer(dev): raise Exception("Group formation timed out") dev[0].remove_group() +@remote_compatible def test_invalid_p2p_connect_command(dev): """P2P_CONNECT error cases""" id = dev[0].add_network() @@ -864,6 +896,7 @@ def test_invalid_p2p_connect_command(dev): if "FAIL-CHANNEL-UNSUPPORTED" not in dev[0].request("P2P_CONNECT 00:11:22:33:44:55 pin freq=3000"): raise Exception("Unsupported channel not reported") +@remote_compatible def test_p2p_unauthorize(dev): """P2P_UNAUTHORIZE to unauthorize a peer""" if "FAIL" not in dev[0].request("P2P_UNAUTHORIZE foo"): @@ -884,6 +917,7 @@ def test_p2p_unauthorize(dev): if ev is None: raise Exception("No GO Negotiation Request RX reported") +@remote_compatible def test_grpform_pbc_multiple(dev): """P2P group formation using PBC multiple times in a row""" try: @@ -936,6 +970,7 @@ def test_grpform_not_ready2(dev): for i in range(3): dev[i].p2p_stop_find() +@remote_compatible def test_grpform_and_scan(dev): """GO Negotiation and scan operations""" addr0 = dev[0].p2p_dev_addr() @@ -1108,6 +1143,7 @@ def test_grpform_go_neg_dup_on_restart(dev): lower.dump_monitor() higher.dump_monitor() +@remote_compatible def test_grpform_go_neg_stopped(dev): """GO Negotiation stopped after TX start""" addr0 = dev[0].p2p_dev_addr() diff --git a/tests/hwsim/test_p2p_invitation.py b/tests/hwsim/test_p2p_invitation.py index ffe8437..e3e9c02 100644 --- a/tests/hwsim/test_p2p_invitation.py +++ b/tests/hwsim/test_p2p_invitation.py @@ -4,11 +4,13 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import hwsim_utils +@remote_compatible def test_p2p_go_invite(dev): """P2P GO inviting a client to join""" addr0 = dev[0].p2p_dev_addr() @@ -53,6 +55,7 @@ def test_p2p_go_invite(dev): dev[0].remove_group() dev[1].wait_go_ending_session() +@remote_compatible def test_p2p_go_invite_auth(dev): """P2P GO inviting a client to join (authorized invitation)""" addr0 = dev[0].p2p_dev_addr() @@ -104,6 +107,7 @@ def test_p2p_go_invite_auth(dev): dev[0].remove_group() dev[1].wait_go_ending_session() +@remote_compatible def test_p2p_go_invite_unknown(dev): """P2P GO inviting a client that has not discovered the GO""" try: @@ -176,6 +180,7 @@ def test_p2p_cli_invite(dev): dev[1].wait_go_ending_session() dev[2].wait_go_ending_session() +@remote_compatible def test_p2p_invite_invalid(dev): """Invalid parameters to P2P_INVITE""" id = dev[0].add_network() diff --git a/tests/hwsim/test_p2p_messages.py b/tests/hwsim/test_p2p_messages.py index 1c42654..67e9c1c 100644 --- a/tests/hwsim/test_p2p_messages.py +++ b/tests/hwsim/test_p2p_messages.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import struct import time @@ -219,12 +220,14 @@ def parse_p2p_public_action(payload): return p2p +@remote_compatible def test_p2p_msg_empty(dev, apdev): """P2P protocol test: empty P2P Public Action frame""" dst, src, hapd, channel = start_p2p(dev, apdev) msg = p2p_hdr(dst, src) hapd.mgmt_tx(msg) +@remote_compatible def test_p2p_msg_long_ssid(dev, apdev): """P2P protocol test: Too long SSID in P2P Public Action frame""" dst, src, hapd, channel = start_p2p(dev, apdev) @@ -244,6 +247,7 @@ def test_p2p_msg_long_ssid(dev, apdev): if ev is None: raise Exception("Timeout on device found event") +@remote_compatible def test_p2p_msg_long_dev_name(dev, apdev): """P2P protocol test: Too long Device Name in P2P Public Action frame""" dst, src, hapd, channel = start_p2p(dev, apdev) @@ -835,6 +839,7 @@ def test_p2p_msg_invitation_req_to_go(dev, apdev): if p2p['p2p_status'] != 7 and dev[1].get_mcc() <= 1: raise Exception("Unexpected status %d" % p2p['p2p_status']) +@remote_compatible def test_p2p_msg_invitation_req_unknown(dev, apdev): """P2P protocol tests for invitation request from unknown peer""" dst, src, hapd, channel = start_p2p(dev, apdev) @@ -857,6 +862,7 @@ def test_p2p_msg_invitation_req_unknown(dev, apdev): if hapd.mgmt_rx(timeout=1) is None: raise Exception("No invitation response " + str(dialog_token)) +@remote_compatible def test_p2p_msg_invitation_no_common_channels(dev, apdev): """P2P protocol tests for invitation request without common channels""" dst, src, hapd, channel = start_p2p(dev, apdev) @@ -1119,6 +1125,7 @@ def test_p2p_msg_invitation_resend_duplicate(dev, apdev): dev[0].group_form_result(ev) dev[0].remove_group() +@remote_compatible def test_p2p_msg_pd_req(dev, apdev): """P2P protocol tests for provision discovery request processing""" dst, src, hapd, channel = start_p2p(dev, apdev) @@ -1940,6 +1947,7 @@ def gas_hdr(dst, src, type, req=True, dialog_token=0): dialog_token) return msg +@remote_compatible def test_p2p_msg_sd(dev, apdev): """P2P protocol tests for service discovery messages""" dst, src, hapd, channel = start_p2p(dev, apdev) diff --git a/tests/hwsim/test_p2p_persistent.py b/tests/hwsim/test_p2p_persistent.py index 7688c21..980b84f 100644 --- a/tests/hwsim/test_p2p_persistent.py +++ b/tests/hwsim/test_p2p_persistent.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import re @@ -12,6 +13,7 @@ import time import hwsim_utils from p2p_utils import * +@remote_compatible def test_persistent_group(dev): """P2P persistent group formation and re-invocation""" form(dev[0], dev[1]) @@ -56,12 +58,14 @@ def test_persistent_group(dev): if dev[1].p2p_dev_addr() in clients: raise Exception("Peer was still in client list") +@remote_compatible def test_persistent_group2(dev): """P2P persistent group formation with reverse roles""" form(dev[0], dev[1], reverse_init=True) invite_from_cli(dev[0], dev[1]) invite_from_go(dev[0], dev[1]) +@remote_compatible def test_persistent_group3(dev): """P2P persistent group formation and re-invocation with empty BSS table""" form(dev[0], dev[1]) @@ -259,6 +263,7 @@ def test_persistent_group_invite_removed_client(dev): terminate_group(dev[0], dev[1]) +@remote_compatible def test_persistent_group_channel(dev): """P2P persistent group re-invocation with channel selection""" form(dev[0], dev[1], test_data=False) @@ -284,6 +289,7 @@ def test_persistent_group_channel(dev): raise Exception("Persistent group client channel preference not followed") terminate_group(dev[0], dev[1]) +@remote_compatible def test_persistent_group_and_role_change(dev): """P2P persistent group, auto GO in another role, and re-invocation""" form(dev[0], dev[1]) @@ -352,6 +358,7 @@ def test_persistent_go_client_list(dev): if 'persistent' not in peer or peer['persistent'] != id: raise Exception("Persistent group client not recognized(2)") +@remote_compatible def test_persistent_group_in_grpform(dev): """P2P persistent group parameters re-used in group formation""" addr0 = dev[0].p2p_dev_addr() @@ -373,6 +380,7 @@ def test_persistent_group_in_grpform(dev): logger.debug("i_res: " + str(i_res)) logger.debug("r_res: " + str(r_res)) +@remote_compatible def test_persistent_group_without_persistent_reconnect(dev): """P2P persistent group re-invocation without persistent reconnect""" form(dev[0], dev[1]) @@ -447,6 +455,7 @@ def test_persistent_group_without_persistent_reconnect(dev): [go_res, cli_res] = check_result(dev[0], dev[1]) terminate_group(dev[0], dev[1]) +@remote_compatible def test_persistent_group_already_running(dev): """P2P persistent group formation and invitation while GO already running""" form(dev[0], dev[1]) @@ -463,6 +472,7 @@ def test_persistent_group_already_running(dev): raise Exception("Could not state GO") invite_from_cli(dev[0], dev[1]) +@remote_compatible def test_persistent_group_add_cli_chan(dev): """P2P persistent group formation and re-invocation with p2p_add_cli_chan=1""" try: @@ -480,6 +490,7 @@ def test_persistent_group_add_cli_chan(dev): dev[0].request("SET p2p_add_cli_chan 0") dev[1].request("SET p2p_add_cli_chan 0") +@remote_compatible def test_persistent_invalid_group_add(dev): """Invalid P2P_GROUP_ADD command""" id = dev[0].add_network() @@ -538,6 +549,7 @@ def test_persistent_group_missed_inv_resp(dev): terminate_group(dev[0], dev[1]) +@remote_compatible def test_persistent_group_profile_add(dev): """Create a P2P persistent group with ADD_NETWORK""" passphrase="passphrase here" @@ -558,6 +570,7 @@ def test_persistent_group_profile_add(dev): dev[0].remove_group() dev[1].wait_go_ending_session() +@remote_compatible def test_persistent_group_cancel_on_cli(dev): """P2P persistent group formation, re-invocation, and cancel""" dev[0].global_request("SET p2p_no_group_iface 0") @@ -578,6 +591,7 @@ def test_persistent_group_cancel_on_cli(dev): raise Exception("P2P_CANCEL succeeded unexpectedly on GO") terminate_group(dev[0], dev[1]) +@remote_compatible def test_persistent_group_cancel_on_cli2(dev): """P2P persistent group formation, re-invocation, and cancel (2)""" form(dev[0], dev[1]) @@ -595,6 +609,7 @@ def test_persistent_group_cancel_on_cli2(dev): raise Exception("P2P_CANCEL succeeded unexpectedly on GO") terminate_group(dev[0], dev[1]) +@remote_compatible def test_persistent_group_peer_dropped(dev): """P2P persistent group formation and re-invocation with peer having dropped group""" form(dev[0], dev[1], reverse_init=True) @@ -615,6 +630,7 @@ def test_persistent_group_peer_dropped(dev): logger.info("Verify that a new group can be formed") form(dev[0], dev[1], reverse_init=True) +@remote_compatible def test_persistent_group_peer_dropped2(dev): """P2P persistent group formation and re-invocation with peer having dropped group (2)""" form(dev[0], dev[1]) diff --git a/tests/hwsim/test_p2p_service.py b/tests/hwsim/test_p2p_service.py index ea7a8f4..4f5af5c 100644 --- a/tests/hwsim/test_p2p_service.py +++ b/tests/hwsim/test_p2p_service.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -87,6 +88,7 @@ def run_sd(dev, dst, query, exp_query=None, fragment=False, query2=None): return ev +@remote_compatible def test_p2p_service_discovery(dev): """P2P service discovery""" addr0 = dev[0].p2p_dev_addr() @@ -132,6 +134,7 @@ def test_p2p_service_discovery4(dev): if "496e7465726e6574" not in ev: raise Exception("Unexpected service discovery response contents (UPnP)") +@remote_compatible def test_p2p_service_discovery_multiple_queries(dev): """P2P service discovery with multiple queries""" for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]: @@ -161,6 +164,7 @@ def test_p2p_service_discovery_fragmentation(dev): if "496e7465726e6574" not in ev: raise Exception("Unexpected service discovery response contents (UPnP)") +@remote_compatible def test_p2p_service_discovery_bonjour(dev): """P2P service discovery (Bonjour)""" ev = run_sd(dev, "00:00:00:00:00:00", "02000101") @@ -171,6 +175,7 @@ def test_p2p_service_discovery_bonjour(dev): if "496e7465726e6574" in ev: raise Exception("Unexpected service discovery response contents (UPnP not expected)") +@remote_compatible def test_p2p_service_discovery_bonjour2(dev): """P2P service discovery (Bonjour AFS)""" ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c01") @@ -181,6 +186,7 @@ def test_p2p_service_discovery_bonjour2(dev): if "496e7465726e6574" in ev: raise Exception("Unexpected service discovery response contents (UPnP not expected)") +@remote_compatible def test_p2p_service_discovery_bonjour3(dev): """P2P service discovery (Bonjour AFS - no match)""" ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c02") @@ -193,6 +199,7 @@ def test_p2p_service_discovery_bonjour3(dev): if "496e7465726e6574" in ev: raise Exception("Unexpected service discovery response contents (UPnP not expected)") +@remote_compatible def test_p2p_service_discovery_upnp(dev): """P2P service discovery (UPnP)""" ev = run_sd(dev, "00:00:00:00:00:00", "02000201") @@ -201,6 +208,7 @@ def test_p2p_service_discovery_upnp(dev): if "496e7465726e6574" not in ev: raise Exception("Unexpected service discovery response contents (UPnP)") +@remote_compatible def test_p2p_service_discovery_upnp2(dev): """P2P service discovery (UPnP using request helper)""" ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:all", "0b00020110737364703a616c6c") @@ -209,6 +217,7 @@ def test_p2p_service_discovery_upnp2(dev): if "496e7465726e6574" not in ev: raise Exception("Unexpected service discovery response contents (UPnP)") +@remote_compatible def test_p2p_service_discovery_upnp3(dev): """P2P service discovery (UPnP using request helper - no match)""" ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:foo", "0b00020110737364703a666f6f") @@ -219,6 +228,7 @@ def test_p2p_service_discovery_upnp3(dev): if "496e7465726e6574" in ev: raise Exception("Unexpected service discovery response contents (UPnP)") +@remote_compatible def test_p2p_service_discovery_ws(dev): """P2P service discovery (WS-Discovery)""" ev = run_sd(dev, "00:00:00:00:00:00", "02000301") @@ -229,6 +239,7 @@ def test_p2p_service_discovery_ws(dev): if "0300030101" not in ev: raise Exception("Unexpected service discovery response contents (WS)") +@remote_compatible def test_p2p_service_discovery_wfd(dev): """P2P service discovery (Wi-Fi Display)""" dev[0].global_request("SET wifi_display 1") @@ -240,6 +251,7 @@ def test_p2p_service_discovery_wfd(dev): if "0300040101" not in ev: raise Exception("Unexpected response to WFD SD query (protocol was disabled)") +@remote_compatible def test_p2p_service_discovery_req_cancel(dev): """Cancel a P2P service discovery request""" if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ ab"): @@ -263,6 +275,7 @@ def test_p2p_service_discovery_req_cancel(dev): if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query): raise Exception("Unexpected SD(broadcast) cancel failure") +@remote_compatible def test_p2p_service_discovery_go(dev): """P2P service discovery from GO""" addr0 = dev[0].p2p_dev_addr() @@ -387,6 +400,7 @@ def _test_p2p_service_discovery_external(dev): if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_RESP " + cmd): raise Exception("Invalid P2P_SERV_DISC_RESP accepted: " + cmd) +@remote_compatible def test_p2p_service_discovery_external(dev): """P2P service discovery using external response""" try: @@ -394,6 +408,7 @@ def test_p2p_service_discovery_external(dev): finally: dev[0].global_request("P2P_SERV_DISC_EXTERNAL 0") +@remote_compatible def test_p2p_service_discovery_invalid_commands(dev): """P2P service discovery invalid commands""" for cmd in [ "bonjour", @@ -454,6 +469,7 @@ def get_p2p_state(dev): raise Exception("Could not get p2p_state") return p2p_state +@remote_compatible def test_p2p_service_discovery_peer_not_listening(dev): """P2P service discovery and peer not listening""" addr0 = dev[0].p2p_dev_addr() @@ -483,6 +499,7 @@ def test_p2p_service_discovery_peer_not_listening(dev): if p2p_state != "IDLE": raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state) +@remote_compatible def test_p2p_service_discovery_peer_not_listening2(dev): """P2P service discovery and peer not listening""" addr0 = dev[0].p2p_dev_addr() diff --git a/tests/hwsim/test_p2p_set.py b/tests/hwsim/test_p2p_set.py index ba1e7ce..a96b572 100644 --- a/tests/hwsim/test_p2p_set.py +++ b/tests/hwsim/test_p2p_set.py @@ -4,6 +4,8 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible + def test_p2p_set(dev): """P2P_SET commands""" for cmd in [ "", @@ -102,6 +104,7 @@ def test_p2p_set_managed(dev): dev[2].p2p_stop_find() dev[0].p2p_stop_find() +@remote_compatible def test_p2p_set_ssid_postfix(dev): """P2P_SET ssid_postfix""" addr0 = dev[0].p2p_dev_addr() diff --git a/tests/hwsim/test_p2p_wifi_display.py b/tests/hwsim/test_p2p_wifi_display.py index 4eb4801..94c7da9 100644 --- a/tests/hwsim/test_p2p_wifi_display.py +++ b/tests/hwsim/test_p2p_wifi_display.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -298,6 +299,7 @@ def test_wifi_display_persistent_group(dev): dev[1].request("SET wifi_display 0") dev[2].request("SET wifi_display 0") +@remote_compatible def test_wifi_display_invalid_subelem(dev): """Wi-Fi Display and invalid subelement parsing""" addr1 = dev[1].p2p_dev_addr() diff --git a/tests/hwsim/test_p2ps.py b/tests/hwsim/test_p2ps.py index e71b6a5..d740d9c 100644 --- a/tests/hwsim/test_p2ps.py +++ b/tests/hwsim/test_p2ps.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -399,6 +400,7 @@ def set_no_group_iface(dev, enable): else: dev.global_request("SET p2p_no_group_iface 0") +@remote_compatible def test_p2ps_exact_search(dev): """P2PS exact service request""" p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx', @@ -410,6 +412,7 @@ def test_p2ps_exact_search(dev): if ev0 is None: raise Exception("Unable to remove the advertisement instance") +@remote_compatible def test_p2ps_exact_search_srvinfo(dev): """P2PS exact service request with service info""" p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx', @@ -422,6 +425,7 @@ def test_p2ps_exact_search_srvinfo(dev): if ev0 is None: raise Exception("Unable to remove the advertisement instance") +@remote_compatible def test_p2ps_nonexact_search(dev): """P2PS nonexact seek request""" p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx', @@ -434,6 +438,7 @@ def test_p2ps_nonexact_search(dev): if ev0 is None: raise Exception("Unable to remove the advertisement instance") +@remote_compatible def test_p2ps_nonexact_search_srvinfo(dev): """P2PS nonexact seek request with service info""" p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx', @@ -446,6 +451,7 @@ def test_p2ps_nonexact_search_srvinfo(dev): if ev0 is None: raise Exception("Unable to remove the advertisement instance") +@remote_compatible def test_p2ps_connect_p2ps_method_nonautoaccept(dev): """P2PS connect for non-auto-accept and P2PS config method""" p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx', @@ -462,6 +468,7 @@ def test_p2ps_connect_p2ps_method_nonautoaccept(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_p2ps_method_autoaccept(dev): """P2PS connection with P2PS default config method and auto-accept""" p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx', @@ -478,6 +485,7 @@ def test_p2ps_connect_p2ps_method_autoaccept(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_keypad_method_nonautoaccept(dev): """P2PS Connection with non-auto-accept and seeker having keypad method""" p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx', @@ -495,6 +503,7 @@ def test_p2ps_connect_keypad_method_nonautoaccept(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_display_method_nonautoaccept(dev): """P2PS connection with non-auto-accept and seeker having display method""" p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx', @@ -511,6 +520,7 @@ def test_p2ps_connect_display_method_nonautoaccept(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_keypad_method_autoaccept(dev): """P2PS connection with auto-accept and keypad method on seeker side""" p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx', @@ -527,6 +537,7 @@ def test_p2ps_connect_keypad_method_autoaccept(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_display_method_autoaccept(dev): """P2PS connection with auto-accept and display method on seeker side""" p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx', @@ -543,6 +554,7 @@ def test_p2ps_connect_display_method_autoaccept(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_adv_go_p2ps_method(dev): """P2PS auto-accept connection with advertisement as GO and P2PS method""" p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx', @@ -559,6 +571,7 @@ def test_p2ps_connect_adv_go_p2ps_method(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev): """P2PS auto-accept connection with advertisement as GO and P2PS method using separate group interface""" set_no_group_iface(dev[0], 0) @@ -577,6 +590,7 @@ def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_adv_client_p2ps_method(dev): """P2PS auto-accept connection with advertisement as Client and P2PS method""" p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx', @@ -608,10 +622,12 @@ def p2ps_connect_adv_go_pin_method(dev, keep_group=False): raise Exception("Unable to remove the advertisement instance") remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_connect_adv_go_pin_method(dev): """P2PS advertiser as GO with keypad config method on seeker side and auto-accept""" p2ps_connect_adv_go_pin_method(dev) +@remote_compatible def test_p2ps_connect_adv_client_pin_method(dev): """P2PS advertiser as client with keypad config method on seeker side and auto-accept""" dev[0].flush_scan_cache() @@ -845,6 +861,7 @@ def test_p2ps_connect_adv_go_persistent(dev): p2ps_connect_pd(dev[0], dev[1], ev0, ev1) remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_adv_go_persistent_no_peer_entry(dev): """P2PS advertisement as GO having persistent group (no peer entry)""" go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15, @@ -863,6 +880,7 @@ def test_p2ps_adv_go_persistent_no_peer_entry(dev): if "persist=" not in ev0 or "persist=" not in ev1: raise Exception("Persistent group isn't used by peers") +@remote_compatible def test_p2ps_pd_follow_on_status_failure(dev): """P2PS PD follow on request with status 11""" addr0 = dev[0].p2p_dev_addr() @@ -921,6 +939,7 @@ def test_p2ps_go_probe(dev): dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id)) remove_group(dev[0], dev[1]) +@remote_compatible def test_p2ps_wildcard_p2ps(dev): """P2PS wildcard SD Probe Request/Response""" p2ps_wildcard = "org.wi-fi.wfds" @@ -1049,34 +1068,40 @@ def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role, if ev is None: raise Exception("Unable to remove the advertisement instance") +@remote_compatible def test_p2ps_feature_capability_mac_autoaccept(dev): """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept""" p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC", adv_role="4", result="MAC") +@remote_compatible def test_p2ps_feature_capability_mac_nonautoaccept(dev): """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept""" p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC", adv_role="0", result="MAC") +@remote_compatible def test_p2ps_feature_capability_mac_udp_autoaccept(dev): """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept""" p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP", seeker_cpt="UDP:MAC", adv_role="2", result="MAC") +@remote_compatible def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev): """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept""" p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP", seeker_cpt="UDP:MAC", adv_role="0", result="UDP") +@remote_compatible def test_p2ps_feature_capability_udp_mac_autoaccept(dev): """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept""" p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC", seeker_cpt="MAC:UDP", adv_role="2", result="UDP") +@remote_compatible def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev): """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, nonautoaccept""" p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC", @@ -1205,6 +1230,7 @@ def test_p2ps_channel_both_connected_different_mcc(dev, apdev): def clear_disallow_handler(seeker, advertiser): advertiser.global_request("P2P_SET disallow_freq ") +@remote_compatible def test_p2ps_channel_disallow_freq(dev, apdev): """P2PS connection with P2PS method - disallow freqs""" set_no_group_iface(dev[0], 0) @@ -1299,6 +1325,7 @@ def test_p2ps_channel_sta_connected_disallow_freq_mcc(dev, apdev): dev[0].global_request("P2P_SET disallow_freq ") dev[0].global_request("P2P_SERVICE_DEL asp all") +@remote_compatible def test_p2ps_active_go_adv(dev, apdev): """P2PS connection with P2PS method - active GO on advertiser""" set_no_group_iface(dev[0], 0) @@ -1330,6 +1357,7 @@ def test_p2ps_active_go_adv(dev, apdev): remove_group(dev[0], dev[1]) dev[0].global_request("P2P_SERVICE_DEL asp all") +@remote_compatible def test_p2ps_active_go_seeker(dev, apdev): """P2PS connection with P2PS method - active GO on seeker""" set_no_group_iface(dev[0], 0) @@ -1437,6 +1465,7 @@ def test_p2ps_channel_active_go_and_station_different(dev, apdev): dev[0].global_request("P2P_SERVICE_DEL asp all") set_random_listen_chan(dev[1]) +@remote_compatible def test_p2ps_channel_active_go_and_station_different_mcc(dev, apdev): """P2PS connection, active P2P GO and station on channel""" if dev[0].get_mcc() == 1: @@ -1532,6 +1561,7 @@ def run_p2ps_connect_p2p_device2(dev, no_group_iface): raise Exception("Unable to remove the advertisement instance") remove_group(wpas, dev[0]) +@remote_compatible def test_p2ps_connect_p2ps_method_no_pin(dev): """P2P group formation using P2PS method without specifying PIN""" dev[0].p2p_listen() diff --git a/tests/hwsim/test_peerkey.py b/tests/hwsim/test_peerkey.py index 30d9b60..6f9b716 100644 --- a/tests/hwsim/test_peerkey.py +++ b/tests/hwsim/test_peerkey.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import time @@ -13,6 +14,7 @@ import hostapd from utils import skip_with_fips from wlantest import Wlantest +@remote_compatible def test_peerkey(dev, apdev): """RSN AP and PeerKey between two STAs""" ssid = "test-peerkey" @@ -47,6 +49,7 @@ def test_peerkey_unknown_peer(dev, apdev): dev[0].request("STKSTART " + dev[2].p2p_interface_addr()) time.sleep(0.5) +@remote_compatible def test_peerkey_pairwise_mismatch(dev, apdev): """RSN TKIP+CCMP AP and PeerKey between two STAs using different ciphers""" skip_with_fips(dev[0]) diff --git a/tests/hwsim/test_radius.py b/tests/hwsim/test_radius.py index 84e9351..db84899 100644 --- a/tests/hwsim/test_radius.py +++ b/tests/hwsim/test_radius.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import hashlib import hmac @@ -27,6 +28,7 @@ def connect(dev, ssid, wait_connect=True): password_hex="0123456789abcdef0123456789abcdef", wait_connect=wait_connect) +@remote_compatible def test_radius_auth_unreachable(dev, apdev): """RADIUS Authentication server unreachable""" params = hostapd.wpa2_eap_params(ssid="radius-auth") @@ -1138,6 +1140,7 @@ def test_radius_auth_force_client_addr(dev, apdev): hapd = hostapd.add_ap(apdev[0], params) connect(dev[0], "radius-auth") +@remote_compatible def test_radius_auth_force_invalid_client_addr(dev, apdev): """RADIUS client address specified and invalid address""" params = hostapd.wpa2_eap_params(ssid="radius-auth") diff --git a/tests/hwsim/test_sae.py b/tests/hwsim/test_sae.py index 0dbdd5d..6a20c69 100644 --- a/tests/hwsim/test_sae.py +++ b/tests/hwsim/test_sae.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import os import time @@ -15,6 +16,7 @@ import hostapd from utils import HwsimSkip, alloc_fail, fail_test, wait_fail_trigger from test_ap_psk import find_wpas_process, read_process_memory, verify_not_present, get_key_locations +@remote_compatible def test_sae(dev, apdev): """SAE with default group""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -38,6 +40,7 @@ def test_sae(dev, apdev): if "[WPA2-SAE-CCMP]" not in bss['flags']: raise Exception("Unexpected BSS flags: " + bss['flags']) +@remote_compatible def test_sae_password_ecc(dev, apdev): """SAE with number of different passwords (ECC)""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -57,6 +60,7 @@ def test_sae_password_ecc(dev, apdev): dev[0].request("REMOVE_NETWORK all") dev[0].wait_disconnected() +@remote_compatible def test_sae_password_ffc(dev, apdev): """SAE with number of different passwords (FFC)""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -77,6 +81,7 @@ def test_sae_password_ffc(dev, apdev): dev[0].request("REMOVE_NETWORK all") dev[0].wait_disconnected() +@remote_compatible def test_sae_pmksa_caching(dev, apdev): """SAE and PMKSA caching""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -99,6 +104,7 @@ def test_sae_pmksa_caching(dev, apdev): if dev[0].get_status_field('sae_group') is not None: raise Exception("SAE group claimed to have been used") +@remote_compatible def test_sae_pmksa_caching_disabled(dev, apdev): """SAE and PMKSA caching disabled""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -172,6 +178,7 @@ def test_sae_groups(dev, apdev): dev[0].wait_disconnected() dev[0].dump_monitor() +@remote_compatible def test_sae_group_nego(dev, apdev): """SAE group negotiation""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -188,6 +195,7 @@ def test_sae_group_nego(dev, apdev): if dev[0].get_status_field('sae_group') != '19': raise Exception("Expected SAE group not used") +@remote_compatible def test_sae_anti_clogging(dev, apdev): """SAE anti clogging""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -238,6 +246,7 @@ def test_sae_mixed(dev, apdev): dev[i].connect("test-sae", psk="12345678", key_mgmt="SAE", scan_freq="2412") +@remote_compatible def test_sae_missing_password(dev, apdev): """SAE and missing password""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -380,6 +389,7 @@ def test_sae_key_lifetime_in_memory(dev, apdev, params): verify_not_present(buf, sae_keyseed, fname, "SAE(keyseed)") verify_not_present(buf, sae_kck, fname, "SAE(KCK)") +@remote_compatible def test_sae_oom_wpas(dev, apdev): """SAE and OOM in wpa_supplicant""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -404,6 +414,7 @@ def test_sae_oom_wpas(dev, apdev): scan_freq="2412") dev[0].request("REMOVE_NETWORK all") +@remote_compatible def test_sae_proto_ecc(dev, apdev): """SAE protocol testing (ECC)""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -502,6 +513,7 @@ def test_sae_proto_ecc(dev, apdev): hapd.set("ext_mgmt_frame_handling", "0") hapd.dump_monitor() +@remote_compatible def test_sae_proto_ffc(dev, apdev): """SAE protocol testing (FFC)""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -582,6 +594,7 @@ def test_sae_proto_ffc(dev, apdev): hapd.set("ext_mgmt_frame_handling", "0") hapd.dump_monitor() +@remote_compatible def test_sae_no_ffc_by_default(dev, apdev): """SAE and default groups rejecting FFC""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -642,14 +655,17 @@ def sae_reflection_attack(apdev, dev, group): if req['subtype'] == 11: raise Exception("Unexpected Authentication frame seen") +@remote_compatible def test_sae_reflection_attack_ecc(dev, apdev): """SAE reflection attack (ECC)""" sae_reflection_attack(apdev[0], dev[0], 19) +@remote_compatible def test_sae_reflection_attack_ffc(dev, apdev): """SAE reflection attack (FFC)""" sae_reflection_attack(apdev[0], dev[0], 5) +@remote_compatible def test_sae_anti_clogging_proto(dev, apdev): """SAE anti clogging protocol testing""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -692,6 +708,7 @@ def test_sae_anti_clogging_proto(dev, apdev): if req['subtype'] == 11: raise Exception("Unexpected Authentication frame seen") +@remote_compatible def test_sae_no_random(dev, apdev): """SAE and no random numbers available""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -712,6 +729,7 @@ def test_sae_no_random(dev, apdev): dev[0].request("REMOVE_NETWORK all") dev[0].wait_disconnected() +@remote_compatible def test_sae_pwe_failure(dev, apdev): """SAE and pwe failure""" if "SAE" not in dev[0].get_capability("auth_alg"): @@ -752,6 +770,7 @@ def test_sae_pwe_failure(dev, apdev): dev[0].request("REMOVE_NETWORK all") dev[0].wait_disconnected() +@remote_compatible def test_sae_bignum_failure(dev, apdev): """SAE and bignum failure""" if "SAE" not in dev[0].get_capability("auth_alg"): diff --git a/tests/hwsim/test_scan.py b/tests/hwsim/test_scan.py index 87e24cf..44b2cea 100644 --- a/tests/hwsim/test_scan.py +++ b/tests/hwsim/test_scan.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -62,6 +63,7 @@ def check_scan_retry(dev, params, bssid): return raise Exception("Unexpectedly old BSS entry") +@remote_compatible def test_scan(dev, apdev): """Control interface behavior on scan parameters""" hostapd.add_ap(apdev[0], { "ssid": "test-scan" }) @@ -86,6 +88,7 @@ def test_scan(dev, apdev): logger.info("Active single-channel scan on AP's operating channel") check_scan_retry(dev[0], "freq=2412 passive=0 use_id=1", bssid) +@remote_compatible def test_scan_tsf(dev, apdev): """Scan and TSF updates from Beacon/Probe Response frames""" hostapd.add_ap(apdev[0], { "ssid": "test-scan", @@ -110,6 +113,7 @@ def test_scan_tsf(dev, apdev): if 0 in tsf: raise Exception("0 TSF reported") +@remote_compatible def test_scan_only(dev, apdev): """Control interface behavior on scan parameters with type=only""" hostapd.add_ap(apdev[0], { "ssid": "test-scan" }) @@ -134,6 +138,7 @@ def test_scan_only(dev, apdev): logger.info("Active single-channel scan on AP's operating channel") check_scan_retry(dev[0], "type=only freq=2412 passive=0 use_id=1", bssid) +@remote_compatible def test_scan_external_trigger(dev, apdev): """Avoid operations during externally triggered scan""" hostapd.add_ap(apdev[0], { "ssid": "test-scan" }) @@ -160,6 +165,7 @@ def test_scan_bss_expiration_count(dev, apdev): if bssid in dev[0].request("SCAN_RESULTS"): raise Exception("BSS found after two scans without match") +@remote_compatible def test_scan_bss_expiration_age(dev, apdev): """BSS entry expiration based on age""" try: @@ -189,6 +195,7 @@ def test_scan_bss_expiration_age(dev, apdev): finally: dev[0].request("BSS_EXPIRE_AGE 180") +@remote_compatible def test_scan_filter(dev, apdev): """Filter scan results based on SSID""" try: @@ -211,6 +218,7 @@ def test_scan_filter(dev, apdev): finally: dev[0].request("SET filter_ssids 0") +@remote_compatible def test_scan_int(dev, apdev): """scan interval configuration""" try: @@ -325,6 +333,7 @@ def test_scan_bss_operations(dev, apdev): if len(res) != 0: raise Exception("Unexpected result after BSS_FLUSH 0") +@remote_compatible def test_scan_and_interface_disabled(dev, apdev): """Scan operation when interface gets disabled""" try: @@ -346,6 +355,7 @@ def test_scan_and_interface_disabled(dev, apdev): finally: dev[0].request("DRIVER_EVENT INTERFACE_ENABLED") +@remote_compatible def test_scan_for_auth(dev, apdev): """cfg80211 workaround with scan-for-auth""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -375,6 +385,7 @@ def test_scan_for_auth(dev, apdev): dev[0].wait_connected(timeout=15) +@remote_compatible def test_scan_for_auth_fail(dev, apdev): """cfg80211 workaround with scan-for-auth failing""" hapd = hostapd.add_ap(apdev[0], { "ssid": "open" }) @@ -411,6 +422,7 @@ def test_scan_for_auth_fail(dev, apdev): raise Exception("Unexpected connection") dev[0].request("DISCONNECT") +@remote_compatible def test_scan_for_auth_wep(dev, apdev): """cfg80211 scan-for-auth workaround with WEP keys""" dev[0].flush_scan_cache() @@ -443,6 +455,7 @@ def test_scan_for_auth_wep(dev, apdev): dev[0].wait_connected(timeout=15) +@remote_compatible def test_scan_hidden(dev, apdev): """Control interface behavior on scan parameters""" hapd = hostapd.add_ap(apdev[0], { "ssid": "test-scan", @@ -572,6 +585,7 @@ def test_scan_and_bss_entry_removed(dev, apdev): dev[0].flush_scan_cache() wpas.flush_scan_cache() +@remote_compatible def test_scan_reqs_with_non_scan_radio_work(dev, apdev): """SCAN commands while non-scan radio_work is in progress""" id = dev[0].request("RADIO_WORK add test-work-a") @@ -678,6 +692,7 @@ def test_scan_setband(dev, apdev): dev[i].request("SET setband AUTO") dev[i].flush_scan_cache() +@remote_compatible def test_scan_hidden_many(dev, apdev): """scan_ssid=1 with large number of profile with hidden SSID""" try: @@ -775,6 +790,7 @@ def _test_scan_random_mac(dev, apdev, params): if not found: raise Exception("Fixed OUI random address not seen") +@remote_compatible def test_scan_trigger_failure(dev, apdev): """Scan trigger to the driver failing""" hostapd.add_ap(apdev[0], { "ssid": "test-scan" }) @@ -818,6 +834,7 @@ def test_scan_trigger_failure(dev, apdev): raise Exception("wpa_state COMPLETED not restored") dev[0].request("SET test_failure 0") +@remote_compatible def test_scan_specify_ssid(dev, apdev): """Control interface behavior on scan SSID parameter""" dev[0].flush_scan_cache() @@ -846,6 +863,7 @@ def test_scan_specify_ssid(dev, apdev): if "FAIL" not in dev[0].request("SCAN ssid foo"): raise Exception("Invalid SCAN command accepted") +@remote_compatible def test_scan_ap_scan_2_ap_mode(dev, apdev): """AP_SCAN 2 AP mode and scan()""" try: @@ -966,6 +984,7 @@ def _test_scan_dfs(dev, apdev, params): if f in [ 2467, 2472 ]: raise Exception("Active scan on US-disallowed channel: %d" % f) +@remote_compatible def test_scan_abort(dev, apdev): """Aborting a full scan""" dev[0].request("SCAN") @@ -978,6 +997,7 @@ def test_scan_abort(dev, apdev): if ev is None: raise Exception("Scan did not terminate") +@remote_compatible def test_scan_abort_on_connect(dev, apdev): """Aborting a full scan on connection request""" hostapd.add_ap(apdev[0], { "ssid": "test-scan" }) @@ -991,6 +1011,7 @@ def test_scan_abort_on_connect(dev, apdev): raise Exception("Scan did not start") dev[0].connect("test-scan", key_mgmt="NONE") +@remote_compatible def test_scan_ext(dev, apdev): """Custom IE in Probe Request frame""" hostapd.add_ap(apdev[0], { "ssid": "test-scan" }) @@ -1089,6 +1110,7 @@ def test_scan_fail(dev, apdev): wpas.request("SET preassoc_mac_addr 0") wpas.dump_monitor() +@remote_compatible def test_scan_freq_list(dev, apdev): """Scan with SET freq_list and scan_cur_freq""" try: diff --git a/tests/hwsim/test_ssid.py b/tests/hwsim/test_ssid.py index a52e47d..738c782 100644 --- a/tests/hwsim/test_ssid.py +++ b/tests/hwsim/test_ssid.py @@ -5,11 +5,13 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import hostapd +@remote_compatible def test_ssid_hex_encoded(dev, apdev): """SSID configuration using hex encoded version""" hostapd.add_ap(apdev[0], { "ssid2": '68656c6c6f' }) @@ -29,11 +31,13 @@ def test_ssid_printf_encoded(dev, apdev): raise Exception("Unexpected difference in SSID") dev[2].connect(ssid2='P"' + ssid + '"', key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ssid_1_octet(dev, apdev): """SSID with one octet""" hostapd.add_ap(apdev[0], { "ssid": '1' }) dev[0].connect("1", key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ssid_32_octets(dev, apdev): """SSID with 32 octets""" hostapd.add_ap(apdev[0], @@ -41,6 +45,7 @@ def test_ssid_32_octets(dev, apdev): dev[0].connect("1234567890abcdef1234567890ABCDEF", key_mgmt="NONE", scan_freq="2412") +@remote_compatible def test_ssid_utf8(dev, apdev): """SSID with UTF8 encoding""" hapd = hostapd.add_ap(apdev[0], { "ssid": 'testi-åäöÅÄÖ-testi', @@ -69,6 +74,7 @@ def clear_scan_cache(hapd, dev): dev[0].flush_scan_cache() dev[1].flush_scan_cache() +@remote_compatible def test_ssid_hidden(dev, apdev): """Hidden SSID""" hapd = hostapd.add_ap(apdev[0], { "ssid": 'secret', @@ -81,6 +87,7 @@ def test_ssid_hidden(dev, apdev): raise Exception("Unexpected connection") clear_scan_cache(hapd, dev) +@remote_compatible def test_ssid_hidden2(dev, apdev): """Hidden SSID using zero octets as payload""" hapd = hostapd.add_ap(apdev[0], { "ssid": 'secret2', @@ -93,6 +100,7 @@ def test_ssid_hidden2(dev, apdev): raise Exception("Unexpected connection") clear_scan_cache(hapd, dev) +@remote_compatible def test_ssid_hidden_wpa2(dev, apdev): """Hidden SSID with WPA2-PSK""" params = hostapd.wpa2_params(ssid="secret", passphrase="12345678") diff --git a/tests/hwsim/test_wep.py b/tests/hwsim/test_wep.py index c7e25ae..52abcc1 100644 --- a/tests/hwsim/test_wep.py +++ b/tests/hwsim/test_wep.py @@ -4,9 +4,11 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import hostapd import hwsim_utils +@remote_compatible def test_wep_open_auth(dev, apdev): """WEP Open System authentication""" hapd = hostapd.add_ap(apdev[0], @@ -25,6 +27,7 @@ def test_wep_open_auth(dev, apdev): if "[WEP]" not in bss['flags']: raise Exception("Unexpected BSS flags: " + bss['flags']) +@remote_compatible def test_wep_shared_key_auth(dev, apdev): """WEP Shared Key authentication""" hapd = hostapd.add_ap(apdev[0], @@ -39,6 +42,7 @@ def test_wep_shared_key_auth(dev, apdev): wep_key0='"hello12345678"', scan_freq="2412") +@remote_compatible def test_wep_shared_key_auth_not_allowed(dev, apdev): """WEP Shared Key authentication not allowed""" hostapd.add_ap(apdev[0], diff --git a/tests/hwsim/test_wnm.py b/tests/hwsim/test_wnm.py index 3788ed2..a42fa8c 100644 --- a/tests/hwsim/test_wnm.py +++ b/tests/hwsim/test_wnm.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import binascii import struct import time @@ -16,6 +17,7 @@ from wpasupplicant import WpaSupplicant from utils import alloc_fail, wait_fail_trigger from wlantest import Wlantest +@remote_compatible def test_wnm_bss_transition_mgmt(dev, apdev): """WNM BSS Transition Management""" params = { "ssid": "test-wnm", @@ -28,6 +30,7 @@ def test_wnm_bss_transition_mgmt(dev, apdev): dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") dev[0].request("WNM_BSS_QUERY 0") +@remote_compatible def test_wnm_disassoc_imminent(dev, apdev): """WNM Disassociation Imminent""" params = { "ssid": "test-wnm", @@ -49,6 +52,7 @@ def test_wnm_disassoc_imminent(dev, apdev): if ev is None: raise Exception("Timeout while waiting for re-connection scan") +@remote_compatible def test_wnm_ess_disassoc_imminent(dev, apdev): """WNM ESS Disassociation Imminent""" params = { "ssid": "test-wnm", @@ -70,6 +74,7 @@ def test_wnm_ess_disassoc_imminent(dev, apdev): if ev is None: raise Exception("Timeout while waiting for re-connection scan") +@remote_compatible def test_wnm_ess_disassoc_imminent_pmf(dev, apdev): """WNM ESS Disassociation Imminent""" params = hostapd.wpa2_params("test-wnm-rsn", "12345678") @@ -127,6 +132,7 @@ def check_wnm_sleep_mode_enter_exit(hapd, dev, interval=None, tfs_req=None): if not ok: raise Exception("Station failed to exit WNM-Sleep Mode") +@remote_compatible def test_wnm_sleep_mode_open(dev, apdev): """WNM Sleep Mode - open""" params = { "ssid": "test-wnm", @@ -151,6 +157,7 @@ def test_wnm_sleep_mode_open(dev, apdev): if "FAIL" not in dev[0].request("WNM_SLEEP " + cmd): raise Exception("Invalid WNM_SLEEP accepted") +@remote_compatible def test_wnm_sleep_mode_rsn(dev, apdev): """WNM Sleep Mode - RSN""" params = hostapd.wpa2_params("test-wnm-rsn", "12345678") @@ -166,6 +173,7 @@ def test_wnm_sleep_mode_rsn(dev, apdev): raise Exception("No connection event received from hostapd") check_wnm_sleep_mode_enter_exit(hapd, dev[0]) +@remote_compatible def test_wnm_sleep_mode_ap_oom(dev, apdev): """WNM Sleep Mode - AP side OOM""" params = { "ssid": "test-wnm", @@ -183,6 +191,7 @@ def test_wnm_sleep_mode_ap_oom(dev, apdev): dev[0].request("WNM_SLEEP exit") wait_fail_trigger(hapd, "GET_ALLOC_FAIL") +@remote_compatible def test_wnm_sleep_mode_rsn_pmf(dev, apdev): """WNM Sleep Mode - RSN with PMF""" params = hostapd.wpa2_params("test-wnm-rsn", "12345678") @@ -280,6 +289,7 @@ def expect_ack(hapd): if "ok=1" not in ev: raise Exception("Action frame not acknowledged") +@remote_compatible def test_wnm_bss_tm_req(dev, apdev): """BSS Transition Management Request""" params = { "ssid": "test-wnm", "bss_transition": "1" } @@ -427,6 +437,7 @@ def test_wnm_bss_tm_req(dev, apdev): hapd.mgmt_tx(req) resp = rx_bss_tm_resp(hapd, expect_dialog=8, expect_status=7) +@remote_compatible def test_wnm_bss_keep_alive(dev, apdev): """WNM keep-alive""" params = { "ssid": "test-wnm", @@ -1054,6 +1065,7 @@ def test_wnm_action_proto(dev, apdev): hapd.mgmt_tx(msg) expect_ack(hapd) +@remote_compatible def test_wnm_action_proto_pmf(dev, apdev): """WNM Action protocol testing (PMF enabled)""" ssid = "test-wnm-pmf" @@ -1158,6 +1170,7 @@ def test_wnm_action_proto_pmf(dev, apdev): hapd.mgmt_tx(msg) expect_ack(hapd) +@remote_compatible def test_wnm_action_proto_no_pmf(dev, apdev): """WNM Action protocol testing (PMF disabled)""" ssid = "test-wnm-no-pmf" @@ -1258,6 +1271,7 @@ def test_wnm_bss_tm_req_with_mbo_ie(dev, apdev): if "OK" not in dev[0].request("SET mbo_cell_capa 3"): raise Exception("Failed to set STA as cellular data not-capable") +@remote_compatible def test_wnm_bss_transition_mgmt_query(dev, apdev): """WNM BSS Transition Management query""" params = { "ssid": "test-wnm", @@ -1281,6 +1295,7 @@ def test_wnm_bss_transition_mgmt_query(dev, apdev): if ev is None: raise Exception("No BSS Transition Management Response frame seen") +@remote_compatible def test_wnm_bss_tm_security_mismatch(dev, apdev): """WNM BSS Transition Management and security mismatch""" params = { "ssid": "test-wnm", diff --git a/tests/hwsim/test_wpas_ap.py b/tests/hwsim/test_wpas_ap.py index 2cde2d5..0037fe4 100644 --- a/tests/hwsim/test_wpas_ap.py +++ b/tests/hwsim/test_wpas_ap.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import time import logging logger = logging.getLogger() @@ -76,6 +77,7 @@ def test_wpas_ap_open(dev): dev[1].request("DISCONNECT") dev[2].request("DISCONNECT") +@remote_compatible def test_wpas_ap_wep(dev): """wpa_supplicant AP mode - WEP""" id = dev[0].add_network() @@ -93,6 +95,7 @@ def test_wpas_ap_wep(dev): hwsim_utils.test_connectivity(dev[0], dev[1]) dev[1].request("DISCONNECT") +@remote_compatible def test_wpas_ap_no_ssid(dev): """wpa_supplicant AP mode - invalid network configuration""" id = dev[0].add_network() @@ -105,6 +108,7 @@ def test_wpas_ap_no_ssid(dev): if ev is not None: raise Exception("Unexpected AP start") +@remote_compatible def test_wpas_ap_default_frequency(dev): """wpa_supplicant AP mode - default frequency""" id = dev[0].add_network() @@ -117,6 +121,7 @@ def test_wpas_ap_default_frequency(dev): dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462") dev[1].request("DISCONNECT") +@remote_compatible def test_wpas_ap_invalid_frequency(dev): """wpa_supplicant AP mode - invalid frequency configuration""" id = dev[0].add_network() @@ -277,6 +282,7 @@ def test_wpas_ap_wps_pbc_overlap(dev): dev[1].request("WPS_CANCEL") dev[2].request("WPS_CANCEL") +@remote_compatible def test_wpas_ap_wps_disabled(dev): """wpa_supplicant AP mode - WPS disabled""" id = dev[0].add_network() @@ -332,6 +338,7 @@ def _test_wpas_ap_dfs(dev): dev[1].connect("wpas-ap-dfs", key_mgmt="NONE") +@remote_compatible def test_wpas_ap_disable(dev): """wpa_supplicant AP mode - DISABLE_NETWORK""" id = dev[0].add_network() @@ -374,6 +381,7 @@ def test_wpas_ap_acs(dev): dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq=freq) +@remote_compatible def test_wpas_ap_and_assoc_req_p2p_ie(dev): """wpa_supplicant AP mode - unexpected P2P IE in Association Request""" try: @@ -401,6 +409,7 @@ def _test_wpas_ap_and_assoc_req_p2p_ie(dev): dev[0].request("DISCONNECT") dev[0].wait_disconnected() +@remote_compatible def test_wpas_ap_open_ht_disabled(dev): """wpa_supplicant AP mode - open network and HT disabled""" id = dev[0].add_network() diff --git a/tests/hwsim/test_wpas_ctrl.py b/tests/hwsim/test_wpas_ctrl.py index 8a22106..b977726 100644 --- a/tests/hwsim/test_wpas_ctrl.py +++ b/tests/hwsim/test_wpas_ctrl.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import os @@ -18,6 +19,7 @@ from wpasupplicant import WpaSupplicant from utils import alloc_fail, fail_test from test_wpas_ap import wait_ap_ready +@remote_compatible def test_wpas_ctrl_network(dev): """wpa_supplicant ctrl_iface network set/get""" id = dev[0].add_network() @@ -278,6 +280,7 @@ def test_wpas_ctrl_network(dev): if "FAIL" not in dev[0].request("SET_NETWORK %d bssid_blacklist %s" % (id, val)): raise Exception("Invalid bssid_blacklist value accepted") +@remote_compatible def test_wpas_ctrl_network_oom(dev): """wpa_supplicant ctrl_iface network OOM in string parsing""" id = dev[0].add_network() @@ -291,6 +294,7 @@ def test_wpas_ctrl_network_oom(dev): if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' ssid ' + val): raise Exception("Unexpected success for SET_NETWORK during OOM") +@remote_compatible def test_wpas_ctrl_many_networks(dev, apdev): """wpa_supplicant ctrl_iface LIST_NETWORKS with huge number of networks""" for i in range(1000): @@ -306,6 +310,7 @@ def test_wpas_ctrl_many_networks(dev, apdev): # with the test case failing and following reset operation timing out. dev[0].request("REMOVE_NETWORK all", timeout=60) +@remote_compatible def test_wpas_ctrl_dup_network(dev, apdev): """wpa_supplicant ctrl_iface DUP_NETWORK""" ssid = "target" @@ -339,6 +344,7 @@ def test_wpas_ctrl_dup_network(dev, apdev): if "OK" not in dev[0].request("DUP_NETWORK %d %d ssid" % (id, id)): raise Exception("Unexpected DUP_NETWORK failure") +@remote_compatible def test_wpas_ctrl_dup_network_global(dev, apdev): """wpa_supplicant ctrl_iface DUP_NETWORK (global)""" ssid = "target" @@ -407,6 +413,7 @@ def remove_cred(dev, id): if " " + str(id) not in ev: raise Exception("CRED-REMOVED event without matching id") +@remote_compatible def test_wpas_ctrl_cred(dev): """wpa_supplicant ctrl_iface cred set""" id1 = add_cred(dev[0]) @@ -602,6 +609,7 @@ def test_wpas_ctrl_pno(dev): if "FAIL" in dev[0].request("SET pno 0"): raise Exception("Unexpected failure in disabling PNO") +@remote_compatible def test_wpas_ctrl_get(dev): """wpa_supplicant ctrl_iface get""" if "FAIL" in dev[0].request("GET version"): @@ -611,6 +619,7 @@ def test_wpas_ctrl_get(dev): if "FAIL" not in dev[0].request("GET foo"): raise Exception("Unexpected success on get command") +@remote_compatible def test_wpas_ctrl_preauth(dev): """wpa_supplicant ctrl_iface preauth""" if "FAIL" not in dev[0].request("PREAUTH "): @@ -618,6 +627,7 @@ def test_wpas_ctrl_preauth(dev): if "FAIL" in dev[0].request("PREAUTH 00:11:22:33:44:55"): raise Exception("Unexpected failure on PREAUTH") +@remote_compatible def test_wpas_ctrl_stkstart(dev): """wpa_supplicant ctrl_iface strkstart""" if "FAIL" not in dev[0].request("STKSTART "): @@ -625,6 +635,7 @@ def test_wpas_ctrl_stkstart(dev): if "FAIL" not in dev[0].request("STKSTART 00:11:22:33:44:55"): raise Exception("Unexpected success on STKSTART") +@remote_compatible def test_wpas_ctrl_tdls_discover(dev): """wpa_supplicant ctrl_iface tdls_discover""" if "FAIL" not in dev[0].request("TDLS_DISCOVER "): @@ -632,6 +643,7 @@ def test_wpas_ctrl_tdls_discover(dev): if "FAIL" not in dev[0].request("TDLS_DISCOVER 00:11:22:33:44:55"): raise Exception("Unexpected success on TDLS_DISCOVER") +@remote_compatible def test_wpas_ctrl_tdls_chan_switch(dev): """wpa_supplicant ctrl_iface tdls_chan_switch error cases""" for args in [ '', '00:11:22:33:44:55' ]: @@ -644,6 +656,7 @@ def test_wpas_ctrl_tdls_chan_switch(dev): if "FAIL" not in dev[0].request("TDLS_CHAN_SWITCH " + args): raise Exception("Unexpected success on invalid TDLS_CHAN_SWITCH: " + args) +@remote_compatible def test_wpas_ctrl_addr(dev): """wpa_supplicant ctrl_iface invalid address""" if "FAIL" not in dev[0].request("TDLS_SETUP "): @@ -665,6 +678,7 @@ def test_wpas_ctrl_addr(dev): if "FAIL" not in dev[0].request("BLACKLIST 00:11:22:33:44"): raise Exception("Unexpected success on invalid BLACKLIST") +@remote_compatible def test_wpas_ctrl_wps_errors(dev): """wpa_supplicant ctrl_iface WPS error cases""" if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55"): @@ -713,6 +727,7 @@ def test_wpas_ctrl_wps_errors(dev): if "FAIL" not in dev[0].request("WPS_NFC_TOKEN FOO"): raise Exception("Unexpected success on invalid WPS_NFC_TOKEN") +@remote_compatible def test_wpas_ctrl_config_parser(dev): """wpa_supplicant ctrl_iface SET config parser""" if "FAIL" not in dev[0].request("SET pbc_in_m1 qwerty"): @@ -725,6 +740,7 @@ def test_wpas_ctrl_config_parser(dev): if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"): raise Exception("Too long string accepted") +@remote_compatible def test_wpas_ctrl_mib(dev): """wpa_supplicant ctrl_iface MIB""" mib = dev[0].get_mib() @@ -814,6 +830,7 @@ def test_wpas_ctrl_bssid_filter(dev, apdev): finally: dev[2].request("SET bssid_filter ") +@remote_compatible def test_wpas_ctrl_disallow_aps(dev, apdev): """wpa_supplicant ctrl_iface disallow_aps""" params = { "ssid": "test" } @@ -859,6 +876,7 @@ def test_wpas_ctrl_disallow_aps(dev, apdev): if "OK" not in dev[0].request("SET disallow_aps "): raise Exception("Failed to set disallow_aps") +@remote_compatible def test_wpas_ctrl_blob(dev): """wpa_supplicant ctrl_iface SET blob""" if "FAIL" not in dev[0].request("SET blob foo"): @@ -872,6 +890,7 @@ def test_wpas_ctrl_blob(dev): if "OK" not in dev[0].request("SET blob foo 0011"): raise Exception("Unexpected SET failure") +@remote_compatible def test_wpas_ctrl_set_uapsd(dev): """wpa_supplicant ctrl_iface SET uapsd""" if "FAIL" not in dev[0].request("SET uapsd foo"): @@ -926,6 +945,7 @@ def test_wpas_ctrl_set(dev): # methods is included, so don't check the return value for now. dev[0].request("SET load_dynamic_eap /tmp/hwsim-eap-not-found.so") +@remote_compatible def test_wpas_ctrl_get_capability(dev): """wpa_supplicant ctrl_iface GET_CAPABILITY""" if "FAIL" not in dev[0].request("GET_CAPABILITY 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"): @@ -981,6 +1001,7 @@ def test_wpas_ctrl_get_capability(dev): if dev[0].get_capability("foo") is not None: raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res)) +@remote_compatible def test_wpas_ctrl_nfc_report_handover(dev): """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER""" vals = [ "FOO", @@ -996,6 +1017,7 @@ def test_wpas_ctrl_nfc_report_handover(dev): if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v): raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v) +@remote_compatible def test_wpas_ctrl_nfc_tag_read(dev): """wpa_supplicant ctrl_iface WPS_NFC_TAG_READ""" vals = [ "FOO", "0Q", "00", "000000", "10000001", "10000000", "00000000", @@ -1004,6 +1026,7 @@ def test_wpas_ctrl_nfc_tag_read(dev): if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v): raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v) +@remote_compatible def test_wpas_ctrl_nfc_get_handover(dev): """wpa_supplicant ctrl_iface NFC_GET_HANDOVER""" vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P" ] @@ -1031,6 +1054,7 @@ def test_wpas_ctrl_nfc_get_handover(dev): def get_blacklist(dev): return dev.request("BLACKLIST").splitlines() +@remote_compatible def test_wpas_ctrl_blacklist(dev): """wpa_supplicant ctrl_iface BLACKLIST""" if "OK" not in dev[0].request("BLACKLIST clear"): @@ -1059,6 +1083,7 @@ def test_wpas_ctrl_blacklist(dev): if dev[0].request("BLACKLIST") != "": raise Exception("Unexpected blacklist contents") +@remote_compatible def test_wpas_ctrl_blacklist_oom(dev): """wpa_supplicant ctrl_iface BLACKLIST and out-of-memory""" with alloc_fail(dev[0], 1, "wpa_blacklist_add"): @@ -1107,6 +1132,7 @@ def test_wpas_ctrl_log_level(dev): if "Timestamp: 1" not in level: raise Exception("Unexpected timestamp(3): " + level) +@remote_compatible def test_wpas_ctrl_enable_disable_network(dev, apdev): """wpa_supplicant ctrl_iface ENABLE/DISABLE_NETWORK""" params = { "ssid": "test" } @@ -1244,6 +1270,7 @@ def test_wpas_ctrl_global(dev): if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge create abcd"): raise Exception("INTERFACE_ADD succeeded unexpectedly") +@remote_compatible def test_wpas_ctrl_roam(dev, apdev): """wpa_supplicant ctrl_iface ROAM error cases""" if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"): @@ -1256,6 +1283,7 @@ def test_wpas_ctrl_roam(dev, apdev): if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"): raise Exception("Unexpected success") +@remote_compatible def test_wpas_ctrl_ipaddr(dev, apdev): """wpa_supplicant IP address in STATUS""" try: @@ -1268,6 +1296,7 @@ def test_wpas_ctrl_ipaddr(dev, apdev): dev[0].cmd_execute(['ip', 'addr', 'del', '10.174.65.207/32', 'dev', dev[0].ifname]) +@remote_compatible def test_wpas_ctrl_rsp(dev, apdev): """wpa_supplicant ctrl_iface CTRL-RSP-""" if "FAIL" not in dev[0].request("CTRL-RSP-"): @@ -1288,6 +1317,7 @@ def test_wpas_ctrl_rsp(dev, apdev): if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)): raise Exception("Request failed unexpectedly") +@remote_compatible def test_wpas_ctrl_vendor(dev, apdev): """wpa_supplicant ctrl_iface VENDOR""" cmds = [ "foo", @@ -1299,6 +1329,7 @@ def test_wpas_ctrl_vendor(dev, apdev): if "FAIL" not in dev[0].request("VENDOR " + cmd): raise Exception("Invalid VENDOR command accepted: " + cmd) +@remote_compatible def test_wpas_ctrl_mgmt_tx(dev, apdev): """wpa_supplicant ctrl_iface MGMT_TX""" cmds = [ "foo", @@ -1313,11 +1344,13 @@ def test_wpas_ctrl_mgmt_tx(dev, apdev): if "OK" not in dev[0].request("MGMT_TX_DONE"): raise Exception("MGMT_TX_DONE failed") +@remote_compatible def test_wpas_ctrl_driver_event(dev, apdev): """wpa_supplicant ctrl_iface DRIVER_EVENT""" if "FAIL" not in dev[0].request("DRIVER_EVENT foo"): raise Exception("Invalid DRIVER_EVENT accepted") +@remote_compatible def test_wpas_ctrl_eapol_rx(dev, apdev): """wpa_supplicant ctrl_iface EAPOL_RX""" cmds = [ "foo", @@ -1327,6 +1360,7 @@ def test_wpas_ctrl_eapol_rx(dev, apdev): if "FAIL" not in dev[0].request("EAPOL_RX " + cmd): raise Exception("Invalid EAPOL_RX command accepted: " + cmd) +@remote_compatible def test_wpas_ctrl_data_test(dev, apdev): """wpa_supplicant ctrl_iface DATA_TEST""" dev[0].request("DATA_TEST_CONFIG 0") @@ -1361,6 +1395,7 @@ def test_wpas_ctrl_data_test(dev, apdev): if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"): raise Exception("DATA_TEST_FRAME failed") +@remote_compatible def test_wpas_ctrl_vendor_elem(dev, apdev): """wpa_supplicant ctrl_iface VENDOR_ELEM""" if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "): @@ -1429,6 +1464,7 @@ def test_wpas_ctrl_misc(dev, apdev): if "FAIL" not in dev[0].global_request("SET foo"): raise Exception("Invalid global SET accepted") +@remote_compatible def test_wpas_ctrl_dump(dev, apdev): """wpa_supplicant ctrl_iface and DUMP/GET global parameters""" vals = dev[0].get_config() @@ -1598,6 +1634,7 @@ def test_wpas_ctrl_wait(dev, apdev, test_params): if os.path.exists(pidfile): raise Exception("PID file not removed") +@remote_compatible def test_wpas_ctrl_oom(dev): """Various wpa_supplicant ctrl_iface OOM cases""" try: @@ -1745,6 +1782,7 @@ def _test_wpas_ctrl_oom(dev): if exp and exp not in res: raise Exception("Unexpected success for '%s' during OOM" % cmd) +@remote_compatible def test_wpas_ctrl_error(dev): """Various wpa_supplicant ctrl_iface error cases""" tests = [ ('WPS_NFC_TOKEN NDEF', 'FAIL', @@ -1870,6 +1908,7 @@ def test_wpas_ctrl_event_burst(dev, apdev): if not dev[0].ping(): raise Exception("Could not ping wpa_supplicant at the end of the test") +@remote_compatible def test_wpas_ctrl_sched_scan_plans(dev, apdev): """wpa_supplicant sched_scan_plans parsing""" dev[0].request("SET sched_scan_plans foo") diff --git a/tests/hwsim/test_wpas_wmm_ac.py b/tests/hwsim/test_wpas_wmm_ac.py index 10f8f6b..38ed9c5 100644 --- a/tests/hwsim/test_wpas_wmm_ac.py +++ b/tests/hwsim/test_wpas_wmm_ac.py @@ -4,6 +4,7 @@ # This software may be distributed under the terms of the BSD license. # See README for more details. +from remotehost import remote_compatible import logging logger = logging.getLogger() import struct @@ -209,6 +210,7 @@ def test_tspec_protocol(dev, apdev): hapd.set("ext_mgmt_frame_handling", "0") +@remote_compatible def test_tspec_not_enabled(dev, apdev): """addts failing if AP does not support WMM""" params = { "ssid": "wmm_no_ac", @@ -246,6 +248,7 @@ def test_tspec_not_enabled(dev, apdev): msg['payload'] = struct.pack('BBBB', 17, 2, 0, 0) hapd.mgmt_tx(msg) +@remote_compatible def test_tspec_ap_roam_open(dev, apdev): """Roam between two open APs while having tspecs""" hapd0 = add_wmm_ap(apdev[0], ["VO", "VI"]) @@ -264,6 +267,7 @@ def test_tspec_ap_roam_open(dev, apdev): dev[0].roam(apdev[0]['bssid']) hwsim_utils.test_connectivity(dev[0], hapd0) +@remote_compatible def test_tspec_reassoc(dev, apdev): """Reassociation to same BSS while having tspecs""" hapd0 = add_wmm_ap(apdev[0], ["VO", "VI"]) -- 1.9.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap