@@ -79,6 +79,11 @@ e2sm_kpm_du_meas_provider_impl::e2sm_kpm_du_meas_provider_impl(srs_du::f1ap_ue_i
7979 " DRB.AirIfDelayUl" ,
8080 e2sm_kpm_supported_metric_t {NO_LABEL, ALL_LEVELS, true , &e2sm_kpm_du_meas_provider_impl::get_delay_ul});
8181
82+ supported_metrics.emplace (
83+ " DRB.RlcDelayUl" ,
84+ e2sm_kpm_supported_metric_t {
85+ NO_LABEL, ALL_LEVELS, true , &e2sm_kpm_du_meas_provider_impl::get_drb_ul_rlc_sdu_latency});
86+
8287 // Check if the supported metrics are matching e2sm_kpm metrics definitions.
8388 check_e2sm_kpm_metrics_definitions (get_e2sm_kpm_28_552_metrics ());
8489 check_e2sm_kpm_metrics_definitions (get_e2sm_kpm_oran_metrics ());
@@ -139,6 +144,7 @@ void e2sm_kpm_du_meas_provider_impl::report_metrics(const rlc_metrics& metrics)
139144 ue_aggr_rlc_metrics[metrics.ue_index ].rx .num_sdu_bytes += metrics.rx .num_sdu_bytes ;
140145 ue_aggr_rlc_metrics[metrics.ue_index ].rx .num_pdus += metrics.rx .num_pdus ;
141146 ue_aggr_rlc_metrics[metrics.ue_index ].rx .num_pdu_bytes += metrics.rx .num_pdu_bytes ;
147+ ue_aggr_rlc_metrics[metrics.ue_index ].rx .sdu_latency_us += metrics.rx .sdu_latency_us ;
142148 ue_aggr_rlc_metrics[metrics.ue_index ].tx .num_sdus += metrics.tx .num_sdus ;
143149 ue_aggr_rlc_metrics[metrics.ue_index ].tx .num_of_pulled_sdus += metrics.tx .num_of_pulled_sdus ;
144150 ue_aggr_rlc_metrics[metrics.ue_index ].tx .num_sdu_bytes += metrics.tx .num_sdu_bytes ;
@@ -837,3 +843,56 @@ bool e2sm_kpm_du_meas_provider_impl::get_drb_dl_rlc_sdu_latency(const asn1::e2sm
837843 }
838844 return meas_collected;
839845}
846+
847+ bool e2sm_kpm_du_meas_provider_impl::get_drb_ul_rlc_sdu_latency (const asn1::e2sm::label_info_list_l label_info_list,
848+ const std::vector<asn1::e2sm::ue_id_c>& ues,
849+ const std::optional<asn1::e2sm::cgi_c> cell_global_id,
850+ std::vector<asn1::e2sm::meas_record_item_c>& items)
851+ {
852+ bool meas_collected = false ;
853+ if ((label_info_list.size () > 1 or
854+ (label_info_list.size () == 1 and not label_info_list[0 ].meas_label .no_label_present ))) {
855+ logger.debug (" Metric: DRB.RlcDelayUl supports only NO_LABEL label." );
856+ return meas_collected;
857+ }
858+ if (ues.size () == 0 ) {
859+ meas_record_item_c meas_record_item;
860+ float av_ue_sdu_latency_us = 0 ;
861+ for (auto & rlc_metric : ue_aggr_rlc_metrics) {
862+ if (rlc_metric.second .rx .num_sdus && rlc_metric.second .rx .sdu_latency_us ) {
863+ av_ue_sdu_latency_us += (float )rlc_metric.second .rx .sdu_latency_us / (float )rlc_metric.second .rx .sdu_latency_us ;
864+ }
865+ }
866+ if (av_ue_sdu_latency_us) {
867+ meas_record_item.set_real ();
868+ meas_record_item.real ().value = av_ue_sdu_latency_us / ue_aggr_rlc_metrics.size ();
869+ items.push_back (meas_record_item);
870+ meas_collected = true ;
871+ } else {
872+ logger.warning (" Invalid RLC SDU latency value." );
873+ return meas_collected;
874+ }
875+ } else {
876+ for (auto & ue : ues) {
877+ meas_record_item_c meas_record_item;
878+ gnb_cu_ue_f1ap_id_t gnb_cu_ue_f1ap_id = int_to_gnb_cu_ue_f1ap_id (ue.gnb_du_ue_id ().gnb_cu_ue_f1ap_id );
879+ uint32_t ue_idx = f1ap_ue_id_provider.get_ue_index (gnb_cu_ue_f1ap_id);
880+ if (ue_aggr_rlc_metrics.count (ue_idx) == 0 ) {
881+ meas_record_item.set_no_value ();
882+ items.push_back (meas_record_item);
883+ meas_collected = true ;
884+ continue ;
885+ }
886+ if (ue_aggr_rlc_metrics[ue_idx].rx .sdu_latency_us ) {
887+ meas_record_item.set_real ();
888+ meas_record_item.real ().value =
889+ ue_aggr_rlc_metrics[ue_idx].rx .sdu_latency_us / ue_aggr_rlc_metrics[ue_idx].rx .num_sdus ;
890+ items.push_back (meas_record_item);
891+ meas_collected = true ;
892+ } else {
893+ logger.warning (" Invalid RLC SDU latency value." );
894+ }
895+ }
896+ }
897+ return meas_collected;
898+ }
0 commit comments