tests: PD-before-GO-Neg workaround
[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     r_dev.p2p_listen()
74     i_dev.p2p_listen()
75     pin = r_dev.wps_read_pin()
76     logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
77     r_dev.p2p_go_neg_auth(i_dev.p2p_dev_addr(), pin, r_method, go_intent=r_intent, freq=r_freq)
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_both_go_intent_15(dev):
241     """P2P GO Negotiation with both devices using GO intent 15"""
242     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)
243
244 def test_both_go_neg_display(dev):
245     """P2P GO Negotiation with both devices trying to display PIN"""
246     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')
247
248 def test_both_go_neg_enter(dev):
249     """P2P GO Negotiation with both devices trying to enter PIN"""
250     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')
251
252 def test_grpform_per_sta_psk(dev):
253     """P2P group formation with per-STA PSKs"""
254     dev[0].request("P2P_SET per_sta_psk 1")
255     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
256     check_grpform_results(i_res, r_res)
257
258     pin = dev[2].wps_read_pin()
259     dev[0].p2p_go_authorize_client(pin)
260     c_res = dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
261     check_grpform_results(i_res, c_res)
262
263     if r_res['psk'] == c_res['psk']:
264         raise Exception("Same PSK assigned for both clients")
265
266     hwsim_utils.test_connectivity_p2p(dev[1], dev[2])
267
268     dev[0].remove_group()
269     dev[1].wait_go_ending_session()
270     dev[2].wait_go_ending_session()
271
272 def test_grpform_per_sta_psk_wps(dev):
273     """P2P group formation with per-STA PSKs with non-P2P WPS STA"""
274     dev[0].request("P2P_SET per_sta_psk 1")
275     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
276     check_grpform_results(i_res, r_res)
277
278     dev[0].p2p_go_authorize_client_pbc()
279     dev[2].request("WPS_PBC")
280     ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
281     if ev is None:
282         raise Exception("Association with the GO timed out")
283
284     hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
285
286     dev[0].remove_group()
287     dev[2].request("DISCONNECT")
288     dev[1].wait_go_ending_session()
289
290 def test_grpform_force_chan_go(dev):
291     """P2P group formation forced channel selection by GO"""
292     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
293                                            i_freq=2432,
294                                            r_dev=dev[1], r_intent=0,
295                                            test_data=False)
296     check_grpform_results(i_res, r_res)
297     if i_res['freq'] != "2432":
298         raise Exception("Unexpected channel - did not follow GO's forced channel")
299     remove_group(dev[0], dev[1])
300
301 def test_grpform_force_chan_cli(dev):
302     """P2P group formation forced channel selection by client"""
303     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
304                                            i_freq=2417,
305                                            r_dev=dev[1], r_intent=15,
306                                            test_data=False)
307     check_grpform_results(i_res, r_res)
308     if i_res['freq'] != "2417":
309         raise Exception("Unexpected channel - did not follow GO's forced channel")
310     remove_group(dev[0], dev[1])
311
312 def test_grpform_force_chan_conflict(dev):
313     """P2P group formation fails due to forced channel mismatch"""
314     go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422,
315                           r_dev=dev[1], r_intent=15, r_freq=2427,
316                           expect_failure=True, i_go_neg_status=7)
317
318 def test_grpform_pref_chan_go(dev):
319     """P2P group formation preferred channel selection by GO"""
320     dev[0].request("SET p2p_pref_chan 81:7")
321     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
322                                            r_dev=dev[1], r_intent=0,
323                                            test_data=False)
324     check_grpform_results(i_res, r_res)
325     if i_res['freq'] != "2442":
326         raise Exception("Unexpected channel - did not follow GO's p2p_pref_chan")
327     remove_group(dev[0], dev[1])
328
329 def test_grpform_pref_chan_go_overridden(dev):
330     """P2P group formation preferred channel selection by GO overridden by client"""
331     dev[1].request("SET p2p_pref_chan 81:7")
332     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
333                                            i_freq=2422,
334                                            r_dev=dev[1], r_intent=15,
335                                            test_data=False)
336     check_grpform_results(i_res, r_res)
337     if i_res['freq'] != "2422":
338         raise Exception("Unexpected channel - did not follow client's forced channel")
339     remove_group(dev[0], dev[1])
340
341 def test_grpform_no_go_freq_forcing_chan(dev):
342     """P2P group formation with no-GO freq forcing channel"""
343     dev[1].request("SET p2p_no_go_freq 100-200,300,4000-6000")
344     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
345                                            r_dev=dev[1], r_intent=15,
346                                            test_data=False)
347     check_grpform_results(i_res, r_res)
348     if int(i_res['freq']) > 4000:
349         raise Exception("Unexpected channel - did not follow no-GO freq")
350     remove_group(dev[0], dev[1])
351
352 def test_grpform_no_go_freq_conflict(dev):
353     """P2P group formation fails due to no-GO range forced by client"""
354     dev[1].request("SET p2p_no_go_freq 2000-3000")
355     go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422,
356                           r_dev=dev[1], r_intent=15,
357                           expect_failure=True, i_go_neg_status=7)
358
359 def test_grpform_no_5ghz_world_roaming(dev):
360     """P2P group formation with world roaming regulatory"""
361     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
362                                            r_dev=dev[1], r_intent=15,
363                                            test_data=False)
364     check_grpform_results(i_res, r_res)
365     if int(i_res['freq']) > 4000:
366         raise Exception("Unexpected channel - did not follow world roaming rules")
367     remove_group(dev[0], dev[1])
368
369 def test_grpform_no_5ghz_add_cli(dev):
370     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1"""
371     dev[0].request("SET p2p_add_cli_chan 1")
372     dev[1].request("SET p2p_add_cli_chan 1")
373     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
374                                            r_dev=dev[1], r_intent=14,
375                                            test_data=False)
376     check_grpform_results(i_res, r_res)
377     if int(i_res['freq']) > 4000:
378         raise Exception("Unexpected channel - did not follow world roaming rules")
379     remove_group(dev[0], dev[1])
380
381 def test_grpform_no_5ghz_add_cli2(dev):
382     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse)"""
383     dev[0].request("SET p2p_add_cli_chan 1")
384     dev[1].request("SET p2p_add_cli_chan 1")
385     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=14,
386                                            r_dev=dev[1], r_intent=0,
387                                            test_data=False)
388     check_grpform_results(i_res, r_res)
389     if int(i_res['freq']) > 4000:
390         raise Exception("Unexpected channel - did not follow world roaming rules")
391     remove_group(dev[0], dev[1])
392
393 def test_grpform_no_5ghz_add_cli3(dev):
394     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (intent 15)"""
395     dev[0].request("SET p2p_add_cli_chan 1")
396     dev[1].request("SET p2p_add_cli_chan 1")
397     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
398                                            r_dev=dev[1], r_intent=15,
399                                            test_data=False)
400     check_grpform_results(i_res, r_res)
401     if int(i_res['freq']) > 4000:
402         raise Exception("Unexpected channel - did not follow world roaming rules")
403     remove_group(dev[0], dev[1])
404
405 def test_grpform_no_5ghz_add_cli4(dev):
406     """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse; intent 15)"""
407     dev[0].request("SET p2p_add_cli_chan 1")
408     dev[1].request("SET p2p_add_cli_chan 1")
409     [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
410                                            r_dev=dev[1], r_intent=0,
411                                            test_data=False)
412     check_grpform_results(i_res, r_res)
413     if int(i_res['freq']) > 4000:
414         raise Exception("Unexpected channel - did not follow world roaming rules")
415     remove_group(dev[0], dev[1])
416
417 def test_grpform_incorrect_pin(dev):
418     """P2P GO Negotiation with incorrect PIN"""
419     dev[1].p2p_listen()
420     pin = dev[1].wps_read_pin()
421     addr1 = dev[1].p2p_dev_addr()
422     if not dev[0].discover_peer(addr1):
423         raise Exception("Peer not found")
424     dev[1].p2p_go_neg_auth(dev[0].p2p_dev_addr(), pin, 'display', go_intent=0)
425     dev[0].request("P2P_CONNECT " + addr1 + " 00000000 enter go_intent=15")
426     ev = dev[1].wait_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=10)
427     if ev is None:
428         raise Exception("Group formation failure timed out")
429     ev = dev[0].wait_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=5)
430     if ev is None:
431         raise Exception("Group formation failure timed out")
432
433 def test_grpform_reject(dev):
434     """User rejecting group formation attempt by a P2P peer"""
435     addr0 = dev[0].p2p_dev_addr()
436     dev[0].p2p_listen()
437     dev[1].p2p_go_neg_init(addr0, None, "pbc")
438     ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
439     if ev is None:
440         raise Exception("GO Negotiation timed out")
441     if "FAIL" in dev[0].global_request("P2P_REJECT " + ev.split(' ')[1]):
442         raise Exception("P2P_REJECT failed")
443     dev[1].request("P2P_STOP_FIND")
444     dev[1].p2p_go_neg_init(addr0, None, "pbc")
445     ev = dev[1].wait_global_event(["GO-NEG-FAILURE"], timeout=10)
446     if ev is None:
447         raise Exception("Rejection not reported")
448     if "status=11" not in ev:
449         raise Exception("Unexpected status code in rejection")
450
451 def test_grpform_pd_no_probe_resp(dev):
452     """GO Negotiation after PD, but no Probe Response"""
453     addr0 = dev[0].p2p_dev_addr()
454     addr1 = dev[1].p2p_dev_addr()
455     dev[0].p2p_listen()
456     if not dev[1].discover_peer(addr0):
457         raise Exception("Peer not found")
458     dev[1].p2p_stop_find()
459     dev[0].p2p_stop_find()
460     peer = dev[0].get_peer(addr1)
461     if peer['listen_freq'] == '0':
462         raise Exception("Peer listen frequency not learned from Probe Request")
463     time.sleep(0.3)
464     dev[0].request("P2P_FLUSH")
465     dev[0].p2p_listen()
466     dev[1].global_request("P2P_PROV_DISC " + addr0 + " display")
467     ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
468     if ev is None:
469         raise Exception("PD Request timed out")
470     ev = dev[1].wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
471     if ev is None:
472         raise Exception("PD Response timed out")
473     peer = dev[0].get_peer(addr1)
474     if peer['listen_freq'] != '0':
475         raise Exception("Peer listen frequency learned unexpectedly from PD Request")
476
477     pin = dev[0].wps_read_pin()
478     if "FAIL" in dev[1].request("P2P_CONNECT " + addr0 + " " + pin + " enter"):
479         raise Exception("P2P_CONNECT on initiator failed")
480     ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
481     if ev is None:
482         raise Exception("GO Negotiation start timed out")
483     peer = dev[0].get_peer(addr1)
484     if peer['listen_freq'] == '0':
485         raise Exception("Peer listen frequency not learned from PD followed by GO Neg Req")
486     if "FAIL" in dev[0].request("P2P_CONNECT " + addr1 + " " + pin + " display"):
487         raise Exception("P2P_CONNECT on responder failed")
488     ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
489     if ev is None:
490         raise Exception("Group formation timed out")
491     ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
492     if ev is None:
493         raise Exception("Group formation timed out")