tests: Skip some tests in P2PS when a dedicated P2P Device is used
[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
12 import hwsim_utils
13 from wpasupplicant import WpaSupplicant
14 from test_p2p_grpform import check_grpform_results
15 from test_p2p_grpform import remove_group
16 from test_p2p_persistent import go_neg_pin_authorized_persistent
17 from utils import HwsimSkip
18
19 # Dev[0] -> Advertiser
20 # Dev[1] -> Seeker
21 # ev0 -> Event generated at advertiser side
22 # ev1 -> Event generated at Seeker side
23
24 def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None):
25     """P2PS Advertise function"""
26     adv_id = random.randrange(1, 0xFFFFFFFF)
27     advid = hex(adv_id)[2:]
28
29     if rsp_info is not None and srv_info is not None:
30         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 + "'"):
31             raise Exception("P2P_SERVICE_ADD with response info and service info failed")
32
33     if rsp_info is None and srv_info is not None:
34         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 + "'"):
35             raise Exception("P2P_SERVICE_ADD with service info failed")
36
37     if rsp_info is None and srv_info is None:
38         if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " "):
39             raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
40
41     if rsp_info is not None and srv_info is None:
42         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 + "'"):
43             raise Exception("P2P_SERVICE_ADD with response info failed")
44
45     r_dev.p2p_listen()
46     return advid
47
48 def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None):
49     """P2PS exact service seek request"""
50     if srv_info is not None:
51         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
52         if ev1 is None:
53             raise Exception("Failed to add Service Discovery request for exact seek request")
54
55     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
56         raise Exception("Failed to initiate seek operation")
57
58     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
59     if ev1 is None:
60         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
61     if r_dev.p2p_dev_addr() not in ev1:
62         raise Exception("Unexpected peer")
63
64     if srv_info is None:
65         adv_id = ev1.split("adv_id=")[1].split(" ")[0]
66         rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
67         if rcvd_svc_name != svc_name:
68             raise Exception("service name not matching")
69     else:
70         ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
71         if ev1 is None:
72             raise Exception("Failed to receive Service Discovery Response")
73         if r_dev.p2p_dev_addr() not in ev1:
74             raise Exception("Service Discovery response from Unknown Peer")
75         if srv_info is not None and srv_info not in ev1:
76             raise Exception("service info not available in Service Discovery response")
77         adv_id = ev1.split(" ")[3]
78         rcvd_svc_name = ev1.split(" ")[6]
79         if rcvd_svc_name != svc_name:
80             raise Exception("service name not matching")
81
82     return [adv_id, rcvd_svc_name]
83
84 def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
85     """P2PS nonexact service seek request"""
86     if adv_num is None:
87        adv_num = 1
88     if srv_info is not None:
89         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
90     else:
91         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
92     if ev1 is None:
93         raise Exception("Failed to add Service Discovery request for nonexact seek request")
94     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
95         raise Exception("Failed to initiate seek")
96     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
97     if ev1 is None:
98         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
99     if r_dev.p2p_dev_addr() not in ev1:
100         raise Exception("Unexpected peer")
101     ev_list = []
102     for i in range (0, adv_num):
103         ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
104         if ev1 is None:
105             raise Exception("Failed to receive Service Discovery Response")
106         if r_dev.p2p_dev_addr() not in ev1:
107             raise Exception("Service Discovery response from Unknown Peer")
108         if srv_info is not None and srv_info not in ev1:
109             raise Exception("service info not available in Service Discovery response")
110         adv_id = ev1.split(" ")[3]
111         rcvd_svc_name = ev1.split(" ")[6]
112         ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
113     return ev_list
114
115 def p2p_connect_p2ps_method(i_dev, r_dev, autoaccept):
116     """P2PS connect function with p2ps method"""
117     if autoaccept == False:
118         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
119             raise Exception("P2P_CONNECT fails on seeker side")
120         ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
121         if ev0 is None:
122             raise Exception("P2PS-PROV-DONE timeout on Advertiser side")
123
124         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
125             raise Exception("P2P_CONNECT fails on Advertiser side")
126
127     else:
128         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
129             raise Exception("P2P_CONNECT fails on Advertiser side")
130         ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=5)
131         if ev1 is None:
132             raise Exception("Failed to receive deferred acceptance at seeker")
133
134         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
135             raise Exception("P2P_CONNECT fails on seeker side")
136     ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
137     if ev0 is None:
138         raise Exception("GO Neg did not succeed")
139     ev0 = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
140     if ev0 is None:
141         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
142     r_dev.group_form_result(ev0)
143
144     ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
145     if ev1 is None:
146         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
147     i_dev.group_form_result(ev1)
148
149 def p2ps_provision_keypad_method(i_dev, r_dev, autoaccept,
150                                  initiator_or_responder):
151     """P2PS keypad method provisioning function"""
152     if autoaccept == False and initiator_or_responder == 'initiator':
153         ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
154         if ev is None:
155             raise Exception("Provisioning deferred on seeker side")
156         ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
157         if ev1 is None:
158             raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
159         if r_dev.p2p_dev_addr() not in ev1:
160             raise Exception("Unknown peer ")
161         ev = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
162         if ev is None:
163             raise Exception("P2PS-PROV-START timeout on Advertiser side")
164
165     if autoaccept == False and initiator_or_responder == 'responder':
166         ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
167         if ev0 is None:
168             raise Exception("P2PS-PROV-DONE timeout on seeker side")
169         ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
170         if ev0 is None:
171             raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
172
173     if autoaccept == True and initiator_or_responder == 'initiator':
174         ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
175         if ev1 is None:
176             raise Exception("P2PS-PROV-DONE timeout on seeker side")
177         ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
178         if ev1 is None:
179             raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
180         if r_dev.p2p_dev_addr() not in ev1:
181             raise Exception("Unknown peer ")
182         return ev1
183
184 def p2ps_provision_display_method(i_dev, r_dev, autoaccept,
185                                   initiator_or_responder):
186     """P2PS display method provisioning function"""
187     if initiator_or_responder == 'initiator':
188         ev0 = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
189         if ev0 is None:
190             raise Exception("P2PS-PROV-START timeout on Advertiser side")
191         if autoaccept == False:
192             ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
193             if ev is None:
194                 raise Exception("Provisioning deferred on seeker side")
195         ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=10)
196         if ev1 is None:
197             raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on Seeker side")
198         if r_dev.p2p_dev_addr() not in ev1:
199             raise Exception("Unknown peer ")
200         pin = ev1.split(" ")[2]
201     else:
202         ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
203         if ev0 is None:
204             raise Exception("P2PS-PROV-DONE timeout on advertiser")
205         ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
206         if ev0 is None:
207             raise Exception("PIN Display on advertiser side")
208         pin = ev0.split(" ")[2]
209     return pin
210
211 def p2ps_connect_pin(pin, i_dev, r_dev, initiator_method):
212     """P2PS function to perform connection using PIN method"""
213     if initiator_method=="display":
214         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " display persistent "):
215             raise Exception("P2P_CONNECT fails on seeker side")
216         ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
217         if ev0 is None:
218             raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
219         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
220             raise Exception("P2P_CONNECT fails on Advertiser side")
221     else:
222         if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
223             raise Exception("P2P_CONNECT fails on seeker side")
224         ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
225         if ev0 is None:
226             raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
227         if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " display persistent "):
228             raise Exception("P2P_CONNECT fails on Advertiser side")
229
230     ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
231     if ev0 is None:
232         raise Exception("GO Neg did not succeed on advertiser side")
233     peer_mac = ev0.split("peer_dev=")[1].split(" ")[0]
234
235     ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
236     if ev1 is None:
237         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
238     i_dev.group_form_result(ev1)
239
240     ev_grpfrm = r_dev.wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"],
241                                         timeout=10)
242     if ev_grpfrm is None:
243         raise Exception("Group Formation failed on advertiser side")
244
245     ev = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
246     if ev is None:
247         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
248     res = r_dev.group_form_result(ev)
249
250     if res['role'] == "GO":
251         ev_grpfrm = r_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
252         if ev_grpfrm is None:
253             raise Exception("AP-STA-CONNECTED timeout on advertiser side")
254         if i_dev.p2p_dev_addr() not in ev_grpfrm:
255             raise Exception("Group formed with unknown Peer")
256     else:
257         ev1 = i_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=5)
258         if ev1 is None:
259             raise Exception("AP-STA-CONNECTED timeout on Seeker side")
260     if r_dev.p2p_dev_addr() not in ev1:
261         raise Exception("Group formed with unknown Peer")
262
263 def set_no_group_iface(dev, enable):
264     if enable:
265         res = dev.get_driver_status()
266         if (int(res['capa.flags'], 0) & 0x20000000):
267             raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
268         dev.global_request("SET p2p_no_group_iface 1")
269     else:
270         dev.global_request("SET p2p_no_group_iface 0")
271
272 def test_p2ps_exact_search(dev):
273     """P2PS exact service request"""
274     addr0 = dev[0].p2p_dev_addr()
275     addr1 = dev[1].p2p_dev_addr()
276     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
277                    srv_info='I can receive files upto size 2 GB')
278     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
279                                               svc_name='org.wi-fi.wfds.send.rx')
280
281     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
282     if ev0 is None:
283         raise Exception("Unable to remove the advertisement instance")
284
285 def test_p2ps_exact_search_srvinfo(dev):
286     """P2PS exact service request with service info"""
287     addr0 = dev[0].p2p_dev_addr()
288     addr1 = dev[1].p2p_dev_addr()
289     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
290                    srv_info='I can receive files upto size 2 GB')
291     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
292                                               svc_name='org.wi-fi.wfds.send.rx',
293                                               srv_info='2 GB')
294
295     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
296     if ev0 is None:
297         raise Exception("Unable to remove the advertisement instance")
298
299 def test_p2ps_nonexact_search(dev):
300     """P2PS nonexact seek request"""
301     addr0 = dev[0].p2p_dev_addr()
302     addr1 = dev[1].p2p_dev_addr()
303     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
304                    srv_info='I support Miracast Mode ')
305     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
306                                  svc_name='org.wi-fi.wfds.play*')
307     adv_id = ev_list[0].split(" ")[0]
308
309     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
310     if ev0 is None:
311         raise Exception("Unable to remove the advertisement instance")
312
313 def test_p2ps_nonexact_search_srvinfo(dev):
314     """P2PS nonexact seek request with service info"""
315     addr0 = dev[0].p2p_dev_addr()
316     addr1 = dev[1].p2p_dev_addr()
317     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
318                    srv_info='I can receive files upto size 2 GB')
319     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
320                                  svc_name='org.wi-fi.wfds.send*',
321                                  srv_info='2 GB')
322     adv_id = ev_list[0].split(" ")[0]
323     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
324     if ev0 is None:
325         raise Exception("Unable to remove the advertisement instance")
326
327 def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
328     """P2PS connect for non-auto-accept and P2PS config method"""
329     addr0 = dev[0].p2p_dev_addr()
330     addr1 = dev[1].p2p_dev_addr()
331     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
332                    srv_info='I can receive files upto size 2 GB')
333     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
334                                  svc_name='org.wi-fi.wfds.send*',
335                                  srv_info='2 GB')
336     adv_id = ev_list[0].split(" ")[0]
337     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"):
338         raise Exception("Failed to request provisioning on seeker")
339     ev0 = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
340     if ev0 is None:
341         raise Exception("P2PS-PROV-START timeout on advertiser side")
342     ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=15)
343     if ev1 is None:
344         raise Exception("Provisioning deferred timeout on seeker side")
345     dev[1].p2p_listen()
346     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"):
347         raise Exception("Failed to send deferred acceptance from advertizer")
348     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=15)
349     if ev1 is None:
350         raise Exception("Failed to receive deferred acceptance at seeker")
351
352     p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False)
353     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
354     if ev0 is None:
355         raise Exception("Unable to remove the advertisement instance")
356     remove_group(dev[0], dev[1])
357
358 def test_p2ps_connect_p2ps_method_autoaccept(dev):
359     """P2PS connection with P2PS default config method and auto-accept"""
360     addr0 = dev[0].p2p_dev_addr()
361     addr1 = dev[1].p2p_dev_addr()
362     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
363                    srv_info='I can receive files upto size 2 GB')
364     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
365                                               svc_name='org.wi-fi.wfds.send.rx',
366                                               srv_info='2 GB')
367     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"):
368         raise Exception("P2P_ASP_PROVISION failed on seeker side")
369
370     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
371     if ev0 is None:
372         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
373
374     p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True)
375
376     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
377     if ev0 is None:
378         raise Exception("Unable to remove the advertisement instance")
379     remove_group(dev[0], dev[1])
380
381 def test_p2ps_connect_keypad_method_nonautoaccept(dev):
382     """P2PS Connection with non-auto-accept and seeker having keypad method"""
383     addr0 = dev[0].p2p_dev_addr()
384     addr1 = dev[1].p2p_dev_addr()
385     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
386                    srv_info='I can receive files upto size 2 GB')
387     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
388                                  svc_name='org.wi-fi.wfds.send*',
389                                  srv_info='2 GB')
390     adv_id = ev_list[0].split(" ")[0]
391     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
392         raise Exception("Failed to request provisioning on seeker")
393     p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
394                                  initiator_or_responder='initiator')
395     dev[1].p2p_listen()
396
397     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"):
398         raise Exception("Failed to send deferred acceptance from advertizer")
399
400     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
401                                         autoaccept=False,
402                                         initiator_or_responder='responder')
403     p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1],
404                      initiator_method="display")
405     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
406     if ev0 is None:
407         raise Exception("Unable to remove the advertisement instance")
408     remove_group(dev[0], dev[1])
409
410 def test_p2ps_connect_display_method_nonautoaccept(dev):
411     """P2PS connection with non-auto-accept and seeker having display method"""
412     addr0 = dev[0].p2p_dev_addr()
413     addr1 = dev[1].p2p_dev_addr()
414     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
415                    srv_info='I can receive files upto size 2 GB')
416     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
417                                  svc_name='org.wi-fi.wfds*', srv_info='2 GB')
418     adv_id = ev_list[0].split(" ")[0]
419     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
420         raise Exception("Failed to request provisioning on seeker")
421     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
422                                         autoaccept=False,
423                                         initiator_or_responder='initiator')
424     dev[1].p2p_listen()
425
426     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"):
427         raise Exception("Failed to send deferred acceptance from advertiser")
428     p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
429                                  initiator_or_responder='responder')
430     p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1], initiator_method="keypad")
431
432     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
433     if ev0 is None:
434         raise Exception("Unable to remove the advertisement instance")
435     remove_group(dev[0], dev[1])
436
437 def test_p2ps_connect_keypad_method_autoaccept(dev):
438     """P2PS connection with auto-accept and keypad method on seeker side"""
439     addr0 = dev[0].p2p_dev_addr()
440     addr1 = dev[1].p2p_dev_addr()
441     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
442                    srv_info='I can receive files upto size 2 GB')
443     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
444                                               svc_name='org.wi-fi.wfds.send.rx',
445                                               srv_info='2 GB')
446     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
447         raise Exception("Failed to request provisioning on seeker")
448
449     p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True,
450                                  initiator_or_responder='initiator')
451     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
452                                         autoaccept=True,
453                                         initiator_or_responder='responder')
454     p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="Keypad")
455     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
456     if ev0 is None:
457         raise Exception("Unable to remove the advertisement instance")
458     remove_group(dev[0], dev[1])
459
460 def test_p2ps_connect_display_method_autoaccept(dev):
461     """P2PS connection with auto-accept and display method on seeker side"""
462     addr0 = dev[0].p2p_dev_addr()
463     addr1 = dev[1].p2p_dev_addr()
464     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
465                    srv_info='I can receive files upto size 2 GB')
466     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
467                                               svc_name='org.wi-fi.wfds.send.rx',
468                                               srv_info='2 GB')
469     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
470         raise Exception("Failed to request provisioning on seeker")
471
472     pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
473                                         autoaccept=True,
474                                         initiator_or_responder='initiator')
475     dev[1].p2p_listen()
476
477     p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="display")
478     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
479     if ev0 is None:
480         raise Exception("Unable to remove the advertisement instance")
481     remove_group(dev[0], dev[1])
482
483 def test_p2ps_connect_adv_go_p2ps_method(dev):
484     """P2PS auto-accept connection with advertisement as GO and P2PS method"""
485     addr0 = dev[0].p2p_dev_addr()
486     addr1 = dev[1].p2p_dev_addr()
487     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
488                    srv_info='I can receive files upto size 2 GB')
489     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
490                                               svc_name='org.wi-fi.wfds.send.rx',
491                                               srv_info='2 GB')
492     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"):
493         raise Exception("Failed to request provisioning on seeker")
494
495     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
496     if ev0 is None:
497         raise Exception("Timed out while waiting for prov done on advertizer")
498     if "go=" not in ev0:
499         raise Exception("Advertiser failed to become GO")
500
501     adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
502     if adv_conncap == "4":
503         logger.info("Advertiser is GO")
504     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
505     if ev0 is None:
506         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
507     dev[0].group_form_result(ev0)
508
509     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
510     if ev1 is None:
511         raise Exception("P2PS-PROV-DONE timeout on seeker side")
512
513     seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
514
515     if "join=" in ev1:
516         if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " 12345670 p2ps persistent join"):
517             raise Exception("P2P_CONNECT failed on seeker side")
518         ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
519         if ev1 is None:
520             raise Exception("P2P-GROUP-STARTED timeout on seeker side")
521     dev[1].group_form_result(ev1)
522
523     ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
524     if ev0 is None:
525         raise Exception("AP-STA-CONNECTED timeout on advertiser side")
526     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
527     if ev0 is None:
528         raise Exception("Unable to remove the advertisement instance")
529     remove_group(dev[0], dev[1])
530
531 def test_p2ps_connect_adv_client_p2ps_method(dev):
532     """P2PS auto-accept connection with advertisement as Client and P2PS method"""
533     addr0 = dev[0].p2p_dev_addr()
534     addr1 = dev[1].p2p_dev_addr()
535     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
536                    srv_info='I can receive files upto size 2 GB')
537     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
538                                               svc_name='org.wi-fi.wfds.send.rx',
539                                               srv_info='2 GB')
540     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"):
541         raise Exception("Failed to request provisioning on seeker")
542
543     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
544     if ev0 is None:
545         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
546     if "join=" not in ev0:
547         raise Exception("Advertiser failed to become Client")
548
549     adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
550     if adv_conncap == "2":
551         logger.info("Advertiser is Client")
552
553     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
554     if ev1 is None:
555         raise Exception("Provisioning failed on seeker side")
556
557     seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
558     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
559     if ev1 is None:
560         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
561     dev[1].group_form_result(ev1)
562
563     if "join=" in ev0:
564         if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
565             raise Exception("P2P_CONNECT failed on seeker side")
566
567     ev0 = dev[0].wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"], timeout=15)
568     if ev0 is None:
569         raise Exception("P2P Group Formation failed on advertiser side")
570
571     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
572     if ev0 is None:
573         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
574     dev[0].group_form_result(ev0)
575
576     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
577     if ev1 is None:
578         raise Exception("Group formation failed")
579     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
580     if ev0 is None:
581         raise Exception("Unable to remove the advertisement instance")
582     remove_group(dev[0], dev[1])
583
584 def test_p2ps_connect_adv_go_pin_method(dev):
585     """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
586     addr0 = dev[0].p2p_dev_addr()
587     addr1 = dev[1].p2p_dev_addr()
588     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
589                    srv_info='I can receive files upto size 2 GB')
590     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
591                                               svc_name='org.wi-fi.wfds.send.rx',
592                                               srv_info='2 GB')
593     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
594         raise Exception("Failed to request provisioning on seeker")
595
596     seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
597                                                 autoaccept=True,
598                                                 initiator_or_responder='initiator')
599
600     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
601     if ev0 is None:
602         raise Exception("P2PS-PROV-DONE timeout on advertier side")
603     adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
604     if adv_conncap == "4":
605         logger.info("Advertiser is GO")
606     ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
607     if ev0 is None:
608         raise Exception("PIN Display on advertiser side")
609     pin = ev0.split(" ")[2]
610
611     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
612     if ev0 is None:
613         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
614     dev[0].group_form_result(ev0)
615
616     ev0 = dev[0].group_request("WPS_PIN any " + pin)
617     if ev0 is None:
618         raise Exception("Failed to initiate Pin authorization on registrar side")
619     if "join=" in seek_prov_ev:
620         if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " keypad persistent join"):
621             raise Exception("P2P_CONNECT failed on seeker side")
622         ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
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=10)
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_pin_method(dev):
636     """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
637     addr0 = dev[0].p2p_dev_addr()
638     addr1 = dev[1].p2p_dev_addr()
639     dev[0].flush_scan_cache()
640     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
641                    srv_info='I can receive files upto size 2 GB')
642     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
643                                               svc_name='org.wi-fi.wfds.send.rx',
644                                               srv_info='2 GB')
645     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
646         raise Exception("Failed to request provisioning on seeker")
647
648     seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
649                                                 autoaccept=True,
650                                                 initiator_or_responder='initiator')
651
652     adv_prov = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
653     if adv_prov is None:
654         raise Exception("Prov failed on advertiser")
655     adv_conncap = adv_prov.split("conncap=")[1].split(" ")[0]
656     if adv_conncap == "2":
657         logger.info("Advertiser is Client")
658     adv_pin_show_event = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
659                                                   timeout=5)
660     if adv_pin_show_event is None:
661         raise Exception("PIN Display on advertiser side")
662     pin = adv_pin_show_event.split(" ")[2]
663
664     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
665     if ev1 is None:
666         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
667     dev[1].group_form_result(ev1)
668
669     ev1 = dev[1].group_request("WPS_PIN any " + pin)
670     if ev1 is None:
671         raise Exception("Failed to initiate Pin authorization on registrar side")
672
673     if "join=" in adv_prov:
674         if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " " + pin + " display persistent join"):
675             raise Exception("P2P_CONNECT failed on advertiser side")
676     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
677     if ev0 is None:
678         raise Exception("Group formation failed to start on seeker side")
679     dev[0].group_form_result(ev0)
680
681     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
682     if ev1 is None:
683         raise Exception("AP-STA-CONNECTED timeout on advertiser side")
684     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
685     if ev0 is None:
686         raise Exception("Unable to remove the advertisement instance")
687     remove_group(dev[0], dev[1])
688
689 def test_p2ps_service_discovery_multiple_queries(dev):
690     """P2P service discovery with multiple queries"""
691     addr0 = dev[0].p2p_dev_addr()
692     addr1 = dev[1].p2p_dev_addr()
693     adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
694                              svc_name='org.wi-fi.wfds.send.tx',
695                              srv_info='I can transfer files upto size of 2 GB')
696     adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
697                              svc_name='org.wi-fi.wfds.send.rx',
698                              srv_info='I can receive files upto size of 2 GB')
699     adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
700                              svc_name='org.wi-fi.wfds.display.tx',
701                              srv_info='Miracast Mode')
702     adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
703                              svc_name='org.wi-fi.wfds.display.rx',
704                              srv_info='Miracast Mode')
705
706     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
707     dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
708     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
709     dev[1].p2p_stop_find()
710     dev[1].global_request("P2P_FIND 10 type=social seek=")
711     ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
712     if ev is None:
713         raise Exception("P2P Device Found timed out")
714     if addr0 not in ev:
715         raise Exception("Unexpected service discovery request source")
716     ev_list = []
717     for i in range(0, 3):
718         ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
719         if ev is None:
720             raise Exception("P2P Service discovery timed out")
721         if addr0 in ev:
722             ev_list.append(ev)
723             if len(ev_list) == 3:
724                 break
725     dev[1].p2p_stop_find()
726
727     for test in [ ("seek=org.wi-fi.wfds.display.TX",
728                    "asp_svc=org.wi-fi.wfds.display.tx"),
729                   ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
730                    "asp_svc=org.wi-fi.wfds.display.tx"),
731                   ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
732                    "asp_svc=org.wi-fi.wfds.display.tx"),
733                   ("seek=not-found", None),
734                   ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
735         dev[2].global_request("P2P_FIND 10 type=social " + test[0])
736         if test[1] is None:
737             ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
738             if ev is not None:
739                 raise Exception("Unexpected device found: " + ev)
740             continue
741         ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
742         if ev is None:
743             raise Exception("P2P device discovery timed out (dev2)")
744             if test[1] not in ev:
745                 raise Exception("Expected asp_svc not reported: " + ev)
746         dev[2].p2p_stop_find()
747         dev[2].request("P2P_FLUSH")
748
749     dev[0].p2p_stop_find()
750
751     ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
752     if ev1 is None:
753         raise Exception("Unable to remove the advertisement instance")
754     ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
755     if ev2 is None:
756         raise Exception("Unable to remove the advertisement instance")
757     ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
758     if ev3 is None:
759         raise Exception("Unable to remove the advertisement instance")
760     ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
761     if ev4 is None:
762         raise Exception("Unable to remove the advertisement instance")
763
764     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
765         raise Exception("P2P_SERVICE_ADD failed")
766     if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
767         raise Exception("P2P_SERVICE_DEL asp all failed")
768     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
769         raise Exception("P2P_SERVICE_ADD failed")
770     if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
771         raise Exception("P2P_SERVICE_REP failed")
772     if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
773         raise Exception("Invalid P2P_SERVICE_REP accepted")
774     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
775         raise Exception("P2P_SERVICE_ADD failed")
776     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
777         raise Exception("P2P_SERVICE_ADD failed")
778
779 def get_ifnames():
780     with open('/proc/net/dev', 'r') as f:
781         data = f.read()
782     ifnames = []
783     for line in data.splitlines():
784         ifname = line.strip().split(' ')[0]
785         if ':' not in ifname:
786             continue
787         ifname = ifname.split(':')[0]
788         ifnames.append(ifname)
789     return ifnames
790
791 def p2ps_connect_p2ps_method(dev):
792     addr0 = dev[0].p2p_dev_addr()
793     addr1 = dev[1].p2p_dev_addr()
794     dev[0].flush_scan_cache()
795     dev[1].flush_scan_cache()
796     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
797                    srv_info='I can receive files upto size 2 GB')
798     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
799                                               svc_name='org.wi-fi.wfds.send.rx',
800                                               srv_info='2 GB')
801     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"):
802         raise Exception("Failed to request provisioning on seeker")
803
804     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
805     if ev0 is None:
806         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
807     if "join=" not in ev0:
808         raise Exception("join parameter missing from P2PS-PROV-DONE")
809
810     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
811     if ev1 is None:
812         raise Exception("Provisioning failed on seeker side")
813
814     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
815     if ev1 is None:
816         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
817     res1 = dev[1].group_form_result(ev1)
818     ifnames1 = get_ifnames()
819
820     if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
821         raise Exception("P2P_CONNECT failed on seeker side")
822
823     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
824     if ev0 is None:
825         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
826     res0 = dev[0].group_form_result(ev0)
827
828     ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
829     if ev1 is None:
830         raise Exception("Group formation failed")
831     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
832     if ev0 is None:
833         raise Exception("Unable to remove the advertisement instance")
834     ifnames2 = get_ifnames()
835     remove_group(dev[0], dev[1])
836     ifnames3 = get_ifnames()
837     return (res0, res1, ifnames1 + ifnames2 + ifnames3)
838
839 def has_string_prefix(vals, prefix):
840     for val in vals:
841         if val.startswith(prefix):
842             return True
843     return False
844
845 def test_p2ps_connect_p2ps_method_1(dev):
846     """P2PS connection with P2PS method - no group interface"""
847     set_no_group_iface(dev[0], 1)
848     set_no_group_iface(dev[1], 1)
849
850     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
851     if res0['ifname'] != dev[0].ifname:
852         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
853     if res1['ifname'] != dev[1].ifname:
854         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
855     if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
856         raise Exception("dev0 group interface unexpectedly present")
857     if has_string_prefix(ifnames, 'p2p-' + res1['ifname']):
858         raise Exception("dev1 group interface unexpectedly present")
859
860 def test_p2ps_connect_p2ps_method_2(dev):
861     """P2PS connection with P2PS method - group interface on dev0"""
862     set_no_group_iface(dev[0], 0)
863     set_no_group_iface(dev[1], 1)
864
865     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
866     if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
867         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
868     if res1['ifname'] != dev[1].ifname:
869         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
870     if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
871         raise Exception("dev0 group interface unexpectedly present")
872
873 def test_p2ps_connect_p2ps_method_3(dev):
874     """P2PS connection with P2PS method - group interface on dev1"""
875     set_no_group_iface(dev[0], 1)
876     set_no_group_iface(dev[1], 0)
877
878     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
879     if res0['ifname'] != dev[0].ifname:
880         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
881     if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
882         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
883     if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
884         raise Exception("dev0 group interface unexpectedly present")
885
886 def test_p2ps_connect_p2ps_method_4(dev):
887     """P2PS connection with P2PS method - group interface on both"""
888     set_no_group_iface(dev[0], 0)
889     set_no_group_iface(dev[1], 0)
890
891     (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
892     if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
893         raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
894     if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
895         raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
896
897 def test_p2ps_connect_adv_go_persistent(dev):
898     """P2PS auto-accept connection with advertisement as GO and having persistent group"""
899     addr0 = dev[0].p2p_dev_addr()
900     addr1 = dev[1].p2p_dev_addr()
901
902     go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
903                                      r_dev=dev[1], r_intent=0)
904     dev[0].remove_group()
905     dev[1].wait_go_ending_session()
906
907     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
908                    srv_info='I can receive files upto size 2 GB')
909     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
910                                               svc_name='org.wi-fi.wfds.send.rx',
911                                               srv_info='2 GB')
912     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"):
913         raise Exception("Failed to request provisioning on seeker")
914
915     ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
916     if ev0 is None:
917         raise Exception("Timed out while waiting for prov done on advertizer")
918     if "persist=" not in ev0:
919         raise Exception("Advertiser did not indicate persistent group")
920     id0 = ev0.split("persist=")[1].split(" ")[0]
921     if "OK" not in dev[0].global_request("P2P_GROUP_ADD persistent=" + id0 + " freq=2412"):
922         raise Exception("Could not re-start persistent group")
923
924     ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
925     if ev0 is None:
926         raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
927     dev[0].group_form_result(ev0)
928
929     ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
930     if ev1 is None:
931         raise Exception("P2PS-PROV-DONE timeout on seeker side")
932
933     if "persist=" not in ev1:
934         raise Exception("Seeker did not indicate persistent group")
935     id1 = ev1.split("persist=")[1].split(" ")[0]
936     if "OK" not in dev[1].global_request("P2P_GROUP_ADD persistent=" + id1 + " freq=2412"):
937         raise Exception("Could not re-start persistent group")
938
939     ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
940     if ev1 is None:
941         raise Exception("P2P-GROUP-STARTED timeout on seeker side")
942     dev[1].group_form_result(ev1)
943
944     ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=15)
945     if ev0 is None:
946         raise Exception("AP-STA-CONNECTED timeout on advertiser side")
947     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
948     if ev0 is None:
949         raise Exception("Unable to remove the advertisement instance")
950     remove_group(dev[0], dev[1])