]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/test_rfkill.py
tests: Add wait_connected() and wait_disconnected() helpers
[thirdparty/hostap.git] / tests / hwsim / test_rfkill.py
CommitLineData
2d6ce432
JM
1# rfkill tests
2# Copyright (c) 2014, 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
7import logging
8logger = logging.getLogger()
9import subprocess
10import time
11
12import hostapd
cded555f 13from hostapd import HostapdGlobal
2d6ce432
JM
14import hwsim_utils
15
16def get_rfkill_id(dev):
17 try:
18 cmd = subprocess.Popen(["rfkill", "list"], stdout=subprocess.PIPE)
19 except Exception, e:
20 logger.info("No rfkill available: " + str(e))
21 return None
22 res = cmd.stdout.read()
23 cmd.stdout.close()
24 phy = dev.get_driver_status_field("phyname")
25 matches = [ line for line in res.splitlines() if phy + ':' in line ]
26 if len(matches) != 1:
27 return None
28 return matches[0].split(':')[0]
29
30def test_rfkill_open(dev, apdev):
31 """rfkill block/unblock during open mode connection"""
32 id = get_rfkill_id(dev[0])
33 if id is None:
34 return "skip"
35
36 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
37 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
38 try:
39 logger.info("rfkill block")
40 subprocess.call(['sudo', 'rfkill', 'block', id])
5f35a5e2
JM
41 dev[0].wait_disconnected(timeout=10,
42 error="Missing disconnection event on rfkill block")
2d6ce432 43
6eae42f9
JM
44 if "FAIL" not in dev[0].request("REASSOCIATE"):
45 raise Exception("REASSOCIATE accepted while disabled")
46 if "FAIL" not in dev[0].request("REATTACH"):
47 raise Exception("REATTACH accepted while disabled")
48 if "FAIL" not in dev[0].request("RECONNECT"):
49 raise Exception("RECONNECT accepted while disabled")
69f99123
JM
50 if "FAIL" not in dev[0].request("FETCH_OSU"):
51 raise Exception("FETCH_OSU accepted while disabled")
6eae42f9 52
2d6ce432
JM
53 logger.info("rfkill unblock")
54 subprocess.call(['sudo', 'rfkill', 'unblock', id])
5f35a5e2
JM
55 dev[0].wait_connected(timeout=10,
56 error="Missing connection event on rfkill unblock")
a8375c94 57 hwsim_utils.test_connectivity(dev[0], hapd)
2d6ce432
JM
58 finally:
59 subprocess.call(['sudo', 'rfkill', 'unblock', id])
60
61def test_rfkill_wpa2_psk(dev, apdev):
62 """rfkill block/unblock during WPA2-PSK connection"""
63 id = get_rfkill_id(dev[0])
64 if id is None:
65 return "skip"
66
67 ssid = "test-wpa2-psk"
68 passphrase = 'qwertyuiop'
69 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
70 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
71 dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
72 try:
73 logger.info("rfkill block")
74 subprocess.call(['sudo', 'rfkill', 'block', id])
5f35a5e2
JM
75 dev[0].wait_disconnected(timeout=10,
76 error="Missing disconnection event on rfkill block")
2d6ce432
JM
77
78 logger.info("rfkill unblock")
79 subprocess.call(['sudo', 'rfkill', 'unblock', id])
5f35a5e2
JM
80 dev[0].wait_connected(timeout=10,
81 error="Missing connection event on rfkill unblock")
a8375c94 82 hwsim_utils.test_connectivity(dev[0], hapd)
2d6ce432
JM
83 finally:
84 subprocess.call(['sudo', 'rfkill', 'unblock', id])
85
86def test_rfkill_autogo(dev, apdev):
87 """rfkill block/unblock for autonomous P2P GO"""
88 id0 = get_rfkill_id(dev[0])
89 if id0 is None:
90 return "skip"
91 id1 = get_rfkill_id(dev[1])
92 if id1 is None:
93 return "skip"
94
95 dev[0].p2p_start_go()
96 dev[1].request("SET p2p_no_group_iface 0")
97 dev[1].p2p_start_go()
98
99 try:
100 logger.info("rfkill block 0")
101 subprocess.call(['sudo', 'rfkill', 'block', id0])
102 ev = dev[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
103 if ev is None:
104 raise Exception("Group removal not reported")
105 if "reason=UNAVAILABLE" not in ev:
106 raise Exception("Unexpected group removal reason: " + ev)
6da4a0af
JM
107 if "FAIL" not in dev[0].request("P2P_LISTEN 1"):
108 raise Exception("P2P_LISTEN accepted unexpectedly")
109 if "FAIL" not in dev[0].request("P2P_LISTEN"):
110 raise Exception("P2P_LISTEN accepted unexpectedly")
2d6ce432
JM
111
112 logger.info("rfkill block 1")
113 subprocess.call(['sudo', 'rfkill', 'block', id1])
114 ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
115 if ev is None:
116 raise Exception("Group removal not reported")
117 if "reason=UNAVAILABLE" not in ev:
118 raise Exception("Unexpected group removal reason: " + ev)
119
120 logger.info("rfkill unblock 0")
121 subprocess.call(['sudo', 'rfkill', 'unblock', id0])
122 logger.info("rfkill unblock 1")
123 subprocess.call(['sudo', 'rfkill', 'unblock', id1])
124 time.sleep(1)
125 finally:
126 subprocess.call(['sudo', 'rfkill', 'unblock', id0])
127 subprocess.call(['sudo', 'rfkill', 'unblock', id1])
cded555f
JM
128
129def test_rfkill_hostapd(dev, apdev):
130 """rfkill block/unblock during and prior to hostapd operations"""
131 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
132
133 id = get_rfkill_id(hapd)
134 if id is None:
135 return "skip"
136
137 try:
138 subprocess.call(['rfkill', 'block', id])
139 ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=5)
140 if ev is None:
141 raise Exception("INTERFACE-DISABLED event not seen")
142 subprocess.call(['rfkill', 'unblock', id])
143 ev = hapd.wait_event(["INTERFACE-ENABLED"], timeout=5)
144 if ev is None:
145 raise Exception("INTERFACE-ENABLED event not seen")
146 # hostapd does not current re-enable beaconing automatically
147 hapd.disable()
148 hapd.enable()
149 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
150 subprocess.call(['rfkill', 'block', id])
151 ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=5)
152 if ev is None:
153 raise Exception("INTERFACE-DISABLED event not seen")
5f35a5e2 154 dev[0].wait_disconnected(timeout=10)
cded555f
JM
155 dev[0].request("DISCONNECT")
156 hapd.disable()
157
158 hglobal = HostapdGlobal()
159 hglobal.flush()
160 hglobal.remove(apdev[0]['ifname'])
161
162 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open2" },
163 no_enable=True)
164 if "FAIL" not in hapd.request("ENABLE"):
165 raise Exception("ENABLE succeeded unexpectedly (rfkill)")
166 finally:
167 subprocess.call(['rfkill', 'unblock', id])