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