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.
12 logger = logging.getLogger(__name__)
15 from hostapd import HostapdGlobal
16 from hostapd import Hostapd
21 def start_ap_wpa2_psk(ifname):
22 params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
23 hostapd.add_ap(ifname, params)
25 def connectivity(dev, ap_ifname):
26 hwsim_utils.test_connectivity_sta(dev[0], dev[1])
27 hwsim_utils.test_connectivity(dev[0].ifname, "wlan2")
28 hwsim_utils.test_connectivity(dev[1].ifname, "wlan2")
30 def connect_2sta(dev, ssid):
31 dev[0].connect(ssid, psk="12345678")
32 dev[1].connect(ssid, psk="12345678")
33 connectivity(dev, "wlan2")
35 def connect_2sta_wpa2_psk(dev):
36 connect_2sta(dev, "test-wpa2-psk")
38 def connect_2sta_wpa_psk(dev):
39 connect_2sta(dev, "test-wpa-psk")
41 def connect_2sta_wpa_psk_mixed(dev):
42 dev[0].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA")
43 dev[1].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA2")
44 connectivity(dev, "wlan2")
46 def connect_2sta_wep(dev):
47 dev[0].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"')
48 dev[1].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"')
49 connectivity(dev, "wlan2")
51 def connect_2sta_open(dev):
52 dev[0].connect("test-open", key_mgmt="NONE")
53 dev[1].connect("test-open", key_mgmt="NONE")
54 connectivity(dev, "wlan2")
56 def wlantest_tdls(field, bssid, addr1, addr2):
57 res = subprocess.check_output(["../../wlantest/wlantest_cli",
58 "get_tdls_counter", field, bssid, addr1,
61 raise Exception("wlantest_cli command failed")
64 def wlantest_tdls_clear(bssid, addr1, addr2):
65 subprocess.call(["../../wlantest/wlantest_cli",
66 "clear_tdls_counters", bssid, addr1, addr2]);
69 subprocess.call(["../../wlantest/wlantest_cli", "flush"]);
70 subprocess.call(["../../wlantest/wlantest_cli", "add_passphrase",
72 subprocess.call(["../../wlantest/wlantest_cli", "add_wepkey",
75 def wlantest_tdls_packet_counters(bssid, addr0, addr1):
76 dl = wlantest_tdls("valid_direct_link", bssid, addr0, addr1);
77 inv_dl = wlantest_tdls("invalid_direct_link", bssid, addr0, addr1);
78 ap = wlantest_tdls("valid_ap_path", bssid, addr0, addr1);
79 inv_ap = wlantest_tdls("invalid_ap_path", bssid, addr0, addr1);
80 return [dl,inv_dl,ap,inv_ap]
82 def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
83 wlantest_tdls_clear(bssid, addr0, addr1);
84 hwsim_utils.test_connectivity_sta(sta0, sta1)
85 [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
87 raise Exception("No valid frames through direct link")
89 raise Exception("Invalid frames through direct link")
91 raise Exception("Unexpected frames through AP path")
93 raise Exception("Invalid frames through AP path")
95 def tdls_check_ap(sta0, sta1, bssid, addr0, addr1):
96 wlantest_tdls_clear(bssid, addr0, addr1);
97 hwsim_utils.test_connectivity_sta(sta0, sta1)
98 [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
100 raise Exception("Unexpected frames through direct link")
102 raise Exception("Invalid frames through direct link")
104 raise Exception("No valid frames through AP path")
106 raise Exception("Invalid frames through AP path")
108 def setup_tdls(sta0, sta1, bssid, reverse=False, expect_fail=False):
109 logger.info("Setup TDLS")
110 addr0 = sta0.p2p_interface_addr()
111 addr1 = sta1.p2p_interface_addr()
112 wlantest_tdls_clear(bssid, addr0, addr1);
113 wlantest_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 = wlantest_tdls("setup_conf_ok", bssid, addr0, addr1);
124 raise Exception("No TDLS Setup Confirm (success) seen")
125 tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
127 def teardown_tdls(sta0, sta1, bssid):
128 logger.info("Teardown TDLS")
129 addr0 = sta0.p2p_interface_addr()
130 addr1 = sta1.p2p_interface_addr()
131 sta0.tdls_teardown(addr1)
133 teardown = wlantest_tdls("teardown", bssid, addr0, addr1);
135 raise Exception("No TDLS Setup Teardown seen")
136 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
138 def test_ap_wpa2_tdls(dev):
139 """WPA2-PSK AP and two stations using TDLS"""
140 start_ap_wpa2_psk(ap_ifname)
141 bssid = "02:00:00:00:02:00"
143 connect_2sta_wpa2_psk(dev)
144 setup_tdls(dev[0], dev[1], bssid)
145 teardown_tdls(dev[0], dev[1], bssid)
146 setup_tdls(dev[1], dev[0], bssid)
147 #teardown_tdls(dev[0], dev[1], bssid)
149 def test_ap_wpa2_tdls_concurrent_init(dev):
150 """Concurrent TDLS setup initiation"""
151 start_ap_wpa2_psk(ap_ifname)
152 bssid = "02:00:00:00:02:00"
154 connect_2sta_wpa2_psk(dev)
155 dev[0].request("SET tdls_testing 0x80")
156 setup_tdls(dev[1], dev[0], bssid, reverse=True)
158 def test_ap_wpa2_tdls_concurrent_init2(dev):
159 """Concurrent TDLS setup initiation (reverse)"""
160 start_ap_wpa2_psk(ap_ifname)
161 bssid = "02:00:00:00:02:00"
163 connect_2sta_wpa2_psk(dev)
164 dev[1].request("SET tdls_testing 0x80")
165 setup_tdls(dev[0], dev[1], bssid)
167 def test_ap_wpa2_tdls_decline_resp(dev):
168 """Decline TDLS Setup Response"""
169 start_ap_wpa2_psk(ap_ifname)
170 bssid = "02:00:00:00:02:00"
172 connect_2sta_wpa2_psk(dev)
173 dev[1].request("SET tdls_testing 0x200")
174 setup_tdls(dev[1], dev[0], bssid, expect_fail=True)
176 def test_ap_wpa2_tdls_long_lifetime(dev):
177 """TDLS with long TPK lifetime"""
178 start_ap_wpa2_psk(ap_ifname)
179 bssid = "02:00:00:00:02:00"
181 connect_2sta_wpa2_psk(dev)
182 dev[1].request("SET tdls_testing 0x40")
183 setup_tdls(dev[1], dev[0], bssid)
185 def test_ap_wpa2_tdls_long_frame(dev):
186 """TDLS with long setup/teardown frames"""
187 start_ap_wpa2_psk(ap_ifname)
188 bssid = "02:00:00:00:02:00"
190 connect_2sta_wpa2_psk(dev)
191 dev[0].request("SET tdls_testing 0x1")
192 dev[1].request("SET tdls_testing 0x1")
193 setup_tdls(dev[1], dev[0], bssid)
194 teardown_tdls(dev[1], dev[0], bssid)
195 setup_tdls(dev[0], dev[1], bssid)
197 def test_ap_wpa2_tdls_reneg(dev):
198 """Renegotiate TDLS link"""
199 start_ap_wpa2_psk(ap_ifname)
200 bssid = "02:00:00:00:02:00"
202 connect_2sta_wpa2_psk(dev)
203 setup_tdls(dev[1], dev[0], bssid)
204 setup_tdls(dev[0], dev[1], bssid)
206 def test_ap_wpa2_tdls_wrong_lifetime_resp(dev):
207 """Incorrect TPK lifetime in TDLS Setup Response"""
208 start_ap_wpa2_psk(ap_ifname)
209 bssid = "02:00:00:00:02:00"
211 connect_2sta_wpa2_psk(dev)
212 dev[1].request("SET tdls_testing 0x10")
213 setup_tdls(dev[0], dev[1], bssid, expect_fail=True)
215 def test_ap_wpa2_tdls_diff_rsnie(dev):
216 """TDLS with different RSN IEs"""
217 start_ap_wpa2_psk(ap_ifname)
218 bssid = "02:00:00:00:02:00"
220 connect_2sta_wpa2_psk(dev)
221 dev[1].request("SET tdls_testing 0x2")
222 setup_tdls(dev[1], dev[0], bssid)
223 teardown_tdls(dev[1], dev[0], bssid)
225 def test_ap_wpa_tdls(dev):
226 """WPA-PSK AP and two stations using TDLS"""
227 hostapd.add_ap(ap_ifname, hostapd.wpa_params(ssid="test-wpa-psk", passphrase="12345678"))
228 bssid = "02:00:00:00:02:00"
230 connect_2sta_wpa_psk(dev)
231 setup_tdls(dev[0], dev[1], bssid)
232 teardown_tdls(dev[0], dev[1], bssid)
233 setup_tdls(dev[1], dev[0], bssid)
235 def test_ap_wpa_mixed_tdls(dev):
236 """WPA+WPA2-PSK AP and two stations using TDLS"""
237 hostapd.add_ap(ap_ifname, hostapd.wpa_mixed_params(ssid="test-wpa-mixed-psk", passphrase="12345678"))
238 bssid = "02:00:00:00:02:00"
240 connect_2sta_wpa_psk_mixed(dev)
241 setup_tdls(dev[0], dev[1], bssid)
242 teardown_tdls(dev[0], dev[1], bssid)
243 setup_tdls(dev[1], dev[0], bssid)
245 def test_ap_wep_tdls(dev):
246 """WEP AP and two stations using TDLS"""
247 hostapd.add_ap(ap_ifname, { "ssid": "test-wep", "wep_key0": '"hello"' })
248 bssid = "02:00:00:00:02:00"
250 connect_2sta_wep(dev)
251 setup_tdls(dev[0], dev[1], bssid)
252 teardown_tdls(dev[0], dev[1], bssid)
253 setup_tdls(dev[1], dev[0], bssid)
255 def test_ap_open_tdls(dev):
256 """Open AP and two stations using TDLS"""
257 hostapd.add_ap(ap_ifname, { "ssid": "test-open" })
258 bssid = "02:00:00:00:02:00"
260 connect_2sta_open(dev)
261 setup_tdls(dev[0], dev[1], bssid)
262 teardown_tdls(dev[0], dev[1], bssid)
263 setup_tdls(dev[1], dev[0], bssid)