2 # Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
9 logger = logging.getLogger()
13 from hostapd import HostapdGlobal
14 from hostapd import Hostapd
16 from wlantest import Wlantest
18 def start_ap_wpa2_psk(ifname):
19 params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
20 hostapd.add_ap(ifname, params)
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)
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)
32 def connect_2sta_wpa2_psk(dev, ap_ifname):
33 connect_2sta(dev, "test-wpa2-psk", ap_ifname)
35 def connect_2sta_wpa_psk(dev, ap_ifname):
36 connect_2sta(dev, "test-wpa-psk", ap_ifname)
38 def connect_2sta_wpa_psk_mixed(dev, ap_ifname):
39 dev[0].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA",
41 dev[1].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA2",
43 connectivity(dev, ap_ifname)
45 def connect_2sta_wep(dev, ap_ifname):
46 dev[0].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"',
48 dev[1].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"',
50 connectivity(dev, ap_ifname)
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)
60 wt.add_passphrase("12345678")
61 wt.add_wepkey("68656c6c6f")
63 def wlantest_tdls_packet_counters(bssid, addr0, addr1):
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]
71 def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
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)
77 raise Exception("No valid frames through direct link")
79 raise Exception("Invalid frames through direct link")
81 raise Exception("Unexpected frames through AP path")
83 raise Exception("Invalid frames through AP path")
85 def tdls_check_ap(sta0, sta1, bssid, addr0, addr1):
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)
91 raise Exception("Unexpected frames through direct link")
93 raise Exception("Invalid frames through direct link")
95 raise Exception("No valid frames through AP path")
97 raise Exception("Invalid frames through AP path")
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'])
104 def setup_tdls(sta0, sta1, ap, reverse=False, expect_fail=False):
105 logger.info("Setup TDLS")
106 check_connectivity(sta0, sta1, ap)
108 addr0 = sta0.p2p_interface_addr()
109 addr1 = sta1.p2p_interface_addr()
111 wt.tdls_clear(bssid, addr0, addr1);
112 wt.tdls_clear(bssid, addr1, addr0);
113 sta0.tdls_setup(addr1)
116 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
119 addr1 = sta0.p2p_interface_addr()
120 addr0 = sta1.p2p_interface_addr()
121 conf = wt.get_tdls_counter("setup_conf_ok", bssid, addr0, addr1);
123 raise Exception("No TDLS Setup Confirm (success) seen")
124 tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
125 check_connectivity(sta0, sta1, ap)
127 def teardown_tdls(sta0, sta1, ap):
128 logger.info("Teardown TDLS")
129 check_connectivity(sta0, sta1, ap)
131 addr0 = sta0.p2p_interface_addr()
132 addr1 = sta1.p2p_interface_addr()
133 sta0.tdls_teardown(addr1)
136 teardown = wt.get_tdls_counter("teardown", bssid, addr0, addr1);
138 raise Exception("No TDLS Setup Teardown seen")
139 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
140 check_connectivity(sta0, sta1, ap)
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'])
146 connect_2sta_wpa2_psk(dev, apdev[0]['ifname'])
147 dev[0].request("TDLS_DISCOVER " + dev[1].p2p_interface_addr())
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'])
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])
160 def test_ap_wpa2_tdls_concurrent_init(dev, apdev):
161 """Concurrent TDLS setup initiation"""
162 start_ap_wpa2_psk(apdev[0]['ifname'])
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)
168 def test_ap_wpa2_tdls_concurrent_init2(dev, apdev):
169 """Concurrent TDLS setup initiation (reverse)"""
170 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
176 def test_ap_wpa2_tdls_decline_resp(dev, apdev):
177 """Decline TDLS Setup Response"""
178 start_ap_wpa2_psk(apdev[0]['ifname'])
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)
184 def test_ap_wpa2_tdls_long_lifetime(dev, apdev):
185 """TDLS with long TPK lifetime"""
186 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
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'])
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])
203 def test_ap_wpa2_tdls_reneg(dev, apdev):
204 """Renegotiate TDLS link"""
205 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
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'])
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)
219 def test_ap_wpa2_tdls_diff_rsnie(dev, apdev):
220 """TDLS with different RSN IEs"""
221 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
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"))
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])
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"))
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])
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"' })
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])
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" })
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])
269 def test_ap_wpa2_tdls_bssid_mismatch(dev, apdev):
270 """TDLS failure due to BSSID mismatch"""
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)
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)
289 hwsim_utils.test_connectivity_sta(dev[0], dev[1])
291 subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', 'ap-br0', 'down'])
292 subprocess.call(['sudo', 'brctl', 'delbr', 'ap-br0'])