X-Git-Url: http://www.project-moonshot.org/gitweb/?p=mech_eap.git;a=blobdiff_plain;f=libeap%2Ftests%2Fhwsim%2Ftest_wnm.py;h=ffdbcbeaadd343f0c6a57f0206a02c197e8328c4;hp=c30436ecbf300ecb9d2e559ea0d0b6bbb73d1b58;hb=d1dd9aae6741e74f20bfc35e1db598652680279d;hpb=bd3bd69af16ab99706ba70ed11a3e291e968e5c6 diff --git a/libeap/tests/hwsim/test_wnm.py b/libeap/tests/hwsim/test_wnm.py index c30436e..ffdbcbe 100644 --- a/libeap/tests/hwsim/test_wnm.py +++ b/libeap/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 @@ -12,8 +13,11 @@ logger = logging.getLogger() import subprocess import hostapd +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", @@ -21,11 +25,12 @@ def test_wnm_bss_transition_mgmt(dev, apdev): "time_zone": "EST5", "wnm_sleep_mode": "1", "bss_transition": "1" } - hostapd.add_ap(apdev[0]['ifname'], params) + hostapd.add_ap(apdev[0], params) 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", @@ -33,8 +38,7 @@ def test_wnm_disassoc_imminent(dev, apdev): "time_zone": "EST5", "wnm_sleep_mode": "1", "bss_transition": "1" } - hostapd.add_ap(apdev[0]['ifname'], params) - hapd = hostapd.Hostapd(apdev[0]['ifname']) + hapd = hostapd.add_ap(apdev[0], params) dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") addr = dev[0].p2p_interface_addr() @@ -48,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", @@ -55,8 +60,7 @@ def test_wnm_ess_disassoc_imminent(dev, apdev): "time_zone": "EST5", "wnm_sleep_mode": "1", "bss_transition": "1" } - hostapd.add_ap(apdev[0]['ifname'], params) - hapd = hostapd.Hostapd(apdev[0]['ifname']) + hapd = hostapd.add_ap(apdev[0], params) dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") addr = dev[0].p2p_interface_addr() @@ -70,14 +74,34 @@ def test_wnm_ess_disassoc_imminent(dev, apdev): if ev is None: raise Exception("Timeout while waiting for re-connection scan") +def test_wnm_ess_disassoc_imminent_reject(dev, apdev): + """WNM ESS Disassociation Imminent getting rejected""" + params = { "ssid": "test-wnm", + "bss_transition": "1" } + hapd = hostapd.add_ap(apdev[0], params) + + dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") + addr = dev[0].own_addr() + if "OK" not in dev[0].request("SET reject_btm_req_reason 123"): + raise Exception("Failed to set reject_btm_req_reason") + + hapd.request("ESS_DISASSOC " + addr + " 1 http://example.com/session-info") + ev = hapd.wait_event(["BSS-TM-RESP"], timeout=10) + if ev is None: + raise Exception("BSS-TM-RESP not seen") + if "status_code=123" not in ev: + raise Exception("Unexpected response status: " + ev) + dev[0].wait_disconnected() + dev[0].request("DISCONNECT") + +@remote_compatible def test_wnm_ess_disassoc_imminent_pmf(dev, apdev): """WNM ESS Disassociation Imminent""" params = hostapd.wpa2_params("test-wnm-rsn", "12345678") - params["wpa_key_mgmt"] = "WPA-PSK-SHA256"; - params["ieee80211w"] = "2"; + params["wpa_key_mgmt"] = "WPA-PSK-SHA256" + params["ieee80211w"] = "2" params["bss_transition"] = "1" - hostapd.add_ap(apdev[0]['ifname'], params) - hapd = hostapd.Hostapd(apdev[0]['ifname']) + hapd = hostapd.add_ap(apdev[0], params) dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2", key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") @@ -128,6 +152,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", @@ -135,8 +160,7 @@ def test_wnm_sleep_mode_open(dev, apdev): "time_zone": "EST5", "wnm_sleep_mode": "1", "bss_transition": "1" } - hostapd.add_ap(apdev[0]['ifname'], params) - hapd = hostapd.Hostapd(apdev[0]['ifname']) + hapd = hostapd.add_ap(apdev[0], params) dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5) @@ -153,6 +177,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") @@ -160,8 +185,7 @@ def test_wnm_sleep_mode_rsn(dev, apdev): params["time_zone"] = "EST5" params["wnm_sleep_mode"] = "1" params["bss_transition"] = "1" - hostapd.add_ap(apdev[0]['ifname'], params) - hapd = hostapd.Hostapd(apdev[0]['ifname']) + hapd = hostapd.add_ap(apdev[0], params) dev[0].connect("test-wnm-rsn", psk="12345678", scan_freq="2412") ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5) @@ -169,20 +193,40 @@ 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", + "wnm_sleep_mode": "1" } + hapd = hostapd.add_ap(apdev[0], params) + + dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") + ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5) + if ev is None: + raise Exception("No connection event received from hostapd") + with alloc_fail(hapd, 1, "ieee802_11_send_wnmsleep_resp"): + dev[0].request("WNM_SLEEP enter") + wait_fail_trigger(hapd, "GET_ALLOC_FAIL") + with alloc_fail(hapd, 2, "ieee802_11_send_wnmsleep_resp"): + 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""" - wt = Wlantest() - wt.flush() - wt.add_passphrase("12345678") params = hostapd.wpa2_params("test-wnm-rsn", "12345678") - params["wpa_key_mgmt"] = "WPA-PSK-SHA256"; - params["ieee80211w"] = "2"; + params["wpa_key_mgmt"] = "WPA-PSK-SHA256" + params["ieee80211w"] = "2" params["time_advertisement"] = "2" params["time_zone"] = "EST5" params["wnm_sleep_mode"] = "1" params["bss_transition"] = "1" - hostapd.add_ap(apdev[0]['ifname'], params) - hapd = hostapd.Hostapd(apdev[0]['ifname']) + hapd = hostapd.add_ap(apdev[0], params) + + Wlantest.setup(hapd) + wt = Wlantest() + wt.flush() + wt.add_passphrase("12345678") dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2", key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") @@ -195,6 +239,24 @@ MGMT_SUBTYPE_ACTION = 13 ACTION_CATEG_WNM = 10 WNM_ACT_BSS_TM_REQ = 7 WNM_ACT_BSS_TM_RESP = 8 +WNM_ACT_SLEEP_MODE_REQ = 16 +WNM_ACT_SLEEP_MODE_RESP = 17 +WNM_ACT_NOTIFICATION_REQ = 26 +WNM_ACT_NOTIFICATION_RESP = 27 +WNM_NOTIF_TYPE_FW_UPGRADE = 0 +WNM_NOTIF_TYPE_WFA = 1 +WLAN_EID_TFS_RESP = 92 +WLAN_EID_WNMSLEEP = 93 +WNM_SLEEP_MODE_ENTER = 0 +WNM_SLEEP_MODE_EXIT = 1 +WNM_STATUS_SLEEP_ACCEPT = 0 +WNM_STATUS_SLEEP_EXIT_ACCEPT_GTK_UPDATE = 1 +WNM_STATUS_DENIED_ACTION = 2 +WNM_STATUS_DENIED_TMP = 3 +WNM_STATUS_DENIED_KEY = 4 +WNM_STATUS_DENIED_OTHER_WNM_SERVICE = 5 +WNM_SLEEP_SUBELEM_GTK = 0 +WNM_SLEEP_SUBELEM_IGTK = 1 def bss_tm_req(dst, src, dialog_token=1, req_mode=0, disassoc_timer=0, validity_interval=1): @@ -247,12 +309,13 @@ 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" } - hapd = hostapd.add_ap(apdev[0]['ifname'], params) + hapd = hostapd.add_ap(apdev[0], params) dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") - hapd2 = hostapd.add_ap(apdev[1]['ifname'], params) + hapd2 = hostapd.add_ap(apdev[1], params) hapd.set("ext_mgmt_frame_handling", "1") @@ -383,11 +446,23 @@ def test_wnm_bss_tm_req(dev, apdev): hapd.mgmt_tx(req) resp = rx_bss_tm_resp(hapd, expect_dialog=8, expect_status=7) + # Preferred Candidate List followed by vendor element + req = bss_tm_req(dev[0].p2p_interface_addr(), apdev[0]['bssid'], + req_mode=0x01, dialog_token=8) + subelems = "" + req['payload'] += struct.pack("BBBBBBLB", + ACTION_CATEG_WNM, WNM_ACT_NOTIFICATION_REQ, + dialog_token, WNM_NOTIF_TYPE_WFA, 0xdd, 5, + 0x506f9a00, 1) + hapd.mgmt_tx(msg) + expect_ack(hapd) + + logger.debug("WFA WNM-Notification Request with truncated Sub Rem URL(2)") + msg['payload'] = struct.pack(">BBBBBBLBB", + ACTION_CATEG_WNM, WNM_ACT_NOTIFICATION_REQ, + dialog_token, WNM_NOTIF_TYPE_WFA, 0xdd, 6, + 0x506f9a00, 1, 0) + hapd.mgmt_tx(msg) + expect_ack(hapd) + + logger.debug("WFA WNM-Notification Request with truncated Sub Rem URL(3)") + msg['payload'] = struct.pack(">BBBBBBLB", + ACTION_CATEG_WNM, WNM_ACT_NOTIFICATION_REQ, + dialog_token, WNM_NOTIF_TYPE_WFA, 0xdd, 5, + 0x506f9a00, 0xff) + hapd.mgmt_tx(msg) + expect_ack(hapd) + + logger.debug("WFA WNM-Notification Request with truncated Deauth Imminent URL(min)") + msg['payload'] = struct.pack(">BBBBBBLBHB", + ACTION_CATEG_WNM, WNM_ACT_NOTIFICATION_REQ, + dialog_token, WNM_NOTIF_TYPE_WFA, 0xdd, 8, + 0x506f9a01, 0, 0, 1) + hapd.mgmt_tx(msg) + expect_ack(hapd) + + logger.debug("WFA WNM-Notification Request with truncated Deauth Imminent URL(max)") + msg['payload'] = struct.pack(">BBBBBBLBHB", + ACTION_CATEG_WNM, WNM_ACT_NOTIFICATION_REQ, + dialog_token, WNM_NOTIF_TYPE_WFA, 0xdd, 8, + 0x506f9a01, 0, 0, 0xff) + hapd.mgmt_tx(msg) + expect_ack(hapd) + + logger.debug("WFA WNM-Notification Request with unsupported IE") + msg['payload'] = struct.pack("2L4L", 0x01020304, 0x05060708, + 0x11223344, 0x55667788, 0x9900aabb, 0xccddeeff) + keydata += struct.pack("2L4L", 0x01020304, 0x05060708, + 0x11223344, 0x55667788, 0x9900aabb, 0xccddeeff) + keydata += struct.pack("