Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / 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(['iw', wpas.ifname, 'connect', 'test', '2412'])
45     wpas.wait_connected(timeout=10)
46     wpas.request("SCAN")
47     wpas.wait_connected(timeout=5)
48
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']
53
54     logger.info("Create a dynamic wpa_supplicant interface and connect")
55     wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
56     wpas.interface_add("wlan5")
57
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")
64
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'])
69     time.sleep(1)
70     subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412'])
71     wpas.wait_connected(timeout=10)
72
73     wpas.request("SET disallow_aps bssid " + bssid)
74     wpas.wait_disconnected(timeout=10)
75
76     subprocess.call(['iw', wpas.ifname, 'connect', 'test', '2412'])
77     ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
78     if ev is not None:
79         raise Exception("Unexpected connection reported")
80
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']
85
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")
89
90     if "OK" not in wpas.request("AP_SCAN 2"):
91         raise Exception("Failed to set AP_SCAN 2")
92
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)
102     if ev is None:
103         raise Exception("Association rejection not reported")
104     hapd.disable()
105     wpas.set_network(id, "disabled", "0")
106     wpas.set_network(id2, "disabled", "1")
107     for i in range(3):
108         ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15)
109         if ev is None:
110             raise Exception("Association rejection not reported")
111     wpas.request("DISCONNECT")
112
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)
117
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)
130
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)
135
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'
147     try:
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")
158     finally:
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'])
163
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)
168
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")
174
175     id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1",
176                       scan_freq="2412")
177     addr1 = wpas.get_driver_status_field("addr")
178
179     if addr0 == addr1:
180         raise Exception("Random MAC address not used")
181
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")
188
189     wpas.request("DISCONNECT")
190     wpas.connect_network(id)
191     addr2 = wpas.get_driver_status_field("addr")
192     if addr1 != addr2:
193         raise Exception("Random MAC address changed unexpectedly")
194
195     wpas.remove_network(id)
196     id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="1",
197                       scan_freq="2412")
198     addr2 = wpas.get_driver_status_field("addr")
199     if addr1 == addr2:
200         raise Exception("Random MAC address did not change")
201
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)
206
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")
212
213     id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2",
214                       scan_freq="2412")
215     addr1 = wpas.get_driver_status_field("addr")
216
217     if addr0 == addr1:
218         raise Exception("Random MAC address not used")
219     if addr1[3:8] != addr0[3:8]:
220         raise Exception("OUI was not kept")
221
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")
228
229     wpas.request("DISCONNECT")
230     wpas.connect_network(id)
231     addr2 = wpas.get_driver_status_field("addr")
232     if addr1 != addr2:
233         raise Exception("Random MAC address changed unexpectedly")
234
235     wpas.remove_network(id)
236     id = wpas.connect("sta-dynamic", psk="12345678", mac_addr="2",
237                       scan_freq="2412")
238     addr2 = wpas.get_driver_status_field("addr")
239     if addr1 == addr2:
240         raise Exception("Random MAC address did not change")
241     if addr2[3:8] != addr0[3:8]:
242         raise Exception("OUI was not kept")
243
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)
248
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")
254
255     id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
256     addr1 = wpas.get_driver_status_field("addr")
257
258     if addr0 != addr1:
259         raise Exception("Random MAC address used unexpectedly")
260
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)
265
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")
271
272     id = wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412")
273     addr1 = wpas.get_driver_status_field("addr")
274
275     if addr0 != addr1:
276         raise Exception("Random MAC address used unexpectedly")