+++ /dev/null
-driver=nl80211
-interface=wlan2
-
-hw_mode=g
-channel=1
-ieee80211n=1
-
-ctrl_interface=/var/run/hostapd
-ctrl_interface_group=admin
-
-ssid=test-wpa2-psk
-wpa=2
-wpa_key_mgmt=WPA-PSK
-wpa_pairwise=CCMP
-wpa_passphrase=12345678
--- /dev/null
+#!/usr/bin/python
+#
+# Python class for controlling hostapd
+# 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.
+
+import os
+import time
+import logging
+import wpaspy
+
+logger = logging.getLogger(__name__)
+hapd_ctrl = '/var/run/hostapd'
+hapd_global = 'hostapd-global'
+
+class HostapdGlobal:
+ def __init__(self):
+ self.ctrl = wpaspy.Ctrl(hapd_global)
+
+ def add(self, ifname):
+ res = self.ctrl.request("ADD " + ifname + " " + hapd_ctrl)
+ if not "OK" in res:
+ raise Exception("Could not add hostapd interface " + ifname)
+
+ def remove(self, ifname):
+ self.ctrl.request("REMOVE " + ifname)
+
+
+class Hostapd:
+ def __init__(self, ifname):
+ self.ifname = ifname
+ self.ctrl = wpaspy.Ctrl(os.path.join(hapd_ctrl, ifname))
+
+ def request(self, cmd):
+ logger.debug(self.ifname + ": CTRL: " + cmd)
+ return self.ctrl.request(cmd)
+
+ def ping(self):
+ return "PONG" in self.request("PING")
+
+ def set(self, field, value):
+ logger.debug(self.ifname + ": SET " + field + "=" + value)
+ if not "OK" in self.request("SET " + field + " " + value):
+ raise Exception("Failed to set hostapd parameter " + field)
+
+ def set_defaults(self):
+ self.set("driver", "nl80211")
+ self.set("hw_mode", "g")
+ self.set("channel", "1")
+ self.set("ieee80211n", "1")
+
+ def set_open(self, ssid):
+ self.set_defaults()
+ self.set("ssid", ssid)
+
+ def set_wpa2_psk(self, ssid, passphrase):
+ self.set_defaults()
+ self.set("ssid", ssid)
+ self.set("wpa_passphrase", passphrase)
+ self.set("wpa", "2")
+ self.set("wpa_key_mgmt", "WPA-PSK")
+ self.set("rsn_pairwise", "CCMP")
+
+ def enable(self):
+ if not "OK" in self.ctrl.request("ENABLE"):
+ raise Exception("Failed to enable hostapd interface " + self.ifname)
+
+ def disable(self):
+ if not "OK" in self.ctrl.request("ENABLE"):
+ raise Exception("Failed to disable hostapd interface " + self.ifname)
#!/usr/bin/python
#
-# AP WPA2-PSK tests
+# AP tests
# Copyright (c) 2013, Jouni Malinen <j@w1.fi>
#
# This software may be distributed under the terms of the BSD license.
import logging
from wpasupplicant import WpaSupplicant
+from hostapd import HostapdGlobal
+
+def reset_devs(dev, hapd_ifaces):
+ for d in dev:
+ d.reset()
+ hapd = HostapdGlobal()
+ for h in hapd_ifaces:
+ hapd.remove(h)
def main():
idx = 1
dev0 = WpaSupplicant('wlan0')
dev1 = WpaSupplicant('wlan1')
dev = [ dev0, dev1 ]
+ hapd_ifaces = [ 'wlan2', 'wlan3' ]
for d in dev:
if not d.ping():
#if test_filter not in t.__name__:
if test_filter != t.__name__:
continue
- for d in dev:
- d.reset()
+ reset_devs(dev, hapd_ifaces)
print "START " + t.__name__
if t.__doc__:
print "Test: " + t.__doc__
d.request("NOTE TEST-STOP " + t.__name__)
if not test_filter:
- for d in dev:
- d.reset()
+ reset_devs(dev, hapd_ifaces)
print "passed tests: " + str(passed)
print "failed tests: " + str(failed)
WLANTEST=$DIR/../../wlantest/wlantest
$DIR/stop-wifi.sh
-sudo modprobe mac80211_hwsim radios=3
+sudo modprobe mac80211_hwsim radios=4
mkdir -p $DIR/logs
DATE=`date +%s`
sudo ifconfig hwsim0 up
sudo $WLANTEST -i hwsim0 -c -d > $DIR/logs/$DATE-hwsim0 &
sudo $WPAS -Dnl80211 -iwlan0 -c $DIR/p2p0.conf -ddKt > $DIR/logs/$DATE-log0 &
sudo $WPAS -Dnl80211 -iwlan1 -c $DIR/p2p1.conf -ddKt > $DIR/logs/$DATE-log1 &
-sudo $HAPD -ddKt $DIR/ap-wpa2-psk.conf -ddKt > $DIR/logs/$DATE-log2 &
+sudo $HAPD -ddKt -g $DIR/hostapd-global -G admin -ddKt > $DIR/logs/$DATE-hostapd &
sleep 1
logger = logging.getLogger(__name__)
import hwsim_utils
+from hostapd import HostapdGlobal
+from hostapd import Hostapd
+
+ap_ifname = 'wlan2'
+
+def start_ap_wpa2_psk(ifname):
+ logger.info("Starting WPA2-PSK AP " + ifname)
+ hapd_global = HostapdGlobal()
+ hapd_global.add(ifname)
+ hapd = Hostapd(ifname)
+ if not hapd.ping():
+ raise Exception("Could not ping hostapd")
+ hapd.set_wpa2_psk("test-wpa2-psk", "12345678")
+ hapd.enable()
def connect_sta(sta):
logger.info("Connect STA " + sta.ifname + " to AP")
def test_ap_wpa2_tdls(dev):
"""WPA2-PSK AP and two stations using TDLS"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_concurrent_init(dev):
"""Concurrent TDLS setup initiation"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_concurrent_init2(dev):
"""Concurrent TDLS setup initiation (reverse)"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_decline_resp(dev):
"""Decline TDLS Setup Response"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_long_lifetime(dev):
"""TDLS with long TPK lifetime"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_long_frame(dev):
"""TDLS with long setup/teardown frames"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_reneg(dev):
"""Renegotiate TDLS link"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_wrong_lifetime_resp(dev):
"""Incorrect TPK lifetime in TDLS Setup Response"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)
def test_ap_wpa2_tdls_diff_rsnie(dev):
"""TDLS with different RSN IEs"""
+ start_ap_wpa2_psk(ap_ifname)
bssid = "02:00:00:00:02:00"
wlantest_setup()
connect_2sta(dev)