tests: mac80211 and unknown Action frame rejection in STA mode
Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
0851a180b9
commit
bae93012cd
1 changed files with 72 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
||||||
# Test a few kernel bugs
|
# Test a few kernel bugs and functionality
|
||||||
# Copyright (c) 2016, Intel Deutschland GmbH
|
# Copyright (c) 2016, Intel Deutschland GmbH
|
||||||
#
|
#
|
||||||
# Author: Johannes Berg <johannes.berg@intel.com>
|
# Author: Johannes Berg <johannes.berg@intel.com>
|
||||||
|
@ -8,6 +8,10 @@
|
||||||
|
|
||||||
import hostapd
|
import hostapd
|
||||||
import binascii
|
import binascii
|
||||||
|
import os
|
||||||
|
import struct
|
||||||
|
from test_wnm import expect_ack
|
||||||
|
from tshark import run_tshark
|
||||||
|
|
||||||
def _test_kernel_bss_leak(dev, apdev, deauth):
|
def _test_kernel_bss_leak(dev, apdev, deauth):
|
||||||
ssid = "test-bss-leak"
|
ssid = "test-bss-leak"
|
||||||
|
@ -55,3 +59,70 @@ def test_kernel_bss_leak_deauth(dev, apdev):
|
||||||
def test_kernel_bss_leak_timeout(dev, apdev):
|
def test_kernel_bss_leak_timeout(dev, apdev):
|
||||||
"""cfg80211/mac80211 BSS leak on timeout"""
|
"""cfg80211/mac80211 BSS leak on timeout"""
|
||||||
return _test_kernel_bss_leak(dev, apdev, deauth=False)
|
return _test_kernel_bss_leak(dev, apdev, deauth=False)
|
||||||
|
|
||||||
|
MGMT_SUBTYPE_ACTION = 13
|
||||||
|
|
||||||
|
def expect_no_ack(hapd):
|
||||||
|
ev = hapd.wait_event(["MGMT-TX-STATUS"], timeout=5)
|
||||||
|
if ev is None:
|
||||||
|
raise Exception("Missing TX status")
|
||||||
|
if "ok=0" not in ev:
|
||||||
|
raise Exception("Action frame unexpectedly acknowledged")
|
||||||
|
|
||||||
|
def test_kernel_unknown_action_frame_rejection_sta(dev, apdev, params):
|
||||||
|
"""mac80211 and unknown Action frame rejection in STA mode"""
|
||||||
|
hapd = hostapd.add_ap(apdev[0], { "ssid": "unknown-action" })
|
||||||
|
dev[0].connect("unknown-action", key_mgmt="NONE", scan_freq="2412")
|
||||||
|
bssid = hapd.own_addr()
|
||||||
|
addr = dev[0].own_addr()
|
||||||
|
|
||||||
|
hapd.set("ext_mgmt_frame_handling", "1")
|
||||||
|
|
||||||
|
# Unicast Action frame with unknown category (response expected)
|
||||||
|
msg = {}
|
||||||
|
msg['fc'] = MGMT_SUBTYPE_ACTION << 4
|
||||||
|
msg['da'] = addr
|
||||||
|
msg['sa'] = bssid
|
||||||
|
msg['bssid'] = bssid
|
||||||
|
msg['payload'] = struct.pack("<BB", 0x70, 0)
|
||||||
|
hapd.mgmt_tx(msg)
|
||||||
|
expect_ack(hapd)
|
||||||
|
|
||||||
|
# Note: mac80211 does not allow group-addressed Action frames in unknown
|
||||||
|
# categories to be transmitted in AP mode, so for now, these steps are
|
||||||
|
# commented out.
|
||||||
|
|
||||||
|
# Multicast Action frame with unknown category (no response expected)
|
||||||
|
#msg['da'] = "01:ff:ff:ff:ff:ff"
|
||||||
|
#msg['payload'] = struct.pack("<BB", 0x71, 1)
|
||||||
|
#hapd.mgmt_tx(msg)
|
||||||
|
#expect_no_ack(hapd)
|
||||||
|
|
||||||
|
# Broadcast Action frame with unknown category (no response expected)
|
||||||
|
#msg['da'] = "ff:ff:ff:ff:ff:ff"
|
||||||
|
#msg['payload'] = struct.pack("<BB", 0x72, 2)
|
||||||
|
#hapd.mgmt_tx(msg)
|
||||||
|
#expect_no_ack(hapd)
|
||||||
|
|
||||||
|
# Unicast Action frame with error indication category (no response expected)
|
||||||
|
msg['da'] = addr
|
||||||
|
msg['payload'] = struct.pack("<BB", 0xf3, 3)
|
||||||
|
hapd.mgmt_tx(msg)
|
||||||
|
expect_ack(hapd)
|
||||||
|
|
||||||
|
# Unicast Action frame with unknown category (response expected)
|
||||||
|
msg['da'] = addr
|
||||||
|
msg['payload'] = struct.pack("<BB", 0x74, 4)
|
||||||
|
hapd.mgmt_tx(msg)
|
||||||
|
expect_ack(hapd)
|
||||||
|
|
||||||
|
out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
|
||||||
|
"wlan.sa == %s && wlan.fc.type_subtype == 0x0d" % addr,
|
||||||
|
display=["wlan_mgt.fixed.category_code"])
|
||||||
|
res = out.splitlines()
|
||||||
|
categ = [ int(x) for x in res ]
|
||||||
|
|
||||||
|
if 0xf2 in categ or 0xf3 in categ:
|
||||||
|
raise Exception("Unexpected Action frame rejection: " + str(categ))
|
||||||
|
if 0xf0 not in categ or 0xf4 not in categ:
|
||||||
|
raise Exception("Action frame rejection missing: " + str(categ))
|
||||||
|
|
Loading…
Reference in a new issue