@@ -47,7 +47,7 @@ rlc_rx_um_entity::rlc_rx_um_entity(gnb_du_id_t gnb_du_id,
4747void rlc_rx_um_entity::handle_pdu (byte_buffer_slice buf)
4848{
4949 metrics.metrics_add_pdus (1 , buf.length ());
50-
50+ auto start = std::chrono::high_resolution_clock::now ();
5151 pcap.push_pdu (pcap_context, buf);
5252
5353 rlc_um_pdu_header header = {};
@@ -81,6 +81,9 @@ void rlc_rx_um_entity::handle_pdu(byte_buffer_slice buf)
8181 // deliver to upper layer
8282 logger.log_info (" RX SDU. sdu_len={}" , sdu.value ().length ());
8383 metrics.metrics_add_sdus (1 , sdu.value ().length ());
84+ auto latency =
85+ std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now () - start);
86+ metrics.metrics_add_sdu_latency (latency.count () / 1000 );
8487 upper_dn.on_new_sdu (std::move (sdu.value ()));
8588 // Nothing else to do here ...
8689 return ;
@@ -115,6 +118,9 @@ void rlc_rx_um_entity::handle_pdu(byte_buffer_slice buf)
115118 // Do not pass empty SDU to upper layers and continue as normal to maintain state
116119 } else {
117120 logger.log_info (" RX SDU. sn={} sdu_len={}" , header.sn , sdu.value ().length ());
121+ auto latency = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now () -
122+ sdu_info.time_of_arrival );
123+ metrics.metrics_add_sdu_latency (latency.count () / 1000 );
118124 metrics.metrics_add_sdus (1 , sdu.value ().length ());
119125 upper_dn.on_new_sdu (std::move (sdu.value ()));
120126 }
@@ -274,8 +280,11 @@ bool rlc_rx_um_entity::handle_segment_data_sdu(const rlc_um_pdu_header& header,
274280 logger.log_debug (" RX SDU segment. payload_len={} {}" , payload.length (), header);
275281
276282 // Add new SN to RX window if no segments have been received yet
277- rlc_rx_um_sdu_info& rx_sdu = rx_window->has_sn (header.sn ) ? (*rx_window)[header.sn ] : rx_window->add_sn (header.sn );
278-
283+ rlc_rx_um_sdu_info& rx_sdu = rx_window->has_sn (header.sn ) ? (*rx_window)[header.sn ] : ([&]() -> rlc_rx_um_sdu_info& {
284+ rlc_rx_um_sdu_info& sdu = rx_window->add_sn (header.sn );
285+ sdu.time_of_arrival = std::chrono::high_resolution_clock::now ();
286+ return sdu;
287+ })();
279288 // Create SDU segment, to be stored later
280289 rlc_rx_um_sdu_segment segment = {};
281290 segment.si = header.si ;
0 commit comments