]>
Commit | Line | Data |
---|---|---|
31ec9faf | 1 | # bgscan tests |
479c05b0 | 2 | # Copyright (c) 2014-2017, Jouni Malinen <j@w1.fi> |
31ec9faf JM |
3 | # |
4 | # This software may be distributed under the terms of the BSD license. | |
5 | # See README for more details. | |
6 | ||
7 | import time | |
8 | import logging | |
9 | logger = logging.getLogger() | |
10 | import os | |
11 | ||
12 | import hostapd | |
479c05b0 | 13 | from utils import alloc_fail, fail_test |
31ec9faf JM |
14 | |
15 | def test_bgscan_simple(dev, apdev): | |
16 | """bgscan_simple""" | |
fab49f61 JM |
17 | hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
18 | hostapd.add_ap(apdev[1], {"ssid": "bgscan"}) | |
31ec9faf JM |
19 | |
20 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
21 | bgscan="simple:1:-20:2") | |
22 | dev[1].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
23 | bgscan="simple:1:-45:2") | |
24 | ||
c975e1c1 JM |
25 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", |
26 | bgscan="simple:1:-45") | |
27 | dev[2].request("REMOVE_NETWORK all") | |
28 | dev[2].wait_disconnected() | |
29 | ||
30 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
31 | bgscan="simple:0:0") | |
32 | dev[2].request("REMOVE_NETWORK all") | |
33 | dev[2].wait_disconnected() | |
34 | ||
35 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
36 | bgscan="simple") | |
37 | dev[2].request("REMOVE_NETWORK all") | |
38 | dev[2].wait_disconnected() | |
39 | ||
40 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
41 | bgscan="simple:1") | |
42 | dev[2].request("REMOVE_NETWORK all") | |
43 | dev[2].wait_disconnected() | |
44 | ||
31ec9faf JM |
45 | ev = dev[0].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) |
46 | if ev is None: | |
47 | raise Exception("dev0 did not indicate signal change event") | |
48 | if "above=0" not in ev: | |
49 | raise Exception("Unexpected signal change event contents from dev0: " + ev) | |
50 | ||
51 | ev = dev[1].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) | |
52 | if ev is None: | |
53 | raise Exception("dev1 did not indicate signal change event") | |
54 | if "above=1" not in ev: | |
55 | raise Exception("Unexpected signal change event contents from dev1: " + ev) | |
56 | ||
57 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=3) | |
58 | if ev is None: | |
59 | raise Exception("dev0 did not start a scan") | |
60 | ||
61 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=3) | |
62 | if ev is None: | |
63 | raise Exception("dev1 did not start a scan") | |
64 | ||
65 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5) | |
66 | if ev is None: | |
67 | raise Exception("dev0 did not complete a scan") | |
68 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5) | |
69 | if ev is None: | |
70 | raise Exception("dev1 did not complete a scan") | |
71 | ||
479c05b0 JM |
72 | def test_bgscan_simple_beacon_loss(dev, apdev): |
73 | """bgscan_simple and beacon loss""" | |
fab49f61 | 74 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
75 | |
76 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
77 | bgscan="simple:1:-20:2") | |
78 | hapd.set("ext_mgmt_frame_handling", "1") | |
79 | if "OK" not in hapd.request("STOP_AP"): | |
80 | raise Exception("Failed to stop AP") | |
81 | ev = dev[0].wait_event(["CTRL-EVENT-BEACON-LOSS"], timeout=10) | |
82 | if ev is None: | |
83 | raise Exception("Beacon loss not reported") | |
84 | ||
85 | def test_bgscan_simple_scan_failure(dev, apdev): | |
86 | """bgscan_simple and scan failure""" | |
fab49f61 | 87 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
88 | |
89 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
90 | bgscan="simple:1:-20:2") | |
91 | with alloc_fail(dev[0], 1, | |
92 | "wpa_supplicant_trigger_scan;bgscan_simple_timeout"): | |
93 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=10) | |
94 | if ev is None: | |
95 | raise Exception("No scan failure reported") | |
96 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) | |
97 | if ev is None: | |
98 | raise Exception("Scanning not continued after failure") | |
99 | ||
100 | def test_bgscan_simple_scanning(dev, apdev): | |
101 | """bgscan_simple and scanning behavior""" | |
fab49f61 | 102 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
103 | |
104 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
105 | bgscan="simple:1:-20:2") | |
106 | # Go through seven bgscan_simple_timeout calls for code coverage. This falls | |
107 | # back from short to long scan interval and then reduces short_scan_count | |
108 | # back to zero. | |
109 | for i in range(7): | |
110 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) | |
111 | if ev is None: | |
112 | raise Exception("Scanning not continued") | |
113 | ||
114 | def test_bgscan_simple_same_scan_int(dev, apdev): | |
115 | """bgscan_simple and same short/long scan interval""" | |
fab49f61 | 116 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
117 | |
118 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
119 | bgscan="simple:1:-20:1") | |
120 | for i in range(2): | |
121 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) | |
122 | if ev is None: | |
123 | raise Exception("Scanning not continued") | |
124 | ||
125 | def test_bgscan_simple_oom(dev, apdev): | |
126 | """bgscan_simple OOM""" | |
fab49f61 | 127 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
128 | |
129 | with alloc_fail(dev[0], 1, "bgscan_simple_init"): | |
130 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
131 | bgscan="simple:1:-20:2") | |
132 | ||
133 | def test_bgscan_simple_driver_conf_failure(dev, apdev): | |
134 | """bgscan_simple driver configuration failure""" | |
fab49f61 | 135 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
136 | |
137 | with fail_test(dev[0], 1, "bgscan_simple_init"): | |
138 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
139 | bgscan="simple:1:-20:2") | |
140 | ||
31ec9faf JM |
141 | def test_bgscan_learn(dev, apdev): |
142 | """bgscan_learn""" | |
fab49f61 JM |
143 | hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
144 | hostapd.add_ap(apdev[1], {"ssid": "bgscan"}) | |
31ec9faf JM |
145 | |
146 | try: | |
147 | os.remove("/tmp/test_bgscan_learn.bgscan") | |
148 | except: | |
149 | pass | |
150 | ||
151 | try: | |
152 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
153 | bgscan="learn:1:-20:2") | |
c975e1c1 JM |
154 | id = dev[1].connect("bgscan", key_mgmt="NONE", scan_freq="2412", |
155 | bgscan="learn:1:-45:2:/tmp/test_bgscan_learn.bgscan") | |
156 | ||
157 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
158 | bgscan="learn:1:-45") | |
159 | dev[2].request("REMOVE_NETWORK all") | |
160 | dev[2].wait_disconnected() | |
161 | ||
162 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
163 | bgscan="learn:0:0") | |
164 | dev[2].request("REMOVE_NETWORK all") | |
165 | dev[2].wait_disconnected() | |
166 | ||
167 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
168 | bgscan="learn") | |
169 | dev[2].request("REMOVE_NETWORK all") | |
170 | dev[2].wait_disconnected() | |
171 | ||
172 | dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
173 | bgscan="learn:1") | |
174 | dev[2].request("REMOVE_NETWORK all") | |
175 | dev[2].wait_disconnected() | |
31ec9faf JM |
176 | |
177 | ev = dev[0].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) | |
178 | if ev is None: | |
179 | raise Exception("dev0 did not indicate signal change event") | |
180 | if "above=0" not in ev: | |
181 | raise Exception("Unexpected signal change event contents from dev0: " + ev) | |
182 | ||
183 | ev = dev[1].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) | |
184 | if ev is None: | |
185 | raise Exception("dev1 did not indicate signal change event") | |
186 | if "above=1" not in ev: | |
187 | raise Exception("Unexpected signal change event contents from dev1: " + ev) | |
188 | ||
189 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=3) | |
190 | if ev is None: | |
191 | raise Exception("dev0 did not start a scan") | |
192 | ||
193 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=3) | |
194 | if ev is None: | |
195 | raise Exception("dev1 did not start a scan") | |
196 | ||
197 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5) | |
198 | if ev is None: | |
199 | raise Exception("dev0 did not complete a scan") | |
200 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5) | |
201 | if ev is None: | |
202 | raise Exception("dev1 did not complete a scan") | |
203 | ||
204 | dev[0].request("DISCONNECT") | |
205 | dev[1].request("DISCONNECT") | |
206 | dev[0].request("REMOVE_NETWORK all") | |
31ec9faf JM |
207 | |
208 | with open("/tmp/test_bgscan_learn.bgscan", "r") as f: | |
209 | lines = f.read().splitlines() | |
210 | if lines[0] != "wpa_supplicant-bgscan-learn": | |
211 | raise Exception("Unexpected bgscan header line") | |
212 | if 'BSS 02:00:00:00:03:00 2412' not in lines: | |
213 | raise Exception("Missing BSS1") | |
214 | if 'BSS 02:00:00:00:04:00 2412' not in lines: | |
215 | raise Exception("Missing BSS2") | |
216 | if 'NEIGHBOR 02:00:00:00:03:00 02:00:00:00:04:00' not in lines: | |
217 | raise Exception("Missing BSS1->BSS2 neighbor entry") | |
218 | if 'NEIGHBOR 02:00:00:00:04:00 02:00:00:00:03:00' not in lines: | |
219 | raise Exception("Missing BSS2->BSS1 neighbor entry") | |
c975e1c1 JM |
220 | |
221 | dev[1].set_network(id, "scan_freq", "") | |
222 | dev[1].connect_network(id) | |
223 | ||
224 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=10) | |
225 | if ev is None: | |
226 | raise Exception("dev1 did not start a scan") | |
227 | ||
228 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) | |
229 | if ev is None: | |
230 | raise Exception("dev1 did not complete a scan") | |
231 | ||
232 | dev[1].request("REMOVE_NETWORK all") | |
31ec9faf JM |
233 | finally: |
234 | try: | |
235 | os.remove("/tmp/test_bgscan_learn.bgscan") | |
236 | except: | |
237 | pass | |
479c05b0 JM |
238 | |
239 | def test_bgscan_learn_beacon_loss(dev, apdev): | |
240 | """bgscan_simple and beacon loss""" | |
fab49f61 | 241 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
242 | |
243 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
244 | bgscan="learn:1:-20:2") | |
245 | hapd.set("ext_mgmt_frame_handling", "1") | |
246 | if "OK" not in hapd.request("STOP_AP"): | |
247 | raise Exception("Failed to stop AP") | |
248 | ev = dev[0].wait_event(["CTRL-EVENT-BEACON-LOSS"], timeout=10) | |
249 | if ev is None: | |
250 | raise Exception("Beacon loss not reported") | |
251 | ||
252 | def test_bgscan_learn_scan_failure(dev, apdev): | |
253 | """bgscan_learn and scan failure""" | |
fab49f61 | 254 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
255 | |
256 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
257 | bgscan="learn:1:-20:2") | |
258 | with alloc_fail(dev[0], 1, | |
259 | "wpa_supplicant_trigger_scan;bgscan_learn_timeout"): | |
260 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-FAILED"], timeout=10) | |
261 | if ev is None: | |
262 | raise Exception("No scan failure reported") | |
263 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) | |
264 | if ev is None: | |
265 | raise Exception("Scanning not continued after failure") | |
266 | ||
267 | def test_bgscan_learn_oom(dev, apdev): | |
268 | """bgscan_learn OOM""" | |
fab49f61 | 269 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
270 | |
271 | with alloc_fail(dev[0], 1, "bgscan_learn_init"): | |
272 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
273 | bgscan="learn:1:-20:2") | |
274 | ||
275 | def test_bgscan_learn_driver_conf_failure(dev, apdev): | |
276 | """bgscan_learn driver configuration failure""" | |
fab49f61 | 277 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
278 | |
279 | with fail_test(dev[0], 1, "bgscan_learn_init"): | |
280 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", | |
281 | bgscan="learn:1:-20:2") | |
282 | ||
283 | def test_bgscan_unknown_module(dev, apdev): | |
284 | """bgscan init failing due to unknown module""" | |
fab49f61 | 285 | hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) |
479c05b0 JM |
286 | dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", |
287 | bgscan="unknown:-20:2") |