]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/test_ap_tdls.py
Extend ROAM command to handle multiple SSIDs per BSS
[thirdparty/hostap.git] / tests / hwsim / test_ap_tdls.py
CommitLineData
81266da7
JM
1#!/usr/bin/python
2#
9f46d57f 3# TDLS tests
81266da7
JM
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
9import time
10import subprocess
11import logging
12logger = logging.getLogger(__name__)
13
14import hwsim_utils
b8cd4c54
JM
15from hostapd import HostapdGlobal
16from hostapd import Hostapd
e259d186 17import hostapd
b8cd4c54
JM
18
19ap_ifname = 'wlan2'
20
21def start_ap_wpa2_psk(ifname):
e259d186
JM
22 params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
23 hostapd.add_ap(ifname, params)
0165c4be 24
b61e418c 25def connectivity(dev, ap_ifname):
e492837b 26 hwsim_utils.test_connectivity_sta(dev[0], dev[1])
8bc0799b
JM
27 hwsim_utils.test_connectivity(dev[0].ifname, ap_ifname)
28 hwsim_utils.test_connectivity(dev[1].ifname, ap_ifname)
e492837b 29
b61e418c
JM
30def connect_2sta(dev, ssid):
31 dev[0].connect(ssid, psk="12345678")
32 dev[1].connect(ssid, psk="12345678")
8bc0799b 33 connectivity(dev, ap_ifname)
b61e418c 34
e492837b
JM
35def connect_2sta_wpa2_psk(dev):
36 connect_2sta(dev, "test-wpa2-psk")
37
38def connect_2sta_wpa_psk(dev):
39 connect_2sta(dev, "test-wpa-psk")
40
41def connect_2sta_wpa_psk_mixed(dev):
b61e418c
JM
42 dev[0].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA")
43 dev[1].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA2")
8bc0799b 44 connectivity(dev, ap_ifname)
0165c4be
JM
45
46def connect_2sta_wep(dev):
b61e418c
JM
47 dev[0].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"')
48 dev[1].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"')
8bc0799b 49 connectivity(dev, ap_ifname)
0165c4be
JM
50
51def connect_2sta_open(dev):
b61e418c
JM
52 dev[0].connect("test-open", key_mgmt="NONE")
53 dev[1].connect("test-open", key_mgmt="NONE")
8bc0799b 54 connectivity(dev, ap_ifname)
81266da7 55
81266da7
JM
56def wlantest_tdls(field, bssid, addr1, addr2):
57 res = subprocess.check_output(["../../wlantest/wlantest_cli",
58 "get_tdls_counter", field, bssid, addr1,
59 addr2]);
60 if "FAIL" in res:
61 raise Exception("wlantest_cli command failed")
62 return int(res)
63
64def wlantest_tdls_clear(bssid, addr1, addr2):
65 subprocess.call(["../../wlantest/wlantest_cli",
66 "clear_tdls_counters", bssid, addr1, addr2]);
67
68def wlantest_setup():
69 subprocess.call(["../../wlantest/wlantest_cli", "flush"]);
70 subprocess.call(["../../wlantest/wlantest_cli", "add_passphrase",
71 "12345678"]);
0165c4be
JM
72 subprocess.call(["../../wlantest/wlantest_cli", "add_wepkey",
73 "68656c6c6f"]);
81266da7 74
dc4e222c
JM
75def 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]
81
82def 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)
86 if dl == 0:
87 raise Exception("No valid frames through direct link")
88 if inv_dl > 0:
89 raise Exception("Invalid frames through direct link")
90 if ap > 0:
91 raise Exception("Unexpected frames through AP path")
92 if inv_ap > 0:
93 raise Exception("Invalid frames through AP path")
94
95def 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)
99 if dl > 0:
100 raise Exception("Unexpected frames through direct link")
101 if inv_dl > 0:
102 raise Exception("Invalid frames through direct link")
103 if ap == 0:
104 raise Exception("No valid frames through AP path")
105 if inv_ap > 0:
106 raise Exception("Invalid frames through AP path")
107
a9bdfd49 108def setup_tdls(sta0, sta1, bssid, reverse=False, expect_fail=False):
81266da7
JM
109 logger.info("Setup TDLS")
110 addr0 = sta0.p2p_interface_addr()
111 addr1 = sta1.p2p_interface_addr()
dc4e222c
JM
112 wlantest_tdls_clear(bssid, addr0, addr1);
113 wlantest_tdls_clear(bssid, addr1, addr0);
81266da7
JM
114 sta0.tdls_setup(addr1)
115 time.sleep(1)
a9bdfd49
JM
116 if expect_fail:
117 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
118 return
81266da7
JM
119 if reverse:
120 addr1 = sta0.p2p_interface_addr()
121 addr0 = sta1.p2p_interface_addr()
81266da7
JM
122 conf = wlantest_tdls("setup_conf_ok", bssid, addr0, addr1);
123 if conf == 0:
124 raise Exception("No TDLS Setup Confirm (success) seen")
dc4e222c 125 tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
81266da7
JM
126
127def 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)
132 time.sleep(1)
133 teardown = wlantest_tdls("teardown", bssid, addr0, addr1);
134 if teardown == 0:
135 raise Exception("No TDLS Setup Teardown seen")
dc4e222c 136 tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
81266da7
JM
137
138def test_ap_wpa2_tdls(dev):
139 """WPA2-PSK AP and two stations using TDLS"""
b8cd4c54 140 start_ap_wpa2_psk(ap_ifname)
81266da7
JM
141 bssid = "02:00:00:00:02:00"
142 wlantest_setup()
e492837b 143 connect_2sta_wpa2_psk(dev)
81266da7
JM
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)
148
149def test_ap_wpa2_tdls_concurrent_init(dev):
150 """Concurrent TDLS setup initiation"""
b8cd4c54 151 start_ap_wpa2_psk(ap_ifname)
81266da7
JM
152 bssid = "02:00:00:00:02:00"
153 wlantest_setup()
e492837b 154 connect_2sta_wpa2_psk(dev)
81266da7
JM
155 dev[0].request("SET tdls_testing 0x80")
156 setup_tdls(dev[1], dev[0], bssid, reverse=True)
157
158def test_ap_wpa2_tdls_concurrent_init2(dev):
159 """Concurrent TDLS setup initiation (reverse)"""
b8cd4c54 160 start_ap_wpa2_psk(ap_ifname)
81266da7
JM
161 bssid = "02:00:00:00:02:00"
162 wlantest_setup()
e492837b 163 connect_2sta_wpa2_psk(dev)
81266da7
JM
164 dev[1].request("SET tdls_testing 0x80")
165 setup_tdls(dev[0], dev[1], bssid)
166
a9bdfd49
JM
167def test_ap_wpa2_tdls_decline_resp(dev):
168 """Decline TDLS Setup Response"""
b8cd4c54 169 start_ap_wpa2_psk(ap_ifname)
a9bdfd49
JM
170 bssid = "02:00:00:00:02:00"
171 wlantest_setup()
e492837b 172 connect_2sta_wpa2_psk(dev)
a9bdfd49
JM
173 dev[1].request("SET tdls_testing 0x200")
174 setup_tdls(dev[1], dev[0], bssid, expect_fail=True)
175
176def test_ap_wpa2_tdls_long_lifetime(dev):
177 """TDLS with long TPK lifetime"""
b8cd4c54 178 start_ap_wpa2_psk(ap_ifname)
a9bdfd49
JM
179 bssid = "02:00:00:00:02:00"
180 wlantest_setup()
e492837b 181 connect_2sta_wpa2_psk(dev)
a9bdfd49
JM
182 dev[1].request("SET tdls_testing 0x40")
183 setup_tdls(dev[1], dev[0], bssid)
184
185def test_ap_wpa2_tdls_long_frame(dev):
186 """TDLS with long setup/teardown frames"""
b8cd4c54 187 start_ap_wpa2_psk(ap_ifname)
a9bdfd49
JM
188 bssid = "02:00:00:00:02:00"
189 wlantest_setup()
e492837b 190 connect_2sta_wpa2_psk(dev)
a9bdfd49
JM
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)
196
197def test_ap_wpa2_tdls_reneg(dev):
198 """Renegotiate TDLS link"""
b8cd4c54 199 start_ap_wpa2_psk(ap_ifname)
a9bdfd49
JM
200 bssid = "02:00:00:00:02:00"
201 wlantest_setup()
e492837b 202 connect_2sta_wpa2_psk(dev)
a9bdfd49
JM
203 setup_tdls(dev[1], dev[0], bssid)
204 setup_tdls(dev[0], dev[1], bssid)
205
206def test_ap_wpa2_tdls_wrong_lifetime_resp(dev):
207 """Incorrect TPK lifetime in TDLS Setup Response"""
b8cd4c54 208 start_ap_wpa2_psk(ap_ifname)
a9bdfd49
JM
209 bssid = "02:00:00:00:02:00"
210 wlantest_setup()
e492837b 211 connect_2sta_wpa2_psk(dev)
a9bdfd49
JM
212 dev[1].request("SET tdls_testing 0x10")
213 setup_tdls(dev[0], dev[1], bssid, expect_fail=True)
214
215def test_ap_wpa2_tdls_diff_rsnie(dev):
216 """TDLS with different RSN IEs"""
b8cd4c54 217 start_ap_wpa2_psk(ap_ifname)
a9bdfd49
JM
218 bssid = "02:00:00:00:02:00"
219 wlantest_setup()
e492837b 220 connect_2sta_wpa2_psk(dev)
a9bdfd49
JM
221 dev[1].request("SET tdls_testing 0x2")
222 setup_tdls(dev[1], dev[0], bssid)
223 teardown_tdls(dev[1], dev[0], bssid)
224
e492837b
JM
225def test_ap_wpa_tdls(dev):
226 """WPA-PSK AP and two stations using TDLS"""
e259d186 227 hostapd.add_ap(ap_ifname, hostapd.wpa_params(ssid="test-wpa-psk", passphrase="12345678"))
e492837b
JM
228 bssid = "02:00:00:00:02:00"
229 wlantest_setup()
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)
234
235def test_ap_wpa_mixed_tdls(dev):
236 """WPA+WPA2-PSK AP and two stations using TDLS"""
e259d186 237 hostapd.add_ap(ap_ifname, hostapd.wpa_mixed_params(ssid="test-wpa-mixed-psk", passphrase="12345678"))
e492837b
JM
238 bssid = "02:00:00:00:02:00"
239 wlantest_setup()
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)
244
0165c4be
JM
245def test_ap_wep_tdls(dev):
246 """WEP AP and two stations using TDLS"""
e259d186 247 hostapd.add_ap(ap_ifname, { "ssid": "test-wep", "wep_key0": '"hello"' })
0165c4be
JM
248 bssid = "02:00:00:00:02:00"
249 wlantest_setup()
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)
254
255def test_ap_open_tdls(dev):
256 """Open AP and two stations using TDLS"""
e259d186 257 hostapd.add_ap(ap_ifname, { "ssid": "test-open" })
0165c4be
JM
258 bssid = "02:00:00:00:02:00"
259 wlantest_setup()
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)