diff --git a/tests/hwsim/test_ap_csa.py b/tests/hwsim/test_ap_csa.py new file mode 100644 index 000000000..0c26a3b83 --- /dev/null +++ b/tests/hwsim/test_ap_csa.py @@ -0,0 +1,116 @@ +# AP CSA tests +# Copyright (c) 2013, Luciano Coelho +# +# This software may be distributed under the terms of the BSD license. +# See README for more details. + +import time +import logging +logger = logging.getLogger() + +import hwsim_utils +import hostapd + +def connect(dev, apdev): + params = { "ssid": "ap-csa", + "channel": "1" } + ap = hostapd.add_ap(apdev[0]['ifname'], params) + dev.connect("ap-csa", key_mgmt="NONE") + return ap + +def switch_channel(ap, count, freq): + ap.request("CHAN_SWITCH " + str(count) + " " + str(freq)) + ev = ap.wait_event(["AP-CSA-FINISHED"], timeout=10) + if ev is None: + raise Exception("CSA finished event timed out") + if "freq=" + str(freq) not in ev: + raise Exception("Unexpected channel in CSA finished event") + time.sleep(0.1) + +# This function checks whether the provided dev, which may be either +# WpaSupplicant or Hostapd supports CSA. +def csa_supported(dev): + res = dev.get_driver_status() + return (int(res['capa.flags'], 0) & 0x80000000) != 0 + +def test_ap_csa_1_switch(dev, apdev): + """AP Channel Switch, one switch""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 10, 2462) + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + +def test_ap_csa_2_switches(dev, apdev): + """AP Channel Switch, two switches""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 10, 2462) + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 10, 2412) + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + +def test_ap_csa_1_switch_count_0(dev, apdev): + """AP Channel Switch, one switch with count 0""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 0, 2462) + # this does not result in CSA currently, so do not bother checking + # connectivity + +def test_ap_csa_2_switches_count_0(dev, apdev): + """AP Channel Switch, two switches with count 0""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 0, 2462) + # this does not result in CSA currently, so do not bother checking + # connectivity + switch_channel(ap, 0, 2412) + # this does not result in CSA currently, so do not bother checking + # connectivity + +def test_ap_csa_1_switch_count_1(dev, apdev): + """AP Channel Switch, one switch with count 1""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 1, 2462) + # this does not result in CSA currently, so do not bother checking + # connectivity + +def test_ap_csa_2_switches_count_1(dev, apdev): + """AP Channel Switch, two switches with count 1""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 1, 2462) + # this does not result in CSA currently, so do not bother checking + # connectivity + switch_channel(ap, 1, 2412) + # this does not result in CSA currently, so do not bother checking + # connectivity + +def test_ap_csa_1_switch_count_2(dev, apdev): + """AP Channel Switch, one switch with count 2""" + if not csa_supported(dev[0]): + return "skip" + ap = connect(dev[0], apdev) + + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) + switch_channel(ap, 2, 2462) + hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])