1# P2P_SET test cases
2# Copyright (c) 2014, Jouni Malinen <j@w1.fi>
3#
4# This software may be distributed under the terms of the BSD license.
5# See README for more details.
6
7from remotehost import remote_compatible
8
9def test_p2p_set(dev):
10    """P2P_SET commands"""
11    for cmd in ["",
12                "foo bar",
13                "noa 1",
14                "noa 1,2",
15                "noa 1,2,3",
16                "noa -1,0,0",
17                "noa 256,0,0",
18                "noa 0,-1,0",
19                "noa 0,0,-1",
20                "noa 0,0,1",
21                "noa 255,10,20",
22                "ps 2",
23                "oppps 1",
24                "ctwindow 1",
25                "conc_pref foo",
26                "peer_filter foo",
27                "client_apsd 0",
28                "client_apsd 0,0",
29                "client_apsd 0,0,0",
30                "disc_int 1",
31                "disc_int 1 2",
32                "disc_int 2 1 10",
33                "disc_int -1 0 10",
34                "disc_int 0 -1 10",
35                "ssid_postfix 123456789012345678901234"]:
36        if "FAIL" not in dev[0].request("P2P_SET " + cmd):
37            raise Exception("Invalid P2P_SET accepted: " + cmd)
38    dev[0].request("P2P_SET ps 1")
39    if "OK" not in dev[0].request("P2P_SET ps 0"):
40        raise Exception("P2P_SET ps 0 failed unexpectedly")
41
42def test_p2p_set_discoverability(dev):
43    """P2P_SET discoverability"""
44    addr0 = dev[0].p2p_dev_addr()
45    addr1 = dev[1].p2p_dev_addr()
46
47    dev[0].p2p_start_go(freq="2412")
48    if "OK" not in dev[1].request("P2P_SET discoverability 0"):
49        raise Exception("P2P_SET discoverability 0 failed")
50    pin = dev[1].wps_read_pin()
51    dev[0].p2p_go_authorize_client(pin)
52    dev[1].p2p_connect_group(addr0, pin, timeout=20, social=True, freq="2412")
53
54    if not dev[2].discover_peer(addr1, timeout=10):
55        if not dev[2].discover_peer(addr1, timeout=10):
56            if not dev[2].discover_peer(addr1, timeout=10):
57                raise Exception("Could not discover group client")
58
59    peer = dev[2].get_peer(addr1)
60    if int(peer['dev_capab'], 16) & 0x02 != 0:
61        raise Exception("Discoverability dev_capab reported: " + peer['dev_capab'])
62    dev[2].p2p_stop_find()
63
64    if "OK" not in dev[1].request("P2P_SET discoverability 1"):
65        raise Exception("P2P_SET discoverability 1 failed")
66    dev[1].dump_monitor()
67    dev[1].group_request("REASSOCIATE")
68    ev = dev[1].wait_group_event(["CTRL-EVENT-CONNECTED"], timeout=20)
69    if ev is None:
70        raise Exception("Connection timed out")
71
72    dev[2].request("P2P_FLUSH")
73    if not dev[2].discover_peer(addr1, timeout=10):
74        if not dev[2].discover_peer(addr1, timeout=10):
75            if not dev[2].discover_peer(addr1, timeout=10):
76                raise Exception("Could not discover group client")
77
78    peer = dev[2].get_peer(addr1)
79    if int(peer['dev_capab'], 16) & 0x02 != 0x02:
80        raise Exception("Discoverability dev_capab reported: " + peer['dev_capab'])
81    dev[2].p2p_stop_find()
82
83def test_p2p_set_managed(dev):
84    """P2P_SET managed"""
85    addr0 = dev[0].p2p_dev_addr()
86
87    if "OK" not in dev[0].request("P2P_SET managed 1"):
88        raise Exception("P2P_SET managed 1 failed")
89
90    dev[0].p2p_listen()
91    if not dev[1].discover_peer(addr0):
92        raise Exception("Could not discover peer")
93    peer = dev[1].get_peer(addr0)
94    if int(peer['dev_capab'], 16) & 0x08 != 0x08:
95        raise Exception("Managed dev_capab not reported: " + peer['dev_capab'])
96    dev[1].p2p_stop_find()
97
98    if "OK" not in dev[0].request("P2P_SET managed 0"):
99        raise Exception("P2P_SET managed 0 failed")
100
101    if not dev[2].discover_peer(addr0):
102        raise Exception("Could not discover peer")
103    peer = dev[2].get_peer(addr0)
104    if int(peer['dev_capab'], 16) & 0x08 != 0:
105        raise Exception("Managed dev_capab reported: " + peer['dev_capab'])
106    dev[2].p2p_stop_find()
107    dev[0].p2p_stop_find()
108
109@remote_compatible
110def test_p2p_set_ssid_postfix(dev):
111    """P2P_SET ssid_postfix"""
112    addr0 = dev[0].p2p_dev_addr()
113    addr1 = dev[1].p2p_dev_addr()
114    postfix = "12345678901234567890123"
115
116    try:
117        if "OK" not in dev[0].request("P2P_SET ssid_postfix " + postfix):
118            raise Exception("P2P_SET ssid_postfix failed")
119        dev[0].p2p_start_go(freq="2412")
120        pin = dev[1].wps_read_pin()
121        dev[0].p2p_go_authorize_client(pin)
122        dev[1].p2p_connect_group(addr0, pin, timeout=20, social=True, freq="2412")
123        if postfix not in dev[1].get_group_status_field("ssid"):
124            raise Exception("SSID postfix missing from status")
125        if postfix not in dev[1].group_request("SCAN_RESULTS"):
126            raise Exception("SSID postfix missing from scan results")
127    finally:
128        dev[0].request("P2P_SET ssid_postfix ")
129