Updated to hostap_2_6
[mech_eap.git] / libeap / 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 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("\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 @remote_compatible
865 def test_p2ps_adv_go_persistent_no_peer_entry(dev):
866     """P2PS advertisement as GO having persistent group (no peer entry)"""
867     go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
868                                      r_dev=dev[1], r_intent=0)
869     dev[0].remove_group()
870     dev[1].wait_go_ending_session()
871
872     p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
873                    srv_info='I can receive files upto size 2 GB')
874     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
875                                               svc_name='org.wi-fi.wfds.send.rx',
876                                               srv_info='2 GB')
877     dev[0].global_request("P2P_FLUSH")
878     dev[0].p2p_listen()
879     ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
880     if "persist=" not in ev0 or "persist=" not in ev1:
881         raise Exception("Persistent group isn't used by peers")
882
883 @remote_compatible
884 def test_p2ps_pd_follow_on_status_failure(dev):
885     """P2PS PD follow on request with status 11"""
886     addr0 = dev[0].p2p_dev_addr()
887     addr1 = dev[1].p2p_dev_addr()
888
889     p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
890                    srv_info='I can receive files upto size 2 GB')
891     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
892                                               svc_name='org.wi-fi.wfds.send.rx',
893                                               srv_info='2 GB')
894     dev[1].asp_provision(addr0, adv_id=str(adv_id), adv_mac=addr0,
895                          session_id=1, session_mac=addr1)
896     ev_pd_start = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
897     if ev_pd_start is None:
898         raise Exception("P2PS-PROV-START timeout on Advertiser side")
899     ev = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
900     if ev is None:
901         raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
902     dev[1].p2p_ext_listen(500, 500)
903     dev[0].p2p_stop_find()
904     dev[0].asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr0, session_id=1,
905                          session_mac=addr1, status=11, method=0)
906
907     ev = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
908     if ev is None:
909         raise Exception("P2P-PROV-DONE timeout on seeker side")
910     if adv_id not in ev:
911         raise Exception("P2P-PROV-DONE without adv_id on seeker side")
912     if "status=11" not in ev:
913         raise Exception("P2P-PROV-DONE without status on seeker side")
914
915     ev = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
916     if ev is None:
917         raise Exception("P2P-PROV-DONE timeout on advertiser side")
918     if adv_id not in ev:
919         raise Exception("P2P-PROV-DONE without adv_id on advertiser side")
920     if "status=11" not in ev:
921         raise Exception("P2P-PROV-DONE without status on advertiser side")
922
923 def test_p2ps_client_probe(dev):
924     """P2PS CLI discoverability on operating channel"""
925     cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
926     p2ps_connect_p2ps_method(dev, keep_group=True)
927     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
928                                               svc_name='org.wi-fi.wfds.send.rx',
929                                               single_peer_expected=False)
930     dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
931     remove_group(dev[0], dev[1])
932
933 def test_p2ps_go_probe(dev):
934     """P2PS GO discoverability on operating channel"""
935     p2ps_connect_adv_go_pin_method(dev, keep_group=True)
936     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
937                                               svc_name='org.wi-fi.wfds.send.rx',
938                                               single_peer_expected=False)
939     dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
940     remove_group(dev[0], dev[1])
941
942 @remote_compatible
943 def test_p2ps_wildcard_p2ps(dev):
944     """P2PS wildcard SD Probe Request/Response"""
945     p2ps_wildcard = "org.wi-fi.wfds"
946
947     adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
948                             svc_name='org.foo.service',
949                             srv_info='I can do stuff')
950     adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
951                              svc_name='org.wi-fi.wfds.send.rx',
952                              srv_info='I can receive files upto size 2 GB')
953
954     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
955         raise Exception("Failed on P2P_FIND command")
956
957     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
958     if ev1 is None:
959         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
960     if dev[0].p2p_dev_addr() not in ev1:
961         raise Exception("Unexpected peer")
962
963     ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
964     if ev2 is None:
965         raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
966     if dev[0].p2p_dev_addr() not in ev2:
967         raise Exception("Unexpected peer (2)")
968
969     if p2ps_wildcard not in ev1 + ev2:
970         raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
971     if "org.foo.service" not in ev1 + ev2:
972         raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
973
974     if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
975         raise Exception("P2P_STOP_FIND failed")
976     dev[1].dump_monitor()
977
978     res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
979     if res is None:
980         raise Exception("Unable to remove the advertisement instance")
981
982     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
983         raise Exception("Failed on P2P_FIND command")
984
985     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
986     if ev1 is None:
987         raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
988     if dev[0].p2p_dev_addr() not in ev1:
989         raise Exception("Unexpected peer")
990     if p2ps_wildcard not in ev1:
991         raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
992     dev[1].dump_monitor()
993
994     res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
995     if res is None:
996         raise Exception("Unable to remove the advertisement instance 2")
997
998     if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
999         raise Exception("Failed on P2P_FIND command")
1000
1001     ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
1002     if ev1 is not None:
1003         raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
1004     dev[1].p2p_stop_find()
1005     dev[1].dump_monitor()
1006
1007 def test_p2ps_many_services_in_probe(dev):
1008     """P2PS with large number of services in Probe Request/Response"""
1009     long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
1010     long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
1011     long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
1012     long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
1013     long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
1014     for name in [ long1, long2, long3, long4, long5 ]:
1015         p2ps_advertise(r_dev=dev[0], r_role='1',
1016                        svc_name=name,
1017                        srv_info='I can do stuff')
1018
1019     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)):
1020         raise Exception("Failed on P2P_FIND command")
1021
1022     events = ""
1023     # Note: Require only four events since all the services do not fit within
1024     # the length limit.
1025     for i in range(4):
1026         ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1027         if ev is None:
1028             raise Exception("Missing P2P-DEVICE-FOUND")
1029         events = events + ev
1030     dev[1].p2p_stop_find()
1031     dev[1].dump_monitor()
1032     for name in [ long2, long3, long4, long5 ]:
1033         if name not in events:
1034             raise Exception("Service missing from peer events")
1035
1036 def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role,
1037                                      result):
1038     p2ps_advertise(r_dev=dev[0], r_role=adv_role,
1039                    svc_name='org.wi-fi.wfds.send.rx',
1040                    srv_info='I can receive files upto size 2 GB', cpt=adv_cpt)
1041     [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1042                                               svc_name='org.wi-fi.wfds.send.rx',
1043                                               srv_info='2 GB')
1044     auto_accept = adv_role != "0"
1045     ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id,
1046                                    auto_accept=auto_accept, adv_cpt=adv_cpt,
1047                                    seeker_cpt=seeker_cpt, method="8")
1048
1049     status0, fcap0 = p2ps_parse_event(ev0, "status", "feature_cap")
1050     status1, fcap1 = p2ps_parse_event(ev0, "status", "feature_cap")
1051
1052     if fcap0 is None:
1053         raise Exception("Bad feature capability on Seeker side")
1054     if fcap1 is None:
1055         raise Exception("Bad feature capability on Advertiser side")
1056     if fcap0 != fcap1:
1057         raise Exception("Incompatible feature capability values")
1058
1059     if status0 not in ("0", "12") or status1 not in ("0", "12"):
1060         raise Exception("Unexpected PD result status")
1061
1062     if result == "UDP" and fcap0[1] != "1":
1063         raise Exception("Unexpected CPT feature capability value (expected: UDP)")
1064     elif result == "MAC" and fcap0[1] != "2":
1065         raise Exception("Unexpected CPT feature capability value (expected: MAC)")
1066
1067     ev = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1068     if ev is None:
1069         raise Exception("Unable to remove the advertisement instance")
1070
1071 @remote_compatible
1072 def test_p2ps_feature_capability_mac_autoaccept(dev):
1073     """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept"""
1074     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1075                                      adv_role="4", result="MAC")
1076
1077 @remote_compatible
1078 def test_p2ps_feature_capability_mac_nonautoaccept(dev):
1079     """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept"""
1080     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1081                                      adv_role="0", result="MAC")
1082
1083 @remote_compatible
1084 def test_p2ps_feature_capability_mac_udp_autoaccept(dev):
1085     """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept"""
1086     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1087                                      seeker_cpt="UDP:MAC", adv_role="2",
1088                                      result="MAC")
1089
1090 @remote_compatible
1091 def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev):
1092     """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept"""
1093     p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1094                                      seeker_cpt="UDP:MAC", adv_role="0",
1095                                      result="UDP")
1096
1097 @remote_compatible
1098 def test_p2ps_feature_capability_udp_mac_autoaccept(dev):
1099     """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept"""
1100     p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1101                                      seeker_cpt="MAC:UDP", adv_role="2",
1102                                      result="UDP")
1103
1104 @remote_compatible
1105 def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev):
1106     """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP,  nonautoaccept"""
1107     p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1108                                      seeker_cpt="MAC:UDP", adv_role="0",
1109                                      result="MAC")
1110
1111 def test_p2ps_channel_one_connected(dev, apdev):
1112     """P2PS connection with P2PS method - one of the stations connected"""
1113     set_no_group_iface(dev[0], 0)
1114     set_no_group_iface(dev[1], 0)
1115
1116     try:
1117         hapd = hostapd.add_ap(apdev[0],
1118                               { "ssid": 'bss-2.4ghz', "channel": '7' })
1119         dev[1].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2442")
1120
1121         (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev, keep_group=True, join_extra=" freq=2442")
1122         freq = dev[0].get_group_status_field('freq')
1123
1124         if freq != '2442':
1125             raise Exception('Unexpected frequency for group 2442 != ' + freq)
1126     finally:
1127         remove_group(dev[0], dev[1])
1128         dev[0].global_request("P2P_SERVICE_DEL asp all")
1129
1130 def set_random_listen_chan(dev):
1131     chan = random.randrange(0, 3) * 5 + 1
1132     dev.global_request("P2P_SET listen_channel %d" % chan)
1133
1134 def test_p2ps_channel_both_connected_same(dev, apdev):
1135     """P2PS connection with P2PS method - stations connected on same channel"""
1136     set_no_group_iface(dev[2], 0)
1137     set_no_group_iface(dev[1], 0)
1138
1139     dev[2].global_request("P2P_SET listen_channel 6")
1140     dev[1].global_request("P2P_SET listen_channel 6")
1141
1142     dev[1].flush_scan_cache()
1143     dev[2].flush_scan_cache()
1144
1145     try:
1146         hapd = hostapd.add_ap(apdev[0],
1147                               { "ssid": 'bss-2.4ghz', "channel": '6' })
1148
1149         dev[2].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2437")
1150         dev[1].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2437")
1151
1152         tmpdev = [ dev[2], dev[1] ]
1153         (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(tmpdev, keep_group=True, join_extra=" freq=2437", flush=False)
1154         freq = dev[2].get_group_status_field('freq')
1155
1156         if freq != '2437':
1157             raise Exception('Unexpected frequency for group 2437 != ' + freq)
1158     finally:
1159         remove_group(dev[2], dev[1])
1160         dev[2].global_request("P2P_SERVICE_DEL asp all")
1161         for i in range(1, 3):
1162             set_random_listen_chan(dev[i])
1163
1164 def disconnect_handler(seeker, advertiser):
1165     advertiser.request("DISCONNECT")
1166     advertiser.wait_disconnected(timeout=1)
1167
1168 def test_p2ps_channel_both_connected_different(dev, apdev):
1169     """P2PS connection with P2PS method - stations connected on different channel"""
1170     if dev[0].get_mcc() > 1:
1171         raise HwsimSkip('Skip due to MCC being enabled')
1172
1173     set_no_group_iface(dev[0], 0)
1174     set_no_group_iface(dev[1], 0)
1175
1176     try:
1177         hapd1 = hostapd.add_ap(apdev[0],
1178                                { "ssid": 'bss-channel-3', "channel": '3' })
1179
1180         hapd2 = hostapd.add_ap(apdev[1],
1181                                { "ssid": 'bss-channel-10', "channel": '10' })
1182
1183         dev[0].connect("bss-channel-3", key_mgmt="NONE", scan_freq="2422")
1184         dev[1].connect("bss-channel-10", key_mgmt="NONE", scan_freq="2457")
1185
1186         p2ps_advertise(r_dev=dev[0], r_role='2',
1187                        svc_name='org.wi-fi.wfds.send.rx',
1188                        srv_info='I can receive files upto size 2 GB')
1189         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1190                                                   svc_name='org.wi-fi.wfds.send.rx',
1191                                                   srv_info='2 GB')
1192
1193         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1194                                   handler=disconnect_handler)
1195         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1196         freq = dev[0].get_group_status_field('freq')
1197         if freq != '2457':
1198             raise Exception('Unexpected frequency for group 2457 != ' + freq)
1199     finally:
1200         remove_group(dev[0], dev[1])
1201         dev[0].global_request("P2P_SERVICE_DEL asp all")
1202
1203 def test_p2ps_channel_both_connected_different_mcc(dev, apdev):
1204     """P2PS connection with P2PS method - stations connected on different channels with mcc"""
1205     if dev[0].get_mcc() == 1:
1206         raise HwsimSkip('Skip case due to MCC not enabled')
1207
1208     set_no_group_iface(dev[0], 0)
1209     set_no_group_iface(dev[1], 0)
1210
1211     try:
1212         hapd1 = hostapd.add_ap(apdev[0],
1213                                { "ssid": 'bss-channel-3', "channel": '3' })
1214
1215         hapd2 = hostapd.add_ap(apdev[1],
1216                                { "ssid": 'bss-channel-10', "channel": '10' })
1217
1218         dev[0].connect("bss-channel-3", key_mgmt="NONE", scan_freq="2422")
1219         dev[1].connect("bss-channel-10", key_mgmt="NONE", scan_freq="2457")
1220
1221         (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev, keep_group=True)
1222         freq = dev[0].get_group_status_field('freq')
1223
1224         if freq != '2422' and freq != '2457':
1225             raise Exception('Unexpected frequency for group =' + freq)
1226     finally:
1227         remove_group(dev[0], dev[1])
1228         dev[0].global_request("P2P_SERVICE_DEL asp all")
1229
1230 def clear_disallow_handler(seeker, advertiser):
1231     advertiser.global_request("P2P_SET disallow_freq ")
1232
1233 @remote_compatible
1234 def test_p2ps_channel_disallow_freq(dev, apdev):
1235     """P2PS connection with P2PS method - disallow freqs"""
1236     set_no_group_iface(dev[0], 0)
1237     set_no_group_iface(dev[1], 0)
1238
1239     try:
1240         dev[0].global_request("P2P_SET disallow_freq 2412-2457")
1241         dev[1].global_request("P2P_SET disallow_freq 2417-2462")
1242
1243         p2ps_advertise(r_dev=dev[0], r_role='2',
1244                        svc_name='org.wi-fi.wfds.send.rx',
1245                        srv_info='I can receive files upto size 2 GB')
1246
1247         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1248                                                   svc_name='org.wi-fi.wfds.send.rx',
1249                                                   srv_info='2 GB')
1250
1251         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1252                                   handler=clear_disallow_handler)
1253         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1254
1255         freq = dev[0].get_group_status_field('freq')
1256         if freq != '2412':
1257             raise Exception('Unexpected frequency for group 2412 != ' + freq)
1258     finally:
1259         remove_group(dev[0], dev[1])
1260         dev[0].global_request("P2P_SERVICE_DEL asp all")
1261         dev[0].global_request("P2P_SET disallow_freq ")
1262         dev[1].global_request("P2P_SET disallow_freq ")
1263
1264 def test_p2ps_channel_sta_connected_disallow_freq(dev, apdev):
1265     """P2PS connection with P2PS method - one station and disallow freqs"""
1266     if dev[0].get_mcc() > 1:
1267         raise HwsimSkip('Skip due to MCC being enabled')
1268
1269     set_no_group_iface(dev[0], 0)
1270     set_no_group_iface(dev[1], 0)
1271
1272     try:
1273         dev[0].global_request("P2P_SET disallow_freq 2437")
1274         hapd = hostapd.add_ap(apdev[0],
1275                               { "ssid": 'bss-channel-6', "channel": '6' })
1276
1277         dev[1].connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1278
1279         p2ps_advertise(r_dev=dev[0], r_role='2',
1280                        svc_name='org.wi-fi.wfds.send.rx',
1281                        srv_info='I can receive files upto size 2 GB')
1282         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1283                                                   svc_name='org.wi-fi.wfds.send.rx',
1284                                                   srv_info='2 GB')
1285
1286         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1287                                   handler=clear_disallow_handler)
1288         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1289
1290         freq = dev[0].get_group_status_field('freq')
1291         if freq != '2437':
1292             raise Exception('Unexpected frequency for group 2437 != ' + freq)
1293     finally:
1294         remove_group(dev[0], dev[1])
1295         dev[0].global_request("P2P_SET disallow_freq ")
1296         dev[0].global_request("P2P_SERVICE_DEL asp all")
1297
1298 def test_p2ps_channel_sta_connected_disallow_freq_mcc(dev, apdev):
1299     """P2PS connection with P2PS method - one station and disallow freqs with mcc"""
1300     with HWSimRadio(n_channels=2) as (radio, iface):
1301         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1302         wpas.interface_add(iface)
1303
1304         if wpas.get_mcc() < 2:
1305             raise Exception("New radio does not support MCC")
1306
1307         set_no_group_iface(dev[0], 0)
1308         set_no_group_iface(wpas, 0)
1309
1310         try:
1311             dev[0].global_request("P2P_SET disallow_freq 2437")
1312             hapd1 = hostapd.add_ap(apdev[0],
1313                                    { "ssid": 'bss-channel-6', "channel": '6' })
1314
1315             wpas.connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1316
1317             tmpdev = [ dev[0], wpas ]
1318             (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(tmpdev, keep_group=True)
1319
1320             freq = dev[0].get_group_status_field('freq')
1321             if freq == '2437':
1322                 raise Exception('Unexpected frequency=2437')
1323         finally:
1324             remove_group(dev[0], wpas)
1325             dev[0].global_request("P2P_SET disallow_freq ")
1326             dev[0].global_request("P2P_SERVICE_DEL asp all")
1327
1328 @remote_compatible
1329 def test_p2ps_active_go_adv(dev, apdev):
1330     """P2PS connection with P2PS method - active GO on advertiser"""
1331     set_no_group_iface(dev[0], 0)
1332     set_no_group_iface(dev[1], 0)
1333
1334     try:
1335         # Add a P2P GO
1336         dev[0].global_request("P2P_GROUP_ADD persistent")
1337         ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1338         if ev is None:
1339             raise Exception("P2P-GROUP-STARTED timeout on " + dev[0].p2p_dev_addr())
1340
1341         dev[0].group_form_result(ev)
1342
1343         p2ps_advertise(r_dev=dev[0], r_role='4',
1344                        svc_name='org.wi-fi.wfds.send.rx',
1345                        srv_info='I can receive files upto size 2 GB')
1346         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1347                                                   svc_name='org.wi-fi.wfds.send.rx',
1348                                                   single_peer_expected=False)
1349
1350         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1351
1352         # explicitly stop find/listen as otherwise the long listen started by
1353         # the advertiser would prevent the seeker to connect with the P2P GO
1354         dev[0].p2p_stop_find()
1355         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1356     finally:
1357         remove_group(dev[0], dev[1])
1358         dev[0].global_request("P2P_SERVICE_DEL asp all")
1359
1360 @remote_compatible
1361 def test_p2ps_active_go_seeker(dev, apdev):
1362     """P2PS connection with P2PS method - active GO on seeker"""
1363     set_no_group_iface(dev[0], 0)
1364     set_no_group_iface(dev[1], 0)
1365
1366     try:
1367         # Add a P2P GO on the seeker
1368         dev[1].global_request("P2P_GROUP_ADD persistent")
1369         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1370         if ev is None:
1371             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1372
1373         res = dev[1].group_form_result(ev)
1374
1375         p2ps_advertise(r_dev=dev[0], r_role='2',
1376                        svc_name='org.wi-fi.wfds.send.rx',
1377                        srv_info='I can receive files upto size 2 GB')
1378         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1379                                                   svc_name='org.wi-fi.wfds.send.rx',
1380                                                   srv_info='2 GB')
1381
1382         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1383         p2ps_connect_pd(dev[0], dev[1], ev0, ev1,
1384                         join_extra=" freq=" + res['freq'])
1385     finally:
1386         remove_group(dev[0], dev[1])
1387         dev[0].global_request("P2P_SERVICE_DEL asp all")
1388
1389 def test_p2ps_channel_active_go_and_station_same(dev, apdev):
1390     """P2PS connection, active P2P GO and station on channel"""
1391     set_no_group_iface(dev[2], 0)
1392     set_no_group_iface(dev[1], 0)
1393
1394     dev[2].global_request("P2P_SET listen_channel 11")
1395     dev[1].global_request("P2P_SET listen_channel 11")
1396     try:
1397         hapd = hostapd.add_ap(apdev[0],
1398                               { "ssid": 'bss-channel-11', "channel": '11' })
1399
1400         dev[2].connect("bss-channel-11", key_mgmt="NONE", scan_freq="2462")
1401
1402         # Add a P2P GO on the seeker
1403         dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1404         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1405         if ev is None:
1406             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1407
1408         dev[1].group_form_result(ev)
1409
1410         p2ps_advertise(r_dev=dev[2], r_role='2',
1411                        svc_name='org.wi-fi.wfds.send.rx',
1412                        srv_info='I can receive files upto size 2 GB')
1413         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[2],
1414                                                   svc_name='org.wi-fi.wfds.send.rx',
1415                                                   srv_info='2 GB')
1416
1417         ev1, ev0 = p2ps_provision(dev[1], dev[2], adv_id)
1418         p2ps_connect_pd(dev[2], dev[1], ev0, ev1, join_extra=" freq=2462")
1419     finally:
1420         remove_group(dev[2], dev[1])
1421         dev[2].global_request("P2P_SERVICE_DEL asp all")
1422         for i in range(1, 3):
1423             set_random_listen_chan(dev[i])
1424
1425 def test_p2ps_channel_active_go_and_station_different(dev, apdev):
1426     """P2PS connection, active P2P GO and station on channel"""
1427     if dev[0].get_mcc() > 1:
1428         raise HwsimSkip('Skip due to MCC being enabled')
1429
1430     set_no_group_iface(dev[0], 0)
1431     set_no_group_iface(dev[1], 0)
1432
1433     try:
1434         hapd = hostapd.add_ap(apdev[0],
1435                               { "ssid": 'bss-channel-2', "channel": '2' })
1436
1437         dev[0].connect("bss-channel-2", key_mgmt="NONE", scan_freq="2417")
1438
1439         # Add a P2P GO on the seeker. Force the listen channel to be the same,
1440         # as extended listen will not kick as long as P2P GO is waiting for
1441         # initial connection.
1442         dev[1].global_request("P2P_SET listen_channel 11")
1443         dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1444         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1445         if ev is None:
1446             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1447
1448         dev[1].group_form_result(ev)
1449
1450         p2ps_advertise(r_dev=dev[0], r_role='2',
1451                        svc_name='org.wi-fi.wfds.send.rx',
1452                        srv_info='I can receive files upto size 2 GB')
1453         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1454                                                   svc_name='org.wi-fi.wfds.send.rx',
1455                                                   srv_info='2 GB')
1456
1457         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1458                                   handler=disconnect_handler, adv_role='2',
1459                                   seeker_role='4')
1460         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1461         freq = dev[0].get_group_status_field('freq')
1462         if freq != '2462':
1463             raise Exception('Unexpected frequency for group 2462!=' + freq)
1464     finally:
1465         dev[0].global_request("P2P_SERVICE_DEL asp all")
1466         set_random_listen_chan(dev[1])
1467
1468 @remote_compatible
1469 def test_p2ps_channel_active_go_and_station_different_mcc(dev, apdev):
1470     """P2PS connection, active P2P GO and station on channel"""
1471     if dev[0].get_mcc() == 1:
1472         raise HwsimSkip('Skip due to MCC not being enabled')
1473
1474     set_no_group_iface(dev[0], 0)
1475     set_no_group_iface(dev[1], 0)
1476
1477     try:
1478         hapd = hostapd.add_ap(apdev[0],
1479                               { "ssid": 'bss-channel-6', "channel": '6' })
1480
1481         dev[0].connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1482
1483         # Add a P2P GO on the seeker
1484         dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1485         ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1486         if ev is None:
1487             raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1488
1489         dev[1].group_form_result(ev)
1490
1491         p2ps_advertise(r_dev=dev[0], r_role='2',
1492                        svc_name='org.wi-fi.wfds.send.rx',
1493                        srv_info='I can receive files upto size 2 GB')
1494         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1495                                                   svc_name='org.wi-fi.wfds.send.rx',
1496                                                   srv_info='2 GB')
1497
1498         ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1499         p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1500     finally:
1501         remove_group(dev[0], dev[1])
1502         dev[0].request("DISCONNECT")
1503         hapd.disable()
1504         dev[0].global_request("P2P_SERVICE_DEL asp all")
1505
1506 def test_p2ps_connect_p2p_device(dev):
1507     """P2PS connection using cfg80211 P2P Device"""
1508     run_p2ps_connect_p2p_device(dev, 0)
1509
1510 def test_p2ps_connect_p2p_device_no_group_iface(dev):
1511     """P2PS connection using cfg80211 P2P Device (no separate group interface)"""
1512     run_p2ps_connect_p2p_device(dev, 1)
1513
1514 def run_p2ps_connect_p2p_device(dev, no_group_iface):
1515     with HWSimRadio(use_p2p_device=True) as (radio, iface):
1516         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1517         wpas.interface_add(iface)
1518         wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface)
1519
1520         p2ps_advertise(r_dev=dev[0], r_role='1',
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=wpas, r_dev=dev[0],
1524                                                   svc_name='org.wi-fi.wfds.send.rx',
1525                                                   srv_info='2 GB')
1526
1527         ev1, ev0 = p2ps_provision(wpas, dev[0], adv_id)
1528         p2ps_connect_pd(dev[0], wpas, ev0, ev1)
1529
1530         ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1531         if ev0 is None:
1532             raise Exception("Unable to remove the advertisement instance")
1533         remove_group(dev[0], wpas)
1534
1535 def test_p2ps_connect_p2p_device2(dev):
1536     """P2PS connection using cfg80211 P2P Device (reverse)"""
1537     run_p2ps_connect_p2p_device2(dev, 0)
1538
1539 def test_p2ps_connect_p2p_device2_no_group_iface(dev):
1540     """P2PS connection using cfg80211 P2P Device (reverse) (no separate group interface)"""
1541     run_p2ps_connect_p2p_device2(dev, 1)
1542
1543 def run_p2ps_connect_p2p_device2(dev, no_group_iface):
1544     with HWSimRadio(use_p2p_device=True) as (radio, iface):
1545         wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1546         wpas.interface_add(iface)
1547         wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface)
1548
1549         p2ps_advertise(r_dev=wpas, r_role='1',
1550                        svc_name='org.wi-fi.wfds.send.rx',
1551                        srv_info='I can receive files upto size 2 GB')
1552         [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[0], r_dev=wpas,
1553                                                   svc_name='org.wi-fi.wfds.send.rx',
1554                                                   srv_info='2 GB')
1555
1556         ev1, ev0 = p2ps_provision(dev[0], wpas, adv_id)
1557         p2ps_connect_pd(wpas, dev[0], ev0, ev1)
1558
1559         ev0 = wpas.global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1560         if ev0 is None:
1561             raise Exception("Unable to remove the advertisement instance")
1562         remove_group(wpas, dev[0])
1563
1564 @remote_compatible
1565 def test_p2ps_connect_p2ps_method_no_pin(dev):
1566     """P2P group formation using P2PS method without specifying PIN"""
1567     dev[0].p2p_listen()
1568     dev[1].p2p_go_neg_auth(dev[0].p2p_dev_addr(), None, "p2ps", go_intent=15)
1569     dev[1].p2p_listen()
1570     i_res = dev[0].p2p_go_neg_init(dev[1].p2p_dev_addr(), None, "p2ps",
1571                                    timeout=20, go_intent=0)
1572     r_res = dev[1].p2p_go_neg_auth_result()
1573     logger.debug("i_res: " + str(i_res))
1574     logger.debug("r_res: " + str(r_res))
1575     check_grpform_results(i_res, r_res)
1576     remove_group(dev[0], dev[1])