]>
Commit | Line | Data |
---|---|---|
8454e1fd | 1 | # Test cases for DFS |
df71e160 | 2 | # Copyright (c) 2013-2019, Jouni Malinen <j@w1.fi> |
8454e1fd JM |
3 | # |
4 | # This software may be distributed under the terms of the BSD license. | |
5 | # See README for more details. | |
6 | ||
9fd6804d | 7 | from remotehost import remote_compatible |
8454e1fd JM |
8 | import os |
9 | import subprocess | |
10 | import time | |
11 | import logging | |
12 | logger = logging.getLogger() | |
13 | ||
14 | import hwsim_utils | |
15 | import hostapd | |
df71e160 | 16 | from utils import * |
8454e1fd JM |
17 | |
18 | def wait_dfs_event(hapd, event, timeout): | |
fab49f61 JM |
19 | dfs_events = ["DFS-RADAR-DETECTED", "DFS-NEW-CHANNEL", |
20 | "DFS-CAC-START", "DFS-CAC-COMPLETED", | |
21 | "DFS-NOP-FINISHED", "AP-ENABLED", "AP-CSA-FINISHED"] | |
8454e1fd JM |
22 | ev = hapd.wait_event(dfs_events, timeout=timeout) |
23 | if not ev: | |
24 | raise Exception("DFS event timed out") | |
bc86d8c1 | 25 | if event and event not in ev: |
9a3eba46 | 26 | raise Exception("Unexpected DFS event: " + ev + " (expected: %s)" % event) |
8454e1fd JM |
27 | return ev |
28 | ||
91588eeb | 29 | def start_dfs_ap(ap, ssid="dfs", ht=True, ht40=False, |
803d0190 | 30 | ht40minus=False, vht80=False, vht20=False, chanlist=None, |
9c244b54 JM |
31 | channel=None, country="FI", rrm_beacon_report=False, |
32 | chan100=False): | |
8454e1fd | 33 | ifname = ap['ifname'] |
8454e1fd | 34 | logger.info("Starting AP " + ifname + " on DFS channel") |
b29c46be | 35 | hapd = hostapd.add_ap(ap, {}, no_enable=True) |
bd5a7691 | 36 | hapd.set("ssid", ssid) |
9cd52ac3 | 37 | hapd.set("country_code", country) |
8454e1fd JM |
38 | hapd.set("ieee80211d", "1") |
39 | hapd.set("ieee80211h", "1") | |
40 | hapd.set("hw_mode", "a") | |
9c244b54 JM |
41 | if chan100: |
42 | hapd.set("channel", "100") | |
43 | else: | |
44 | hapd.set("channel", "52") | |
d92da8a2 JM |
45 | if not ht: |
46 | hapd.set("ieee80211n", "0") | |
bd5a7691 JM |
47 | if ht40: |
48 | hapd.set("ht_capab", "[HT40+]") | |
d92da8a2 JM |
49 | elif ht40minus: |
50 | hapd.set("ht_capab", "[HT40-]") | |
51 | hapd.set("channel", "56") | |
2a6cce38 JM |
52 | if vht80: |
53 | hapd.set("ieee80211ac", "1") | |
54 | hapd.set("vht_oper_chwidth", "1") | |
9c244b54 JM |
55 | if chan100: |
56 | hapd.set("vht_oper_centr_freq_seg0_idx", "106") | |
57 | else: | |
58 | hapd.set("vht_oper_centr_freq_seg0_idx", "58") | |
2a6cce38 JM |
59 | if vht20: |
60 | hapd.set("ieee80211ac", "1") | |
61 | hapd.set("vht_oper_chwidth", "0") | |
62 | hapd.set("vht_oper_centr_freq_seg0_idx", "0") | |
63 | if chanlist: | |
64 | hapd.set("chanlist", chanlist) | |
803d0190 JM |
65 | if channel: |
66 | hapd.set("channel", str(channel)) | |
ecd54bac JM |
67 | if rrm_beacon_report: |
68 | hapd.set("rrm_beacon_report", "1") | |
8454e1fd JM |
69 | hapd.enable() |
70 | ||
71 | ev = wait_dfs_event(hapd, "DFS-CAC-START", 5) | |
72 | if "DFS-CAC-START" not in ev: | |
9a3eba46 | 73 | raise Exception("Unexpected DFS event: " + ev) |
8454e1fd JM |
74 | |
75 | state = hapd.get_status_field("state") | |
76 | if state != "DFS": | |
4f62bfef | 77 | raise Exception("Unexpected interface state: " + state) |
8454e1fd JM |
78 | |
79 | return hapd | |
80 | ||
bd5a7691 JM |
81 | def dfs_simulate_radar(hapd): |
82 | logger.info("Trigger a simulated radar event") | |
83 | phyname = hapd.get_driver_status_field("phyname") | |
84 | radar_file = '/sys/kernel/debug/ieee80211/' + phyname + '/hwsim/dfs_simulate_radar' | |
85 | with open(radar_file, 'w') as f: | |
86 | f.write('1') | |
87 | ||
8454e1fd JM |
88 | def test_dfs(dev, apdev): |
89 | """DFS CAC functionality on clear channel""" | |
4f62bfef | 90 | try: |
e246d7d5 | 91 | hapd = None |
91588eeb | 92 | hapd = start_dfs_ap(apdev[0], country="US") |
4f62bfef JM |
93 | |
94 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
95 | if "success=1" not in ev: | |
96 | raise Exception("CAC failed") | |
97 | if "freq=5260" not in ev: | |
98 | raise Exception("Unexpected DFS freq result") | |
99 | ||
100 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
101 | if not ev: | |
102 | raise Exception("AP setup timed out") | |
103 | ||
104 | state = hapd.get_status_field("state") | |
105 | if state != "ENABLED": | |
106 | raise Exception("Unexpected interface state") | |
107 | ||
108 | freq = hapd.get_status_field("freq") | |
109 | if freq != "5260": | |
110 | raise Exception("Unexpected frequency") | |
111 | ||
c634d320 | 112 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f | 113 | dev[0].wait_regdom(country_ie=True) |
a8375c94 | 114 | hwsim_utils.test_connectivity(dev[0], hapd) |
831cb7af JM |
115 | |
116 | hapd.request("RADAR DETECTED freq=5260 ht_enabled=1 chan_width=1") | |
117 | ev = hapd.wait_event(["DFS-RADAR-DETECTED"], timeout=10) | |
118 | if ev is None: | |
119 | raise Exception("DFS-RADAR-DETECTED event not reported") | |
120 | if "freq=5260" not in ev: | |
bc6e3288 | 121 | raise Exception("Incorrect frequency in radar detected event: " + ev) |
831cb7af JM |
122 | ev = hapd.wait_event(["DFS-NEW-CHANNEL"], timeout=70) |
123 | if ev is None: | |
124 | raise Exception("DFS-NEW-CHANNEL event not reported") | |
125 | if "freq=5260" in ev: | |
bc6e3288 | 126 | raise Exception("Channel did not change after radar was detected") |
831cb7af JM |
127 | |
128 | ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=70) | |
129 | if ev is None: | |
130 | raise Exception("AP-CSA-FINISHED event not reported") | |
131 | if "freq=5260" in ev: | |
bc6e3288 | 132 | raise Exception("Channel did not change after radar was detected(2)") |
831cb7af | 133 | time.sleep(1) |
a8375c94 | 134 | hwsim_utils.test_connectivity(dev[0], hapd) |
9cd52ac3 | 135 | finally: |
df71e160 | 136 | clear_regdom(hapd, dev) |
9cd52ac3 JM |
137 | |
138 | def test_dfs_etsi(dev, apdev, params): | |
139 | """DFS and uniform spreading requirement for ETSI [long]""" | |
140 | if not params['long']: | |
141 | raise HwsimSkip("Skip test case with long duration due to --long not specified") | |
142 | try: | |
143 | hapd = None | |
91588eeb | 144 | hapd = start_dfs_ap(apdev[0]) |
9cd52ac3 JM |
145 | |
146 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
147 | if "success=1" not in ev: | |
148 | raise Exception("CAC failed") | |
149 | if "freq=5260" not in ev: | |
150 | raise Exception("Unexpected DFS freq result") | |
151 | ||
152 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
153 | if not ev: | |
154 | raise Exception("AP setup timed out") | |
155 | ||
156 | state = hapd.get_status_field("state") | |
157 | if state != "ENABLED": | |
158 | raise Exception("Unexpected interface state") | |
159 | ||
160 | freq = hapd.get_status_field("freq") | |
161 | if freq != "5260": | |
162 | raise Exception("Unexpected frequency") | |
163 | ||
164 | dev[0].connect("dfs", key_mgmt="NONE") | |
b586054f | 165 | dev[0].wait_regdom(country_ie=True) |
9cd52ac3 JM |
166 | hwsim_utils.test_connectivity(dev[0], hapd) |
167 | ||
168 | hapd.request("RADAR DETECTED freq=%s ht_enabled=1 chan_width=1" % freq) | |
169 | ev = hapd.wait_event(["DFS-RADAR-DETECTED"], timeout=5) | |
170 | if ev is None: | |
171 | raise Exception("DFS-RADAR-DETECTED event not reported") | |
172 | if "freq=%s" % freq not in ev: | |
173 | raise Exception("Incorrect frequency in radar detected event: " + ev) | |
174 | ev = hapd.wait_event(["DFS-NEW-CHANNEL"], timeout=5) | |
175 | if ev is None: | |
176 | raise Exception("DFS-NEW-CHANNEL event not reported") | |
177 | if "freq=%s" % freq in ev: | |
178 | raise Exception("Channel did not change after radar was detected") | |
179 | ||
180 | ev = hapd.wait_event(["AP-CSA-FINISHED", "DFS-CAC-START"], timeout=10) | |
181 | if ev is None: | |
182 | raise Exception("AP-CSA-FINISHED or DFS-CAC-START event not reported") | |
183 | if "DFS-CAC-START" in ev: | |
184 | # The selected new channel requires CAC | |
185 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
186 | if "success=1" not in ev: | |
187 | raise Exception("CAC failed") | |
188 | ||
189 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
190 | if not ev: | |
191 | raise Exception("AP setup timed out") | |
192 | ev = hapd.wait_event(["AP-STA-CONNECTED"], timeout=30) | |
193 | if not ev: | |
194 | raise Exception("STA did not reconnect on new DFS channel") | |
195 | else: | |
196 | # The new channel did not require CAC - try again | |
197 | if "freq=%s" % freq in ev: | |
198 | raise Exception("Channel did not change after radar was detected(2)") | |
199 | time.sleep(1) | |
200 | hwsim_utils.test_connectivity(dev[0], hapd) | |
4f62bfef | 201 | finally: |
df71e160 | 202 | clear_regdom(hapd, dev) |
8454e1fd | 203 | |
32452fd2 JM |
204 | def test_dfs_radar1(dev, apdev): |
205 | """DFS CAC functionality with radar detected during initial CAC""" | |
4f62bfef | 206 | try: |
e246d7d5 | 207 | hapd = None |
91588eeb | 208 | hapd = start_dfs_ap(apdev[0]) |
bc86d8c1 | 209 | time.sleep(1) |
8454e1fd | 210 | |
bd5a7691 JM |
211 | dfs_simulate_radar(hapd) |
212 | ||
bc86d8c1 JM |
213 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) |
214 | if ev is None: | |
215 | raise Exception("Timeout on DFS aborted event") | |
216 | if "success=0 freq=5260" not in ev: | |
217 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
218 | ||
219 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
4f62bfef JM |
220 | if "freq=5260" not in ev: |
221 | raise Exception("Unexpected DFS radar detection freq") | |
8454e1fd | 222 | |
4f62bfef JM |
223 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) |
224 | if "freq=5260" in ev: | |
225 | raise Exception("Unexpected DFS new freq") | |
8454e1fd | 226 | |
bc86d8c1 JM |
227 | ev = wait_dfs_event(hapd, None, 5) |
228 | if "AP-ENABLED" in ev: | |
229 | logger.info("Started AP on non-DFS channel") | |
230 | else: | |
231 | logger.info("Trying to start AP on another DFS channel") | |
232 | if "DFS-CAC-START" not in ev: | |
9a3eba46 | 233 | raise Exception("Unexpected DFS event: " + ev) |
bc86d8c1 JM |
234 | if "freq=5260" in ev: |
235 | raise Exception("Unexpected DFS CAC freq") | |
236 | ||
237 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
238 | if "success=1" not in ev: | |
239 | raise Exception("CAC failed") | |
240 | if "freq=5260" in ev: | |
241 | raise Exception("Unexpected DFS freq result - radar channel") | |
242 | ||
243 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
244 | if not ev: | |
245 | raise Exception("AP setup timed out") | |
246 | ||
247 | state = hapd.get_status_field("state") | |
248 | if state != "ENABLED": | |
249 | raise Exception("Unexpected interface state") | |
250 | ||
251 | freq = hapd.get_status_field("freq") | |
252 | if freq == "5260": | |
253 | raise Exception("Unexpected frequency: " + freq) | |
8454e1fd | 254 | |
c634d320 | 255 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f | 256 | dev[0].wait_regdom(country_ie=True) |
32452fd2 | 257 | finally: |
df71e160 | 258 | clear_regdom(hapd, dev) |
bd5a7691 | 259 | |
32452fd2 JM |
260 | def test_dfs_radar2(dev, apdev): |
261 | """DFS CAC functionality with radar detected after initial CAC""" | |
262 | try: | |
263 | hapd = None | |
264 | hapd = start_dfs_ap(apdev[0], ssid="dfs2", ht40=True) | |
265 | ||
266 | ev = hapd.wait_event(["AP-ENABLED"], timeout=70) | |
bd5a7691 JM |
267 | if not ev: |
268 | raise Exception("AP2 setup timed out") | |
269 | ||
32452fd2 | 270 | dfs_simulate_radar(hapd) |
bd5a7691 | 271 | |
32452fd2 | 272 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) |
bd5a7691 JM |
273 | if "freq=5260 ht_enabled=1 chan_offset=1 chan_width=2" not in ev: |
274 | raise Exception("Unexpected DFS radar detection freq from AP2") | |
275 | ||
32452fd2 | 276 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) |
bd5a7691 JM |
277 | if "freq=5260" in ev: |
278 | raise Exception("Unexpected DFS new freq for AP2") | |
279 | ||
32452fd2 | 280 | wait_dfs_event(hapd, None, 5) |
4f62bfef | 281 | finally: |
8baf285c | 282 | clear_regdom(hapd, dev) |
8454e1fd | 283 | |
9fd6804d | 284 | @remote_compatible |
4f62bfef JM |
285 | def test_dfs_radar_on_non_dfs_channel(dev, apdev): |
286 | """DFS radar detection test code on non-DFS channel""" | |
fab49f61 | 287 | params = {"ssid": "radar"} |
8b8a1864 | 288 | hapd = hostapd.add_ap(apdev[0], params) |
4f62bfef JM |
289 | |
290 | hapd.request("RADAR DETECTED freq=5260 ht_enabled=1 chan_width=1") | |
291 | hapd.request("RADAR DETECTED freq=2412 ht_enabled=1 chan_width=1") | |
2a6cce38 JM |
292 | |
293 | def test_dfs_radar_chanlist(dev, apdev): | |
294 | """DFS chanlist when radar is detected""" | |
295 | try: | |
e246d7d5 | 296 | hapd = None |
91588eeb | 297 | hapd = start_dfs_ap(apdev[0], chanlist="40 44") |
2a6cce38 JM |
298 | time.sleep(1) |
299 | ||
300 | dfs_simulate_radar(hapd) | |
301 | ||
302 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
303 | if ev is None: | |
304 | raise Exception("Timeout on DFS aborted event") | |
305 | if "success=0 freq=5260" not in ev: | |
306 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
307 | ||
308 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
309 | if "freq=5260" not in ev: | |
310 | raise Exception("Unexpected DFS radar detection freq") | |
311 | ||
312 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
313 | if "freq=5200 chan=40" not in ev and "freq=5220 chan=44" not in ev: | |
314 | raise Exception("Unexpected DFS new freq: " + ev) | |
315 | ||
316 | ev = wait_dfs_event(hapd, None, 5) | |
317 | if "AP-ENABLED" not in ev: | |
9a3eba46 | 318 | raise Exception("Unexpected DFS event: " + ev) |
2a6cce38 | 319 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f | 320 | dev[0].wait_regdom(country_ie=True) |
2a6cce38 | 321 | finally: |
df71e160 | 322 | clear_regdom(hapd, dev) |
2a6cce38 JM |
323 | |
324 | def test_dfs_radar_chanlist_vht80(dev, apdev): | |
325 | """DFS chanlist when radar is detected and VHT80 configured""" | |
326 | try: | |
e246d7d5 | 327 | hapd = None |
91588eeb | 328 | hapd = start_dfs_ap(apdev[0], chanlist="36", ht40=True, vht80=True) |
2a6cce38 JM |
329 | time.sleep(1) |
330 | ||
331 | dfs_simulate_radar(hapd) | |
332 | ||
333 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
334 | if ev is None: | |
335 | raise Exception("Timeout on DFS aborted event") | |
336 | if "success=0 freq=5260" not in ev: | |
337 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
338 | ||
339 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
340 | if "freq=5260" not in ev: | |
341 | raise Exception("Unexpected DFS radar detection freq") | |
342 | ||
343 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
344 | if "freq=5180 chan=36 sec_chan=1" not in ev: | |
345 | raise Exception("Unexpected DFS new freq: " + ev) | |
346 | ||
347 | ev = wait_dfs_event(hapd, None, 5) | |
348 | if "AP-ENABLED" not in ev: | |
9a3eba46 | 349 | raise Exception("Unexpected DFS event: " + ev) |
2a6cce38 | 350 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f | 351 | dev[0].wait_regdom(country_ie=True) |
2a6cce38 JM |
352 | |
353 | if hapd.get_status_field('vht_oper_centr_freq_seg0_idx') != "42": | |
354 | raise Exception("Unexpected seg0 idx") | |
355 | finally: | |
df71e160 | 356 | clear_regdom(hapd, dev) |
2a6cce38 JM |
357 | |
358 | def test_dfs_radar_chanlist_vht20(dev, apdev): | |
359 | """DFS chanlist when radar is detected and VHT40 configured""" | |
360 | try: | |
e246d7d5 | 361 | hapd = None |
91588eeb | 362 | hapd = start_dfs_ap(apdev[0], chanlist="36", vht20=True) |
2a6cce38 JM |
363 | time.sleep(1) |
364 | ||
365 | dfs_simulate_radar(hapd) | |
366 | ||
367 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
368 | if ev is None: | |
369 | raise Exception("Timeout on DFS aborted event") | |
370 | if "success=0 freq=5260" not in ev: | |
371 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
372 | ||
373 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
374 | if "freq=5260" not in ev: | |
375 | raise Exception("Unexpected DFS radar detection freq") | |
376 | ||
377 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
378 | if "freq=5180 chan=36 sec_chan=0" not in ev: | |
379 | raise Exception("Unexpected DFS new freq: " + ev) | |
380 | ||
381 | ev = wait_dfs_event(hapd, None, 5) | |
382 | if "AP-ENABLED" not in ev: | |
9a3eba46 | 383 | raise Exception("Unexpected DFS event: " + ev) |
2a6cce38 | 384 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f | 385 | dev[0].wait_regdom(country_ie=True) |
2a6cce38 | 386 | finally: |
df71e160 | 387 | clear_regdom(hapd, dev) |
d92da8a2 JM |
388 | |
389 | def test_dfs_radar_no_ht(dev, apdev): | |
390 | """DFS chanlist when radar is detected and no HT configured""" | |
391 | try: | |
e246d7d5 | 392 | hapd = None |
91588eeb | 393 | hapd = start_dfs_ap(apdev[0], chanlist="36", ht=False) |
d92da8a2 JM |
394 | time.sleep(1) |
395 | ||
396 | dfs_simulate_radar(hapd) | |
397 | ||
398 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
399 | if ev is None: | |
400 | raise Exception("Timeout on DFS aborted event") | |
401 | if "success=0 freq=5260" not in ev: | |
402 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
403 | ||
404 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
405 | if "freq=5260 ht_enabled=0" not in ev: | |
406 | raise Exception("Unexpected DFS radar detection freq: " + ev) | |
407 | ||
408 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
409 | if "freq=5180 chan=36 sec_chan=0" not in ev: | |
410 | raise Exception("Unexpected DFS new freq: " + ev) | |
411 | ||
412 | ev = wait_dfs_event(hapd, None, 5) | |
413 | if "AP-ENABLED" not in ev: | |
9a3eba46 | 414 | raise Exception("Unexpected DFS event: " + ev) |
d92da8a2 | 415 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f | 416 | dev[0].wait_regdom(country_ie=True) |
d92da8a2 | 417 | finally: |
df71e160 | 418 | clear_regdom(hapd, dev) |
d92da8a2 JM |
419 | |
420 | def test_dfs_radar_ht40minus(dev, apdev): | |
421 | """DFS chanlist when radar is detected and HT40- configured""" | |
422 | try: | |
e246d7d5 | 423 | hapd = None |
91588eeb | 424 | hapd = start_dfs_ap(apdev[0], chanlist="36", ht40minus=True) |
d92da8a2 JM |
425 | time.sleep(1) |
426 | ||
427 | dfs_simulate_radar(hapd) | |
428 | ||
429 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
430 | if ev is None: | |
431 | raise Exception("Timeout on DFS aborted event") | |
432 | if "success=0 freq=5280 ht_enabled=1 chan_offset=-1" not in ev: | |
433 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
434 | ||
435 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
436 | if "freq=5280 ht_enabled=1 chan_offset=-1" not in ev: | |
437 | raise Exception("Unexpected DFS radar detection freq: " + ev) | |
438 | ||
439 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
440 | if "freq=5180 chan=36 sec_chan=1" not in ev: | |
441 | raise Exception("Unexpected DFS new freq: " + ev) | |
442 | ||
443 | ev = wait_dfs_event(hapd, None, 5) | |
444 | if "AP-ENABLED" not in ev: | |
9a3eba46 | 445 | raise Exception("Unexpected DFS event: " + ev) |
d92da8a2 | 446 | dev[0].connect("dfs", key_mgmt="NONE") |
b586054f JM |
447 | dev[0].wait_regdom(country_ie=True) |
448 | dev[0].request("STA_AUTOCONNECT 0") | |
d92da8a2 | 449 | finally: |
df71e160 | 450 | clear_regdom(hapd, dev) |
b586054f | 451 | dev[0].request("STA_AUTOCONNECT 1") |
803d0190 JM |
452 | |
453 | def test_dfs_ht40_minus(dev, apdev, params): | |
454 | """DFS CAC functionality on channel 104 HT40- [long]""" | |
455 | if not params['long']: | |
456 | raise HwsimSkip("Skip test case with long duration due to --long not specified") | |
457 | try: | |
458 | hapd = None | |
91588eeb | 459 | hapd = start_dfs_ap(apdev[0], ht40minus=True, channel=104) |
803d0190 JM |
460 | |
461 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
462 | if "success=1" not in ev: | |
463 | raise Exception("CAC failed") | |
464 | if "freq=5520" not in ev: | |
465 | raise Exception("Unexpected DFS freq result") | |
466 | ||
467 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
468 | if not ev: | |
469 | raise Exception("AP setup timed out") | |
470 | ||
471 | state = hapd.get_status_field("state") | |
472 | if state != "ENABLED": | |
473 | raise Exception("Unexpected interface state") | |
474 | ||
475 | freq = hapd.get_status_field("freq") | |
476 | if freq != "5520": | |
477 | raise Exception("Unexpected frequency") | |
478 | ||
479 | dev[0].connect("dfs", key_mgmt="NONE", scan_freq="5520") | |
b586054f | 480 | dev[0].wait_regdom(country_ie=True) |
803d0190 JM |
481 | hwsim_utils.test_connectivity(dev[0], hapd) |
482 | finally: | |
df71e160 | 483 | clear_regdom(hapd, dev) |
78a9ba72 JM |
484 | |
485 | def test_dfs_cac_restart_on_enable(dev, apdev): | |
486 | """DFS CAC interrupted and restarted""" | |
487 | try: | |
488 | hapd = None | |
91588eeb | 489 | hapd = start_dfs_ap(apdev[0]) |
78a9ba72 JM |
490 | time.sleep(0.1) |
491 | subprocess.check_call(['ip', 'link', 'set', 'dev', hapd.ifname, 'down']) | |
492 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
493 | if ev is None: | |
494 | raise Exception("Timeout on DFS aborted event") | |
495 | if "success=0 freq=5260" not in ev: | |
496 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
497 | time.sleep(0.1) | |
498 | subprocess.check_call(['ip', 'link', 'set', 'dev', hapd.ifname, 'up']) | |
499 | ||
500 | ev = wait_dfs_event(hapd, "DFS-CAC-START", 5) | |
501 | if "DFS-CAC-START" not in ev: | |
502 | raise Exception("Unexpected DFS event: " + ev) | |
503 | hapd.disable() | |
504 | ||
505 | finally: | |
7c2102ac | 506 | clear_regdom(hapd, dev) |
ecd54bac JM |
507 | |
508 | def test_dfs_rrm(dev, apdev, params): | |
509 | """DFS with RRM [long]""" | |
510 | if not params['long']: | |
511 | raise HwsimSkip("Skip test case with long duration due to --long not specified") | |
512 | try: | |
513 | hapd = None | |
514 | hapd = start_dfs_ap(apdev[0], country="US", rrm_beacon_report=True) | |
515 | ||
516 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
517 | if "success=1" not in ev or "freq=5260" not in ev: | |
518 | raise Exception("Unexpected DFS freq result") | |
519 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
520 | if not ev: | |
521 | raise Exception("AP setup timed out") | |
522 | ||
523 | dev[0].connect("dfs", key_mgmt="NONE", scan_freq="5260") | |
524 | dev[0].wait_regdom(country_ie=True) | |
525 | hapd.wait_sta() | |
526 | hwsim_utils.test_connectivity(dev[0], hapd) | |
527 | addr = dev[0].own_addr() | |
528 | token = hapd.request("REQ_BEACON " + addr + " " + "51000000000002ffffffffffff") | |
529 | if "FAIL" in token: | |
530 | raise Exception("REQ_BEACON failed") | |
531 | ev = hapd.wait_event(["BEACON-RESP-RX"], timeout=10) | |
532 | if ev is None: | |
533 | raise Exception("Beacon report response not received") | |
534 | finally: | |
535 | clear_regdom(hapd, dev) | |
9c244b54 JM |
536 | |
537 | def test_dfs_radar_vht80_downgrade(dev, apdev, params): | |
538 | """DFS channel bandwidth downgrade from VHT80 to VHT40 [long]""" | |
539 | if not params['long']: | |
540 | raise HwsimSkip("Skip test case with long duration due to --long not specified") | |
541 | try: | |
542 | # Start with 80 MHz channel 100 (5500 MHz) to find a radar | |
543 | hapd = None | |
544 | hapd = start_dfs_ap(apdev[0], chanlist="100-140", | |
545 | ht40=True, vht80=True, chan100=True) | |
546 | time.sleep(1) | |
547 | dfs_simulate_radar(hapd) | |
548 | ||
549 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
550 | if ev is None: | |
551 | raise Exception("Timeout on DFS aborted event") | |
552 | if "success=0 freq=5500" not in ev: | |
553 | raise Exception("Unexpected DFS aborted event contents: " + ev) | |
554 | ||
555 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
556 | if "freq=5500" not in ev: | |
557 | raise Exception("Unexpected DFS radar detection freq: " + ev) | |
558 | ||
559 | # The only other available 80 MHz channel in the chanlist is | |
560 | # 116 (5580 MHz), so that will be selected next. | |
561 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
562 | if "freq=5580 chan=116 sec_chan=1" not in ev: | |
563 | raise Exception("Unexpected DFS new freq: " + ev) | |
564 | ||
565 | ev = wait_dfs_event(hapd, None, 5) | |
566 | if "DFS-CAC-START" not in ev: | |
567 | raise Exception("Unexpected DFS event: " + ev) | |
568 | if "freq=5580" not in ev: | |
569 | raise Exception("Unexpected DFS CAC freq: " + ev) | |
570 | ||
571 | time.sleep(1) | |
572 | dfs_simulate_radar(hapd) | |
573 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 5) | |
574 | if ev is None: | |
575 | raise Exception("Timeout on DFS aborted event (2)") | |
576 | if "success=0 freq=5580" not in ev: | |
577 | raise Exception("Unexpected DFS aborted event (2) contents: " + ev) | |
578 | ||
579 | ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 5) | |
580 | if "freq=5580" not in ev: | |
581 | raise Exception("Unexpected DFS radar detection (2) freq: " + ev) | |
582 | ||
583 | # No more 80 MHz channels are available, so have to downgrade to 40 MHz | |
584 | # channels and the only remaining one is channel 132 (5660 MHz). | |
585 | ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5) | |
586 | if "freq=5660 chan=132 sec_chan=1" not in ev: | |
587 | raise Exception("Unexpected DFS new freq (2): " + ev) | |
588 | ||
589 | ev = wait_dfs_event(hapd, None, 5) | |
590 | if "DFS-CAC-START" not in ev: | |
591 | raise Exception("Unexpected DFS event: " + ev) | |
592 | if "freq=5660" not in ev: | |
593 | raise Exception("Unexpected DFS CAC freq (2): " + ev) | |
594 | ||
595 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
596 | if "success=1" not in ev: | |
597 | raise Exception("CAC failed") | |
598 | if "freq=5660" not in ev: | |
599 | raise Exception("Unexpected DFS freq result: " + ev) | |
600 | ||
601 | ev = wait_dfs_event(hapd, None, 5) | |
602 | if "AP-ENABLED" not in ev: | |
603 | raise Exception("Unexpected DFS event: " + ev) | |
604 | dev[0].connect("dfs", key_mgmt="NONE", scan_freq="5660") | |
605 | dev[0].wait_regdom(country_ie=True) | |
606 | sig = dev[0].request("SIGNAL_POLL").splitlines() | |
607 | if "FREQUENCY=5660" not in sig or "WIDTH=40 MHz" not in sig: | |
608 | raise Exception("Unexpected SIGNAL_POLL value: " + str(sig)) | |
609 | finally: | |
610 | clear_regdom(hapd, dev) | |
4e9cfc3e JM |
611 | |
612 | def test_dfs_chan_switch(dev, apdev, params): | |
613 | """DFS channel switch [long]""" | |
614 | if not params['long']: | |
615 | raise HwsimSkip("Skip test case with long duration due to --long not specified") | |
616 | try: | |
617 | hapd = None | |
618 | hapd = start_dfs_ap(apdev[0], country="US") | |
619 | ||
620 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
621 | if "success=1" not in ev: | |
622 | raise Exception("CAC failed") | |
623 | if "freq=5260" not in ev: | |
624 | raise Exception("Unexpected DFS freq result") | |
625 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
626 | if not ev: | |
627 | raise Exception("AP setup timed out") | |
628 | freq = hapd.get_status_field("freq") | |
629 | if freq != "5260": | |
630 | raise Exception("Unexpected frequency") | |
631 | ||
632 | dev[0].connect("dfs", key_mgmt="NONE", scan_freq="5260 5280") | |
633 | dev[0].wait_regdom(country_ie=True) | |
634 | hwsim_utils.test_connectivity(dev[0], hapd) | |
635 | ||
636 | if "OK" not in hapd.request("CHAN_SWITCH 5 5280 ht"): | |
637 | raise Exception("CHAN_SWITCH failed") | |
638 | # This results in BSS going down before restart, so the STA is expected | |
639 | # to report disconnection. | |
640 | dev[0].wait_disconnected() | |
641 | ev = wait_dfs_event(hapd, "DFS-CAC-START", 5) | |
642 | if "freq=5280" not in ev: | |
643 | raise Exception("Unexpected channel: " + ev) | |
644 | ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70) | |
645 | if "success=1" not in ev: | |
646 | raise Exception("CAC failed") | |
647 | if "freq=5280" not in ev: | |
648 | raise Exception("Unexpected DFS freq result") | |
649 | ev = hapd.wait_event(["AP-ENABLED"], timeout=5) | |
650 | if not ev: | |
651 | raise Exception("AP setup timed out") | |
652 | freq = hapd.get_status_field("freq") | |
653 | if freq != "5280": | |
654 | raise Exception("Unexpected frequency") | |
655 | ||
656 | dev[0].wait_connected(timeout=30) | |
657 | hwsim_utils.test_connectivity(dev[0], hapd) | |
658 | finally: | |
659 | clear_regdom(hapd, dev) |