1# Dynamic wpa_supplicant interface 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 7import logging 8logger = logging.getLogger() 9import subprocess 10import time 11 12import hwsim_utils 13import hostapd 14from wpasupplicant import WpaSupplicant 15from utils import * 16 17def test_sta_dynamic(dev, apdev): 18 """Dynamically added wpa_supplicant interface""" 19 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 20 hostapd.add_ap(apdev[0], params) 21 22 logger.info("Create a dynamic wpa_supplicant interface and connect") 23 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 24 wpas.interface_add("wlan5") 25 26 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") 27 28def test_sta_ap_scan_0(dev, apdev): 29 """Dynamically added wpa_supplicant interface with AP_SCAN 0 connection""" 30 hostapd.add_ap(apdev[0], {"ssid": "test"}) 31 bssid = apdev[0]['bssid'] 32 33 logger.info("Create a dynamic wpa_supplicant interface and connect") 34 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 35 wpas.interface_add("wlan5") 36 37 if "OK" not in wpas.request("AP_SCAN 0"): 38 raise Exception("Failed to set AP_SCAN 2") 39 40 id = wpas.connect("", key_mgmt="NONE", bssid=bssid, 41 only_add_network=True) 42 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect") 43 wpas.request("SCAN") 44 time.sleep(0.5) 45 subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412']) 46 wpas.wait_connected(timeout=10) 47 wpas.request("SCAN") 48 wpas.wait_connected(timeout=5) 49 50def test_sta_ap_scan_2(dev, apdev): 51 """Dynamically added wpa_supplicant interface with AP_SCAN 2 connection""" 52 hostapd.add_ap(apdev[0], {"ssid": "test"}) 53 bssid = apdev[0]['bssid'] 54 55 logger.info("Create a dynamic wpa_supplicant interface and connect") 56 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 57 wpas.interface_add("wlan5") 58 59 if "FAIL" not in wpas.request("AP_SCAN -1"): 60 raise Exception("Invalid AP_SCAN -1 accepted") 61 if "FAIL" not in wpas.request("AP_SCAN 3"): 62 raise Exception("Invalid AP_SCAN 3 accepted") 63 if "OK" not in wpas.request("AP_SCAN 2"): 64 raise Exception("Failed to set AP_SCAN 2") 65 66 id = wpas.connect("", key_mgmt="NONE", bssid=bssid, 67 only_add_network=True) 68 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect") 69 subprocess.call(['iw', wpas.ifname, 'scan', 'trigger', 'freq', '2412']) 70 time.sleep(1) 71 subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412']) 72 wpas.wait_connected(timeout=10) 73 74 wpas.request("SET disallow_aps bssid " + bssid) 75 wpas.wait_disconnected(timeout=10) 76 77 subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412']) 78 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) 79 if ev is not None: 80 raise Exception("Unexpected connection reported") 81 82def test_sta_ap_scan_2b(dev, apdev): 83 """Dynamically added wpa_supplicant interface with AP_SCAN 2 operation""" 84 hapd = hostapd.add_ap(apdev[0], {"ssid": "test"}) 85 bssid = apdev[0]['bssid'] 86 87 logger.info("Create a dynamic wpa_supplicant interface and connect") 88 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 89 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 90 91 if "OK" not in wpas.request("AP_SCAN 2"): 92 raise Exception("Failed to set AP_SCAN 2") 93 94 id = wpas.connect("test", key_mgmt="NONE", bssid=bssid) 95 wpas.request("DISCONNECT") 96 wpas.set_network(id, "disabled", "1") 97 id2 = wpas.add_network() 98 wpas.set_network_quoted(id2, "ssid", "test2") 99 wpas.set_network(id2, "key_mgmt", "NONE") 100 wpas.set_network(id2, "disabled", "0") 101 wpas.request("REASSOCIATE") 102 ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15) 103 if ev is None: 104 raise Exception("Association rejection not reported") 105 hapd.disable() 106 wpas.set_network(id, "disabled", "0") 107 wpas.set_network(id2, "disabled", "1") 108 for i in range(3): 109 ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15) 110 if ev is None: 111 raise Exception("Association rejection not reported") 112 wpas.request("DISCONNECT") 113 114def test_sta_dynamic_down_up(dev, apdev): 115 """Dynamically added wpa_supplicant interface down/up""" 116 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 117 hapd = hostapd.add_ap(apdev[0], params) 118 119 logger.info("Create a dynamic wpa_supplicant interface and connect") 120 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 121 wpas.interface_add("wlan5") 122 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") 123 hapd.wait_sta() 124 hwsim_utils.test_connectivity(wpas, hapd) 125 subprocess.call(['ifconfig', wpas.ifname, 'down']) 126 wpas.wait_disconnected(timeout=10) 127 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED": 128 raise Exception("Unexpected wpa_state") 129 subprocess.call(['ifconfig', wpas.ifname, 'up']) 130 wpas.wait_connected(timeout=15, error="Reconnection not reported") 131 hapd.wait_sta() 132 hwsim_utils.test_connectivity(wpas, hapd) 133 134def test_sta_dynamic_ext_mac_addr_change(dev, apdev): 135 """Dynamically added wpa_supplicant interface with external MAC address change""" 136 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 137 hapd = hostapd.add_ap(apdev[0], params) 138 139 logger.info("Create a dynamic wpa_supplicant interface and connect") 140 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 141 wpas.interface_add("wlan5") 142 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") 143 hapd.wait_sta() 144 hwsim_utils.test_connectivity(wpas, hapd) 145 subprocess.call(['ifconfig', wpas.ifname, 'down']) 146 wpas.wait_disconnected(timeout=10) 147 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED": 148 raise Exception("Unexpected wpa_state") 149 prev_addr = wpas.p2p_interface_addr() 150 new_addr = '02:11:22:33:44:55' 151 try: 152 subprocess.call(['ip', 'link', 'set', 'dev', wpas.ifname, 153 'address', new_addr]) 154 subprocess.call(['ifconfig', wpas.ifname, 'up']) 155 wpas.wait_connected(timeout=15, error="Reconnection not reported") 156 if wpas.get_driver_status_field('addr') != new_addr: 157 raise Exception("Address change not reported") 158 hapd.wait_sta() 159 hwsim_utils.test_connectivity(wpas, hapd) 160 sta = hapd.get_sta(new_addr) 161 if sta['addr'] != new_addr: 162 raise Exception("STA association with new address not found") 163 finally: 164 subprocess.call(['ifconfig', wpas.ifname, 'down']) 165 subprocess.call(['ip', 'link', 'set', 'dev', wpas.ifname, 166 'address', prev_addr]) 167 subprocess.call(['ifconfig', wpas.ifname, 'up']) 168 169def test_sta_dynamic_ext_mac_addr_change_for_connection(dev, apdev): 170 """Dynamically added wpa_supplicant interface with external MAC address change for connection""" 171 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 172 hapd = hostapd.add_ap(apdev[0], params) 173 bssid = apdev[0]['ifname'] 174 175 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 176 wpas.interface_add("wlan5") 177 wpas.scan_for_bss(bssid, freq=2412) 178 subprocess.call(['ifconfig', wpas.ifname, 'down']) 179 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED": 180 raise Exception("Unexpected wpa_state") 181 prev_addr = wpas.own_addr() 182 new_addr = '02:11:22:33:44:55' 183 try: 184 subprocess.call(['ip', 'link', 'set', 'dev', wpas.ifname, 185 'address', new_addr]) 186 subprocess.call(['ifconfig', wpas.ifname, 'up']) 187 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412", 188 wait_connect=False) 189 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED", 190 "CTRL-EVENT-SCAN-RESULTS"], timeout=10) 191 if "CTRL-EVENT-SCAN-RESULTS" in ev: 192 raise Exception("Unexpected scan after MAC address change") 193 hapd.wait_sta() 194 hwsim_utils.test_connectivity(wpas, hapd) 195 sta = hapd.get_sta(new_addr) 196 if sta['addr'] != new_addr: 197 raise Exception("STA association with new address not found") 198 wpas.request("DISCONNECT") 199 wpas.wait_disconnected() 200 wpas.dump_monitor() 201 subprocess.call(['ifconfig', wpas.ifname, 'down']) 202 time.sleep(0.1) 203 res = wpas.get_bss(bssid) 204 if res is None: 205 raise Exception("BSS entry not maintained after interface disabling") 206 ev = wpas.wait_event(["CTRL-EVENT-BSS-REMOVED"], timeout=5.5) 207 if ev is None: 208 raise Exception("BSS entry not removed after interface has been disabled for a while") 209 res2 = wpas.get_bss(bssid) 210 if res2 is not None: 211 raise Exception("Unexpected BSS entry found on a disabled interface") 212 finally: 213 subprocess.call(['ifconfig', wpas.ifname, 'down']) 214 subprocess.call(['ip', 'link', 'set', 'dev', wpas.ifname, 215 'address', prev_addr]) 216 subprocess.call(['ifconfig', wpas.ifname, 'up']) 217 218def test_sta_dynamic_random_mac_addr(dev, apdev): 219 """Dynamically added wpa_supplicant interface and random MAC address""" 220 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 221 hapd = hostapd.add_ap(apdev[0], params) 222 223 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 224 wpas.interface_add("wlan5") 225 addr0 = wpas.get_driver_status_field("addr") 226 wpas.request("SET preassoc_mac_addr 1") 227 wpas.request("SET rand_addr_lifetime 60") 228 229 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1", 230 scan_freq="2412") 231 addr1 = wpas.get_driver_status_field("addr") 232 233 if addr0 == addr1: 234 raise Exception("Random MAC address not used") 235 236 sta = hapd.get_sta(addr0) 237 if sta['addr'] != "FAIL": 238 raise Exception("Unexpected STA association with permanent address") 239 sta = hapd.get_sta(addr1) 240 if sta['addr'] != addr1: 241 raise Exception("STA association with random address not found") 242 243 wpas.request("DISCONNECT") 244 wpas.connect_network(id) 245 addr2 = wpas.get_driver_status_field("addr") 246 if addr1 != addr2: 247 raise Exception("Random MAC address changed unexpectedly") 248 249 wpas.remove_network(id) 250 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1", 251 scan_freq="2412") 252 addr2 = wpas.get_driver_status_field("addr") 253 if addr1 == addr2: 254 raise Exception("Random MAC address did not change") 255 256def test_sta_dynamic_random_mac_addr_two_aps(dev, apdev): 257 """Dynamically added wpa_supplicant interface and random MAC address with two APs""" 258 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 259 hapd = hostapd.add_ap(apdev[0], params) 260 params = hostapd.wpa2_params(ssid="sta-dynamic2", passphrase="12345678") 261 hapd2 = hostapd.add_ap(apdev[1], params) 262 263 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 264 wpas.interface_add("wlan5") 265 addr0 = wpas.get_driver_status_field("addr") 266 wpas.request("SET preassoc_mac_addr 1") 267 wpas.request("SET rand_addr_lifetime 0") 268 269 wpas.scan_for_bss(hapd.own_addr(), freq=2412) 270 wpas.scan_for_bss(hapd2.own_addr(), freq=2412) 271 272 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1", 273 scan_freq="2412") 274 addr1 = wpas.get_driver_status_field("addr") 275 276 if addr0 == addr1: 277 raise Exception("Random MAC address not used") 278 279 sta = hapd.get_sta(addr0) 280 if sta['addr'] != "FAIL": 281 raise Exception("Unexpected STA association with permanent address") 282 sta = hapd.get_sta(addr1) 283 if sta['addr'] != addr1: 284 raise Exception("STA association with random address not found") 285 286 id2 = wpas.connect("sta-dynamic2", psk="12345678", mac_addr="1", 287 scan_freq="2412") 288 addr2 = wpas.get_driver_status_field("addr") 289 if addr0 == addr2: 290 raise Exception("Random MAC address not used(2)") 291 if addr1 == addr2: 292 raise Exception("Random MAC address not change for another ESS)") 293 sta = hapd2.get_sta(addr0) 294 if sta['addr'] != "FAIL": 295 raise Exception("Unexpected STA association with permanent address(2)") 296 sta = hapd2.get_sta(addr2) 297 if sta['addr'] != addr2: 298 raise Exception("STA association with random address not found(2)") 299 300 wpas.dump_monitor() 301 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect") 302 hapd2.request("STOP_AP") 303 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) 304 if ev is None: 305 raise Exception("Disconnection due to beacon loss not reported") 306 if "bssid=" + hapd2.own_addr() + " reason=4 locally_generated=1" not in ev: 307 raise Exception("Unexpected disconnection event values") 308 wpas.wait_connected() 309 addr3 = wpas.get_driver_status_field("addr") 310 if addr3 == addr0 or addr3 == addr2: 311 raise Exception("Random MAC address not changed on return to previous AP") 312 hapd2.disable() 313 sta = hapd.get_sta(addr3) 314 if sta['addr'] != addr3: 315 raise Exception("STA association with random address not found(3)") 316 317def test_sta_dynamic_random_mac_addr_keep_oui(dev, apdev): 318 """Dynamically added wpa_supplicant interface and random MAC address (keep OUI)""" 319 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 320 hapd = hostapd.add_ap(apdev[0], params) 321 322 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 323 wpas.interface_add("wlan5") 324 addr0 = wpas.get_driver_status_field("addr") 325 wpas.request("SET preassoc_mac_addr 2") 326 wpas.request("SET rand_addr_lifetime 60") 327 328 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2", 329 scan_freq="2412") 330 addr1 = wpas.get_driver_status_field("addr") 331 332 if addr0 == addr1: 333 raise Exception("Random MAC address not used") 334 if addr1[3:8] != addr0[3:8]: 335 raise Exception("OUI was not kept") 336 337 sta = hapd.get_sta(addr0) 338 if sta['addr'] != "FAIL": 339 raise Exception("Unexpected STA association with permanent address") 340 sta = hapd.get_sta(addr1) 341 if sta['addr'] != addr1: 342 raise Exception("STA association with random address not found") 343 344 wpas.request("DISCONNECT") 345 wpas.connect_network(id) 346 addr2 = wpas.get_driver_status_field("addr") 347 if addr1 != addr2: 348 raise Exception("Random MAC address changed unexpectedly") 349 350 wpas.remove_network(id) 351 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2", 352 scan_freq="2412") 353 addr2 = wpas.get_driver_status_field("addr") 354 if addr1 == addr2: 355 raise Exception("Random MAC address did not change") 356 if addr2[3:8] != addr0[3:8]: 357 raise Exception("OUI was not kept") 358 359def test_sta_dynamic_random_mac_addr_per_ess(dev, apdev): 360 """Dynamically added wpa_supplicant interface and random MAC address per ESS""" 361 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 362 hapd = hostapd.add_ap(apdev[0], params) 363 params = hostapd.wpa2_params(ssid="sta-dynamic2", passphrase="12345678") 364 hapd2 = hostapd.add_ap(apdev[1], params) 365 366 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 367 wpas.interface_add("wlan5") 368 addr0 = wpas.get_driver_status_field("addr") 369 wpas.request("SET preassoc_mac_addr 1") 370 wpas.request("SET rand_addr_lifetime 0") 371 372 wpas.scan_for_bss(hapd.own_addr(), freq=2412) 373 wpas.scan_for_bss(hapd2.own_addr(), freq=2412) 374 375 addr_ess1 = "f2:11:22:33:44:55" 376 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="3", 377 mac_value=addr_ess1, scan_freq="2412") 378 addr1 = wpas.get_driver_status_field("addr") 379 380 if addr1 != addr_ess1: 381 raise Exception("Pregenerated MAC address not used") 382 383 addr_ess2 = "f2:66:77:88:99:aa" 384 id2 = wpas.connect("sta-dynamic2", psk="12345678", mac_addr="3", 385 mac_value=addr_ess2, scan_freq="2412") 386 addr2 = wpas.get_driver_status_field("addr") 387 if addr2 != addr_ess2: 388 raise Exception("Pregenerated MAC address not used(2)") 389 390 wpas.dump_monitor() 391 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect") 392 hapd2.request("STOP_AP") 393 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) 394 if ev is None: 395 raise Exception("Disconnection due to beacon loss not reported") 396 wpas.wait_connected() 397 addr3 = wpas.get_driver_status_field("addr") 398 if addr3 != addr_ess1: 399 raise Exception("Pregenerated MAC address not restored") 400 401def test_sta_dynamic_random_mac_addr_per_ess_pmksa_caching(dev, apdev): 402 """Dynamically added wpa_supplicant interface and random MAC address per ESS with PMKSA caching""" 403 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 404 params['wpa_key_mgmt'] = 'SAE' 405 params['ieee80211w'] = '2' 406 hapd = hostapd.add_ap(apdev[0], params) 407 hapd2 = hostapd.add_ap(apdev[1], params) 408 409 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 410 wpas.interface_add("wlan5") 411 check_sae_capab(wpas) 412 addr0 = wpas.get_driver_status_field("addr") 413 wpas.set("preassoc_mac_addr", "1") 414 wpas.set("rand_addr_lifetime", "0") 415 wpas.set("sae_groups", "") 416 417 wpas.scan_for_bss(hapd.own_addr(), freq=2412) 418 wpas.scan_for_bss(hapd2.own_addr(), freq=2412) 419 420 addr_ess = "f2:11:22:33:44:55" 421 wpas.connect("sta-dynamic", key_mgmt="SAE", psk="12345678", 422 ieee80211w="2", 423 mac_addr="3", mac_value=addr_ess, scan_freq="2412") 424 addr1 = wpas.get_driver_status_field("addr") 425 if addr1 != addr_ess: 426 raise Exception("Pregenerated MAC address not used") 427 428 bssid = wpas.get_status_field("bssid") 429 if bssid == hapd.own_addr(): 430 h1 = hapd 431 h2 = hapd2 432 else: 433 h1 = hapd2 434 h2 = hapd 435 436 wpas.roam(h2.own_addr()) 437 wpas.dump_monitor() 438 439 h2.request("STOP_AP") 440 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) 441 if ev is None: 442 raise Exception("Disconnection due to beacon loss not reported") 443 wpas.wait_connected() 444 addr3 = wpas.get_driver_status_field("addr") 445 if addr3 != addr_ess: 446 raise Exception("Pregenerated MAC address not restored") 447 if "sae_group" in wpas.get_status(): 448 raise Exception("SAE used without PMKSA caching") 449 450def test_sta_dynamic_random_mac_addr_scan(dev, apdev): 451 """Dynamically added wpa_supplicant interface and random MAC address for scan""" 452 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 453 hapd = hostapd.add_ap(apdev[0], params) 454 455 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 456 wpas.interface_add("wlan5") 457 addr0 = wpas.get_driver_status_field("addr") 458 wpas.request("SET preassoc_mac_addr 1") 459 wpas.request("SET rand_addr_lifetime 0") 460 461 id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") 462 addr1 = wpas.get_driver_status_field("addr") 463 464 if addr0 != addr1: 465 raise Exception("Random MAC address used unexpectedly") 466 467def test_sta_dynamic_random_mac_addr_scan_keep_oui(dev, apdev): 468 """Dynamically added wpa_supplicant interface and random MAC address for scan (keep OUI)""" 469 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 470 hapd = hostapd.add_ap(apdev[0], params) 471 472 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 473 wpas.interface_add("wlan5") 474 addr0 = wpas.get_driver_status_field("addr") 475 wpas.request("SET preassoc_mac_addr 2") 476 wpas.request("SET rand_addr_lifetime 0") 477 478 id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") 479 addr1 = wpas.get_driver_status_field("addr") 480 481 if addr0 != addr1: 482 raise Exception("Random MAC address used unexpectedly") 483 484def test_sta_dynamic_random_mac_addr_pmksa_cache(dev, apdev): 485 """Dynamically added wpa_supplicant interface and random MAC address with PMKSA caching""" 486 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") 487 params['wpa_key_mgmt'] = 'SAE' 488 params['ieee80211w'] = '2' 489 hapd = hostapd.add_ap(apdev[0], params) 490 491 params = hostapd.wpa2_params(ssid="another", passphrase="12345678") 492 hapd2 = hostapd.add_ap(apdev[1], params) 493 494 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 495 wpas.interface_add("wlan5") 496 check_sae_capab(wpas) 497 addr0 = wpas.get_driver_status_field("addr") 498 wpas.request("SET preassoc_mac_addr 1") 499 wpas.request("SET rand_addr_lifetime 0") 500 501 wpas.set("sae_groups", "") 502 id = wpas.connect("sta-dynamic", key_mgmt="SAE", psk="12345678", 503 ieee80211w="2", 504 mac_addr="1", scan_freq="2412") 505 addr1 = wpas.get_driver_status_field("addr") 506 507 if addr0 == addr1: 508 raise Exception("Random MAC address not used") 509 510 sta = hapd.get_sta(addr0) 511 if sta['addr'] != "FAIL": 512 raise Exception("Unexpected STA association with permanent address") 513 sta = hapd.get_sta(addr1) 514 if sta['addr'] != addr1: 515 raise Exception("STA association with random address not found") 516 517 wpas.request("DISCONNECT") 518 wpas.wait_disconnected() 519 520 wpas.connect("another", psk="12345678", mac_addr="1", scan_freq="2412") 521 wpas.request("DISCONNECT") 522 wpas.wait_disconnected() 523 524 wpas.connect_network(id) 525 526 wpas.remove_network(id) 527 wpas.wait_disconnected() 528 id = wpas.connect("sta-dynamic", key_mgmt="SAE", psk="12345678", 529 ieee80211w="2", 530 mac_addr="1", scan_freq="2412") 531 addr2 = wpas.get_driver_status_field("addr") 532 if addr1 == addr2: 533 raise Exception("Random MAC address did not change") 534