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