tests: Go to listen state in go_neg_pin_authorized
[mech_eap.git] / tests / hwsim / test_p2p_grpform.py
1 # P2P group formation test cases
2 # Copyright (c) 2013-2014, 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 import logging
8 logger = logging.getLogger()
9 import time
10 import threading
11 import Queue
12
13 import hwsim_utils
14 import utils
15
16 def check_grpform_results(i_res, r_res):
17     if i_res['result'] != 'success' or r_res['result'] != 'success':
18         raise Exception("Failed group formation")
19     if i_res['ssid'] != r_res['ssid']:
20         raise Exception("SSID mismatch")
21     if i_res['freq'] != r_res['freq']:
22         raise Exception("freq mismatch")
23     if 'go_neg_freq' in r_res and i_res['go_neg_freq'] != r_res['go_neg_freq']:
24         raise Exception("go_neg_freq mismatch")
25     if i_res['freq'] != i_res['go_neg_freq']:
26         raise Exception("freq/go_neg_freq mismatch")
27     if i_res['role'] != i_res['go_neg_role']:
28         raise Exception("role/go_neg_role mismatch")
29     if 'go_neg_role' in r_res and r_res['role'] != r_res['go_neg_role']:
30         raise Exception("role/go_neg_role mismatch")
31     if i_res['go_dev_addr'] != r_res['go_dev_addr']:
32         raise Exception("GO Device Address mismatch")
33
34 def go_neg_init(i_dev, r_dev, pin, i_method, i_intent, res):
35     logger.debug("Initiate GO Negotiation from i_dev")
36     try:
37         i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), pin, i_method, timeout=20, go_intent=i_intent)
38         logger.debug("i_res: " + str(i_res))
39     except Exception, e:
40         i_res = None
41         logger.info("go_neg_init thread caught an exception from p2p_go_neg_init: " + str(e))
42     res.put(i_res)
43
44 def go_neg_pin(i_dev, r_dev, i_intent=None, r_intent=None, i_method='enter', r_method='display'):
45     r_dev.p2p_listen()
46     i_dev.p2p_listen()
47     pin = r_dev.wps_read_pin()
48     logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
49     r_dev.dump_monitor()
50     res = Queue.Queue()
51     t = threading.Thread(target=go_neg_init, args=(i_dev, r_dev, pin, i_method, i_intent, res))
52     t.start()
53     logger.debug("Wait for GO Negotiation Request on r_dev")
54     ev = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
55     if ev is None:
56         raise Exception("GO Negotiation timed out")
57     r_dev.dump_monitor()
58     logger.debug("Re-initiate GO Negotiation from r_dev")
59     r_res = r_dev.p2p_go_neg_init(i_dev.p2p_dev_addr(), pin, r_method, go_intent=r_intent, timeout=20)
60     logger.debug("r_res: " + str(r_res))
61     r_dev.dump_monitor()
62     t.join()
63     i_res = res.get()
64     if i_res is None:
65         raise Exception("go_neg_init thread failed")
66     logger.debug("i_res: " + str(i_res))
67     logger.info("Group formed")
68     hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
69     i_dev.dump_monitor()
70     return [i_res, r_res]
71
72 def go_neg_pin_authorized(i_dev, r_dev, i_intent=None, r_intent=None, expect_failure=False, i_go_neg_status=None, i_method='enter', r_method='display', test_data=True, i_freq=None, r_freq=None):
73     i_dev.p2p_listen()
74     pin = r_dev.wps_read_pin()
75     logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
76     r_dev.p2p_go_neg_auth(i_dev.p2p_dev_addr(), pin, r_method, go_intent=r_intent, freq=r_freq)
77     r_dev.p2p_listen()
78     i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), pin, i_method, timeout=20, go_intent=i_intent, expect_failure=expect_failure, freq=i_freq)
79     r_res = r_dev.p2p_go_neg_auth_result(expect_failure=expect_failure)
80     logger.debug("i_res: " + str(i_res))
81     logger.debug("r_res: " + str(r_res))
82     r_dev.dump_monitor()
83     i_dev.dump_monitor()
84     if i_go_neg_status:
85         if i_res['result'] != 'go-neg-failed':
86             raise Exception("Expected GO Negotiation failure not reported")
87         if i_res['status'] != i_go_neg_status:
88             raise Exception("Expected GO Negotiation status not seen")
89     if expect_failure:
90         return
91     logger.info("Group formed")
92     if test_data:
93         hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
94     return [i_res, r_res]
95
96 def go_neg_init_pbc(i_dev, r_dev, i_intent, res, freq, provdisc):
97     logger.debug("Initiate GO Negotiation from i_dev")
98     try:
99         i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), None, "pbc",
100                                       timeout=20, go_intent=i_intent, freq=freq,
101                                       provdisc=provdisc)
102         logger.debug("i_res: " + str(i_res))
103     except Exception, e:
104         i_res = None
105         logger.info("go_neg_init_pbc thread caught an exception from p2p_go_neg_init: " + str(e))
106     res.put(i_res)
107
108 def go_neg_pbc(i_dev, r_dev, i_intent=None, r_intent=None, i_freq=None, r_freq=None, provdisc=False, r_listen=False):
109     if r_listen:
110         r_dev.p2p_listen()
111     else:
112         r_dev.p2p_find(social=True)
113     i_dev.p2p_find(social=True)
114     logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
115     r_dev.dump_monitor()
116     res = Queue.Queue()
117     t = threading.Thread(target=go_neg_init_pbc, args=(i_dev, r_dev, i_intent, res, i_freq, provdisc))
118     t.start()
119     logger.debug("Wait for GO Negotiation Request on r_dev")
120     ev = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
121     if ev is None:
122         raise Exception("GO Negotiation timed out")
123     r_dev.dump_monitor()
124     logger.debug("Re-initiate GO Negotiation from r_dev")
125     r_res = r_dev.p2p_go_neg_init(i_dev.p2p_dev_addr(), None, "pbc",
126                                   go_intent=r_intent, timeout=20, freq=r_freq)
127     logger.debug("r_res: " + str(r_res))
128     r_dev.dump_monitor()
129     t.join()
130     i_res = res.get()
131     if i_res is None:
132         raise Exception("go_neg_init_pbc thread failed")
133     logger.debug("i_res: " + str(i_res))
134     logger.info("Group formed")
135     hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
136     i_dev.dump_monitor()
137     return [i_res, r_res]
138
139 def remove_group(dev1, dev2):
140     dev1.remove_group()
141     try:
142         dev2.remove_group()
143     except:
144         pass
145
146 def test_grpform(dev):
147     """P2P group formation using PIN and authorized connection (init -> GO)"""
148     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
149                                            r_dev=dev[1], r_intent=0)
150     check_grpform_results(i_res, r_res)
151     remove_group(dev[0], dev[1])
152
153 def test_grpform_a(dev):
154     """P2P group formation using PIN and authorized connection (init -> GO) (init: group iface)"""
155     dev[0].request("SET p2p_no_group_iface 0")
156     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
157                                            r_dev=dev[1], r_intent=0)
158     if "p2p-wlan" not in i_res['ifname']:
159         raise Exception("Unexpected group interface name")
160     check_grpform_results(i_res, r_res)
161     remove_group(dev[0], dev[1])
162     if i_res['ifname'] in utils.get_ifnames():
163         raise Exception("Group interface netdev was not removed")
164
165 def test_grpform_b(dev):
166     """P2P group formation using PIN and authorized connection (init -> GO) (resp: group iface)"""
167     dev[1].request("SET p2p_no_group_iface 0")
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     if "p2p-wlan" not in r_res['ifname']:
171         raise Exception("Unexpected group interface name")
172     check_grpform_results(i_res, r_res)
173     remove_group(dev[0], dev[1])
174     if r_res['ifname'] in utils.get_ifnames():
175         raise Exception("Group interface netdev was not removed")
176
177 def test_grpform_c(dev):
178     """P2P group formation using PIN and authorized connection (init -> GO) (group iface)"""
179     dev[0].request("SET p2p_no_group_iface 0")
180     dev[1].request("SET p2p_no_group_iface 0")
181     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
182                                            r_dev=dev[1], r_intent=0)
183     if "p2p-wlan" not in i_res['ifname']:
184         raise Exception("Unexpected group interface name")
185     if "p2p-wlan" not in r_res['ifname']:
186         raise Exception("Unexpected group interface name")
187     check_grpform_results(i_res, r_res)
188     remove_group(dev[0], dev[1])
189     if i_res['ifname'] in utils.get_ifnames():
190         raise Exception("Group interface netdev was not removed")
191     if r_res['ifname'] in utils.get_ifnames():
192         raise Exception("Group interface netdev was not removed")
193
194 def test_grpform2(dev):
195     """P2P group formation using PIN and authorized connection (resp -> GO)"""
196     go_neg_pin_authorized(i_dev=dev[0], i_intent=0, r_dev=dev[1], r_intent=15)
197     remove_group(dev[0], dev[1])
198
199 def test_grpform2_c(dev):
200     """P2P group formation using PIN and authorized connection (resp -> GO) (group iface)"""
201     dev[0].request("SET p2p_no_group_iface 0")
202     dev[1].request("SET p2p_no_group_iface 0")
203     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0, r_dev=dev[1], r_intent=15)
204     remove_group(dev[0], dev[1])
205     if i_res['ifname'] in utils.get_ifnames():
206         raise Exception("Group interface netdev was not removed")
207     if r_res['ifname'] in utils.get_ifnames():
208         raise Exception("Group interface netdev was not removed")
209
210 def test_grpform3(dev):
211     """P2P group formation using PIN and re-init GO Negotiation"""
212     go_neg_pin(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
213     remove_group(dev[0], dev[1])
214
215 def test_grpform3_c(dev):
216     """P2P group formation using PIN and re-init GO Negotiation (group iface)"""
217     dev[0].request("SET p2p_no_group_iface 0")
218     dev[1].request("SET p2p_no_group_iface 0")
219     [i_res, r_res] = go_neg_pin(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
220     remove_group(dev[0], dev[1])
221     if i_res['ifname'] in utils.get_ifnames():
222         raise Exception("Group interface netdev was not removed")
223     if r_res['ifname'] in utils.get_ifnames():
224         raise Exception("Group interface netdev was not removed")
225
226 def test_grpform_pbc(dev):
227     """P2P group formation using PBC and re-init GO Negotiation"""
228     [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
229     check_grpform_results(i_res, r_res)
230     if i_res['role'] != 'GO' or r_res['role'] != 'client':
231         raise Exception("Unexpected device roles")
232     remove_group(dev[0], dev[1])
233
234 def test_grpform_pd(dev):
235     """P2P group formation with PD-before-GO-Neg workaround"""
236     [i_res, r_res] = go_neg_pbc(i_dev=dev[0], provdisc=True, r_dev=dev[1], r_listen=True)
237     check_grpform_results(i_res, r_res)
238     remove_group(dev[0], dev[1])
239
240 def test_grpform_ext_listen(dev):
241     """P2P group formation with extended listen timing enabled"""
242     try:
243         if "OK" not in dev[0].global_request("P2P_EXT_LISTEN 100 50000"):
244             raise Exception("Failed to set extended listen timing")
245         if "OK" not in dev[1].global_request("P2P_EXT_LISTEN 200 40000"):
246             raise Exception("Failed to set extended listen timing")
247         [i_res, r_res] = go_neg_pbc(i_dev=dev[0], provdisc=True, r_dev=dev[1], r_listen=True)
248         check_grpform_results(i_res, r_res)
249         peer1 = dev[0].get_peer(dev[1].p2p_dev_addr())
250         if peer1['ext_listen_interval'] != "40000":
251             raise Exception("Extended listen interval not discovered correctly")
252         if peer1['ext_listen_period'] != "200":
253             raise Exception("Extended listen period not discovered correctly")
254         peer0 = dev[1].get_peer(dev[0].p2p_dev_addr())
255         if peer0['ext_listen_interval'] != "50000":
256             raise Exception("Extended listen interval not discovered correctly")
257         if peer0['ext_listen_period'] != "100":
258             raise Exception("Extended listen period not discovered correctly")
259         remove_group(dev[0], dev[1])
260     finally:
261         if "OK" not in dev[0].global_request("P2P_EXT_LISTEN"):
262             raise Exception("Failed to clear extended listen timing")
263         if "OK" not in dev[1].global_request("P2P_EXT_LISTEN"):
264             raise Exception("Failed to clear extended listen timing")
265
266 def test_both_go_intent_15(dev):
267     """P2P GO Negotiation with both devices using GO intent 15"""
268     go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=15, expect_failure=True, i_go_neg_status=9)
269
270 def test_both_go_neg_display(dev):
271     """P2P GO Negotiation with both devices trying to display PIN"""
272     go_neg_pin_authorized(i_dev=dev[0], r_dev=dev[1], expect_failure=True, i_go_neg_status=10, i_method='display', r_method='display')
273
274 def test_both_go_neg_enter(dev):
275     """P2P GO Negotiation with both devices trying to enter PIN"""
276     go_neg_pin_authorized(i_dev=dev[0], r_dev=dev[1], expect_failure=True, i_go_neg_status=10, i_method='enter', r_method='enter')
277
278 def test_go_neg_pbc_vs_pin(dev):
279     """P2P GO Negotiation with one device using PBC and the other PIN"""
280     addr0 = dev[0].p2p_dev_addr()
281     addr1 = dev[1].p2p_dev_addr()
282     dev[1].p2p_listen()
283     if not dev[0].discover_peer(addr1):
284         raise Exception("Could not discover peer")
285     dev[0].p2p_listen()
286     if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " pbc auth"):
287         raise Exception("Failed to authorize GO Neg")
288     if not dev[1].discover_peer(addr0):
289         raise Exception("Could not discover peer")
290     if "OK" not in dev[1].request("P2P_CONNECT " + addr0 + " 12345670 display"):
291         raise Exception("Failed to initiate GO Neg")
292     ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=10)
293     if ev is None:
294         raise Exception("GO Negotiation failure timed out")
295     if "status=10" not in ev:
296         raise Exception("Unexpected failure reason: " + ev)
297
298 def test_go_neg_pin_vs_pbc(dev):
299     """P2P GO Negotiation with one device using PIN and the other PBC"""
300     addr0 = dev[0].p2p_dev_addr()
301     addr1 = dev[1].p2p_dev_addr()
302     dev[1].p2p_listen()
303     if not dev[0].discover_peer(addr1):
304         raise Exception("Could not discover peer")
305     dev[0].p2p_listen()
306     if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " 12345670 display auth"):
307         raise Exception("Failed to authorize GO Neg")
308     if not dev[1].discover_peer(addr0):
309         raise Exception("Could not discover peer")
310     if "OK" not in dev[1].request("P2P_CONNECT " + addr0 + " pbc"):
311         raise Exception("Failed to initiate GO Neg")
312     ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=10)
313     if ev is None:
314         raise Exception("GO Negotiation failure timed out")
315     if "status=10" not in ev:
316         raise Exception("Unexpected failure reason: " + ev)
317
318 def test_grpform_per_sta_psk(dev):
319     """P2P group formation with per-STA PSKs"""
320     dev[0].request("P2P_SET per_sta_psk 1")
321     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
322     check_grpform_results(i_res, r_res)
323
324     pin = dev[2].wps_read_pin()
325     dev[0].p2p_go_authorize_client(pin)
326     c_res = dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
327     check_grpform_results(i_res, c_res)
328
329     if r_res['psk'] == c_res['psk']:
330         raise Exception("Same PSK assigned for both clients")
331
332     hwsim_utils.test_connectivity_p2p(dev[1], dev[2])
333
334     dev[0].remove_group()
335     dev[1].wait_go_ending_session()
336     dev[2].wait_go_ending_session()
337
338 def test_grpform_per_sta_psk_wps(dev):
339     """P2P group formation with per-STA PSKs with non-P2P WPS STA"""
340     dev[0].request("P2P_SET per_sta_psk 1")
341     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
342     check_grpform_results(i_res, r_res)
343
344     dev[0].p2p_go_authorize_client_pbc()
345     dev[2].request("WPS_PBC")
346     ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
347     if ev is None:
348         raise Exception("Association with the GO timed out")
349
350     hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
351
352     dev[0].remove_group()
353     dev[2].request("DISCONNECT")
354     dev[1].wait_go_ending_session()
355
356 def test_grpform_force_chan_go(dev):
357     """P2P group formation forced channel selection by GO"""
358     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
359                                            i_freq=2432,
360                                            r_dev=dev[1], r_intent=0,
361                                            test_data=False)
362     check_grpform_results(i_res, r_res)
363     if i_res['freq'] != "2432":
364         raise Exception("Unexpected channel - did not follow GO's forced channel")
365     remove_group(dev[0], dev[1])
366
367 def test_grpform_force_chan_cli(dev):
368     """P2P group formation forced channel selection by client"""
369     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
370                                            i_freq=2417,
371                                            r_dev=dev[1], r_intent=15,
372                                            test_data=False)
373     check_grpform_results(i_res, r_res)
374     if i_res['freq'] != "2417":
375         raise Exception("Unexpected channel - did not follow GO's forced channel")
376     remove_group(dev[0], dev[1])
377
378 def test_grpform_force_chan_conflict(dev):
379     """P2P group formation fails due to forced channel mismatch"""
380     go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422,
381                           r_dev=dev[1], r_intent=15, r_freq=2427,
382                           expect_failure=True, i_go_neg_status=7)
383
384 def test_grpform_pref_chan_go(dev):
385     """P2P group formation preferred channel selection by GO"""
386     dev[0].request("SET p2p_pref_chan 81:7")
387     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
388                                            r_dev=dev[1], r_intent=0,
389                                            test_data=False)
390     check_grpform_results(i_res, r_res)
391     if i_res['freq'] != "2442":
392         raise Exception("Unexpected channel - did not follow GO's p2p_pref_chan")
393     remove_group(dev[0], dev[1])
394
395 def test_grpform_pref_chan_go_overridden(dev):
396     """P2P group formation preferred channel selection by GO overridden by client"""
397     dev[1].request("SET p2p_pref_chan 81:7")
398     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
399                                            i_freq=2422,
400                                            r_dev=dev[1], r_intent=15,
401                                            test_data=False)
402     check_grpform_results(i_res, r_res)
403     if i_res['freq'] != "2422":
404         raise Exception("Unexpected channel - did not follow client's forced channel")
405     remove_group(dev[0], dev[1])
406
407 def test_grpform_no_go_freq_forcing_chan(dev):
408     """P2P group formation with no-GO freq forcing channel"""
409     dev[1].request("SET p2p_no_go_freq 100-200,300,4000-6000")
410     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
411                                            r_dev=dev[1], r_intent=15,
412                                            test_data=False)
413     check_grpform_results(i_res, r_res)
414     if int(i_res['freq']) > 4000:
415         raise Exception("Unexpected channel - did not follow no-GO freq")
416     remove_group(dev[0], dev[1])
417
418 def test_grpform_no_go_freq_conflict(dev):
419     """P2P group formation fails due to no-GO range forced by client"""
420     dev[1].request("SET p2p_no_go_freq 2000-3000")
421     go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422,
422                           r_dev=dev[1], r_intent=15,
423                           expect_failure=True, i_go_neg_status=7)
424
425 def test_grpform_no_5ghz_world_roaming(dev):
426     """P2P group formation with world roaming regulatory"""
427     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
428                                            r_dev=dev[1], r_intent=15,
429                                            test_data=False)
430     check_grpform_results(i_res, r_res)
431     if int(i_res['freq']) > 4000:
432         raise Exception("Unexpected channel - did not follow world roaming rules")
433     remove_group(dev[0], dev[1])
434
435 def test_grpform_no_5ghz_add_cli(dev):
436     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1"""
437     dev[0].request("SET p2p_add_cli_chan 1")
438     dev[1].request("SET p2p_add_cli_chan 1")
439     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
440                                            r_dev=dev[1], r_intent=14,
441                                            test_data=False)
442     check_grpform_results(i_res, r_res)
443     if int(i_res['freq']) > 4000:
444         raise Exception("Unexpected channel - did not follow world roaming rules")
445     remove_group(dev[0], dev[1])
446
447 def test_grpform_no_5ghz_add_cli2(dev):
448     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse)"""
449     dev[0].request("SET p2p_add_cli_chan 1")
450     dev[1].request("SET p2p_add_cli_chan 1")
451     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=14,
452                                            r_dev=dev[1], r_intent=0,
453                                            test_data=False)
454     check_grpform_results(i_res, r_res)
455     if int(i_res['freq']) > 4000:
456         raise Exception("Unexpected channel - did not follow world roaming rules")
457     remove_group(dev[0], dev[1])
458
459 def test_grpform_no_5ghz_add_cli3(dev):
460     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (intent 15)"""
461     dev[0].request("SET p2p_add_cli_chan 1")
462     dev[1].request("SET p2p_add_cli_chan 1")
463     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
464                                            r_dev=dev[1], r_intent=15,
465                                            test_data=False)
466     check_grpform_results(i_res, r_res)
467     if int(i_res['freq']) > 4000:
468         raise Exception("Unexpected channel - did not follow world roaming rules")
469     remove_group(dev[0], dev[1])
470
471 def test_grpform_no_5ghz_add_cli4(dev):
472     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse; intent 15)"""
473     dev[0].request("SET p2p_add_cli_chan 1")
474     dev[1].request("SET p2p_add_cli_chan 1")
475     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
476                                            r_dev=dev[1], r_intent=0,
477                                            test_data=False)
478     check_grpform_results(i_res, r_res)
479     if int(i_res['freq']) > 4000:
480         raise Exception("Unexpected channel - did not follow world roaming rules")
481     remove_group(dev[0], dev[1])
482
483 def test_grpform_incorrect_pin(dev):
484     """P2P GO Negotiation with incorrect PIN"""
485     dev[1].p2p_listen()
486     pin = dev[1].wps_read_pin()
487     addr1 = dev[1].p2p_dev_addr()
488     if not dev[0].discover_peer(addr1):
489         raise Exception("Peer not found")
490     dev[1].p2p_go_neg_auth(dev[0].p2p_dev_addr(), pin, 'display', go_intent=0)
491     dev[0].request("P2P_CONNECT " + addr1 + " 00000000 enter go_intent=15")
492     ev = dev[1].wait_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=10)
493     if ev is None:
494         raise Exception("Group formation failure timed out")
495     ev = dev[0].wait_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=5)
496     if ev is None:
497         raise Exception("Group formation failure timed out")
498
499 def test_grpform_reject(dev):
500     """User rejecting group formation attempt by a P2P peer"""
501     addr0 = dev[0].p2p_dev_addr()
502     dev[0].p2p_listen()
503     dev[1].p2p_go_neg_init(addr0, None, "pbc")
504     ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
505     if ev is None:
506         raise Exception("GO Negotiation timed out")
507     if "FAIL" in dev[0].global_request("P2P_REJECT " + ev.split(' ')[1]):
508         raise Exception("P2P_REJECT failed")
509     dev[1].request("P2P_STOP_FIND")
510     dev[1].p2p_go_neg_init(addr0, None, "pbc")
511     ev = dev[1].wait_global_event(["GO-NEG-FAILURE"], timeout=10)
512     if ev is None:
513         raise Exception("Rejection not reported")
514     if "status=11" not in ev:
515         raise Exception("Unexpected status code in rejection")
516
517 def test_grpform_pd_no_probe_resp(dev):
518     """GO Negotiation after PD, but no Probe Response"""
519     addr0 = dev[0].p2p_dev_addr()
520     addr1 = dev[1].p2p_dev_addr()
521     dev[0].p2p_listen()
522     if not dev[1].discover_peer(addr0):
523         raise Exception("Peer not found")
524     dev[1].p2p_stop_find()
525     dev[0].p2p_stop_find()
526     peer = dev[0].get_peer(addr1)
527     if peer['listen_freq'] == '0':
528         raise Exception("Peer listen frequency not learned from Probe Request")
529     time.sleep(0.3)
530     dev[0].request("P2P_FLUSH")
531     dev[0].p2p_listen()
532     dev[1].global_request("P2P_PROV_DISC " + addr0 + " display")
533     ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
534     if ev is None:
535         raise Exception("PD Request timed out")
536     ev = dev[1].wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
537     if ev is None:
538         raise Exception("PD Response timed out")
539     peer = dev[0].get_peer(addr1)
540     if peer['listen_freq'] != '0':
541         raise Exception("Peer listen frequency learned unexpectedly from PD Request")
542
543     pin = dev[0].wps_read_pin()
544     if "FAIL" in dev[1].request("P2P_CONNECT " + addr0 + " " + pin + " enter"):
545         raise Exception("P2P_CONNECT on initiator failed")
546     ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
547     if ev is None:
548         raise Exception("GO Negotiation start timed out")
549     peer = dev[0].get_peer(addr1)
550     if peer['listen_freq'] == '0':
551         raise Exception("Peer listen frequency not learned from PD followed by GO Neg Req")
552     if "FAIL" in dev[0].request("P2P_CONNECT " + addr1 + " " + pin + " display"):
553         raise Exception("P2P_CONNECT on responder failed")
554     ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
555     if ev is None:
556         raise Exception("Group formation timed out")
557     ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
558     if ev is None:
559         raise Exception("Group formation timed out")
560
561 def test_go_neg_two_peers(dev):
562     """P2P GO Negotiation rejected due to already started negotiation with another peer"""
563     addr0 = dev[0].p2p_dev_addr()
564     addr1 = dev[1].p2p_dev_addr()
565     addr2 = dev[2].p2p_dev_addr()
566     dev[1].p2p_listen()
567     dev[2].p2p_listen()
568     if not dev[0].discover_peer(addr1):
569         raise Exception("Could not discover peer")
570     if not dev[0].discover_peer(addr2):
571         raise Exception("Could not discover peer")
572     if "OK" not in dev[0].request("P2P_CONNECT " + addr2 + " pbc auth"):
573         raise Exception("Failed to authorize GO Neg")
574     dev[0].p2p_listen()
575     if not dev[2].discover_peer(addr0):
576         raise Exception("Could not discover peer")
577     if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " pbc"):
578         raise Exception("Failed to initiate GO Neg")
579     ev = dev[1].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
580     if ev is None:
581         raise Exception("timeout on GO Neg RX event")
582     dev[2].request("P2P_CONNECT " + addr0 + " pbc")
583     ev = dev[2].wait_global_event(["GO-NEG-FAILURE"], timeout=10)
584     if ev is None:
585         raise Exception("Rejection not reported")
586     if "status=5" not in ev:
587         raise Exception("Unexpected status code in rejection: " + ev)