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