| # rfkill tests |
| # Copyright (c) 2014, Jouni Malinen <j@w1.fi> |
| # |
| # 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 hostapd |
| import hwsim_utils |
| |
| def get_rfkill_id(dev): |
| try: |
| cmd = subprocess.Popen(["rfkill", "list"], stdout=subprocess.PIPE) |
| except Exception, e: |
| logger.info("No rfkill available: " + str(e)) |
| return None |
| res = cmd.stdout.read() |
| cmd.stdout.close() |
| phy = dev.get_driver_status_field("phyname") |
| matches = [ line for line in res.splitlines() if phy + ':' in line ] |
| if len(matches) != 1: |
| return None |
| return matches[0].split(':')[0] |
| |
| def test_rfkill_open(dev, apdev): |
| """rfkill block/unblock during open mode connection""" |
| id = get_rfkill_id(dev[0]) |
| if id is None: |
| return "skip" |
| |
| hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" }) |
| dev[0].connect("open", key_mgmt="NONE", scan_freq="2412") |
| try: |
| logger.info("rfkill block") |
| subprocess.call(['sudo', 'rfkill', 'block', id]) |
| ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) |
| if ev is None: |
| raise Exception("Missing disconnection event on rfkill block") |
| |
| logger.info("rfkill unblock") |
| subprocess.call(['sudo', 'rfkill', 'unblock', id]) |
| ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10) |
| if ev is None: |
| raise Exception("Missing connection event on rfkill unblock") |
| hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) |
| finally: |
| subprocess.call(['sudo', 'rfkill', 'unblock', id]) |
| |
| def test_rfkill_wpa2_psk(dev, apdev): |
| """rfkill block/unblock during WPA2-PSK connection""" |
| id = get_rfkill_id(dev[0]) |
| if id is None: |
| return "skip" |
| |
| ssid = "test-wpa2-psk" |
| passphrase = 'qwertyuiop' |
| params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase) |
| hapd = hostapd.add_ap(apdev[0]['ifname'], params) |
| dev[0].connect(ssid, psk=passphrase, scan_freq="2412") |
| try: |
| logger.info("rfkill block") |
| subprocess.call(['sudo', 'rfkill', 'block', id]) |
| ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10) |
| if ev is None: |
| raise Exception("Missing disconnection event on rfkill block") |
| |
| logger.info("rfkill unblock") |
| subprocess.call(['sudo', 'rfkill', 'unblock', id]) |
| ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10) |
| if ev is None: |
| raise Exception("Missing connection event on rfkill unblock") |
| hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname']) |
| finally: |
| subprocess.call(['sudo', 'rfkill', 'unblock', id]) |
| |
| def test_rfkill_autogo(dev, apdev): |
| """rfkill block/unblock for autonomous P2P GO""" |
| id0 = get_rfkill_id(dev[0]) |
| if id0 is None: |
| return "skip" |
| id1 = get_rfkill_id(dev[1]) |
| if id1 is None: |
| return "skip" |
| |
| dev[0].p2p_start_go() |
| dev[1].request("SET p2p_no_group_iface 0") |
| dev[1].p2p_start_go() |
| |
| try: |
| logger.info("rfkill block 0") |
| subprocess.call(['sudo', 'rfkill', 'block', id0]) |
| ev = dev[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10) |
| if ev is None: |
| raise Exception("Group removal not reported") |
| if "reason=UNAVAILABLE" not in ev: |
| raise Exception("Unexpected group removal reason: " + ev) |
| |
| logger.info("rfkill block 1") |
| subprocess.call(['sudo', 'rfkill', 'block', id1]) |
| ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10) |
| if ev is None: |
| raise Exception("Group removal not reported") |
| if "reason=UNAVAILABLE" not in ev: |
| raise Exception("Unexpected group removal reason: " + ev) |
| |
| logger.info("rfkill unblock 0") |
| subprocess.call(['sudo', 'rfkill', 'unblock', id0]) |
| logger.info("rfkill unblock 1") |
| subprocess.call(['sudo', 'rfkill', 'unblock', id1]) |
| time.sleep(1) |
| finally: |
| subprocess.call(['sudo', 'rfkill', 'unblock', id0]) |
| subprocess.call(['sudo', 'rfkill', 'unblock', id1]) |