This gives the benefit of test-runner itself having access to the CLI, e.g. for getting status information. --- autotests/util/hostapd.py | 32 +++++++++++++++++++++++++++++--- tools/test-runner | 14 ++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/autotests/util/hostapd.py b/autotests/util/hostapd.py index f75dbe6b..1575d832 100644 --- a/autotests/util/hostapd.py +++ b/autotests/util/hostapd.py @@ -42,6 +42,24 @@ class HostapdCLI: hapd = ctx.hostapd[config] + if not hasattr(self, '_hostapd_restarted'): + self._hostapd_restarted = False + + # + # TODO: In theory some type of instance singleton could be created for + # HostapdCLI where test-runner initializes but any subsequent + # call to HostapdCLI (with the same config) returns the same + # object that test-runner has. This would avoid setting these + # variables. + # + if hapd.cli: + self.ifname = hapd.cli.ifname + self.ctrl_sock = hapd.cli.ctrl_sock + self.cmdline = hapd.cli.cmdline + self.interface = hapd.intf + self.config = hapd.config + return + self.interface = hapd.intf self.config = hapd.config @@ -53,9 +71,6 @@ class HostapdCLI: self.cmdline = ['hostapd_cli', '-p', self.socket_path, '-i', self.ifname] - if not hasattr(self, '_hostapd_restarted'): - self._hostapd_restarted = False - self.local_ctrl = '/tmp/hostapd_' + str(os.getpid()) + '_' + \ str(ctrl_count) self.ctrl_sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) @@ -244,3 +259,14 @@ class HostapdCLI: bssid = [x for x in status if x.startswith('bssid')] bssid = bssid[0].split('=') return bssid[1] + + @property + def frequency(self): + cmd = self.cmdline + ['status'] + status = ctx.start_process(cmd, wait=True, need_out=True).out + status = status.split('\n') + + frequency = [x for x in status if x.startswith('freq')][0] + frequency = frequency.split('=')[1] + + return int(frequency) diff --git a/tools/test-runner b/tools/test-runner index bfa5d803..87f6ec6d 100755 --- a/tools/test-runner +++ b/tools/test-runner @@ -428,6 +428,7 @@ class HostapdInstance: def __init__(self, config, radio): self.radio = radio self.config = config + self.cli = None self.intf = radio.create_interface(self.config, 'hostapd') self.intf.set_interface_state('up') @@ -494,6 +495,10 @@ class Hostapd: self.process.wait_for_socket(self.global_ctrl_iface, 30) + def attach_cli(self): + for hapd in self.instances: + hapd.cli = importlib.import_module('hostapd').HostapdCLI(config=hapd.config) + def _rewrite_config(self, config): ''' Replaces any $ifaceN values with the correct interface @@ -841,6 +846,15 @@ class TestContext(Namespace): radius_config = settings.get('radius_server', None) self.hostapd = Hostapd(self, hapd_radios, hapd_configs, radius_config) + self.hostapd.attach_cli() + + def get_frequencies(self): + frequencies = [] + + for hapd in self.hostapd.instances: + frequencies.append(hapd.cli.frequency) + + return frequencies def start_wpas_interfaces(self): if 'WPA_SUPPLICANT' not in self.hw_config: -- 2.31.1