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