1# Test cases for Wi-Fi Direct R2 features like unsynchronized service discovery
2# (P2P USD), Bootstrapping and Pairing.
3# Copyright (c) 2024, Qualcomm Innovation Center, Inc.
4#
5# This software may be distributed under the terms of the BSD license.
6# See README for more details.
7
8import binascii
9import logging
10
11from hwsim import HWSimRadio
12
13logger = logging.getLogger()
14import os
15import hwsim_utils
16
17from wpasupplicant import WpaSupplicant
18from test_nan_usd import check_nan_usd_capab
19from test_pasn import check_pasn_capab
20
21def check_p2p2_capab(dev):
22    check_nan_usd_capab(dev)
23    check_pasn_capab(dev)
24    res = dev.request("GET_CAPABILITY p2p2")
25    if res is None or "not supported" in res:
26        raise HwsimSkip("P2P2 not supported")
27    res = dev.request("GET_CAPABILITY pcc_mode")
28    if res is None or "not supported" in res:
29        raise HwsimSkip("PCC mode not supported")
30
31def set_p2p2_configs(dev):
32    dev.global_request("P2P_SET pasn_type 3")
33    dev.global_request("P2P_SET supported_bootstrapmethods 6")
34    dev.global_request("P2P_SET pairing_setup 1")
35    dev.global_request("P2P_SET pairing_cache 1")
36
37def test_p2p_usd_publish_invalid_param(dev):
38    """P2P USD Publish with invalid parameters"""
39    check_p2p2_capab(dev[0])
40
41    # Both solicited and unsolicited disabled is invalid
42    cmd = "NAN_PUBLISH service_name=_test solicited=0 unsolicited=0 p2p=1"
43    id0 = dev[0].global_request(cmd)
44    if "FAIL" not in id0:
45        raise Exception("NAN_PUBLISH accepts both solicited=0 and unsolicited=0 with p2p=1")
46
47def test_p2p_usd_publish(dev, apdev):
48    """P2P USD Publish"""
49    check_p2p2_capab(dev[0])
50    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 p2p=1"
51    id0 = dev[0].global_request(cmd)
52    if "FAIL" in id0:
53        raise Exception("NAN_PUBLISH for P2P failed")
54
55    cmd = "NAN_UPDATE_PUBLISH publish_id=" + id0 + " ssi=1122334455"
56    if "FAIL" in dev[0].global_request(cmd):
57        raise Exception("NAN_UPDATE_PUBLISH for P2P failed")
58
59    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id0
60    if "FAIL" in dev[0].global_request(cmd):
61        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
62
63    ev = dev[0].wait_global_event(["NAN-PUBLISH-TERMINATED"], timeout=1)
64    if ev is None:
65        raise Exception("PublishTerminated event not seen")
66    if "publish_id=" + id0 not in ev:
67        raise Exception("Unexpected publish_id: " + ev)
68    if "reason=user-request" not in ev:
69        raise Exception("Unexpected reason: " + ev)
70
71    cmd = "NAN_PUBLISH service_name=_test p2p=1"
72    count = 0
73    for i in range(256):
74        if "FAIL" in dev[0].global_request(cmd):
75            break
76        count += 1
77    logger.info("Maximum services: %d" % count)
78    for i in range(count):
79        cmd = "NAN_CANCEL_PUBLISH publish_id=%s" % (i + 1)
80        if "FAIL" in dev[0].global_request(cmd):
81            raise Exception("NAN_CANCEL_PUBLISH failed")
82
83        ev = dev[0].wait_global_event(["NAN-PUBLISH-TERMINATED"], timeout=1)
84        if ev is None:
85            raise Exception("PublishTerminated event not seen")
86
87def test_p2p_usd_subscribe(dev, apdev):
88    """P2P USD Subscribe"""
89    check_p2p2_capab(dev[0])
90    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 p2p=1"
91    id0 = dev[0].global_request(cmd)
92    if "FAIL" in id0:
93        raise Exception("NAN_SUBSCRIBE for P2P failed")
94
95    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
96    if "FAIL" in dev[0].global_request(cmd):
97        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
98
99    ev = dev[0].wait_global_event(["NAN-SUBSCRIBE-TERMINATED"], timeout=1)
100    if ev is None:
101        raise Exception("SubscribeTerminated event not seen")
102    if "subscribe_id=" + id0 not in ev:
103        raise Exception("Unexpected subscribe_id: " + ev)
104    if "reason=user-request" not in ev:
105        raise Exception("Unexpected reason: " + ev)
106
107def test_p2p_usd_match(dev, apdev):
108    """P2P USD Publish/Subscribe match"""
109    check_p2p2_capab(dev[0])
110    check_p2p2_capab(dev[1])
111    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 p2p=1"
112    id0 = dev[0].global_request(cmd)
113    if "FAIL" in id0:
114        raise Exception("NAN_SUBSCRIBE for P2P failed")
115
116    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=5 p2p=1"
117    id1 = dev[1].global_request(cmd)
118    if "FAIL" in id1:
119        raise Exception("NAN_PUBLISH for P2P failed")
120
121    ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
122    if ev is None:
123        raise Exception("Peer not found")
124    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
125    if ev is None:
126        raise Exception("Peer not found")
127
128    ev = dev[0].wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
129    if ev is None:
130        raise Exception("DiscoveryResult event not seen")
131    if "srv_proto_type=2" not in ev.split(' '):
132        raise Exception("Unexpected srv_proto_type: " + ev)
133    if "ssi=6677" not in ev.split(' '):
134        raise Exception("Unexpected ssi: " + ev)
135
136    dev[0].global_request("NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0)
137    dev[1].global_request("NAN_CANCEL_PUBLISH publish_id=" + id1)
138
139def run_p2p_pairing_password(dev):
140    check_p2p2_capab(dev[0])
141    check_p2p2_capab(dev[1])
142
143    set_p2p2_configs(dev[0])
144    set_p2p2_configs(dev[1])
145
146    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
147    id0 = dev[0].global_request(cmd)
148    if "FAIL" in id0:
149        raise Exception("NAN_SUBSCRIBE for P2P failed")
150
151    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
152    id1 = dev[1].global_request(cmd)
153    if "FAIL" in id1:
154        raise Exception("NAN_PUBLISH for P2P failed")
155
156    ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
157    if ev is None:
158        raise Exception("Peer not found")
159    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
160    if ev is None:
161        raise Exception("Peer not found")
162
163    ev = dev[0].wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
164    if ev is None:
165        raise Exception("DiscoveryResult event not seen")
166    if "srv_proto_type=2" not in ev.split(' '):
167        raise Exception("Unexpected srv_proto_type: " + ev)
168    if "ssi=6677" not in ev.split(' '):
169        raise Exception("Unexpected ssi: " + ev)
170
171    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
172    if "FAIL" in dev[0].global_request(cmd):
173        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
174    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id1
175    if "FAIL" in dev[1].global_request(cmd):
176        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
177
178    cmd = "P2P_CONNECT " + dev[0].p2p_dev_addr() + " pair provdisc he go_intent=15 p2p2 bstrapmethod=2 auth password=975310123 freq=2437"
179    id0 = dev[1].global_request(cmd)
180    if "FAIL" in id0:
181        raise Exception("P2P_CONNECT auth Failed")
182
183    cmd = "P2P_CONNECT " + dev[1].p2p_dev_addr() + " pair provdisc he go_intent=5 p2p2 bstrapmethod=32 password=975310123"
184    id0 = dev[0].global_request(cmd)
185    if "FAIL" in id0:
186        raise Exception("P2P_CONNECT Failed")
187
188    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
189    if ev is None:
190        raise Exception("Group formation timed out")
191    dev[0].group_form_result(ev, no_pwd=True)
192    dev[0].dump_monitor()
193
194    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
195    if ev is None:
196        raise Exception("Group formation timed out(2)")
197    dev[1].group_form_result(ev)
198
199    dev[1].remove_group()
200    dev[0].wait_go_ending_session()
201    dev[0].dump_monitor()
202
203def test_p2p_pairing_password(dev, apdev):
204    """P2P Pairing with Password"""
205    run_p2p_pairing_password(dev)
206
207def test_p2p_pairing_password_dev(dev, apdev):
208    """P2P Pairing with Password with dedicated P2P device"""
209    with HWSimRadio(use_p2p_device=True) as (radio, iface):
210        wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
211        wpas.interface_add(iface)
212        run_p2p_pairing_password([dev[0], wpas])
213
214def test_p2p_pairing_password_dev2(dev, apdev):
215    """P2P Pairing with Password with dedicated P2P device (reversed) and no group interface"""
216    with HWSimRadio(use_p2p_device=True) as (radio, iface):
217        wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
218        wpas.interface_add(iface)
219        wpas.global_request("SET p2p_no_group_iface 1")
220        run_p2p_pairing_password([wpas, dev[0]])
221
222def test_p2p_pairing_opportunistic(dev, apdev):
223    """P2P Pairing with Opportunistic"""
224    check_p2p2_capab(dev[0])
225    check_p2p2_capab(dev[1])
226
227    set_p2p2_configs(dev[0])
228    set_p2p2_configs(dev[1])
229
230    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
231    id0 = dev[0].global_request(cmd)
232    if "FAIL" in id0:
233        raise Exception("NAN_SUBSCRIBE for P2P failed")
234
235    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
236    id1 = dev[1].global_request(cmd)
237    if "FAIL" in id1:
238        raise Exception("NAN_PUBLISH for P2P failed")
239
240    ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
241    if ev is None:
242        raise Exception("Peer not found")
243    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
244    if ev is None:
245        raise Exception("Peer not found")
246
247    ev = dev[0].wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
248    if ev is None:
249        raise Exception("DiscoveryResult event not seen")
250    if "srv_proto_type=2" not in ev.split(' '):
251        raise Exception("Unexpected srv_proto_type: " + ev)
252    if "ssi=6677" not in ev.split(' '):
253        raise Exception("Unexpected ssi: " + ev)
254
255    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
256    if "FAIL" in dev[0].global_request(cmd):
257        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
258    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id1
259    if "FAIL" in dev[1].global_request(cmd):
260        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
261
262    cmd = "P2P_CONNECT " + dev[0].p2p_dev_addr() + " pair provdisc he go_intent=15 p2p2 bstrapmethod=1 auth freq=2437"
263    id0 = dev[1].global_request(cmd)
264    if "FAIL" in id0:
265        raise Exception("P2P_CONNECT auth Failed")
266
267    cmd = "P2P_CONNECT " + dev[1].p2p_dev_addr() + " pair provdisc he go_intent=5 p2p2 bstrapmethod=1"
268    id0 = dev[0].global_request(cmd)
269    if "FAIL" in id0:
270        raise Exception("P2P_CONNECT Failed")
271
272    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
273    if ev is None:
274        raise Exception("Group formation timed out")
275    #dev[0].group_form_result(ev)
276    dev[0].dump_monitor()
277
278    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
279    if ev is None:
280        raise Exception("Group formation timed out(2)")
281    dev[1].group_form_result(ev)
282    dev[1].wait_sta()
283
284    dev[1].remove_group()
285    dev[0].wait_go_ending_session()
286    dev[0].dump_monitor()
287
288def test_p2p_auto_go_and_client_join(dev, apdev):
289    """A new client joining a group using P2P Pairing/Opportunistic"""
290    check_p2p2_capab(dev[0])
291    check_p2p2_capab(dev[1])
292
293    set_p2p2_configs(dev[0])
294    set_p2p2_configs(dev[1])
295
296    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
297    id0 = dev[0].global_request(cmd)
298    if "FAIL" in id0:
299        raise Exception("NAN_SUBSCRIBE for P2P failed")
300
301    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
302    id1 = dev[1].global_request(cmd)
303    if "FAIL" in id1:
304        raise Exception("NAN_PUBLISH for P2P failed")
305
306    ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
307    if ev is None:
308        raise Exception("Peer not found")
309    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
310    if ev is None:
311        raise Exception("Peer not found")
312
313    ev = dev[0].wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
314    if ev is None:
315        raise Exception("DiscoveryResult event not seen")
316    if "srv_proto_type=2" not in ev.split(' '):
317        raise Exception("Unexpected srv_proto_type: " + ev)
318    if "ssi=6677" not in ev.split(' '):
319        raise Exception("Unexpected ssi: " + ev)
320
321    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
322    if "FAIL" in dev[0].global_request(cmd):
323        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
324    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id1
325    if "FAIL" in dev[1].global_request(cmd):
326        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
327
328    cmd = "P2P_GROUP_ADD p2p2"
329    res = dev[1].global_request(cmd)
330    if "FAIL" in res:
331        raise Exception("P2P_GROUP_ADD failed")
332
333    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
334    if ev is None:
335        raise Exception("Group formation timed out(2)")
336
337    cmd = "P2P_CONNECT " + dev[0].p2p_dev_addr() + " pair provdisc he go_intent=15 p2p2 bstrapmethod=1 join auth"
338    id0 = dev[1].global_request(cmd)
339    if "FAIL" in id0:
340        raise Exception("P2P_CONNECT auth failed")
341
342    cmd = "P2P_CONNECT " + dev[1].p2p_dev_addr() + " pair provdisc p2p2 join bstrapmethod=1"
343    id0 = dev[0].global_request(cmd)
344    if "FAIL" in id0:
345        raise Exception("P2P_CONNECT failed")
346
347    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
348    if ev is None:
349        raise Exception("Group formation timed out")
350    #dev[0].group_form_result(ev)
351    dev[0].dump_monitor()
352
353    dev[1].wait_sta()
354
355    dev[1].remove_group()
356    dev[0].wait_go_ending_session()
357    dev[0].dump_monitor()
358
359def test_p2p_auto_go_and_client_join_sae(dev, apdev):
360    """A new client joining a group using P2P Pairing/SAE"""
361    check_p2p2_capab(dev[0])
362    check_p2p2_capab(dev[1])
363
364    set_p2p2_configs(dev[0])
365    set_p2p2_configs(dev[1])
366
367    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
368    id0 = dev[0].global_request(cmd)
369    if "FAIL" in id0:
370        raise Exception("NAN_SUBSCRIBE for P2P failed")
371
372    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
373    id1 = dev[1].global_request(cmd)
374    if "FAIL" in id1:
375        raise Exception("NAN_PUBLISH for P2P failed")
376
377    ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
378    if ev is None:
379        raise Exception("Peer not found")
380    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
381    if ev is None:
382        raise Exception("Peer not found")
383
384    ev = dev[0].wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
385    if ev is None:
386        raise Exception("DiscoveryResult event not seen")
387    if "srv_proto_type=2" not in ev.split(' '):
388        raise Exception("Unexpected srv_proto_type: " + ev)
389    if "ssi=6677" not in ev.split(' '):
390        raise Exception("Unexpected ssi: " + ev)
391
392    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
393    if "FAIL" in dev[0].global_request(cmd):
394        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
395    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id1
396    if "FAIL" in dev[1].global_request(cmd):
397        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
398
399    cmd = "P2P_GROUP_ADD p2p2"
400    res = dev[1].global_request(cmd)
401    if "FAIL" in res:
402        raise Exception("P2P_GROUP_ADD failed")
403
404    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
405    if ev is None:
406        raise Exception("Group formation timed out(2)")
407
408    cmd = "P2P_CONNECT " + dev[0].p2p_dev_addr() + " pair provdisc he go_intent=15 p2p2 bstrapmethod=2 join auth password=975310123"
409    id0 = dev[1].global_request(cmd)
410    if "FAIL" in id0:
411        raise Exception("P2P_CONNECT auth failed")
412
413    cmd = "P2P_CONNECT " + dev[1].p2p_dev_addr() + " pair provdisc p2p2 join bstrapmethod=32 password=975310123"
414    id0 = dev[0].global_request(cmd)
415    if "FAIL" in id0:
416        raise Exception("P2P_CONNECT failed")
417
418    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
419    if ev is None:
420        raise Exception("Group formation timed out")
421    #dev[0].group_form_result(ev)
422    dev[0].dump_monitor()
423
424    dev[1].wait_sta()
425
426    dev[1].remove_group()
427    dev[0].wait_go_ending_session()
428    dev[0].dump_monitor()
429
430def test_p2p_pairing_verification(dev, apdev):
431    """P2P Pairing with Verification"""
432
433    """wpa_supplicant config file for pairing verification"""
434    config = "/tmp/test_p2p.conf"
435    if os.path.exists(config):
436        os.remove(config)
437
438    wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
439
440    with open(config, "w") as f:
441         f.write("update_config=1\n")
442
443    wpas.interface_add("wlan5", config=config)
444
445    check_p2p2_capab(wpas)
446    check_p2p2_capab(dev[1])
447
448    set_p2p2_configs(wpas)
449    set_p2p2_configs(dev[1])
450
451    wpas.global_request("SET update_config 1")
452    wpas.global_request("SAVE_CONFIG")
453
454    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
455    id0 = wpas.global_request(cmd)
456    if "FAIL" in id0:
457        raise Exception("NAN_SUBSCRIBE for P2P failed")
458
459    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
460    id1 = dev[1].global_request(cmd)
461    if "FAIL" in id1:
462        raise Exception("NAN_PUBLISH for P2P failed")
463
464    ev = wpas.wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
465    if ev is None:
466        raise Exception("Peer not found")
467    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
468    if ev is None:
469        raise Exception("Peer not found")
470
471    ev = wpas.wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
472    if ev is None:
473        raise Exception("DiscoveryResult event not seen")
474    if "srv_proto_type=2" not in ev.split(' '):
475        raise Exception("Unexpected srv_proto_type: " + ev)
476    if "ssi=6677" not in ev.split(' '):
477        raise Exception("Unexpected ssi: " + ev)
478
479    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
480    if "FAIL" in wpas.global_request(cmd):
481        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
482    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id1
483    if "FAIL" in dev[1].global_request(cmd):
484        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
485
486    cmd = "P2P_CONNECT " + wpas.p2p_dev_addr() + " pair provdisc he go_intent=15 p2p2 bstrapmethod=2 auth password=975310123 freq=2437 persistent"
487    id0 = dev[1].global_request(cmd)
488    if "FAIL" in id0:
489        raise Exception("P2P_CONNECT auth Failed")
490
491    cmd = "P2P_CONNECT " + dev[1].p2p_dev_addr() + " pair provdisc he go_intent=5 p2p2 bstrapmethod=32 password=975310123 persistent"
492    id0 = wpas.global_request(cmd)
493    if "FAIL" in id0:
494        raise Exception("P2P_CONNECT Failed")
495
496    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
497    if ev is None:
498        raise Exception("Group formation timed out")
499    dev[1].group_form_result(ev)
500
501    ev = wpas.wait_global_event(["P2P-GROUP-STARTED",
502                                   "WPA: 4-Way Handshake failed"], timeout=30)
503    if ev is None:
504        raise Exception("Group formation timed out (2)")
505    wpas.dump_monitor()
506
507    dev[1].remove_group()
508    wpas.wait_go_ending_session()
509    wpas.dump_monitor()
510
511    wpas.interface_remove("wlan5")
512    wpas.interface_add("wlan5", config=config)
513    set_p2p2_configs(wpas)
514
515    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
516    id0 = wpas.global_request(cmd)
517    if "FAIL" in id0:
518        raise Exception("NAN_SUBSCRIBE for P2P failed (2)")
519
520    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
521    id1 = dev[1].global_request(cmd)
522    if "FAIL" in id1:
523        raise Exception("NAN_PUBLISH for P2P failed (2)")
524
525    ev = wpas.wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
526    if ev is None:
527        raise Exception("Peer not found")
528    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
529    if ev is None:
530        raise Exception("Peer not found")
531
532    ev = wpas.wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
533    if ev is None:
534        raise Exception("DiscoveryResult event not seen")
535    if "srv_proto_type=2" not in ev.split(' '):
536        raise Exception("Unexpected srv_proto_type: " + ev)
537    if "ssi=6677" not in ev.split(' '):
538        raise Exception("Unexpected ssi: " + ev)
539
540    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + id0
541    if "FAIL" in wpas.global_request(cmd):
542        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed (2)")
543    cmd = "NAN_CANCEL_PUBLISH publish_id=" + id1
544    if "FAIL" in dev[1].global_request(cmd):
545        raise Exception("NAN_CANCEL_PUBLISH for P2P failed (2)")
546
547    wpas.global_request("SET persistent_reconnect 1")
548    dev[1].global_request("SET persistent_reconnect 1")
549    peer = wpas.get_peer(dev[1].p2p_dev_addr())
550    if 'persistent' not in peer:
551        raise Exception("Missing information on persistent group for the peer")
552    cmd = "P2P_INVITE persistent peer=" + dev[1].p2p_dev_addr() + " p2p2"
553    id0 = wpas.global_request(cmd)
554    if "FAIL" in id0:
555        raise Exception("P2P_INVITE Failed")
556
557    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
558    if ev is None:
559        raise Exception("Group re-invoke failed")
560    dev[1].group_form_result(ev)
561
562    ev = wpas.wait_global_event(["P2P-GROUP-STARTED",
563                                 "WPA: 4-Way Handshake failed"], timeout=30)
564    if ev is None:
565        raise Exception("Group re-invoke failed (2)")
566    if "P2P-GROUP-STARTED" not in ev:
567        raise Exception("Failed to complete group start on reinvocation")
568    wpas.dump_monitor()
569
570    res = dev[1].group_request("P2P_GET_DIRA")
571    addr, nonce, tag = res.split()
572
573    cmd = "P2P_VALIDATE_DIRA " + addr + " nonce=" + nonce + " tag=" + tag
574    res = wpas.group_request(cmd)
575    if "FAIL" in res:
576        raise Exception("DIRA validation failed")
577
578    dev[1].remove_group()
579    wpas.wait_go_ending_session()
580    wpas.dump_monitor()
581
582def test_p2p_auto_go_pcc_with_two_cli(dev, apdev):
583    """P2P autonomous GO in PCC mode with PSK and SAE clients"""
584    check_p2p2_capab(dev[0])
585    set_p2p2_configs(dev[0])
586
587    cmd = "P2P_GROUP_ADD p2p2 p2pmode=2 freq=2462"
588    res = dev[0].global_request(cmd)
589    if "FAIL" in res:
590        raise Exception("P2P_GROUP_ADD failed")
591    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
592    if ev is None:
593        raise Exception("Group formation timed out")
594
595    res = dev[0].group_form_result(ev)
596    if dev[0].get_group_status_field("passphrase", extra="WPS") != res['passphrase']:
597        raise Exception("passphrase mismatch")
598    if dev[0].group_request("P2P_GET_PASSPHRASE") != res['passphrase']:
599        raise Exception("passphrase mismatch(2)")
600
601    logger.info("Connect legacy non-WPS P2P client")
602    dev[1].global_request("P2P_SET disabled 1")
603    dev[0].dump_monitor()
604    dev[1].connect(ssid=res['ssid'], psk=res['passphrase'], proto='RSN',
605                   key_mgmt='WPA-PSK', pairwise='CCMP',
606                   group='CCMP', scan_freq=res['freq'])
607    dev[0].wait_sta(addr=dev[1].own_addr(), wait_4way_hs=True)
608
609    try:
610        logger.info("Connect P2P2 client")
611        dev[2].global_request("P2P_SET disabled 1")
612        dev[0].dump_monitor()
613        dev[2].set("rsn_overriding", "1")
614        dev[2].set("sae_pwe", "2")
615        dev[2].set("sae_groups", "")
616        dev[2].connect(ssid=res['ssid'], sae_password=res['passphrase'],
617                       proto='WPA2', key_mgmt='SAE', ieee80211w='2',
618                       pairwise='GCMP-256 CCMP', group='GCMP-256 CCMP',
619                       scan_freq=res['freq'])
620        dev[0].wait_sta(addr=dev[2].own_addr(), wait_4way_hs=True)
621
622        hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
623
624        dev[2].request("DISCONNECT")
625        dev[2].wait_disconnected()
626        dev[0].wait_sta_disconnect(addr=dev[2].own_addr())
627    finally:
628        dev[2].set("sae_pwe", "0")
629        dev[2].set("rsn_overriding", "0")
630
631    dev[1].request("DISCONNECT")
632    dev[1].wait_disconnected()
633    dev[0].wait_sta_disconnect(addr=dev[1].own_addr())
634
635    dev[0].remove_group()
636
637def test_p2p_auto_go_pcc_with_p2p2_cli(dev, apdev):
638    """P2P autonomous GO in PCC mode with P2P2 clients"""
639    check_p2p2_capab(dev[0])
640    check_p2p2_capab(dev[1])
641    set_p2p2_configs(dev[0])
642
643    cmd = "P2P_GROUP_ADD p2p2 p2pmode=2 freq=2462"
644    res = dev[0].global_request(cmd)
645    if "FAIL" in res:
646        raise Exception("P2P_GROUP_ADD failed")
647    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
648    if ev is None:
649        raise Exception("Group formation timed out")
650
651    res = dev[0].group_form_result(ev)
652    if dev[0].get_group_status_field("passphrase", extra="WPS") != res['passphrase']:
653        raise Exception("passphrase mismatch")
654    if dev[0].group_request("P2P_GET_PASSPHRASE") != res['passphrase']:
655        raise Exception("passphrase mismatch(2)")
656
657    ssidhex =  binascii.hexlify(res['ssid'].encode()).decode()
658    cmd = "P2P_CONNECT " + dev[0].p2p_dev_addr() + " pair p2p2 skip_prov join password=" + res['passphrase'] + " ssid=" + ssidhex
659    id0 = dev[1].global_request(cmd)
660    if "FAIL" in id0:
661        raise Exception("P2P_CONNECT failed")
662
663    ev = dev[1].wait_global_event(["CTRL-EVENT-CONNECTED"], timeout=10)
664    if ev is None:
665        raise Exception("Group formation timed out")
666    dev[1].dump_monitor()
667
668    dev[0].wait_sta()
669
670    dev[0].remove_group()
671    dev[1].dump_monitor()
672
673def test_p2p_bootstrapping_comeback_pairing(dev, apdev):
674    """P2P bootstrapping with comeback and pairing"""
675    check_p2p2_capab(dev[0])
676    check_p2p2_capab(dev[1])
677
678    set_p2p2_configs(dev[0])
679    set_p2p2_configs(dev[1])
680
681    cmd = "NAN_SUBSCRIBE service_name=_test active=1 srv_proto_type=2 ssi=1122334455 ttl=10 p2p=1"
682    sub_id = dev[0].global_request(cmd)
683    if "FAIL" in sub_id:
684        raise Exception("NAN_SUBSCRIBE for P2P failed")
685
686    cmd = "NAN_PUBLISH service_name=_test unsolicited=0 srv_proto_type=2 ssi=6677 ttl=10 p2p=1"
687    pub_id = dev[1].global_request(cmd)
688    if "FAIL" in pub_id:
689        raise Exception("NAN_PUBLISH for P2P failed")
690
691    ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
692    if ev is None:
693        raise Exception("Peer not found")
694    ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
695    if ev is None:
696        raise Exception("Peer not found")
697
698    ev = dev[0].wait_global_event(["NAN-DISCOVERY-RESULT"], timeout=5)
699    if ev is None:
700        raise Exception("DiscoveryResult event not seen")
701    if "srv_proto_type=2" not in ev.split(' '):
702        raise Exception("Unexpected srv_proto_type: " + ev)
703    if "ssi=6677" not in ev.split(' '):
704        raise Exception("Unexpected ssi: " + ev)
705
706    cmd = "P2P_PROV_DISC " + dev[1].p2p_dev_addr() + " bstrapmethod=1"
707    id0 = dev[0].global_request(cmd)
708    if "FAIL" in id0:
709        raise Exception("Bootstrapping failed")
710
711    ev = dev[1].wait_global_event(["P2P-BOOTSTRAP-REQUEST"], timeout=10)
712    if ev is None:
713        raise Exception("Bootstrap request event not received")
714
715    cmd = "P2P_CONNECT " + dev[0].p2p_dev_addr() + " pair he go_intent=15 p2p2 bstrapmethod=1 auth freq=2437"
716    id0 = dev[1].global_request(cmd)
717    if "FAIL" in id0:
718        raise Exception("P2P_CONNECT auth failed")
719
720    ev = dev[0].wait_global_event(["P2P-BOOTSTRAP-SUCCESS"], timeout=10)
721    if ev is None:
722        raise Exception("Bootstrap success not received")
723
724    cmd = "NAN_CANCEL_SUBSCRIBE subscribe_id=" + sub_id
725    if "FAIL" in dev[0].global_request(cmd):
726        raise Exception("NAN_CANCEL_SUBSCRIBE for P2P failed")
727    cmd = "NAN_CANCEL_PUBLISH publish_id=" + pub_id
728    if "FAIL" in dev[1].global_request(cmd):
729        raise Exception("NAN_CANCEL_PUBLISH for P2P failed")
730
731    cmd = "P2P_CONNECT " + dev[1].p2p_dev_addr() + " pair he go_intent=5 p2p2 bstrapmethod=1"
732    id0 = dev[0].global_request(cmd)
733    if "FAIL" in id0:
734        raise Exception("P2P_CONNECT failed")
735
736    ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
737    if ev is None:
738        raise Exception("Group formation timed out")
739    #dev[0].group_form_result(ev)
740    dev[0].dump_monitor()
741
742    ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
743    if ev is None:
744        raise Exception("Group formation timed out(2)")
745    dev[1].group_form_result(ev)
746    dev[1].wait_sta()
747
748    dev[1].remove_group()
749    dev[0].wait_go_ending_session()
750    dev[0].dump_monitor()
751