]>
git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_sta_dynamic.py
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(['sudo', 'iw', wpas
.ifname
, 'connect', 'test', '2412'])
45 ev
= wpas
.wait_event(["CTRL-EVENT-CONNECTED"], timeout
=10)
47 raise Exception("Connection not reported")
49 ev
= wpas
.wait_event(["CTRL-EVENT-CONNECTED"], timeout
=5)
51 raise Exception("Connection not reported")
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']
58 logger
.info("Create a dynamic wpa_supplicant interface and connect")
59 wpas
= WpaSupplicant(global_iface
='/tmp/wpas-wlan5')
60 wpas
.interface_add("wlan5")
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")
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',
75 subprocess
.call(['sudo', 'iw', wpas
.ifname
, 'connect', 'test', '2412'])
76 ev
= wpas
.wait_event(["CTRL-EVENT-CONNECTED"], timeout
=10)
78 raise Exception("Connection not reported")
80 wpas
.request("SET disallow_aps bssid " + bssid
)
81 ev
= wpas
.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout
=10)
83 raise Exception("Disconnection not reported")
85 subprocess
.call(['sudo', 'iw', wpas
.ifname
, 'connect', 'test', '2412'])
86 ev
= wpas
.wait_event(["CTRL-EVENT-CONNECTED"], timeout
=1)
88 raise Exception("Unexpected connection reported")
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
)
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)
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)
109 raise Exception("Reconnection not reported")
110 hwsim_utils
.test_connectivity(wpas
, hapd
)
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
)
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)
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'
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)
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")
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'])
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
)
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")
160 id = wpas
.connect("sta-dynamic", psk
="12345678", mac_addr
="1",
162 addr1
= wpas
.get_driver_status_field("addr")
165 raise Exception("Random MAC address not used")
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")
174 wpas
.request("DISCONNECT")
175 wpas
.connect_network(id)
176 addr2
= wpas
.get_driver_status_field("addr")
178 raise Exception("Random MAC address changed unexpectedly")
180 wpas
.remove_network(id)
181 id = wpas
.connect("sta-dynamic", psk
="12345678", mac_addr
="1",
183 addr2
= wpas
.get_driver_status_field("addr")
185 raise Exception("Random MAC address did not change")
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
)
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")
198 id = wpas
.connect("sta-dynamic", psk
="12345678", mac_addr
="2",
200 addr1
= wpas
.get_driver_status_field("addr")
203 raise Exception("Random MAC address not used")
204 if addr1
[3:8] != addr0
[3:8]:
205 raise Exception("OUI was not kept")
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")
214 wpas
.request("DISCONNECT")
215 wpas
.connect_network(id)
216 addr2
= wpas
.get_driver_status_field("addr")
218 raise Exception("Random MAC address changed unexpectedly")
220 wpas
.remove_network(id)
221 id = wpas
.connect("sta-dynamic", psk
="12345678", mac_addr
="2",
223 addr2
= wpas
.get_driver_status_field("addr")
225 raise Exception("Random MAC address did not change")
226 if addr2
[3:8] != addr0
[3:8]:
227 raise Exception("OUI was not kept")
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
)
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")
240 id = wpas
.connect("sta-dynamic", psk
="12345678", scan_freq
="2412")
241 addr1
= wpas
.get_driver_status_field("addr")
244 raise Exception("Random MAC address used unexpectedly")
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
)
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")
257 id = wpas
.connect("sta-dynamic", psk
="12345678", scan_freq
="2412")
258 addr1
= wpas
.get_driver_status_field("addr")
261 raise Exception("Random MAC address used unexpectedly")