Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / tests / hwsim / test_p2p_service.py
1 # P2P service discovery 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
7 import logging
8 logger = logging.getLogger()
9 import time
10 import uuid
11
12 import hwsim_utils
13
14 def add_bonjour_services(dev):
15     dev.global_request("P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027")
16     dev.global_request("P2P_SERVICE_ADD bonjour 076578616d706c650b5f6166706f766572746370c00c001001 00")
17     dev.global_request("P2P_SERVICE_ADD bonjour 045f697070c00c000c01 094d795072696e746572c027")
18     dev.global_request("P2P_SERVICE_ADD bonjour 096d797072696e746572045f697070c00c001001 09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074")
19
20 def add_upnp_services(dev):
21     dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice")
22     dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::upnp:rootdevice")
23     dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:1122de4e-8574-59ab-9322-333456789044::urn:schemas-upnp-org:service:ContentDirectory:2")
24     dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::urn:schemas-upnp-org:service:ContentDirectory:2")
25     dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device:InternetGatewayDevice:1")
26
27 def add_extra_services(dev):
28     for i in range(0, 100):
29         dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:" + str(uuid.uuid4()) + "::upnp:rootdevice")
30
31 def run_sd(dev, dst, query, exp_query=None, fragment=False, query2=None):
32     addr0 = dev[0].p2p_dev_addr()
33     addr1 = dev[1].p2p_dev_addr()
34     add_bonjour_services(dev[0])
35     add_upnp_services(dev[0])
36     if fragment:
37         add_extra_services(dev[0])
38     dev[0].p2p_listen()
39
40     dev[1].global_request("P2P_FLUSH")
41     dev[1].global_request("P2P_SERV_DISC_REQ " + dst + " " + query)
42     if query2:
43         dev[1].global_request("P2P_SERV_DISC_REQ " + dst + " " + query2)
44     if not dev[1].discover_peer(addr0, social=True, force_find=True):
45         raise Exception("Peer " + addr0 + " not found")
46
47     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
48     if ev is None:
49         raise Exception("Service discovery timed out")
50     if addr1 not in ev:
51         raise Exception("Unexpected service discovery request source")
52     if exp_query is None:
53         exp_query = query
54     if exp_query not in ev and (query2 is None or query2 not in ev):
55         raise Exception("Unexpected service discovery request contents")
56
57     if query2:
58         ev_list = []
59         for i in range(0, 4):
60             ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
61             if ev is None:
62                 raise Exception("Service discovery timed out")
63             if addr0 in ev:
64                 ev_list.append(ev)
65                 if len(ev_list) == 2:
66                     break
67         return ev_list
68
69     for i in range(0, 2):
70         ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
71         if ev is None:
72             raise Exception("Service discovery timed out")
73         if addr0 in ev:
74             break
75
76     dev[0].p2p_stop_find()
77     dev[1].p2p_stop_find()
78
79     if "OK" not in dev[0].global_request("P2P_SERVICE_DEL upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"):
80         raise Exception("Failed to delete a UPnP service")
81     if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"):
82         raise Exception("Unexpected deletion success for UPnP service")
83     if "OK" not in dev[0].global_request("P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01"):
84         raise Exception("Failed to delete a Bonjour service")
85     if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01"):
86         raise Exception("Unexpected deletion success for Bonjour service")
87
88     return ev
89
90 def test_p2p_service_discovery(dev):
91     """P2P service discovery"""
92     addr0 = dev[0].p2p_dev_addr()
93     for dst in [ "00:00:00:00:00:00", addr0 ]:
94         ev = run_sd(dev, dst, "02000001")
95         if "0b5f6166706f766572746370c00c000c01" not in ev:
96             raise Exception("Unexpected service discovery response contents (Bonjour)")
97         if "496e7465726e6574" not in ev:
98             raise Exception("Unexpected service discovery response contents (UPnP)")
99
100     for req in [ "foo 02000001",
101                  addr0,
102                  addr0 + " upnp qq urn:schemas-upnp-org:device:InternetGatewayDevice:1",
103                  addr0 + " upnp 10",
104                  addr0 + " 123",
105                  addr0 + " qq" ]:
106         if "FAIL" not in dev[1].global_request("P2P_SERV_DISC_REQ " + req):
107             raise Exception("Invalid P2P_SERV_DISC_REQ accepted: " + req)
108
109 def test_p2p_service_discovery2(dev):
110     """P2P service discovery with one peer having no services"""
111     dev[2].p2p_listen()
112     for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
113         ev = run_sd(dev, dst, "02000001")
114         if "0b5f6166706f766572746370c00c000c01" not in ev:
115             raise Exception("Unexpected service discovery response contents (Bonjour)")
116         if "496e7465726e6574" not in ev:
117             raise Exception("Unexpected service discovery response contents (UPnP)")
118
119 def test_p2p_service_discovery3(dev):
120     """P2P service discovery for Bonjour with one peer having no services"""
121     dev[2].p2p_listen()
122     for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
123         ev = run_sd(dev, dst, "02000101")
124         if "0b5f6166706f766572746370c00c000c01" not in ev:
125             raise Exception("Unexpected service discovery response contents (Bonjour)")
126
127 def test_p2p_service_discovery4(dev):
128     """P2P service discovery for UPnP with one peer having no services"""
129     dev[2].p2p_listen()
130     for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
131         ev = run_sd(dev, dst, "02000201")
132         if "496e7465726e6574" not in ev:
133             raise Exception("Unexpected service discovery response contents (UPnP)")
134
135 def test_p2p_service_discovery_multiple_queries(dev):
136     """P2P service discovery with multiple queries"""
137     for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
138         ev = run_sd(dev, dst, "02000201", query2="02000101")
139         if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
140             raise Exception("Unexpected service discovery response contents (Bonjour)")
141         if "496e7465726e6574" not in ev[0] + ev[1]:
142             raise Exception("Unexpected service discovery response contents (UPnP)")
143
144 def test_p2p_service_discovery_multiple_queries2(dev):
145     """P2P service discovery with multiple queries with one peer having no services"""
146     dev[2].p2p_listen()
147     for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
148         ev = run_sd(dev, dst, "02000201", query2="02000101")
149         if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
150             raise Exception("Unexpected service discovery response contents (Bonjour)")
151         if "496e7465726e6574" not in ev[0] + ev[1]:
152             raise Exception("Unexpected service discovery response contents (UPnP)")
153
154 def test_p2p_service_discovery_fragmentation(dev):
155     """P2P service discovery with fragmentation"""
156     for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
157         ev = run_sd(dev, dst, "02000001", fragment=True)
158         if not "long response" in ev:
159             if "0b5f6166706f766572746370c00c000c01" not in ev:
160                 raise Exception("Unexpected service discovery response contents (Bonjour)")
161             if "496e7465726e6574" not in ev:
162                 raise Exception("Unexpected service discovery response contents (UPnP)")
163
164 def test_p2p_service_discovery_bonjour(dev):
165     """P2P service discovery (Bonjour)"""
166     ev = run_sd(dev, "00:00:00:00:00:00", "02000101")
167     if "0b5f6166706f766572746370c00c000c01" not in ev:
168         raise Exception("Unexpected service discovery response contents (Bonjour)")
169     if "045f697070c00c000c01" not in ev:
170         raise Exception("Unexpected service discovery response contents (Bonjour)")
171     if "496e7465726e6574" in ev:
172         raise Exception("Unexpected service discovery response contents (UPnP not expected)")
173
174 def test_p2p_service_discovery_bonjour2(dev):
175     """P2P service discovery (Bonjour AFS)"""
176     ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c01")
177     if "0b5f6166706f766572746370c00c000c01" not in ev:
178         raise Exception("Unexpected service discovery response contents (Bonjour)")
179     if "045f697070c00c000c01" in ev:
180         raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
181     if "496e7465726e6574" in ev:
182         raise Exception("Unexpected service discovery response contents (UPnP not expected)")
183
184 def test_p2p_service_discovery_bonjour3(dev):
185     """P2P service discovery (Bonjour AFS - no match)"""
186     ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c02")
187     if "0300010102" not in ev:
188         raise Exception("Requested-info-not-available was not indicated")
189     if "0b5f6166706f766572746370c00c000c01" in ev:
190         raise Exception("Unexpected service discovery response contents (Bonjour)")
191     if "045f697070c00c000c01" in ev:
192         raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
193     if "496e7465726e6574" in ev:
194         raise Exception("Unexpected service discovery response contents (UPnP not expected)")
195
196 def test_p2p_service_discovery_upnp(dev):
197     """P2P service discovery (UPnP)"""
198     ev = run_sd(dev, "00:00:00:00:00:00", "02000201")
199     if "0b5f6166706f766572746370c00c000c01" in ev:
200         raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
201     if "496e7465726e6574" not in ev:
202         raise Exception("Unexpected service discovery response contents (UPnP)")
203
204 def test_p2p_service_discovery_upnp2(dev):
205     """P2P service discovery (UPnP using request helper)"""
206     ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:all", "0b00020110737364703a616c6c")
207     if "0b5f6166706f766572746370c00c000c01" in ev:
208         raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
209     if "496e7465726e6574" not in ev:
210         raise Exception("Unexpected service discovery response contents (UPnP)")
211
212 def test_p2p_service_discovery_upnp3(dev):
213     """P2P service discovery (UPnP using request helper - no match)"""
214     ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:foo", "0b00020110737364703a666f6f")
215     if "0300020102" not in ev:
216         raise Exception("Requested-info-not-available was not indicated")
217     if "0b5f6166706f766572746370c00c000c01" in ev:
218         raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
219     if "496e7465726e6574" in ev:
220         raise Exception("Unexpected service discovery response contents (UPnP)")
221
222 def test_p2p_service_discovery_ws(dev):
223     """P2P service discovery (WS-Discovery)"""
224     ev = run_sd(dev, "00:00:00:00:00:00", "02000301")
225     if "0b5f6166706f766572746370c00c000c01" in ev:
226         raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
227     if "496e7465726e6574" in ev:
228         raise Exception("Unexpected service discovery response contents (UPnP not expected)")
229     if "0300030101" not in ev:
230         raise Exception("Unexpected service discovery response contents (WS)")
231
232 def test_p2p_service_discovery_wfd(dev):
233     """P2P service discovery (Wi-Fi Display)"""
234     dev[0].global_request("SET wifi_display 1")
235     ev = run_sd(dev, "00:00:00:00:00:00", "02000401")
236     if " 030004" in ev:
237         raise Exception("Unexpected response to invalid WFD SD query")
238     dev[0].global_request("SET wifi_display 0")
239     ev = run_sd(dev, "00:00:00:00:00:00", "0300040100")
240     if "0300040101" not in ev:
241         raise Exception("Unexpected response to WFD SD query (protocol was disabled)")
242
243 def test_p2p_service_discovery_req_cancel(dev):
244     """Cancel a P2P service discovery request"""
245     if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ ab"):
246         raise Exception("Unexpected SD cancel success")
247     if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ qq"):
248         raise Exception("Unexpected SD cancel success")
249     query = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
250     if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query):
251         raise Exception("Unexpected SD cancel failure")
252     query1 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
253     query2 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000002")
254     query3 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000003")
255     if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query2):
256         raise Exception("Unexpected SD cancel failure")
257     if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query1):
258         raise Exception("Unexpected SD cancel failure")
259     if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query3):
260         raise Exception("Unexpected SD cancel failure")
261
262     query = dev[0].global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000001")
263     if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query):
264         raise Exception("Unexpected SD(broadcast) cancel failure")
265
266 def test_p2p_service_discovery_go(dev):
267     """P2P service discovery from GO"""
268     addr0 = dev[0].p2p_dev_addr()
269     addr1 = dev[1].p2p_dev_addr()
270
271     add_bonjour_services(dev[0])
272     add_upnp_services(dev[0])
273
274     dev[0].p2p_start_go(freq=2412)
275
276     dev[1].global_request("P2P_FLUSH")
277     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
278     if not dev[1].discover_peer(addr0, social=True, force_find=True):
279         raise Exception("Peer " + addr0 + " not found")
280
281     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
282     if ev is None:
283         raise Exception("Service discovery timed out")
284     if addr1 not in ev:
285         raise Exception("Unexpected service discovery request source")
286
287     ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
288     if ev is None:
289         raise Exception("Service discovery timed out")
290     if addr0 not in ev:
291         raise Exception("Unexpected service discovery response source")
292     if "0b5f6166706f766572746370c00c000c01" not in ev:
293         raise Exception("Unexpected service discovery response contents (Bonjour)")
294     if "496e7465726e6574" not in ev:
295         raise Exception("Unexpected service discovery response contents (UPnP)")
296     dev[1].p2p_stop_find()
297
298     dev[0].global_request("P2P_SERVICE_FLUSH")
299
300     dev[1].global_request("P2P_FLUSH")
301     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
302     if not dev[1].discover_peer(addr0, social=True, force_find=True):
303         raise Exception("Peer " + addr0 + " not found")
304     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
305     if ev is None:
306         raise Exception("Service discovery timed out")
307     if addr1 not in ev:
308         raise Exception("Unexpected service discovery request source")
309
310     ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
311     if ev is None:
312         raise Exception("Service discovery timed out")
313     if addr0 not in ev:
314         raise Exception("Unexpected service discovery response source")
315     if "0300000101" not in ev:
316         raise Exception("Unexpected service discovery response contents (Bonjour)")
317     dev[1].p2p_stop_find()
318
319 def _test_p2p_service_discovery_external(dev):
320     addr0 = dev[0].p2p_dev_addr()
321     addr1 = dev[1].p2p_dev_addr()
322
323     if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_EXTERNAL 2"):
324         raise Exception("Invalid P2P_SERV_DISC_EXTERNAL accepted")
325     if "OK" not in dev[0].global_request("P2P_SERV_DISC_EXTERNAL 1"):
326         raise Exception("P2P_SERV_DISC_EXTERNAL failed")
327     dev[0].p2p_listen()
328     dev[1].global_request("P2P_FLUSH")
329     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
330     if not dev[1].discover_peer(addr0, social=True, force_find=True):
331         raise Exception("Peer " + addr0 + " not found")
332
333     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
334     if ev is None:
335         raise Exception("Service discovery timed out")
336     if addr1 not in ev:
337         raise Exception("Unexpected service discovery request source")
338     arg = ev.split(' ')
339     resp = "0300000101"
340     if "OK" not in dev[0].global_request("P2P_SERV_DISC_RESP %s %s %s %s" % (arg[2], arg[3], arg[4], resp)):
341         raise Exception("P2P_SERV_DISC_RESP failed")
342
343     ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=15)
344     if ev is None:
345         raise Exception("Service discovery timed out")
346     if addr0 not in ev:
347         raise Exception("Unexpected address in SD Response: " + ev)
348     if ev.split(' ')[4] != resp:
349         raise Exception("Unexpected response data SD Response: " + ev)
350     ver = ev.split(' ')[3]
351
352     dev[0].global_request("P2P_SERVICE_UPDATE")
353
354     dev[1].global_request("P2P_FLUSH")
355     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
356     if not dev[1].discover_peer(addr0, social=True, force_find=True):
357         raise Exception("Peer " + addr0 + " not found")
358
359     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
360     if ev is None:
361         raise Exception("Service discovery timed out")
362     if addr1 not in ev:
363         raise Exception("Unexpected service discovery request source")
364     arg = ev.split(' ')
365     resp = "0300000101"
366     if "OK" not in dev[0].global_request("P2P_SERV_DISC_RESP %s %s %s %s" % (arg[2], arg[3], arg[4], resp)):
367         raise Exception("P2P_SERV_DISC_RESP failed")
368
369     ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=15)
370     if ev is None:
371         raise Exception("Service discovery timed out")
372     if addr0 not in ev:
373         raise Exception("Unexpected address in SD Response: " + ev)
374     if ev.split(' ')[4] != resp:
375         raise Exception("Unexpected response data SD Response: " + ev)
376     ver2 = ev.split(' ')[3]
377     if ver == ver2:
378         raise Exception("Service list version did not change")
379
380     for cmd in [ "%s%s%s%s" % (arg[2], arg[3], arg[4], resp),
381                  "%s %s %s %s" % ("0", arg[3], arg[4], resp),
382                  "%s %s %s %s" % (arg[2], "foo", arg[4], resp),
383                  "%s %s%s%s" % (arg[2], arg[3], arg[4], resp),
384                  "%s %s %s%s" % (arg[2], arg[3], arg[4], resp),
385                  "%s %s %s %s" % (arg[2], arg[3], arg[4], "12345"),
386                  "%s %s %s %s" % (arg[2], arg[3], arg[4], "qq") ]:
387         if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_RESP " + cmd):
388             raise Exception("Invalid P2P_SERV_DISC_RESP accepted: " + cmd)
389
390 def test_p2p_service_discovery_external(dev):
391     """P2P service discovery using external response"""
392     try:
393         _test_p2p_service_discovery_external(dev)
394     finally:
395         dev[0].global_request("P2P_SERV_DISC_EXTERNAL 0")
396
397 def test_p2p_service_discovery_invalid_commands(dev):
398     """P2P service discovery invalid commands"""
399     for cmd in [ "bonjour",
400                  "bonjour 12",
401                  "bonjour 123 12",
402                  "bonjour qq 12",
403                  "bonjour 12 123",
404                  "bonjour 12 qq",
405                  "upnp 10",
406                  "upnp qq uuid:",
407                  "foo bar" ]:
408         if "FAIL" not in dev[0].global_request("P2P_SERVICE_ADD " + cmd):
409             raise Exception("Invalid P2P_SERVICE_ADD accepted: " + cmd)
410
411     for cmd in [ "bonjour",
412                  "bonjour 123",
413                  "bonjour qq",
414                  "upnp 10",
415                  "upnp  ",
416                  "upnp qq uuid:",
417                  "foo bar" ]:
418         if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL " + cmd):
419             raise Exception("Invalid P2P_SERVICE_DEL accepted: " + cmd)
420
421 def test_p2p_service_discovery_cancel_during_query(dev):
422     """P2P service discovery and cancel during query"""
423     for i in range(2):
424         add_bonjour_services(dev[i])
425         add_upnp_services(dev[i])
426         add_extra_services(dev[i])
427         dev[i].p2p_listen()
428
429     dev[2].request("P2P_FLUSH")
430     id1 = dev[2].request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000201")
431     id2 = dev[2].request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000101")
432     dev[2].p2p_find(social=True)
433     ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
434     if ev is None:
435         raise Exception("Could not discover peer")
436     if "OK" not in dev[2].request("P2P_SERV_DISC_CANCEL_REQ " + id1):
437         raise Exception("Failed to cancel req1")
438     if "OK" not in dev[2].request("P2P_SERV_DISC_CANCEL_REQ " + id2):
439         raise Exception("Failed to cancel req2")
440     ev = dev[2].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=3)
441     # we may or may not get a response depending on timing, so ignore the result
442     dev[2].p2p_stop_find()
443     dev[1].p2p_stop_find()
444     dev[0].p2p_stop_find()
445
446 def get_p2p_state(dev):
447     res = dev.global_request("STATUS")
448     p2p_state = None
449     for line in res.splitlines():
450         if line.startswith("p2p_state="):
451             p2p_state = line.split('=')[1]
452             break
453     if p2p_state is None:
454         raise Exception("Could not get p2p_state")
455     return p2p_state
456
457 def test_p2p_service_discovery_peer_not_listening(dev):
458     """P2P service discovery and peer not listening"""
459     addr0 = dev[0].p2p_dev_addr()
460     addr1 = dev[1].p2p_dev_addr()
461     add_bonjour_services(dev[0])
462     add_upnp_services(dev[0])
463     dev[0].p2p_listen()
464     dev[1].global_request("P2P_FIND 1 type=social")
465     ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=4)
466     if ev is None:
467         raise Exception("Peer not found")
468     dev[0].p2p_stop_find()
469     ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=1)
470     ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=1)
471     time.sleep(0.03)
472     dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
473     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=1)
474     if ev is not None:
475         raise Exception("Service discovery request unexpectedly received")
476     ev = dev[1].wait_global_event(["P2P-FIND-STOPPED", "P2P-SERV-DISC-RESP"],
477                                   timeout=10)
478     if ev is None:
479         raise Exception("P2P-FIND-STOPPED event timed out")
480     if "P2P-SERV-DISC-RESP" in ev:
481         raise Exception("Unexpected SD response")
482     p2p_state = get_p2p_state(dev[1])
483     if p2p_state != "IDLE":
484         raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state)
485
486 def test_p2p_service_discovery_peer_not_listening2(dev):
487     """P2P service discovery and peer not listening"""
488     addr0 = dev[0].p2p_dev_addr()
489     addr1 = dev[1].p2p_dev_addr()
490     add_bonjour_services(dev[0])
491     add_upnp_services(dev[0])
492     dev[0].p2p_listen()
493     dev[1].global_request("P2P_FIND type=social")
494     ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
495     if ev is None:
496         raise Exception("Peer not found")
497     dev[0].p2p_stop_find()
498     time.sleep(0.53)
499     dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
500     ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=0.5)
501     if ev is not None:
502         raise Exception("Service discovery request unexpectedly received")
503     dev[1].p2p_stop_find()
504     ev = dev[1].wait_global_event(["P2P-FIND-STOPPED", "P2P-SERV-DISC-RESP"],
505                                   timeout=10)
506     if ev is None:
507         raise Exception("P2P-FIND-STOPPED event timed out")
508     if "P2P-SERV-DISC-RESP" in ev:
509         raise Exception("Unexpected SD response")
510     p2p_state = get_p2p_state(dev[1])
511     if p2p_state != "IDLE":
512         raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state)