]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: Add RSSI based association rejection tests
authorBeni Lev <beni.lev@intel.com>
Mon, 21 Aug 2017 16:43:55 +0000 (19:43 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 1 Jan 2019 16:18:53 +0000 (18:18 +0200)
Signed-off-by: Beni Lev <beni.lev@intel.com>
tests/hwsim/test_oce.py [new file with mode: 0644]

diff --git a/tests/hwsim/test_oce.py b/tests/hwsim/test_oce.py
new file mode 100644 (file)
index 0000000..041ad15
--- /dev/null
@@ -0,0 +1,153 @@
+# OCE tests
+# Copyright (c) 2016, Intel Deutschland GmbH
+#
+# This software may be distributed under the terms of the BSD license.
+# See README for more details.
+
+import logging
+logger = logging.getLogger()
+
+import hostapd
+
+from hwsim_utils import set_rx_rssi, reset_rx_rssi
+import time
+import os
+from datetime import datetime
+from utils import HwsimSkip
+
+def check_set_tx_power(dev, apdev):
+    hapd = hostapd.add_ap(apdev[0], {'ssid' : 'check_tx_power'})
+    set_rx_rssi(hapd, -50)
+
+    dev[0].scan(freq=2412)
+    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 2)
+
+    res = dev[0].request("SCAN_RESULTS")
+    if '-50' not in res:
+        raise HwsimSkip('set_rx_rssi not supported')
+
+    reset_rx_rssi(hapd)
+
+    dev[0].scan(freq=2412)
+    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 2)
+
+    res = dev[0].request("SCAN_RESULTS")
+    if '-30' not in res:
+        raise HwsimSkip('set_rx_rssi not supported')
+
+def run_rssi_based_assoc_rej_timeout(dev, apdev, params):
+    rssi_retry_to = 5
+
+    ap_params = { 'ssid': "test-RSSI-ar-to",
+                  'rssi_reject_assoc_rssi': '-45',
+                  'rssi_reject_assoc_timeout': str(rssi_retry_to) }
+
+    logger.info("Set APs RSSI rejection threshold to -45 dBm, retry timeout: " +
+                str(rssi_retry_to))
+    hapd = hostapd.add_ap(apdev[0], ap_params)
+
+    logger.info("Set STAs TX RSSI to -50")
+    set_rx_rssi(dev[0], -50)
+
+    logger.info("STA is trying to connect")
+    dev[0].connect("test-RSSI-ar-to", key_mgmt="NONE", scan_freq="2412",
+                   wait_connect=False)
+
+    ev = dev[0].wait_event(['CTRL-EVENT-ASSOC-REJECT'], 2)
+    if ev is None:
+        raise Exception("Association not rejected")
+    if 'status_code=34' not in ev:
+        raise Exception("STA assoc request was not rejected with status code 34: " + ev);
+    t_rej = datetime.now()
+
+    # Set the scan interval to make dev[0] look for connections
+    if 'OK' not in dev[0].request("SCAN_INTERVAL 1"):
+        raise Exception("Failed to set scan interval")
+
+    logger.info("Validate that STA did not connect or sent assoc request within retry timeout")
+    ev = dev[0].wait_event(['CTRL-EVENT-CONNECTED', 'CTRL-EVENT-ASSOC-REJECT'],
+                           rssi_retry_to + 2)
+    t_ev = datetime.now()
+
+    if ((t_ev - t_rej).total_seconds() < rssi_retry_to):
+        raise Exception("STA sent assoc request within retry timeout")
+
+    if 'CTRL-EVENT-CONNECTED' in ev:
+        raise Exception("STA connected with low RSSI")
+
+    if not ev:
+        raise Exception("STA didn't send association request after retry timeout!")
+
+def test_rssi_based_assoc_rej_timeout(dev, apdev, params):
+    """RSSI-based association rejection: no assoc request during retry timeout"""
+    check_set_tx_power(dev, apdev)
+    try:
+        run_rssi_based_assoc_rej_timeout(dev, apdev, params)
+    finally:
+        reset_rx_rssi(dev[0])
+        dev[0].request("SCAN_INTERVAL 5")
+
+def run_rssi_based_assoc_rej_good_rssi(dev, apdev):
+    ap_params = { 'ssid': "test-RSSI-ar-to",
+                  'rssi_reject_assoc_rssi': '-45',
+                  'rssi_reject_assoc_timeout': '60' }
+
+    logger.info("Set APs RSSI rejection threshold to -45 dBm")
+    hapd = hostapd.add_ap(apdev[0], ap_params)
+
+    logger.info("Set STAs TX RSSI to -45")
+    set_rx_rssi(dev[0], -45)
+
+    logger.info("STA is trying to connect")
+    dev[0].connect("test-RSSI-ar-to", key_mgmt="NONE", scan_freq="2412")
+
+def test_rssi_based_assoc_rej_good_rssi(dev, apdev):
+    """RSSI-based association rejection: STA with RSSI above the threshold connects"""
+    check_set_tx_power(dev, apdev)
+    try:
+        run_rssi_based_assoc_rej_good_rssi(dev, apdev)
+    finally:
+        reset_rx_rssi(dev[0])
+
+def run_rssi_based_assoc_rssi_change(dev, hapd):
+    logger.info("Set STAs and APs TX RSSI to -50")
+    set_rx_rssi(dev[0], -50)
+    set_rx_rssi(hapd, -50)
+
+    # Set the scan interval to make dev[0] look for connections
+    if 'OK' not in dev[0].request("SCAN_INTERVAL 1"):
+        raise Exception("Failed to set scan interval")
+
+    logger.info("STA is trying to connect")
+    dev[0].connect("test-RSSI-ar-to", key_mgmt="NONE", scan_freq="2412",
+                   wait_connect=False)
+
+    try:
+        dev[0].wait_completed(2)
+    except:
+        logger.info("STA didn't connect after 2 seconds.")
+    else:
+        raise Exception("STA connected with low RSSI")
+
+    logger.info("Set STAs and APs TX RSSI to -40dBm, validate that STA connects")
+    set_rx_rssi(dev[0], -40)
+    set_rx_rssi(hapd, -40)
+
+    dev[0].wait_completed(2)
+
+def test_rssi_based_assoc_rssi_change(dev, apdev):
+    """RSSI-based association rejection: connect after improving RSSI"""
+    check_set_tx_power(dev, apdev)
+    try:
+        ap_params = { 'ssid': "test-RSSI-ar-to",
+                      'rssi_reject_assoc_rssi': '-45',
+                      'rssi_reject_assoc_timeout': '60' }
+
+        logger.info("Set APs RSSI rejection threshold to -45 dBm, retry timeout: 60")
+        hapd = hostapd.add_ap(apdev[0], ap_params)
+
+        run_rssi_based_assoc_rssi_change(dev, hapd)
+    finally:
+        reset_rx_rssi(dev[0])
+        reset_rx_rssi(hapd)
+        dev[0].request("SCAN_INTERVAL 5")