]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_dfs.py
tests: Make HS 2.0 test cases more robust
[thirdparty/hostap.git] / tests / hwsim / test_dfs.py
1 # Test cases for DFS
2 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import os
8 import subprocess
9 import time
10 import logging
11 logger = logging.getLogger()
12
13 import hwsim_utils
14 import hostapd
15
16 def wait_dfs_event(hapd, event, timeout):
17 dfs_events = [ "DFS-RADAR-DETECTED", "DFS-NEW-CHANNEL",
18 "DFS-CAC-START", "DFS-CAC-COMPLETED",
19 "DFS-NOP-FINISHED", "AP-ENABLED" ]
20 ev = hapd.wait_event(dfs_events, timeout=timeout)
21 if not ev:
22 raise Exception("DFS event timed out")
23 if event not in ev:
24 raise Exception("Unexpected DFS event")
25 return ev
26
27 def start_dfs_ap(ap, allow_failure=False):
28 ifname = ap['ifname']
29 logger.info("Starting AP " + ifname + " on DFS channel")
30 hapd_global = hostapd.HostapdGlobal()
31 hapd_global.remove(ifname)
32 hapd_global.add(ifname)
33 hapd = hostapd.Hostapd(ifname)
34 if not hapd.ping():
35 raise Exception("Could not ping hostapd")
36 hapd.set_defaults()
37 hapd.set("ssid", "dfs")
38 hapd.set("country_code", "FI")
39 hapd.set("ieee80211d", "1")
40 hapd.set("ieee80211h", "1")
41 hapd.set("hw_mode", "a")
42 hapd.set("channel", "52")
43 hapd.enable()
44
45 ev = wait_dfs_event(hapd, "DFS-CAC-START", 5)
46 if "DFS-CAC-START" not in ev:
47 raise Exception("Unexpected DFS event")
48
49 state = hapd.get_status_field("state")
50 if state != "DFS":
51 if allow_failure:
52 logger.info("Interface state not DFS: " + state)
53 return None
54 raise Exception("Unexpected interface state: " + state)
55
56 return hapd
57
58 def test_dfs(dev, apdev):
59 """DFS CAC functionality on clear channel"""
60 try:
61 hapd = start_dfs_ap(apdev[0], allow_failure=True)
62 if hapd is None:
63 if not os.path.exists("dfs"):
64 return "skip"
65 raise Exception("Failed to start DFS AP")
66
67 ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70)
68 if "success=1" not in ev:
69 raise Exception("CAC failed")
70 if "freq=5260" not in ev:
71 raise Exception("Unexpected DFS freq result")
72
73 ev = hapd.wait_event(["AP-ENABLED"], timeout=5)
74 if not ev:
75 raise Exception("AP setup timed out")
76
77 state = hapd.get_status_field("state")
78 if state != "ENABLED":
79 raise Exception("Unexpected interface state")
80
81 freq = hapd.get_status_field("freq")
82 if freq != "5260":
83 raise Exception("Unexpected frequency")
84
85 #TODO: need to fix hwsim for DFS?!
86 #dev[0].connect("dfs", key_mgmt="NONE")
87 finally:
88 subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
89
90 def test_dfs_radar(dev, apdev):
91 """DFS CAC functionality with radar detected"""
92 if not os.path.exists("dfs"):
93 return "skip"
94
95 try:
96 hapd = start_dfs_ap(apdev[0])
97
98 hapd.request("RADAR DETECTED freq=5260 ht_enabled=1 chan_width=1")
99 ev = wait_dfs_event(hapd, "DFS-RADAR-DETECTED", 70)
100 if "freq=5260" not in ev:
101 raise Exception("Unexpected DFS radar detection freq")
102
103 state = hapd.get_status_field("state")
104 if state != "DFS":
105 raise Exception("Unexpected interface state")
106
107 ev = wait_dfs_event(hapd, "DFS-NEW-CHANNEL", 5)
108 if "freq=5260" in ev:
109 raise Exception("Unexpected DFS new freq")
110
111 ev = wait_dfs_event(hapd, "DFS-CAC-START", 5)
112 if "DFS-CAC-START" not in ev:
113 raise Exception("Unexpected DFS event")
114
115 ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70)
116 if "success=1" not in ev:
117 raise Exception("CAC failed")
118 if "freq=5260" in ev:
119 raise Exception("Unexpected DFS freq result - radar channel")
120
121 ev = hapd.wait_event(["AP-ENABLED"], timeout=5)
122 if not ev:
123 raise Exception("AP setup timed out")
124
125 state = hapd.get_status_field("state")
126 if state != "ENABLED":
127 raise Exception("Unexpected interface state")
128
129 freq = hapd.get_status_field("freq")
130 if freq != "5260":
131 raise Exception("Unexpected frequency")
132
133 #TODO: need to fix hwsim for DFS?!
134 #dev[0].connect("dfs", key_mgmt="NONE")
135 finally:
136 subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
137
138 def test_dfs_radar_on_non_dfs_channel(dev, apdev):
139 """DFS radar detection test code on non-DFS channel"""
140 params = { "ssid": "radar" }
141 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
142
143 hapd.request("RADAR DETECTED freq=5260 ht_enabled=1 chan_width=1")
144 hapd.request("RADAR DETECTED freq=2412 ht_enabled=1 chan_width=1")