]>
git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_rfkill.py
2 # Copyright (c) 2014, 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()
12 from hostapd
import HostapdGlobal
14 from wpasupplicant
import WpaSupplicant
15 from rfkill
import RFKill
16 from utils
import HwsimSkip
17 from hwsim
import HWSimRadio
20 phy
= dev
.get_driver_status_field("phyname")
22 for r
, s
, h
in RFKill
.list():
25 except Exception as e
:
26 raise HwsimSkip("No rfkill available: " + str(e
))
27 raise HwsimSkip("No rfkill match found for the interface")
29 def test_rfkill_open(dev
, apdev
):
30 """rfkill block/unblock during open mode connection"""
31 rfk
= get_rfkill(dev
[0])
33 hapd
= hostapd
.add_ap(apdev
[0], {"ssid": "open"})
34 dev
[0].connect("open", key_mgmt
="NONE", scan_freq
="2412")
36 logger
.info("rfkill block")
38 dev
[0].wait_disconnected(timeout
=10,
39 error
="Missing disconnection event on rfkill block")
41 if "FAIL" not in dev
[0].request("REASSOCIATE"):
42 raise Exception("REASSOCIATE accepted while disabled")
43 if "FAIL" not in dev
[0].request("REATTACH"):
44 raise Exception("REATTACH accepted while disabled")
45 if "FAIL" not in dev
[0].request("RECONNECT"):
46 raise Exception("RECONNECT accepted while disabled")
47 if "FAIL" not in dev
[0].request("FETCH_OSU"):
48 raise Exception("FETCH_OSU accepted while disabled")
50 logger
.info("rfkill unblock")
52 dev
[0].wait_connected(timeout
=10,
53 error
="Missing connection event on rfkill unblock")
54 hwsim_utils
.test_connectivity(dev
[0], hapd
)
58 def test_rfkill_wpa2_psk(dev
, apdev
):
59 """rfkill block/unblock during WPA2-PSK connection"""
60 rfk
= get_rfkill(dev
[0])
62 ssid
= "test-wpa2-psk"
63 passphrase
= 'qwertyuiop'
64 params
= hostapd
.wpa2_params(ssid
=ssid
, passphrase
=passphrase
)
65 hapd
= hostapd
.add_ap(apdev
[0], params
)
66 dev
[0].connect(ssid
, psk
=passphrase
, scan_freq
="2412")
69 logger
.info("rfkill block")
71 dev
[0].wait_disconnected(timeout
=10,
72 error
="Missing disconnection event on rfkill block")
74 logger
.info("rfkill unblock")
76 dev
[0].wait_connected(timeout
=10,
77 error
="Missing connection event on rfkill unblock")
79 hwsim_utils
.test_connectivity(dev
[0], hapd
)
83 def test_rfkill_autogo(dev
, apdev
):
84 """rfkill block/unblock for autonomous P2P GO"""
85 rfk0
= get_rfkill(dev
[0])
86 rfk1
= get_rfkill(dev
[1])
89 dev
[1].request("SET p2p_no_group_iface 0")
93 logger
.info("rfkill block 0")
95 ev
= dev
[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout
=10)
97 raise Exception("Group removal not reported")
98 if "reason=UNAVAILABLE" not in ev
:
99 raise Exception("Unexpected group removal reason: " + ev
)
100 if "FAIL" not in dev
[0].request("P2P_LISTEN 1"):
101 raise Exception("P2P_LISTEN accepted unexpectedly")
102 if "FAIL" not in dev
[0].request("P2P_LISTEN"):
103 raise Exception("P2P_LISTEN accepted unexpectedly")
105 logger
.info("rfkill block 1")
107 ev
= dev
[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout
=10)
109 raise Exception("Group removal not reported")
110 if "reason=UNAVAILABLE" not in ev
:
111 raise Exception("Unexpected group removal reason: " + ev
)
113 logger
.info("rfkill unblock 0")
115 logger
.info("rfkill unblock 1")
122 def _test_rfkill_p2p_discovery(dev0
, dev1
):
123 """rfkill block/unblock P2P Discovery"""
124 rfk0
= get_rfkill(dev0
)
125 rfk1
= get_rfkill(dev1
)
128 addr0
= dev0
.p2p_dev_addr()
130 logger
.info("rfkill block 0")
132 logger
.info("rfkill block 1")
137 if dev0
.get_status_field("wpa_state") == "INTERFACE_DISABLED" and dev1
.get_status_field("wpa_state") == "INTERFACE_DISABLED":
140 if "OK" in dev0
.p2p_listen():
141 raise Exception("P2P Listen success although in rfkill")
143 if "OK" in dev1
.p2p_find():
144 raise Exception("P2P Find success although in rfkill")
149 logger
.info("rfkill unblock 0")
151 logger
.info("rfkill unblock 1")
156 if dev0
.get_status_field("wpa_state") != "INTERFACE_DISABLED" and dev1
.get_status_field("wpa_state") != "INTERFACE_DISABLED":
159 if "OK" not in dev0
.p2p_listen():
160 raise Exception("P2P Listen failed after unblocking rfkill")
162 if not dev1
.discover_peer(addr0
, social
=True):
163 raise Exception("Failed to discover peer after unblocking rfkill")
173 def test_rfkill_p2p_discovery(dev
, apdev
):
174 """rfkill block/unblock P2P Discovery"""
175 _test_rfkill_p2p_discovery(dev
[0], dev
[1])
177 def test_rfkill_p2p_discovery_p2p_dev(dev
, apdev
):
178 """rfkill block/unblock P2P Discovery with P2P Device"""
179 with
HWSimRadio(use_p2p_device
=True) as (radio
, iface
):
180 wpas
= WpaSupplicant(global_iface
='/tmp/wpas-wlan5')
181 wpas
.interface_add(iface
)
182 _test_rfkill_p2p_discovery(dev
[0], wpas
)
183 _test_rfkill_p2p_discovery(wpas
, dev
[1])
185 def test_rfkill_hostapd(dev
, apdev
):
186 """rfkill block/unblock during and prior to hostapd operations"""
187 hapd
= hostapd
.add_ap(apdev
[0], {"ssid": "open"})
189 rfk
= get_rfkill(hapd
)
193 ev
= hapd
.wait_event(["INTERFACE-DISABLED"], timeout
=5)
195 raise Exception("INTERFACE-DISABLED event not seen")
197 ev
= hapd
.wait_event(["INTERFACE-ENABLED"], timeout
=5)
199 raise Exception("INTERFACE-ENABLED event not seen")
200 # hostapd does not current re-enable beaconing automatically
203 dev
[0].connect("open", key_mgmt
="NONE", scan_freq
="2412")
205 ev
= hapd
.wait_event(["INTERFACE-DISABLED"], timeout
=5)
207 raise Exception("INTERFACE-DISABLED event not seen")
208 dev
[0].wait_disconnected(timeout
=10)
209 dev
[0].request("DISCONNECT")
212 hglobal
= HostapdGlobal(apdev
[0])
214 hglobal
.remove(apdev
[0]['ifname'])
216 hapd
= hostapd
.add_ap(apdev
[0], {"ssid": "open2"},
218 if "FAIL" not in hapd
.request("ENABLE"):
219 raise Exception("ENABLE succeeded unexpectedly (rfkill)")
223 def test_rfkill_wpas(dev
, apdev
):
224 """rfkill block prior to wpa_supplicant start"""
225 wpas
= WpaSupplicant(global_iface
='/tmp/wpas-wlan5')
226 wpas
.interface_add("wlan5")
227 rfk
= get_rfkill(wpas
)
228 wpas
.interface_remove("wlan5")
231 wpas
.interface_add("wlan5")
233 state
= wpas
.get_status_field("wpa_state")
234 if state
!= "INTERFACE_DISABLED":
235 raise Exception("Unexpected state with rfkill blocked: " + state
)
238 state
= wpas
.get_status_field("wpa_state")
239 if state
== "INTERFACE_DISABLED":
240 raise Exception("Unexpected state with rfkill unblocked: " + state
)