1 # P2P device discovery test cases
2 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
8 logger = logging.getLogger()
12 from wpasupplicant import WpaSupplicant
14 def test_discovery(dev):
15 """P2P device discovery and provision discovery"""
16 addr0 = dev[0].p2p_dev_addr()
17 addr1 = dev[1].p2p_dev_addr()
18 logger.info("Start device discovery")
19 dev[0].p2p_find(social=True, delay=1)
20 if not dev[1].discover_peer(addr0):
21 raise Exception("Device discovery timed out")
22 if not dev[0].discover_peer(addr1):
23 raise Exception("Device discovery timed out")
25 logger.info("Test provision discovery for display")
26 dev[0].global_request("P2P_PROV_DISC " + addr1 + " display")
27 ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=15)
29 raise Exception("Provision discovery timed out (display/dev1)")
31 raise Exception("Dev0 not in provision discovery event")
32 ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-ENTER-PIN",
33 "P2P-PROV-DISC-FAILURE"], timeout=15)
35 raise Exception("Provision discovery timed out (display/dev0)")
36 if "P2P-PROV-DISC-FAILURE" in ev0:
37 raise Exception("Provision discovery failed (display/dev0)")
39 raise Exception("Dev1 not in provision discovery event")
41 logger.info("Test provision discovery for keypad")
42 dev[0].global_request("P2P_PROV_DISC " + addr1 + " keypad")
43 ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=15)
45 raise Exception("Provision discovery timed out (keypad/dev1)")
47 raise Exception("Dev0 not in provision discovery event")
48 ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN",
49 "P2P-PROV-DISC-FAILURE"],
52 raise Exception("Provision discovery timed out (keypad/dev0)")
53 if "P2P-PROV-DISC-FAILURE" in ev0:
54 raise Exception("Provision discovery failed (keypad/dev0)")
56 raise Exception("Dev1 not in provision discovery event")
58 logger.info("Test provision discovery for push button")
59 dev[0].global_request("P2P_PROV_DISC " + addr1 + " pbc")
60 ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-PBC-REQ"], timeout=15)
62 raise Exception("Provision discovery timed out (pbc/dev1)")
64 raise Exception("Dev0 not in provision discovery event")
65 ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-PBC-RESP",
66 "P2P-PROV-DISC-FAILURE"],
69 raise Exception("Provision discovery timed out (pbc/dev0)")
70 if "P2P-PROV-DISC-FAILURE" in ev0:
71 raise Exception("Provision discovery failed (pbc/dev0)")
73 raise Exception("Dev1 not in provision discovery event")
78 if "FAIL" not in dev[0].p2p_find(dev_id="foo"):
79 raise Exception("P2P_FIND with invalid dev_id accepted")
80 if "FAIL" not in dev[0].p2p_find(dev_type="foo"):
81 raise Exception("P2P_FIND with invalid dev_type accepted")
83 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC foo pbc"):
84 raise Exception("Invalid P2P_PROV_DISC accepted")
85 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 00:11:22:33:44:55"):
86 raise Exception("Invalid P2P_PROV_DISC accepted")
87 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 00:11:22:33:44:55 pbc join"):
88 raise Exception("Invalid P2P_PROV_DISC accepted")
90 def test_discovery_pd_retries(dev):
91 """P2P device discovery and provision discovery retries"""
92 addr0 = dev[0].p2p_dev_addr()
93 addr1 = dev[1].p2p_dev_addr()
95 if not dev[0].discover_peer(addr1):
96 raise Exception("Device discovery timed out")
97 dev[1].p2p_stop_find()
98 dev[0].p2p_stop_find()
99 dev[0].global_request("P2P_PROV_DISC " + addr1 + " display")
100 ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=60)
102 raise Exception("No PD failure reported")
104 def test_discovery_group_client(dev):
105 """P2P device discovery for a client in a group"""
106 logger.info("Start autonomous GO " + dev[0].ifname)
107 res = dev[0].p2p_start_go(freq="2422")
108 logger.debug("res: " + str(res))
109 logger.info("Connect a client to the GO")
110 pin = dev[1].wps_read_pin()
111 dev[0].p2p_go_authorize_client(pin)
112 dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
113 logger.info("Client connected")
114 hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
115 logger.info("Try to discover a P2P client in a group")
116 if not dev[2].discover_peer(dev[1].p2p_dev_addr(), social=False, timeout=10):
117 if not dev[2].discover_peer(dev[1].p2p_dev_addr(), social=False, timeout=10):
118 if not dev[2].discover_peer(dev[1].p2p_dev_addr(), social=False, timeout=10):
119 raise Exception("Could not discover group client")
121 # This is not really perfect, but something to get a bit more testing
122 # coverage.. For proper discoverability mechanism validation, the P2P
123 # client would need to go to sleep to avoid acknowledging the GO Negotiation
124 # Request frame. Offchannel Listen mode operation on the P2P Client with
125 # mac80211_hwsim is apparently not enough to avoid the acknowledgement on
126 # the operating channel, so need to disconnect from the group which removes
127 # the GO-to-P2P Client part of the discoverability exchange in practice.
129 pin = dev[2].wps_read_pin()
130 # make group client non-responsive on operating channel
131 dev[1].dump_monitor()
132 dev[1].group_request("DISCONNECT")
133 dev[1].wait_disconnected(timeout=10)
134 dev[2].request("P2P_CONNECT {} {} display".format(dev[1].p2p_dev_addr(),
136 ev = dev[1].wait_event(["P2P-GO-NEG-REQUEST"], timeout=2)
138 raise Exception("Unexpected frame RX on P2P client")
139 # make group client available on operating channe
140 dev[1].request("REASSOCIATE")
141 ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED", "P2P-GO-NEG-REQUEST"])
143 raise Exception("Timeout on reconnection to group")
144 if "P2P-GO-NEG-REQUEST" not in ev:
145 ev = dev[1].wait_event(["P2P-GO-NEG-REQUEST"])
147 raise Exception("Timeout on waiting for GO Negotiation Request")
149 def test_discovery_dev_type(dev):
150 """P2P device discovery with Device Type filter"""
151 dev[1].request("SET sec_device_type 1-0050F204-2")
153 dev[0].p2p_find(social=True, dev_type="5-0050F204-1")
154 ev = dev[0].wait_event(['P2P-DEVICE-FOUND'], timeout=1)
156 raise Exception("Unexpected P2P device found")
157 dev[0].p2p_find(social=True, dev_type="1-0050F204-2")
158 ev = dev[0].wait_event(['P2P-DEVICE-FOUND'], timeout=2)
160 raise Exception("P2P device not found")
161 peer = dev[0].get_peer(dev[1].p2p_dev_addr())
162 if "1-0050F204-2" not in peer['sec_dev_type']:
163 raise Exception("sec_device_type not reported properly")
165 def test_discovery_dev_type_go(dev):
166 """P2P device discovery with Device Type filter on GO"""
167 addr1 = dev[1].p2p_dev_addr()
168 dev[1].request("SET sec_device_type 1-0050F204-2")
169 res = dev[0].p2p_start_go(freq="2412")
170 pin = dev[1].wps_read_pin()
171 dev[0].p2p_go_authorize_client(pin)
172 dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
174 dev[2].p2p_find(social=True, dev_type="5-0050F204-1")
175 ev = dev[2].wait_event(['P2P-DEVICE-FOUND'], timeout=1)
177 raise Exception("Unexpected P2P device found")
178 dev[2].p2p_find(social=True, dev_type="1-0050F204-2")
179 ev = dev[2].wait_event(['P2P-DEVICE-FOUND ' + addr1], timeout=2)
181 raise Exception("P2P device not found")
183 def test_discovery_dev_id(dev):
184 """P2P device discovery with Device ID filter"""
185 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
186 wpas.interface_add("wlan5")
187 wpas.request("P2P_LISTEN 1")
188 status = wpas.global_request("STATUS")
189 if "p2p_state=LISTEN_ONLY" not in status:
190 raise Exception("Unexpected status: " + status)
191 addr1 = dev[1].p2p_dev_addr()
193 dev[0].p2p_find(social=True, dev_id="02:03:04:05:06:07")
194 ev = dev[0].wait_event(['P2P-DEVICE-FOUND'], timeout=1)
196 raise Exception("Unexpected P2P device found")
197 dev[0].p2p_find(social=True, dev_id=addr1)
198 ev = dev[0].wait_event(['P2P-DEVICE-FOUND'], timeout=2)
200 raise Exception("P2P device not found")
202 raise Exception("Unexpected P2P peer found")
203 status = wpas.global_request("STATUS")
204 for i in range(0, 2):
205 if "p2p_state=IDLE" in status:
208 status = wpas.global_request("STATUS")
209 if "p2p_state=IDLE" not in status:
210 raise Exception("Unexpected status: " + status)
212 def test_discovery_dev_id_go(dev):
213 """P2P device discovery with Device ID filter on GO"""
214 addr1 = dev[1].p2p_dev_addr()
215 res = dev[0].p2p_start_go(freq="2412")
216 pin = dev[1].wps_read_pin()
217 dev[0].p2p_go_authorize_client(pin)
218 dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
220 dev[2].p2p_find(social=True, dev_id="02:03:04:05:06:07")
221 ev = dev[2].wait_event(['P2P-DEVICE-FOUND'], timeout=1)
223 raise Exception("Unexpected P2P device found")
224 dev[2].p2p_find(social=True, dev_id=addr1)
225 ev = dev[2].wait_event(['P2P-DEVICE-FOUND ' + addr1], timeout=2)
227 raise Exception("P2P device not found")
229 def test_discovery_social_plus_one(dev):
230 """P2P device discovery with social-plus-one"""
231 logger.info("Start autonomous GO " + dev[0].ifname)
232 dev[1].p2p_find(social=True)
233 dev[0].p2p_find(progressive=True)
234 logger.info("Wait for initial progressive find phases")
235 dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"])
236 dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"])
237 go = dev[2].p2p_dev_addr()
238 dev[2].p2p_start_go(freq="2422")
239 logger.info("Verify whether the GO on non-social channel can be found")
240 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
242 raise Exception("Peer not found")
244 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
246 raise Exception("Peer not found")
247 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
249 raise Exception("Peer not found")
250 dev[0].p2p_stop_find()
251 dev[1].p2p_stop_find()
252 if not dev[0].peer_known(go):
253 raise Exception("GO not found in progressive scan")
254 if dev[1].peer_known(go):
255 raise Exception("GO found in social-only scan")
257 def test_discovery_and_interface_disabled(dev):
258 """P2P device discovery with interface getting didabled"""
260 if "OK" not in dev[0].p2p_find():
261 raise Exception("Failed to start P2P find")
262 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"])
264 raise Exception("Scan did not start")
265 dev[0].request("DRIVER_EVENT INTERFACE_DISABLED")
268 # verify that P2P_FIND is rejected
269 if "FAIL" not in dev[0].p2p_find():
270 raise Exception("New P2P_FIND request was accepted unexpectedly")
272 dev[0].request("DRIVER_EVENT INTERFACE_ENABLED")
274 dev[0].scan(freq="2412")
275 if "OK" not in dev[0].p2p_find():
276 raise Exception("Failed to start P2P find")
277 dev[0].dump_monitor()
279 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
281 raise Exception("Peer not found")
283 dev[0].request("DRIVER_EVENT INTERFACE_ENABLED")
285 def test_discovery_auto(dev):
286 """P2P device discovery and provision discovery with auto GO/dev selection"""
287 addr0 = dev[0].p2p_dev_addr()
288 addr1 = dev[1].p2p_dev_addr()
289 addr2 = dev[2].p2p_dev_addr()
290 dev[2].p2p_start_go(freq="2412")
291 logger.info("Start device discovery")
293 if not dev[1].discover_peer(addr0):
294 raise Exception("Device discovery timed out")
296 if not dev[0].discover_peer(addr1):
297 raise Exception("Device discovery timed out")
298 if not dev[0].discover_peer(addr2):
299 raise Exception("Device discovery timed out")
301 logger.info("Test provision discovery for display (device)")
302 dev[0].global_request("P2P_PROV_DISC " + addr1 + " display auto")
303 ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=15)
305 raise Exception("Provision discovery timed out (display/dev1)")
307 raise Exception("Dev0 not in provision discovery event")
309 raise Exception("Unexpected group parameter from non-GO")
310 ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-ENTER-PIN",
311 "P2P-PROV-DISC-FAILURE"], timeout=15)
313 raise Exception("Provision discovery timed out (display/dev0)")
314 if "P2P-PROV-DISC-FAILURE" in ev0:
315 raise Exception("Provision discovery failed (display/dev0)")
317 raise Exception("Dev1 not in provision discovery event")
318 if "peer_go=0" not in ev0:
319 raise Exception("peer_go incorrect in PD response from non-GO")
321 logger.info("Test provision discovery for display (GO)")
322 dev[0].global_request("P2P_PROV_DISC " + addr2 + " display auto")
323 ev2 = dev[2].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=15)
325 raise Exception("Provision discovery timed out (display/dev2)")
327 raise Exception("Dev0 not in provision discovery event")
328 if " group=" not in ev2:
329 raise Exception("Group parameter missing from GO")
330 ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-ENTER-PIN",
331 "P2P-PROV-DISC-FAILURE"], timeout=15)
333 raise Exception("Provision discovery timed out (display/dev0)")
334 if "P2P-PROV-DISC-FAILURE" in ev0:
335 raise Exception("Provision discovery failed (display/dev0)")
337 raise Exception("Dev1 not in provision discovery event")
338 if "peer_go=1" not in ev0:
339 raise Exception("peer_go incorrect in PD response from GO")
341 def test_discovery_stop(dev):
342 """P2P device discovery and p2p_stop_find"""
343 addr0 = dev[0].p2p_dev_addr()
344 addr1 = dev[1].p2p_dev_addr()
348 dev[0].p2p_find(social=False)
349 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=0.5)
351 logger.info("No CTRL-EVENT-SCAN-STARTED event")
352 dev[0].p2p_stop_find()
353 ev = dev[0].wait_global_event(["P2P-FIND-STOPPED"], timeout=1)
355 raise Exception("P2P_STOP not reported")
356 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
358 raise Exception("Peer found unexpectedly: " + ev)
360 dev[0].p2p_find(social=False)
361 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=0.5)
363 logger.info("No CTRL-EVENT-SCAN-STARTED event")
364 dev[0].request("P2P_FLUSH")
365 ev = dev[0].wait_global_event(["P2P-FIND-STOPPED"], timeout=1)
367 raise Exception("P2P_STOP not reported")
368 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
370 raise Exception("Peer found unexpectedly: " + ev)
372 def test_p2p_peer_command(dev):
373 """P2P_PEER command"""
374 addr0 = dev[0].p2p_dev_addr()
375 addr1 = dev[1].p2p_dev_addr()
376 addr2 = dev[2].p2p_dev_addr()
379 if not dev[0].discover_peer(addr1):
380 raise Exception("Device discovery timed out")
381 if not dev[0].discover_peer(addr2):
382 raise Exception("Device discovery timed out")
383 dev[0].p2p_stop_find()
384 dev[1].p2p_stop_find()
385 dev[2].p2p_stop_find()
387 res0 = dev[0].request("P2P_PEER FIRST")
388 peer = res0.splitlines()[0]
389 if peer not in [ addr1, addr2 ]:
390 raise Exception("Unexpected P2P_PEER FIRST address")
391 res1 = dev[0].request("P2P_PEER NEXT-" + peer)
392 peer2 = res1.splitlines()[0]
393 if peer2 not in [ addr1, addr2 ] or peer == peer2:
394 raise Exception("Unexpected P2P_PEER NEXT address")
396 if "FAIL" not in dev[0].request("P2P_PEER NEXT-foo"):
397 raise Exception("Invalid P2P_PEER command accepted")
398 if "FAIL" not in dev[0].request("P2P_PEER foo"):
399 raise Exception("Invalid P2P_PEER command accepted")
400 if "FAIL" not in dev[0].request("P2P_PEER 00:11:22:33:44:55"):
401 raise Exception("P2P_PEER command for unknown peer accepted")
403 def test_p2p_listen_and_offchannel_tx(dev):
404 """P2P_LISTEN behavior with offchannel TX"""
405 addr0 = dev[0].p2p_dev_addr()
406 addr1 = dev[1].p2p_dev_addr()
407 addr2 = dev[2].p2p_dev_addr()
410 if not dev[0].discover_peer(addr1):
411 raise Exception("Device discovery timed out")
414 dev[0].global_request("P2P_PROV_DISC " + addr1 + " display")
415 ev = dev[0].wait_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=15)
417 raise Exception("No PD result reported")
418 dev[1].p2p_stop_find()
420 if not dev[2].discover_peer(addr0):
421 raise Exception("Device discovery timed out after PD exchange")
422 dev[2].p2p_stop_find()
423 dev[0].p2p_stop_find()
425 def test_p2p_listen_and_scan(dev):
426 """P2P_LISTEN and scan"""
428 if "OK" not in dev[0].request("SCAN freq=2412"):
429 raise Exception("Failed to request a scan")
430 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 3)
432 raise Exception("Unexpected scan results")
433 dev[0].p2p_stop_find()
434 ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 15)
436 raise Exception("Scan timed out")