2016-04-29 01:07:34 -04:00
|
|
|
# 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):
|
2016-05-19 09:06:46 -04:00
|
|
|
mons = []
|
2016-04-29 01:07:34 -04:00
|
|
|
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']
|
2016-05-19 09:06:48 -04:00
|
|
|
ifaces = re.split('; | |, ', host.ifname)
|
2016-04-29 01:07:34 -04:00
|
|
|
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"
|
2016-05-19 09:06:44 -04:00
|
|
|
host.add_log(log)
|
2016-04-29 01:07:34 -04:00
|
|
|
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)
|
|
|
|
|
|
|
|
|
2016-05-19 09:06:45 -04:00
|
|
|
# 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")
|
2016-04-29 01:07:34 -04:00
|
|
|
bw = "20"
|
|
|
|
center_freq1=""
|
|
|
|
center_freq2=""
|
|
|
|
|
2016-05-19 09:06:45 -04:00
|
|
|
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")
|
2016-04-29 01:07:34 -04:00
|
|
|
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
|