tests: DRIVER_FLAGS command
[mech_eap.git] / tests / hwsim / test_wpas_ctrl.py
index 48421d3..96ed551 100644 (file)
@@ -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()
@@ -187,10 +189,10 @@ def test_wpas_ctrl_network(dev):
         raise Exception("Too short PSK accepted")
     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567890123456789012345678901234567890123456789012345678901234"'):
         raise Exception("Too long PSK accepted")
-    dev[0].set_network_quoted(id, "psk", "123456768");
-    dev[0].set_network_quoted(id, "psk", "123456789012345678901234567890123456789012345678901234567890123");
+    dev[0].set_network_quoted(id, "psk", "123456768")
+    dev[0].set_network_quoted(id, "psk", "123456789012345678901234567890123456789012345678901234567890123")
     if dev[0].get_network(id, "psk") != '*':
-        raise Exception("Unexpected psk read result");
+        raise Exception("Unexpected psk read result")
 
     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' eap UNKNOWN'):
         raise Exception("Unknown EAP method accepted")
@@ -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,58 +1283,20 @@ 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:
-        subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
-                         dev[0].ifname])
+        dev[0].cmd_execute(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
+                            dev[0].ifname])
         ipaddr = dev[0].get_status_field('ip_address')
         if ipaddr != '10.174.65.207':
             raise Exception("IP address not in STATUS output")
     finally:
-        subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
-                         dev[0].ifname])
-
-def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
-    """wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
-    params = { "ssid": "test" }
-    hostapd.add_ap(apdev[0], params)
-    params = { "ssid": "test2", "radio_measurements": "1" }
-    hostapd.add_ap(apdev[1], params)
-
-    dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
-    if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
-        raise Exception("Request succeeded unexpectedly")
-    if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=\"abcdef\""):
-        raise Exception("Request succeeded unexpectedly")
-    dev[0].request("DISCONNECT")
-
-    rrm = int(dev[0].get_driver_status_field("capa.rrm_flags"), 16)
-    if rrm & 0x5 != 0x5:
-        logger.info("Driver does not support required RRM capabilities - skip rest of the test case")
-        return
-
-    dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
-
-    # These requests are expected to get sent properly, but since hostapd does
-    # not yet support processing of the request, these are expected to fail.
-    
-    if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
-        raise Exception("Request failed")
-    ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
-                             "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
-    if ev is None:
-        raise Exception("RRM report result not indicated")
-    logger.info("RRM result: " + ev)
-
-    if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=\"abcdef\""):
-        raise Exception("Request failed")
-    ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
-                             "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
-    if ev is None:
-        raise Exception("RRM report result not indicated")
-    logger.info("RRM result: " + ev)
+        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-"):
@@ -1328,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",
@@ -1339,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",
@@ -1353,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",
@@ -1367,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")
@@ -1401,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 "):
@@ -1469,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()
@@ -1638,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:
@@ -1785,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',
@@ -1910,10 +1908,16 @@ 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")
     dev[0].request("SET sched_scan_plans 10:100 20:200 30")
+    with alloc_fail(dev[0], 1, "wpas_sched_scan_plans_set"):
+        dev[0].request("SET sched_scan_plans 10:100")
+    dev[0].request("SET sched_scan_plans 4294967295:0")
+    dev[0].request("SET sched_scan_plans 1 1")
+    dev[0].request("SET sched_scan_plans  ")
     dev[0].request("SET sched_scan_plans ")
 
 def test_wpas_ctrl_signal_monitor(dev, apdev):
@@ -1946,3 +1950,26 @@ def test_wpas_ctrl_signal_monitor(dev, apdev):
     dev[0].request("REMOVE_NETWORK all")
     dev[1].request("REMOVE_NETWORK all")
     dev[1].wait_disconnected()
+
+def test_wpas_ctrl_p2p_listen_offload(dev, apdev):
+    """wpa_supplicant P2P_LO_START and P2P_LO_STOP commands"""
+    dev[0].request("P2P_LO_STOP")
+    dev[0].request("P2P_LO_START ")
+    dev[0].request("P2P_LO_START 2412")
+    dev[0].request("P2P_LO_START 2412 100 200 3")
+    dev[0].request("P2P_LO_STOP")
+
+def test_wpas_ctrl_driver_flags(dev, apdev):
+    """DRIVER_FLAGS command"""
+    params = hostapd.wpa2_params(ssid="test", passphrase="12345678")
+    hapd = hostapd.add_ap(apdev[0], params)
+    hapd_flags = hapd.request("DRIVER_FLAGS")
+    wpas_flags = dev[0].request("DRIVER_FLAGS")
+    if "FAIL" in hapd_flags:
+        raise Exception("DRIVER_FLAGS failed")
+    if hapd_flags != wpas_flags:
+        raise Exception("Unexpected difference in hostapd vs. wpa_supplicant DRIVER_FLAGS output")
+    logger.info("DRIVER_FLAGS: " + hapd_flags)
+    flags = hapd_flags.split('\n')
+    if 'AP' not in flags:
+        raise Exception("AP flag missing from DRIVER_FLAGS")