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 from remotehost import remote_compatible
8 import logging
9 logger = logging.getLogger()
10 import time
11 import random
12 import re
13 
14 import hwsim_utils
15 from wpasupplicant import WpaSupplicant
16 import hostapd
17 from p2p_utils import *
18 from utils import HwsimSkip
19 from hwsim import HWSimRadio
20 
21 # Dev[0] -> Advertiser
22 # Dev[1] -> Seeker
23 # ev0 -> Event generated at advertiser side
24 # ev1 -> Event generated at Seeker side
25 
26 def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None, cpt=None):
27     """P2PS Advertise function"""
28     adv_id = random.randrange(1, 0xFFFFFFFF)
29     advid = hex(adv_id)[2:]
30 
31     cpt_param = (" cpt=" + cpt) if cpt is not None else ""
32 
33     if rsp_info is not 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 + cpt_param + " svc_info='" + srv_info + "'" + " rsp_info=" + rsp_info + "'"):
35             raise Exception("P2P_SERVICE_ADD with response info and service info failed")
36 
37     if rsp_info is None and srv_info is not None:
38         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 + "'"):
39             raise Exception("P2P_SERVICE_ADD with service info failed")
40 
41     if rsp_info is None and srv_info is None:
42         if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + cpt_param):
43             raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
44 
45     if rsp_info is not None and srv_info is None:
46         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 + "'"):
47             raise Exception("P2P_SERVICE_ADD with response info failed")
48 
49     r_dev.p2p_listen()
50     return advid
51 
52 def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None,
53                     single_peer_expected=True):
54     """P2PS exact service seek request"""
55     if srv_info is not None:
56         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
57         if ev1 is None:
58             raise Exception("Failed to add Service Discovery request for exact seek request")
59 
60     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
61         raise Exception("Failed to initiate seek operation")
62 
63     timeout = time.time() + 10
64     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
65     while ev1 is not None and not single_peer_expected:
66         if r_dev.p2p_dev_addr() in ev1 and "adv_id=" in ev1:
67             break
68         ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
69 
70         if timeout < time.time():
71             raise Exception("Device not found")
72 
73     if ev1 is None:
74         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
75     if r_dev.p2p_dev_addr() not in ev1:
76         raise Exception("Unexpected peer")
77 
78     if srv_info is None:
79         adv_id = ev1.split("adv_id=")[1].split(" ")[0]
80         rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
81         if rcvd_svc_name != svc_name:
82             raise Exception("service name not matching")
83     else:
84         ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
85         if ev1 is None:
86             raise Exception("Failed to receive Service Discovery Response")
87         if r_dev.p2p_dev_addr() not in ev1:
88             raise Exception("Service Discovery response from Unknown Peer")
89         if srv_info is not None and srv_info not in ev1:
90             raise Exception("service info not available in Service Discovery response")
91         adv_id = ev1.split(" ")[3]
92         rcvd_svc_name = ev1.split(" ")[6]
93         if rcvd_svc_name != svc_name:
94             raise Exception("service name not matching")
95 
96     i_dev.p2p_stop_find()
97     return [adv_id, rcvd_svc_name]
98 
99 def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
100     """P2PS nonexact service seek request"""
101     if adv_num is None:
102        adv_num = 1
103     if srv_info is not None:
104         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
105     else:
106         ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
107     if ev1 is None:
108         raise Exception("Failed to add Service Discovery request for nonexact seek request")
109     if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
110         raise Exception("Failed to initiate seek")
111     ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
112     if ev1 is None:
113         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
114     if r_dev.p2p_dev_addr() not in ev1:
115         raise Exception("Unexpected peer")
116     ev_list = []
117     for i in range(0, adv_num):
118         ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
119         if ev1 is None:
120             raise Exception("Failed to receive Service Discovery Response")
121         if r_dev.p2p_dev_addr() not in ev1:
122             raise Exception("Service Discovery response from Unknown Peer")
123         if srv_info is not None and srv_info not in ev1:
124             raise Exception("service info not available in Service Discovery response")
125         adv_id = ev1.split(" ")[3]
126         rcvd_svc_name = ev1.split(" ")[6]
127         ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
128 
129     i_dev.p2p_stop_find()
130     return ev_list
131 
132 def p2ps_parse_event(ev, *args):
133     ret = ()
134     for arg in args:
135         m = re.search(r"\s+" + arg + r"=(\S+)", ev)
136         ret += (m.group(1) if m is not None else None,)
137     return ret
138 
139 def p2ps_provision(seeker, advertiser, adv_id, auto_accept=True, method="1000",
140                    adv_cpt=None, seeker_cpt=None, handler=None, adv_role=None,
141                    seeker_role=None):
142     addr0 = seeker.p2p_dev_addr()
143     addr1 = advertiser.p2p_dev_addr()
144 
145     seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
146                          session_mac=addr0, method=method, cpt=seeker_cpt,
147                          role=seeker_role)
148 
149     if not auto_accept or method == "100":
150         pin = None
151         ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
152                                                    timeout=10)
153         if ev_pd_start is None:
154             raise Exception("P2PS-PROV-START timeout on Advertiser side")
155         peer = ev_pd_start.split()[1]
156         advert_id, advert_mac, session, session_mac =\
157             p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
158 
159         ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
160         if ev is None:
161             raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
162 
163         if handler:
164             handler(seeker, advertiser)
165 
166         # Put seeker into a listen state, since we expect the deferred flow to
167         # continue.
168         seeker.p2p_ext_listen(500, 500)
169 
170         if method == "100":
171             ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
172                                               timeout=10)
173             if ev is None:
174                 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
175             if addr0 not in ev:
176                 raise Exception("Unknown peer " + addr0)
177             ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
178                                           timeout=10)
179             if ev is None:
180                 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
181             if addr1 not in ev:
182                 raise Exception("Unknown peer " + addr1)
183             pin = ev.split()[2]
184         elif method == "8":
185             ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
186                                               timeout=10)
187             if ev is None:
188                 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
189             if addr0 not in ev:
190                 raise Exception("Unknown peer " + addr0)
191             pin = ev.split()[2]
192 
193         # Stop P2P_LISTEN before issuing P2P_ASP_PROVISION_RESP to avoid
194         # excessive delay and test case timeouts if it takes large number of
195         # retries to find the peer awake on its Listen channel.
196         advertiser.p2p_stop_find()
197 
198         advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
199                                  session_id=int(session, 0),
200                                  session_mac=session_mac, status=12,
201                                  cpt=adv_cpt, role=adv_role)
202 
203         ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
204         if ev1 is None:
205             raise Exception("P2PS-PROV-DONE timeout on seeker side")
206 
207         ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
208         if ev2 is None:
209             raise Exception("P2PS-PROV-DONE timeout on advertiser side")
210 
211         if method == "8":
212             ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
213                                           timeout=10)
214             if ev is None:
215                 raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
216             if addr1 not in ev:
217                 raise Exception("Unknown peer " + addr1)
218 
219         seeker.p2p_cancel_ext_listen()
220         if pin is not None:
221             return ev1, ev2, pin
222         return ev1, ev2
223 
224     # Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
225     ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
226     if ev1 is None:
227         raise Exception("P2PS-PROV-DONE timeout on seeker side")
228 
229     ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
230     if ev2 is None:
231         raise Exception("P2PS-PROV-DONE timeout on advertiser side")
232 
233     if method == "8":
234         ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
235         if ev is None:
236             raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
237         if addr1 not in ev:
238             raise Exception("Unknown peer " + addr1)
239         ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
240                                           timeout=10)
241         if ev is None:
242             raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
243         if addr0 not in ev:
244             raise Exception("Unknown peer " + addr0)
245         pin = ev.split()[2]
246         return ev1, ev2, pin
247 
248     return ev1, ev2
249 
250 def p2ps_connect_pd(dev0, dev1, ev0, ev1, pin=None, join_extra="", go_ev=None):
251     conf_methods_map = {"8": "p2ps", "1": "display", "5": "keypad"}
252     peer0 = ev0.split()[1]
253     peer1 = ev1.split()[1]
254     status0, conncap0, adv_id0, adv_mac0, mac0, session0, dev_passwd_id0, go0, join0, feature_cap0, persist0, group_ssid0 =\
255         p2ps_parse_event(ev0, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist", "group_ssid")
256     status1, conncap1, adv_id1, adv_mac1, mac1, session1, dev_passwd_id1, go1, join1, feature_cap1, persist1, group_ssid1 =\
257         p2ps_parse_event(ev1, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist", "group_ssid")
258 
259     if status0 != "0" and status0 != "12":
260         raise Exception("PD failed on " + dev0.p2p_dev_addr())
261 
262     if status1 != "0" and status1 != "12":
263         raise Exception("PD failed on " + dev1.p2p_dev_addr())
264 
265     if status0 == "12" and status1 == "12":
266         raise Exception("Both sides have status 12 which doesn't make sense")
267 
268     if adv_id0 != adv_id1 or adv_id0 is None:
269         raise Exception("Adv. IDs don't match")
270 
271     if adv_mac0 != adv_mac1 or adv_mac0 is None:
272         raise Exception("Adv. MACs don't match")
273 
274     if session0 != session1 or session0 is None:
275         raise Exception("Session IDs don't match")
276 
277     if mac0 != mac1 or mac0 is None:
278         raise Exception("Session MACs don't match")
279 
280     #TODO: Validate feature capability
281 
282     if bool(persist0) != bool(persist1):
283         raise Exception("Only one peer has persistent group")
284 
285     if persist0 is None and not all([conncap0, conncap1, dev_passwd_id0,
286                                      dev_passwd_id1]):
287         raise Exception("Persistent group not used but conncap/dev_passwd_id are missing")
288 
289     if persist0 is not None and any([conncap0, conncap1, dev_passwd_id0,
290                                      dev_passwd_id1]):
291         raise Exception("Persistent group is used but conncap/dev_passwd_id are present")
292 
293     # Persistent Connection (todo: handle frequency)
294     if persist0 is not None:
295         dev0.p2p_stop_find()
296         if "OK" not in dev0.global_request("P2P_GROUP_ADD persistent=" + persist0 + " freq=2412"):
297             raise Exception("Could not re-start persistent group")
298         ev0 = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
299         if ev0 is None:
300             raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
301         dev0.group_form_result(ev0)
302 
303         if "OK" not in dev1.global_request("P2P_GROUP_ADD persistent=" + persist1 + " freq=2412"):
304             raise Exception("Could not re-start persistent group")
305         ev1 = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
306         if ev1 is None:
307             raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
308         dev1.group_form_result(ev1)
309         if "GO" in ev0:
310             ev = dev0.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
311             if ev is None:
312                 raise Exception("AP-STA-CONNECTED timeout on " + dev0.p2p_dev_addr())
313         else:
314             ev = dev1.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
315             if ev is None:
316                 raise Exception("AP-STA-CONNECTED timeout on " + dev1.p2p_dev_addr())
317     else:
318         try:
319             method0 = conf_methods_map[dev_passwd_id0]
320             method1 = conf_methods_map[dev_passwd_id1]
321         except KeyError:
322             raise Exception("Unsupported method")
323 
324         if method0 == "p2ps":
325             pin = "12345670"
326         if pin is None:
327             raise Exception("Pin is not provided")
328 
329         if conncap0 == "1" and conncap1 == "1": # NEW/NEW - GON
330             if any([join0, join1, go0, go1]):
331                 raise Exception("Unexpected join/go PD attributes")
332             dev0.p2p_listen()
333             if "OK" not in dev0.global_request("P2P_CONNECT " + peer0 + " " + pin + " " + method0 + " persistent auth"):
334                 raise Exception("P2P_CONNECT fails on " + dev0.p2p_dev_addr())
335             if "OK" not in dev1.global_request("P2P_CONNECT " + peer1 + " " + pin + " " + method1 + " persistent"):
336                 raise Exception("P2P_CONNECT fails on " + dev1.p2p_dev_addr())
337             ev = dev0.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
338             if ev is None:
339                 raise Exception("GO Neg did not succeed on " + dev0.p2p_dev_addr())
340             ev = dev1.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
341             if ev is None:
342                 raise Exception("GO Neg did not succeed on " + dev1.p2p_dev_addr())
343             ev = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
344             if ev is None:
345                 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
346             dev0.group_form_result(ev)
347             ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
348             if ev is None:
349                 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
350             dev1.group_form_result(ev)
351         else:
352             if conncap0 == "2" and conncap1 == "4":  # dev0 CLI, dev1 GO
353                 dev_cli, dev_go, go_if, join_address, go_method, cli_method, join_ssid = dev0, dev1, go1, join0, method1, method0, group_ssid0
354             elif conncap0 == "4" and conncap1 == "2":  # dev0 GO, dev1 CLI
355                 dev_cli, dev_go, go_if, join_address, go_method, cli_method, join_ssid = dev1, dev0, go0, join1, method0, method1, group_ssid1
356             else:
357                 raise Exception("Bad connection capabilities")
358 
359             if go_if is None:
360                 raise Exception("Device " + dev_go.p2p_dev_addr() + " failed to become GO")
361             if join_address is None:
362                 raise Exception("Device " + dev_cli.p2p_dev_addr() + " failed to become CLI")
363 
364             if not dev_go.get_group_ifname().startswith('p2p-'):
365                 if go_ev:
366                     ev = go_ev
367                 else:
368                     ev = dev_go.wait_global_event(["P2P-GROUP-STARTED"],
369                                                   timeout=10)
370                 if ev is None:
371                     raise Exception("P2P-GROUP-STARTED timeout on " + dev_go.p2p_dev_addr())
372                 dev_go.group_form_result(ev)
373 
374             if go_method != "p2ps":
375                 ev = dev_go.group_request("WPS_PIN any " + pin)
376                 if ev is None:
377                     raise Exception("Failed to initiate pin authorization on registrar side")
378             if join_ssid:
379                 group_ssid_txt = " ssid=" + join_ssid
380             else:
381                 group_ssid_txt = ""
382             if "OK" not in dev_cli.global_request("P2P_CONNECT " + join_address + " " + pin + " " + cli_method + join_extra + " persistent join" + group_ssid_txt):
383                 raise Exception("P2P_CONNECT failed on " + dev_cli.p2p_dev_addr())
384             ev = dev_cli.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
385             if ev is None:
386                 raise Exception("P2P-GROUP-STARTED timeout on " + dev_cli.p2p_dev_addr())
387             dev_cli.group_form_result(ev)
388             ev = dev_go.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
389             if ev is None:
390                 raise Exception("AP-STA-CONNECTED timeout on " + dev_go.p2p_dev_addr())
391 
392     hwsim_utils.test_connectivity_p2p(dev0, dev1)
393 
394 def set_no_group_iface(dev, enable):
395     if enable:
396         res = dev.get_driver_status()
397         if (int(res['capa.flags'], 0) & 0x20000000):
398             raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
399         dev.global_request("SET p2p_no_group_iface 1")
400     else:
401         dev.global_request("SET p2p_no_group_iface 0")
402 
403 @remote_compatible
404 def test_p2ps_exact_search(dev):
405     """P2PS exact service request"""
406     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
407                    srv_info='I can receive files upto size 2 GB')
408     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
409                                               svc_name='org.wi-fi.wfds.send.rx')
410 
411     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
412     if ev0 is None:
413         raise Exception("Unable to remove the advertisement instance")
414 
415 @remote_compatible
416 def test_p2ps_exact_search_srvinfo(dev):
417     """P2PS exact service request with service info"""
418     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
419                    srv_info='I can receive files upto size 2 GB')
420     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
421                                               svc_name='org.wi-fi.wfds.send.rx',
422                                               srv_info='2 GB')
423 
424     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
425     if ev0 is None:
426         raise Exception("Unable to remove the advertisement instance")
427 
428 @remote_compatible
429 def test_p2ps_nonexact_search(dev):
430     """P2PS nonexact seek request"""
431     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
432                    srv_info='I support Miracast Mode ')
433     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
434                                  svc_name='org.wi-fi.wfds.play*')
435     adv_id = ev_list[0].split()[0]
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 
441 @remote_compatible
442 def test_p2ps_nonexact_search_srvinfo(dev):
443     """P2PS nonexact seek request with service info"""
444     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
445                    srv_info='I can receive files upto size 2 GB')
446     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
447                                  svc_name='org.wi-fi.wfds.send*',
448                                  srv_info='2 GB')
449     adv_id = ev_list[0].split()[0]
450     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
451     if ev0 is None:
452         raise Exception("Unable to remove the advertisement instance")
453 
454 @remote_compatible
455 def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
456     """P2PS connect for non-auto-accept and P2PS config method"""
457     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
458                    srv_info='I can receive files upto size 2 GB')
459     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
460                                  svc_name='org.wi-fi.wfds.send*',
461                                  srv_info='2 GB')
462     adv_id = ev_list[0].split()[0]
463     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False)
464     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
465 
466     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
467     if ev0 is None:
468         raise Exception("Unable to remove the advertisement instance")
469     remove_group(dev[0], dev[1])
470 
471 @remote_compatible
472 def test_p2ps_connect_p2ps_method_autoaccept(dev):
473     """P2PS connection with P2PS default config method and auto-accept"""
474     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
475                    srv_info='I can receive files upto size 2 GB')
476     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
477                                               svc_name='org.wi-fi.wfds.send.rx',
478                                               srv_info='2 GB')
479 
480     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
481     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
482 
483     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
484     if ev0 is None:
485         raise Exception("Unable to remove the advertisement instance")
486     remove_group(dev[0], dev[1])
487 
488 @remote_compatible
489 def test_p2ps_connect_keypad_method_nonautoaccept(dev):
490     """P2PS Connection with non-auto-accept and seeker having keypad method"""
491     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
492                    srv_info='I can receive files upto size 2 GB')
493     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
494                                  svc_name='org.wi-fi.wfds.send*',
495                                  srv_info='2 GB')
496     adv_id = ev_list[0].split()[0]
497 
498     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="8")
499     p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
500 
501     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
502     if ev0 is None:
503         raise Exception("Unable to remove the advertisement instance")
504     remove_group(dev[0], dev[1])
505 
506 @remote_compatible
507 def test_p2ps_connect_display_method_nonautoaccept(dev):
508     """P2PS connection with non-auto-accept and seeker having display method"""
509     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
510                    srv_info='I can receive files upto size 2 GB')
511     ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
512                                  svc_name='org.wi-fi.wfds*', srv_info='2 GB')
513     adv_id = ev_list[0].split()[0]
514 
515     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, 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 @remote_compatible
524 def test_p2ps_connect_keypad_method_autoaccept(dev):
525     """P2PS connection with auto-accept and keypad method on seeker side"""
526     p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
527                    srv_info='I can receive files upto size 2 GB')
528     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
529                                               svc_name='org.wi-fi.wfds.send.rx',
530                                               srv_info='2 GB')
531 
532     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
533     p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
534 
535     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
536     if ev0 is None:
537         raise Exception("Unable to remove the advertisement instance")
538     remove_group(dev[0], dev[1])
539 
540 @remote_compatible
541 def test_p2ps_connect_display_method_autoaccept(dev):
542     """P2PS connection with auto-accept and display method on seeker side"""
543     p2ps_advertise(r_dev=dev[0], r_role='1', 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, pin = p2ps_provision(dev[1], dev[0], adv_id, method="100")
550     p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
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 @remote_compatible
558 def test_p2ps_connect_adv_go_p2ps_method(dev):
559     """P2PS auto-accept connection with advertisement as GO and P2PS method"""
560     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
561                    srv_info='I can receive files upto size 2 GB')
562     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
563                                               svc_name='org.wi-fi.wfds.send.rx',
564                                               srv_info='2 GB')
565 
566     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
567     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
568 
569     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
570     if ev0 is None:
571         raise Exception("Unable to remove the advertisement instance")
572     remove_group(dev[0], dev[1])
573 
574 @remote_compatible
575 def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev):
576     """P2PS auto-accept connection with advertisement as GO and P2PS method using separate group interface"""
577     set_no_group_iface(dev[0], 0)
578     set_no_group_iface(dev[1], 0)
579     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
580                    srv_info='I can receive files upto size 2 GB')
581     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
582                                               svc_name='org.wi-fi.wfds.send.rx',
583                                               srv_info='2 GB')
584 
585     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
586     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
587 
588     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
589     if ev0 is None:
590         raise Exception("Unable to remove the advertisement instance")
591     remove_group(dev[0], dev[1])
592 
593 @remote_compatible
594 def test_p2ps_connect_adv_client_p2ps_method(dev):
595     """P2PS auto-accept connection with advertisement as Client and P2PS method"""
596     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
597                    srv_info='I can receive files upto size 2 GB')
598     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
599                                               svc_name='org.wi-fi.wfds.send.rx',
600                                               srv_info='2 GB')
601 
602     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
603     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
604 
605     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
606     if ev0 is None:
607         raise Exception("Unable to remove the advertisement instance")
608     remove_group(dev[0], dev[1])
609 
610 def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
611     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
612                    srv_info='I can receive files upto size 2 GB')
613     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
614                                               svc_name='org.wi-fi.wfds.send.rx',
615                                               srv_info='2 GB')
616     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
617     p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
618 
619     if not keep_group:
620         ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
621         if ev0 is None:
622             raise Exception("Unable to remove the advertisement instance")
623         remove_group(dev[0], dev[1])
624 
625 @remote_compatible
626 def test_p2ps_connect_adv_go_pin_method(dev):
627     """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
628     p2ps_connect_adv_go_pin_method(dev)
629 
630 @remote_compatible
631 def test_p2ps_connect_adv_client_pin_method(dev):
632     """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
633     dev[0].flush_scan_cache()
634     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
635                    srv_info='I can receive files upto size 2 GB')
636     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
637                                               svc_name='org.wi-fi.wfds.send.rx',
638                                               srv_info='2 GB')
639 
640     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
641     p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
642 
643     ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
644     if ev0 is None:
645         raise Exception("Unable to remove the advertisement instance")
646     remove_group(dev[0], dev[1])
647 
648 def test_p2ps_service_discovery_multiple_queries(dev):
649     """P2P service discovery with multiple queries"""
650     addr0 = dev[0].p2p_dev_addr()
651     addr1 = dev[1].p2p_dev_addr()
652     adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
653                              svc_name='org.wi-fi.wfds.send.tx',
654                              srv_info='I can transfer files upto size of 2 GB')
655     adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
656                              svc_name='org.wi-fi.wfds.send.rx',
657                              srv_info='I can receive files upto size of 2 GB')
658     adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
659                              svc_name='org.wi-fi.wfds.display.tx',
660                              srv_info='Miracast Mode')
661     adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
662                              svc_name='org.wi-fi.wfds.display.rx',
663                              srv_info='Miracast Mode')
664 
665     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
666     dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
667     dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
668     dev[1].p2p_stop_find()
669     dev[1].global_request("P2P_FIND 10 type=social seek=")
670     ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
671     if ev is None:
672         raise Exception("P2P Device Found timed out")
673     if addr0 not in ev:
674         raise Exception("Unexpected service discovery request source")
675     ev_list = []
676     for i in range(0, 3):
677         ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
678         if ev is None:
679             raise Exception("P2P Service discovery timed out")
680         if addr0 in ev:
681             ev_list.append(ev)
682             if len(ev_list) == 3:
683                 break
684     dev[1].p2p_stop_find()
685 
686     for test in [("seek=org.wi-fi.wfds.display.TX",
687                   "asp_svc=org.wi-fi.wfds.display.tx"),
688                  ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
689                   "asp_svc=org.wi-fi.wfds.display.tx"),
690                  ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
691                   "asp_svc=org.wi-fi.wfds.display.tx"),
692                  ("seek=not-found", None),
693                  ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
694         dev[2].global_request("P2P_FIND 10 type=social " + test[0])
695         if test[1] is None:
696             ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
697             if ev is not None:
698                 raise Exception("Unexpected device found: " + ev)
699             continue
700         ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
701         if ev is None:
702             raise Exception("P2P device discovery timed out (dev2)")
703             if test[1] not in ev:
704                 raise Exception("Expected asp_svc not reported: " + ev)
705         dev[2].p2p_stop_find()
706         dev[2].request("P2P_FLUSH")
707 
708     dev[0].p2p_stop_find()
709 
710     ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
711     if ev1 is None:
712         raise Exception("Unable to remove the advertisement instance")
713     ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
714     if ev2 is None:
715         raise Exception("Unable to remove the advertisement instance")
716     ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
717     if ev3 is None:
718         raise Exception("Unable to remove the advertisement instance")
719     ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
720     if ev4 is None:
721         raise Exception("Unable to remove the advertisement instance")
722 
723     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
724         raise Exception("P2P_SERVICE_ADD failed")
725     if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
726         raise Exception("P2P_SERVICE_DEL asp all failed")
727     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
728         raise Exception("P2P_SERVICE_ADD failed")
729     if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
730         raise Exception("P2P_SERVICE_REP failed")
731     if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
732         raise Exception("Invalid P2P_SERVICE_REP accepted")
733     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
734         raise Exception("P2P_SERVICE_ADD failed")
735     if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
736         raise Exception("P2P_SERVICE_ADD failed")
737 
738 def get_ifnames():
739     with open('/proc/net/dev', 'r') as f:
740         data = f.read()
741     ifnames = []
742     for line in data.splitlines():
743         ifname = line.strip().split(' ')[0]
744         if ':' not in ifname:
745             continue
746         ifname = ifname.split(':')[0]
747         ifnames.append(ifname)
748     return ifnames
749 
750 def p2ps_connect_p2ps_method(dev, keep_group=False, join_extra="", flush=True):
751     if flush:
752         dev[0].flush_scan_cache()
753         dev[1].flush_scan_cache()
754     p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
755                    srv_info='I can receive files upto size 2 GB')
756     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
757                                               svc_name='org.wi-fi.wfds.send.rx',
758                                               srv_info='2 GB')
759     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
760     go_ev = None
761     if "join=" in ev0 and "go=" in ev1:
762         # dev[1] started GO and dev[0] is about to join it.
763         # Parse P2P-GROUP-STARTED from the GO to learn the operating frequency.
764         go_ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
765         if go_ev is None:
766             raise Exception("P2P-GROUP-STARTED timeout on dev1")
767         res = dev[1].group_form_result(go_ev)
768         if join_extra == "":
769             join_extra = " freq=" + res['freq']
770 
771     ifnames = get_ifnames()
772     p2ps_connect_pd(dev[0], dev[1], ev0, ev1, join_extra=join_extra,
773                     go_ev=go_ev)
774 
775     grp_ifname0 = dev[0].get_group_ifname()
776     grp_ifname1 = dev[1].get_group_ifname()
777     if not keep_group:
778         ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
779         if ev0 is None:
780             raise Exception("Unable to remove the advertisement instance")
781         ifnames = ifnames + get_ifnames()
782         remove_group(dev[0], dev[1])
783         ifnames = ifnames + get_ifnames()
784 
785     return grp_ifname0, grp_ifname1, ifnames
786 
787 def has_string_prefix(vals, prefix):
788     for val in vals:
789         if val.startswith(prefix):
790             return True
791     return False
792 
793 def test_p2ps_connect_p2ps_method_1(dev):
794     """P2PS connection with P2PS method - no group interface"""
795     set_no_group_iface(dev[0], 1)
796     set_no_group_iface(dev[1], 1)
797 
798     (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
799     if grp_ifname0 != dev[0].ifname:
800         raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
801     if grp_ifname1 != dev[1].ifname:
802         raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
803     if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
804         raise Exception("dev0 group interface unexpectedly present")
805     if has_string_prefix(ifnames, 'p2p-' + grp_ifname1):
806         raise Exception("dev1 group interface unexpectedly present")
807 
808 def test_p2ps_connect_p2ps_method_2(dev):
809     """P2PS connection with P2PS method - group interface on dev0"""
810     set_no_group_iface(dev[0], 0)
811     set_no_group_iface(dev[1], 1)
812 
813     (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
814     if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
815         raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
816     if grp_ifname1 != dev[1].ifname:
817         raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
818     if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
819         raise Exception("dev0 group interface unexpectedly present")
820 
821 def test_p2ps_connect_p2ps_method_3(dev):
822     """P2PS connection with P2PS method - group interface on dev1"""
823     set_no_group_iface(dev[0], 1)
824     set_no_group_iface(dev[1], 0)
825 
826     (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
827     if grp_ifname0 != dev[0].ifname:
828         raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
829     if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
830         raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
831     if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
832         raise Exception("dev0 group interface unexpectedly present")
833 
834 def test_p2ps_connect_p2ps_method_4(dev):
835     """P2PS connection with P2PS method - group interface on both"""
836     set_no_group_iface(dev[0], 0)
837     set_no_group_iface(dev[1], 0)
838 
839     (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
840     if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
841         raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
842     if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
843         raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
844 
845 def test_p2ps_connect_adv_go_persistent(dev):
846     """P2PS auto-accept connection with advertisement as GO and having persistent group"""
847     go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
848                                      r_dev=dev[1], r_intent=0)
849     dev[0].remove_group()
850     dev[1].wait_go_ending_session()
851 
852     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
853                    srv_info='I can receive files upto size 2 GB')
854     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
855                                               svc_name='org.wi-fi.wfds.send.rx',
856                                               srv_info='2 GB')
857     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
858     if "persist=" not in ev0 or "persist=" not in ev1:
859         raise Exception("Persistent group isn't used by peers")
860 
861     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
862     remove_group(dev[0], dev[1])
863 
864 def test_p2ps_stale_group_removal(dev):
865     """P2PS stale group removal"""
866     ssid_1 = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
867                                               r_dev=dev[1], r_intent=0)[0]['ssid']
868     dev[0].remove_group()
869     dev[1].wait_go_ending_session()
870 
871     # Drop the first persistent group on dev[1] and form new persistent groups
872     # on both devices.
873     dev[1].p2pdev_request("FLUSH")
874     ssid_2 = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
875                                               r_dev=dev[1], r_intent=0)[0]['ssid']
876     dev[0].remove_group()
877     dev[1].wait_go_ending_session()
878 
879     # The GO now has a stale persistent group as the first entry. Try to go
880     # through P2PS sequence to hit stale group removal.
881     # Only a single entry in the unlikely event that the SSIDs are equal
882     if len(dev[0].list_networks(p2p=True)) != 2 if ssid_1 != ssid_2 else 1:
883         raise Exception("Unexpected number of networks on dev[0]")
884     if len(dev[1].list_networks(p2p=True)) != 1:
885         raise Exception("Unexpected number of networks on dev[1]")
886 
887     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
888                    srv_info='I can receive files upto size 2 GB')
889     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
890                                               svc_name='org.wi-fi.wfds.send.rx',
891                                               srv_info='2 GB')
892     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
893     if "persist=" not in ev0 or "persist=" not in ev1:
894         raise Exception("Persistent group isn't used by peers")
895 
896     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
897     remove_group(dev[0], dev[1])
898 
899     if len(dev[0].list_networks(p2p=True)) != 1:
900         raise Exception("Unexpected number of networks on dev[0] (2)")
901     if len(dev[1].list_networks(p2p=True)) != 1:
902         raise Exception("Unexpected number of networks on dev[1] (2)")
903 
904 def test_p2ps_stale_group_removal2(dev):
905     """P2PS stale group removal (2)"""
906     ssid_1 = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=0,
907                                               r_dev=dev[1], r_intent=15)[0]['ssid']
908     dev[1].remove_group()
909     dev[0].wait_go_ending_session()
910 
911     # Drop the first persistent group on dev[1] and form new persistent groups
912     # on both devices.
913     dev[1].p2pdev_request("FLUSH")
914     ssid_2 = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=0,
915                                               r_dev=dev[1], r_intent=15)[0]['ssid']
916     dev[1].remove_group()
917     dev[0].wait_go_ending_session()
918 
919     # The P2P Client now has a stale persistent group as the first entry. Try
920     # to go through P2PS sequence to hit stale group removal.
921     # Only a single entry in the unlikely event that the SSIDs are equal
922     if len(dev[0].list_networks(p2p=True)) != 2 if ssid_1 != ssid_2 else 1:
923         raise Exception("Unexpected number of networks on dev[0]")
924     if len(dev[1].list_networks(p2p=True)) != 1:
925         raise Exception("Unexpected number of networks on dev[1]")
926 
927     p2ps_advertise(r_dev=dev[1], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
928                    srv_info='I can receive files upto size 2 GB')
929     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[0], r_dev=dev[1],
930                                               svc_name='org.wi-fi.wfds.send.rx',
931                                               srv_info='2 GB')
932     ev0, ev1 = p2ps_provision(dev[0], dev[1], adv_id)
933     # This hits persistent group removal on dev[0] (P2P Client)
934 
935 def test_p2ps_stale_group_removal3(dev):
936     """P2PS stale group removal (3)"""
937     dev[0].p2p_start_go(persistent=True)
938     dev[0].remove_group()
939     if len(dev[0].list_networks(p2p=True)) != 1:
940         raise Exception("Unexpected number of networks on dev[0]")
941 
942     go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
943                                      r_dev=dev[1], r_intent=0)
944     dev[0].remove_group()
945     dev[1].wait_go_ending_session()
946 
947     # The GO now has a stale persistent group as the first entry. Try to go
948     # through P2PS sequence to hit stale group removal.
949     if len(dev[0].list_networks(p2p=True)) != 2:
950         raise Exception("Unexpected number of networks on dev[0] (2)")
951     if len(dev[1].list_networks(p2p=True)) != 1:
952         raise Exception("Unexpected number of networks on dev[1] (2)")
953 
954     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
955                    srv_info='I can receive files upto size 2 GB')
956     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
957                                               svc_name='org.wi-fi.wfds.send.rx',
958                                               srv_info='2 GB')
959     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
960     if "persist=" not in ev0 or "persist=" not in ev1:
961         raise Exception("Persistent group isn't used by peers")
962 
963     p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
964     remove_group(dev[0], dev[1])
965 
966     if len(dev[0].list_networks(p2p=True)) != 1:
967         raise Exception("Unexpected number of networks on dev[0] (3)")
968     if len(dev[1].list_networks(p2p=True)) != 1:
969         raise Exception("Unexpected number of networks on dev[1] (3)")
970 
971 @remote_compatible
972 def test_p2ps_adv_go_persistent_no_peer_entry(dev):
973     """P2PS advertisement as GO having persistent group (no peer entry)"""
974     go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
975                                      r_dev=dev[1], r_intent=0)
976     dev[0].remove_group()
977     dev[1].wait_go_ending_session()
978 
979     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
980                    srv_info='I can receive files upto size 2 GB')
981     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
982                                               svc_name='org.wi-fi.wfds.send.rx',
983                                               srv_info='2 GB')
984     dev[0].global_request("P2P_FLUSH")
985     dev[0].p2p_listen()
986     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
987     if "persist=" not in ev0 or "persist=" not in ev1:
988         raise Exception("Persistent group isn't used by peers")
989 
990 @remote_compatible
991 def test_p2ps_pd_follow_on_status_failure(dev):
992     """P2PS PD follow on request with status 11"""
993     addr0 = dev[0].p2p_dev_addr()
994     addr1 = dev[1].p2p_dev_addr()
995 
996     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
997                    srv_info='I can receive files upto size 2 GB')
998     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
999                                               svc_name='org.wi-fi.wfds.send.rx',
1000                                               srv_info='2 GB')
1001     dev[1].asp_provision(addr0, adv_id=str(adv_id), adv_mac=addr0,
1002                          session_id=1, session_mac=addr1)
1003     ev_pd_start = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
1004     if ev_pd_start is None:
1005         raise Exception("P2PS-PROV-START timeout on Advertiser side")
1006     ev = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
1007     if ev is None:
1008         raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
1009     dev[1].p2p_ext_listen(500, 500)
1010     dev[0].p2p_stop_find()
1011     dev[0].asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr0, session_id=1,
1012                          session_mac=addr1, status=11, method=0)
1013 
1014     ev = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
1015     if ev is None:
1016         raise Exception("P2P-PROV-DONE timeout on seeker side")
1017     if adv_id not in ev:
1018         raise Exception("P2P-PROV-DONE without adv_id on seeker side")
1019     if "status=11" not in ev:
1020         raise Exception("P2P-PROV-DONE without status on seeker side")
1021 
1022     ev = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
1023     if ev is None:
1024         raise Exception("P2P-PROV-DONE timeout on advertiser side")
1025     if adv_id not in ev:
1026         raise Exception("P2P-PROV-DONE without adv_id on advertiser side")
1027     if "status=11" not in ev:
1028         raise Exception("P2P-PROV-DONE without status on advertiser side")
1029 
1030 def test_p2ps_client_probe(dev):
1031     """P2PS CLI discoverability on operating channel"""
1032     cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
1033     p2ps_connect_p2ps_method(dev, keep_group=True)
1034     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
1035                                               svc_name='org.wi-fi.wfds.send.rx',
1036                                               single_peer_expected=False)
1037     dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1038     remove_group(dev[0], dev[1])
1039 
1040 def test_p2ps_go_probe(dev):
1041     """P2PS GO discoverability on operating channel"""
1042     p2ps_connect_adv_go_pin_method(dev, keep_group=True)
1043     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
1044                                               svc_name='org.wi-fi.wfds.send.rx',
1045                                               single_peer_expected=False)
1046     dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1047     remove_group(dev[0], dev[1])
1048 
1049 @remote_compatible
1050 def test_p2ps_wildcard_p2ps(dev):
1051     """P2PS wildcard SD Probe Request/Response"""
1052     p2ps_wildcard = "org.wi-fi.wfds"
1053 
1054     adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
1055                             svc_name='org.foo.service',
1056                             srv_info='I can do stuff')
1057     adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
1058                              svc_name='org.wi-fi.wfds.send.rx',
1059                              srv_info='I can receive files upto size 2 GB')
1060 
1061     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
1062         raise Exception("Failed on P2P_FIND command")
1063 
1064     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1065     if ev1 is None:
1066         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
1067     if dev[0].p2p_dev_addr() not in ev1:
1068         raise Exception("Unexpected peer")
1069 
1070     ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1071     if ev2 is None:
1072         raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
1073     if dev[0].p2p_dev_addr() not in ev2:
1074         raise Exception("Unexpected peer (2)")
1075 
1076     if p2ps_wildcard not in ev1 + ev2:
1077         raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
1078     if "org.foo.service" not in ev1 + ev2:
1079         raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
1080 
1081     if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
1082         raise Exception("P2P_STOP_FIND failed")
1083     dev[1].dump_monitor()
1084 
1085     res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1086     if res is None:
1087         raise Exception("Unable to remove the advertisement instance")
1088 
1089     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
1090         raise Exception("Failed on P2P_FIND command")
1091 
1092     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1093     if ev1 is None:
1094         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
1095     if dev[0].p2p_dev_addr() not in ev1:
1096         raise Exception("Unexpected peer")
1097     if p2ps_wildcard not in ev1:
1098         raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
1099     dev[1].dump_monitor()
1100 
1101     res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
1102     if res is None:
1103         raise Exception("Unable to remove the advertisement instance 2")
1104 
1105     dev[1].p2p_stop_find()
1106     time.sleep(0.1)
1107     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
1108         raise Exception("Failed on P2P_FIND command")
1109 
1110     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
1111     if ev1 is not None:
1112         raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
1113     dev[1].p2p_stop_find()
1114     dev[1].dump_monitor()
1115 
1116 def test_p2ps_many_services_in_probe(dev):
1117     """P2PS with large number of services in Probe Request/Response"""
1118     long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
1119     long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
1120     long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
1121     long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
1122     long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
1123     for name in [long1, long2, long3, long4, long5]:
1124         p2ps_advertise(r_dev=dev[0], r_role='1',
1125                        svc_name=name,
1126                        srv_info='I can do stuff')
1127 
1128     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)):
1129         raise Exception("Failed on P2P_FIND command")
1130 
1131     events = ""
1132     # Note: Require only four events since all the services do not fit within
1133     # the length limit.
1134     for i in range(4):
1135         ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1136         if ev is None:
1137             raise Exception("Missing P2P-DEVICE-FOUND")
1138         events = events + ev
1139     dev[1].p2p_stop_find()
1140     dev[1].dump_monitor()
1141     for name in [long2, long3, long4, long5]:
1142         if name not in events:
1143             raise Exception("Service missing from peer events")
1144 
1145 def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role,
1146                                      result):
1147     p2ps_advertise(r_dev=dev[0], r_role=adv_role,
1148                    svc_name='org.wi-fi.wfds.send.rx',
1149                    srv_info='I can receive files upto size 2 GB', cpt=adv_cpt)
1150     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1151                                               svc_name='org.wi-fi.wfds.send.rx',
1152                                               srv_info='2 GB')
1153     auto_accept = adv_role != "0"
1154     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id,
1155                                    auto_accept=auto_accept, adv_cpt=adv_cpt,
1156                                    seeker_cpt=seeker_cpt, method="8")
1157 
1158     status0, fcap0 = p2ps_parse_event(ev0, "status", "feature_cap")
1159     status1, fcap1 = p2ps_parse_event(ev0, "status", "feature_cap")
1160 
1161     if fcap0 is None:
1162         raise Exception("Bad feature capability on Seeker side")
1163     if fcap1 is None:
1164         raise Exception("Bad feature capability on Advertiser side")
1165     if fcap0 != fcap1:
1166         raise Exception("Incompatible feature capability values")
1167 
1168     if status0 not in ("0", "12") or status1 not in ("0", "12"):
1169         raise Exception("Unexpected PD result status")
1170 
1171     if result == "UDP" and fcap0[1] != "1":
1172         raise Exception("Unexpected CPT feature capability value (expected: UDP)")
1173     elif result == "MAC" and fcap0[1] != "2":
1174         raise Exception("Unexpected CPT feature capability value (expected: MAC)")
1175 
1176     ev = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1177     if ev is None:
1178         raise Exception("Unable to remove the advertisement instance")
1179 
1180 @remote_compatible
1181 def test_p2ps_feature_capability_mac_autoaccept(dev):
1182     """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept"""
1183     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1184                                      adv_role="4", result="MAC")
1185 
1186 @remote_compatible
1187 def test_p2ps_feature_capability_mac_nonautoaccept(dev):
1188     """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept"""
1189     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1190                                      adv_role="0", result="MAC")
1191 
1192 @remote_compatible
1193 def test_p2ps_feature_capability_mac_udp_autoaccept(dev):
1194     """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept"""
1195     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1196                                      seeker_cpt="UDP:MAC", adv_role="2",
1197                                      result="MAC")
1198 
1199 @remote_compatible
1200 def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev):
1201     """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept"""
1202     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1203                                      seeker_cpt="UDP:MAC", adv_role="0",
1204                                      result="UDP")
1205 
1206 @remote_compatible
1207 def test_p2ps_feature_capability_udp_mac_autoaccept(dev):
1208     """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept"""
1209     p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1210                                      seeker_cpt="MAC:UDP", adv_role="2",
1211                                      result="UDP")
1212 
1213 @remote_compatible
1214 def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev):
1215     """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP,  nonautoaccept"""
1216     p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1217                                      seeker_cpt="MAC:UDP", adv_role="0",
1218                                      result="MAC")
1219 
1220 def test_p2ps_channel_one_connected(dev, apdev):
1221     """P2PS connection with P2PS method - one of the stations connected"""
1222     set_no_group_iface(dev[0], 0)
1223     set_no_group_iface(dev[1], 0)
1224 
1225     try:
1226         hapd = hostapd.add_ap(apdev[0],
1227                               {"ssid": 'bss-2.4ghz', "channel": '7'})
1228         dev[1].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2442")
1229 
1230         (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev, keep_group=True, join_extra=" freq=2442")
1231         freq = dev[0].get_group_status_field('freq')
1232 
1233         if freq != '2442':
1234             raise Exception('Unexpected frequency for group 2442 != ' + freq)
1235     finally:
1236         dev[0].global_request("P2P_SERVICE_DEL asp all")
1237         remove_group(dev[0], dev[1])
1238 
1239 def set_random_listen_chan(dev):
1240     chan = random.randrange(0, 3) * 5 + 1
1241     dev.global_request("P2P_SET listen_channel %d" % chan)
1242 
1243 def test_p2ps_channel_both_connected_same(dev, apdev):
1244     """P2PS connection with P2PS method - stations connected on same channel"""
1245     set_no_group_iface(dev[2], 0)
1246     set_no_group_iface(dev[1], 0)
1247 
1248     dev[2].global_request("P2P_SET listen_channel 6")
1249     dev[1].global_request("P2P_SET listen_channel 6")
1250 
1251     dev[1].flush_scan_cache()
1252     dev[2].flush_scan_cache()
1253 
1254     try:
1255         hapd = hostapd.add_ap(apdev[0],
1256                               {"ssid": 'bss-2.4ghz', "channel": '6'})
1257 
1258         dev[2].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2437")
1259         dev[1].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2437")
1260 
1261         tmpdev = [dev[2], dev[1]]
1262         (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(tmpdev, keep_group=True, join_extra=" freq=2437", flush=False)
1263         freq = dev[2].get_group_status_field('freq')
1264 
1265         if freq != '2437':
1266             raise Exception('Unexpected frequency for group 2437 != ' + freq)
1267     finally:
1268         dev[2].global_request("P2P_SERVICE_DEL asp all")
1269         for i in range(1, 3):
1270             set_random_listen_chan(dev[i])
1271         remove_group(dev[2], dev[1])
1272 
1273 def disconnect_handler(seeker, advertiser):
1274     advertiser.request("DISCONNECT")
1275     advertiser.wait_disconnected(timeout=1)
1276 
1277 def test_p2ps_channel_both_connected_different(dev, apdev):
1278     """P2PS connection with P2PS method - stations connected on different channel"""
1279     if dev[0].get_mcc() > 1:
1280         raise HwsimSkip('Skip due to MCC being enabled')
1281 
1282     set_no_group_iface(dev[0], 0)
1283     set_no_group_iface(dev[1], 0)
1284 
1285     try:
1286         hapd1 = hostapd.add_ap(apdev[0],
1287                                {"ssid": 'bss-channel-3', "channel": '3'})
1288 
1289         hapd2 = hostapd.add_ap(apdev[1],
1290                                {"ssid": 'bss-channel-10', "channel": '10'})
1291 
1292         dev[0].connect("bss-channel-3", key_mgmt="NONE", scan_freq="2422")
1293         dev[1].connect("bss-channel-10", key_mgmt="NONE", scan_freq="2457")
1294 
1295         p2ps_advertise(r_dev=dev[0], r_role='2',
1296                        svc_name='org.wi-fi.wfds.send.rx',
1297                        srv_info='I can receive files upto size 2 GB')
1298         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1299                                                   svc_name='org.wi-fi.wfds.send.rx',
1300                                                   srv_info='2 GB')
1301 
1302         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1303                                   handler=disconnect_handler)
1304         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1305         freq = dev[0].get_group_status_field('freq')
1306         if freq != '2457':
1307             raise Exception('Unexpected frequency for group 2457 != ' + freq)
1308     finally:
1309         dev[0].global_request("P2P_SERVICE_DEL asp all")
1310         remove_group(dev[0], dev[1])
1311 
1312 def test_p2ps_channel_both_connected_different_mcc(dev, apdev):
1313     """P2PS connection with P2PS method - stations connected on different channels with mcc"""
1314     with HWSimRadio(n_channels=2) as (radio, iface):
1315         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1316         wpas.interface_add(iface)
1317 
1318         set_no_group_iface(wpas, 0)
1319         set_no_group_iface(dev[1], 0)
1320 
1321         try:
1322             hapd1 = hostapd.add_ap(apdev[0],
1323                                    {"ssid": 'bss-channel-3', "channel": '3'})
1324 
1325             hapd2 = hostapd.add_ap(apdev[1],
1326                                    {"ssid": 'bss-channel-10', "channel": '10'})
1327 
1328             wpas.connect("bss-channel-3", key_mgmt="NONE", scan_freq="2422")
1329             dev[1].connect("bss-channel-10", key_mgmt="NONE", scan_freq="2457")
1330 
1331             (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method([wpas, dev[1]], keep_group=True)
1332             freq = wpas.get_group_status_field('freq')
1333 
1334             if freq != '2422' and freq != '2457':
1335                 raise Exception('Unexpected frequency for group =' + freq)
1336         finally:
1337             wpas.global_request("P2P_SERVICE_DEL asp all")
1338             remove_group(wpas, dev[1])
1339 
1340 def clear_disallow_handler(seeker, advertiser):
1341     advertiser.global_request("P2P_SET disallow_freq ")
1342 
1343 @remote_compatible
1344 def test_p2ps_channel_disallow_freq(dev, apdev):
1345     """P2PS connection with P2PS method - disallow freqs"""
1346     set_no_group_iface(dev[0], 0)
1347     set_no_group_iface(dev[1], 0)
1348 
1349     try:
1350         dev[0].global_request("P2P_SET disallow_freq 2412-2457")
1351         dev[1].global_request("P2P_SET disallow_freq 2417-2462")
1352 
1353         p2ps_advertise(r_dev=dev[0], r_role='2',
1354                        svc_name='org.wi-fi.wfds.send.rx',
1355                        srv_info='I can receive files upto size 2 GB')
1356 
1357         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1358                                                   svc_name='org.wi-fi.wfds.send.rx',
1359                                                   srv_info='2 GB')
1360 
1361         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1362                                   handler=clear_disallow_handler)
1363         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1364 
1365         freq = dev[0].get_group_status_field('freq')
1366         if freq != '2412':
1367             raise Exception('Unexpected frequency for group 2412 != ' + freq)
1368     finally:
1369         dev[0].global_request("P2P_SERVICE_DEL asp all")
1370         dev[0].global_request("P2P_SET disallow_freq ")
1371         dev[1].global_request("P2P_SET disallow_freq ")
1372         remove_group(dev[0], dev[1])
1373 
1374 def test_p2ps_channel_sta_connected_disallow_freq(dev, apdev):
1375     """P2PS connection with P2PS method - one station and disallow freqs"""
1376     if dev[0].get_mcc() > 1:
1377         raise HwsimSkip('Skip due to MCC being enabled')
1378 
1379     set_no_group_iface(dev[0], 0)
1380     set_no_group_iface(dev[1], 0)
1381 
1382     try:
1383         dev[0].global_request("P2P_SET disallow_freq 2437")
1384         hapd = hostapd.add_ap(apdev[0],
1385                               {"ssid": 'bss-channel-6', "channel": '6'})
1386 
1387         dev[1].connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1388 
1389         p2ps_advertise(r_dev=dev[0], r_role='2',
1390                        svc_name='org.wi-fi.wfds.send.rx',
1391                        srv_info='I can receive files upto size 2 GB')
1392         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1393                                                   svc_name='org.wi-fi.wfds.send.rx',
1394                                                   srv_info='2 GB')
1395 
1396         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1397                                   handler=clear_disallow_handler)
1398         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1399 
1400         freq = dev[0].get_group_status_field('freq')
1401         if freq != '2437':
1402             raise Exception('Unexpected frequency for group 2437 != ' + freq)
1403     finally:
1404         dev[0].global_request("P2P_SET disallow_freq ")
1405         dev[0].global_request("P2P_SERVICE_DEL asp all")
1406         remove_group(dev[0], dev[1])
1407 
1408 def test_p2ps_channel_sta_connected_disallow_freq_mcc(dev, apdev):
1409     """P2PS connection with P2PS method - one station and disallow freqs with mcc"""
1410     with HWSimRadio(n_channels=2) as (radio, iface):
1411         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1412         wpas.interface_add(iface)
1413 
1414         if wpas.get_mcc() < 2:
1415             raise Exception("New radio does not support MCC")
1416 
1417         set_no_group_iface(dev[0], 0)
1418         set_no_group_iface(wpas, 0)
1419 
1420         try:
1421             dev[0].global_request("P2P_SET disallow_freq 2437")
1422             hapd1 = hostapd.add_ap(apdev[0],
1423                                    {"ssid": 'bss-channel-6', "channel": '6'})
1424 
1425             wpas.connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1426 
1427             tmpdev = [dev[0], wpas]
1428             (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(tmpdev, keep_group=True)
1429 
1430             freq = dev[0].get_group_status_field('freq')
1431             if freq == '2437':
1432                 raise Exception('Unexpected frequency=2437')
1433         finally:
1434             dev[0].global_request("P2P_SET disallow_freq ")
1435             dev[0].global_request("P2P_SERVICE_DEL asp all")
1436             remove_group(dev[0], wpas)
1437 
1438 @remote_compatible
1439 def test_p2ps_active_go_adv(dev, apdev):
1440     """P2PS connection with P2PS method - active GO on advertiser"""
1441     set_no_group_iface(dev[0], 0)
1442     set_no_group_iface(dev[1], 0)
1443 
1444     try:
1445         # Add a P2P GO
1446         dev[0].global_request("P2P_GROUP_ADD persistent")
1447         ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1448         if ev is None:
1449             raise Exception("P2P-GROUP-STARTED timeout on " + dev[0].p2p_dev_addr())
1450 
1451         dev[0].group_form_result(ev)
1452 
1453         p2ps_advertise(r_dev=dev[0], r_role='4',
1454                        svc_name='org.wi-fi.wfds.send.rx',
1455                        srv_info='I can receive files upto size 2 GB')
1456         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1457                                                   svc_name='org.wi-fi.wfds.send.rx',
1458                                                   single_peer_expected=False)
1459 
1460         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1461 
1462         # explicitly stop find/listen as otherwise the long listen started by
1463         # the advertiser would prevent the seeker to connect with the P2P GO
1464         dev[0].p2p_stop_find()
1465         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1466     finally:
1467         dev[0].global_request("P2P_SERVICE_DEL asp all")
1468         remove_group(dev[0], dev[1])
1469 
1470 @remote_compatible
1471 def test_p2ps_active_go_seeker(dev, apdev):
1472     """P2PS connection with P2PS method - active GO on seeker"""
1473     set_no_group_iface(dev[0], 0)
1474     set_no_group_iface(dev[1], 0)
1475 
1476     try:
1477         # Add a P2P GO on the seeker
1478         dev[1].global_request("P2P_GROUP_ADD persistent")
1479         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1480         if ev is None:
1481             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1482 
1483         res = dev[1].group_form_result(ev)
1484 
1485         p2ps_advertise(r_dev=dev[0], r_role='2',
1486                        svc_name='org.wi-fi.wfds.send.rx',
1487                        srv_info='I can receive files upto size 2 GB')
1488         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1489                                                   svc_name='org.wi-fi.wfds.send.rx',
1490                                                   srv_info='2 GB')
1491 
1492         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1493         p2ps_connect_pd(dev[0], dev[1], ev0, ev1,
1494                         join_extra=" freq=" + res['freq'])
1495     finally:
1496         dev[0].global_request("P2P_SERVICE_DEL asp all")
1497         remove_group(dev[0], dev[1])
1498 
1499 def test_p2ps_channel_active_go_and_station_same(dev, apdev):
1500     """P2PS connection, active P2P GO and station on channel"""
1501     set_no_group_iface(dev[2], 0)
1502     set_no_group_iface(dev[1], 0)
1503 
1504     dev[2].global_request("P2P_SET listen_channel 11")
1505     dev[1].global_request("P2P_SET listen_channel 11")
1506     try:
1507         hapd = hostapd.add_ap(apdev[0],
1508                               {"ssid": 'bss-channel-11', "channel": '11'})
1509 
1510         dev[2].connect("bss-channel-11", key_mgmt="NONE", scan_freq="2462")
1511 
1512         # Add a P2P GO on the seeker
1513         dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1514         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1515         if ev is None:
1516             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1517 
1518         dev[1].group_form_result(ev)
1519 
1520         p2ps_advertise(r_dev=dev[2], r_role='2',
1521                        svc_name='org.wi-fi.wfds.send.rx',
1522                        srv_info='I can receive files upto size 2 GB')
1523         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[2],
1524                                                   svc_name='org.wi-fi.wfds.send.rx',
1525                                                   srv_info='2 GB')
1526 
1527         ev1, ev0 = p2ps_provision(dev[1], dev[2], adv_id)
1528         p2ps_connect_pd(dev[2], dev[1], ev0, ev1, join_extra=" freq=2462")
1529     finally:
1530         dev[2].global_request("P2P_SERVICE_DEL asp all")
1531         for i in range(1, 3):
1532             set_random_listen_chan(dev[i])
1533         remove_group(dev[2], dev[1])
1534 
1535 def test_p2ps_channel_active_go_and_station_different(dev, apdev):
1536     """P2PS connection, active P2P GO and station on channel"""
1537     if dev[0].get_mcc() > 1:
1538         raise HwsimSkip('Skip due to MCC being enabled')
1539 
1540     set_no_group_iface(dev[0], 0)
1541     set_no_group_iface(dev[1], 0)
1542 
1543     try:
1544         hapd = hostapd.add_ap(apdev[0],
1545                               {"ssid": 'bss-channel-2', "channel": '2'})
1546 
1547         dev[0].connect("bss-channel-2", key_mgmt="NONE", scan_freq="2417")
1548 
1549         # Add a P2P GO on the seeker. Force the listen channel to be the same,
1550         # as extended listen will not kick as long as P2P GO is waiting for
1551         # initial connection.
1552         dev[1].global_request("P2P_SET listen_channel 11")
1553         dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1554         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1555         if ev is None:
1556             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1557 
1558         dev[1].group_form_result(ev)
1559 
1560         p2ps_advertise(r_dev=dev[0], r_role='2',
1561                        svc_name='org.wi-fi.wfds.send.rx',
1562                        srv_info='I can receive files upto size 2 GB')
1563         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1564                                                   svc_name='org.wi-fi.wfds.send.rx',
1565                                                   srv_info='2 GB')
1566 
1567         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1568                                   handler=disconnect_handler, adv_role='2',
1569                                   seeker_role='4')
1570         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1571         freq = dev[0].get_group_status_field('freq')
1572         if freq != '2462':
1573             raise Exception('Unexpected frequency for group 2462!=' + freq)
1574     finally:
1575         dev[0].global_request("P2P_SERVICE_DEL asp all")
1576         set_random_listen_chan(dev[1])
1577 
1578 @remote_compatible
1579 def test_p2ps_channel_active_go_and_station_different_mcc(dev, apdev):
1580     """P2PS connection, active P2P GO and station on channel"""
1581     with HWSimRadio(n_channels=2) as (radio, iface):
1582         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1583         wpas.interface_add(iface)
1584 
1585         set_no_group_iface(wpas, 0)
1586         set_no_group_iface(dev[1], 0)
1587 
1588         try:
1589             hapd = hostapd.add_ap(apdev[0],
1590                                   {"ssid": 'bss-channel-6', "channel": '6'})
1591 
1592             wpas.global_request("P2P_SET listen_channel 1")
1593             wpas.connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1594 
1595             # Add a P2P GO on the seeker
1596             dev[1].global_request("P2P_SET listen_channel 1")
1597             dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1598             ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1599             if ev is None:
1600                 raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1601 
1602             dev[1].group_form_result(ev)
1603 
1604             p2ps_advertise(r_dev=wpas, r_role='2',
1605                            svc_name='org.wi-fi.wfds.send.rx',
1606                            srv_info='I can receive files upto size 2 GB')
1607             [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=wpas,
1608                                                       svc_name='org.wi-fi.wfds.send.rx',
1609                                                       srv_info='2 GB')
1610 
1611             ev1, ev0 = p2ps_provision(dev[1], wpas, adv_id)
1612             p2ps_connect_pd(wpas, dev[1], ev0, ev1)
1613         finally:
1614             set_random_listen_chan(dev[1])
1615             set_random_listen_chan(wpas)
1616             wpas.request("DISCONNECT")
1617             hapd.disable()
1618             wpas.global_request("P2P_SERVICE_DEL asp all")
1619             remove_group(wpas, dev[1], allow_failure=True)
1620 
1621 def test_p2ps_connect_p2p_device(dev):
1622     """P2PS connection using cfg80211 P2P Device"""
1623     run_p2ps_connect_p2p_device(dev, 0)
1624 
1625 def test_p2ps_connect_p2p_device_no_group_iface(dev):
1626     """P2PS connection using cfg80211 P2P Device (no separate group interface)"""
1627     run_p2ps_connect_p2p_device(dev, 1)
1628 
1629 def run_p2ps_connect_p2p_device(dev, no_group_iface):
1630     with HWSimRadio(use_p2p_device=True) as (radio, iface):
1631         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1632         wpas.interface_add(iface)
1633         wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface)
1634 
1635         p2ps_advertise(r_dev=dev[0], r_role='1',
1636                        svc_name='org.wi-fi.wfds.send.rx',
1637                        srv_info='I can receive files upto size 2 GB')
1638         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=wpas, r_dev=dev[0],
1639                                                   svc_name='org.wi-fi.wfds.send.rx',
1640                                                   srv_info='2 GB')
1641 
1642         ev1, ev0 = p2ps_provision(wpas, dev[0], adv_id)
1643         p2ps_connect_pd(dev[0], wpas, ev0, ev1)
1644 
1645         ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1646         if ev0 is None:
1647             raise Exception("Unable to remove the advertisement instance")
1648         remove_group(dev[0], wpas)
1649 
1650 def test_p2ps_connect_p2p_device2(dev):
1651     """P2PS connection using cfg80211 P2P Device (reverse)"""
1652     run_p2ps_connect_p2p_device2(dev, 0)
1653 
1654 def test_p2ps_connect_p2p_device2_no_group_iface(dev):
1655     """P2PS connection using cfg80211 P2P Device (reverse) (no separate group interface)"""
1656     run_p2ps_connect_p2p_device2(dev, 1)
1657 
1658 def run_p2ps_connect_p2p_device2(dev, no_group_iface):
1659     with HWSimRadio(use_p2p_device=True) as (radio, iface):
1660         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1661         wpas.interface_add(iface)
1662         wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface)
1663 
1664         p2ps_advertise(r_dev=wpas, r_role='1',
1665                        svc_name='org.wi-fi.wfds.send.rx',
1666                        srv_info='I can receive files upto size 2 GB')
1667         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[0], r_dev=wpas,
1668                                                   svc_name='org.wi-fi.wfds.send.rx',
1669                                                   srv_info='2 GB')
1670 
1671         ev1, ev0 = p2ps_provision(dev[0], wpas, adv_id)
1672         p2ps_connect_pd(wpas, dev[0], ev0, ev1)
1673 
1674         ev0 = wpas.global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1675         if ev0 is None:
1676             raise Exception("Unable to remove the advertisement instance")
1677         remove_group(wpas, dev[0])
1678 
1679 @remote_compatible
1680 def test_p2ps_connect_p2ps_method_no_pin(dev):
1681     """P2P group formation using P2PS method without specifying PIN"""
1682     dev[0].p2p_listen()
1683     dev[1].p2p_go_neg_auth(dev[0].p2p_dev_addr(), None, "p2ps", go_intent=15)
1684     dev[1].p2p_listen()
1685     i_res = dev[0].p2p_go_neg_init(dev[1].p2p_dev_addr(), None, "p2ps",
1686                                    timeout=20, go_intent=0)
1687     r_res = dev[1].p2p_go_neg_auth_result()
1688     logger.debug("i_res: " + str(i_res))
1689     logger.debug("r_res: " + str(r_res))
1690     check_grpform_results(i_res, r_res)
1691     remove_group(dev[0], dev[1])
1692