 483053b9d8
			
		
	
	
		483053b9d8
		
	
	
	
	
		
			
			The code contained some places that used an additional argument for setup_hw after -R and also contained places where setup_hw cmdline was passed as a string instead of an argument list. It also contained places where the ifname was only treated as a single interface and disregarded the possiblity of multiple interfaces. This commit fixes these issues and executes setup_hw from a single function for all cases. Signed-off-by: Jonathan Afek <jonathanx.afek@intel.com>
		
			
				
	
	
		
			181 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
	
		
			5.3 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 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
 |