]>
Commit | Line | Data |
---|---|---|
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 | ||
9 | import time | |
10 | import subprocess | |
11 | import logging | |
12 | logger = logging.getLogger(__name__) | |
13 | ||
14 | import hwsim_utils | |
b8cd4c54 JM |
15 | from hostapd import HostapdGlobal |
16 | from hostapd import Hostapd | |
e259d186 | 17 | import hostapd |
b8cd4c54 JM |
18 | |
19 | ap_ifname = 'wlan2' | |
20 | ||
21 | def 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 | 25 | def 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 |
30 | def 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 |
35 | def connect_2sta_wpa2_psk(dev): |
36 | connect_2sta(dev, "test-wpa2-psk") | |
37 | ||
38 | def connect_2sta_wpa_psk(dev): | |
39 | connect_2sta(dev, "test-wpa-psk") | |
40 | ||
41 | def 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 | |
46 | def 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 | |
51 | def 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 |
56 | def 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 | ||
64 | def wlantest_tdls_clear(bssid, addr1, addr2): | |
65 | subprocess.call(["../../wlantest/wlantest_cli", | |
66 | "clear_tdls_counters", bssid, addr1, addr2]); | |
67 | ||
68 | def 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 |
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] | |
81 | ||
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) | |
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 | ||
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) | |
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 | 108 | def 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 | |
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) | |
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 | |
138 | def 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 | ||
149 | def 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 | ||
158 | def 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 |
167 | def 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 | ||
176 | def 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 | ||
185 | def 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 | ||
197 | def 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 | ||
206 | def 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 | ||
215 | def 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 |
225 | def 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 | ||
235 | def 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 |
245 | def 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 | ||
255 | def 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) |