1# wpa_supplicant control interface 2# Copyright (c) 2014, Qualcomm Atheros, Inc. 3# 4# This software may be distributed under the terms of the BSD license. 5# See README for more details. 6 7from remotehost import remote_compatible 8import logging 9logger = logging.getLogger() 10import os 11import socket 12import subprocess 13import time 14import binascii 15 16import hostapd 17import hwsim_utils 18from hwsim import HWSimRadio 19from wpasupplicant import WpaSupplicant 20from utils import * 21from test_wpas_ap import wait_ap_ready 22 23@remote_compatible 24def test_wpas_ctrl_network(dev): 25 """wpa_supplicant ctrl_iface network set/get""" 26 skip_without_tkip(dev[0]) 27 id = dev[0].add_network() 28 29 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id)): 30 raise Exception("Unexpected success for invalid SET_NETWORK") 31 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " name"): 32 raise Exception("Unexpected success for invalid SET_NETWORK") 33 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id + 1) + " proto OPEN"): 34 raise Exception("Unexpected success for invalid network id") 35 if "FAIL" not in dev[0].request("GET_NETWORK " + str(id)): 36 raise Exception("Unexpected success for invalid GET_NETWORK") 37 if "FAIL" not in dev[0].request("GET_NETWORK " + str(id + 1) + " proto"): 38 raise Exception("Unexpected success for invalid network id") 39 40 if "OK" not in dev[0].request("SET_NETWORK " + str(id) + " proto \t WPA2 "): 41 raise Exception("Unexpected failure for SET_NETWORK proto") 42 res = dev[0].request("GET_NETWORK " + str(id) + " proto") 43 if res != "RSN": 44 raise Exception("Unexpected SET_NETWORK/GET_NETWORK conversion for proto: " + res) 45 46 if "OK" not in dev[0].request("SET_NETWORK " + str(id) + " key_mgmt \t WPA-PSK "): 47 raise Exception("Unexpected success for SET_NETWORK key_mgmt") 48 res = dev[0].request("GET_NETWORK " + str(id) + " key_mgmt") 49 if res != "WPA-PSK": 50 raise Exception("Unexpected SET_NETWORK/GET_NETWORK conversion for key_mgmt: " + res) 51 52 if "OK" not in dev[0].request("SET_NETWORK " + str(id) + " auth_alg \t OPEN "): 53 raise Exception("Unexpected failure for SET_NETWORK auth_alg") 54 res = dev[0].request("GET_NETWORK " + str(id) + " auth_alg") 55 if res != "OPEN": 56 raise Exception("Unexpected SET_NETWORK/GET_NETWORK conversion for auth_alg: " + res) 57 58 if "OK" not in dev[0].request("SET_NETWORK " + str(id) + " eap \t TLS "): 59 raise Exception("Unexpected failure for SET_NETWORK eap") 60 res = dev[0].request("GET_NETWORK " + str(id) + " eap") 61 if res != "TLS": 62 raise Exception("Unexpected SET_NETWORK/GET_NETWORK conversion for eap: " + res) 63 64 tests = ("bssid foo", "key_mgmt foo", "key_mgmt ", "group NONE") 65 for t in tests: 66 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " " + t): 67 raise Exception("Unexpected success for invalid SET_NETWORK: " + t) 68 69 tests = [("key_mgmt", "WPA-PSK WPA-EAP IEEE8021X NONE WPA-NONE FT-PSK FT-EAP WPA-PSK-SHA256 WPA-EAP-SHA256"), 70 ("pairwise", "CCMP-256 GCMP-256 CCMP GCMP TKIP"), 71 ("group", "CCMP-256 GCMP-256 CCMP GCMP TKIP"), 72 ("auth_alg", "OPEN SHARED LEAP"), 73 ("scan_freq", "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"), 74 ("freq_list", "2412 2417"), 75 ("scan_ssid", "1"), 76 ("bssid", "00:11:22:33:44:55"), 77 ("proto", "WPA RSN OSEN"), 78 ("eap", "TLS"), 79 ("go_p2p_dev_addr", "22:33:44:55:66:aa"), 80 ("p2p_client_list", "22:33:44:55:66:bb 02:11:22:33:44:55")] 81 if "SAE" not in dev[0].get_capability("auth_alg"): 82 tests.append(("key_mgmt", "WPS OSEN")) 83 else: 84 tests.append(("key_mgmt", "WPS SAE FT-SAE OSEN")) 85 86 dev[0].set_network_quoted(id, "ssid", "test") 87 for field, value in tests: 88 dev[0].set_network(id, field, value) 89 res = dev[0].get_network(id, field) 90 if res != value: 91 raise Exception("Unexpected response for '" + field + "': '" + res + "'") 92 93 try: 94 value = "WPA-EAP-SUITE-B WPA-EAP-SUITE-B-192" 95 dev[0].set_network(id, "key_mgmt", value) 96 res = dev[0].get_network(id, "key_mgmt") 97 if res != value: 98 raise Exception("Unexpected response for key_mgmt") 99 except Exception as e: 100 if str(e).startswith("Unexpected"): 101 raise 102 else: 103 pass 104 105 q_tests = (("identity", "hello"), 106 ("anonymous_identity", "foo@nowhere.com")) 107 for field, value in q_tests: 108 dev[0].set_network_quoted(id, field, value) 109 res = dev[0].get_network(id, field) 110 if res != '"' + value + '"': 111 raise Exception("Unexpected quoted response for '" + field + "': '" + res + "'") 112 113 get_tests = (("foo", None), ("ssid", '"test"')) 114 for field, value in get_tests: 115 res = dev[0].get_network(id, field) 116 if res != value: 117 raise Exception("Unexpected response for '" + field + "': '" + res + "'") 118 119 if dev[0].get_network(id, "password"): 120 raise Exception("Unexpected response for 'password'") 121 dev[0].set_network_quoted(id, "password", "foo") 122 if dev[0].get_network(id, "password") != '*': 123 raise Exception("Unexpected response for 'password' (expected *)") 124 dev[0].set_network(id, "password", "hash:12345678901234567890123456789012") 125 if dev[0].get_network(id, "password") != '*': 126 raise Exception("Unexpected response for 'password' (expected *)") 127 dev[0].set_network(id, "password", "NULL") 128 if dev[0].get_network(id, "password"): 129 raise Exception("Unexpected response for 'password'") 130 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:12"): 131 raise Exception("Unexpected success for invalid password hash") 132 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:123456789012345678x0123456789012"): 133 raise Exception("Unexpected success for invalid password hash") 134 135 dev[0].set_network(id, "identity", "414243") 136 if dev[0].get_network(id, "identity") != '"ABC"': 137 raise Exception("Unexpected identity hex->text response") 138 139 dev[0].set_network(id, "identity", 'P"abc\ndef"') 140 if dev[0].get_network(id, "identity") != "6162630a646566": 141 raise Exception("Unexpected identity printf->hex response") 142 143 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity P"foo'): 144 raise Exception("Unexpected success for invalid identity string") 145 146 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity 12x3'): 147 raise Exception("Unexpected success for invalid identity string") 148 149 if "WEP40" in dev[0].get_capability("group"): 150 for i in range(0, 4): 151 if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' wep_key' + str(i) + ' aabbccddee'): 152 raise Exception("Unexpected wep_key set failure") 153 if dev[0].get_network(id, "wep_key" + str(i)) != '*': 154 raise Exception("Unexpected wep_key get failure") 155 156 if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'): 157 raise Exception("Unexpected failure for psk_list string") 158 159 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list 00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'): 160 raise Exception("Unexpected success for invalid psk_list string") 161 162 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'): 163 raise Exception("Unexpected success for invalid psk_list string") 164 165 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55+0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'): 166 raise Exception("Unexpected success for invalid psk_list string") 167 168 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde'): 169 raise Exception("Unexpected success for invalid psk_list string") 170 171 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdex'): 172 raise Exception("Unexpected success for invalid psk_list string") 173 174 if dev[0].get_network(id, "psk_list"): 175 raise Exception("Unexpected psk_list get response") 176 177 if dev[0].list_networks()[0]['ssid'] != "test": 178 raise Exception("Unexpected ssid in LIST_NETWORKS") 179 dev[0].set_network(id, "ssid", "NULL") 180 if dev[0].list_networks()[0]['ssid'] != "": 181 raise Exception("Unexpected ssid in LIST_NETWORKS after clearing it") 182 183 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' ssid "0123456789abcdef0123456789abcdef0"'): 184 raise Exception("Too long SSID accepted") 185 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid qwerty'): 186 raise Exception("Invalid integer accepted") 187 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid 2'): 188 raise Exception("Too large integer accepted") 189 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk 12345678'): 190 raise Exception("Invalid PSK accepted") 191 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567"'): 192 raise Exception("Too short PSK accepted") 193 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567890123456789012345678901234567890123456789012345678901234"'): 194 raise Exception("Too long PSK accepted") 195 dev[0].set_network_quoted(id, "psk", "123456768") 196 dev[0].set_network_quoted(id, "psk", "123456789012345678901234567890123456789012345678901234567890123") 197 if dev[0].get_network(id, "psk") != '*': 198 raise Exception("Unexpected psk read result") 199 200 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' eap UNKNOWN'): 201 raise Exception("Unknown EAP method accepted") 202 203 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' password "foo'): 204 raise Exception("Invalid password accepted") 205 206 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "foo'): 207 raise Exception("Invalid WEP key accepted") 208 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "12345678901234567"'): 209 raise Exception("Too long WEP key accepted") 210 if "WEP40" in dev[0].get_capability("group"): 211 # too short WEP key is ignored 212 dev[0].set_network_quoted(id, "wep_key0", "1234") 213 dev[0].set_network_quoted(id, "wep_key1", "12345") 214 dev[0].set_network_quoted(id, "wep_key2", "1234567890123") 215 dev[0].set_network_quoted(id, "wep_key3", "1234567890123456") 216 217 dev[0].set_network(id, "go_p2p_dev_addr", "any") 218 if dev[0].get_network(id, "go_p2p_dev_addr") is not None: 219 raise Exception("Unexpected go_p2p_dev_addr value") 220 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' go_p2p_dev_addr 00:11:22:33:44'): 221 raise Exception("Invalid go_p2p_dev_addr accepted") 222 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44'): 223 raise Exception("Invalid p2p_client_list accepted") 224 if "FAIL" in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44:55 00:1'): 225 raise Exception("p2p_client_list truncation workaround failed") 226 if dev[0].get_network(id, "p2p_client_list") != "00:11:22:33:44:55": 227 raise Exception("p2p_client_list truncation workaround did not work") 228 229 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg '): 230 raise Exception("Empty auth_alg accepted") 231 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg FOO'): 232 raise Exception("Invalid auth_alg accepted") 233 234 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto '): 235 raise Exception("Empty proto accepted") 236 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto FOO'): 237 raise Exception("Invalid proto accepted") 238 239 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise '): 240 raise Exception("Empty pairwise accepted") 241 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise FOO'): 242 raise Exception("Invalid pairwise accepted") 243 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise WEP40'): 244 raise Exception("Invalid pairwise accepted") 245 246 if "OK" not in dev[0].request('BSSID ' + str(id) + ' 00:11:22:33:44:55'): 247 raise Exception("Unexpected BSSID failure") 248 if dev[0].request("GET_NETWORK 0 bssid") != '00:11:22:33:44:55': 249 raise Exception("BSSID command did not set network bssid") 250 if "OK" not in dev[0].request('BSSID ' + str(id) + ' 00:00:00:00:00:00'): 251 raise Exception("Unexpected BSSID failure") 252 if "FAIL" not in dev[0].request("GET_NETWORK 0 bssid"): 253 raise Exception("bssid claimed configured after clearing") 254 if "FAIL" not in dev[0].request('BSSID 123 00:11:22:33:44:55'): 255 raise Exception("Unexpected BSSID success") 256 if "FAIL" not in dev[0].request('BSSID ' + str(id) + ' 00:11:22:33:44'): 257 raise Exception("Unexpected BSSID success") 258 if "FAIL" not in dev[0].request('BSSID ' + str(id)): 259 raise Exception("Unexpected BSSID success") 260 261 tests = ["02:11:22:33:44:55", 262 "02:11:22:33:44:55 02:ae:be:ce:53:77", 263 "02:11:22:33:44:55/ff:00:ff:00:ff:00", 264 "02:11:22:33:44:55/ff:00:ff:00:ff:00 f2:99:88:77:66:55", 265 "f2:99:88:77:66:55 02:11:22:33:44:55/ff:00:ff:00:ff:00", 266 "f2:99:88:77:66:55 02:11:22:33:44:55/ff:00:ff:00:ff:00 12:34:56:78:90:ab", 267 "02:11:22:33:44:55/ff:ff:ff:00:00:00 02:ae:be:ce:53:77/00:00:00:00:00:ff"] 268 for val in tests: 269 dev[0].set_network(id, "bssid_ignore", val) 270 res = dev[0].get_network(id, "bssid_ignore") 271 if res != val: 272 raise Exception("Unexpected bssid_ignore value: %s != %s" % (res, val)) 273 dev[0].set_network(id, "bssid_accept", val) 274 res = dev[0].get_network(id, "bssid_accept") 275 if res != val: 276 raise Exception("Unexpected bssid_accept value: %s != %s" % (res, val)) 277 278 tests = ["foo", 279 "00:11:22:33:44:5", 280 "00:11:22:33:44:55q", 281 "00:11:22:33:44:55/", 282 "00:11:22:33:44:55/66:77:88:99:aa:b"] 283 for val in tests: 284 if "FAIL" not in dev[0].request("SET_NETWORK %d bssid_ignore %s" % (id, val)): 285 raise Exception("Invalid bssid_ignore value accepted") 286 287@remote_compatible 288def test_wpas_ctrl_network_oom(dev): 289 """wpa_supplicant ctrl_iface network OOM in string parsing""" 290 id = dev[0].add_network() 291 292 tests = [('"foo"', 1, 'dup_binstr;wpa_config_set'), 293 ('P"foo"', 1, 'dup_binstr;wpa_config_set'), 294 ('P"foo"', 2, 'wpa_config_set'), 295 ('112233', 1, 'wpa_config_set')] 296 for val, count, func in tests: 297 with alloc_fail(dev[0], count, func): 298 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' ssid ' + val): 299 raise Exception("Unexpected success for SET_NETWORK during OOM") 300 301@remote_compatible 302def test_wpas_ctrl_many_networks(dev, apdev): 303 """wpa_supplicant ctrl_iface LIST_NETWORKS with huge number of networks""" 304 for i in range(1000): 305 id = dev[0].add_network() 306 res = dev[0].request("LIST_NETWORKS") 307 if str(id) in res: 308 raise Exception("Last added network was unexpectedly included") 309 res = dev[0].request("LIST_NETWORKS LAST_ID=%d" % (id - 2)) 310 if str(id) not in res: 311 raise Exception("Last added network was not present when using LAST_ID") 312 # This command can take a very long time under valgrind testing on a low 313 # power CPU, so increase the command timeout significantly to avoid issues 314 # with the test case failing and following reset operation timing out. 315 dev[0].request("REMOVE_NETWORK all", timeout=60) 316 317@remote_compatible 318def test_wpas_ctrl_dup_network(dev, apdev): 319 """wpa_supplicant ctrl_iface DUP_NETWORK""" 320 ssid = "target" 321 passphrase = 'qwertyuiop' 322 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 323 hostapd.add_ap(apdev[0], params) 324 325 src = dev[0].connect("another", psk=passphrase, scan_freq="2412", 326 only_add_network=True) 327 id = dev[0].add_network() 328 dev[0].set_network_quoted(id, "ssid", ssid) 329 for f in ["key_mgmt", "psk", "scan_freq"]: 330 res = dev[0].request("DUP_NETWORK {} {} {}".format(src, id, f)) 331 if "OK" not in res: 332 raise Exception("DUP_NETWORK failed") 333 dev[0].connect_network(id) 334 335 if "FAIL" not in dev[0].request("DUP_NETWORK "): 336 raise Exception("Unexpected DUP_NETWORK success") 337 if "FAIL" not in dev[0].request("DUP_NETWORK %d " % id): 338 raise Exception("Unexpected DUP_NETWORK success") 339 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d" % (id, id)): 340 raise Exception("Unexpected DUP_NETWORK success") 341 if "FAIL" not in dev[0].request("DUP_NETWORK 123456 1234567 "): 342 raise Exception("Unexpected DUP_NETWORK success") 343 if "FAIL" not in dev[0].request("DUP_NETWORK %d 123456 " % id): 344 raise Exception("Unexpected DUP_NETWORK success") 345 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d foo" % (id, id)): 346 raise Exception("Unexpected DUP_NETWORK success") 347 dev[0].request("DISCONNECT") 348 if "OK" not in dev[0].request("DUP_NETWORK %d %d ssid" % (id, id)): 349 raise Exception("Unexpected DUP_NETWORK failure") 350 351@remote_compatible 352def test_wpas_ctrl_dup_network_global(dev, apdev): 353 """wpa_supplicant ctrl_iface DUP_NETWORK (global)""" 354 ssid = "target" 355 passphrase = 'qwertyuiop' 356 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) 357 hostapd.add_ap(apdev[0], params) 358 359 src = dev[0].connect("another", psk=passphrase, scan_freq="2412", 360 only_add_network=True) 361 id = dev[0].add_network() 362 dev[0].set_network_quoted(id, "ssid", ssid) 363 for f in ["key_mgmt", "psk", "scan_freq"]: 364 res = dev[0].global_request("DUP_NETWORK {} {} {} {} {}".format(dev[0].ifname, dev[0].ifname, src, id, f)) 365 if "OK" not in res: 366 raise Exception("DUP_NETWORK failed") 367 dev[0].connect_network(id) 368 369 if "FAIL" not in dev[0].global_request("DUP_NETWORK "): 370 raise Exception("Unexpected DUP_NETWORK success") 371 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s" % dev[0].ifname): 372 raise Exception("Unexpected DUP_NETWORK success") 373 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s %s" % (dev[0].ifname, dev[0].ifname)): 374 raise Exception("Unexpected DUP_NETWORK success") 375 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s %s %d" % (dev[0].ifname, dev[0].ifname, id)): 376 raise Exception("Unexpected DUP_NETWORK success") 377 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s %s %d %d" % (dev[0].ifname, dev[0].ifname, id, id)): 378 raise Exception("Unexpected DUP_NETWORK success") 379 dev[0].request("DISCONNECT") 380 if "OK" not in dev[0].global_request("DUP_NETWORK %s %s %d %d ssid" % (dev[0].ifname, dev[0].ifname, id, id)): 381 raise Exception("Unexpected DUP_NETWORK failure") 382 383def add_cred(dev): 384 id = dev.add_cred() 385 ev = dev.wait_event(["CRED-ADDED"]) 386 if ev is None: 387 raise Exception("Missing CRED-ADDED event") 388 if " " + str(id) not in ev: 389 raise Exception("CRED-ADDED event without matching id") 390 return id 391 392def set_cred(dev, id, field, value): 393 dev.set_cred(id, field, value) 394 ev = dev.wait_event(["CRED-MODIFIED"]) 395 if ev is None: 396 raise Exception("Missing CRED-MODIFIED event") 397 if " " + str(id) + " " not in ev: 398 raise Exception("CRED-MODIFIED event without matching id") 399 if field not in ev: 400 raise Exception("CRED-MODIFIED event without matching field") 401 402def set_cred_quoted(dev, id, field, value): 403 dev.set_cred_quoted(id, field, value) 404 ev = dev.wait_event(["CRED-MODIFIED"]) 405 if ev is None: 406 raise Exception("Missing CRED-MODIFIED event") 407 if " " + str(id) + " " not in ev: 408 raise Exception("CRED-MODIFIED event without matching id") 409 if field not in ev: 410 raise Exception("CRED-MODIFIED event without matching field") 411 412def remove_cred(dev, id): 413 dev.remove_cred(id) 414 ev = dev.wait_event(["CRED-REMOVED"]) 415 if ev is None: 416 raise Exception("Missing CRED-REMOVED event") 417 if " " + str(id) not in ev: 418 raise Exception("CRED-REMOVED event without matching id") 419 420@remote_compatible 421def test_wpas_ctrl_cred(dev): 422 """wpa_supplicant ctrl_iface cred set""" 423 id1 = add_cred(dev[0]) 424 if "FAIL" not in dev[0].request("SET_CRED " + str(id1 + 1) + " temporary 1"): 425 raise Exception("SET_CRED succeeded unexpectedly on unknown cred id") 426 if "FAIL" not in dev[0].request("SET_CRED " + str(id1)): 427 raise Exception("Invalid SET_CRED succeeded unexpectedly") 428 if "FAIL" not in dev[0].request("SET_CRED " + str(id1) + " temporary"): 429 raise Exception("Invalid SET_CRED succeeded unexpectedly") 430 if "FAIL" not in dev[0].request("GET_CRED " + str(id1 + 1) + " temporary"): 431 raise Exception("GET_CRED succeeded unexpectedly on unknown cred id") 432 if "FAIL" not in dev[0].request("GET_CRED " + str(id1)): 433 raise Exception("Invalid GET_CRED succeeded unexpectedly") 434 if "FAIL" not in dev[0].request("GET_CRED " + str(id1) + " foo"): 435 raise Exception("Invalid GET_CRED succeeded unexpectedly") 436 id = add_cred(dev[0]) 437 id2 = add_cred(dev[0]) 438 set_cred(dev[0], id, "temporary", "1") 439 set_cred(dev[0], id, "priority", "1") 440 set_cred(dev[0], id, "pcsc", "1") 441 set_cred(dev[0], id, "sim_num", "0") 442 set_cred_quoted(dev[0], id, "private_key_passwd", "test") 443 set_cred_quoted(dev[0], id, "domain_suffix_match", "test") 444 set_cred_quoted(dev[0], id, "phase1", "test") 445 set_cred_quoted(dev[0], id, "phase2", "test") 446 447 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " eap FOO"): 448 raise Exception("Unexpected success on unknown EAP method") 449 450 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " username 12xa"): 451 raise Exception("Unexpected success on invalid string") 452 453 for i in ("11", "1122", "112233445566778899aabbccddeeff00"): 454 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " roaming_consortium " + i): 455 raise Exception("Unexpected success on invalid roaming_consortium") 456 457 dev[0].set_cred(id, "excluded_ssid", "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff") 458 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " excluded_ssid 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"): 459 raise Exception("Unexpected success on invalid excluded_ssid") 460 461 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " foo 4142"): 462 raise Exception("Unexpected success on unknown field") 463 464 tests = ["sp_priority 256", 465 'roaming_partner "example.org"', 466 'roaming_partner "' + 200*'a' + '.example.org,"', 467 'roaming_partner "example.org,1"', 468 'roaming_partner "example.org,1,2"', 469 'roaming_partner "example.org,1,2,ABC"'] 470 for t in tests: 471 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " " + t): 472 raise Exception("Unexpected success on invalid SET_CRED value: " + t) 473 474 id3 = add_cred(dev[0]) 475 id4 = add_cred(dev[0]) 476 if len(dev[0].request("LIST_CREDS").splitlines()) != 6: 477 raise Exception("Unexpected LIST_CREDS result(1)") 478 479 remove_cred(dev[0], id1) 480 remove_cred(dev[0], id3) 481 remove_cred(dev[0], id4) 482 remove_cred(dev[0], id2) 483 remove_cred(dev[0], id) 484 if "FAIL" not in dev[0].request("REMOVE_CRED 1"): 485 raise Exception("Unexpected success on invalid remove cred") 486 if len(dev[0].request("LIST_CREDS").splitlines()) != 1: 487 raise Exception("Unexpected LIST_CREDS result(2)") 488 489 id = add_cred(dev[0]) 490 values = [("temporary", "1", False), 491 ("temporary", "0", False), 492 ("pcsc", "1", False), 493 ("realm", "example.com", True), 494 ("username", "user@example.com", True), 495 ("password", "foo", True, "*"), 496 ("ca_cert", "ca.pem", True), 497 ("client_cert", "user.pem", True), 498 ("private_key", "key.pem", True), 499 ("private_key_passwd", "foo", True, "*"), 500 ("imsi", "310026-000000000", True), 501 ("milenage", "foo", True, "*"), 502 ("domain_suffix_match", "example.com", True), 503 ("domain", "example.com", True), 504 ("domain", "example.org", True, "example.com\nexample.org"), 505 ("roaming_consortium", "0123456789", False), 506 ("required_roaming_consortium", "456789", False), 507 ("eap", "TTLS", False), 508 ("phase1", "foo=bar1", True), 509 ("phase2", "foo=bar2", True), 510 ("excluded_ssid", "test", True), 511 ("excluded_ssid", "foo", True, "test\nfoo"), 512 ("roaming_partner", "example.com,0,4,*", True), 513 ("roaming_partner", "example.org,1,2,US", True, 514 "example.com,0,4,*\nexample.org,1,2,US"), 515 ("update_identifier", "4", False), 516 ("provisioning_sp", "sp.example.com", True), 517 ("sp_priority", "7", False), 518 ("min_dl_bandwidth_home", "100", False), 519 ("min_ul_bandwidth_home", "101", False), 520 ("min_dl_bandwidth_roaming", "102", False), 521 ("min_ul_bandwidth_roaming", "103", False), 522 ("max_bss_load", "57", False), 523 ("req_conn_capab", "6:22,80,443", False), 524 ("req_conn_capab", "17:500", False, "6:22,80,443\n17:500"), 525 ("req_conn_capab", "50", False, "6:22,80,443\n17:500\n50"), 526 ("ocsp", "1", False)] 527 for v in values: 528 if v[2]: 529 set_cred_quoted(dev[0], id, v[0], v[1]) 530 else: 531 set_cred(dev[0], id, v[0], v[1]) 532 val = dev[0].get_cred(id, v[0]) 533 if len(v) == 4: 534 expect = v[3] 535 else: 536 expect = v[1] 537 if val != expect: 538 raise Exception("Unexpected GET_CRED value for {}: {} != {}".format(v[0], val, expect)) 539 creds = dev[0].request("LIST_CREDS").splitlines() 540 if len(creds) != 2: 541 raise Exception("Unexpected LIST_CREDS result(3)") 542 if creds[1] != "0\texample.com\tuser@example.com\texample.com\t310026-000000000": 543 raise Exception("Unexpected LIST_CREDS value") 544 remove_cred(dev[0], id) 545 if len(dev[0].request("LIST_CREDS").splitlines()) != 1: 546 raise Exception("Unexpected LIST_CREDS result(4)") 547 548 id = add_cred(dev[0]) 549 set_cred_quoted(dev[0], id, "domain", "foo.example.com") 550 id = add_cred(dev[0]) 551 set_cred_quoted(dev[0], id, "domain", "bar.example.com") 552 id = add_cred(dev[0]) 553 set_cred_quoted(dev[0], id, "domain", "foo.example.com") 554 if "OK" not in dev[0].request("REMOVE_CRED sp_fqdn=foo.example.com"): 555 raise Exception("REMOVE_CRED failed") 556 creds = dev[0].request("LIST_CREDS") 557 if "foo.example.com" in creds: 558 raise Exception("REMOVE_CRED sp_fqdn did not remove cred") 559 if "bar.example.com" not in creds: 560 raise Exception("REMOVE_CRED sp_fqdn removed incorrect cred") 561 dev[0].request("REMOVE_CRED all") 562 563 id = add_cred(dev[0]) 564 set_cred_quoted(dev[0], id, "domain", "foo.example.com") 565 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com") 566 id = add_cred(dev[0]) 567 set_cred_quoted(dev[0], id, "domain", "bar.example.com") 568 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.bar.example.com") 569 id = add_cred(dev[0]) 570 set_cred_quoted(dev[0], id, "domain", "foo.example.com") 571 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com") 572 if "OK" not in dev[0].request("REMOVE_CRED provisioning_sp=sp.foo.example.com"): 573 raise Exception("REMOVE_CRED failed") 574 creds = dev[0].request("LIST_CREDS") 575 if "foo.example.com" in creds: 576 raise Exception("REMOVE_CRED provisioning_sp did not remove cred") 577 if "bar.example.com" not in creds: 578 raise Exception("REMOVE_CRED provisioning_sp removed incorrect cred") 579 dev[0].request("REMOVE_CRED all") 580 581 # Test large number of creds and LIST_CREDS truncation 582 dev[0].dump_monitor() 583 for i in range(0, 100): 584 id = add_cred(dev[0]) 585 set_cred_quoted(dev[0], id, "realm", "relatively.long.realm.test%d.example.com" % i) 586 dev[0].dump_monitor() 587 creds = dev[0].request("LIST_CREDS") 588 for i in range(0, 100): 589 dev[0].remove_cred(i) 590 dev[0].dump_monitor() 591 if len(creds) < 3900 or len(creds) > 4100: 592 raise Exception("Unexpected LIST_CREDS length: %d" % len(creds)) 593 if "test10.example.com" not in creds: 594 raise Exception("Missing credential") 595 if len(creds.splitlines()) > 95: 596 raise Exception("Too many LIST_CREDS entries in the buffer") 597 598def test_wpas_ctrl_pno(dev): 599 """wpa_supplicant ctrl_iface pno""" 600 if "FAIL" not in dev[0].request("SET pno 1"): 601 raise Exception("Unexpected success in enabling PNO without enabled network blocks") 602 id = dev[0].add_network() 603 dev[0].set_network_quoted(id, "ssid", "test") 604 dev[0].set_network(id, "key_mgmt", "NONE") 605 dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect") 606 #mac80211_hwsim does not yet support PNO, so this fails 607 if "FAIL" not in dev[0].request("SET pno 1"): 608 raise Exception("Unexpected success in enabling PNO") 609 if "FAIL" not in dev[0].request("SET pno 1 freq=2000-3000,5180"): 610 raise Exception("Unexpected success in enabling PNO") 611 if "FAIL" not in dev[0].request("SET pno 1 freq=0-6000"): 612 raise Exception("Unexpected success in enabling PNO") 613 if "FAIL" in dev[0].request("SET pno 0"): 614 raise Exception("Unexpected failure in disabling PNO") 615 616@remote_compatible 617def test_wpas_ctrl_get(dev): 618 """wpa_supplicant ctrl_iface get""" 619 if "FAIL" in dev[0].request("GET version"): 620 raise Exception("Unexpected get failure for version") 621 if "FAIL" in dev[0].request("GET wifi_display"): 622 raise Exception("Unexpected get failure for wifi_display") 623 if "FAIL" not in dev[0].request("GET foo"): 624 raise Exception("Unexpected success on get command") 625 626 dev[0].set("wifi_display", "0") 627 if dev[0].request("GET wifi_display") != '0': 628 raise Exception("Unexpected wifi_display value") 629 dev[0].set("wifi_display", "1") 630 if dev[0].request("GET wifi_display") != '1': 631 raise Exception("Unexpected wifi_display value") 632 dev[0].request("P2P_SET disabled 1") 633 if dev[0].request("GET wifi_display") != '0': 634 raise Exception("Unexpected wifi_display value (P2P disabled)") 635 dev[0].request("P2P_SET disabled 0") 636 if dev[0].request("GET wifi_display") != '1': 637 raise Exception("Unexpected wifi_display value (P2P re-enabled)") 638 dev[0].set("wifi_display", "0") 639 if dev[0].request("GET wifi_display") != '0': 640 raise Exception("Unexpected wifi_display value") 641 642@remote_compatible 643def test_wpas_ctrl_preauth(dev): 644 """wpa_supplicant ctrl_iface preauth""" 645 if "FAIL" not in dev[0].request("PREAUTH "): 646 raise Exception("Unexpected success on invalid PREAUTH") 647 if "FAIL" in dev[0].request("PREAUTH 00:11:22:33:44:55"): 648 raise Exception("Unexpected failure on PREAUTH") 649 650@remote_compatible 651def test_wpas_ctrl_tdls_discover(dev): 652 """wpa_supplicant ctrl_iface tdls_discover""" 653 if "FAIL" not in dev[0].request("TDLS_DISCOVER "): 654 raise Exception("Unexpected success on invalid TDLS_DISCOVER") 655 if "FAIL" not in dev[0].request("TDLS_DISCOVER 00:11:22:33:44:55"): 656 raise Exception("Unexpected success on TDLS_DISCOVER") 657 658@remote_compatible 659def test_wpas_ctrl_tdls_chan_switch(dev): 660 """wpa_supplicant ctrl_iface tdls_chan_switch error cases""" 661 for args in ['', '00:11:22:33:44:55']: 662 if "FAIL" not in dev[0].request("TDLS_CANCEL_CHAN_SWITCH " + args): 663 raise Exception("Unexpected success on invalid TDLS_CANCEL_CHAN_SWITCH: " + args) 664 665 for args in ['', 'foo ', '00:11:22:33:44:55 ', '00:11:22:33:44:55 q', 666 '00:11:22:33:44:55 81', '00:11:22:33:44:55 81 1234', 667 '00:11:22:33:44:55 81 1234 center_freq1=234 center_freq2=345 bandwidth=456 sec_channel_offset=567 ht vht']: 668 if "FAIL" not in dev[0].request("TDLS_CHAN_SWITCH " + args): 669 raise Exception("Unexpected success on invalid TDLS_CHAN_SWITCH: " + args) 670 671@remote_compatible 672def test_wpas_ctrl_addr(dev): 673 """wpa_supplicant ctrl_iface invalid address""" 674 if "FAIL" not in dev[0].request("TDLS_SETUP "): 675 raise Exception("Unexpected success on invalid TDLS_SETUP") 676 if "FAIL" not in dev[0].request("TDLS_TEARDOWN "): 677 raise Exception("Unexpected success on invalid TDLS_TEARDOWN") 678 if "FAIL" not in dev[0].request("FT_DS "): 679 raise Exception("Unexpected success on invalid FT_DS") 680 if "FAIL" not in dev[0].request("WPS_PBC 00:11:22:33:44"): 681 raise Exception("Unexpected success on invalid WPS_PBC") 682 if "FAIL" not in dev[0].request("WPS_PIN 00:11:22:33:44"): 683 raise Exception("Unexpected success on invalid WPS_PIN") 684 if "FAIL" not in dev[0].request("WPS_NFC 00:11:22:33:44"): 685 raise Exception("Unexpected success on invalid WPS_NFC") 686 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44 12345670"): 687 raise Exception("Unexpected success on invalid WPS_REG") 688 if "FAIL" not in dev[0].request("IBSS_RSN 00:11:22:33:44"): 689 raise Exception("Unexpected success on invalid IBSS_RSN") 690 if "FAIL" not in dev[0].request("BSSID_IGNORE 00:11:22:33:44"): 691 raise Exception("Unexpected success on invalid BSSID_IGNORE") 692 693@remote_compatible 694def test_wpas_ctrl_wps_errors(dev): 695 """wpa_supplicant ctrl_iface WPS error cases""" 696 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55"): 697 raise Exception("Unexpected success on invalid WPS_REG") 698 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233"): 699 raise Exception("Unexpected success on invalid WPS_REG") 700 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN"): 701 raise Exception("Unexpected success on invalid WPS_REG") 702 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN NONE"): 703 raise Exception("Unexpected success on invalid WPS_REG") 704 705 if "FAIL" not in dev[0].request("WPS_AP_PIN random"): 706 raise Exception("Unexpected success on WPS_AP_PIN in non-AP mode") 707 708 if "FAIL" not in dev[0].request("WPS_ER_PIN any"): 709 raise Exception("Unexpected success on invalid WPS_ER_PIN") 710 711 if "FAIL" not in dev[0].request("WPS_ER_LEARN 00:11:22:33:44:55"): 712 raise Exception("Unexpected success on invalid WPS_ER_LEARN") 713 714 if "FAIL" not in dev[0].request("WPS_ER_SET_CONFIG 00:11:22:33:44:55"): 715 raise Exception("Unexpected success on invalid WPS_ER_SET_CONFIG") 716 717 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55"): 718 raise Exception("Unexpected success on invalid WPS_ER_CONFIG") 719 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670"): 720 raise Exception("Unexpected success on invalid WPS_ER_CONFIG") 721 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233"): 722 raise Exception("Unexpected success on invalid WPS_ER_CONFIG") 723 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN"): 724 raise Exception("Unexpected success on invalid WPS_ER_CONFIG") 725 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN NONE"): 726 raise Exception("Unexpected success on invalid WPS_ER_CONFIG") 727 728 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN WPS"): 729 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN") 730 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN FOO 00:11:22:33:44:55"): 731 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN") 732 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN NDEF 00:11:22:33:44:55"): 733 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN") 734 735 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN FOO"): 736 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN") 737 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN WPS FOO"): 738 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN") 739 if "FAIL" not in dev[0].request("WPS_NFC_TOKEN FOO"): 740 raise Exception("Unexpected success on invalid WPS_NFC_TOKEN") 741 742@remote_compatible 743def test_wpas_ctrl_config_parser(dev): 744 """wpa_supplicant ctrl_iface SET config parser""" 745 if "FAIL" not in dev[0].request("SET pbc_in_m1 qwerty"): 746 raise Exception("Non-number accepted as integer") 747 if "FAIL" not in dev[0].request("SET eapol_version 0"): 748 raise Exception("Out-of-range value accepted") 749 if "FAIL" not in dev[0].request("SET eapol_version 10"): 750 raise Exception("Out-of-range value accepted") 751 752 if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"): 753 raise Exception("Too long string accepted") 754 755@remote_compatible 756def test_wpas_ctrl_mib(dev): 757 """wpa_supplicant ctrl_iface MIB""" 758 mib = dev[0].get_mib() 759 if "dot11RSNAOptionImplemented" not in mib: 760 raise Exception("Missing MIB entry") 761 if mib["dot11RSNAOptionImplemented"] != "TRUE": 762 raise Exception("Unexpected dot11RSNAOptionImplemented value") 763 764def test_wpas_ctrl_set_wps_params(dev): 765 """wpa_supplicant ctrl_iface SET config_methods""" 766 try: 767 _test_wpas_ctrl_set_wps_params(dev) 768 finally: 769 dev[2].request("SET config_methods ") 770 771def _test_wpas_ctrl_set_wps_params(dev): 772 ts = ["config_methods label virtual_display virtual_push_button keypad", 773 "device_type 1-0050F204-1", 774 "os_version 01020300", 775 "uuid 12345678-9abc-def0-1234-56789abcdef0"] 776 for t in ts: 777 if "OK" not in dev[2].request("SET " + t): 778 raise Exception("SET failed for: " + t) 779 780 ts = ["uuid 12345678+9abc-def0-1234-56789abcdef0", 781 "uuid 12345678-qabc-def0-1234-56789abcdef0", 782 "uuid 12345678-9abc+def0-1234-56789abcdef0", 783 "uuid 12345678-9abc-qef0-1234-56789abcdef0", 784 "uuid 12345678-9abc-def0+1234-56789abcdef0", 785 "uuid 12345678-9abc-def0-q234-56789abcdef0", 786 "uuid 12345678-9abc-def0-1234+56789abcdef0", 787 "uuid 12345678-9abc-def0-1234-q6789abcdef0", 788 "uuid qwerty"] 789 for t in ts: 790 if "FAIL" not in dev[2].request("SET " + t): 791 raise Exception("SET succeeded for: " + t) 792 793def test_wpas_ctrl_level(dev): 794 """wpa_supplicant ctrl_iface LEVEL""" 795 try: 796 if "FAIL" not in dev[2].request("LEVEL 3"): 797 raise Exception("Unexpected LEVEL success") 798 if "OK" not in dev[2].mon.request("LEVEL 2"): 799 raise Exception("Unexpected LEVEL failure") 800 dev[2].request("SCAN freq=2412") 801 ev = dev[2].wait_event(["State:"], timeout=5) 802 if ev is None: 803 raise Exception("No debug message received") 804 dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5) 805 finally: 806 dev[2].mon.request("LEVEL 3") 807 808@remote_compatible 809def test_wpas_ctrl_bssid_filter(dev, apdev): 810 """wpa_supplicant bssid_filter""" 811 try: 812 if "OK" not in dev[2].request("SET bssid_filter " + apdev[0]['bssid']): 813 raise Exception("Failed to set bssid_filter") 814 params = {"ssid": "test"} 815 hostapd.add_ap(apdev[0], params) 816 hostapd.add_ap(apdev[1], params) 817 dev[2].scan_for_bss(apdev[0]['bssid'], freq="2412") 818 dev[2].scan(freq="2412") 819 bss = dev[2].get_bss(apdev[0]['bssid']) 820 if bss is None or len(bss) == 0: 821 raise Exception("Missing BSS data") 822 bss = dev[2].get_bss(apdev[1]['bssid']) 823 if bss and len(bss) != 0: 824 raise Exception("Unexpected BSS data") 825 dev[2].request("SET bssid_filter " + apdev[0]['bssid'] + " " + \ 826 apdev[1]['bssid']) 827 dev[2].scan(freq="2412") 828 bss = dev[2].get_bss(apdev[0]['bssid']) 829 if bss is None or len(bss) == 0: 830 raise Exception("Missing BSS data") 831 bss = dev[2].get_bss(apdev[1]['bssid']) 832 if bss is None or len(bss) == 0: 833 raise Exception("Missing BSS data(2)") 834 res = dev[2].request("SCAN_RESULTS").splitlines() 835 if "test" not in res[1] or "test" not in res[2]: 836 raise Exception("SSID missing from SCAN_RESULTS") 837 if apdev[0]['bssid'] not in res[1] and apdev[1]['bssid'] not in res[1]: 838 raise Exception("BSS1 missing from SCAN_RESULTS") 839 if apdev[0]['bssid'] not in res[2] and apdev[1]['bssid'] not in res[2]: 840 raise Exception("BSS1 missing from SCAN_RESULTS") 841 842 if "FAIL" not in dev[2].request("SET bssid_filter 00:11:22:33:44:55 00:11:22:33:44"): 843 raise Exception("Unexpected success for invalid SET bssid_filter") 844 finally: 845 dev[2].request("SET bssid_filter ") 846 847@remote_compatible 848def test_wpas_ctrl_disallow_aps(dev, apdev): 849 """wpa_supplicant ctrl_iface disallow_aps""" 850 params = {"ssid": "test"} 851 hostapd.add_ap(apdev[0], params) 852 853 if "FAIL" not in dev[0].request("SET disallow_aps bssid "): 854 raise Exception("Unexpected success on invalid disallow_aps") 855 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44"): 856 raise Exception("Unexpected success on invalid disallow_aps") 857 if "FAIL" not in dev[0].request("SET disallow_aps ssid 0"): 858 raise Exception("Unexpected success on invalid disallow_aps") 859 if "FAIL" not in dev[0].request("SET disallow_aps ssid 4q"): 860 raise Exception("Unexpected success on invalid disallow_aps") 861 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 ssid 112233 ssid 123"): 862 raise Exception("Unexpected success on invalid disallow_aps") 863 if "FAIL" not in dev[0].request("SET disallow_aps ssid 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f00"): 864 raise Exception("Unexpected success on invalid disallow_aps") 865 if "FAIL" not in dev[0].request("SET disallow_aps foo 112233445566"): 866 raise Exception("Unexpected success on invalid disallow_aps") 867 868 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412") 869 hostapd.add_ap(apdev[1], params) 870 dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412") 871 dev[0].dump_monitor() 872 if "OK" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 bssid 00:22:33:44:55:66"): 873 raise Exception("Failed to set disallow_aps") 874 if "OK" not in dev[0].request("SET disallow_aps bssid " + apdev[0]['bssid']): 875 raise Exception("Failed to set disallow_aps") 876 ev = dev[0].wait_connected(timeout=30, error="Reassociation timed out") 877 if apdev[1]['bssid'] not in ev: 878 raise Exception("Unexpected BSSID") 879 880 dev[0].dump_monitor() 881 if "OK" not in dev[0].request("SET disallow_aps ssid " + binascii.hexlify(b"test").decode()): 882 raise Exception("Failed to set disallow_aps") 883 dev[0].wait_disconnected(timeout=5, error="Disconnection not seen") 884 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) 885 if ev is not None: 886 raise Exception("Unexpected reassociation") 887 888 dev[0].request("DISCONNECT") 889 dev[0].p2p_start_go(freq=2412) 890 if "OK" not in dev[0].request("SET disallow_aps "): 891 raise Exception("Failed to set disallow_aps") 892 893@remote_compatible 894def test_wpas_ctrl_blob(dev): 895 """wpa_supplicant ctrl_iface SET blob""" 896 if "FAIL" not in dev[0].request("SET blob foo"): 897 raise Exception("Unexpected SET success") 898 if "FAIL" not in dev[0].request("SET blob foo 0"): 899 raise Exception("Unexpected SET success") 900 if "FAIL" not in dev[0].request("SET blob foo 0q"): 901 raise Exception("Unexpected SET success") 902 if "OK" not in dev[0].request("SET blob foo 00"): 903 raise Exception("Unexpected SET failure") 904 if "OK" not in dev[0].request("SET blob foo 0011"): 905 raise Exception("Unexpected SET failure") 906 907@remote_compatible 908def test_wpas_ctrl_set_uapsd(dev): 909 """wpa_supplicant ctrl_iface SET uapsd""" 910 if "FAIL" not in dev[0].request("SET uapsd foo"): 911 raise Exception("Unexpected SET success") 912 if "FAIL" not in dev[0].request("SET uapsd 0,0,0"): 913 raise Exception("Unexpected SET success") 914 if "FAIL" not in dev[0].request("SET uapsd 0,0"): 915 raise Exception("Unexpected SET success") 916 if "FAIL" not in dev[0].request("SET uapsd 0"): 917 raise Exception("Unexpected SET success") 918 if "OK" not in dev[0].request("SET uapsd 1,1,1,1;1"): 919 raise Exception("Unexpected SET failure") 920 if "OK" not in dev[0].request("SET uapsd 0,0,0,0;0"): 921 raise Exception("Unexpected SET failure") 922 if "OK" not in dev[0].request("SET uapsd disable"): 923 raise Exception("Unexpected SET failure") 924 925def test_wpas_ctrl_set(dev): 926 """wpa_supplicant ctrl_iface SET""" 927 vals = ["foo", 928 "ampdu 0", 929 "radio_disable 0", 930 "ps 10", 931 "dot11RSNAConfigPMKLifetime 0", 932 "dot11RSNAConfigPMKReauthThreshold 101", 933 "dot11RSNAConfigSATimeout 0", 934 "wps_version_number -1", 935 "wps_version_number 256", 936 "fst_group_id ", 937 "fst_llt 0"] 938 for val in vals: 939 if "FAIL" not in dev[0].request("SET " + val): 940 raise Exception("Unexpected SET success for " + val) 941 942 vals = ["ps 1"] 943 for val in vals: 944 dev[0].request("SET " + val) 945 946 vals = ["EAPOL::heldPeriod 60", 947 "EAPOL::authPeriod 30", 948 "EAPOL::startPeriod 30", 949 "EAPOL::maxStart 3", 950 "dot11RSNAConfigSATimeout 60", 951 "ps -1", 952 "ps 0", 953 "no_keep_alive 0", 954 "tdls_disabled 1", 955 "tdls_disabled 0"] 956 for val in vals: 957 if "OK" not in dev[0].request("SET " + val): 958 raise Exception("Unexpected SET failure for " + val) 959 960 # This fails if wpa_supplicant is built with loadable EAP peer method 961 # support due to missing file and succeeds if no support for loadable 962 # methods is included, so don't check the return value for now. 963 dev[0].request("SET load_dynamic_eap /tmp/hwsim-eap-not-found.so") 964 965@remote_compatible 966def test_wpas_ctrl_get_capability(dev): 967 """wpa_supplicant ctrl_iface GET_CAPABILITY""" 968 if "FAIL" not in dev[0].request("GET_CAPABILITY 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"): 969 raise Exception("Unexpected success on invalid GET_CAPABILITY") 970 if "FAIL" not in dev[0].request("GET_CAPABILITY eap foo"): 971 raise Exception("Unexpected success on invalid GET_CAPABILITY") 972 if "AP" not in dev[0].request("GET_CAPABILITY modes strict"): 973 raise Exception("Unexpected GET_CAPABILITY response") 974 res = dev[0].get_capability("eap") 975 if "TTLS" not in res: 976 raise Exception("Unexpected GET_CAPABILITY eap response: " + str(res)) 977 978 res = dev[0].get_capability("pairwise") 979 if "CCMP" not in res: 980 raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res)) 981 982 res = dev[0].get_capability("group") 983 if "CCMP" not in res: 984 raise Exception("Unexpected GET_CAPABILITY group response: " + str(res)) 985 986 res = dev[0].get_capability("key_mgmt") 987 if "WPA-PSK" not in res or "WPA-EAP" not in res: 988 raise Exception("Unexpected GET_CAPABILITY key_mgmt response: " + str(res)) 989 990 res = dev[0].get_capability("key_mgmt iftype=STATION") 991 if "WPA-PSK" not in res or "WPA-EAP" not in res: 992 raise Exception("Unexpected GET_CAPABILITY key_mgmt iftype=STATION response: " + str(res)) 993 994 iftypes = [ "STATION", "AP_VLAN", "AP", "P2P_GO", "P2P_CLIENT", 995 "P2P_DEVICE", "MESH", "IBSS", "NAN", "UNKNOWN" ] 996 for i in iftypes: 997 res = dev[0].get_capability("key_mgmt iftype=" + i) 998 logger.info("GET_CAPABILITY key_mgmt iftype=%s: %s" % (i, res)) 999 1000 res = dev[0].get_capability("proto") 1001 if "WPA" not in res or "RSN" not in res: 1002 raise Exception("Unexpected GET_CAPABILITY proto response: " + str(res)) 1003 1004 res = dev[0].get_capability("auth_alg") 1005 if "OPEN" not in res or "SHARED" not in res: 1006 raise Exception("Unexpected GET_CAPABILITY auth_alg response: " + str(res)) 1007 1008 res = dev[0].get_capability("modes") 1009 if "IBSS" not in res or "AP" not in res: 1010 raise Exception("Unexpected GET_CAPABILITY modes response: " + str(res)) 1011 1012 res = dev[0].get_capability("channels") 1013 if "8" not in res or "36" not in res: 1014 raise Exception("Unexpected GET_CAPABILITY channels response: " + str(res)) 1015 1016 res = dev[0].get_capability("freq") 1017 if "2457" not in res or "5180" not in res: 1018 raise Exception("Unexpected GET_CAPABILITY freq response: " + str(res)) 1019 1020 res = dev[0].get_capability("tdls") 1021 if "EXTERNAL" not in res[0]: 1022 raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res)) 1023 1024 res = dev[0].get_capability("erp") 1025 if res is None or "ERP" not in res[0]: 1026 raise Exception("Unexpected GET_CAPABILITY erp response: " + str(res)) 1027 1028 if dev[0].get_capability("foo") is not None: 1029 raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res)) 1030 1031@remote_compatible 1032def test_wpas_ctrl_nfc_report_handover(dev): 1033 """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER""" 1034 vals = ["FOO", 1035 "ROLE freq=12345", 1036 "ROLE TYPE", 1037 "ROLE TYPE REQ", 1038 "ROLE TYPE REQ SEL", 1039 "ROLE TYPE 0Q SEL", 1040 "ROLE TYPE 00 SEL", 1041 "ROLE TYPE 00 0Q", 1042 "ROLE TYPE 00 00"] 1043 for v in vals: 1044 if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v): 1045 raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v) 1046 1047@remote_compatible 1048def test_wpas_ctrl_nfc_tag_read(dev): 1049 """wpa_supplicant ctrl_iface WPS_NFC_TAG_READ""" 1050 vals = ["FOO", "0Q", "00", "000000", "10000001", "10000000", "00000000", 1051 "100e0000", "100e0001ff", "100e000411110000", "100e0004100e0001"] 1052 for v in vals: 1053 if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v): 1054 raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v) 1055 1056@remote_compatible 1057def test_wpas_ctrl_nfc_get_handover(dev): 1058 """wpa_supplicant ctrl_iface NFC_GET_HANDOVER""" 1059 vals = ["FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P"] 1060 for v in vals: 1061 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_REQ " + v): 1062 raise Exception("Unexpected NFC_GET_HANDOVER_REQ success for " + v) 1063 1064 vals = ["NDEF WPS", "NDEF P2P-CR", "WPS P2P-CR"] 1065 for v in vals: 1066 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_REQ " + v): 1067 raise Exception("Unexpected NFC_GET_HANDOVER_REQ failure for " + v) 1068 1069 vals = ["FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P", 1070 "NDEF WPS", "NDEF WPS uuid"] 1071 for v in vals: 1072 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_SEL " + v): 1073 raise Exception("Unexpected NFC_GET_HANDOVER_SEL success for " + v) 1074 1075 vals = ["NDEF P2P-CR", "WPS P2P-CR", "NDEF P2P-CR-TAG", 1076 "WPS P2P-CR-TAG"] 1077 for v in vals: 1078 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_SEL " + v): 1079 raise Exception("Unexpected NFC_GET_HANDOVER_SEL failure for " + v) 1080 1081def get_bssid_ignore_list(dev): 1082 return dev.request("BSSID_IGNORE").splitlines() 1083 1084@remote_compatible 1085def test_wpas_ctrl_bssid_ignore(dev): 1086 """wpa_supplicant ctrl_iface BSSID_IGNORE""" 1087 if "OK" not in dev[0].request("BSSID_IGNORE clear"): 1088 raise Exception("BSSID_IGNORE clear failed") 1089 b = get_bssid_ignore_list(dev[0]) 1090 if len(b) != 0: 1091 raise Exception("Unexpected BSSID ignore list contents: " + str(b)) 1092 if "OK" not in dev[0].request("BSSID_IGNORE 00:11:22:33:44:55"): 1093 raise Exception("BSSID_IGNORE add failed") 1094 b = get_bssid_ignore_list(dev[0]) 1095 if "00:11:22:33:44:55" not in b: 1096 raise Exception("Unexpected BSSID ignore list contents: " + str(b)) 1097 if "OK" not in dev[0].request("BSSID_IGNORE 00:11:22:33:44:56"): 1098 raise Exception("BSSID_IGNORE add failed") 1099 b = get_bssid_ignore_list(dev[0]) 1100 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b: 1101 raise Exception("Unexpected BSSID ignore list contents: " + str(b)) 1102 if "OK" not in dev[0].request("BSSID_IGNORE 00:11:22:33:44:56"): 1103 raise Exception("BSSID_IGNORE add failed") 1104 b = get_bssid_ignore_list(dev[0]) 1105 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b or len(b) != 2: 1106 raise Exception("Unexpected BSSID ignore list contents: " + str(b)) 1107 1108 if "OK" not in dev[0].request("BSSID_IGNORE clear"): 1109 raise Exception("BSSID_IGNORE clear failed") 1110 if dev[0].request("BSSID_IGNORE") != "": 1111 raise Exception("Unexpected BSSID ignore list contents") 1112 1113@remote_compatible 1114def test_wpas_ctrl_bssid_ignore_oom(dev): 1115 """wpa_supplicant ctrl_iface BSSID_IGNORE and out-of-memory""" 1116 with alloc_fail(dev[0], 1, "wpa_bssid_ignore_add"): 1117 if "FAIL" not in dev[0].request("BSSID_IGNORE aa:bb:cc:dd:ee:ff"): 1118 raise Exception("Unexpected success with allocation failure") 1119 1120def test_wpas_ctrl_log_level(dev): 1121 """wpa_supplicant ctrl_iface LOG_LEVEL""" 1122 level = dev[2].request("LOG_LEVEL") 1123 if "Current level: MSGDUMP" not in level: 1124 raise Exception("Unexpected debug level(1): " + level) 1125 if "Timestamp: 1" not in level: 1126 raise Exception("Unexpected timestamp(1): " + level) 1127 1128 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 0"): 1129 raise Exception("LOG_LEVEL failed") 1130 level = dev[2].request("LOG_LEVEL") 1131 if "Current level: MSGDUMP" not in level: 1132 raise Exception("Unexpected debug level(2): " + level) 1133 if "Timestamp: 0" not in level: 1134 raise Exception("Unexpected timestamp(2): " + level) 1135 1136 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"): 1137 raise Exception("LOG_LEVEL failed") 1138 level = dev[2].request("LOG_LEVEL") 1139 if "Current level: MSGDUMP" not in level: 1140 raise Exception("Unexpected debug level(3): " + level) 1141 if "Timestamp: 1" not in level: 1142 raise Exception("Unexpected timestamp(3): " + level) 1143 1144 if "FAIL" not in dev[2].request("LOG_LEVEL FOO"): 1145 raise Exception("Invalid LOG_LEVEL accepted") 1146 1147 for lev in ["EXCESSIVE", "MSGDUMP", "DEBUG", "INFO", "WARNING", "ERROR"]: 1148 if "OK" not in dev[2].request("LOG_LEVEL " + lev): 1149 raise Exception("LOG_LEVEL failed for " + lev) 1150 level = dev[2].request("LOG_LEVEL") 1151 if "Current level: " + lev not in level: 1152 raise Exception("Unexpected debug level: " + level) 1153 1154 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"): 1155 raise Exception("LOG_LEVEL failed") 1156 level = dev[2].request("LOG_LEVEL") 1157 if "Current level: MSGDUMP" not in level: 1158 raise Exception("Unexpected debug level(3): " + level) 1159 if "Timestamp: 1" not in level: 1160 raise Exception("Unexpected timestamp(3): " + level) 1161 1162@remote_compatible 1163def test_wpas_ctrl_enable_disable_network(dev, apdev): 1164 """wpa_supplicant ctrl_iface ENABLE/DISABLE_NETWORK""" 1165 params = {"ssid": "test"} 1166 hostapd.add_ap(apdev[0], params) 1167 1168 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412", 1169 only_add_network=True) 1170 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)): 1171 raise Exception("Failed to disable network") 1172 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect"): 1173 raise Exception("Failed to enable network") 1174 if "OK" not in dev[0].request("DISABLE_NETWORK all"): 1175 raise Exception("Failed to disable networks") 1176 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id)): 1177 raise Exception("Failed to enable network") 1178 dev[0].wait_connected(timeout=10) 1179 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)): 1180 raise Exception("Failed to disable network") 1181 dev[0].wait_disconnected(timeout=10) 1182 time.sleep(0.1) 1183 1184 if "OK" not in dev[0].request("ENABLE_NETWORK all"): 1185 raise Exception("Failed to enable network") 1186 dev[0].wait_connected(timeout=10) 1187 if "OK" not in dev[0].request("DISABLE_NETWORK all"): 1188 raise Exception("Failed to disable network") 1189 dev[0].wait_disconnected(timeout=10) 1190 1191def test_wpas_ctrl_country(dev, apdev): 1192 """wpa_supplicant SET/GET country code""" 1193 try: 1194 # work around issues with possible pending regdom event from the end of 1195 # the previous test case 1196 time.sleep(0.2) 1197 dev[0].dump_monitor() 1198 1199 if "OK" not in dev[0].request("SET country FI"): 1200 raise Exception("Failed to set country code") 1201 if dev[0].request("GET country") != "FI": 1202 raise Exception("Country code set failed") 1203 ev = dev[0].wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], 10) 1204 if ev is None: 1205 raise Exception("regdom change event not seen") 1206 if "init=USER type=COUNTRY alpha2=FI" not in ev: 1207 raise Exception("Unexpected event contents: " + ev) 1208 dev[0].request("SET country 00") 1209 if dev[0].request("GET country") != "00": 1210 raise Exception("Country code set failed") 1211 ev = dev[0].wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], 10) 1212 if ev is None: 1213 raise Exception("regdom change event not seen") 1214 # init=CORE was previously used due to invalid db.txt data for 00. For 1215 # now, allow both it and the new init=USER after fixed db.txt. 1216 if "init=CORE type=WORLD" not in ev and "init=USER type=WORLD" not in ev: 1217 raise Exception("Unexpected event contents: " + ev) 1218 finally: 1219 subprocess.call(['iw', 'reg', 'set', '00']) 1220 1221def test_wpas_ctrl_suspend_resume(dev): 1222 """wpa_supplicant SUSPEND/RESUME""" 1223 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 1224 wpas.interface_add("wlan5") 1225 if "OK" not in wpas.global_request("SUSPEND"): 1226 raise Exception("SUSPEND failed") 1227 time.sleep(1) 1228 if "OK" not in wpas.global_request("RESUME"): 1229 raise Exception("RESUME failed") 1230 if "OK" not in wpas.request("SUSPEND"): 1231 raise Exception("Per-interface SUSPEND failed") 1232 if "OK" not in wpas.request("RESUME"): 1233 raise Exception("Per-interface RESUME failed") 1234 ev = wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10) 1235 if ev is None: 1236 raise Exception("Scan not completed") 1237 1238def test_wpas_ctrl_global(dev): 1239 """wpa_supplicant global control interface""" 1240 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 1241 wpas.interface_add("wlan5") 1242 1243 if "PONG" not in wpas.global_request("PING"): 1244 raise Exception("PING failed") 1245 if "wlan5" not in wpas.global_request("INTERFACES"): 1246 raise Exception("Interface not found") 1247 if "UNKNOWN COMMAND" not in wpas.global_request("FOO"): 1248 raise Exception("Unexpected response to unknown command") 1249 if "PONG" not in wpas.global_request("IFNAME=wlan5 PING"): 1250 raise Exception("Per-interface PING failed") 1251 if "FAIL-NO-IFNAME-MATCH" not in wpas.global_request("IFNAME=notfound PING"): 1252 raise Exception("Unknown interface not reported correctly") 1253 if "FAIL" not in wpas.global_request("SAVE_CONFIG"): 1254 raise Exception("SAVE_CONFIG succeeded unexpectedly") 1255 if "OK" not in wpas.global_request("SET wifi_display 0"): 1256 raise Exception("SET failed") 1257 if "wifi_display=0" not in wpas.global_request("STATUS"): 1258 raise Exception("wifi_display not disabled") 1259 if "OK" not in wpas.global_request("SET wifi_display 1"): 1260 raise Exception("SET failed") 1261 if "wifi_display=1" not in wpas.global_request("STATUS"): 1262 raise Exception("wifi_display not enabled") 1263 if "FAIL" not in wpas.global_request("SET foo 1"): 1264 raise Exception("SET succeeded unexpectedly") 1265 1266 if "p2p_state=IDLE" not in wpas.global_request("STATUS"): 1267 raise Exception("P2P was disabled") 1268 wpas.global_request("P2P_SET disabled 1") 1269 if "p2p_state=DISABLED" not in wpas.global_request("STATUS"): 1270 raise Exception("P2P was not disabled") 1271 wpas.global_request("P2P_SET disabled 0") 1272 if "p2p_state=IDLE" not in wpas.global_request("STATUS"): 1273 raise Exception("P2P was not enabled") 1274 1275 # driver_nl80211.c does not support interface list, so do not fail because 1276 # of that 1277 logger.debug(wpas.global_request("INTERFACE_LIST")) 1278 1279 if "FAIL" not in wpas.global_request("INTERFACE_ADD "): 1280 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1281 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO"): 1282 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1283 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf"): 1284 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1285 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver"): 1286 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1287 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface"): 1288 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1289 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam"): 1290 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1291 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge"): 1292 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1293 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge foo"): 1294 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1295 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO "): 1296 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1297 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge create abcd"): 1298 raise Exception("INTERFACE_ADD succeeded unexpectedly") 1299 1300@remote_compatible 1301def test_wpas_ctrl_roam(dev, apdev): 1302 """wpa_supplicant ctrl_iface ROAM error cases""" 1303 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"): 1304 raise Exception("Unexpected success") 1305 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"): 1306 raise Exception("Unexpected success") 1307 params = {"ssid": "test"} 1308 hostapd.add_ap(apdev[0], params) 1309 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412") 1310 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"): 1311 raise Exception("Unexpected success") 1312 1313@remote_compatible 1314def test_wpas_ctrl_ipaddr(dev, apdev): 1315 """wpa_supplicant IP address in STATUS""" 1316 try: 1317 dev[0].cmd_execute(['ip', 'addr', 'add', '10.174.65.207/32', 'dev', 1318 dev[0].ifname]) 1319 ipaddr = dev[0].get_status_field('ip_address') 1320 if ipaddr != '10.174.65.207': 1321 raise Exception("IP address not in STATUS output") 1322 finally: 1323 dev[0].cmd_execute(['ip', 'addr', 'del', '10.174.65.207/32', 'dev', 1324 dev[0].ifname]) 1325 1326@remote_compatible 1327def test_wpas_ctrl_rsp(dev, apdev): 1328 """wpa_supplicant ctrl_iface CTRL-RSP-""" 1329 if "FAIL" not in dev[0].request("CTRL-RSP-"): 1330 raise Exception("Request succeeded unexpectedly") 1331 if "FAIL" not in dev[0].request("CTRL-RSP-foo-"): 1332 raise Exception("Request succeeded unexpectedly") 1333 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567"): 1334 raise Exception("Request succeeded unexpectedly") 1335 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567:"): 1336 raise Exception("Request succeeded unexpectedly") 1337 id = dev[0].add_network() 1338 if "FAIL" not in dev[0].request("CTRL-RSP-foo-%d:" % id): 1339 raise Exception("Request succeeded unexpectedly") 1340 for req in ["IDENTITY", "PASSWORD", "NEW_PASSWORD", "PIN", "OTP", 1341 "PASSPHRASE", "SIM"]: 1342 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)): 1343 raise Exception("Request failed unexpectedly") 1344 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)): 1345 raise Exception("Request failed unexpectedly") 1346 1347def test_wpas_ctrl_vendor_test(dev, apdev): 1348 """wpas_supplicant and VENDOR test command""" 1349 OUI_QCA = 0x001374 1350 QCA_NL80211_VENDOR_SUBCMD_TEST = 1 1351 QCA_WLAN_VENDOR_ATTR_TEST = 8 1352 attr = struct.pack("@HHI", 4 + 4, QCA_WLAN_VENDOR_ATTR_TEST, 123) 1353 cmd = "VENDOR %x %d %s" % (OUI_QCA, QCA_NL80211_VENDOR_SUBCMD_TEST, binascii.hexlify(attr).decode()) 1354 1355 res = dev[0].request(cmd) 1356 if "FAIL" in res: 1357 raise Exception("VENDOR command failed") 1358 val, = struct.unpack("@I", binascii.unhexlify(res)) 1359 if val != 125: 1360 raise Exception("Incorrect response value") 1361 1362 res = dev[0].request(cmd + " nested=1") 1363 if "FAIL" in res: 1364 raise Exception("VENDOR command failed") 1365 val, = struct.unpack("@I", binascii.unhexlify(res)) 1366 if val != 125: 1367 raise Exception("Incorrect response value") 1368 1369 res = dev[0].request(cmd + " nested=0") 1370 if "FAIL" not in res: 1371 raise Exception("VENDOR command with invalid (not nested) data accepted") 1372 1373@remote_compatible 1374def test_wpas_ctrl_vendor(dev, apdev): 1375 """wpa_supplicant ctrl_iface VENDOR""" 1376 cmds = ["foo", 1377 "1", 1378 "1 foo", 1379 "1 2foo", 1380 "1 2 qq"] 1381 for cmd in cmds: 1382 if "FAIL" not in dev[0].request("VENDOR " + cmd): 1383 raise Exception("Invalid VENDOR command accepted: " + cmd) 1384 1385@remote_compatible 1386def test_wpas_ctrl_mgmt_tx(dev, apdev): 1387 """wpa_supplicant ctrl_iface MGMT_TX""" 1388 cmds = ["foo", 1389 "00:11:22:33:44:55 foo", 1390 "00:11:22:33:44:55 11:22:33:44:55:66", 1391 "00:11:22:33:44:55 11:22:33:44:55:66 freq=0 no_cck=0 wait_time=0 action=123", 1392 "00:11:22:33:44:55 11:22:33:44:55:66 action=12qq"] 1393 for cmd in cmds: 1394 if "FAIL" not in dev[0].request("MGMT_TX " + cmd): 1395 raise Exception("Invalid MGMT_TX command accepted: " + cmd) 1396 1397 if "OK" not in dev[0].request("MGMT_TX_DONE"): 1398 raise Exception("MGMT_TX_DONE failed") 1399 1400@remote_compatible 1401def test_wpas_ctrl_driver_event(dev, apdev): 1402 """wpa_supplicant ctrl_iface DRIVER_EVENT""" 1403 if "FAIL" not in dev[0].request("DRIVER_EVENT foo"): 1404 raise Exception("Invalid DRIVER_EVENT accepted") 1405 if "OK" not in dev[0].request("DRIVER_EVENT ASSOC reassoc=1 req_ies=0000 resp_ies=0000 resp_frame=0000 beacon_ies=0000 freq=2412 wmm::info_bitmap=0 wmm::uapsd_queues=0 addr=02:02:02:02:02:02 authorized=0 key_replay_ctr=00 ptk_kck=00 ptk_kek=00 subnet_status=0 fils_erp_next_seq_num=0 fils_pmk=00 fils_pmkid=" + 16*"00"): 1406 raise Exception("DRIVER_EVENT ASSOC did not succeed") 1407 1408@remote_compatible 1409def test_wpas_ctrl_eapol_rx(dev, apdev): 1410 """wpa_supplicant ctrl_iface EAPOL_RX""" 1411 cmds = ["foo", 1412 "00:11:22:33:44:55 123", 1413 "00:11:22:33:44:55 12qq"] 1414 for cmd in cmds: 1415 if "FAIL" not in dev[0].request("EAPOL_RX " + cmd): 1416 raise Exception("Invalid EAPOL_RX command accepted: " + cmd) 1417 1418@remote_compatible 1419def test_wpas_ctrl_data_test(dev, apdev): 1420 """wpa_supplicant ctrl_iface DATA_TEST""" 1421 dev[0].request("DATA_TEST_CONFIG 0") 1422 if "FAIL" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"): 1423 raise Exception("DATA_TEST_TX accepted when not in test mode") 1424 1425 try: 1426 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"): 1427 raise Exception("DATA_TEST_CONFIG failed") 1428 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"): 1429 raise Exception("DATA_TEST_CONFIG failed") 1430 cmds = ["foo", 1431 "00:11:22:33:44:55 foo", 1432 "00:11:22:33:44:55 00:11:22:33:44:55 -1", 1433 "00:11:22:33:44:55 00:11:22:33:44:55 256"] 1434 for cmd in cmds: 1435 if "FAIL" not in dev[0].request("DATA_TEST_TX " + cmd): 1436 raise Exception("Invalid DATA_TEST_TX command accepted: " + cmd) 1437 if "OK" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"): 1438 raise Exception("DATA_TEST_TX failed") 1439 finally: 1440 dev[0].request("DATA_TEST_CONFIG 0") 1441 1442 cmds = ["", 1443 "00", 1444 "00112233445566778899aabbccdde", 1445 "00112233445566778899aabbccdq"] 1446 for cmd in cmds: 1447 if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd): 1448 raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd) 1449 1450 if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"): 1451 raise Exception("DATA_TEST_FRAME failed") 1452 1453@remote_compatible 1454def test_wpas_ctrl_vendor_elem(dev, apdev): 1455 """wpa_supplicant ctrl_iface VENDOR_ELEM""" 1456 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "): 1457 raise Exception("VENDOR_ELEM_ADD failed") 1458 cmds = ["-1 ", 1459 "255 ", 1460 "1", 1461 "1 123", 1462 "1 12qq34"] 1463 for cmd in cmds: 1464 if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd): 1465 raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd) 1466 1467 cmds = ["-1 ", 1468 "255 "] 1469 for cmd in cmds: 1470 if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd): 1471 raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd) 1472 1473 dev[0].request("VENDOR_ELEM_REMOVE 1 *") 1474 cmds = ["-1 ", 1475 "255 ", 1476 "1", 1477 "1", 1478 "1 123", 1479 "1 12qq34", 1480 "1 12", 1481 "1 0000"] 1482 for cmd in cmds: 1483 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd): 1484 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd) 1485 1486 dev[0].request("VENDOR_ELEM_ADD 1 000100") 1487 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 "): 1488 raise Exception("VENDOR_ELEM_REMOVE failed") 1489 cmds = ["-1 ", 1490 "255 ", 1491 "1", 1492 "1 123", 1493 "1 12qq34", 1494 "1 12", 1495 "1 0000"] 1496 for cmd in cmds: 1497 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd): 1498 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd) 1499 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 000100"): 1500 raise Exception("VENDOR_ELEM_REMOVE failed") 1501 1502def test_wpas_ctrl_misc(dev, apdev): 1503 """wpa_supplicant ctrl_iface and miscellaneous commands""" 1504 if "OK" not in dev[0].request("RELOG"): 1505 raise Exception("RELOG failed") 1506 if dev[0].request("IFNAME") != dev[0].ifname: 1507 raise Exception("IFNAME returned unexpected response") 1508 if "FAIL" not in dev[0].request("REATTACH"): 1509 raise Exception("REATTACH accepted while disabled") 1510 if "OK" not in dev[2].request("RECONFIGURE"): 1511 raise Exception("RECONFIGURE failed") 1512 if "FAIL" in dev[0].request("INTERFACE_LIST"): 1513 raise Exception("INTERFACE_LIST failed") 1514 if "UNKNOWN COMMAND" not in dev[0].request("FOO"): 1515 raise Exception("Unknown command accepted") 1516 1517 if "FAIL" not in dev[0].global_request("INTERFACE_REMOVE foo"): 1518 raise Exception("Invalid INTERFACE_REMOVE accepted") 1519 if "FAIL" not in dev[0].global_request("SET foo"): 1520 raise Exception("Invalid global SET accepted") 1521 1522@remote_compatible 1523def test_wpas_ctrl_dump(dev, apdev): 1524 """wpa_supplicant ctrl_iface and DUMP/GET global parameters""" 1525 vals = dev[0].get_config() 1526 logger.info("Config values from DUMP: " + str(vals)) 1527 for field in vals: 1528 res = dev[0].request("GET " + field) 1529 if res == 'FAIL\n': 1530 res = "null" 1531 if res != vals[field]: 1532 print("'{}' != '{}'".format(res, vals[field])) 1533 raise Exception("Mismatch in config field " + field) 1534 if "beacon_int" not in vals: 1535 raise Exception("Missing config field") 1536 1537def test_wpas_ctrl_interface_add(dev, apdev): 1538 """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal""" 1539 hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) 1540 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") 1541 hwsim_utils.test_connectivity(dev[0], hapd) 1542 1543 ifname = "test-" + dev[0].ifname 1544 dev[0].interface_add(ifname, create=True) 1545 wpas = WpaSupplicant(ifname=ifname) 1546 wpas.connect("open", key_mgmt="NONE", scan_freq="2412") 1547 hwsim_utils.test_connectivity(wpas, hapd) 1548 hwsim_utils.test_connectivity(dev[0], hapd) 1549 dev[0].global_request("INTERFACE_REMOVE " + ifname) 1550 hwsim_utils.test_connectivity(dev[0], hapd) 1551 1552def test_wpas_ctrl_interface_add_sta(dev, apdev): 1553 """wpa_supplicant INTERFACE_ADD/REMOVE with STA vif creation/removal""" 1554 hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) 1555 ifname = "test-" + dev[0].ifname 1556 dev[0].interface_add(ifname, create=True, if_type='sta') 1557 wpas = WpaSupplicant(ifname=ifname) 1558 wpas.connect("open", key_mgmt="NONE", scan_freq="2412") 1559 wpas.request("DISCONNECT") 1560 wpas.wait_disconnected() 1561 dev[0].global_request("INTERFACE_REMOVE " + ifname) 1562 1563def test_wpas_ctrl_interface_add_ap(dev, apdev): 1564 """wpa_supplicant INTERFACE_ADD/REMOVE AP interface""" 1565 with HWSimRadio() as (radio, iface): 1566 wpas0 = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 1567 wpas0.interface_add(iface) 1568 1569 ifname = "test-wpas-ap" 1570 wpas0.interface_add(ifname, create=True, if_type='ap') 1571 wpas = WpaSupplicant(ifname=ifname) 1572 1573 id = wpas.add_network() 1574 wpas.set_network(id, "mode", "2") 1575 wpas.set_network_quoted(id, "ssid", "wpas-ap-open") 1576 wpas.set_network(id, "key_mgmt", "NONE") 1577 wpas.set_network(id, "frequency", "2412") 1578 wpas.set_network(id, "scan_freq", "2412") 1579 wpas.select_network(id) 1580 wait_ap_ready(wpas) 1581 1582 dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") 1583 dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") 1584 1585 hwsim_utils.test_connectivity(wpas, dev[1]) 1586 hwsim_utils.test_connectivity(dev[1], dev[2]) 1587 1588 dev[1].request("DISCONNECT") 1589 dev[2].request("DISCONNECT") 1590 dev[1].wait_disconnected() 1591 dev[2].wait_disconnected() 1592 wpas0.global_request("INTERFACE_REMOVE " + ifname) 1593 1594def test_wpas_ctrl_interface_add_many(dev, apdev): 1595 """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal (many)""" 1596 try: 1597 _test_wpas_ctrl_interface_add_many(dev, apdev) 1598 finally: 1599 for i in range(10): 1600 ifname = "test%d-" % i + dev[0].ifname 1601 dev[0].global_request("INTERFACE_REMOVE " + ifname) 1602 1603def _test_wpas_ctrl_interface_add_many(dev, apdev): 1604 hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) 1605 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") 1606 hwsim_utils.test_connectivity(dev[0], hapd) 1607 dev[0].dump_monitor() 1608 1609 l = [] 1610 for i in range(10): 1611 ifname = "test%d-" % i + dev[0].ifname 1612 dev[0].interface_add(ifname, create=True) 1613 wpas = WpaSupplicant(ifname=ifname) 1614 wpas.connect("open", key_mgmt="NONE", scan_freq="2412") 1615 wpas.dump_monitor() 1616 l.append(wpas) 1617 dev[0].dump_monitor() 1618 for wpas in l: 1619 wpas.dump_monitor() 1620 hwsim_utils.test_connectivity(wpas, hapd) 1621 wpas.dump_monitor() 1622 dev[0].dump_monitor() 1623 1624def test_wpas_ctrl_interface_add2(dev, apdev): 1625 """wpa_supplicant INTERFACE_ADD/REMOVE with vif without creation/removal""" 1626 ifname = "test-ext-" + dev[0].ifname 1627 try: 1628 _test_wpas_ctrl_interface_add2(dev, apdev, ifname) 1629 finally: 1630 subprocess.call(['iw', 'dev', ifname, 'del']) 1631 1632def _test_wpas_ctrl_interface_add2(dev, apdev, ifname): 1633 hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) 1634 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") 1635 hwsim_utils.test_connectivity(dev[0], hapd) 1636 1637 subprocess.call(['iw', 'dev', dev[0].ifname, 'interface', 'add', ifname, 1638 'type', 'station']) 1639 subprocess.call(['ip', 'link', 'set', 'dev', ifname, 'address', 1640 '02:01:00:00:02:01']) 1641 dev[0].interface_add(ifname, set_ifname=False, all_params=True) 1642 wpas = WpaSupplicant(ifname=ifname) 1643 wpas.connect("open", key_mgmt="NONE", scan_freq="2412") 1644 hwsim_utils.test_connectivity(wpas, hapd) 1645 hwsim_utils.test_connectivity(dev[0], hapd) 1646 del wpas 1647 dev[0].global_request("INTERFACE_REMOVE " + ifname) 1648 hwsim_utils.test_connectivity(dev[0], hapd) 1649 1650def test_wpas_ctrl_wait(dev, apdev, test_params): 1651 """wpa_supplicant control interface wait for client""" 1652 logfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.log-wpas') 1653 pidfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.pid-wpas') 1654 conffile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.conf') 1655 with open(conffile, 'w') as f: 1656 f.write("ctrl_interface=DIR=/var/run/wpa_supplicant\n") 1657 1658 prg = os.path.join(test_params['logdir'], 1659 'alt-wpa_supplicant/wpa_supplicant/wpa_supplicant') 1660 if not os.path.exists(prg): 1661 prg = '../../wpa_supplicant/wpa_supplicant' 1662 arg = [prg] 1663 cmd = subprocess.Popen(arg, stdout=subprocess.PIPE) 1664 out = cmd.communicate()[0].decode() 1665 cmd.wait() 1666 tracing = "Linux tracing" in out 1667 1668 with HWSimRadio() as (radio, iface): 1669 arg = [prg, '-BdddW', '-P', pidfile, '-f', logfile, 1670 '-Dnl80211', '-c', conffile, '-i', iface] 1671 if tracing: 1672 arg += ['-T'] 1673 logger.info("Start wpa_supplicant: " + str(arg)) 1674 subprocess.call(arg) 1675 wpas = WpaSupplicant(ifname=iface) 1676 if "PONG" not in wpas.request("PING"): 1677 raise Exception("Could not PING wpa_supplicant") 1678 if not os.path.exists(pidfile): 1679 raise Exception("PID file not created") 1680 if "OK" not in wpas.request("TERMINATE"): 1681 raise Exception("Could not TERMINATE") 1682 ev = wpas.wait_event(["CTRL-EVENT-TERMINATING"], timeout=2) 1683 if ev is None: 1684 raise Exception("No termination event received") 1685 for i in range(20): 1686 if not os.path.exists(pidfile): 1687 break 1688 time.sleep(0.1) 1689 if os.path.exists(pidfile): 1690 raise Exception("PID file not removed") 1691 1692@remote_compatible 1693def test_wpas_ctrl_oom(dev): 1694 """Various wpa_supplicant ctrl_iface OOM cases""" 1695 try: 1696 _test_wpas_ctrl_oom(dev) 1697 finally: 1698 dev[0].request("VENDOR_ELEM_REMOVE 1 *") 1699 dev[0].request("VENDOR_ELEM_REMOVE 2 *") 1700 dev[0].request("SET bssid_filter ") 1701 1702def _test_wpas_ctrl_oom(dev): 1703 dev[0].request('VENDOR_ELEM_ADD 2 000100') 1704 tests = [('DRIVER_EVENT AVOID_FREQUENCIES 2412', 'FAIL', 1705 1, 'freq_range_list_parse'), 1706 ('P2P_SET disallow_freq 2412', 'FAIL', 1707 1, 'freq_range_list_parse'), 1708 ('SCAN freq=2412', 'FAIL', 1709 1, 'freq_range_list_parse'), 1710 ('INTERWORKING_SELECT freq=2412', 'FAIL', 1711 1, 'freq_range_list_parse'), 1712 ('SCAN ssid 112233', 'FAIL', 1713 1, 'wpas_ctrl_scan'), 1714 ('MGMT_TX 00:00:00:00:00:00 00:00:00:00:00:00 action=00', 'FAIL', 1715 1, 'wpas_ctrl_iface_mgmt_tx'), 1716 ('EAPOL_RX 00:00:00:00:00:00 00', 'FAIL', 1717 1, 'wpas_ctrl_iface_eapol_rx'), 1718 ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL', 1719 1, 'wpas_ctrl_iface_data_test_frame'), 1720 ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL', 1721 1, 'l2_packet_init;wpas_ctrl_iface_data_test_frame'), 1722 ('VENDOR_ELEM_ADD 1 000100', 'FAIL', 1723 1, 'wpas_ctrl_vendor_elem_add'), 1724 ('VENDOR_ELEM_ADD 2 000100', 'FAIL', 1725 2, 'wpas_ctrl_vendor_elem_add'), 1726 ('VENDOR_ELEM_REMOVE 2 000100', 'FAIL', 1727 1, 'wpas_ctrl_vendor_elem_remove'), 1728 ('SET bssid_filter 00:11:22:33:44:55', 'FAIL', 1729 1, 'set_bssid_filter'), 1730 ('SET disallow_aps bssid 00:11:22:33:44:55', 'FAIL', 1731 1, 'set_disallow_aps'), 1732 ('SET disallow_aps ssid 11', 'FAIL', 1733 1, 'set_disallow_aps'), 1734 ('SET blob foo 0011', 'FAIL', 1735 1, 'wpas_ctrl_set_blob'), 1736 ('SET blob foo 0011', 'FAIL', 1737 2, 'wpas_ctrl_set_blob'), 1738 ('SET blob foo 0011', 'FAIL', 1739 3, 'wpas_ctrl_set_blob'), 1740 ('WPS_NFC_TAG_READ 00', 'FAIL', 1741 1, 'wpa_supplicant_ctrl_iface_wps_nfc_tag_read'), 1742 ('WPS_NFC_TOKEN NDEF', 'FAIL', 1743 1, 'wpa_supplicant_ctrl_iface_wps_nfc_token'), 1744 ('WPS_NFC_TOKEN NDEF', 'FAIL', 1745 2, 'wpa_supplicant_ctrl_iface_wps_nfc_token'), 1746 ('WPS_NFC_TOKEN NDEF', 'FAIL', 1747 3, 'wpa_supplicant_ctrl_iface_wps_nfc_token'), 1748 ('WPS_NFC_TOKEN NDEF', 'FAIL', 1749 4, 'wpa_supplicant_ctrl_iface_wps_nfc_token'), 1750 ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL', 1751 1, 'wpas_ctrl_nfc_report_handover'), 1752 ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL', 1753 2, 'wpas_ctrl_nfc_report_handover'), 1754 ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL', 1755 1, 'wps_build_nfc_handover_req'), 1756 ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL', 1757 1, 'ndef_build_record'), 1758 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None, 1759 1, 'wpas_p2p_nfc_handover'), 1760 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None, 1761 1, 'wps_build_nfc_handover_req_p2p'), 1762 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL', 1763 1, 'ndef_build_record'), 1764 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', None, 1765 1, 'wpas_ctrl_nfc_get_handover_sel_p2p'), 1766 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', None, 1767 1, 'wpas_ctrl_nfc_get_handover_sel_p2p'), 1768 ('P2P_ASP_PROVISION_RESP 00:11:22:33:44:55 id=1', 'FAIL', 1769 1, 'p2p_parse_asp_provision_cmd'), 1770 ('P2P_SERV_DISC_REQ 00:11:22:33:44:55 02000001', 'FAIL', 1771 1, 'p2p_ctrl_serv_disc_req'), 1772 ('P2P_SERV_DISC_RESP 2412 00:11:22:33:44:55 1 00', 'FAIL', 1773 1, 'p2p_ctrl_serv_disc_resp'), 1774 ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027', 1775 'FAIL', 1776 1, 'p2p_ctrl_service_add_bonjour'), 1777 ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027', 1778 'FAIL', 1779 2, 'p2p_ctrl_service_add_bonjour'), 1780 ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027', 1781 'FAIL', 1782 3, 'p2p_ctrl_service_add_bonjour'), 1783 ('P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01', 1784 'FAIL', 1785 1, 'p2p_ctrl_service_del_bonjour'), 1786 ('GAS_REQUEST 00:11:22:33:44:55 00', 'FAIL', 1787 1, 'gas_request'), 1788 ('GAS_REQUEST 00:11:22:33:44:55 00 11', 'FAIL', 1789 2, 'gas_request'), 1790 ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 realm=example.com', 1791 'FAIL', 1792 1, 'hs20_nai_home_realm_list'), 1793 ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 00', 1794 'FAIL', 1795 1, 'hs20_get_nai_home_realm_list'), 1796 ('WNM_SLEEP enter tfs_req=11', 'FAIL', 1797 1, 'wpas_ctrl_iface_wnm_sleep'), 1798 ('WNM_SLEEP enter tfs_req=11', 'FAIL', 1799 2, 'wpas_ctrl_iface_wnm_sleep'), 1800 ('WNM_SLEEP enter tfs_req=11', 'FAIL', 1801 3, 'wpas_ctrl_iface_wnm_sleep'), 1802 ('WNM_SLEEP enter tfs_req=11', 'FAIL', 1803 4, 'wpas_ctrl_iface_wnm_sleep'), 1804 ('WNM_SLEEP enter tfs_req=11', 'FAIL', 1805 5, 'wpas_ctrl_iface_wnm_sleep'), 1806 ('WNM_SLEEP enter', 'FAIL', 1807 3, 'wpas_ctrl_iface_wnm_sleep'), 1808 ('VENDOR 1 1 00', 'FAIL', 1809 1, 'wpa_supplicant_vendor_cmd'), 1810 ('VENDOR 1 1 00', 'FAIL', 1811 2, 'wpa_supplicant_vendor_cmd'), 1812 ('RADIO_WORK add test', 'FAIL', 1813 1, 'wpas_ctrl_radio_work_add'), 1814 ('RADIO_WORK add test', 'FAIL', 1815 2, 'wpas_ctrl_radio_work_add'), 1816 ('AUTOSCAN periodic:1', 'FAIL', 1817 1, 'wpa_supplicant_ctrl_iface_autoscan'), 1818 ('PING', None, 1819 1, 'wpa_supplicant_ctrl_iface_process')] 1820 tls = dev[0].request("GET tls_library") 1821 if not tls.startswith("internal"): 1822 tests.append(('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL', 1823 4, 'wpas_ctrl_nfc_get_handover_sel_p2p')) 1824 for cmd, exp, count, func in tests: 1825 with alloc_fail(dev[0], count, func): 1826 res = dev[0].request(cmd) 1827 if exp and exp not in res: 1828 raise Exception("Unexpected success for '%s' during OOM (%d:%s)" % (cmd, count, func)) 1829 1830 tests = [('FOO', None, 1831 1, 'wpa_supplicant_global_ctrl_iface_process'), 1832 ('IFNAME=notfound PING', 'FAIL\n', 1833 1, 'wpas_global_ctrl_iface_ifname')] 1834 for cmd, exp, count, func in tests: 1835 with alloc_fail(dev[0], count, func): 1836 res = dev[0].global_request(cmd) 1837 if exp and exp not in res: 1838 raise Exception("Unexpected success for '%s' during OOM" % cmd) 1839 1840@remote_compatible 1841def test_wpas_ctrl_error(dev): 1842 """Various wpa_supplicant ctrl_iface error cases""" 1843 tests = [('WPS_NFC_TOKEN NDEF', 'FAIL', 1844 1, 'wpa_supplicant_ctrl_iface_wps_nfc_token'), 1845 ('WPS_NFC_TOKEN NDEF', 'FAIL', 1846 2, 'wpa_supplicant_ctrl_iface_wps_nfc_token'), 1847 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None, 1848 1, 'wpas_p2p_nfc_handover'), 1849 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None, 1850 1, 'wps_build_nfc_handover_req_p2p')] 1851 for cmd, exp, count, func in tests: 1852 with fail_test(dev[0], count, func): 1853 res = dev[0].request(cmd) 1854 if exp and exp not in res: 1855 raise Exception("Unexpected success for '%s' during failure testing (%d:%s)" % (cmd, count, func)) 1856 1857def test_wpas_ctrl_socket_full(dev, apdev, test_params): 1858 """wpa_supplicant control socket and full send buffer""" 1859 if not dev[0].ping(): 1860 raise Exception("Could not ping wpa_supplicant at the beginning of the test") 1861 dev[0].get_status() 1862 1863 counter = 0 1864 1865 s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 1866 local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter) 1867 counter += 1 1868 s.bind(local) 1869 s.connect("/var/run/wpa_supplicant/wlan0") 1870 for i in range(20): 1871 logger.debug("Command %d" % i) 1872 try: 1873 s.send(b"MIB") 1874 except Exception as e: 1875 logger.info("Could not send command %d: %s" % (i, str(e))) 1876 break 1877 # Close without receiving response 1878 time.sleep(0.01) 1879 1880 if not dev[0].ping(): 1881 raise Exception("Could not ping wpa_supplicant in the middle of the test") 1882 dev[0].get_status() 1883 1884 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 1885 local2 = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter) 1886 counter += 1 1887 s2.bind(local2) 1888 s2.connect("/var/run/wpa_supplicant/wlan0") 1889 for i in range(10): 1890 logger.debug("Command %d [2]" % i) 1891 try: 1892 s2.send(b"MIB") 1893 except Exception as e: 1894 logger.info("Could not send command %d [2]: %s" % (i, str(e))) 1895 break 1896 # Close without receiving response 1897 time.sleep(0.01) 1898 1899 s.close() 1900 os.unlink(local) 1901 1902 for i in range(10): 1903 logger.debug("Command %d [3]" % i) 1904 try: 1905 s2.send(b"MIB") 1906 except Exception as e: 1907 logger.info("Could not send command %d [3]: %s" % (i, str(e))) 1908 break 1909 # Close without receiving response 1910 time.sleep(0.01) 1911 1912 s2.close() 1913 os.unlink(local2) 1914 1915 if not dev[0].ping(): 1916 raise Exception("Could not ping wpa_supplicant in the middle of the test [2]") 1917 dev[0].get_status() 1918 1919 s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 1920 local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter) 1921 counter += 1 1922 s.bind(local) 1923 s.connect("/var/run/wpa_supplicant/wlan0") 1924 s.send(b"ATTACH") 1925 res = s.recv(100).decode() 1926 if "OK" not in res: 1927 raise Exception("Could not attach a test socket") 1928 1929 for i in range(5): 1930 dev[0].scan(freq=2412) 1931 1932 s.close() 1933 os.unlink(local) 1934 1935 for i in range(5): 1936 dev[0].scan(freq=2412) 1937 1938 if not dev[0].ping(): 1939 raise Exception("Could not ping wpa_supplicant at the end of the test") 1940 dev[0].get_status() 1941 1942def test_wpas_ctrl_event_burst(dev, apdev): 1943 """wpa_supplicant control socket and event burst""" 1944 if "OK" not in dev[0].request("EVENT_TEST 1000"): 1945 raise Exception("Could not request event messages") 1946 1947 total_i = 0 1948 total_g = 0 1949 for i in range(100): 1950 (i, g) = dev[0].dump_monitor() 1951 total_i += i 1952 total_g += g 1953 logger.info("Received i=%d g=%d" % (i, g)) 1954 if total_i >= 1000 and total_g >= 1000: 1955 break 1956 time.sleep(0.05) 1957 1958 if total_i < 1000: 1959 raise Exception("Some per-interface events not seen: %d" % total_i) 1960 if total_g < 1000: 1961 raise Exception("Some global events not seen: %d" % total_g) 1962 1963 if not dev[0].ping(): 1964 raise Exception("Could not ping wpa_supplicant at the end of the test") 1965 1966@remote_compatible 1967def test_wpas_ctrl_sched_scan_plans(dev, apdev): 1968 """wpa_supplicant sched_scan_plans parsing""" 1969 dev[0].request("SET sched_scan_plans foo") 1970 dev[0].request("SET sched_scan_plans 10:100 20:200 30") 1971 dev[0].request("SET sched_scan_plans 4294967295:0") 1972 dev[0].request("SET sched_scan_plans 1 1") 1973 dev[0].request("SET sched_scan_plans ") 1974 try: 1975 with alloc_fail(dev[0], 1, "wpas_sched_scan_plans_set"): 1976 dev[0].request("SET sched_scan_plans 10:100") 1977 finally: 1978 dev[0].request("SET sched_scan_plans ") 1979 1980def test_wpas_ctrl_signal_monitor(dev, apdev): 1981 """wpa_supplicant SIGNAL_MONITOR command""" 1982 hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) 1983 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") 1984 dev[1].connect("open", key_mgmt="NONE", scan_freq="2412", 1985 bgscan="simple:1:-45:2") 1986 dev[2].connect("open", key_mgmt="NONE", scan_freq="2412") 1987 1988 tests = [" THRESHOLD=-45", " THRESHOLD=-44 HYSTERESIS=5", ""] 1989 try: 1990 if "FAIL" in dev[2].request("SIGNAL_MONITOR THRESHOLD=-1 HYSTERESIS=5"): 1991 raise Exception("SIGNAL_MONITOR command failed") 1992 for t in tests: 1993 if "OK" not in dev[0].request("SIGNAL_MONITOR" + t): 1994 raise Exception("SIGNAL_MONITOR command failed: " + t) 1995 if "FAIL" not in dev[1].request("SIGNAL_MONITOR THRESHOLD=-44 HYSTERESIS=5"): 1996 raise Exception("SIGNAL_MONITOR command accepted while using bgscan") 1997 ev = dev[2].wait_event(["CTRL-EVENT-SIGNAL-CHANGE"], timeout=10) 1998 if ev is None: 1999 raise Exception("No signal change event seen") 2000 if "above=0" not in ev: 2001 raise Exception("Unexpected signal change event contents: " + ev) 2002 finally: 2003 dev[0].request("SIGNAL_MONITOR") 2004 dev[1].request("SIGNAL_MONITOR") 2005 dev[2].request("SIGNAL_MONITOR") 2006 2007 dev[0].request("REMOVE_NETWORK all") 2008 dev[1].request("REMOVE_NETWORK all") 2009 dev[1].wait_disconnected() 2010 2011def test_wpas_ctrl_p2p_listen_offload(dev, apdev): 2012 """wpa_supplicant P2P_LO_START and P2P_LO_STOP commands""" 2013 dev[0].request("P2P_LO_STOP") 2014 dev[0].request("P2P_LO_START ") 2015 dev[0].request("P2P_LO_START 2412") 2016 dev[0].request("P2P_LO_START 2412 100 200 3") 2017 dev[0].request("P2P_LO_STOP") 2018 2019def test_wpas_ctrl_driver_flags(dev, apdev): 2020 """DRIVER_FLAGS command""" 2021 params = hostapd.wpa2_params(ssid="test", passphrase="12345678") 2022 hapd = hostapd.add_ap(apdev[0], params) 2023 hapd_flags = hapd.request("DRIVER_FLAGS") 2024 wpas_flags = dev[0].request("DRIVER_FLAGS") 2025 if "FAIL" in hapd_flags: 2026 raise Exception("DRIVER_FLAGS failed") 2027 if hapd_flags != wpas_flags: 2028 raise Exception("Unexpected difference in hostapd vs. wpa_supplicant DRIVER_FLAGS output") 2029 logger.info("DRIVER_FLAGS: " + hapd_flags) 2030 flags = hapd_flags.split('\n') 2031 if 'AP' not in flags: 2032 raise Exception("AP flag missing from DRIVER_FLAGS") 2033 2034def test_wpas_ctrl_bss_current(dev, apdev): 2035 """wpa_supplicant BSS CURRENT command""" 2036 hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) 2037 bssid = hapd.own_addr() 2038 res = dev[0].request("BSS CURRENT") 2039 if res != '': 2040 raise Exception("Unexpected BSS CURRENT response in disconnected state") 2041 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") 2042 res = dev[0].request("BSS CURRENT") 2043 if bssid not in res: 2044 raise Exception("Unexpected BSS CURRENT response in connected state") 2045 2046def test_wpas_ctrl_set_lci_errors(dev): 2047 """wpa_supplicant SET lci error cases""" 2048 if "FAIL" not in dev[0].request("SET lci q"): 2049 raise Exception("Invalid LCI value accepted") 2050 2051 with fail_test(dev[0], 1, "os_get_reltime;wpas_ctrl_iface_set_lci"): 2052 if "FAIL" not in dev[0].request("SET lci 00"): 2053 raise Exception("SET lci accepted with failing os_get_reltime") 2054 2055def test_wpas_ctrl_set_radio_disabled(dev): 2056 """wpa_supplicant SET radio_disabled""" 2057 # This is not currently supported with nl80211, but execute the commands 2058 # without checking the result for some additional code coverage. 2059 dev[0].request("SET radio_disabled 1") 2060 dev[0].request("SET radio_disabled 0") 2061 2062def test_wpas_ctrl_set_tdls_trigger_control(dev): 2063 """wpa_supplicant SET tdls_trigger_control""" 2064 # This is not supported with upstream nl80211, but execute the commands 2065 # without checking the result for some additional code coverage. 2066 dev[0].request("SET tdls_trigger_control 1") 2067 dev[0].request("SET tdls_trigger_control 0") 2068 2069def test_wpas_ctrl_set_sched_scan_relative_rssi(dev): 2070 """wpa_supplicant SET relative RSSI""" 2071 tests = ["relative_rssi -1", 2072 "relative_rssi 101", 2073 "relative_band_adjust 2G", 2074 "relative_band_adjust 2G:-101", 2075 "relative_band_adjust 2G:101", 2076 "relative_band_adjust 3G:1"] 2077 for t in tests: 2078 if "FAIL" not in dev[0].request("SET " + t): 2079 raise Exception("No failure reported for SET " + t) 2080 2081 tests = ["relative_rssi 0", 2082 "relative_rssi 10", 2083 "relative_rssi disable", 2084 "relative_band_adjust 2G:-1", 2085 "relative_band_adjust 2G:0", 2086 "relative_band_adjust 2G:1", 2087 "relative_band_adjust 5G:-1", 2088 "relative_band_adjust 5G:1", 2089 "relative_band_adjust 5G:0"] 2090 for t in tests: 2091 if "OK" not in dev[0].request("SET " + t): 2092 raise Exception("Failed to SET " + t) 2093 2094def test_wpas_ctrl_get_pref_freq_list_override(dev): 2095 """wpa_supplicant get_pref_freq_list_override""" 2096 if dev[0].request("GET_PREF_FREQ_LIST ").strip() != "FAIL": 2097 raise Exception("Invalid GET_PREF_FREQ_LIST accepted") 2098 2099 dev[0].set("get_pref_freq_list_override", "foo") 2100 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2101 if res != "FAIL": 2102 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2103 2104 dev[0].set("get_pref_freq_list_override", "1234:1,2,3 0") 2105 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2106 if res != "FAIL": 2107 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2108 2109 dev[0].set("get_pref_freq_list_override", "1234:1,2,3 0:") 2110 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2111 if res != "0": 2112 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2113 2114 dev[0].set("get_pref_freq_list_override", "0:1,2") 2115 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2116 if res != "1,2": 2117 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2118 2119 dev[0].set("get_pref_freq_list_override", "1:3,4 0:1,2 2:5,6") 2120 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2121 if res != "1,2": 2122 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2123 2124 dev[0].set("get_pref_freq_list_override", "1:3,4 0:1 2:5,6") 2125 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2126 if res != "1": 2127 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2128 2129 dev[0].set("get_pref_freq_list_override", "0:1000,1001 2:1002,1003 3:1004,1005 4:1006,1007 8:1010,1011 9:1008,1009") 2130 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2131 if res != "1000,1001": 2132 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2133 res = dev[0].request("GET_PREF_FREQ_LIST AP").strip() 2134 if res != "1002,1003": 2135 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2136 res = dev[0].request("GET_PREF_FREQ_LIST P2P_GO").strip() 2137 if res != "1004,1005": 2138 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2139 res = dev[0].request("GET_PREF_FREQ_LIST P2P_CLIENT").strip() 2140 if res != "1006,1007": 2141 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2142 res = dev[0].request("GET_PREF_FREQ_LIST IBSS").strip() 2143 if res != "1008,1009": 2144 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2145 res = dev[0].request("GET_PREF_FREQ_LIST TDLS").strip() 2146 if res != "1010,1011": 2147 raise Exception("Unexpected GET_PREF_FREQ_LIST response: " + res) 2148 2149 dev[0].set("get_pref_freq_list_override", "") 2150 res = dev[0].request("GET_PREF_FREQ_LIST STATION").strip() 2151 logger.info("STATION (without override): " + res) 2152 2153def test_wpas_ctrl_interface_add_driver_init_failure(dev, apdev): 2154 """wpa_supplicant INTERFACE_ADD and driver init failing""" 2155 for i in range(1000): 2156 res = dev[0].global_request("INTERFACE_ADD FOO") 2157 if "FAIL" not in res: 2158 raise Exception("Unexpected result: " + res) 2159 dev[0].dump_monitor() 2160