tests: Add p2ps_provision() method
[mech_eap.git] / tests / hwsim / test_p2ps.py
1 # P2P services
2 # Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
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 random
11 import re
12
13 import hwsim_utils
14 from wpasupplicant import WpaSupplicant
15 from test_p2p_grpform import check_grpform_results
16 from test_p2p_grpform import remove_group
17 from test_p2p_persistent import go_neg_pin_authorized_persistent
18 from utils import HwsimSkip
19
20 # Dev[0] -> Advertiser
21 # Dev[1] -> Seeker
22 # ev0 -> Event generated at advertiser side
23 # ev1 -> Event generated at Seeker side
24
25 def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None):
26     """P2PS Advertise function"""
27     adv_id = random.randrange(1, 0xFFFFFFFF)
28     advid = hex(adv_id)[2:]
29
30     if rsp_info is not None and srv_info is not None:
31         if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " svc_info='" + srv_info + "'" + " rsp_info=" + rsp_info + "'"):
32             raise Exception("P2P_SERVICE_ADD with response info and service info failed")
33
34     if rsp_info is None and srv_info is not None:
35         if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " svc_info='" + srv_info + "'"):
36             raise Exception("P2P_SERVICE_ADD with service info failed")
37
38     if rsp_info is None and srv_info is None:
39         if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " "):
40             raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
41
42     if rsp_info is not None and srv_info is None:
43         if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(adv_id) + " 1 1108 " + svc_name + " svc_info='" + " rsp_info=" + rsp_info + "'"):
44             raise Exception("P2P_SERVICE_ADD with response info failed")
45
46     r_dev.p2p_listen()
47     return advid
48
49 def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None,
50                     single_peer_expected=True):
51     """P2PS exact service seek request"""
52     if srv_info is not None:
53         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
54         if ev1 is None:
55             raise Exception("Failed to add Service Discovery request for exact seek request")
56
57     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
58         raise Exception("Failed to initiate seek operation")
59
60     timeout = time.time() + 10
61     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
62     while ev1 is not None and not single_peer_expected:
63         if r_dev.p2p_dev_addr() in ev1 and "adv_id=" in ev1:
64             break
65         ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
66
67         if timeout < time.time():
68             raise Exception("Device not found")
69
70     if ev1 is None:
71         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
72     if r_dev.p2p_dev_addr() not in ev1:
73         raise Exception("Unexpected peer")
74
75     if srv_info is None:
76         adv_id = ev1.split("adv_id=")[1].split(" ")[0]
77         rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
78         if rcvd_svc_name != svc_name:
79             raise Exception("service name not matching")
80     else:
81         ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
82         if ev1 is None:
83             raise Exception("Failed to receive Service Discovery Response")
84         if r_dev.p2p_dev_addr() not in ev1:
85             raise Exception("Service Discovery response from Unknown Peer")
86         if srv_info is not None and srv_info not in ev1:
87             raise Exception("service info not available in Service Discovery response")
88         adv_id = ev1.split(" ")[3]
89         rcvd_svc_name = ev1.split(" ")[6]
90         if rcvd_svc_name != svc_name:
91             raise Exception("service name not matching")
92
93     return [adv_id, rcvd_svc_name]
94
95 def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
96     """P2PS nonexact service seek request"""
97     if adv_num is None:
98        adv_num = 1
99     if srv_info is not None:
100         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
101     else:
102         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
103     if ev1 is None:
104         raise Exception("Failed to add Service Discovery request for nonexact seek request")
105     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
106         raise Exception("Failed to initiate seek")
107     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
108     if ev1 is None:
109         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
110     if r_dev.p2p_dev_addr() not in ev1:
111         raise Exception("Unexpected peer")
112     ev_list = []
113     for i in range (0, adv_num):
114         ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
115         if ev1 is None:
116             raise Exception("Failed to receive Service Discovery Response")
117         if r_dev.p2p_dev_addr() not in ev1:
118             raise Exception("Service Discovery response from Unknown Peer")
119         if srv_info is not None and srv_info not in ev1:
120             raise Exception("service info not available in Service Discovery response")
121         adv_id = ev1.split(" ")[3]
122         rcvd_svc_name = ev1.split(" ")[6]
123         ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
124     return ev_list
125
126 def p2ps_parse_event(ev, *args):
127     ret = ()
128     for arg in args:
129         m = re.search("\s+" + arg + r"=(\S+)", ev)
130         ret += (m.group(1) if m is not None else None,)
131     return ret
132
133 def p2ps_provision(seeker, advertiser, adv_id, auto_accept=True, method="1000"):
134     addr0 = seeker.p2p_dev_addr()
135     addr1 = advertiser.p2p_dev_addr()
136
137     seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
138                          session_mac=addr0, method=method)
139
140     if not auto_accept or method == "100":
141         pin = None
142         ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
143                                                    timeout=10)
144         if ev_pd_start is None:
145             raise Exception("P2PS-PROV-START timeout on Advertiser side")
146         peer = ev_pd_start.split()[1]
147         advert_id, advert_mac, session, session_mac =\
148             p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
149
150         ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
151         if ev is None:
152             raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
153
154         if method == "100":
155             ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
156                                               timeout=10)
157             if ev is None:
158                 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
159             if addr0 not in ev:
160                 raise Exception("Unknown peer " + addr0)
161             ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
162                                           timeout=10)
163             if ev is None:
164                 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
165             if addr1 not in ev:
166                 raise Exception("Unknown peer " + addr1)
167             pin = ev.split()[2]
168         elif method == "8":
169             ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
170                                               timeout=10)
171             if ev is None:
172                 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
173             if addr0 not in ev:
174                 raise Exception("Unknown peer " + addr0)
175             pin = ev.split()[2]
176
177         advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
178                                  session_id=int(session, 0),
179                                  session_mac=session_mac, status=12)
180
181         ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
182         if ev1 is None:
183             raise Exception("P2PS-PROV-DONE timeout on seeker side")
184
185         ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
186         if ev2 is None:
187             raise Exception("P2PS-PROV-DONE timeout on advertiser side")
188
189         if method == "8":
190             ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
191                                           timeout=10)
192             if ev is None:
193                 raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
194             if addr1 not in ev:
195                 raise Exception("Unknown peer " + addr1)
196
197         if pin is not None:
198             return ev1, ev2, pin
199         return ev1, ev2
200
201     # Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
202     ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
203     if ev1 is None:
204         raise Exception("P2PS-PROV-DONE timeout on seeker side")
205
206     ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
207     if ev2 is None:
208         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
209
210     if method == "8":
211         ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
212         if ev is None:
213             raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
214         if addr1 not in ev:
215             raise Exception("Unknown peer " + addr1)
216         ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
217                                           timeout=10)
218         if ev is None:
219             raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
220         if addr0 not in ev:
221             raise Exception("Unknown peer " + addr0)
222         pin = ev.split()[2]
223         return ev1, ev2, pin
224
225     return ev1, ev2
226
227 def p2p_connect_p2ps_method(i_dev, r_dev, autoaccept):
228     """P2PS connect function with p2ps method"""
229     if autoaccept == False:
230         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
231             raise Exception("P2P_CONNECT fails on seeker side")
232         ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
233         if ev0 is None:
234             raise Exception("P2PS-PROV-DONE timeout on Advertiser side")
235
236         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
237             raise Exception("P2P_CONNECT fails on Advertiser side")
238
239     else:
240         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
241             raise Exception("P2P_CONNECT fails on Advertiser side")
242         ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=5)
243         if ev1 is None:
244             raise Exception("Failed to receive deferred acceptance at seeker")
245
246         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
247             raise Exception("P2P_CONNECT fails on seeker side")
248     ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
249     if ev0 is None:
250         raise Exception("GO Neg did not succeed")
251     ev0 = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
252     if ev0 is None:
253         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
254     r_dev.group_form_result(ev0)
255
256     ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
257     if ev1 is None:
258         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
259     i_dev.group_form_result(ev1)
260
261 def p2ps_provision_keypad_method(i_dev, r_dev, autoaccept,
262                                  initiator_or_responder):
263     """P2PS keypad method provisioning function"""
264     if autoaccept == False and initiator_or_responder == 'initiator':
265         ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
266         if ev is None:
267             raise Exception("Provisioning deferred on seeker side")
268         ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
269         if ev1 is None:
270             raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
271         if r_dev.p2p_dev_addr() not in ev1:
272             raise Exception("Unknown peer ")
273         ev = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
274         if ev is None:
275             raise Exception("P2PS-PROV-START timeout on Advertiser side")
276
277     if autoaccept == False and initiator_or_responder == 'responder':
278         ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
279         if ev0 is None:
280             raise Exception("P2PS-PROV-DONE timeout on seeker side")
281         ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
282         if ev0 is None:
283             raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
284
285     if autoaccept == True and initiator_or_responder == 'initiator':
286         ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
287         if ev1 is None:
288             raise Exception("P2PS-PROV-DONE timeout on seeker side")
289         ev2 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
290         if ev2 is None:
291             raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
292         if r_dev.p2p_dev_addr() not in ev2:
293             raise Exception("Unknown peer ")
294         return ev1
295
296 def p2ps_provision_display_method(i_dev, r_dev, autoaccept,
297                                   initiator_or_responder):
298     """P2PS display method provisioning function"""
299     if initiator_or_responder == 'initiator':
300         ev0 = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
301         if ev0 is None:
302             raise Exception("P2PS-PROV-START timeout on Advertiser side")
303         if autoaccept == False:
304             ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
305             if ev is None:
306                 raise Exception("Provisioning deferred on seeker side")
307         ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=10)
308         if ev1 is None:
309             raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on Seeker side")
310         if r_dev.p2p_dev_addr() not in ev1:
311             raise Exception("Unknown peer ")
312         pin = ev1.split(" ")[2]
313     else:
314         ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
315         if ev0 is None:
316             raise Exception("P2PS-PROV-DONE timeout on advertiser")
317         ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
318         if ev0 is None:
319             raise Exception("PIN Display on advertiser side")
320         pin = ev0.split(" ")[2]
321     return pin
322
323 def p2ps_connect_pin(pin, i_dev, r_dev, initiator_method):
324     """P2PS function to perform connection using PIN method"""
325     if initiator_method=="display":
326         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " display persistent "):
327             raise Exception("P2P_CONNECT fails on seeker side")
328         ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
329         if ev0 is None:
330             raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
331         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
332             raise Exception("P2P_CONNECT fails on Advertiser side")
333     else:
334         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
335             raise Exception("P2P_CONNECT fails on seeker side")
336         ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
337         if ev0 is None:
338             raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
339         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " display persistent "):
340             raise Exception("P2P_CONNECT fails on Advertiser side")
341
342     ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
343     if ev0 is None:
344         raise Exception("GO Neg did not succeed on advertiser side")
345     peer_mac = ev0.split("peer_dev=")[1].split(" ")[0]
346
347     ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
348     if ev1 is None:
349         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
350     i_dev.group_form_result(ev1)
351
352     ev_grpfrm = r_dev.wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"],
353                                         timeout=10)
354     if ev_grpfrm is None:
355         raise Exception("Group Formation failed on advertiser side")
356
357     ev = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
358     if ev is None:
359         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
360     res = r_dev.group_form_result(ev)
361
362     if res['role'] == "GO":
363         ev_grpfrm = r_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
364         if ev_grpfrm is None:
365             raise Exception("AP-STA-CONNECTED timeout on advertiser side")
366         if i_dev.p2p_dev_addr() not in ev_grpfrm:
367             raise Exception("Group formed with unknown Peer")
368     else:
369         ev1 = i_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=5)
370         if ev1 is None:
371             raise Exception("AP-STA-CONNECTED timeout on Seeker side")
372     if r_dev.p2p_dev_addr() not in ev1:
373         raise Exception("Group formed with unknown Peer")
374
375 def set_no_group_iface(dev, enable):
376     if enable:
377         res = dev.get_driver_status()
378         if (int(res['capa.flags'], 0) & 0x20000000):
379             raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
380         dev.global_request("SET p2p_no_group_iface 1")
381     else:
382         dev.global_request("SET p2p_no_group_iface 0")
383
384 def test_p2ps_exact_search(dev):
385     """P2PS exact service request"""
386     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
387                    srv_info='I can receive files upto size 2 GB')
388     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
389                                               svc_name='org.wi-fi.wfds.send.rx')
390
391     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
392     if ev0 is None:
393         raise Exception("Unable to remove the advertisement instance")
394
395 def test_p2ps_exact_search_srvinfo(dev):
396     """P2PS exact service request with service info"""
397     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
398                    srv_info='I can receive files upto size 2 GB')
399     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
400                                               svc_name='org.wi-fi.wfds.send.rx',
401                                               srv_info='2 GB')
402
403     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
404     if ev0 is None:
405         raise Exception("Unable to remove the advertisement instance")
406
407 def test_p2ps_nonexact_search(dev):
408     """P2PS nonexact seek request"""
409     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
410                    srv_info='I support Miracast Mode ')
411     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
412                                  svc_name='org.wi-fi.wfds.play*')
413     adv_id = ev_list[0].split()[0]
414
415     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
416     if ev0 is None:
417         raise Exception("Unable to remove the advertisement instance")
418
419 def test_p2ps_nonexact_search_srvinfo(dev):
420     """P2PS nonexact seek request with service info"""
421     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
422                    srv_info='I can receive files upto size 2 GB')
423     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
424                                  svc_name='org.wi-fi.wfds.send*',
425                                  srv_info='2 GB')
426     adv_id = ev_list[0].split()[0]
427     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
428     if ev0 is None:
429         raise Exception("Unable to remove the advertisement instance")
430
431 def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
432     """P2PS connect for non-auto-accept and P2PS config method"""
433     addr0 = dev[0].p2p_dev_addr()
434     addr1 = dev[1].p2p_dev_addr()
435     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
436                    srv_info='I can receive files upto size 2 GB')
437     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
438                                  svc_name='org.wi-fi.wfds.send*',
439                                  srv_info='2 GB')
440     adv_id = ev_list[0].split(" ")[0]
441     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
442         raise Exception("Failed to request provisioning on seeker")
443     ev0 = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
444     if ev0 is None:
445         raise Exception("P2PS-PROV-START timeout on advertiser side")
446     ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=15)
447     if ev1 is None:
448         raise Exception("Provisioning deferred timeout on seeker side")
449     dev[1].p2p_listen()
450     if "OK" not in dev[0].global_request("P2P_ASP_PROVISION_RESP " + addr1 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " status=12"):
451         raise Exception("Failed to send deferred acceptance from advertizer")
452     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=15)
453     if ev1 is None:
454         raise Exception("Failed to receive deferred acceptance at seeker")
455
456     p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False)
457     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
458     if ev0 is None:
459         raise Exception("Unable to remove the advertisement instance")
460     remove_group(dev[0], dev[1])
461
462 def test_p2ps_connect_p2ps_method_autoaccept(dev):
463     """P2PS connection with P2PS default config method and auto-accept"""
464     addr0 = dev[0].p2p_dev_addr()
465     addr1 = dev[1].p2p_dev_addr()
466     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
467                    srv_info='I can receive files upto size 2 GB')
468     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
469                                               svc_name='org.wi-fi.wfds.send.rx',
470                                               srv_info='2 GB')
471     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
472         raise Exception("P2P_ASP_PROVISION failed on seeker side")
473
474     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
475     if ev0 is None:
476         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
477
478     p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True)
479
480     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
481     if ev0 is None:
482         raise Exception("Unable to remove the advertisement instance")
483     remove_group(dev[0], dev[1])
484
485 def test_p2ps_connect_keypad_method_nonautoaccept(dev):
486     """P2PS Connection with non-auto-accept and seeker having keypad method"""
487     addr0 = dev[0].p2p_dev_addr()
488     addr1 = dev[1].p2p_dev_addr()
489     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
490                    srv_info='I can receive files upto size 2 GB')
491     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
492                                  svc_name='org.wi-fi.wfds.send*',
493                                  srv_info='2 GB')
494     adv_id = ev_list[0].split(" ")[0]
495     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"):     # keypad method on seeker side
496         raise Exception("Failed to request provisioning on seeker")
497     p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
498                                  initiator_or_responder='initiator')
499     dev[1].p2p_listen()
500
501     if "OK" not in dev[0].global_request("P2P_ASP_PROVISION_RESP " + addr1 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " status=12"):
502         raise Exception("Failed to send deferred acceptance from advertizer")
503
504     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
505                                         autoaccept=False,
506                                         initiator_or_responder='responder')
507     p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1],
508                      initiator_method="display")
509     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
510     if ev0 is None:
511         raise Exception("Unable to remove the advertisement instance")
512     remove_group(dev[0], dev[1])
513
514 def test_p2ps_connect_display_method_nonautoaccept(dev):
515     """P2PS connection with non-auto-accept and seeker having display method"""
516     addr0 = dev[0].p2p_dev_addr()
517     addr1 = dev[1].p2p_dev_addr()
518     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
519                    srv_info='I can receive files upto size 2 GB')
520     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
521                                  svc_name='org.wi-fi.wfds*', srv_info='2 GB')
522     adv_id = ev_list[0].split(" ")[0]
523     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=100"):     # keypad method on seeker side
524         raise Exception("Failed to request provisioning on seeker")
525     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
526                                         autoaccept=False,
527                                         initiator_or_responder='initiator')
528     dev[1].p2p_listen()
529
530     if "OK" not in dev[0].global_request("P2P_ASP_PROVISION_RESP " + addr1 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " status=12"):
531         raise Exception("Failed to send deferred acceptance from advertiser")
532     p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
533                                  initiator_or_responder='responder')
534     p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1], initiator_method="keypad")
535
536     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
537     if ev0 is None:
538         raise Exception("Unable to remove the advertisement instance")
539     remove_group(dev[0], dev[1])
540
541 def test_p2ps_connect_keypad_method_autoaccept(dev):
542     """P2PS connection with auto-accept and keypad method on seeker side"""
543     addr0 = dev[0].p2p_dev_addr()
544     addr1 = dev[1].p2p_dev_addr()
545     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
546                    srv_info='I can receive files upto size 2 GB')
547     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
548                                               svc_name='org.wi-fi.wfds.send.rx',
549                                               srv_info='2 GB')
550     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"):     # keypad method on seeker side
551         raise Exception("Failed to request provisioning on seeker")
552
553     p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True,
554                                  initiator_or_responder='initiator')
555     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
556                                         autoaccept=True,
557                                         initiator_or_responder='responder')
558     p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="Keypad")
559     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
560     if ev0 is None:
561         raise Exception("Unable to remove the advertisement instance")
562     remove_group(dev[0], dev[1])
563
564 def test_p2ps_connect_display_method_autoaccept(dev):
565     """P2PS connection with auto-accept and display method on seeker side"""
566     addr0 = dev[0].p2p_dev_addr()
567     addr1 = dev[1].p2p_dev_addr()
568     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
569                    srv_info='I can receive files upto size 2 GB')
570     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
571                                               svc_name='org.wi-fi.wfds.send.rx',
572                                               srv_info='2 GB')
573     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=100"):     # display method on seeker side
574         raise Exception("Failed to request provisioning on seeker")
575
576     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
577                                         autoaccept=True,
578                                         initiator_or_responder='initiator')
579     dev[1].p2p_listen()
580
581     p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="display")
582     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
583     if ev0 is None:
584         raise Exception("Unable to remove the advertisement instance")
585     remove_group(dev[0], dev[1])
586
587 def test_p2ps_connect_adv_go_p2ps_method(dev):
588     """P2PS auto-accept connection with advertisement as GO and P2PS method"""
589     addr0 = dev[0].p2p_dev_addr()
590     addr1 = dev[1].p2p_dev_addr()
591     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
592                    srv_info='I can receive files upto size 2 GB')
593     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
594                                               svc_name='org.wi-fi.wfds.send.rx',
595                                               srv_info='2 GB')
596     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
597         raise Exception("Failed to request provisioning on seeker")
598
599     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
600     if ev0 is None:
601         raise Exception("Timed out while waiting for prov done on advertizer")
602     if "go=" not in ev0:
603         raise Exception("Advertiser failed to become GO")
604
605     adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
606     if adv_conncap == "4":
607         logger.info("Advertiser is GO")
608     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
609     if ev0 is None:
610         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
611     dev[0].group_form_result(ev0)
612
613     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
614     if ev1 is None:
615         raise Exception("P2PS-PROV-DONE timeout on seeker side")
616
617     seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
618
619     if "join=" in ev1:
620         if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " 12345670 p2ps persistent join"):
621             raise Exception("P2P_CONNECT failed on seeker side")
622         ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
623         if ev1 is None:
624             raise Exception("P2P-GROUP-STARTED timeout on seeker side")
625     dev[1].group_form_result(ev1)
626
627     ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
628     if ev0 is None:
629         raise Exception("AP-STA-CONNECTED timeout on advertiser side")
630     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
631     if ev0 is None:
632         raise Exception("Unable to remove the advertisement instance")
633     remove_group(dev[0], dev[1])
634
635 def test_p2ps_connect_adv_client_p2ps_method(dev):
636     """P2PS auto-accept connection with advertisement as Client and P2PS method"""
637     addr0 = dev[0].p2p_dev_addr()
638     addr1 = dev[1].p2p_dev_addr()
639     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
640                    srv_info='I can receive files upto size 2 GB')
641     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
642                                               svc_name='org.wi-fi.wfds.send.rx',
643                                               srv_info='2 GB')
644     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
645         raise Exception("Failed to request provisioning on seeker")
646
647     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
648     if ev0 is None:
649         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
650     if "join=" not in ev0:
651         raise Exception("Advertiser failed to become Client")
652
653     adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
654     if adv_conncap == "2":
655         logger.info("Advertiser is Client")
656
657     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
658     if ev1 is None:
659         raise Exception("Provisioning failed on seeker side")
660
661     seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
662     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
663     if ev1 is None:
664         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
665     dev[1].group_form_result(ev1)
666
667     if "join=" in ev0:
668         if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
669             raise Exception("P2P_CONNECT failed on seeker side")
670
671     ev0 = dev[0].wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"], timeout=15)
672     if ev0 is None:
673         raise Exception("P2P Group Formation failed on advertiser side")
674
675     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
676     if ev0 is None:
677         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
678     dev[0].group_form_result(ev0)
679
680     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
681     if ev1 is None:
682         raise Exception("Group formation failed")
683     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
684     if ev0 is None:
685         raise Exception("Unable to remove the advertisement instance")
686     remove_group(dev[0], dev[1])
687
688 def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
689     addr0 = dev[0].p2p_dev_addr()
690     addr1 = dev[1].p2p_dev_addr()
691     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
692                    srv_info='I can receive files upto size 2 GB')
693     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
694                                               svc_name='org.wi-fi.wfds.send.rx',
695                                               srv_info='2 GB')
696     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"):     # keypad method on seeker side
697         raise Exception("Failed to request provisioning on seeker")
698
699     seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
700                                                 autoaccept=True,
701                                                 initiator_or_responder='initiator')
702
703     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
704     if ev0 is None:
705         raise Exception("P2PS-PROV-DONE timeout on advertier side")
706     adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
707     if adv_conncap == "4":
708         logger.info("Advertiser is GO")
709     ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
710     if ev0 is None:
711         raise Exception("PIN Display on advertiser side")
712     pin = ev0.split(" ")[2]
713
714     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
715     if ev0 is None:
716         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
717     dev[0].group_form_result(ev0)
718
719     ev0 = dev[0].group_request("WPS_PIN any " + pin)
720     if ev0 is None:
721         raise Exception("Failed to initiate Pin authorization on registrar side")
722     if "join=" in seek_prov_ev:
723         if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " keypad persistent join"):
724             raise Exception("P2P_CONNECT failed on seeker side")
725         ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
726         if ev1 is None:
727             raise Exception("P2P-GROUP-STARTED timeout on seeker side")
728         dev[1].group_form_result(ev1)
729
730         ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
731         if ev0 is None:
732             raise Exception("AP-STA-CONNECTED timeout on advertiser side")
733
734     if not keep_group:
735         ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
736         if ev0 is None:
737             raise Exception("Unable to remove the advertisement instance")
738         remove_group(dev[0], dev[1])
739
740 def test_p2ps_connect_adv_go_pin_method(dev):
741     """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
742     p2ps_connect_adv_go_pin_method(dev)
743
744 def test_p2ps_connect_adv_client_pin_method(dev):
745     """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
746     addr0 = dev[0].p2p_dev_addr()
747     addr1 = dev[1].p2p_dev_addr()
748     dev[0].flush_scan_cache()
749     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
750                    srv_info='I can receive files upto size 2 GB')
751     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
752                                               svc_name='org.wi-fi.wfds.send.rx',
753                                               srv_info='2 GB')
754     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"):     # keypad method on seeker side
755         raise Exception("Failed to request provisioning on seeker")
756
757     seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
758                                                 autoaccept=True,
759                                                 initiator_or_responder='initiator')
760
761     adv_prov = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
762     if adv_prov is None:
763         raise Exception("Prov failed on advertiser")
764     adv_conncap = adv_prov.split("conncap=")[1].split(" ")[0]
765     if adv_conncap == "2":
766         logger.info("Advertiser is Client")
767     adv_pin_show_event = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
768                                                   timeout=5)
769     if adv_pin_show_event is None:
770         raise Exception("PIN Display on advertiser side")
771     pin = adv_pin_show_event.split(" ")[2]
772
773     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
774     if ev1 is None:
775         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
776     dev[1].group_form_result(ev1)
777
778     ev1 = dev[1].group_request("WPS_PIN any " + pin)
779     if ev1 is None:
780         raise Exception("Failed to initiate Pin authorization on registrar side")
781
782     if "join=" in adv_prov:
783         if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " " + pin + " display persistent join"):
784             raise Exception("P2P_CONNECT failed on advertiser side")
785     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
786     if ev0 is None:
787         raise Exception("Group formation failed to start on seeker side")
788     dev[0].group_form_result(ev0)
789
790     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
791     if ev1 is None:
792         raise Exception("AP-STA-CONNECTED timeout on advertiser side")
793     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
794     if ev0 is None:
795         raise Exception("Unable to remove the advertisement instance")
796     remove_group(dev[0], dev[1])
797
798 def test_p2ps_service_discovery_multiple_queries(dev):
799     """P2P service discovery with multiple queries"""
800     addr0 = dev[0].p2p_dev_addr()
801     addr1 = dev[1].p2p_dev_addr()
802     adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
803                              svc_name='org.wi-fi.wfds.send.tx',
804                              srv_info='I can transfer files upto size of 2 GB')
805     adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
806                              svc_name='org.wi-fi.wfds.send.rx',
807                              srv_info='I can receive files upto size of 2 GB')
808     adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
809                              svc_name='org.wi-fi.wfds.display.tx',
810                              srv_info='Miracast Mode')
811     adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
812                              svc_name='org.wi-fi.wfds.display.rx',
813                              srv_info='Miracast Mode')
814
815     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
816     dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
817     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
818     dev[1].p2p_stop_find()
819     dev[1].global_request("P2P_FIND 10 type=social seek=")
820     ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
821     if ev is None:
822         raise Exception("P2P Device Found timed out")
823     if addr0 not in ev:
824         raise Exception("Unexpected service discovery request source")
825     ev_list = []
826     for i in range(0, 3):
827         ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
828         if ev is None:
829             raise Exception("P2P Service discovery timed out")
830         if addr0 in ev:
831             ev_list.append(ev)
832             if len(ev_list) == 3:
833                 break
834     dev[1].p2p_stop_find()
835
836     for test in [ ("seek=org.wi-fi.wfds.display.TX",
837                    "asp_svc=org.wi-fi.wfds.display.tx"),
838                   ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
839                    "asp_svc=org.wi-fi.wfds.display.tx"),
840                   ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
841                    "asp_svc=org.wi-fi.wfds.display.tx"),
842                   ("seek=not-found", None),
843                   ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
844         dev[2].global_request("P2P_FIND 10 type=social " + test[0])
845         if test[1] is None:
846             ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
847             if ev is not None:
848                 raise Exception("Unexpected device found: " + ev)
849             continue
850         ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
851         if ev is None:
852             raise Exception("P2P device discovery timed out (dev2)")
853             if test[1] not in ev:
854                 raise Exception("Expected asp_svc not reported: " + ev)
855         dev[2].p2p_stop_find()
856         dev[2].request("P2P_FLUSH")
857
858     dev[0].p2p_stop_find()
859
860     ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
861     if ev1 is None:
862         raise Exception("Unable to remove the advertisement instance")
863     ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
864     if ev2 is None:
865         raise Exception("Unable to remove the advertisement instance")
866     ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
867     if ev3 is None:
868         raise Exception("Unable to remove the advertisement instance")
869     ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
870     if ev4 is None:
871         raise Exception("Unable to remove the advertisement instance")
872
873     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
874         raise Exception("P2P_SERVICE_ADD failed")
875     if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
876         raise Exception("P2P_SERVICE_DEL asp all failed")
877     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
878         raise Exception("P2P_SERVICE_ADD failed")
879     if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
880         raise Exception("P2P_SERVICE_REP failed")
881     if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
882         raise Exception("Invalid P2P_SERVICE_REP accepted")
883     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
884         raise Exception("P2P_SERVICE_ADD failed")
885     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
886         raise Exception("P2P_SERVICE_ADD failed")
887
888 def get_ifnames():
889     with open('/proc/net/dev', 'r') as f:
890         data = f.read()
891     ifnames = []
892     for line in data.splitlines():
893         ifname = line.strip().split(' ')[0]
894         if ':' not in ifname:
895             continue
896         ifname = ifname.split(':')[0]
897         ifnames.append(ifname)
898     return ifnames
899
900 def p2ps_connect_p2ps_method(dev, keep_group=False):
901     addr0 = dev[0].p2p_dev_addr()
902     addr1 = dev[1].p2p_dev_addr()
903     dev[0].flush_scan_cache()
904     dev[1].flush_scan_cache()
905     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
906                    srv_info='I can receive files upto size 2 GB')
907     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
908                                               svc_name='org.wi-fi.wfds.send.rx',
909                                               srv_info='2 GB')
910     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='test-session-info-data' method=1000"):
911         raise Exception("Failed to request provisioning on seeker")
912
913     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
914     if ev0 is None:
915         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
916     if "join=" not in ev0:
917         raise Exception("join parameter missing from P2PS-PROV-DONE")
918
919     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
920     if ev1 is None:
921         raise Exception("Provisioning failed on seeker side")
922
923     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
924     if ev1 is None:
925         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
926     res1 = dev[1].group_form_result(ev1)
927     ifnames = get_ifnames()
928
929     if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
930         raise Exception("P2P_CONNECT failed on seeker side")
931
932     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
933     if ev0 is None:
934         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
935     res0 = dev[0].group_form_result(ev0)
936
937     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
938     if ev1 is None:
939         raise Exception("Group formation failed")
940
941     if not keep_group:
942         ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
943         if ev0 is None:
944             raise Exception("Unable to remove the advertisement instance")
945         ifnames = ifnames + get_ifnames()
946         remove_group(dev[0], dev[1])
947         ifnames = ifnames + get_ifnames()
948
949     return (res0, res1, ifnames)
950
951 def has_string_prefix(vals, prefix):
952     for val in vals:
953         if val.startswith(prefix):
954             return True
955     return False
956
957 def test_p2ps_connect_p2ps_method_1(dev):
958     """P2PS connection with P2PS method - no group interface"""
959     set_no_group_iface(dev[0], 1)
960     set_no_group_iface(dev[1], 1)
961
962     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
963     if res0['ifname'] != dev[0].ifname:
964         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
965     if res1['ifname'] != dev[1].ifname:
966         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
967     if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
968         raise Exception("dev0 group interface unexpectedly present")
969     if has_string_prefix(ifnames, 'p2p-' + res1['ifname']):
970         raise Exception("dev1 group interface unexpectedly present")
971
972 def test_p2ps_connect_p2ps_method_2(dev):
973     """P2PS connection with P2PS method - group interface on dev0"""
974     set_no_group_iface(dev[0], 0)
975     set_no_group_iface(dev[1], 1)
976
977     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
978     if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
979         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
980     if res1['ifname'] != dev[1].ifname:
981         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
982     if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
983         raise Exception("dev0 group interface unexpectedly present")
984
985 def test_p2ps_connect_p2ps_method_3(dev):
986     """P2PS connection with P2PS method - group interface on dev1"""
987     set_no_group_iface(dev[0], 1)
988     set_no_group_iface(dev[1], 0)
989
990     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
991     if res0['ifname'] != dev[0].ifname:
992         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
993     if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
994         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
995     if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
996         raise Exception("dev0 group interface unexpectedly present")
997
998 def test_p2ps_connect_p2ps_method_4(dev):
999     """P2PS connection with P2PS method - group interface on both"""
1000     set_no_group_iface(dev[0], 0)
1001     set_no_group_iface(dev[1], 0)
1002
1003     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
1004     if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
1005         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
1006     if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
1007         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
1008
1009 def test_p2ps_connect_adv_go_persistent(dev):
1010     """P2PS auto-accept connection with advertisement as GO and having persistent group"""
1011     addr0 = dev[0].p2p_dev_addr()
1012     addr1 = dev[1].p2p_dev_addr()
1013
1014     go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
1015                                      r_dev=dev[1], r_intent=0)
1016     dev[0].remove_group()
1017     dev[1].wait_go_ending_session()
1018
1019     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
1020                    srv_info='I can receive files upto size 2 GB')
1021     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1022                                               svc_name='org.wi-fi.wfds.send.rx',
1023                                               srv_info='2 GB')
1024     if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
1025         raise Exception("Failed to request provisioning on seeker")
1026
1027     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
1028     if ev0 is None:
1029         raise Exception("Timed out while waiting for prov done on advertizer")
1030     if "persist=" not in ev0:
1031         raise Exception("Advertiser did not indicate persistent group")
1032     id0 = ev0.split("persist=")[1].split(" ")[0]
1033     if "OK" not in dev[0].global_request("P2P_GROUP_ADD persistent=" + id0 + " freq=2412"):
1034         raise Exception("Could not re-start persistent group")
1035
1036     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1037     if ev0 is None:
1038         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
1039     dev[0].group_form_result(ev0)
1040
1041     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
1042     if ev1 is None:
1043         raise Exception("P2PS-PROV-DONE timeout on seeker side")
1044
1045     if "persist=" not in ev1:
1046         raise Exception("Seeker did not indicate persistent group")
1047     id1 = ev1.split("persist=")[1].split(" ")[0]
1048     if "OK" not in dev[1].global_request("P2P_GROUP_ADD persistent=" + id1 + " freq=2412"):
1049         raise Exception("Could not re-start persistent group")
1050
1051     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
1052     if ev1 is None:
1053         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
1054     dev[1].group_form_result(ev1)
1055
1056     ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=15)
1057     if ev0 is None:
1058         raise Exception("AP-STA-CONNECTED timeout on advertiser side")
1059     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1060     if ev0 is None:
1061         raise Exception("Unable to remove the advertisement instance")
1062     remove_group(dev[0], dev[1])
1063
1064 def test_p2ps_client_probe(dev):
1065     """P2PS CLI discoverability on operating channel"""
1066     cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
1067     p2ps_connect_p2ps_method(dev, keep_group=True)
1068     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
1069                                               svc_name='org.wi-fi.wfds.send.rx',
1070                                               single_peer_expected=False)
1071     dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1072     remove_group(dev[0], dev[1])
1073
1074 def test_p2ps_go_probe(dev):
1075     """P2PS GO discoverability on operating channel"""
1076     p2ps_connect_adv_go_pin_method(dev, keep_group=True)
1077     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
1078                                               svc_name='org.wi-fi.wfds.send.rx',
1079                                               single_peer_expected=False)
1080     dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1081     remove_group(dev[0], dev[1])
1082
1083 def test_p2ps_wildcard_p2ps(dev):
1084     """P2PS wildcard SD Probe Request/Response"""
1085     p2ps_wildcard = "org.wi-fi.wfds"
1086
1087     adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
1088                             svc_name='org.foo.service',
1089                             srv_info='I can do stuff')
1090     adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
1091                              svc_name='org.wi-fi.wfds.send.rx',
1092                              srv_info='I can receive files upto size 2 GB')
1093
1094     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
1095         raise Exception("Failed on P2P_FIND command")
1096
1097     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1098     if ev1 is None:
1099         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
1100     if dev[0].p2p_dev_addr() not in ev1:
1101         raise Exception("Unexpected peer")
1102
1103     ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1104     if ev2 is None:
1105         raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
1106     if dev[0].p2p_dev_addr() not in ev2:
1107         raise Exception("Unexpected peer (2)")
1108
1109     if p2ps_wildcard not in ev1 + ev2:
1110         raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
1111     if "org.foo.service" not in ev1 + ev2:
1112         raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
1113
1114     if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
1115         raise Exception("P2P_STOP_FIND failed")
1116     dev[1].dump_monitor()
1117
1118     res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1119     if res is None:
1120         raise Exception("Unable to remove the advertisement instance")
1121
1122     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
1123         raise Exception("Failed on P2P_FIND command")
1124
1125     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1126     if ev1 is None:
1127         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
1128     if dev[0].p2p_dev_addr() not in ev1:
1129         raise Exception("Unexpected peer")
1130     if p2ps_wildcard not in ev1:
1131         raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
1132     dev[1].dump_monitor()
1133
1134     res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
1135     if res is None:
1136         raise Exception("Unable to remove the advertisement instance 2")
1137
1138     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
1139         raise Exception("Failed on P2P_FIND command")
1140
1141     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
1142     if ev1 is not None:
1143         raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
1144     dev[1].p2p_stop_find()
1145     dev[1].dump_monitor()
1146
1147 def test_p2ps_many_services_in_probe(dev):
1148     """P2PS with large number of services in Probe Request/Response"""
1149     long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
1150     long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
1151     long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
1152     long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
1153     long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
1154     for name in [ long1, long2, long3, long4, long5 ]:
1155         p2ps_advertise(r_dev=dev[0], r_role='1',
1156                        svc_name=name,
1157                        srv_info='I can do stuff')
1158
1159     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=%s seek=%s seek=%s seek=%s seek=%s" % (long1, long2, long3, long4, long5)):
1160         raise Exception("Failed on P2P_FIND command")
1161
1162     events = ""
1163     # Note: Require only four events since all the services do not fit within
1164     # the length limit.
1165     for i in range(4):
1166         ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1167         if ev is None:
1168             raise Exception("Missing P2P-DEVICE-FOUND")
1169         events = events + ev
1170     dev[1].p2p_stop_find()
1171     dev[1].dump_monitor()
1172     for name in [ long2, long3, long4, long5 ]:
1173         if name not in events:
1174             raise Exception("Service missing from peer events")