]>
Commit | Line | Data |
---|---|---|
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 | ||
7 | import logging | |
8 | logger = logging.getLogger() | |
9 | import subprocess | |
10 | import time | |
11 | ||
12 | import hostapd | |
cded555f | 13 | from hostapd import HostapdGlobal |
2d6ce432 JM |
14 | import hwsim_utils |
15 | ||
16 | def 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 | ||
30 | def 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 | ||
61 | def 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 | ||
86 | def 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 | |
129 | def 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]) |