| # FST tests related definitions |
| # Copyright (c) 2015, Qualcomm Atheros, Inc. |
| # |
| # This software may be distributed under the terms of the BSD license. |
| # See README for more details. |
| |
| import subprocess |
| import logging |
| |
| import hostapd |
| |
| logger = logging.getLogger() |
| |
| fst_test_def_group='fstg0' |
| fst_test_def_freq_g='2412' # Channel 1 |
| fst_test_def_freq_a='5180' # Channel 36 |
| fst_test_def_chan_g='1' |
| fst_test_def_chan_a='36' |
| fst_test_def_prio_low='100' |
| fst_test_def_prio_high='110' |
| fst_test_def_llt='100' |
| fst_test_def_reg_domain='00' |
| |
| class HapdRegCtrl: |
| def __init__(self): |
| self.refcnt = 0 |
| self.ifname = None |
| self.changed = False |
| |
| def __del__(self): |
| if self.refcnt != 0 and self.changed == True: |
| self.restore_reg_domain() |
| |
| def start(self): |
| if self.ifname != None: |
| hapd = hostapd.Hostapd(self.ifname) |
| self.changed = self.wait_hapd_reg_change(hapd) |
| |
| def stop(self): |
| if self.changed == True: |
| self.restore_reg_domain() |
| self.changed = False |
| |
| def add_ap(self, ifname, chan): |
| if self.changed == False and self.channel_may_require_reg_change(chan): |
| self.ifname = ifname |
| |
| @staticmethod |
| def channel_may_require_reg_change(chan): |
| if int(chan) > 14: |
| return True |
| return False |
| |
| @staticmethod |
| def wait_hapd_reg_change(hapd): |
| state = hapd.get_status_field("state") |
| if state != "COUNTRY_UPDATE": |
| state = hapd.get_status_field("state") |
| if state != "ENABLED": |
| raise Exception("Unexpected interface state - expected COUNTRY_UPDATE") |
| else: |
| logger.debug("fst hostapd: regulatory domain already set") |
| return True |
| |
| logger.debug("fst hostapd: waiting for regulatory domain to be set...") |
| |
| ev = hapd.wait_event(["AP-ENABLED"], timeout=10) |
| if not ev: |
| raise Exception("AP setup timed out") |
| |
| logger.debug("fst hostapd: regulatory domain set") |
| |
| state = hapd.get_status_field("state") |
| if state != "ENABLED": |
| raise Exception("Unexpected interface state - expected ENABLED") |
| |
| logger.debug("fst hostapd: regulatory domain ready") |
| return True |
| |
| @staticmethod |
| def restore_reg_domain(): |
| logger.debug("fst hostapd: waiting for regulatory domain to be restored...") |
| |
| res = subprocess.call(['iw', 'reg', 'set', fst_test_def_reg_domain]) |
| if res != 0: |
| raise Exception("Cannot restore regulatory domain") |
| |
| logger.debug("fst hostapd: regulatory domain ready") |