osmo-gsm-tester/src/osmo_gsm_tester/obj/android_bitrate_monitor.py

119 lines
5.0 KiB
Python

# osmo_gsm_tester: specifics for monitoring the bit rate of an AndroidUE modem
#
# Copyright (C) 2020 by Software Radio Systems Limited
#
# Author: Nils Fürste <nils.fuerste@softwareradiosystems.com>
# Author: Bedran Karakoc <bedran.karakoc@softwareradiosystems.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from ..core import log
from .android_host import AndroidHost
class BitRateMonitor(AndroidHost):
##############
# PROTECTED
##############
def __init__(self, testenv, run_dir, run_node, rem_host, data_interface):
super().__init__('brate_monitor_%s' % run_node.run_addr())
self.testenv = testenv
self.rem_host = rem_host
self._run_node = run_node
self.run_dir = run_dir
self.data_interface = data_interface
self.rx_monitor_proc = None
self.tx_monitor_proc = None
########################
# PUBLIC - INTERNAL API
########################
def start(self):
# start bit rate monitoring on Android UE
popen_args_rx_mon = ['while true; do cat /sys/class/net/' + self.data_interface + '/statistics/rx_bytes;',
'sleep 1;', 'done']
popen_args_tx_mon = ['while true; do cat /sys/class/net/' + self.data_interface + '/statistics/tx_bytes;',
'sleep 1;', 'done']
self.rx_monitor_proc = self.run_androidue_cmd('start-rx-monitor', popen_args_rx_mon)
self.testenv.remember_to_stop(self.rx_monitor_proc)
self.rx_monitor_proc.launch()
self.tx_monitor_proc = self.run_androidue_cmd('start-tx-monitor', popen_args_tx_mon)
self.testenv.remember_to_stop(self.tx_monitor_proc)
self.tx_monitor_proc.launch()
def stop(self):
self.testenv.stop_process(self.rx_monitor_proc)
self.testenv.stop_process(self.tx_monitor_proc)
def save_metrics(self, metrics_file):
brate_rx_raw = self.rx_monitor_proc.get_stdout().split('\n')
brate_tx_raw = self.tx_monitor_proc.get_stdout().split('\n')
brate_rx_raw.remove('')
brate_tx_raw.remove('')
brate_rx_l = brate_rx_raw[1:]
brate_tx_l = brate_tx_raw[1:]
if len(brate_rx_l) < 2 or len(brate_tx_l) < 2:
raise log.Error('Insufficient data available to write metrics file')
# cut of elements if lists don't have the same length
if len(brate_rx_l) > len(brate_tx_l):
brate_rx_l = brate_rx_l[:len(brate_tx_l) - len(brate_rx_l)]
if len(brate_rx_l) < len(brate_tx_l):
brate_tx_l = brate_tx_l[:len(brate_rx_l) - len(brate_tx_l)]
# get start value
brate_rx_last = int(brate_rx_l[0])
brate_tx_last = int(brate_tx_l[0])
with open(metrics_file, 'w') as ue_metrics_fh:
ue_metrics_fh.write('time;cc;earfcn;pci;rsrp;pl;cfo;pci_neigh;rsrp_neigh;cfo_neigh;'
+ 'dl_mcs;dl_snr;dl_turbo;dl_brate;dl_bler;'
+ 'ul_ta;ul_mcs;ul_buff;ul_brate;ul_bler;rf_o;rf_u;rf_l;'
+ 'is_attached\n')
for i in range(1, len(brate_rx_l)):
time = '0'
cc = '0'
earfcn = '0'
pci = '0'
rsrp = '0'
pl = '0'
cfo = '0'
pci_neigh = '0'
rsrp_neigh = '0'
cfo_neigh = '0'
dl_mcs = '0'
dl_snr = '0'
dl_turbo = '0'
dl_brate = str((int(brate_rx_l[i]) - brate_rx_last) * 8)
brate_rx_last = int(brate_rx_l[i])
dl_bler = '0'
ul_ta = '0'
ul_mcs = '0'
ul_buff = '0'
ul_brate = str((int(brate_tx_l[i]) - brate_tx_last) * 8)
brate_tx_last = int(brate_tx_l[i])
ul_bler = '0'
rf_o = '0'
rf_u = '0'
rf_l = '0'
is_attached = '0'
line = time + ';' + cc + ';' + earfcn + ';' + pci + ';' + rsrp + ';' + pl + ';' + cfo + ';' \
+ pci_neigh + ';' + rsrp_neigh + ';' + cfo_neigh + ';' + dl_mcs + ';' + dl_snr + ';' \
+ dl_turbo + ';' + dl_brate + ';' + dl_bler + ';' + ul_ta + ';' + ul_mcs + ';' + ul_buff + ';' \
+ ul_brate + ';' + ul_bler + ';' + rf_o + ';' + rf_u + ';' + rf_l + ';' + is_attached
ue_metrics_fh.write(line + '\n')