2013-12-30 23:17:02 +01:00
|
|
|
# AP mode using the older monitor interface design
|
|
|
|
# Copyright (c) 2013, Jouni Malinen <j@w1.fi>
|
|
|
|
#
|
|
|
|
# This software may be distributed under the terms of the BSD license.
|
|
|
|
# See README for more details.
|
|
|
|
|
2020-03-18 22:15:18 +01:00
|
|
|
import binascii
|
2016-06-23 19:16:36 +02:00
|
|
|
from remotehost import remote_compatible
|
2013-12-30 23:17:02 +01:00
|
|
|
import logging
|
|
|
|
logger = logging.getLogger()
|
|
|
|
import time
|
|
|
|
|
|
|
|
import hwsim_utils
|
|
|
|
import hostapd
|
|
|
|
from wpasupplicant import WpaSupplicant
|
2020-03-18 22:15:18 +01:00
|
|
|
from utils import radiotap_build, start_monitor, stop_monitor
|
2013-12-30 23:17:02 +01:00
|
|
|
|
|
|
|
def test_monitor_iface_open(dev, apdev):
|
|
|
|
"""Open connection using cfg80211 monitor interface on AP"""
|
|
|
|
wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
|
|
|
|
wpas.interface_add("wlan5", drv_params="use_monitor=1")
|
|
|
|
id = wpas.add_network()
|
|
|
|
wpas.set_network(id, "mode", "2")
|
|
|
|
wpas.set_network_quoted(id, "ssid", "monitor-iface")
|
|
|
|
wpas.set_network(id, "key_mgmt", "NONE")
|
|
|
|
wpas.set_network(id, "frequency", "2412")
|
|
|
|
wpas.connect_network(id)
|
|
|
|
|
|
|
|
dev[0].connect("monitor-iface", key_mgmt="NONE", scan_freq="2412")
|
|
|
|
|
|
|
|
def test_monitor_iface_wpa2_psk(dev, apdev):
|
|
|
|
"""WPA2-PSK connection using cfg80211 monitor interface on AP"""
|
|
|
|
wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
|
|
|
|
wpas.interface_add("wlan5", drv_params="use_monitor=1")
|
|
|
|
id = wpas.add_network()
|
|
|
|
wpas.set_network(id, "mode", "2")
|
|
|
|
wpas.set_network_quoted(id, "ssid", "monitor-iface-wpa2")
|
|
|
|
wpas.set_network(id, "proto", "WPA2")
|
|
|
|
wpas.set_network(id, "key_mgmt", "WPA-PSK")
|
|
|
|
wpas.set_network_quoted(id, "psk", "12345678")
|
|
|
|
wpas.set_network(id, "pairwise", "CCMP")
|
|
|
|
wpas.set_network(id, "group", "CCMP")
|
|
|
|
wpas.set_network(id, "frequency", "2412")
|
|
|
|
wpas.connect_network(id)
|
|
|
|
|
|
|
|
dev[0].connect("monitor-iface-wpa2", psk="12345678", scan_freq="2412")
|
2014-11-29 12:33:08 +01:00
|
|
|
|
|
|
|
def test_monitor_iface_multi_bss(dev, apdev):
|
|
|
|
"""AP mode mmonitor interface with hostapd multi-BSS setup"""
|
2019-03-15 11:10:37 +01:00
|
|
|
params = {"ssid": "monitor-iface", "driver_params": "use_monitor=1"}
|
2016-03-30 10:55:56 +02:00
|
|
|
hapd = hostapd.add_ap(apdev[0], params)
|
2016-04-07 07:38:02 +02:00
|
|
|
hostapd.add_bss(apdev[0], apdev[0]['ifname'] + '-2', 'bss-2.conf')
|
2014-11-29 12:33:08 +01:00
|
|
|
dev[0].connect("monitor-iface", key_mgmt="NONE", scan_freq="2412")
|
|
|
|
dev[1].connect("bss-2", key_mgmt="NONE", scan_freq="2412")
|
|
|
|
|
2016-06-23 19:16:36 +02:00
|
|
|
@remote_compatible
|
2014-11-29 12:33:08 +01:00
|
|
|
def test_monitor_iface_unknown_sta(dev, apdev):
|
|
|
|
"""AP mode monitor interface and Data frame from unknown STA"""
|
|
|
|
ssid = "monitor-iface-pmf"
|
|
|
|
passphrase = "12345678"
|
|
|
|
params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
|
|
|
|
params["wpa_key_mgmt"] = "WPA-PSK-SHA256"
|
|
|
|
params["ieee80211w"] = "2"
|
|
|
|
params['driver_params'] = "use_monitor=1"
|
2016-03-30 10:55:56 +02:00
|
|
|
hapd = hostapd.add_ap(apdev[0], params)
|
2014-11-29 12:33:08 +01:00
|
|
|
|
|
|
|
bssid = apdev[0]['bssid']
|
|
|
|
addr = dev[0].p2p_interface_addr()
|
|
|
|
dev[0].connect(ssid, psk=passphrase, ieee80211w="2",
|
|
|
|
key_mgmt="WPA-PSK-SHA256", proto="WPA2",
|
|
|
|
scan_freq="2412")
|
|
|
|
dev[0].request("DROP_SA")
|
|
|
|
# This protected Deauth will be ignored by the STA
|
|
|
|
hapd.request("DEAUTHENTICATE " + addr)
|
|
|
|
# But the unprotected Deauth from TX frame-from-unassoc-STA will now be
|
|
|
|
# processed
|
2020-03-18 22:15:18 +01:00
|
|
|
try:
|
|
|
|
sock = start_monitor(apdev[1]["ifname"])
|
|
|
|
radiotap = radiotap_build()
|
|
|
|
|
|
|
|
bssid = hapd.own_addr().replace(':', '')
|
|
|
|
addr = dev[0].own_addr().replace(':', '')
|
|
|
|
|
|
|
|
# Inject Data frame from STA to AP since we not have SA in place
|
|
|
|
# anymore for normal data TX
|
|
|
|
frame = binascii.unhexlify("48010000" + bssid + addr + bssid + "0000")
|
|
|
|
sock.send(radiotap + frame)
|
|
|
|
finally:
|
|
|
|
stop_monitor(apdev[1]["ifname"])
|
|
|
|
|
2014-11-29 12:33:08 +01:00
|
|
|
ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5)
|
|
|
|
if ev is None:
|
|
|
|
raise Exception("No disconnection")
|
2014-11-30 14:44:37 +01:00
|
|
|
dev[0].request("DISCONNECT")
|