]>
git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_p2ps.py
2 # Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
7 from remotehost
import remote_compatible
9 logger
= logging
.getLogger()
15 from wpasupplicant
import WpaSupplicant
17 from p2p_utils
import *
18 from utils
import HwsimSkip
19 from hwsim
import HWSimRadio
21 # Dev[0] -> Advertiser
23 # ev0 -> Event generated at advertiser side
24 # ev1 -> Event generated at Seeker side
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:]
31 cpt_param
= (" cpt=" + cpt
) if cpt
is not None else ""
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")
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")
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")
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")
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
+ "'")
58 raise Exception("Failed to add Service Discovery request for exact seek request")
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")
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
:
68 ev1
= i_dev
.wait_global_event(["P2P-DEVICE-FOUND"], timeout
=10)
70 if timeout
< time
.time():
71 raise Exception("Device not found")
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")
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")
84 ev1
= i_dev
.wait_global_event(["P2P-SERV-ASP-RESP"], timeout
=10)
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")
97 return [adv_id
, rcvd_svc_name
]
99 def p2ps_nonexact_seek(i_dev
, r_dev
, svc_name
, srv_info
=None, adv_num
=None):
100 """P2PS nonexact service seek request"""
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
+ "'")
106 ev1
= i_dev
.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name
+ " '")
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)
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")
117 for i
in range(0, adv_num
):
118 ev1
= i_dev
.wait_global_event(["P2P-SERV-ASP-RESP"], timeout
=10)
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
]))
129 i_dev
.p2p_stop_find()
132 def p2ps_parse_event(ev
, *args
):
135 m
= re
.search("\s+" + arg
+ r
"=(\S+)", ev
)
136 ret
+= (m
.group(1) if m
is not None else None,)
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,
142 addr0
= seeker
.p2p_dev_addr()
143 addr1
= advertiser
.p2p_dev_addr()
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
,
149 if not auto_accept
or method
== "100":
151 ev_pd_start
= advertiser
.wait_global_event(["P2PS-PROV-START"],
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")
159 ev
= seeker
.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout
=10)
161 raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
164 handler(seeker
, advertiser
)
166 # Put seeker into a listen state, since we expect the deferred flow to
168 seeker
.p2p_ext_listen(500, 500)
171 ev
= advertiser
.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
174 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
176 raise Exception("Unknown peer " + addr0
)
177 ev
= seeker
.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
180 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
182 raise Exception("Unknown peer " + addr1
)
185 ev
= advertiser
.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
188 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
190 raise Exception("Unknown peer " + addr0
)
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()
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
)
203 ev1
= seeker
.wait_global_event(["P2PS-PROV-DONE"], timeout
=10)
205 raise Exception("P2PS-PROV-DONE timeout on seeker side")
207 ev2
= advertiser
.wait_global_event(["P2PS-PROV-DONE"], timeout
=10)
209 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
212 ev
= seeker
.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
215 raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
217 raise Exception("Unknown peer " + addr1
)
219 seeker
.p2p_cancel_ext_listen()
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)
227 raise Exception("P2PS-PROV-DONE timeout on seeker side")
229 ev2
= advertiser
.wait_global_event(["P2PS-PROV-DONE"], timeout
=10)
231 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
234 ev
= seeker
.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout
=10)
236 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
238 raise Exception("Unknown peer " + addr1
)
239 ev
= advertiser
.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
242 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
244 raise Exception("Unknown peer " + addr0
)
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")
259 if status0
!= "0" and status0
!= "12":
260 raise Exception("PD failed on " + dev0
.p2p_dev_addr())
262 if status1
!= "0" and status1
!= "12":
263 raise Exception("PD failed on " + dev1
.p2p_dev_addr())
265 if status0
== "12" and status1
== "12":
266 raise Exception("Both sides have status 12 which doesn't make sense")
268 if adv_id0
!= adv_id1
or adv_id0
is None:
269 raise Exception("Adv. IDs don't match")
271 if adv_mac0
!= adv_mac1
or adv_mac0
is None:
272 raise Exception("Adv. MACs don't match")
274 if session0
!= session1
or session0
is None:
275 raise Exception("Session IDs don't match")
277 if mac0
!= mac1
or mac0
is None:
278 raise Exception("Session MACs don't match")
280 #TODO: Validate feature capability
282 if bool(persist0
) != bool(persist1
):
283 raise Exception("Only one peer has persistent group")
285 if persist0
is None and not all([conncap0
, conncap1
, dev_passwd_id0
,
287 raise Exception("Persistent group not used but conncap/dev_passwd_id are missing")
289 if persist0
is not None and any([conncap0
, conncap1
, dev_passwd_id0
,
291 raise Exception("Persistent group is used but conncap/dev_passwd_id are present")
293 # Persistent Connection (todo: handle frequency)
294 if persist0
is not None:
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)
300 raise Exception("P2P-GROUP-STARTED timeout on " + dev0
.p2p_dev_addr())
301 dev0
.group_form_result(ev0
)
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)
307 raise Exception("P2P-GROUP-STARTED timeout on " + dev1
.p2p_dev_addr())
308 dev1
.group_form_result(ev1
)
310 ev
= dev0
.wait_global_event(["AP-STA-CONNECTED"], timeout
=10)
312 raise Exception("AP-STA-CONNECTED timeout on " + dev0
.p2p_dev_addr())
314 ev
= dev1
.wait_global_event(["AP-STA-CONNECTED"], timeout
=10)
316 raise Exception("AP-STA-CONNECTED timeout on " + dev1
.p2p_dev_addr())
319 method0
= conf_methods_map
[dev_passwd_id0
]
320 method1
= conf_methods_map
[dev_passwd_id1
]
322 raise Exception("Unsupported method")
324 if method0
== "p2ps":
327 raise Exception("Pin is not provided")
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")
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)
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)
342 raise Exception("GO Neg did not succeed on " + dev1
.p2p_dev_addr())
343 ev
= dev0
.wait_global_event(["P2P-GROUP-STARTED"], timeout
=10)
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)
349 raise Exception("P2P-GROUP-STARTED timeout on " + dev1
.p2p_dev_addr())
350 dev1
.group_form_result(ev
)
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
357 raise Exception("Bad connection capabilities")
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")
364 if not dev_go
.get_group_ifname().startswith('p2p-'):
368 ev
= dev_go
.wait_global_event(["P2P-GROUP-STARTED"],
371 raise Exception("P2P-GROUP-STARTED timeout on " + dev_go
.p2p_dev_addr())
372 dev_go
.group_form_result(ev
)
374 if go_method
!= "p2ps":
375 ev
= dev_go
.group_request("WPS_PIN any " + pin
)
377 raise Exception("Failed to initiate pin authorization on registrar side")
379 group_ssid_txt
= " ssid=" + join_ssid
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)
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)
390 raise Exception("AP-STA-CONNECTED timeout on " + dev_go
.p2p_dev_addr())
392 hwsim_utils
.test_connectivity_p2p(dev0
, dev1
)
394 def set_no_group_iface(dev
, 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")
401 dev
.global_request("SET p2p_no_group_iface 0")
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')
411 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
413 raise Exception("Unable to remove the advertisement instance")
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',
424 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
426 raise Exception("Unable to remove the advertisement instance")
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]
437 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
439 raise Exception("Unable to remove the advertisement instance")
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*',
449 adv_id
= ev_list
[0].split()[0]
450 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
452 raise Exception("Unable to remove the advertisement instance")
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*',
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
)
466 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
468 raise Exception("Unable to remove the advertisement instance")
469 remove_group(dev
[0], dev
[1])
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',
480 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
)
481 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
483 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
485 raise Exception("Unable to remove the advertisement instance")
486 remove_group(dev
[0], dev
[1])
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*',
496 adv_id
= ev_list
[0].split()[0]
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
)
501 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
503 raise Exception("Unable to remove the advertisement instance")
504 remove_group(dev
[0], dev
[1])
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]
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
)
518 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
520 raise Exception("Unable to remove the advertisement instance")
521 remove_group(dev
[0], dev
[1])
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',
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
)
535 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
537 raise Exception("Unable to remove the advertisement instance")
538 remove_group(dev
[0], dev
[1])
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',
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
)
552 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
554 raise Exception("Unable to remove the advertisement instance")
555 remove_group(dev
[0], dev
[1])
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',
566 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
)
567 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
569 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
571 raise Exception("Unable to remove the advertisement instance")
572 remove_group(dev
[0], dev
[1])
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',
585 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
)
586 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
588 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
590 raise Exception("Unable to remove the advertisement instance")
591 remove_group(dev
[0], dev
[1])
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',
602 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
)
603 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
605 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
607 raise Exception("Unable to remove the advertisement instance")
608 remove_group(dev
[0], dev
[1])
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',
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
)
620 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
622 raise Exception("Unable to remove the advertisement instance")
623 remove_group(dev
[0], dev
[1])
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
)
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',
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
)
643 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
645 raise Exception("Unable to remove the advertisement instance")
646 remove_group(dev
[0], dev
[1])
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')
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)
672 raise Exception("P2P Device Found timed out")
674 raise Exception("Unexpected service discovery request source")
676 for i
in range(0, 3):
677 ev
= dev
[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout
=10)
679 raise Exception("P2P Service discovery timed out")
682 if len(ev_list
) == 3:
684 dev
[1].p2p_stop_find()
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])
696 ev
= dev
[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=1)
698 raise Exception("Unexpected device found: " + ev
)
700 ev
= dev
[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=10)
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")
708 dev
[0].p2p_stop_find()
710 ev1
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1
))
712 raise Exception("Unable to remove the advertisement instance")
713 ev2
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2
))
715 raise Exception("Unable to remove the advertisement instance")
716 ev3
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3
))
718 raise Exception("Unable to remove the advertisement instance")
719 ev4
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4
))
721 raise Exception("Unable to remove the advertisement instance")
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")
739 with
open('/proc/net/dev', 'r') as f
:
742 for line
in data
.splitlines():
743 ifname
= line
.strip().split(' ')[0]
744 if ':' not in ifname
:
746 ifname
= ifname
.split(':')[0]
747 ifnames
.append(ifname
)
750 def p2ps_connect_p2ps_method(dev
, keep_group
=False, join_extra
="", flush
=True):
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',
759 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
)
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)
766 raise Exception("P2P-GROUP-STARTED timeout on dev1")
767 res
= dev
[1].group_form_result(go_ev
)
769 join_extra
= " freq=" + res
['freq']
771 ifnames
= get_ifnames()
772 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
, join_extra
=join_extra
,
775 grp_ifname0
= dev
[0].get_group_ifname()
776 grp_ifname1
= dev
[1].get_group_ifname()
778 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
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()
785 return grp_ifname0
, grp_ifname1
, ifnames
787 def has_string_prefix(vals
, prefix
):
789 if val
.startswith(prefix
):
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)
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")
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)
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")
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)
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")
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)
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
)
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()
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',
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")
861 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
862 remove_group(dev
[0], dev
[1])
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()
871 # Drop the first persistent group on dev[1] and form new persistent groups
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()
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]")
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',
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")
895 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
896 remove_group(dev
[0], dev
[1])
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)")
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()
910 # Drop the first persistent group on dev[1] and form new persistent groups
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()
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]")
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',
930 ev0
, ev1
= p2ps_provision(dev
[0], dev
[1], adv_id
)
931 # This hits persistent group removal on dev[0] (P2P Client)
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]")
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()
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)")
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',
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")
961 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
962 remove_group(dev
[0], dev
[1])
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)")
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()
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',
982 dev
[0].global_request("P2P_FLUSH")
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")
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()
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',
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)
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)
1012 ev
= dev
[1].wait_global_event(["P2PS-PROV-DONE"], timeout
=10)
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")
1020 ev
= dev
[0].wait_global_event(["P2PS-PROV-DONE"], timeout
=10)
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")
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])
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])
1048 def test_p2ps_wildcard_p2ps(dev
):
1049 """P2PS wildcard SD Probe Request/Response"""
1050 p2ps_wildcard
= "org.wi-fi.wfds"
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')
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")
1062 ev1
= dev
[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=10)
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")
1068 ev2
= dev
[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=10)
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)")
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")
1079 if "OK" not in dev
[1].global_request("P2P_STOP_FIND"):
1080 raise Exception("P2P_STOP_FIND failed")
1081 dev
[1].dump_monitor()
1083 res
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
1085 raise Exception("Unable to remove the advertisement instance")
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")
1090 ev1
= dev
[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=10)
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()
1099 res
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2
))
1101 raise Exception("Unable to remove the advertisement instance 2")
1103 dev
[1].p2p_stop_find()
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")
1108 ev1
= dev
[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=2)
1110 raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
1111 dev
[1].p2p_stop_find()
1112 dev
[1].dump_monitor()
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',
1124 srv_info
='I can do stuff')
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")
1130 # Note: Require only four events since all the services do not fit within
1133 ev
= dev
[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout
=10)
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")
1143 def p2ps_test_feature_capability_cpt(dev
, adv_cpt
, seeker_cpt
, adv_role
,
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',
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")
1156 status0
, fcap0
= p2ps_parse_event(ev0
, "status", "feature_cap")
1157 status1
, fcap1
= p2ps_parse_event(ev0
, "status", "feature_cap")
1160 raise Exception("Bad feature capability on Seeker side")
1162 raise Exception("Bad feature capability on Advertiser side")
1164 raise Exception("Incompatible feature capability values")
1166 if status0
not in ("0", "12") or status1
not in ("0", "12"):
1167 raise Exception("Unexpected PD result status")
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)")
1174 ev
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
1176 raise Exception("Unable to remove the advertisement instance")
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")
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")
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",
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",
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",
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",
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)
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")
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')
1232 raise Exception('Unexpected frequency for group 2442 != ' + freq
)
1234 dev
[0].global_request("P2P_SERVICE_DEL asp all")
1235 remove_group(dev
[0], dev
[1])
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
)
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)
1246 dev
[2].global_request("P2P_SET listen_channel 6")
1247 dev
[1].global_request("P2P_SET listen_channel 6")
1249 dev
[1].flush_scan_cache()
1250 dev
[2].flush_scan_cache()
1253 hapd
= hostapd
.add_ap(apdev
[0],
1254 {"ssid": 'bss-2.4ghz', "channel": '6'})
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")
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')
1264 raise Exception('Unexpected frequency for group 2437 != ' + freq
)
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])
1271 def disconnect_handler(seeker
, advertiser
):
1272 advertiser
.request("DISCONNECT")
1273 advertiser
.wait_disconnected(timeout
=1)
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')
1280 set_no_group_iface(dev
[0], 0)
1281 set_no_group_iface(dev
[1], 0)
1284 hapd1
= hostapd
.add_ap(apdev
[0],
1285 {"ssid": 'bss-channel-3', "channel": '3'})
1287 hapd2
= hostapd
.add_ap(apdev
[1],
1288 {"ssid": 'bss-channel-10', "channel": '10'})
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")
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',
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')
1305 raise Exception('Unexpected frequency for group 2457 != ' + freq
)
1307 dev
[0].global_request("P2P_SERVICE_DEL asp all")
1308 remove_group(dev
[0], dev
[1])
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
)
1316 set_no_group_iface(wpas
, 0)
1317 set_no_group_iface(dev
[1], 0)
1320 hapd1
= hostapd
.add_ap(apdev
[0],
1321 {"ssid": 'bss-channel-3', "channel": '3'})
1323 hapd2
= hostapd
.add_ap(apdev
[1],
1324 {"ssid": 'bss-channel-10', "channel": '10'})
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")
1329 (grp_ifname0
, grp_ifname1
, ifnames
) = p2ps_connect_p2ps_method([wpas
, dev
[1]], keep_group
=True)
1330 freq
= wpas
.get_group_status_field('freq')
1332 if freq
!= '2422' and freq
!= '2457':
1333 raise Exception('Unexpected frequency for group =' + freq
)
1335 wpas
.global_request("P2P_SERVICE_DEL asp all")
1336 remove_group(wpas
, dev
[1])
1338 def clear_disallow_handler(seeker
, advertiser
):
1339 advertiser
.global_request("P2P_SET disallow_freq ")
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)
1348 dev
[0].global_request("P2P_SET disallow_freq 2412-2457")
1349 dev
[1].global_request("P2P_SET disallow_freq 2417-2462")
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')
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',
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
)
1363 freq
= dev
[0].get_group_status_field('freq')
1365 raise Exception('Unexpected frequency for group 2412 != ' + freq
)
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])
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')
1377 set_no_group_iface(dev
[0], 0)
1378 set_no_group_iface(dev
[1], 0)
1381 dev
[0].global_request("P2P_SET disallow_freq 2437")
1382 hapd
= hostapd
.add_ap(apdev
[0],
1383 {"ssid": 'bss-channel-6', "channel": '6'})
1385 dev
[1].connect("bss-channel-6", key_mgmt
="NONE", scan_freq
="2437")
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',
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
)
1398 freq
= dev
[0].get_group_status_field('freq')
1400 raise Exception('Unexpected frequency for group 2437 != ' + freq
)
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])
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
)
1412 if wpas
.get_mcc() < 2:
1413 raise Exception("New radio does not support MCC")
1415 set_no_group_iface(dev
[0], 0)
1416 set_no_group_iface(wpas
, 0)
1419 dev
[0].global_request("P2P_SET disallow_freq 2437")
1420 hapd1
= hostapd
.add_ap(apdev
[0],
1421 {"ssid": 'bss-channel-6', "channel": '6'})
1423 wpas
.connect("bss-channel-6", key_mgmt
="NONE", scan_freq
="2437")
1425 tmpdev
= [dev
[0], wpas
]
1426 (grp_ifname0
, grp_ifname1
, ifnames
) = p2ps_connect_p2ps_method(tmpdev
, keep_group
=True)
1428 freq
= dev
[0].get_group_status_field('freq')
1430 raise Exception('Unexpected frequency=2437')
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
)
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)
1444 dev
[0].global_request("P2P_GROUP_ADD persistent")
1445 ev
= dev
[0].wait_global_event(["P2P-GROUP-STARTED"], timeout
=10)
1447 raise Exception("P2P-GROUP-STARTED timeout on " + dev
[0].p2p_dev_addr())
1449 dev
[0].group_form_result(ev
)
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)
1458 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
)
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
)
1465 dev
[0].global_request("P2P_SERVICE_DEL asp all")
1466 remove_group(dev
[0], dev
[1])
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)
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)
1479 raise Exception("P2P-GROUP-STARTED timeout on " + dev
[1].p2p_dev_addr())
1481 res
= dev
[1].group_form_result(ev
)
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',
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'])
1494 dev
[0].global_request("P2P_SERVICE_DEL asp all")
1495 remove_group(dev
[0], dev
[1])
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)
1502 dev
[2].global_request("P2P_SET listen_channel 11")
1503 dev
[1].global_request("P2P_SET listen_channel 11")
1505 hapd
= hostapd
.add_ap(apdev
[0],
1506 {"ssid": 'bss-channel-11', "channel": '11'})
1508 dev
[2].connect("bss-channel-11", key_mgmt
="NONE", scan_freq
="2462")
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)
1514 raise Exception("P2P-GROUP-STARTED timeout on " + dev
[1].p2p_dev_addr())
1516 dev
[1].group_form_result(ev
)
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',
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")
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])
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')
1538 set_no_group_iface(dev
[0], 0)
1539 set_no_group_iface(dev
[1], 0)
1542 hapd
= hostapd
.add_ap(apdev
[0],
1543 {"ssid": 'bss-channel-2', "channel": '2'})
1545 dev
[0].connect("bss-channel-2", key_mgmt
="NONE", scan_freq
="2417")
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)
1554 raise Exception("P2P-GROUP-STARTED timeout on " + dev
[1].p2p_dev_addr())
1556 dev
[1].group_form_result(ev
)
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',
1565 ev1
, ev0
= p2ps_provision(dev
[1], dev
[0], adv_id
, auto_accept
=False,
1566 handler
=disconnect_handler
, adv_role
='2',
1568 p2ps_connect_pd(dev
[0], dev
[1], ev0
, ev1
)
1569 freq
= dev
[0].get_group_status_field('freq')
1571 raise Exception('Unexpected frequency for group 2462!=' + freq
)
1573 dev
[0].global_request("P2P_SERVICE_DEL asp all")
1574 set_random_listen_chan(dev
[1])
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
)
1583 set_no_group_iface(wpas
, 0)
1584 set_no_group_iface(dev
[1], 0)
1587 hapd
= hostapd
.add_ap(apdev
[0],
1588 {"ssid": 'bss-channel-6', "channel": '6'})
1590 wpas
.global_request("P2P_SET listen_channel 1")
1591 wpas
.connect("bss-channel-6", key_mgmt
="NONE", scan_freq
="2437")
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)
1598 raise Exception("P2P-GROUP-STARTED timeout on " + dev
[1].p2p_dev_addr())
1600 dev
[1].group_form_result(ev
)
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',
1609 ev1
, ev0
= p2ps_provision(dev
[1], wpas
, adv_id
)
1610 p2ps_connect_pd(wpas
, dev
[1], ev0
, ev1
)
1612 set_random_listen_chan(dev
[1])
1613 set_random_listen_chan(wpas
)
1614 wpas
.request("DISCONNECT")
1616 wpas
.global_request("P2P_SERVICE_DEL asp all")
1617 remove_group(wpas
, dev
[1], allow_failure
=True)
1619 def test_p2ps_connect_p2p_device(dev
):
1620 """P2PS connection using cfg80211 P2P Device"""
1621 run_p2ps_connect_p2p_device(dev
, 0)
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)
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
)
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',
1640 ev1
, ev0
= p2ps_provision(wpas
, dev
[0], adv_id
)
1641 p2ps_connect_pd(dev
[0], wpas
, ev0
, ev1
)
1643 ev0
= dev
[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
1645 raise Exception("Unable to remove the advertisement instance")
1646 remove_group(dev
[0], wpas
)
1648 def test_p2ps_connect_p2p_device2(dev
):
1649 """P2PS connection using cfg80211 P2P Device (reverse)"""
1650 run_p2ps_connect_p2p_device2(dev
, 0)
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)
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
)
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',
1669 ev1
, ev0
= p2ps_provision(dev
[0], wpas
, adv_id
)
1670 p2ps_connect_pd(wpas
, dev
[0], ev0
, ev1
)
1672 ev0
= wpas
.global_request("P2P_SERVICE_DEL asp " + str(adv_id
))
1674 raise Exception("Unable to remove the advertisement instance")
1675 remove_group(wpas
, dev
[0])
1678 def test_p2ps_connect_p2ps_method_no_pin(dev
):
1679 """P2P group formation using P2PS method without specifying PIN"""
1681 dev
[1].p2p_go_neg_auth(dev
[0].p2p_dev_addr(), None, "p2ps", go_intent
=15)
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])