1# Wi-Fi Display test cases
2# Copyright (c) 2013, 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()
10
11import hwsim_utils
12from p2p_utils import *
13
14def test_wifi_display(dev):
15    """Wi-Fi Display extensions to P2P"""
16    wfd_devinfo = "00411c440028"
17    dev[0].request("SET wifi_display 1")
18    dev[0].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo)
19    if wfd_devinfo not in dev[0].request("WFD_SUBELEM_GET 0"):
20        raise Exception("Could not fetch back configured subelement")
21
22    # Associated BSSID
23    dev[0].request("WFD_SUBELEM_SET 1 0006020304050607")
24    # Coupled Sink
25    dev[0].request("WFD_SUBELEM_SET 6 000700000000000000")
26    # Session Info
27    dev[0].request("WFD_SUBELEM_SET 9 0000")
28    # WFD Extended Capability
29    dev[0].request("WFD_SUBELEM_SET 7 00020000")
30    # WFD Content Protection
31    prot = "0001" + "00"
32    dev[0].request("WFD_SUBELEM_SET 5 " + prot)
33    # WFD Video Formats
34    video = "0015" + "010203040506070809101112131415161718192021"
35    dev[0].request("WFD_SUBELEM_SET 3 " + video)
36    # WFD 3D Video Formats
37    video_3d = "0011" + "0102030405060708091011121314151617"
38    dev[0].request("WFD_SUBELEM_SET 4 " + video_3d)
39    # WFD Audio Formats
40    audio = "000f" + "010203040506070809101112131415"
41    dev[0].request("WFD_SUBELEM_SET 2 " + audio)
42
43    elems = dev[0].request("WFD_SUBELEM_GET all")
44    if wfd_devinfo not in elems:
45        raise Exception("Could not fetch back configured subelements")
46
47    wfd_devinfo2 = "00001c440028"
48    dev[1].request("SET wifi_display 1")
49    dev[1].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo2)
50    if wfd_devinfo2 not in dev[1].request("WFD_SUBELEM_GET 0"):
51        raise Exception("Could not fetch back configured subelement")
52
53    dev[0].p2p_listen()
54    if "FAIL" in dev[1].global_request("P2P_SERV_DISC_REQ " + dev[0].p2p_dev_addr() + " wifi-display [source][pri-sink] 2,3,4,5"):
55        raise Exception("Setting SD request failed")
56    dev[1].p2p_find(social=True)
57    ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
58    if ev is None:
59        raise Exception("Device discovery request not reported")
60    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
61    if ev is None:
62        raise Exception("Device discovery timed out")
63    if "wfd_dev_info=0x" + wfd_devinfo not in ev:
64        raise Exception("Wi-Fi Display Info not in P2P-DEVICE-FOUND event")
65    if "new=1" not in ev:
66        raise Exception("new=1 flag missing from P2P-DEVICE-FOUND event")
67    ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=5)
68    if ev is None:
69        raise Exception("Service discovery timed out")
70    if prot not in ev:
71        raise Exception("WFD Content Protection missing from WSD response")
72    if video not in ev:
73        raise Exception("WFD Video Formats missing from WSD response")
74    if video_3d not in ev:
75        raise Exception("WFD 3D Video Formats missing from WSD response")
76    if audio not in ev:
77        raise Exception("WFD Audio Formats missing from WSD response")
78
79    dev[1].dump_monitor()
80    dev[0].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo2)
81    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
82    if ev is None:
83        raise Exception("Peer info update timed out")
84    if "new=0" not in ev:
85        raise Exception("new=0 flag missing from P2P-DEVICE-FOUND event")
86    if "wfd_dev_info=0x" + wfd_devinfo2 not in ev:
87        raise Exception("Wi-Fi Display Info not in P2P-DEVICE-FOUND event")
88    dev[1].dump_monitor()
89    dev[0].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo)
90    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
91    if ev is None:
92        raise Exception("Peer info update timed out")
93    if "new=0" not in ev:
94        raise Exception("new=0 flag missing from P2P-DEVICE-FOUND event")
95    if "wfd_dev_info=0x" + wfd_devinfo not in ev:
96        raise Exception("Wi-Fi Display Info not in P2P-DEVICE-FOUND event")
97
98    pin = dev[0].wps_read_pin()
99    dev[0].p2p_go_neg_auth(dev[1].p2p_dev_addr(), pin, 'display')
100    res1 = dev[1].p2p_go_neg_init(dev[0].p2p_dev_addr(), pin, 'enter',
101                                  timeout=20, go_intent=15, freq=2437)
102    res2 = dev[0].p2p_go_neg_auth_result()
103
104    bss = dev[0].get_bss("p2p_dev_addr=" + dev[1].p2p_dev_addr())
105    if bss['bssid'] != dev[1].p2p_interface_addr():
106        raise Exception("Unexpected BSSID in the BSS entry for the GO")
107    if wfd_devinfo2 not in bss['wfd_subelems']:
108        raise Exception("Could not see wfd_subelems in GO's BSS entry")
109    peer = dev[0].get_peer(dev[1].p2p_dev_addr())
110    if wfd_devinfo2 not in peer['wfd_subelems']:
111        raise Exception("Could not see wfd_subelems in GO's peer entry")
112    peer = dev[1].get_peer(dev[0].p2p_dev_addr())
113    if wfd_devinfo not in peer['wfd_subelems']:
114        raise Exception("Could not see wfd_subelems in client's peer entry")
115
116    wfd_devinfo3 = "00001c440028"
117    dev[2].request("SET wifi_display 1")
118    dev[2].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo3)
119    dev[2].p2p_find(social=True)
120    ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
121    if ev is None:
122        raise Exception("Device discovery timed out")
123    if dev[1].p2p_dev_addr() not in ev:
124        ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
125        if ev is None:
126            raise Exception("Device discovery timed out")
127        if dev[1].p2p_dev_addr() not in ev:
128            raise Exception("Could not discover GO")
129    if "wfd_dev_info=0x" + wfd_devinfo2 not in ev:
130        raise Exception("Wi-Fi Display Info not in P2P-DEVICE-FOUND event")
131    bss = dev[2].get_bss("p2p_dev_addr=" + dev[1].p2p_dev_addr())
132    if bss['bssid'] != dev[1].p2p_interface_addr():
133        raise Exception("Unexpected BSSID in the BSS entry for the GO")
134    if wfd_devinfo2 not in bss['wfd_subelems']:
135        raise Exception("Could not see wfd_subelems in GO's BSS entry")
136    peer = dev[2].get_peer(dev[1].p2p_dev_addr())
137    if wfd_devinfo2 not in peer['wfd_subelems']:
138        raise Exception("Could not see wfd_subelems in GO's peer entry")
139    dev[2].p2p_stop_find()
140
141    if dev[0].request("WFD_SUBELEM_GET 2") != audio:
142        raise Exception("Unexpected WFD_SUBELEM_GET 2 value")
143    if dev[0].request("WFD_SUBELEM_GET 3") != video:
144        raise Exception("Unexpected WFD_SUBELEM_GET 3 value")
145    if dev[0].request("WFD_SUBELEM_GET 4") != video_3d:
146        raise Exception("Unexpected WFD_SUBELEM_GET 42 value")
147    if dev[0].request("WFD_SUBELEM_GET 5") != prot:
148        raise Exception("Unexpected WFD_SUBELEM_GET 5 value")
149    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET "):
150        raise Exception("Unexpected WFD_SUBELEM_SET success")
151    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET 6"):
152        raise Exception("Unexpected WFD_SUBELEM_SET success")
153    if "OK" not in dev[0].request("WFD_SUBELEM_SET 6 "):
154        raise Exception("Unexpected WFD_SUBELEM_SET failure")
155    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET 6 0"):
156        raise Exception("Unexpected WFD_SUBELEM_SET success")
157    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET 6 0q"):
158        raise Exception("Unexpected WFD_SUBELEM_SET success")
159    if dev[0].request("WFD_SUBELEM_GET 6") != "":
160        raise Exception("Unexpected WFD_SUBELEM_GET 6 response")
161    if dev[0].request("WFD_SUBELEM_GET 8") != "":
162        raise Exception("Unexpected WFD_SUBELEM_GET 8 response")
163
164    if dev[0].global_request("WFD_SUBELEM_GET 2") != audio:
165        raise Exception("Unexpected WFD_SUBELEM_GET 2 value from global interface")
166    if "OK" not in dev[0].global_request("WFD_SUBELEM_SET 1 0006020304050608"):
167        raise Exception("WFD_SUBELEM_SET failed on global interface")
168    if dev[0].request("WFD_SUBELEM_GET 1") != "0006020304050608":
169        raise Exception("Unexpected WFD_SUBELEM_GET 1 value (per-interface)")
170
171    elems = dev[0].request("WFD_SUBELEM_GET all")
172    if "OK" not in dev[0].request("WFD_SUBELEM_SET all " + elems):
173        raise Exception("WFD_SUBELEM_SET all failed")
174    if dev[0].request("WFD_SUBELEM_GET all") != elems:
175        raise Exception("Mismatch in WFS_SUBELEM_SET/GET all")
176    test = "00000600411c440028"
177    if "OK" not in dev[0].request("WFD_SUBELEM_SET all " + test):
178        raise Exception("WFD_SUBELEM_SET all failed")
179    if dev[0].request("WFD_SUBELEM_GET all") != test:
180        raise Exception("Mismatch in WFS_SUBELEM_SET/GET all")
181
182    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET all qwerty"):
183        raise Exception("Invalid WFD_SUBELEM_SET all succeeded")
184    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET all 11"):
185        raise Exception("Invalid WFD_SUBELEM_SET all succeeded")
186    dev[0].request("WFD_SUBELEM_SET all 112233445566")
187    dev[0].request("WFD_SUBELEM_SET all ff0000fe0000fd00")
188
189    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET 300 112233"):
190        raise Exception("Invalid WFD_SUBELEM_SET 300 succeeded")
191    if "FAIL" not in dev[0].request("WFD_SUBELEM_SET -1 112233"):
192        raise Exception("Invalid WFD_SUBELEM_SET -1 succeeded")
193    if "FAIL" not in dev[0].request("WFD_SUBELEM_GET 300"):
194        raise Exception("Invalid WFD_SUBELEM_GET 300 succeeded")
195    if "FAIL" not in dev[0].request("WFD_SUBELEM_GET -1"):
196        raise Exception("Invalid WFD_SUBELEM_GET -1 succeeded")
197
198    dev[0].request("SET wifi_display 0")
199    dev[1].request("SET wifi_display 0")
200    dev[2].request("SET wifi_display 0")
201
202def test_wifi_display_r2(dev):
203    """Wi-Fi Display extensions to P2P with R2 subelems"""
204    wfd_devinfo = "00411c440028"
205    dev[0].request("SET wifi_display 1")
206    dev[0].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo)
207
208    # Associated BSSID
209    dev[0].request("WFD_SUBELEM_SET 1 0006020304050607")
210    # Coupled Sink
211    dev[0].request("WFD_SUBELEM_SET 6 000700000000000000")
212    # Session Info
213    dev[0].request("WFD_SUBELEM_SET 9 0000")
214    # WFD Extended Capability
215    dev[0].request("WFD_SUBELEM_SET 7 00020000")
216    # WFD Content Protection
217    prot = "0001" + "00"
218    dev[0].request("WFD_SUBELEM_SET 5 " + prot)
219    # WFD Video Formats
220    video = "0015" + "010203040506070809101112131415161718192021"
221    dev[0].request("WFD_SUBELEM_SET 3 " + video)
222    # WFD 3D Video Formats
223    video_3d = "0011" + "0102030405060708091011121314151617"
224    dev[0].request("WFD_SUBELEM_SET 4 " + video_3d)
225    # WFD Audio Formats
226    audio = "000f" + "010203040506070809101112131415"
227    dev[0].request("WFD_SUBELEM_SET 2 " + audio)
228    # MAC Info
229    mac_info = "0006" + "112233445566"
230    dev[0].request("WFD_SUBELEM_SET 10 " + mac_info)
231    # R2 Device Info
232    r2_dev_info = "0006" + "aabbccddeeff"
233    dev[0].request("WFD_SUBELEM_SET 11 " + r2_dev_info)
234
235    elems = dev[0].request("WFD_SUBELEM_GET all")
236    if wfd_devinfo not in elems:
237        raise Exception("Could not fetch back configured subelements")
238
239    wfd_devinfo2 = "00001c440028"
240    dev[1].request("SET wifi_display 1")
241    dev[1].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo2)
242    if wfd_devinfo2 not in dev[1].request("WFD_SUBELEM_GET 0"):
243        raise Exception("Could not fetch back configured subelement")
244
245    dev[0].p2p_listen()
246    dev[1].p2p_find(social=True)
247    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
248    if ev is None:
249        raise Exception("Device discovery timed out")
250    if "wfd_dev_info=0x" + wfd_devinfo not in ev:
251        raise Exception("Wi-Fi Display Info not in P2P-DEVICE-FOUND event")
252    if "new=1" not in ev:
253        raise Exception("new=1 flag missing from P2P-DEVICE-FOUND event")
254
255    pin = dev[0].wps_read_pin()
256    dev[0].p2p_go_neg_auth(dev[1].p2p_dev_addr(), pin, 'display')
257    res1 = dev[1].p2p_go_neg_init(dev[0].p2p_dev_addr(), pin, 'enter',
258                                  timeout=20, go_intent=15, freq=2437)
259    res2 = dev[0].p2p_go_neg_auth_result()
260
261    bss = dev[0].get_bss("p2p_dev_addr=" + dev[1].p2p_dev_addr())
262    if bss['bssid'] != dev[1].p2p_interface_addr():
263        raise Exception("Unexpected BSSID in the BSS entry for the GO")
264    if wfd_devinfo2 not in bss['wfd_subelems']:
265        raise Exception("Could not see wfd_subelems in GO's BSS entry")
266    peer = dev[0].get_peer(dev[1].p2p_dev_addr())
267    if wfd_devinfo2 not in peer['wfd_subelems']:
268        raise Exception("Could not see wfd_subelems in GO's peer entry")
269    peer = dev[1].get_peer(dev[0].p2p_dev_addr())
270    if wfd_devinfo not in peer['wfd_subelems']:
271        raise Exception("Could not see wfd_subelems in client's peer entry")
272    if r2_dev_info not in peer['wfd_subelems']:
273        raise Exception("Could not see r2_dev_info in client's peer entry")
274
275    elems = dev[0].request("WFD_SUBELEM_GET all")
276    if "OK" not in dev[0].request("WFD_SUBELEM_SET all " + elems):
277        raise Exception("WFD_SUBELEM_SET all failed")
278    if dev[0].request("WFD_SUBELEM_GET all") != elems:
279        raise Exception("Mismatch in WFS_SUBELEM_SET/GET all")
280    test = "00000600411c440028"
281    if "OK" not in dev[0].request("WFD_SUBELEM_SET all " + test):
282        raise Exception("WFD_SUBELEM_SET all failed")
283    if dev[0].request("WFD_SUBELEM_GET all") != test:
284        raise Exception("Mismatch in WFS_SUBELEM_SET/GET all")
285
286    dev[0].request("SET wifi_display 0")
287    dev[1].request("SET wifi_display 0")
288    dev[2].request("SET wifi_display 0")
289
290def enable_wifi_display(dev):
291    dev.request("SET wifi_display 1")
292    dev.request("WFD_SUBELEM_SET 0 000600411c440028")
293
294def test_wifi_display_go_invite(dev):
295    """P2P GO with Wi-Fi Display inviting a client to join"""
296    addr0 = dev[0].p2p_dev_addr()
297    addr1 = dev[1].p2p_dev_addr()
298
299    try:
300        enable_wifi_display(dev[0])
301        enable_wifi_display(dev[1])
302        enable_wifi_display(dev[2])
303
304        dev[1].p2p_listen()
305        if not dev[0].discover_peer(addr1, social=True):
306            raise Exception("Peer " + addr1 + " not found")
307        dev[0].p2p_listen()
308        if not dev[1].discover_peer(addr0, social=True):
309            raise Exception("Peer " + addr0 + " not found")
310        dev[1].p2p_listen()
311
312        logger.info("Authorize invitation")
313        pin = dev[1].wps_read_pin()
314        dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " join auth")
315
316        dev[0].p2p_start_go(freq=2412)
317
318        # Add test client to the group
319        connect_cli(dev[0], dev[2], social=True, freq=2412)
320
321        logger.info("Invite peer to join the group")
322        dev[0].p2p_go_authorize_client(pin)
323        dev[0].global_request("P2P_INVITE group=" + dev[0].group_ifname + " peer=" + addr1)
324        ev = dev[1].wait_global_event(["P2P-INVITATION-RECEIVED",
325                                       "P2P-GROUP-STARTED"], timeout=20)
326        if ev is None:
327            raise Exception("Timeout on invitation on peer")
328        if "P2P-INVITATION-RECEIVED" in ev:
329            raise Exception("Unexpected request to accept pre-authorized invitation")
330
331        dev[0].remove_group()
332        dev[1].wait_go_ending_session()
333        dev[2].wait_go_ending_session()
334
335    finally:
336        dev[0].request("SET wifi_display 0")
337        dev[1].request("SET wifi_display 0")
338        dev[2].request("SET wifi_display 0")
339
340def test_wifi_display_persistent_group(dev):
341    """P2P persistent group formation and re-invocation with Wi-Fi Display enabled"""
342    try:
343        enable_wifi_display(dev[0])
344        enable_wifi_display(dev[1])
345        enable_wifi_display(dev[2])
346
347        form(dev[0], dev[1])
348        peer = dev[1].get_peer(dev[0].p2p_dev_addr())
349        listen_freq = peer['listen_freq']
350        invite_from_cli(dev[0], dev[1])
351        invite_from_go(dev[0], dev[1])
352
353        dev[0].dump_monitor()
354        dev[1].dump_monitor()
355        networks = dev[0].list_networks(p2p=True)
356        if len(networks) != 1:
357            raise Exception("Unexpected number of networks")
358        if "[P2P-PERSISTENT]" not in networks[0]['flags']:
359            raise Exception("Not the persistent group data")
360        if "OK" not in dev[0].global_request("P2P_GROUP_ADD persistent=" + networks[0]['id'] + " freq=" + listen_freq):
361            raise Exception("Could not start GO")
362        ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=2)
363        if ev is None:
364            raise Exception("GO start up timed out")
365        dev[0].group_form_result(ev)
366
367        connect_cli(dev[0], dev[2], social=True, freq=listen_freq)
368        dev[0].dump_monitor()
369        dev[1].dump_monitor()
370        invite(dev[1], dev[0])
371        ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
372        if ev is None:
373            raise Exception("Timeout on group re-invocation (on client)")
374        dev[1].group_form_result(ev)
375
376        ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=0.1)
377        if ev is not None:
378            raise Exception("Unexpected P2P-GROUP-START on GO")
379        hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
380
381    finally:
382        dev[0].request("SET wifi_display 0")
383        dev[1].request("SET wifi_display 0")
384        dev[2].request("SET wifi_display 0")
385
386@remote_compatible
387def test_wifi_display_invalid_subelem(dev):
388    """Wi-Fi Display and invalid subelement parsing"""
389    addr1 = dev[1].p2p_dev_addr()
390
391    try:
392        enable_wifi_display(dev[0])
393        enable_wifi_display(dev[1])
394        dev[1].request("WFD_SUBELEM_SET 0 ffff00411c440028")
395
396        dev[1].p2p_listen()
397        dev[0].p2p_find(social=True)
398        ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
399        if ev is None:
400            raise Exception("Device discovery timed out")
401        if "wfd_dev_info=" in ev:
402            raise Exception("Invalid WFD subelement was shown")
403
404    finally:
405        dev[0].request("SET wifi_display 0")
406        dev[1].request("SET wifi_display 0")
407
408def test_wifi_display_parsing(dev):
409    """Wi-Fi Display extensions to P2P and special parsing cases"""
410    try:
411        _test_wifi_display_parsing(dev)
412    finally:
413        dev[1].request("VENDOR_ELEM_REMOVE 11 *")
414        dev[0].request("SET wifi_display 0")
415
416def _test_wifi_display_parsing(dev):
417    wfd_devinfo = "00411c440028"
418    dev[0].request("SET wifi_display 1")
419    dev[0].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo)
420    dev[0].p2p_start_go(freq=2412)
421
422    # P2P Client with invalid WFD IE
423    if "OK" not in dev[1].request("VENDOR_ELEM_ADD 11 dd10506f9a0a000000010000060000ffffff"):
424        raise Exception("VENDOR_ELEM_ADD failed")
425
426    pin = dev[1].wps_read_pin()
427    dev[0].p2p_go_authorize_client(pin)
428    dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60,
429                             social=True, freq=2412)
430    bssid = dev[0].get_group_status_field('bssid')
431    dev[2].flush_scan_cache()
432    dev[2].scan_for_bss(bssid, freq=2412, force_scan=True)
433    bss = dev[2].get_bss(bssid)
434    if 'wfd_subelems' not in bss:
435        raise Exception("Missing WFD elements in scan results")
436    if bss['wfd_subelems'] != "000006" + wfd_devinfo:
437        raise Exception("Unexpected WFD elements in scan results: " + bss['wfd_subelems'])
438
439    # P2P Client without WFD IE
440    pin = dev[2].wps_read_pin()
441    dev[0].p2p_go_authorize_client(pin)
442    dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60,
443                             social=True, freq=2412)
444    dev[2].remove_group()
445
446    dev[0].remove_group()
447    dev[1].wait_go_ending_session()
448
449def test_wifi_display_disable(dev):
450    """Peer disabling Wi-Fi Display advertisement"""
451    try:
452        enable_wifi_display(dev[1])
453        dev[1].p2p_listen()
454        dev[0].p2p_find(social=True)
455        ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
456        if ev is None:
457            raise Exception("Peer not found")
458        if "wfd_dev_info" not in ev:
459            raise Exception("Missing wfd_dev_info")
460
461        dev[1].request("SET wifi_display 0")
462
463        ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
464        if ev is None:
465            raise Exception("Peer update not indicated")
466        if "new=0" not in ev:
467            raise Exception("Incorrect update event: " + ev)
468        if "wfd_dev_info" in ev:
469            raise Exception("Unexpected wfd_dev_info")
470
471        ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=0.75)
472        if ev is not None:
473            raise Exception("Unexpected peer found event: " + ev)
474        dev[0].p2p_stop_find()
475        dev[1].p2p_stop_find()
476
477    finally:
478        dev[1].request("SET wifi_display 0")
479