]>
Commit | Line | Data |
---|---|---|
e1a5e09a JM |
1 | # wpa_supplicant AP mode tests |
2 | # Copyright (c) 2014, Qualcomm Atheros, Inc. | |
3 | # | |
4 | # This software may be distributed under the terms of the BSD license. | |
5 | # See README for more details. | |
6 | ||
7 | import time | |
8 | import logging | |
9 | logger = logging.getLogger() | |
10 | ||
11 | import hwsim_utils | |
12 | ||
13 | def test_wpas_ap_open(dev): | |
14 | """wpa_supplicant AP mode - open network""" | |
15 | id = dev[0].add_network() | |
16 | dev[0].set_network(id, "mode", "2") | |
17 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
18 | dev[0].set_network(id, "key_mgmt", "NONE") | |
19 | dev[0].set_network(id, "frequency", "2412") | |
20 | dev[0].set_network(id, "scan_freq", "2412") | |
21 | dev[0].select_network(id) | |
22 | ||
23 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
24 | dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
25 | hwsim_utils.test_connectivity(dev[0].ifname, dev[1].ifname) | |
26 | hwsim_utils.test_connectivity(dev[1].ifname, dev[2].ifname) | |
27 | ||
28 | addr1 = dev[1].p2p_interface_addr() | |
29 | addr2 = dev[2].p2p_interface_addr() | |
30 | addrs = [ addr1, addr2 ] | |
31 | sta = dev[0].get_sta(None) | |
32 | if sta['addr'] not in addrs: | |
33 | raise Exception("Unexpected STA address") | |
34 | sta1 = dev[0].get_sta(sta['addr']) | |
35 | if sta1['addr'] not in addrs: | |
36 | raise Exception("Unexpected STA address") | |
37 | sta2 = dev[0].get_sta(sta['addr'], next=True) | |
38 | if sta2['addr'] not in addrs: | |
39 | raise Exception("Unexpected STA2 address") | |
40 | sta3 = dev[0].get_sta(sta2['addr'], next=True) | |
41 | if len(sta3) != 0: | |
42 | raise Exception("Unexpected STA iteration result (did not stop)") | |
43 | ||
44 | status = dev[0].get_status() | |
45 | if status['mode'] != "AP": | |
46 | raise Exception("Unexpected status mode") | |
47 | ||
48 | dev[1].dump_monitor() | |
49 | dev[2].dump_monitor() | |
50 | dev[0].request("DEAUTHENTICATE " + addr1) | |
51 | dev[0].request("DISASSOCIATE " + addr2) | |
52 | ev = dev[1].wait_event(["CTRL-EVENT-DISCONNECTED"]) | |
53 | if ev is None: | |
54 | raise Exception("Disconnection timed out") | |
55 | ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"]) | |
56 | if ev is None: | |
57 | raise Exception("Disconnection timed out") | |
58 | ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"]) | |
59 | if ev is None: | |
60 | raise Exception("Reconnection timed out") | |
61 | ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"]) | |
62 | if ev is None: | |
63 | raise Exception("Reconnection timed out") | |
64 | ||
65 | def test_wpas_ap_wep(dev): | |
66 | """wpa_supplicant AP mode - WEP""" | |
67 | id = dev[0].add_network() | |
68 | dev[0].set_network(id, "mode", "2") | |
69 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep") | |
70 | dev[0].set_network(id, "key_mgmt", "NONE") | |
71 | dev[0].set_network(id, "frequency", "2412") | |
72 | dev[0].set_network(id, "scan_freq", "2412") | |
73 | dev[0].set_network_quoted(id, "wep_key0", "hello") | |
74 | dev[0].select_network(id) | |
75 | ||
76 | dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"', | |
77 | scan_freq="2412") | |
78 | hwsim_utils.test_connectivity(dev[0].ifname, dev[1].ifname) | |
79 | ||
80 | def test_wpas_ap_no_ssid(dev): | |
81 | """wpa_supplicant AP mode - invalid network configuration""" | |
82 | id = dev[0].add_network() | |
83 | dev[0].set_network(id, "mode", "2") | |
84 | dev[0].set_network(id, "key_mgmt", "NONE") | |
85 | dev[0].set_network(id, "frequency", "2412") | |
86 | dev[0].set_network(id, "scan_freq", "2412") | |
87 | dev[0].select_network(id) | |
88 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) | |
89 | if ev is not None: | |
90 | raise Exception("Unexpected AP start") | |
91 | ||
92 | def test_wpas_ap_default_frequency(dev): | |
93 | """wpa_supplicant AP mode - default frequency""" | |
94 | id = dev[0].add_network() | |
95 | dev[0].set_network(id, "mode", "2") | |
96 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
97 | dev[0].set_network(id, "key_mgmt", "NONE") | |
98 | dev[0].set_network(id, "scan_freq", "2412") | |
99 | dev[0].select_network(id) | |
100 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"]) | |
101 | if ev is None: | |
102 | raise Exception("AP failed to start") | |
103 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462") | |
104 | ||
105 | def test_wpas_ap_invalid_frequency(dev): | |
106 | """wpa_supplicant AP mode - invalid frequency configuration""" | |
107 | id = dev[0].add_network() | |
108 | dev[0].set_network(id, "mode", "2") | |
109 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
110 | dev[0].set_network(id, "key_mgmt", "NONE") | |
111 | dev[0].set_network(id, "frequency", "2413") | |
112 | dev[0].set_network(id, "scan_freq", "2412") | |
113 | dev[0].select_network(id) | |
114 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) | |
115 | if ev is not None: | |
116 | raise Exception("Unexpected AP start") | |
117 | ||
118 | def test_wpas_ap_wps(dev): | |
119 | """wpa_supplicant AP mode - WPS operations""" | |
120 | id = dev[0].add_network() | |
121 | dev[0].set_network(id, "mode", "2") | |
122 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps") | |
123 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
124 | dev[0].set_network(id, "frequency", "2412") | |
125 | dev[0].set_network(id, "scan_freq", "2412") | |
126 | dev[0].select_network(id) | |
127 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"]) | |
128 | if ev is None: | |
129 | raise Exception("AP start timeout") | |
130 | bssid = dev[0].p2p_interface_addr() | |
131 | ||
132 | logger.info("Test PBC mode start/stop") | |
133 | if "FAIL" not in dev[0].request("WPS_CANCEL"): | |
134 | raise Exception("Unexpected WPS_CANCEL success") | |
135 | dev[0].request("WPS_PBC") | |
136 | ev = dev[0].wait_event(["WPS-PBC-ACTIVE"]) | |
137 | if ev is None: | |
138 | raise Exception("PBC mode start timeout") | |
139 | if "OK" not in dev[0].request("WPS_CANCEL"): | |
140 | raise Exception("Unexpected WPS_CANCEL failure") | |
141 | ev = dev[0].wait_event(["WPS-TIMEOUT"]) | |
142 | if ev is None: | |
143 | raise Exception("PBC mode disabling timeout") | |
144 | ||
145 | logger.info("Test PBC protocol run") | |
146 | dev[0].request("WPS_PBC") | |
147 | ev = dev[0].wait_event(["WPS-PBC-ACTIVE"]) | |
148 | if ev is None: | |
149 | raise Exception("PBC mode start timeout") | |
150 | dev[1].request("WPS_PBC") | |
151 | ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30) | |
152 | if ev is None: | |
153 | raise Exception("WPS PBC operation timed out") | |
154 | hwsim_utils.test_connectivity(dev[0].ifname, dev[1].ifname) | |
155 | ||
156 | logger.info("Test AP PIN to learn configuration") | |
157 | pin = dev[0].request("WPS_AP_PIN random") | |
158 | if "FAIL" in pin: | |
159 | raise Exception("Could not generate random AP PIN") | |
160 | if pin not in dev[0].request("WPS_AP_PIN get"): | |
161 | raise Exception("Could not fetch current AP PIN") | |
162 | dev[2].wps_reg(bssid, pin) | |
163 | hwsim_utils.test_connectivity(dev[1].ifname, dev[2].ifname) | |
164 | ||
165 | dev[1].request("REMOVE_NETWORK all") | |
166 | dev[2].request("REMOVE_NETWORK all") | |
167 | ||
168 | logger.info("Test AP PIN operations") | |
169 | dev[0].request("WPS_AP_PIN disable") | |
170 | dev[0].request("WPS_AP_PIN set " + pin + " 1") | |
171 | time.sleep(1.1) | |
172 | if "FAIL" not in dev[0].request("WPS_AP_PIN get"): | |
173 | raise Exception("AP PIN unexpectedly still enabled") | |
174 | ||
175 | pin = dev[1].wps_read_pin() | |
176 | dev[0].request("WPS_PIN any " + pin) | |
177 | dev[1].request("WPS_PIN any " + pin) | |
178 | ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30) | |
179 | if ev is None: | |
180 | raise Exception("Association with the AP timed out") | |
181 | dev[1].request("REMOVE_NETWORK all") | |
182 | dev[1].dump_monitor() | |
183 | ||
184 | dev[0].request("WPS_AP_PIN set 12345670") | |
185 | dev[0].dump_monitor() | |
186 | ||
187 | runs = ("88887777", "12340000", "00000000", "12345670") | |
188 | for pin in runs: | |
189 | logger.info("Try AP PIN " + pin) | |
190 | dev[2].dump_monitor() | |
191 | dev[2].request("WPS_REG " + bssid + " " + pin) | |
192 | ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15) | |
193 | if ev is None: | |
194 | raise Exception("WPS operation timed out") | |
195 | if "WPS-SUCCESS" in ev: | |
196 | raise Exception("WPS operation succeeded unexpectedly") | |
197 | ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"]) | |
198 | if ev is None: | |
199 | raise Exception("Timeout while waiting for disconnection") | |
200 | dev[2].request("WPS_CANCEL") | |
201 | dev[2].request("REMOVE_NETWORK all") | |
202 | ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"]) | |
203 | if ev is None: | |
204 | raise Exception("WPS AP PIN not locked") |