rlc: pass TTI to get_metrics to calculate "real" LTE rx/tx rate

when retrieving the RLC metrics, the number of TTIs since the last
call are passed. This allows to calculate the actual rate
based on the LTE timing rather than only the system timing.
This commit is contained in:
Andre Puschmann 2020-11-30 16:32:06 +01:00
parent cff9f03a11
commit c0883291f6
5 changed files with 21 additions and 10 deletions

View File

@ -44,7 +44,7 @@ public:
bsr_callback_t bsr_callback_);
void stop();
void get_metrics(rlc_metrics_t& m);
void get_metrics(rlc_metrics_t& m, const uint32_t nof_tti);
// PDCP interface
void write_sdu(uint32_t lcid, unique_byte_buffer_t sdu);

View File

@ -94,7 +94,7 @@ void rlc::stop()
}
}
void rlc::get_metrics(rlc_metrics_t& m)
void rlc::get_metrics(rlc_metrics_t& m, const uint32_t nof_tti)
{
gettimeofday(&metrics_time[2], NULL);
get_time_interval(metrics_time);
@ -102,17 +102,28 @@ void rlc::get_metrics(rlc_metrics_t& m)
for (rlc_map_t::iterator it = rlc_array.begin(); it != rlc_array.end(); ++it) {
rlc_bearer_metrics_t metrics = it->second->get_metrics();
rlc_log->info("LCID=%d, RX throughput: %4.6f Mbps. TX throughput: %4.6f Mbps.\n",
// Rx/Tx rate based on real time
double rx_rate_mbps_real_time = (metrics.num_rx_pdu_bytes * 8 / (double)1e6) / secs;
double tx_rate_mbps_real_time = (metrics.num_tx_pdu_bytes * 8 / (double)1e6) / secs;
// Rx/Tx rate based on number of TTIs
double rx_rate_mbps = (metrics.num_rx_pdu_bytes * 8 / (double)1e6) / (nof_tti / 1000.0);
double tx_rate_mbps = (metrics.num_tx_pdu_bytes * 8 / (double)1e6) / (nof_tti / 1000.0);
rlc_log->info("lcid=%d, rx_rate_mbps=%4.2f (real=%4.2f), tx_rate_mbps=%4.2f (real=%4.2f)\n",
it->first,
(metrics.num_rx_pdu_bytes * 8 / static_cast<double>(1e6)) / secs,
(metrics.num_tx_pdu_bytes * 8 / static_cast<double>(1e6)) / secs);
rx_rate_mbps,
rx_rate_mbps_real_time,
tx_rate_mbps,
tx_rate_mbps_real_time);
m.bearer[it->first] = metrics;
}
// Add multicast metrics
for (rlc_map_t::iterator it = rlc_array_mrb.begin(); it != rlc_array_mrb.end(); ++it) {
rlc_bearer_metrics_t metrics = it->second->get_metrics();
rlc_log->info("MCH_LCID=%d, RX throughput: %4.6f Mbps\n",
rlc_log->info("MCH_LCID=%d, rx_rate_mbps=%4.2f\n",
it->first,
(metrics.num_rx_pdu_bytes * 8 / static_cast<double>(1e6)) / secs);
m.bearer[it->first] = metrics;

View File

@ -517,7 +517,7 @@ void stress_test(stress_test_args_t args)
}
rlc_metrics_t metrics = {};
rlc1.get_metrics(metrics);
rlc1.get_metrics(metrics, 1);
printf("RLC1 received %d SDUs in %ds (%.2f/s), Tx=%" PRIu64 " B, Rx=%" PRIu64 " B\n",
tester1.get_nof_rx_pdus(),
@ -527,7 +527,7 @@ void stress_test(stress_test_args_t args)
metrics.bearer[lcid].num_rx_pdu_bytes);
rlc_bearer_metrics_print(metrics.bearer[lcid]);
rlc2.get_metrics(metrics);
rlc2.get_metrics(metrics, 1);
printf("RLC2 received %d SDUs in %ds (%.2f/s), Tx=%" PRIu64 " B, Rx=%" PRIu64 " B\n",
tester2.get_nof_rx_pdus(),
args.test_duration_sec,

View File

@ -209,7 +209,7 @@ bool ue_stack_lte::get_metrics(stack_metrics_t* metrics)
ue_task_queue.try_push([this]() {
stack_metrics_t metrics{};
mac.get_metrics(metrics.mac);
rlc.get_metrics(metrics.rlc);
rlc.get_metrics(metrics.rlc, metrics.mac[0].nof_tti);
nas.get_metrics(&metrics.nas);
rrc.get_metrics(metrics.rrc);
pending_stack_metrics.push(metrics);

View File

@ -132,7 +132,7 @@ bool ue_stack_nr::switch_off()
bool ue_stack_nr::get_metrics(stack_metrics_t* metrics)
{
// mac.get_metrics(metrics->mac);
rlc->get_metrics(metrics->rlc);
rlc->get_metrics(metrics->rlc, metrics->mac[0].nof_tti);
// rrc.get_metrics(metrics->rrc);
return true;
}