Updated to hostap_2_6
[mech_eap.git] / libeap / tests / hwsim / test_p2p_concurrency.py
1 # P2P concurrency test cases
2 # Copyright (c) 2013-2015, 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 from remotehost import remote_compatible
8 import logging
9 logger = logging.getLogger()
10 import subprocess
11 import time
12
13 import hwsim_utils
14 import hostapd
15 from p2p_utils import *
16 from test_ap_ht import clear_scan_cache
17 from utils import HwsimSkip
18
19 @remote_compatible
20 def test_concurrent_autogo(dev, apdev):
21     """Concurrent P2P autonomous GO"""
22     logger.info("Connect to an infrastructure AP")
23     dev[0].request("P2P_SET cross_connect 0")
24     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
25     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
26     hwsim_utils.test_connectivity(dev[0], hapd)
27
28     logger.info("Start a P2P group while associated to an AP")
29     dev[0].global_request("SET p2p_no_group_iface 0")
30     dev[0].p2p_start_go()
31     pin = dev[1].wps_read_pin()
32     dev[0].p2p_go_authorize_client(pin)
33     dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60,
34                              social=True)
35     hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
36     dev[0].remove_group()
37     dev[1].wait_go_ending_session()
38
39     logger.info("Confirm AP connection after P2P group removal")
40     hwsim_utils.test_connectivity(dev[0], hapd)
41
42 def test_concurrent_autogo_5ghz_ht40(dev, apdev):
43     """Concurrent P2P autonomous GO on 5 GHz and HT40 co-ex"""
44     clear_scan_cache(apdev[1])
45     try:
46         hapd = None
47         hapd2 = None
48         params = { "ssid": "ht40",
49                    "hw_mode": "a",
50                    "channel": "153",
51                    "country_code": "US",
52                    "ht_capab": "[HT40-]" }
53         hapd2 = hostapd.add_ap(apdev[1], params)
54
55         params = { "ssid": "test-open-5",
56                    "hw_mode": "a",
57                    "channel": "149",
58                    "country_code": "US" }
59         hapd = hostapd.add_ap(apdev[0], params)
60
61         dev[0].request("P2P_SET cross_connect 0")
62         dev[0].scan_for_bss(apdev[0]['bssid'], freq=5745)
63         dev[0].scan_for_bss(apdev[1]['bssid'], freq=5765)
64         dev[0].connect("test-open-5", key_mgmt="NONE", scan_freq="5745")
65
66         dev[0].global_request("SET p2p_no_group_iface 0")
67         if "OK" not in dev[0].global_request("P2P_GROUP_ADD ht40"):
68             raise Exception("P2P_GROUP_ADD failed")
69         ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
70         if ev is None:
71             raise Exception("GO start up timed out")
72         dev[0].group_form_result(ev)
73
74         pin = dev[1].wps_read_pin()
75         dev[0].p2p_go_authorize_client(pin)
76         dev[1].p2p_find(freq=5745)
77         addr0 = dev[0].p2p_dev_addr()
78         count = 0
79         while count < 10:
80             time.sleep(0.25)
81             count += 1
82             if dev[1].peer_known(addr0):
83                 break
84         dev[1].p2p_connect_group(addr0, pin, timeout=60)
85
86         dev[0].remove_group()
87         dev[1].wait_go_ending_session()
88     finally:
89         dev[0].request("REMOVE_NETWORK all")
90         if hapd:
91             hapd.request("DISABLE")
92         if hapd2:
93             hapd2.request("DISABLE")
94         subprocess.call(['iw', 'reg', 'set', '00'])
95         dev[0].flush_scan_cache()
96         dev[1].flush_scan_cache()
97
98 def test_concurrent_autogo_crossconnect(dev, apdev):
99     """Concurrent P2P autonomous GO"""
100     dev[0].global_request("P2P_SET cross_connect 1")
101     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
102     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
103
104     dev[0].global_request("SET p2p_no_group_iface 0")
105     dev[0].p2p_start_go(no_event_clear=True)
106     ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-ENABLE", timeout=10)
107     if ev is None:
108         raise Exception("Timeout on cross connection enabled event")
109     if dev[0].group_ifname + " " + dev[0].ifname not in ev:
110         raise Exception("Unexpected interfaces: " + ev)
111     dev[0].dump_monitor()
112
113     dev[0].global_request("P2P_SET cross_connect 0")
114     ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-DISABLE", timeout=10)
115     if ev is None:
116         raise Exception("Timeout on cross connection disabled event")
117     if dev[0].group_ifname + " " + dev[0].ifname not in ev:
118         raise Exception("Unexpected interfaces: " + ev)
119     dev[0].remove_group()
120
121     dev[0].global_request("P2P_SET cross_connect 1")
122     dev[0].p2p_start_go(no_event_clear=True)
123     ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-ENABLE", timeout=10)
124     if ev is None:
125         raise Exception("Timeout on cross connection enabled event")
126     if dev[0].group_ifname + " " + dev[0].ifname not in ev:
127         raise Exception("Unexpected interfaces: " + ev)
128     dev[0].dump_monitor()
129     dev[0].remove_group()
130     ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-DISABLE", timeout=10)
131     if ev is None:
132         raise Exception("Timeout on cross connection disabled event")
133     dev[0].global_request("P2P_SET cross_connect 0")
134
135 @remote_compatible
136 def test_concurrent_p2pcli(dev, apdev):
137     """Concurrent P2P client join"""
138     logger.info("Connect to an infrastructure AP")
139     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
140     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
141     hwsim_utils.test_connectivity(dev[0], hapd)
142
143     logger.info("Join a P2P group while associated to an AP")
144     dev[0].global_request("SET p2p_no_group_iface 0")
145     dev[1].p2p_start_go(freq=2412)
146     pin = dev[0].wps_read_pin()
147     dev[1].p2p_go_authorize_client(pin)
148     dev[0].p2p_connect_group(dev[1].p2p_dev_addr(), pin, timeout=60,
149                              social=True)
150     hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
151     dev[1].remove_group()
152     dev[0].wait_go_ending_session()
153
154     logger.info("Confirm AP connection after P2P group removal")
155     hwsim_utils.test_connectivity(dev[0], hapd)
156
157 @remote_compatible
158 def test_concurrent_grpform_go(dev, apdev):
159     """Concurrent P2P group formation to become GO"""
160     logger.info("Connect to an infrastructure AP")
161     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
162     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
163     hwsim_utils.test_connectivity(dev[0], hapd)
164
165     logger.info("Form a P2P group while associated to an AP")
166     dev[0].global_request("SET p2p_no_group_iface 0")
167
168     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
169                                            r_dev=dev[1], r_intent=0)
170     check_grpform_results(i_res, r_res)
171     remove_group(dev[0], dev[1])
172
173     logger.info("Confirm AP connection after P2P group removal")
174     hwsim_utils.test_connectivity(dev[0], hapd)
175
176 @remote_compatible
177 def test_concurrent_grpform_cli(dev, apdev):
178     """Concurrent P2P group formation to become P2P Client"""
179     logger.info("Connect to an infrastructure AP")
180     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
181     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
182     hwsim_utils.test_connectivity(dev[0], hapd)
183
184     logger.info("Form a P2P group while associated to an AP")
185     dev[0].global_request("SET p2p_no_group_iface 0")
186
187     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
188                                            r_dev=dev[1], r_intent=15)
189     check_grpform_results(i_res, r_res)
190     remove_group(dev[0], dev[1])
191
192     logger.info("Confirm AP connection after P2P group removal")
193     hwsim_utils.test_connectivity(dev[0], hapd)
194
195 @remote_compatible
196 def test_concurrent_grpform_while_connecting(dev, apdev):
197     """Concurrent P2P group formation while connecting to an AP"""
198     logger.info("Start connection to an infrastructure AP")
199     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
200     dev[0].connect("test-open", key_mgmt="NONE", wait_connect=False)
201
202     logger.info("Form a P2P group while connecting to an AP")
203     dev[0].global_request("SET p2p_no_group_iface 0")
204
205     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_freq=2412,
206                                            r_dev=dev[1], r_freq=2412)
207     check_grpform_results(i_res, r_res)
208     remove_group(dev[0], dev[1])
209
210     logger.info("Confirm AP connection after P2P group removal")
211     hwsim_utils.test_connectivity(dev[0], hapd)
212
213 @remote_compatible
214 def test_concurrent_grpform_while_connecting2(dev, apdev):
215     """Concurrent P2P group formation while connecting to an AP (2)"""
216     logger.info("Start connection to an infrastructure AP")
217     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
218     dev[0].connect("test-open", key_mgmt="NONE", wait_connect=False)
219     dev[1].flush_scan_cache()
220
221     logger.info("Form a P2P group while connecting to an AP")
222     dev[0].global_request("SET p2p_no_group_iface 0")
223
224     [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=15, i_freq=2412,
225                                 r_dev=dev[1], r_intent=0, r_freq=2412)
226     check_grpform_results(i_res, r_res)
227     remove_group(dev[0], dev[1])
228
229     logger.info("Confirm AP connection after P2P group removal")
230     dev[0].wait_completed()
231     hwsim_utils.test_connectivity(dev[0], hapd)
232
233 @remote_compatible
234 def test_concurrent_grpform_while_connecting3(dev, apdev):
235     """Concurrent P2P group formation while connecting to an AP (3)"""
236     logger.info("Start connection to an infrastructure AP")
237     hapd = hostapd.add_ap(apdev[0], { "ssid": "test-open" })
238     dev[0].connect("test-open", key_mgmt="NONE", wait_connect=False)
239
240     logger.info("Form a P2P group while connecting to an AP")
241     dev[0].global_request("SET p2p_no_group_iface 0")
242
243     [i_res, r_res] = go_neg_pbc(i_dev=dev[1], i_intent=15, i_freq=2412,
244                                 r_dev=dev[0], r_intent=0, r_freq=2412)
245     check_grpform_results(i_res, r_res)
246     remove_group(dev[0], dev[1])
247
248     logger.info("Confirm AP connection after P2P group removal")
249     dev[0].wait_completed()
250     hwsim_utils.test_connectivity(dev[0], hapd)
251
252 @remote_compatible
253 def test_concurrent_persistent_group(dev, apdev):
254     """Concurrent P2P persistent group"""
255     logger.info("Connect to an infrastructure AP")
256     hostapd.add_ap(apdev[0], { "ssid": "test-open", "channel": "2" })
257     dev[0].global_request("SET p2p_no_group_iface 0")
258     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2417")
259
260     logger.info("Run persistent group test while associated to an AP")
261     form(dev[0], dev[1])
262     [go_res, cli_res] = invite_from_cli(dev[0], dev[1])
263     if go_res['freq'] != '2417':
264         raise Exception("Unexpected channel selected: " + go_res['freq'])
265     [go_res, cli_res] = invite_from_go(dev[0], dev[1])
266     if go_res['freq'] != '2417':
267         raise Exception("Unexpected channel selected: " + go_res['freq'])
268
269 def test_concurrent_invitation_channel_mismatch(dev, apdev):
270     """P2P persistent group invitation and channel mismatch"""
271     if dev[0].get_mcc() > 1:
272         raise HwsimSkip("Skip due to MCC being enabled")
273
274     form(dev[0], dev[1])
275     dev[0].dump_monitor()
276     dev[1].dump_monitor()
277
278     logger.info("Connect to an infrastructure AP")
279     hostapd.add_ap(apdev[0], { "ssid": "test-open", "channel": "2" })
280     dev[0].global_request("SET p2p_no_group_iface 0")
281     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2417")
282     invite(dev[1], dev[0], extra="freq=2412")
283     ev = dev[1].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
284     if ev is None:
285         raise Exception("P2P invitation result not received")
286     if "status=7" not in ev:
287         raise Exception("Unexpected P2P invitation result: " + ev)