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