]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_oce.py
HE: MCS size is always a minimum of 4 bytes
[thirdparty/hostap.git] / tests / hwsim / test_oce.py
1 # OCE tests
2 # Copyright (c) 2016, Intel Deutschland GmbH
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import logging
8 logger = logging.getLogger()
9
10 import hostapd
11
12 from hwsim_utils import set_rx_rssi, reset_rx_rssi
13 import time
14 import os
15 from datetime import datetime
16 from utils import HwsimSkip
17
18 def check_set_tx_power(dev, apdev):
19 hapd = hostapd.add_ap(apdev[0], {'ssid': 'check_tx_power'})
20 set_rx_rssi(hapd, -50)
21
22 dev[0].scan(freq=2412)
23 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 2)
24
25 res = dev[0].request("SCAN_RESULTS")
26 if '-50' not in res:
27 raise HwsimSkip('set_rx_rssi not supported')
28
29 reset_rx_rssi(hapd)
30
31 dev[0].scan(freq=2412)
32 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 2)
33
34 res = dev[0].request("SCAN_RESULTS")
35 if '-30' not in res:
36 raise HwsimSkip('set_rx_rssi not supported')
37
38 def run_rssi_based_assoc_rej_timeout(dev, apdev, params):
39 rssi_retry_to = 5
40
41 ap_params = {'ssid': "test-RSSI-ar-to",
42 'rssi_reject_assoc_rssi': '-45',
43 'rssi_reject_assoc_timeout': str(rssi_retry_to)}
44
45 logger.info("Set APs RSSI rejection threshold to -45 dBm, retry timeout: " +
46 str(rssi_retry_to))
47 hapd = hostapd.add_ap(apdev[0], ap_params)
48
49 logger.info("Set STAs TX RSSI to -50")
50 set_rx_rssi(dev[0], -50)
51
52 logger.info("STA is trying to connect")
53 dev[0].connect("test-RSSI-ar-to", key_mgmt="NONE", scan_freq="2412",
54 wait_connect=False)
55
56 ev = dev[0].wait_event(['CTRL-EVENT-ASSOC-REJECT'], 2)
57 if ev is None:
58 raise Exception("Association not rejected")
59 if 'status_code=34' not in ev:
60 raise Exception("STA assoc request was not rejected with status code 34: " + ev)
61 t_rej = datetime.now()
62
63 # Set the scan interval to make dev[0] look for connections
64 if 'OK' not in dev[0].request("SCAN_INTERVAL 1"):
65 raise Exception("Failed to set scan interval")
66
67 logger.info("Validate that STA did not connect or sent assoc request within retry timeout")
68 ev = dev[0].wait_event(['CTRL-EVENT-CONNECTED', 'CTRL-EVENT-ASSOC-REJECT'],
69 rssi_retry_to + 2)
70 t_ev = datetime.now()
71
72 if ((t_ev - t_rej).total_seconds() < rssi_retry_to):
73 raise Exception("STA sent assoc request within retry timeout")
74
75 if 'CTRL-EVENT-CONNECTED' in ev:
76 raise Exception("STA connected with low RSSI")
77
78 if not ev:
79 raise Exception("STA didn't send association request after retry timeout!")
80
81 def test_rssi_based_assoc_rej_timeout(dev, apdev, params):
82 """RSSI-based association rejection: no assoc request during retry timeout"""
83 check_set_tx_power(dev, apdev)
84 try:
85 run_rssi_based_assoc_rej_timeout(dev, apdev, params)
86 finally:
87 reset_rx_rssi(dev[0])
88 dev[0].request("SCAN_INTERVAL 5")
89
90 def run_rssi_based_assoc_rej_good_rssi(dev, apdev):
91 ap_params = {'ssid': "test-RSSI-ar-to",
92 'rssi_reject_assoc_rssi': '-45',
93 'rssi_reject_assoc_timeout': '60'}
94
95 logger.info("Set APs RSSI rejection threshold to -45 dBm")
96 hapd = hostapd.add_ap(apdev[0], ap_params)
97
98 logger.info("Set STAs TX RSSI to -45")
99 set_rx_rssi(dev[0], -45)
100
101 logger.info("STA is trying to connect")
102 dev[0].connect("test-RSSI-ar-to", key_mgmt="NONE", scan_freq="2412")
103
104 def test_rssi_based_assoc_rej_good_rssi(dev, apdev):
105 """RSSI-based association rejection: STA with RSSI above the threshold connects"""
106 check_set_tx_power(dev, apdev)
107 try:
108 run_rssi_based_assoc_rej_good_rssi(dev, apdev)
109 finally:
110 reset_rx_rssi(dev[0])
111
112 def run_rssi_based_assoc_rssi_change(dev, hapd):
113 logger.info("Set STAs and APs TX RSSI to -50")
114 set_rx_rssi(dev[0], -50)
115 set_rx_rssi(hapd, -50)
116
117 # Set the scan interval to make dev[0] look for connections
118 if 'OK' not in dev[0].request("SCAN_INTERVAL 1"):
119 raise Exception("Failed to set scan interval")
120
121 logger.info("STA is trying to connect")
122 dev[0].connect("test-RSSI-ar-to", key_mgmt="NONE", scan_freq="2412",
123 wait_connect=False)
124
125 try:
126 dev[0].wait_completed(2)
127 except:
128 logger.info("STA didn't connect after 2 seconds.")
129 else:
130 raise Exception("STA connected with low RSSI")
131
132 logger.info("Set STAs and APs TX RSSI to -40dBm, validate that STA connects")
133 set_rx_rssi(dev[0], -40)
134 set_rx_rssi(hapd, -40)
135
136 dev[0].wait_completed(2)
137
138 def test_rssi_based_assoc_rssi_change(dev, apdev):
139 """RSSI-based association rejection: connect after improving RSSI"""
140 check_set_tx_power(dev, apdev)
141 try:
142 ap_params = {'ssid': "test-RSSI-ar-to",
143 'rssi_reject_assoc_rssi': '-45',
144 'rssi_reject_assoc_timeout': '60'}
145
146 logger.info("Set APs RSSI rejection threshold to -45 dBm, retry timeout: 60")
147 hapd = hostapd.add_ap(apdev[0], ap_params)
148
149 run_rssi_based_assoc_rssi_change(dev, hapd)
150 finally:
151 reset_rx_rssi(dev[0])
152 reset_rx_rssi(hapd)
153 dev[0].request("SCAN_INTERVAL 5")
154
155 def test_oce_ap(dev, apdev):
156 """OCE AP"""
157 ssid = "test-oce"
158 passphrase = 'qwertyuiop'
159 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
160 params['ieee80211w'] = "1"
161 params['mbo'] = "1"
162 params['oce'] = "4"
163 hapd = hostapd.add_ap(apdev[0], params)
164 dev[0].connect(ssid, psk=passphrase, ieee80211w="1", scan_freq="2412")