blob: 43d552491a54c2df8c6845c47e89b00dee135468 [file] [log] [blame]
Nils Fürstea8263f42020-11-23 14:45:15 +01001# osmo_gsm_tester: specifics for monitoring the bit rate of an AndroidUE modem
2#
3# Copyright (C) 2020 by Software Radio Systems Limited
4#
5# Author: Nils Fürste <nils.fuerste@softwareradiosystems.com>
6# Author: Bedran Karakoc <bedran.karakoc@softwareradiosystems.com>
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21from ..core import log
22from .android_host import AndroidHost
23
24
25class BitRateMonitor(AndroidHost):
26
27##############
28# PROTECTED
29##############
30 def __init__(self, testenv, run_dir, run_node, rem_host, data_interface):
31 super().__init__('brate_monitor_%s' % run_node.run_addr())
32 self.testenv = testenv
33 self.rem_host = rem_host
34 self._run_node = run_node
35 self.run_dir = run_dir
36 self.data_interface = data_interface
37 self.rx_monitor_proc = None
38 self.tx_monitor_proc = None
39
40########################
41# PUBLIC - INTERNAL API
42########################
43 def start(self):
44 # start bit rate monitoring on Android UE
45 popen_args_rx_mon = ['while true; do cat /sys/class/net/' + self.data_interface + '/statistics/rx_bytes;',
46 'sleep 1;', 'done']
47 popen_args_tx_mon = ['while true; do cat /sys/class/net/' + self.data_interface + '/statistics/tx_bytes;',
48 'sleep 1;', 'done']
49 self.rx_monitor_proc = self.run_androidue_cmd('start-rx-monitor', popen_args_rx_mon)
50 self.testenv.remember_to_stop(self.rx_monitor_proc)
51 self.rx_monitor_proc.launch()
52 self.tx_monitor_proc = self.run_androidue_cmd('start-tx-monitor', popen_args_tx_mon)
53 self.testenv.remember_to_stop(self.tx_monitor_proc)
54 self.tx_monitor_proc.launch()
55
56 def stop(self):
57 self.testenv.stop_process(self.rx_monitor_proc)
58 self.testenv.stop_process(self.tx_monitor_proc)
59
60 def save_metrics(self, metrics_file):
61 brate_rx_raw = self.rx_monitor_proc.get_stdout().split('\n')
62 brate_tx_raw = self.tx_monitor_proc.get_stdout().split('\n')
63 brate_rx_raw.remove('')
64 brate_tx_raw.remove('')
65 brate_rx_l = brate_rx_raw[1:]
66 brate_tx_l = brate_tx_raw[1:]
67
68 if len(brate_rx_l) < 2 or len(brate_tx_l) < 2:
69 raise log.Error('Insufficient data available to write metrics file')
70
71 # cut of elements if lists don't have the same length
72 if len(brate_rx_l) > len(brate_tx_l):
73 brate_rx_l = brate_rx_l[:len(brate_tx_l) - len(brate_rx_l)]
74 if len(brate_rx_l) < len(brate_tx_l):
75 brate_tx_l = brate_tx_l[:len(brate_rx_l) - len(brate_tx_l)]
76
77 # get start value
78 brate_rx_last = int(brate_rx_l[0])
79 brate_tx_last = int(brate_tx_l[0])
80
81 with open(metrics_file, 'w') as ue_metrics_fh:
82 ue_metrics_fh.write('time;cc;earfcn;pci;rsrp;pl;cfo;pci_neigh;rsrp_neigh;cfo_neigh;'
83 + 'dl_mcs;dl_snr;dl_turbo;dl_brate;dl_bler;'
84 + 'ul_ta;ul_mcs;ul_buff;ul_brate;ul_bler;rf_o;rf_u;rf_l;'
85 + 'is_attached\n')
86 for i in range(1, len(brate_rx_l)):
87 time = '0'
88 cc = '0'
89 earfcn = '0'
90 pci = '0'
91 rsrp = '0'
92 pl = '0'
93 cfo = '0'
94 pci_neigh = '0'
95 rsrp_neigh = '0'
96 cfo_neigh = '0'
97 dl_mcs = '0'
98 dl_snr = '0'
99 dl_turbo = '0'
100 dl_brate = str((int(brate_rx_l[i]) - brate_rx_last) * 8)
101 brate_rx_last = int(brate_rx_l[i])
102 dl_bler = '0'
103 ul_ta = '0'
104 ul_mcs = '0'
105 ul_buff = '0'
106 ul_brate = str((int(brate_tx_l[i]) - brate_tx_last) * 8)
107 brate_tx_last = int(brate_tx_l[i])
108 ul_bler = '0'
109 rf_o = '0'
110 rf_u = '0'
111 rf_l = '0'
112 is_attached = '0'
113
114 line = time + ';' + cc + ';' + earfcn + ';' + pci + ';' + rsrp + ';' + pl + ';' + cfo + ';' \
115 + pci_neigh + ';' + rsrp_neigh + ';' + cfo_neigh + ';' + dl_mcs + ';' + dl_snr + ';' \
116 + dl_turbo + ';' + dl_brate + ';' + dl_bler + ';' + ul_ta + ';' + ul_mcs + ';' + ul_buff + ';' \
117 + ul_brate + ';' + ul_bler + ';' + rf_o + ';' + rf_u + ';' + rf_l + ';' + is_attached
118 ue_metrics_fh.write(line + '\n')