123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- # 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 rutils
- 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']])
- rutils.setup_hw_host(host, setup_params, True)
- 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
|