1 # Dynamic wpa_supplicant interface
2 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
8 logger = logging.getLogger()
14 from wpasupplicant import WpaSupplicant
16 def test_sta_dynamic(dev, apdev):
17 """Dynamically added wpa_supplicant interface"""
18 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
19 hostapd.add_ap(apdev[0]['ifname'], params)
21 logger.info("Create a dynamic wpa_supplicant interface and connect")
22 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
23 wpas.interface_add("wlan5")
25 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
27 def test_sta_ap_scan_0(dev, apdev):
28 """Dynamically added wpa_supplicant interface with AP_SCAN 0 connection"""
29 hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test" })
30 bssid = apdev[0]['bssid']
32 logger.info("Create a dynamic wpa_supplicant interface and connect")
33 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
34 wpas.interface_add("wlan5")
36 if "OK" not in wpas.request("AP_SCAN 0"):
37 raise Exception("Failed to set AP_SCAN 2")
39 id = wpas.connect("", key_mgmt="NONE", bssid=bssid,
40 only_add_network=True)
41 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect")
44 subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412'])
45 wpas.wait_connected(timeout=10)
47 wpas.wait_connected(timeout=5)
49 def test_sta_ap_scan_2(dev, apdev):
50 """Dynamically added wpa_supplicant interface with AP_SCAN 2 connection"""
51 hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test" })
52 bssid = apdev[0]['bssid']
54 logger.info("Create a dynamic wpa_supplicant interface and connect")
55 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
56 wpas.interface_add("wlan5")
58 if "FAIL" not in wpas.request("AP_SCAN -1"):
59 raise Exception("Invalid AP_SCAN -1 accepted")
60 if "FAIL" not in wpas.request("AP_SCAN 3"):
61 raise Exception("Invalid AP_SCAN 3 accepted")
62 if "OK" not in wpas.request("AP_SCAN 2"):
63 raise Exception("Failed to set AP_SCAN 2")
65 id = wpas.connect("", key_mgmt="NONE", bssid=bssid,
66 only_add_network=True)
67 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect")
68 subprocess.call(['iw', wpas.ifname, 'scan', 'trigger', 'freq', '2412'])
70 subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412'])
71 wpas.wait_connected(timeout=10)
73 wpas.request("SET disallow_aps bssid " + bssid)
74 wpas.wait_disconnected(timeout=10)
76 subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412'])
77 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
79 raise Exception("Unexpected connection reported")
81 def test_sta_ap_scan_2b(dev, apdev):
82 """Dynamically added wpa_supplicant interface with AP_SCAN 2 operation"""
83 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test" })
84 bssid = apdev[0]['bssid']
86 logger.info("Create a dynamic wpa_supplicant interface and connect")
87 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
88 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1")
90 if "OK" not in wpas.request("AP_SCAN 2"):
91 raise Exception("Failed to set AP_SCAN 2")
93 id = wpas.connect("test", key_mgmt="NONE", bssid=bssid)
94 wpas.request("DISCONNECT")
95 wpas.set_network(id, "disabled", "1")
96 id2 = wpas.add_network()
97 wpas.set_network_quoted(id2, "ssid", "test2")
98 wpas.set_network(id2, "key_mgmt", "NONE")
99 wpas.set_network(id2, "disabled", "0")
100 wpas.request("REASSOCIATE")
101 ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15)
103 raise Exception("Association rejection not reported")
105 wpas.set_network(id, "disabled", "0")
106 wpas.set_network(id2, "disabled", "1")
108 ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15)
110 raise Exception("Association rejection not reported")
111 wpas.request("DISCONNECT")
113 def test_sta_dynamic_down_up(dev, apdev):
114 """Dynamically added wpa_supplicant interface down/up"""
115 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
116 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
118 logger.info("Create a dynamic wpa_supplicant interface and connect")
119 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
120 wpas.interface_add("wlan5")
121 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
122 hwsim_utils.test_connectivity(wpas, hapd)
123 subprocess.call(['ifconfig', wpas.ifname, 'down'])
124 wpas.wait_disconnected(timeout=10)
125 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED":
126 raise Exception("Unexpected wpa_state")
127 subprocess.call(['ifconfig', wpas.ifname, 'up'])
128 wpas.wait_connected(timeout=15, error="Reconnection not reported")
129 hwsim_utils.test_connectivity(wpas, hapd)
131 def test_sta_dynamic_ext_mac_addr_change(dev, apdev):
132 """Dynamically added wpa_supplicant interface with external MAC address change"""
133 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
134 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
136 logger.info("Create a dynamic wpa_supplicant interface and connect")
137 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
138 wpas.interface_add("wlan5")
139 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
140 hwsim_utils.test_connectivity(wpas, hapd)
141 subprocess.call(['ifconfig', wpas.ifname, 'down'])
142 wpas.wait_disconnected(timeout=10)
143 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED":
144 raise Exception("Unexpected wpa_state")
145 prev_addr = wpas.p2p_interface_addr()
146 new_addr = '02:11:22:33:44:55'
148 subprocess.call(['ip', 'link', 'set', 'dev', wpas.ifname,
149 'address', new_addr])
150 subprocess.call(['ifconfig', wpas.ifname, 'up'])
151 wpas.wait_connected(timeout=15, error="Reconnection not reported")
152 if wpas.get_driver_status_field('addr') != new_addr:
153 raise Exception("Address change not reported")
154 hwsim_utils.test_connectivity(wpas, hapd)
155 sta = hapd.get_sta(new_addr)
156 if sta['addr'] != new_addr:
157 raise Exception("STA association with new address not found")
159 subprocess.call(['ifconfig', wpas.ifname, 'down'])
160 subprocess.call(['ip', 'link', 'set', 'dev', wpas.ifname,
161 'address', prev_addr])
162 subprocess.call(['ifconfig', wpas.ifname, 'up'])
164 def test_sta_dynamic_random_mac_addr(dev, apdev):
165 """Dynamically added wpa_supplicant interface and random MAC address"""
166 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
167 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
169 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
170 wpas.interface_add("wlan5")
171 addr0 = wpas.get_driver_status_field("addr")
172 wpas.request("SET preassoc_mac_addr 1")
173 wpas.request("SET rand_addr_lifetime 0")
175 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1",
177 addr1 = wpas.get_driver_status_field("addr")
180 raise Exception("Random MAC address not used")
182 sta = hapd.get_sta(addr0)
183 if sta['addr'] != "FAIL":
184 raise Exception("Unexpected STA association with permanent address")
185 sta = hapd.get_sta(addr1)
186 if sta['addr'] != addr1:
187 raise Exception("STA association with random address not found")
189 wpas.request("DISCONNECT")
190 wpas.connect_network(id)
191 addr2 = wpas.get_driver_status_field("addr")
193 raise Exception("Random MAC address changed unexpectedly")
195 wpas.remove_network(id)
196 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1",
198 addr2 = wpas.get_driver_status_field("addr")
200 raise Exception("Random MAC address did not change")
202 def test_sta_dynamic_random_mac_addr_keep_oui(dev, apdev):
203 """Dynamically added wpa_supplicant interface and random MAC address (keep OUI)"""
204 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
205 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
207 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
208 wpas.interface_add("wlan5")
209 addr0 = wpas.get_driver_status_field("addr")
210 wpas.request("SET preassoc_mac_addr 2")
211 wpas.request("SET rand_addr_lifetime 0")
213 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2",
215 addr1 = wpas.get_driver_status_field("addr")
218 raise Exception("Random MAC address not used")
219 if addr1[3:8] != addr0[3:8]:
220 raise Exception("OUI was not kept")
222 sta = hapd.get_sta(addr0)
223 if sta['addr'] != "FAIL":
224 raise Exception("Unexpected STA association with permanent address")
225 sta = hapd.get_sta(addr1)
226 if sta['addr'] != addr1:
227 raise Exception("STA association with random address not found")
229 wpas.request("DISCONNECT")
230 wpas.connect_network(id)
231 addr2 = wpas.get_driver_status_field("addr")
233 raise Exception("Random MAC address changed unexpectedly")
235 wpas.remove_network(id)
236 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2",
238 addr2 = wpas.get_driver_status_field("addr")
240 raise Exception("Random MAC address did not change")
241 if addr2[3:8] != addr0[3:8]:
242 raise Exception("OUI was not kept")
244 def test_sta_dynamic_random_mac_addr_scan(dev, apdev):
245 """Dynamically added wpa_supplicant interface and random MAC address for scan"""
246 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
247 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
249 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
250 wpas.interface_add("wlan5")
251 addr0 = wpas.get_driver_status_field("addr")
252 wpas.request("SET preassoc_mac_addr 1")
253 wpas.request("SET rand_addr_lifetime 0")
255 id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
256 addr1 = wpas.get_driver_status_field("addr")
259 raise Exception("Random MAC address used unexpectedly")
261 def test_sta_dynamic_random_mac_addr_scan_keep_oui(dev, apdev):
262 """Dynamically added wpa_supplicant interface and random MAC address for scan (keep OUI)"""
263 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
264 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
266 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
267 wpas.interface_add("wlan5")
268 addr0 = wpas.get_driver_status_field("addr")
269 wpas.request("SET preassoc_mac_addr 2")
270 wpas.request("SET rand_addr_lifetime 0")
272 id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
273 addr1 = wpas.get_driver_status_field("addr")
276 raise Exception("Random MAC address used unexpectedly")