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