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