From 1b029be0585b3053158ba20d9c8c11b01196616b Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 4 Aug 2022 10:41:20 +0200 Subject: [PATCH] nr rlc stats: make avg time to tx optional Introduce the function nr_rlc_activate_avg_time_to_tx() to activate/deactivate collection of avg time to tx stats (which may have an impact on realtime processing, so better not compute them when not needed). Fix a little bug in time_average_get_average() for when there is not stat. --- common/utils/time_stat.c | 11 +++++++++ common/utils/time_stat.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_entity.c | 7 ++++-- openair2/LAYER2/nr_rlc/nr_rlc_entity.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c | 3 ++- openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c | 3 ++- openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c | 3 ++- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 27 +++++++++++++++++++++++ openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h | 5 +++++ 9 files changed, 56 insertions(+), 5 deletions(-) diff --git a/common/utils/time_stat.c b/common/utils/time_stat.c index 637cfdc4b5..dd648e1639 100644 --- a/common/utils/time_stat.c +++ b/common/utils/time_stat.c @@ -61,6 +61,14 @@ void time_average_free(time_average_t *t) free(t); } +void time_average_reset(time_average_t *t) +{ + t->r.head = t->r.maxsize - 1; + t->r.tail = 0; + t->r.size = 0; + t->accumulated_value = 0; +} + static void remove_old(time_average_t *t, uint64_t time) { /* remove old events */ @@ -103,6 +111,9 @@ double time_average_get_average(time_average_t *t, uint64_t time) { remove_old(t, time); + if (t->r.size == 0) + return 0; + return (double)t->accumulated_value / t->r.size; } diff --git a/common/utils/time_stat.h b/common/utils/time_stat.h index d038fc1bfa..d7508f5df0 100644 --- a/common/utils/time_stat.h +++ b/common/utils/time_stat.h @@ -46,6 +46,7 @@ typedef struct { /* 'duration' is in unit microsecond */ time_average_t *time_average_new(int duration, int initial_size); void time_average_free(time_average_t *t); +void time_average_reset(time_average_t *t); /* add a value tagged with time 'time' unit microsecond (it also modifies 't', * removing all data with time < 'time' - t->duration) diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c index 2db397db5d..559ccd3c1c 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c @@ -37,8 +37,11 @@ static void nr_rlc_entity_get_stats( { // printf("Stats from the RLC entity asked\n"); *out = entity->stats; - out->txsdu_avg_time_to_tx = time_average_get_average(entity->txsdu_avg_time_to_tx, - time_average_now()); + if (entity->avg_time_is_on) + out->txsdu_avg_time_to_tx = time_average_get_average(entity->txsdu_avg_time_to_tx, + time_average_now()); + else + out->txsdu_avg_time_to_tx = 0; } nr_rlc_entity_t *new_nr_rlc_entity_am( diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h index 567cd57154..dc0f2601db 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h @@ -137,6 +137,7 @@ typedef struct nr_rlc_entity_t { nr_rlc_statistics_t stats; time_average_t *txsdu_avg_time_to_tx; + int avg_time_is_on; } nr_rlc_entity_t; nr_rlc_entity_t *new_nr_rlc_entity_am( diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c index fd37f030a4..15ad86c045 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c @@ -1718,7 +1718,8 @@ void nr_rlc_entity_am_recv_sdu(nr_rlc_entity_t *_entity, entity->common.bstatus.tx_size += compute_pdu_header_size(entity, sdu) + sdu->size; - sdu->sdu->time_of_arrival = time_average_now(); + if (entity->common.avg_time_is_on) + sdu->sdu->time_of_arrival = time_average_now(); } /*************************************************************************/ diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c index 5903cd9c86..cfadf43d99 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c @@ -155,7 +155,8 @@ void nr_rlc_entity_tm_recv_sdu(nr_rlc_entity_t *_entity, /* update buffer status */ entity->common.bstatus.tx_size += sdu->size; - sdu->sdu->time_of_arrival = time_average_now(); + if (entity->common.avg_time_is_on) + sdu->sdu->time_of_arrival = time_average_now(); } /*************************************************************************/ diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c index d8356419bc..43a2189c51 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c @@ -595,7 +595,8 @@ void nr_rlc_entity_um_recv_sdu(nr_rlc_entity_t *_entity, entity->common.bstatus.tx_size += compute_pdu_header_size(entity, sdu) + sdu->size; - sdu->sdu->time_of_arrival = time_average_now(); + if (entity->common.avg_time_is_on) + sdu->sdu->time_of_arrival = time_average_now(); } /*************************************************************************/ diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 94bb8bf141..95ada37dbe 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -1111,6 +1111,33 @@ void rlc_tick(int a, int b) exit(1); } +void nr_rlc_activate_avg_time_to_tx( + const rnti_t rnti, + const logical_chan_id_t channel_id, + const bool is_on) +{ + nr_rlc_ue_t *ue; + nr_rlc_entity_t *rb; + + nr_rlc_manager_lock(nr_rlc_ue_manager); + ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rnti); + + switch (channel_id) { + case 1 ... 3: rb = ue->srb[channel_id - 1]; break; + case 4 ... 8: rb = ue->drb[channel_id - 4]; break; + default: rb = NULL; break; + } + + if (rb != NULL) { + rb->avg_time_is_on = is_on; + time_average_reset(rb->txsdu_avg_time_to_tx); + } else { + LOG_E(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rnti %x\n", __FUNCTION__, channel_id, rnti); + } + + nr_rlc_manager_unlock(nr_rlc_ue_manager); +} + /* returns 0 in case of error, 1 if everything ok */ int const nr_rlc_get_statistics( int rnti, diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h index 92fbba9bec..83396f71e8 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h @@ -51,3 +51,8 @@ void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChann int nr_rlc_get_available_tx_space( const rnti_t rntiP, const logical_chan_id_t channel_idP); + +void nr_rlc_activate_avg_time_to_tx( + const rnti_t rnti, + const logical_chan_id_t channel_id, + const bool is_on);