]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_sta_dynamic.py
tests: Pass wpas/hapd instance to test_connectivity()
[thirdparty/hostap.git] / tests / hwsim / test_sta_dynamic.py
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
7 import logging
8 logger = logging.getLogger()
9 import subprocess
10 import time
11
12 import hwsim_utils
13 import hostapd
14 from wpasupplicant import WpaSupplicant
15
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)
20
21 logger.info("Create a dynamic wpa_supplicant interface and connect")
22 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
23 wpas.interface_add("wlan5")
24
25 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
26
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']
31
32 logger.info("Create a dynamic wpa_supplicant interface and connect")
33 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
34 wpas.interface_add("wlan5")
35
36 if "OK" not in wpas.request("AP_SCAN 0"):
37 raise Exception("Failed to set AP_SCAN 2")
38
39 id = wpas.connect("", key_mgmt="NONE", bssid=bssid,
40 only_add_network=True)
41 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect")
42 wpas.request("SCAN")
43 time.sleep(0.5)
44 subprocess.call(['sudo', 'iw', wpas.ifname, 'connect', 'test', '2412'])
45 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
46 if ev is None:
47 raise Exception("Connection not reported")
48 wpas.request("SCAN")
49 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=5)
50 if ev is None:
51 raise Exception("Connection not reported")
52
53 def test_sta_ap_scan_2(dev, apdev):
54 """Dynamically added wpa_supplicant interface with AP_SCAN 2 connection"""
55 hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test" })
56 bssid = apdev[0]['bssid']
57
58 logger.info("Create a dynamic wpa_supplicant interface and connect")
59 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
60 wpas.interface_add("wlan5")
61
62 if "FAIL" not in wpas.request("AP_SCAN -1"):
63 raise Exception("Invalid AP_SCAN -1 accepted")
64 if "FAIL" not in wpas.request("AP_SCAN 3"):
65 raise Exception("Invalid AP_SCAN 3 accepted")
66 if "OK" not in wpas.request("AP_SCAN 2"):
67 raise Exception("Failed to set AP_SCAN 2")
68
69 id = wpas.connect("", key_mgmt="NONE", bssid=bssid,
70 only_add_network=True)
71 wpas.request("ENABLE_NETWORK " + str(id) + " no-connect")
72 subprocess.call(['sudo', 'iw', wpas.ifname, 'scan', 'trigger',
73 'freq', '2412'])
74 time.sleep(1)
75 subprocess.call(['sudo', 'iw', wpas.ifname, 'connect', 'test', '2412'])
76 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
77 if ev is None:
78 raise Exception("Connection not reported")
79
80 wpas.request("SET disallow_aps bssid " + bssid)
81 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
82 if ev is None:
83 raise Exception("Disconnection not reported")
84
85 subprocess.call(['sudo', 'iw', wpas.ifname, 'connect', 'test', '2412'])
86 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
87 if ev is not None:
88 raise Exception("Unexpected connection reported")
89
90 def test_sta_dynamic_down_up(dev, apdev):
91 """Dynamically added wpa_supplicant interface down/up"""
92 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
93 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
94
95 logger.info("Create a dynamic wpa_supplicant interface and connect")
96 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
97 wpas.interface_add("wlan5")
98 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
99 hwsim_utils.test_connectivity(wpas, hapd)
100 subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'down'])
101 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
102 if ev is None:
103 raise Exception("Disconnection not reported")
104 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED":
105 raise Exception("Unexpected wpa_state")
106 subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'up'])
107 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
108 if ev is None:
109 raise Exception("Reconnection not reported")
110 hwsim_utils.test_connectivity(wpas, hapd)
111
112 def test_sta_dynamic_ext_mac_addr_change(dev, apdev):
113 """Dynamically added wpa_supplicant interface with external MAC address change"""
114 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
115 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
116
117 logger.info("Create a dynamic wpa_supplicant interface and connect")
118 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
119 wpas.interface_add("wlan5")
120 wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
121 hwsim_utils.test_connectivity(wpas, hapd)
122 subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'down'])
123 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
124 if ev is None:
125 raise Exception("Disconnection not reported")
126 if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED":
127 raise Exception("Unexpected wpa_state")
128 prev_addr = wpas.p2p_interface_addr()
129 new_addr = '02:11:22:33:44:55'
130 try:
131 subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', wpas.ifname,
132 'address', new_addr])
133 subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'up'])
134 ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
135 if ev is None:
136 raise Exception("Reconnection not reported")
137 if wpas.get_driver_status_field('addr') != new_addr:
138 raise Exception("Address change not reported")
139 hwsim_utils.test_connectivity(wpas, hapd)
140 sta = hapd.get_sta(new_addr)
141 if sta['addr'] != new_addr:
142 raise Exception("STA association with new address not found")
143 finally:
144 subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'down'])
145 subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', wpas.ifname,
146 'address', prev_addr])
147 subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'up'])
148
149 def test_sta_dynamic_random_mac_addr(dev, apdev):
150 """Dynamically added wpa_supplicant interface and random MAC address"""
151 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
152 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
153
154 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
155 wpas.interface_add("wlan5")
156 addr0 = wpas.get_driver_status_field("addr")
157 wpas.request("SET preassoc_mac_addr 1")
158 wpas.request("SET rand_addr_lifetime 0")
159
160 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1",
161 scan_freq="2412")
162 addr1 = wpas.get_driver_status_field("addr")
163
164 if addr0 == addr1:
165 raise Exception("Random MAC address not used")
166
167 sta = hapd.get_sta(addr0)
168 if sta['addr'] != "FAIL":
169 raise Exception("Unexpected STA association with permanent address")
170 sta = hapd.get_sta(addr1)
171 if sta['addr'] != addr1:
172 raise Exception("STA association with random address not found")
173
174 wpas.request("DISCONNECT")
175 wpas.connect_network(id)
176 addr2 = wpas.get_driver_status_field("addr")
177 if addr1 != addr2:
178 raise Exception("Random MAC address changed unexpectedly")
179
180 wpas.remove_network(id)
181 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1",
182 scan_freq="2412")
183 addr2 = wpas.get_driver_status_field("addr")
184 if addr1 == addr2:
185 raise Exception("Random MAC address did not change")
186
187 def test_sta_dynamic_random_mac_addr_keep_oui(dev, apdev):
188 """Dynamically added wpa_supplicant interface and random MAC address (keep OUI)"""
189 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
190 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
191
192 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
193 wpas.interface_add("wlan5")
194 addr0 = wpas.get_driver_status_field("addr")
195 wpas.request("SET preassoc_mac_addr 2")
196 wpas.request("SET rand_addr_lifetime 0")
197
198 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2",
199 scan_freq="2412")
200 addr1 = wpas.get_driver_status_field("addr")
201
202 if addr0 == addr1:
203 raise Exception("Random MAC address not used")
204 if addr1[3:8] != addr0[3:8]:
205 raise Exception("OUI was not kept")
206
207 sta = hapd.get_sta(addr0)
208 if sta['addr'] != "FAIL":
209 raise Exception("Unexpected STA association with permanent address")
210 sta = hapd.get_sta(addr1)
211 if sta['addr'] != addr1:
212 raise Exception("STA association with random address not found")
213
214 wpas.request("DISCONNECT")
215 wpas.connect_network(id)
216 addr2 = wpas.get_driver_status_field("addr")
217 if addr1 != addr2:
218 raise Exception("Random MAC address changed unexpectedly")
219
220 wpas.remove_network(id)
221 id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2",
222 scan_freq="2412")
223 addr2 = wpas.get_driver_status_field("addr")
224 if addr1 == addr2:
225 raise Exception("Random MAC address did not change")
226 if addr2[3:8] != addr0[3:8]:
227 raise Exception("OUI was not kept")
228
229 def test_sta_dynamic_random_mac_addr_scan(dev, apdev):
230 """Dynamically added wpa_supplicant interface and random MAC address for scan"""
231 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
232 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
233
234 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
235 wpas.interface_add("wlan5")
236 addr0 = wpas.get_driver_status_field("addr")
237 wpas.request("SET preassoc_mac_addr 1")
238 wpas.request("SET rand_addr_lifetime 0")
239
240 id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
241 addr1 = wpas.get_driver_status_field("addr")
242
243 if addr0 != addr1:
244 raise Exception("Random MAC address used unexpectedly")
245
246 def test_sta_dynamic_random_mac_addr_scan_keep_oui(dev, apdev):
247 """Dynamically added wpa_supplicant interface and random MAC address for scan (keep OUI)"""
248 params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678")
249 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
250
251 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
252 wpas.interface_add("wlan5")
253 addr0 = wpas.get_driver_status_field("addr")
254 wpas.request("SET preassoc_mac_addr 2")
255 wpas.request("SET rand_addr_lifetime 0")
256
257 id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
258 addr1 = wpas.get_driver_status_field("addr")
259
260 if addr0 != addr1:
261 raise Exception("Random MAC address used unexpectedly")