From 9b44d13471cb138c8cabf979766ce95298a37bbf Mon Sep 17 00:00:00 2001 From: Robert Falkenberg Date: Fri, 18 Feb 2022 16:15:40 +0100 Subject: [PATCH] rlc, nr: notify PDCP about fully acked SDUs --- lib/include/srsran/rlc/rlc_am_nr.h | 4 +++- lib/src/rlc/rlc_am_nr.cc | 9 ++++++++- lib/test/rlc/rlc_am_nr_test.cc | 8 ++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/include/srsran/rlc/rlc_am_nr.h b/lib/include/srsran/rlc/rlc_am_nr.h index fc9172910..e0d44bd55 100644 --- a/lib/include/srsran/rlc/rlc_am_nr.h +++ b/lib/include/srsran/rlc/rlc_am_nr.h @@ -16,6 +16,7 @@ #include "srsran/common/buffer_pool.h" #include "srsran/common/common.h" #include "srsran/common/timers.h" +#include "srsran/interfaces/pdcp_interface_types.h" #include "srsran/rlc/rlc_am_base.h" #include "srsran/rlc/rlc_am_data_structs.h" #include "srsran/rlc/rlc_am_nr_packing.h" @@ -72,7 +73,7 @@ struct rlc_am_nr_tx_state_t { struct rlc_amd_tx_pdu_nr { const uint32_t rlc_sn = INVALID_RLC_SN; - const uint32_t pdcp_sn = INVALID_RLC_SN; + uint32_t pdcp_sn = INVALID_RLC_SN; rlc_am_nr_pdu_header_t header = {}; unique_byte_buffer_t sdu_buf = nullptr; uint32_t retx_count = 0; @@ -152,6 +153,7 @@ private: // Queues and buffers pdu_retx_queue retx_queue; uint32_t sdu_under_segmentation_sn = INVALID_RLC_SN; // SN of the SDU currently being segmented. + pdcp_sn_vector_t notify_info_vec; // Helper constants uint32_t min_hdr_size = 2; diff --git a/lib/src/rlc/rlc_am_nr.cc b/lib/src/rlc/rlc_am_nr.cc index bcc81c6b7..13e25ef3a 100644 --- a/lib/src/rlc/rlc_am_nr.cc +++ b/lib/src/rlc/rlc_am_nr.cc @@ -163,6 +163,7 @@ uint32_t rlc_am_nr_tx::build_new_pdu(uint8_t* payload, uint32_t nof_bytes) // insert newly assigned SN into window and use reference for in-place operations // NOTE: from now on, we can't return from this function anymore before increasing tx_next rlc_amd_tx_pdu_nr& tx_pdu = tx_window.add_pdu(st.tx_next); + tx_pdu.pdcp_sn = tx_sdu->md.pdcp_sn; tx_pdu.sdu_buf = srsran::make_byte_buffer(); if (tx_pdu.sdu_buf == nullptr) { RlcError("Couldn't allocate PDU in %s().", __FUNCTION__); @@ -707,15 +708,21 @@ void rlc_am_nr_tx::handle_control_pdu(uint8_t* payload, uint32_t nof_bytes) } for (uint32_t sn = st.tx_next_ack; sn < stop_sn; sn++) { if (tx_window.has_sn(sn)) { + notify_info_vec.push_back(tx_window[sn].pdcp_sn); tx_window.remove_pdu(sn); st.tx_next_ack = sn + 1; - // TODO notify PDCP } else { RlcError("Missing ACKed SN from TX window"); break; } } + // Notify PDCP + if (not notify_info_vec.empty()) { + parent->pdcp->notify_delivery(parent->lcid, notify_info_vec); + } + notify_info_vec.clear(); + // Process N_acks for (uint32_t nack_idx = 0; nack_idx < status.N_nack; nack_idx++) { if (st.tx_next_ack <= status.nacks[nack_idx].nack_sn && status.nacks[nack_idx].nack_sn <= st.tx_next) { diff --git a/lib/test/rlc/rlc_am_nr_test.cc b/lib/test/rlc/rlc_am_nr_test.cc index fb08b94b2..b8a8d0bc8 100644 --- a/lib/test/rlc/rlc_am_nr_test.cc +++ b/lib/test/rlc/rlc_am_nr_test.cc @@ -258,6 +258,14 @@ int basic_test() TESTASSERT_EQ(5, st.tx_next_ack); TESTASSERT_EQ(0, tx1->get_tx_window_size()); + // Check PDCP notifications + TESTASSERT_EQ(5, tester.notified_counts.size()); + for (uint16_t i = 0; i < tester.sdus.size(); i++) { + TESTASSERT_EQ(1, tester.sdus[i]->N_bytes); + TESTASSERT_EQ(i, *(tester.sdus[i]->msg)); + TESTASSERT_EQ(1, tester.notified_counts[i]); + } + // Check statistics rlc_bearer_metrics_t metrics1 = rlc1.get_metrics(); rlc_bearer_metrics_t metrics2 = rlc2.get_metrics();