diff --git a/tests/hwsim/test_wnm.py b/tests/hwsim/test_wnm.py index 1a4140cb6..ff454f2ce 100644 --- a/tests/hwsim/test_wnm.py +++ b/tests/hwsim/test_wnm.py @@ -1,9 +1,11 @@ # WNM tests -# Copyright (c) 2013, Jouni Malinen +# Copyright (c) 2013-2014, Jouni Malinen # # This software may be distributed under the terms of the BSD license. # See README for more details. +import binascii +import struct import time import logging logger = logging.getLogger() @@ -151,3 +153,143 @@ def test_wnm_sleep_mode_rsn_pmf(dev, apdev): dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2", key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412") check_wnm_sleep_mode_enter_exit(hapd, dev[0]) + +MGMT_SUBTYPE_ACTION = 13 +ACTION_CATEG_WNM = 10 +WNM_ACT_BSS_TM_REQ = 7 +WNM_ACT_BSS_TM_RESP = 8 + +def bss_tm_req(dst, src, dialog_token=1, req_mode=0, disassoc_timer=0, + validity_interval=1): + msg = {} + msg['fc'] = MGMT_SUBTYPE_ACTION << 4 + msg['da'] = dst + msg['sa'] = src + msg['bssid'] = src + msg['payload'] = struct.pack("= 6 and status == 0: + resp['target_bssid'] = binascii.hexlify(pos[0:6]) + pos = pos[6:] + resp['candidates'] = pos + if expect_dialog is not None and dialog != expect_dialog: + raise Exception("Unexpected dialog token") + if expect_status is not None and status != expect_status: + raise Exception("Unexpected status code %d" % status) + return resp + +def except_ack(hapd): + ev = hapd.wait_event(["MGMT-TX-STATUS"], timeout=5) + if ev is None: + raise Exception("Missing TX status") + if "ok=1" not in ev: + raise Exception("Action frame not acknowledged") + +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) + dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412") + hapd2 = hostapd.add_ap(apdev[1]['ifname'], params) + + hapd.set("ext_mgmt_frame_handling", "1") + + # truncated BSS TM Request + req = bss_tm_req(dev[0].p2p_interface_addr(), apdev[0]['bssid'], + req_mode=0x08) + req['payload'] = struct.pack("