Nils Fürste | a8263f4 | 2020-11-23 14:45:15 +0100 | [diff] [blame] | 1 | # 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 | |
| 21 | from ..core import log |
| 22 | from .android_host import AndroidHost |
| 23 | |
| 24 | |
| 25 | class 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') |