# Dynamic wpa_supplicant interface # Copyright (c) 2013, Jouni Malinen # # This software may be distributed under the terms of the BSD license. # See README for more details. import logging logger = logging.getLogger() import subprocess import time import hwsim_utils import hostapd from wpasupplicant import WpaSupplicant def test_sta_dynamic(dev, apdev): """Dynamically added wpa_supplicant interface""" params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") hostapd.add_ap(apdev[0]['ifname'], params) logger.info("Create a dynamic wpa_supplicant interface and connect") wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") def test_sta_ap_scan_0(dev, apdev): """Dynamically added wpa_supplicant interface with AP_SCAN 0 connection""" hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test" }) bssid = apdev[0]['bssid'] logger.info("Create a dynamic wpa_supplicant interface and connect") wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") if "OK" not in wpas.request("AP_SCAN 0"): raise Exception("Failed to set AP_SCAN 2") id = wpas.connect("", key_mgmt="NONE", bssid=bssid, only_add_network=True) wpas.request("ENABLE_NETWORK " + str(id) + " no-connect") wpas.request("SCAN") time.sleep(0.5) subprocess.call(['sudo', 'iw', wpas.ifname, 'connect', 'test', '2412']) ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=10) if ev is None: raise Exception("Connection not reported") wpas.request("SCAN") ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=5) if ev is None: raise Exception("Connection not reported") def test_sta_ap_scan_2(dev, apdev): """Dynamically added wpa_supplicant interface with AP_SCAN 2 connection""" hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test" }) bssid = apdev[0]['bssid'] logger.info("Create a dynamic wpa_supplicant interface and connect") wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") if "FAIL" not in wpas.request("AP_SCAN -1"): raise Exception("Invalid AP_SCAN -1 accepted") if "FAIL" not in wpas.request("AP_SCAN 3"): raise Exception("Invalid AP_SCAN 3 accepted") if "OK" not in wpas.request("AP_SCAN 2"): raise Exception("Failed to set AP_SCAN 2") id = wpas.connect("", key_mgmt="NONE", bssid=bssid, only_add_network=True) wpas.request("ENABLE_NETWORK " + str(id) + " no-connect") subprocess.call(['sudo', 'iw', wpas.ifname, 'scan', 'trigger', 'freq', '2412']) time.sleep(1) subprocess.call(['sudo', 'iw', wpas.ifname, 'connect', 'test', '2412']) ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=10) if ev is None: raise Exception("Connection not reported") wpas.request("SET disallow_aps bssid " + bssid) ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) if ev is None: raise Exception("Disconnection not reported") subprocess.call(['sudo', 'iw', wpas.ifname, 'connect', 'test', '2412']) ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) if ev is not None: raise Exception("Unexpected connection reported") def test_sta_dynamic_down_up(dev, apdev): """Dynamically added wpa_supplicant interface down/up""" params = hostapd.wpa2_params(ssid="sta-dynamic", passphrase="12345678") hostapd.add_ap(apdev[0]['ifname'], params) logger.info("Create a dynamic wpa_supplicant interface and connect") wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') wpas.interface_add("wlan5") wpas.connect("sta-dynamic", psk="12345678", scan_freq="2412") hwsim_utils.test_connectivity(wpas.ifname, apdev[0]['ifname']) subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'down']) ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) if ev is None: raise Exception("Disconnection not reported") if wpas.get_status_field("wpa_state") != "INTERFACE_DISABLED": raise Exception("Unexpected wpa_state") subprocess.call(['sudo', 'ifconfig', wpas.ifname, 'up']) ev = wpas.wait_event(["CTRL-EVENT-CONNECTED"], timeout=15) if ev is None: raise Exception("Reconnection not reported") hwsim_utils.test_connectivity(wpas.ifname, apdev[0]['ifname'])