# Monitor support # Copyright (c) 2016, Tieto Corporation # # This software may be distributed under the terms of the BSD license. # See README for more details. import time from remotehost import Host import config import re import traceback import logging logger = logging.getLogger() import hostapd # standalone monitor with multi iface support def create(devices, setup_params, refs, duts, monitors): mons = [] mhosts = [] hosts = duts + refs # choose only standalone monitors for monitor in monitors: if monitor not in hosts and monitor != "all": mons.append(monitor) for mon in mons: dev = config.get_device(devices, mon) if dev is None: continue host = Host(host = dev['hostname'], ifname = dev['ifname'], port = dev['port'], name = dev['name']) try: host.execute(["iw", "reg", "set", setup_params['country']]) setup_hw = setup_params['setup_hw'] for iface in ifaces: host.execute(setup_hw + " -I " + iface + " -R 1") except: pass mhosts.append(host) return mhosts def destroy(devices, hosts): for host in hosts: stop(host) for monitor in host.monitors: host.execute(["ifconfig", monitor, "down"]) def setup(host, monitor_params): if host is None: return ifaces = re.split('; | |, ', host.ifname) count = 0 for param in monitor_params: try: iface = ifaces[count] except: logger.debug(traceback.format_exc()) break host.execute(["ifconfig", iface, " down"]) host.execute(["iw", iface, "set type monitor"]) host.execute(["ifconfig", iface, "up"]) status, buf = host.execute(["iw", iface, "set", "freq", param['freq'], param['bw'], param['center_freq1'], param['center_freq2']]) if status != 0: logger.debug("Could not setup monitor interface: " + buf) continue host.monitors.append(iface) count = count + 1 def run(host, setup_params): monitor_res = [] log_monitor = "" if host is None: return None if len(host.monitors) == 0: return None try: log_dir = setup_params['log_dir'] tc_name = setup_params['tc_name'] except: return None tshark = "tshark" for monitor in host.monitors: host.execute(["ifconfig", monitor, "up"]) tshark = tshark + " -i " + monitor log_monitor = log_monitor + "_" + monitor log = log_dir + tc_name + "_" + host.name + log_monitor + ".pcap" host.add_log(log) thread = host.execute_run([tshark, "-w", log], monitor_res) host.thread = thread def stop(host): if host is None: return if len(host.monitors) == 0: return if host.thread is None: return host.execute(["killall", "-s", "INT", "tshark"]) host.wait_execute_complete(host.thread, 5) if host.thread.isAlive(): raise Exception("tshark still alive") host.thread = None # Add monitor to existing interface def add(host, monitors): if host is None: return for monitor in monitors: if monitor != "all" and monitor != host.name: continue mon = "mon_" + host.ifname status, buf = host.execute(["iw", host.ifname, "interface", "add", mon, "type", "monitor"]) if status == 0: host.monitors.append(mon) host.execute(["ifconfig", mon, "up"]) else: logger.debug("Could not add monitor for " + host.name) def remove(host): stop(host) for monitor in host.monitors: host.execute(["iw", monitor, "del"]) host.monitors.remove(monitor) # get monitor params from hostapd/wpa_supplicant def get_monitor_params(wpa, is_p2p=False): if is_p2p: get_status_field_f = wpa.get_group_status_field else: get_status_field_f = wpa.get_status_field freq = get_status_field_f("freq") bw = "20" center_freq1="" center_freq2="" vht_oper_chwidth = get_status_field_f("vht_oper_chwidth") secondary_channel = get_status_field_f("secondary_channel") vht_oper_centr_freq_seg0_idx = get_status_field_f("vht_oper_centr_freq_seg0_idx") vht_oper_centr_freq_seg1_idx = get_status_field_f("vht_oper_centr_freq_seg1_idx") if vht_oper_chwidth == "0" or vht_oper_chwidth is None: if secondary_channel == "1": bw = "40" center_freq1 = str(int(freq) + 10) elif secondary_channel == "-1": center_freq1 = str(int(freq) - 10) else: pass elif vht_oper_chwidth == "1": bw = "80" center_freq1 = str(int(vht_oper_centr_freq_seg0_idx) * 5 + 5000) elif vht_oper_chwidth == "2": bw = "160" center_freq1 = str(int(vht_oper_centr_freq_seg0_idx) * 5 + 5000) elif vht_oper_chwidth == "3": bw = "80+80" center_freq1 = str(int(vht_oper_centr_freq_seg0_idx) * 5 + 5000) center_freq2 = str(int(vht_oper_centr_freq_seg1_idx) * 5 + 5000) else: pass monitor_params = { "freq" : freq, "bw" : bw, "center_freq1" : center_freq1, "center_freq2" : center_freq2 } return monitor_params