tests: Use single channel scans to speed up test cases
[mech_eap.git] / tests / hwsim / test_ap_tdls.py
1 #!/usr/bin/python
2 #
3 # TDLS tests
4 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
5 #
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
8
9 import time
10 import logging
11 logger = logging.getLogger()
12
13 import hwsim_utils
14 from hostapd import HostapdGlobal
15 from hostapd import Hostapd
16 import hostapd
17 from wlantest import Wlantest
18
19 def start_ap_wpa2_psk(ifname):
20     params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
21     hostapd.add_ap(ifname, params)
22
23 def connectivity(dev, ap_ifname):
24     hwsim_utils.test_connectivity_sta(dev[0], dev[1])
25     hwsim_utils.test_connectivity(dev[0].ifname, ap_ifname)
26     hwsim_utils.test_connectivity(dev[1].ifname, ap_ifname)
27
28 def connect_2sta(dev, ssid, ap_ifname):
29     dev[0].connect(ssid, psk="12345678", scan_freq="2412")
30     dev[1].connect(ssid, psk="12345678", scan_freq="2412")
31     connectivity(dev, ap_ifname)
32
33 def connect_2sta_wpa2_psk(dev, ap_ifname):
34     connect_2sta(dev, "test-wpa2-psk", ap_ifname)
35
36 def connect_2sta_wpa_psk(dev, ap_ifname):
37     connect_2sta(dev, "test-wpa-psk", ap_ifname)
38
39 def connect_2sta_wpa_psk_mixed(dev, ap_ifname):
40     dev[0].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA",
41                    scan_freq="2412")
42     dev[1].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA2",
43                    scan_freq="2412")
44     connectivity(dev, ap_ifname)
45
46 def connect_2sta_wep(dev, ap_ifname):
47     dev[0].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"',
48                    scan_freq="2412")
49     dev[1].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"',
50                    scan_freq="2412")
51     connectivity(dev, ap_ifname)
52
53 def connect_2sta_open(dev, ap_ifname):
54     dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
55     dev[1].connect("test-open", key_mgmt="NONE", scan_freq="2412")
56     connectivity(dev, ap_ifname)
57
58 def wlantest_setup():
59     wt = Wlantest()
60     wt.flush()
61     wt.add_passphrase("12345678")
62     wt.add_wepkey("68656c6c6f")
63
64 def wlantest_tdls_packet_counters(bssid, addr0, addr1):
65     wt = Wlantest()
66     dl = wt.get_tdls_counter("valid_direct_link", bssid, addr0, addr1)
67     inv_dl = wt.get_tdls_counter("invalid_direct_link", bssid, addr0, addr1)
68     ap = wt.get_tdls_counter("valid_ap_path", bssid, addr0, addr1)
69     inv_ap = wt.get_tdls_counter("invalid_ap_path", bssid, addr0, addr1)
70     return [dl,inv_dl,ap,inv_ap]
71
72 def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
73     wt = Wlantest()
74     wt.tdls_clear(bssid, addr0, addr1)
75     hwsim_utils.test_connectivity_sta(sta0, sta1)
76     [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
77     if dl == 0:
78         raise Exception("No valid frames through direct link")
79     if inv_dl > 0:
80         raise Exception("Invalid frames through direct link")
81     if ap > 0:
82         raise Exception("Unexpected frames through AP path")
83     if inv_ap > 0:
84         raise Exception("Invalid frames through AP path")
85
86 def tdls_check_ap(sta0, sta1, bssid, addr0, addr1):
87     wt = Wlantest()
88     wt.tdls_clear(bssid, addr0, addr1);
89     hwsim_utils.test_connectivity_sta(sta0, sta1)
90     [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
91     if dl > 0:
92         raise Exception("Unexpected frames through direct link")
93     if inv_dl > 0:
94         raise Exception("Invalid frames through direct link")
95     if ap == 0:
96         raise Exception("No valid frames through AP path")
97     if inv_ap > 0:
98         raise Exception("Invalid frames through AP path")
99
100 def check_connectivity(sta0, sta1, ap):
101     hwsim_utils.test_connectivity_sta(sta0, sta1)
102     hwsim_utils.test_connectivity(sta0.ifname, ap['ifname'])
103     hwsim_utils.test_connectivity(sta1.ifname, ap['ifname'])
104
105 def setup_tdls(sta0, sta1, ap, reverse=False, expect_fail=False):
106     logger.info("Setup TDLS")
107     check_connectivity(sta0, sta1, ap)
108     bssid = ap['bssid']
109     addr0 = sta0.p2p_interface_addr()
110     addr1 = sta1.p2p_interface_addr()
111     wt = Wlantest()
112     wt.tdls_clear(bssid, addr0, addr1);
113     wt.tdls_clear(bssid, addr1, addr0);
114     sta0.tdls_setup(addr1)
115     time.sleep(1)
116     if expect_fail:
117         tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
118         return
119     if reverse:
120         addr1 = sta0.p2p_interface_addr()
121         addr0 = sta1.p2p_interface_addr()
122     conf = wt.get_tdls_counter("setup_conf_ok", bssid, addr0, addr1);
123     if conf == 0:
124         raise Exception("No TDLS Setup Confirm (success) seen")
125     tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
126     check_connectivity(sta0, sta1, ap)
127
128 def teardown_tdls(sta0, sta1, ap):
129     logger.info("Teardown TDLS")
130     check_connectivity(sta0, sta1, ap)
131     bssid = ap['bssid']
132     addr0 = sta0.p2p_interface_addr()
133     addr1 = sta1.p2p_interface_addr()
134     sta0.tdls_teardown(addr1)
135     time.sleep(1)
136     wt = Wlantest()
137     teardown = wt.get_tdls_counter("teardown", bssid, addr0, addr1);
138     if teardown == 0:
139         raise Exception("No TDLS Setup Teardown seen")
140     tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
141     check_connectivity(sta0, sta1, ap)
142
143 def test_ap_wpa2_tdls(dev, apdev):
144     """WPA2-PSK AP and two stations using TDLS"""
145     start_ap_wpa2_psk(apdev[0]['ifname'])
146     wlantest_setup()
147     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
148     setup_tdls(dev[0], dev[1], apdev[0])
149     teardown_tdls(dev[0], dev[1], apdev[0])
150     setup_tdls(dev[1], dev[0], apdev[0])
151     #teardown_tdls(dev[0], dev[1], apdev[0])
152
153 def test_ap_wpa2_tdls_concurrent_init(dev, apdev):
154     """Concurrent TDLS setup initiation"""
155     start_ap_wpa2_psk(apdev[0]['ifname'])
156     wlantest_setup()
157     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
158     dev[0].request("SET tdls_testing 0x80")
159     setup_tdls(dev[1], dev[0], apdev[0], reverse=True)
160
161 def test_ap_wpa2_tdls_concurrent_init2(dev, apdev):
162     """Concurrent TDLS setup initiation (reverse)"""
163     start_ap_wpa2_psk(apdev[0]['ifname'])
164     wlantest_setup()
165     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
166     dev[1].request("SET tdls_testing 0x80")
167     setup_tdls(dev[0], dev[1], apdev[0])
168
169 def test_ap_wpa2_tdls_decline_resp(dev, apdev):
170     """Decline TDLS Setup Response"""
171     start_ap_wpa2_psk(apdev[0]['ifname'])
172     wlantest_setup()
173     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
174     dev[1].request("SET tdls_testing 0x200")
175     setup_tdls(dev[1], dev[0], apdev[0], expect_fail=True)
176
177 def test_ap_wpa2_tdls_long_lifetime(dev, apdev):
178     """TDLS with long TPK lifetime"""
179     start_ap_wpa2_psk(apdev[0]['ifname'])
180     wlantest_setup()
181     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
182     dev[1].request("SET tdls_testing 0x40")
183     setup_tdls(dev[1], dev[0], apdev[0])
184
185 def test_ap_wpa2_tdls_long_frame(dev, apdev):
186     """TDLS with long setup/teardown frames"""
187     start_ap_wpa2_psk(apdev[0]['ifname'])
188     wlantest_setup()
189     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
190     dev[0].request("SET tdls_testing 0x1")
191     dev[1].request("SET tdls_testing 0x1")
192     setup_tdls(dev[1], dev[0], apdev[0])
193     teardown_tdls(dev[1], dev[0], apdev[0])
194     setup_tdls(dev[0], dev[1], apdev[0])
195
196 def test_ap_wpa2_tdls_reneg(dev, apdev):
197     """Renegotiate TDLS link"""
198     start_ap_wpa2_psk(apdev[0]['ifname'])
199     wlantest_setup()
200     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
201     setup_tdls(dev[1], dev[0], apdev[0])
202     setup_tdls(dev[0], dev[1], apdev[0])
203
204 def test_ap_wpa2_tdls_wrong_lifetime_resp(dev, apdev):
205     """Incorrect TPK lifetime in TDLS Setup Response"""
206     start_ap_wpa2_psk(apdev[0]['ifname'])
207     wlantest_setup()
208     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
209     dev[1].request("SET tdls_testing 0x10")
210     setup_tdls(dev[0], dev[1], apdev[0], expect_fail=True)
211
212 def test_ap_wpa2_tdls_diff_rsnie(dev, apdev):
213     """TDLS with different RSN IEs"""
214     start_ap_wpa2_psk(apdev[0]['ifname'])
215     wlantest_setup()
216     connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
217     dev[1].request("SET tdls_testing 0x2")
218     setup_tdls(dev[1], dev[0], apdev[0])
219     teardown_tdls(dev[1], dev[0], apdev[0])
220
221 def test_ap_wpa_tdls(dev, apdev):
222     """WPA-PSK AP and two stations using TDLS"""
223     hostapd.add_ap(apdev[0]['ifname'],
224                    hostapd.wpa_params(ssid="test-wpa-psk",
225                                       passphrase="12345678"))
226     wlantest_setup()
227     connect_2sta_wpa_psk(dev, apdev[0]['ifname'])
228     setup_tdls(dev[0], dev[1], apdev[0])
229     teardown_tdls(dev[0], dev[1], apdev[0])
230     setup_tdls(dev[1], dev[0], apdev[0])
231
232 def test_ap_wpa_mixed_tdls(dev, apdev):
233     """WPA+WPA2-PSK AP and two stations using TDLS"""
234     hostapd.add_ap(apdev[0]['ifname'],
235                    hostapd.wpa_mixed_params(ssid="test-wpa-mixed-psk",
236                                             passphrase="12345678"))
237     wlantest_setup()
238     connect_2sta_wpa_psk_mixed(dev, apdev[0]['ifname'])
239     setup_tdls(dev[0], dev[1], apdev[0])
240     teardown_tdls(dev[0], dev[1], apdev[0])
241     setup_tdls(dev[1], dev[0], apdev[0])
242
243 def test_ap_wep_tdls(dev, apdev):
244     """WEP AP and two stations using TDLS"""
245     hostapd.add_ap(apdev[0]['ifname'],
246                    { "ssid": "test-wep", "wep_key0": '"hello"' })
247     wlantest_setup()
248     connect_2sta_wep(dev, apdev[0]['ifname'])
249     setup_tdls(dev[0], dev[1], apdev[0])
250     teardown_tdls(dev[0], dev[1], apdev[0])
251     setup_tdls(dev[1], dev[0], apdev[0])
252
253 def test_ap_open_tdls(dev, apdev):
254     """Open AP and two stations using TDLS"""
255     hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
256     wlantest_setup()
257     connect_2sta_open(dev, apdev[0]['ifname'])
258     setup_tdls(dev[0], dev[1], apdev[0])
259     teardown_tdls(dev[0], dev[1], apdev[0])
260     setup_tdls(dev[1], dev[0], apdev[0])