1# Hwsim wrapper
2# Copyright (c) 2016, Tieto Corporation
3#
4# This software may be distributed under the terms of the BSD license.
5# See README for more details.
6
7import remotehost
8from wpasupplicant import WpaSupplicant
9import hostapd
10import config
11import rutils
12import monitor
13import traceback
14import wlantest
15
16import logging
17logger = logging.getLogger()
18
19def run_hwsim_test(devices, setup_params, refs, duts, monitors, hwsim_test):
20    try:
21        ref_hosts = []
22        dut_hosts = []
23        dev = []
24        apdev = []
25
26        # get hosts
27        for ref in refs:
28            ref_host = rutils.get_host(devices, ref)
29            ref_hosts.append(ref_host)
30        for dut in duts:
31            dut_host = rutils.get_host(devices, dut)
32            dut_hosts.append(dut_host)
33
34        # setup log dir
35        local_log_dir = setup_params['local_log_dir']
36
37        # setup hw before test
38        rutils.setup_hw(ref_hosts, setup_params)
39        rutils.setup_hw(dut_hosts, setup_params)
40
41        # run monitors if requested/possible
42        for ref_host in ref_hosts:
43            monitor.add(ref_host, monitors)
44            monitor.run(ref_host, setup_params)
45        for dut_host in dut_hosts:
46            monitor.add(dut_host, monitors)
47            monitor.run(dut_host, setup_params)
48
49        monitor_hosts = monitor.create(devices, setup_params, refs, duts,
50                                       monitors)
51        mon = None
52        if len(monitor_hosts) > 0:
53            mon = monitor_hosts[0]
54            wlantest.Wlantest.reset_remote_wlantest()
55            wlantest.Wlantest.register_remote_wlantest(mon, setup_params,
56                                                       monitor)
57
58        # run hostapd/wpa_supplicant
59        for ref_host in ref_hosts:
60            rutils.run_wpasupplicant(ref_host, setup_params)
61            wpas = WpaSupplicant(hostname=ref_host.host,
62                                 global_iface=ref_host.global_iface,
63                                 global_port=ref_host.port,
64                                 remote_cli=ref_host.remote_cli)
65            wpas.interface_add(ref_host.ifname)
66            dev.append(wpas)
67        for dut_host in dut_hosts:
68            rutils.run_hostapd(dut_host, setup_params)
69            dut_host.dev['bssid'] = rutils.get_mac_addr(dut_host)
70            apdev.append(dut_host.dev)
71
72        if hwsim_test.__code__.co_argcount == 1:
73            hwsim_test(dev)
74        elif hwsim_test.__code__.co_argcount == 2:
75            hwsim_test(dev, apdev)
76        else:
77            params = {}
78            params['long'] = 1
79            params['logdir'] = local_log_dir
80            hwsim_test(dev, apdev, params)
81
82       # hostapd/wpa_supplicant cleanup
83        for wpas in dev:
84            wpas.interface_remove(wpas.host.ifname)
85            wpas.terminate()
86        dev = []
87
88        # remove monitors
89        for ref_host in ref_hosts:
90            monitor.remove(ref_host)
91        for dut_host in dut_hosts:
92            monitor.remove(dut_host)
93
94        for ref_host in ref_hosts:
95            rutils.kill_wpasupplicant(ref_host, setup_params)
96            ref_host.get_logs(local_log_dir)
97        for dut_host in dut_hosts:
98            rutils.kill_hostapd(dut_host, setup_params)
99            dut_host.get_logs(local_log_dir)
100        if mon is not None:
101            wlantest.Wlantest.reset_remote_wlantest()
102            mon.get_logs(local_log_dir)
103
104        return ""
105    except:
106        logger.info(traceback.format_exc())
107        for wpas in dev:
108            try:
109                wpas.interface_remove(wpas.host.ifname)
110                wpas.terminate()
111            except:
112                pass
113
114        for ref_host in ref_hosts:
115            monitor.remove(ref_host)
116        for dut_host in dut_hosts:
117            monitor.remove(dut_host)
118
119        for ref_host in ref_hosts:
120            rutils.kill_wpasupplicant(ref_host, setup_params)
121            ref_host.get_logs(local_log_dir)
122        for dut_host in dut_hosts:
123            rutils.kill_hostapd(dut_host, setup_params)
124            dut_host.get_logs(local_log_dir)
125        if mon is not None:
126            wlantest.Wlantest.reset_remote_wlantest()
127            mon.get_logs(local_log_dir)
128        raise
129