1# bgscan tests 2# Copyright (c) 2014-2017, 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 7import time 8import logging 9logger = logging.getLogger() 10import os 11 12import hostapd 13from utils import alloc_fail, fail_test, wait_fail_trigger 14 15def test_bgscan_simple(dev, apdev): 16 """bgscan_simple""" 17 hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 18 hostapd.add_ap(apdev[1], {"ssid": "bgscan"}) 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 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 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 72def test_bgscan_simple_beacon_loss(dev, apdev): 73 """bgscan_simple and beacon loss""" 74 params = hostapd.wpa2_params(ssid="bgscan", passphrase="12345678") 75 params["wpa_key_mgmt"] = "WPA-PSK-SHA256" 76 params["ieee80211w"] = "2" 77 hapd = hostapd.add_ap(apdev[0], params) 78 79 dev[0].set("disable_sa_query", "1") 80 dev[0].connect("bgscan", ieee80211w="2", key_mgmt="WPA-PSK-SHA256", 81 psk="12345678", scan_freq="2412", 82 bgscan="simple:100:-20:200") 83 hapd.set("ext_mgmt_frame_handling", "1") 84 if "OK" not in hapd.request("STOP_AP"): 85 raise Exception("Failed to stop AP") 86 hapd.disable() 87 hapd.set("ssid", "foo") 88 hapd.set("beacon_int", "10000") 89 hapd.enable() 90 ev = dev[0].wait_event(["CTRL-EVENT-BEACON-LOSS"], timeout=10) 91 if ev is None: 92 raise Exception("Beacon loss not reported") 93 94def test_bgscan_simple_scan_failure(dev, apdev): 95 """bgscan_simple and scan failure""" 96 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 97 98 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 99 bgscan="simple:1:-20:2") 100 with alloc_fail(dev[0], 1, 101 "wpa_supplicant_trigger_scan;bgscan_simple_timeout"): 102 wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") 103 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) 104 if ev is None: 105 raise Exception("Scanning not continued after failure") 106 107def test_bgscan_simple_scanning(dev, apdev): 108 """bgscan_simple and scanning behavior""" 109 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 110 111 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 112 bgscan="simple:1:-20:2") 113 # Go through seven bgscan_simple_timeout calls for code coverage. This falls 114 # back from short to long scan interval and then reduces short_scan_count 115 # back to zero. 116 for i in range(7): 117 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) 118 if ev is None: 119 raise Exception("Scanning not continued") 120 121def test_bgscan_simple_same_scan_int(dev, apdev): 122 """bgscan_simple and same short/long scan interval""" 123 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 124 125 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 126 bgscan="simple:1:-20:1") 127 for i in range(2): 128 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) 129 if ev is None: 130 raise Exception("Scanning not continued") 131 132def test_bgscan_simple_btm_query(dev, apdev): 133 """bgscan_simple and BTM query""" 134 params = {"ssid": "bgscan", 135 "bss_transition": "1"} 136 hapd = hostapd.add_ap(apdev[0], params) 137 138 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 139 bgscan="simple:1:-20:1:2") 140 ev = dev[0].wait_event(["WNM: BSS Transition Management Request"], 10) 141 if ev is None: 142 raise Exception("BSS TM not used") 143 for i in range(2): 144 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) 145 if ev is None: 146 raise Exception("Scanning not continued") 147 148def test_bgscan_simple_btm_query_no_ap_support(dev, apdev): 149 """bgscan_simple and BTM query and no AP support""" 150 params = {"ssid": "bgscan", 151 "bss_transition": "0"} 152 hapd = hostapd.add_ap(apdev[0], params) 153 154 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 155 bgscan="simple:1:-20:1:2") 156 ev = dev[0].wait_event(["WNM: BSS Transition Management Request", 157 "CTRL-EVENT-SCAN-RESULTS"], 10) 158 if ev is None: 159 raise Exception("No background scan seen") 160 if "WNM: BSS" in ev: 161 raise Exception("Unexpected use of BSS TM") 162 163def test_bgscan_simple_oom(dev, apdev): 164 """bgscan_simple OOM""" 165 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 166 167 with alloc_fail(dev[0], 1, "bgscan_simple_init"): 168 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 169 bgscan="simple:1:-20:2") 170 171def test_bgscan_simple_driver_conf_failure(dev, apdev): 172 """bgscan_simple driver configuration failure""" 173 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 174 175 with fail_test(dev[0], 1, "bgscan_simple_init"): 176 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 177 bgscan="simple:1:-20:2") 178 179def test_bgscan_learn(dev, apdev): 180 """bgscan_learn""" 181 hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 182 hostapd.add_ap(apdev[1], {"ssid": "bgscan"}) 183 184 try: 185 os.remove("/tmp/test_bgscan_learn.bgscan") 186 except: 187 pass 188 189 try: 190 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 191 bgscan="learn:1:-20:2") 192 id = dev[1].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 193 bgscan="learn:1:-45:2:/tmp/test_bgscan_learn.bgscan") 194 195 dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 196 bgscan="learn:1:-45") 197 dev[2].request("REMOVE_NETWORK all") 198 dev[2].wait_disconnected() 199 200 dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 201 bgscan="learn:0:0") 202 dev[2].request("REMOVE_NETWORK all") 203 dev[2].wait_disconnected() 204 205 dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 206 bgscan="learn") 207 dev[2].request("REMOVE_NETWORK all") 208 dev[2].wait_disconnected() 209 210 dev[2].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 211 bgscan="learn:1") 212 dev[2].request("REMOVE_NETWORK all") 213 dev[2].wait_disconnected() 214 215 ev = dev[0].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) 216 if ev is None: 217 raise Exception("dev0 did not indicate signal change event") 218 if "above=0" not in ev: 219 raise Exception("Unexpected signal change event contents from dev0: " + ev) 220 221 ev = dev[1].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) 222 if ev is None: 223 raise Exception("dev1 did not indicate signal change event") 224 if "above=1" not in ev: 225 raise Exception("Unexpected signal change event contents from dev1: " + ev) 226 227 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=3) 228 if ev is None: 229 raise Exception("dev0 did not start a scan") 230 231 ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=3) 232 if ev is None: 233 raise Exception("dev1 did not start a scan") 234 235 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5) 236 if ev is None: 237 raise Exception("dev0 did not complete a scan") 238 ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 5) 239 if ev is None: 240 raise Exception("dev1 did not complete a scan") 241 242 dev[0].request("DISCONNECT") 243 dev[1].request("DISCONNECT") 244 dev[0].request("REMOVE_NETWORK all") 245 246 with open("/tmp/test_bgscan_learn.bgscan", "r") as f: 247 lines = f.read().splitlines() 248 if lines[0] != "wpa_supplicant-bgscan-learn": 249 raise Exception("Unexpected bgscan header line") 250 if 'BSS 02:00:00:00:03:00 2412' not in lines: 251 raise Exception("Missing BSS1") 252 if 'BSS 02:00:00:00:04:00 2412' not in lines: 253 raise Exception("Missing BSS2") 254 if 'NEIGHBOR 02:00:00:00:03:00 02:00:00:00:04:00' not in lines: 255 raise Exception("Missing BSS1->BSS2 neighbor entry") 256 if 'NEIGHBOR 02:00:00:00:04:00 02:00:00:00:03:00' not in lines: 257 raise Exception("Missing BSS2->BSS1 neighbor entry") 258 259 dev[1].set_network(id, "scan_freq", "") 260 dev[1].connect_network(id) 261 262 ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=10) 263 if ev is None: 264 raise Exception("dev1 did not start a scan") 265 266 ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) 267 if ev is None: 268 raise Exception("dev1 did not complete a scan") 269 270 dev[1].request("REMOVE_NETWORK all") 271 finally: 272 try: 273 os.remove("/tmp/test_bgscan_learn.bgscan") 274 except: 275 pass 276 277def test_bgscan_learn_beacon_loss(dev, apdev): 278 """bgscan_simple and beacon loss""" 279 params = hostapd.wpa2_params(ssid="bgscan", passphrase="12345678") 280 params["wpa_key_mgmt"] = "WPA-PSK-SHA256" 281 params["ieee80211w"] = "2" 282 hapd = hostapd.add_ap(apdev[0], params) 283 284 dev[0].set("disable_sa_query", "1") 285 dev[0].connect("bgscan", ieee80211w="2", key_mgmt="WPA-PSK-SHA256", 286 psk="12345678", scan_freq="2412", bgscan="learn:100:-20:200") 287 hapd.set("ext_mgmt_frame_handling", "1") 288 if "OK" not in hapd.request("STOP_AP"): 289 raise Exception("Failed to stop AP") 290 hapd.disable() 291 hapd.set("ssid", "foo") 292 hapd.set("beacon_int", "10000") 293 hapd.enable() 294 ev = dev[0].wait_event(["CTRL-EVENT-BEACON-LOSS"], timeout=10) 295 if ev is None: 296 raise Exception("Beacon loss not reported") 297 298def test_bgscan_learn_scan_failure(dev, apdev): 299 """bgscan_learn and scan failure""" 300 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 301 302 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 303 bgscan="learn:1:-20:2") 304 with alloc_fail(dev[0], 1, 305 "wpa_supplicant_trigger_scan;bgscan_learn_timeout"): 306 wait_fail_trigger(dev[0], "GET_ALLOC_FAIL") 307 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 10) 308 if ev is None: 309 raise Exception("Scanning not continued after failure") 310 311def test_bgscan_learn_oom(dev, apdev): 312 """bgscan_learn OOM""" 313 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 314 315 with alloc_fail(dev[0], 1, "bgscan_learn_init"): 316 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 317 bgscan="learn:1:-20:2") 318 319def test_bgscan_learn_driver_conf_failure(dev, apdev): 320 """bgscan_learn driver configuration failure""" 321 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 322 323 with fail_test(dev[0], 1, "bgscan_learn_init"): 324 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 325 bgscan="learn:1:-20:2") 326 327def test_bgscan_unknown_module(dev, apdev): 328 """bgscan init failing due to unknown module""" 329 hapd = hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 330 dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 331 bgscan="unknown:-20:2") 332 333def test_bgscan_reconfig(dev, apdev): 334 """bgscan parameter update""" 335 hostapd.add_ap(apdev[0], {"ssid": "bgscan"}) 336 hostapd.add_ap(apdev[1], {"ssid": "bgscan"}) 337 338 id = dev[0].connect("bgscan", key_mgmt="NONE", scan_freq="2412", 339 bgscan="simple:1:-20:2") 340 dev[0].set_network_quoted(id, "bgscan", "simple:1:-45:2") 341 dev[0].set_network_quoted(id, "bgscan", "learn:1:-20:2") 342 dev[0].set_network_quoted(id, "bgscan", "") 343