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