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