hostap/tests/remote/monitor.py
Jonathan Afek a73cdd69c7 tests/remote: Extend get_monitor_params() to support P2P interfaces
This function is used for remote tests when a monitor interface is
needed on the channel on which the AP operates. This change enables us
to also query P2P interfaces for the channel information to use for
monitor interfaces.

Signed-off-by: Jonathan Afek <jonathanx.afek@intel.com>
2016-05-28 16:33:56 +03:00

182 lines
5.4 KiB
Python

# 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