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