4 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
11 logger = logging.getLogger()
14 from hostapd import HostapdGlobal
15 from hostapd import Hostapd
17 from wlantest import Wlantest
19 def start_ap_wpa2_psk(ifname):
20 params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
21 hostapd.add_ap(ifname, params)
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)
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)
33 def connect_2sta_wpa2_psk(dev, ap_ifname):
34 connect_2sta(dev, "test-wpa2-psk", ap_ifname)
36 def connect_2sta_wpa_psk(dev, ap_ifname):
37 connect_2sta(dev, "test-wpa-psk", ap_ifname)
39 def connect_2sta_wpa_psk_mixed(dev, ap_ifname):
40 dev[0].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA",
42 dev[1].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA2",
44 connectivity(dev, ap_ifname)
46 def connect_2sta_wep(dev, ap_ifname):
47 dev[0].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"',
49 dev[1].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"',
51 connectivity(dev, ap_ifname)
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)
61 wt.add_passphrase("12345678")
62 wt.add_wepkey("68656c6c6f")
64 def wlantest_tdls_packet_counters(bssid, addr0, addr1):
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]
72 def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
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)
78 raise Exception("No valid frames through direct link")
80 raise Exception("Invalid frames through direct link")
82 raise Exception("Unexpected frames through AP path")
84 raise Exception("Invalid frames through AP path")
86 def tdls_check_ap(sta0, sta1, bssid, addr0, addr1):
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)
92 raise Exception("Unexpected frames through direct link")
94 raise Exception("Invalid frames through direct link")
96 raise Exception("No valid frames through AP path")
98 raise Exception("Invalid frames through AP path")
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'])
105 def setup_tdls(sta0, sta1, ap, reverse=False, expect_fail=False):
106 logger.info("Setup TDLS")
107 check_connectivity(sta0, sta1, ap)
109 addr0 = sta0.p2p_interface_addr()
110 addr1 = sta1.p2p_interface_addr()
112 wt.tdls_clear(bssid, addr0, addr1);
113 wt.tdls_clear(bssid, addr1, addr0);
114 sta0.tdls_setup(addr1)
117 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
120 addr1 = sta0.p2p_interface_addr()
121 addr0 = sta1.p2p_interface_addr()
122 conf = wt.get_tdls_counter("setup_conf_ok", bssid, addr0, addr1);
124 raise Exception("No TDLS Setup Confirm (success) seen")
125 tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
126 check_connectivity(sta0, sta1, ap)
128 def teardown_tdls(sta0, sta1, ap):
129 logger.info("Teardown TDLS")
130 check_connectivity(sta0, sta1, ap)
132 addr0 = sta0.p2p_interface_addr()
133 addr1 = sta1.p2p_interface_addr()
134 sta0.tdls_teardown(addr1)
137 teardown = wt.get_tdls_counter("teardown", bssid, addr0, addr1);
139 raise Exception("No TDLS Setup Teardown seen")
140 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
141 check_connectivity(sta0, sta1, ap)
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'])
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])
153 def test_ap_wpa2_tdls_concurrent_init(dev, apdev):
154 """Concurrent TDLS setup initiation"""
155 start_ap_wpa2_psk(apdev[0]['ifname'])
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)
161 def test_ap_wpa2_tdls_concurrent_init2(dev, apdev):
162 """Concurrent TDLS setup initiation (reverse)"""
163 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
169 def test_ap_wpa2_tdls_decline_resp(dev, apdev):
170 """Decline TDLS Setup Response"""
171 start_ap_wpa2_psk(apdev[0]['ifname'])
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)
177 def test_ap_wpa2_tdls_long_lifetime(dev, apdev):
178 """TDLS with long TPK lifetime"""
179 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
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'])
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])
196 def test_ap_wpa2_tdls_reneg(dev, apdev):
197 """Renegotiate TDLS link"""
198 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
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'])
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)
212 def test_ap_wpa2_tdls_diff_rsnie(dev, apdev):
213 """TDLS with different RSN IEs"""
214 start_ap_wpa2_psk(apdev[0]['ifname'])
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])
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"))
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])
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"))
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])
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"' })
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])
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" })
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])