rlc, nr: notify PDCP about fully acked SDUs

master
Robert Falkenberg 3 years ago
parent e6d976d115
commit 9b44d13471

@ -16,6 +16,7 @@
#include "srsran/common/buffer_pool.h" #include "srsran/common/buffer_pool.h"
#include "srsran/common/common.h" #include "srsran/common/common.h"
#include "srsran/common/timers.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_base.h"
#include "srsran/rlc/rlc_am_data_structs.h" #include "srsran/rlc/rlc_am_data_structs.h"
#include "srsran/rlc/rlc_am_nr_packing.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 { struct rlc_amd_tx_pdu_nr {
const uint32_t rlc_sn = INVALID_RLC_SN; 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 = {}; rlc_am_nr_pdu_header_t header = {};
unique_byte_buffer_t sdu_buf = nullptr; unique_byte_buffer_t sdu_buf = nullptr;
uint32_t retx_count = 0; uint32_t retx_count = 0;
@ -152,6 +153,7 @@ private:
// Queues and buffers // Queues and buffers
pdu_retx_queue<RLC_AM_WINDOW_SIZE> retx_queue; pdu_retx_queue<RLC_AM_WINDOW_SIZE> retx_queue;
uint32_t sdu_under_segmentation_sn = INVALID_RLC_SN; // SN of the SDU currently being segmented. 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 // Helper constants
uint32_t min_hdr_size = 2; uint32_t min_hdr_size = 2;

@ -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 // 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 // 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); 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(); tx_pdu.sdu_buf = srsran::make_byte_buffer();
if (tx_pdu.sdu_buf == nullptr) { if (tx_pdu.sdu_buf == nullptr) {
RlcError("Couldn't allocate PDU in %s().", __FUNCTION__); 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++) { for (uint32_t sn = st.tx_next_ack; sn < stop_sn; sn++) {
if (tx_window.has_sn(sn)) { if (tx_window.has_sn(sn)) {
notify_info_vec.push_back(tx_window[sn].pdcp_sn);
tx_window.remove_pdu(sn); tx_window.remove_pdu(sn);
st.tx_next_ack = sn + 1; st.tx_next_ack = sn + 1;
// TODO notify PDCP
} else { } else {
RlcError("Missing ACKed SN from TX window"); RlcError("Missing ACKed SN from TX window");
break; 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 // Process N_acks
for (uint32_t nack_idx = 0; nack_idx < status.N_nack; nack_idx++) { 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) { if (st.tx_next_ack <= status.nacks[nack_idx].nack_sn && status.nacks[nack_idx].nack_sn <= st.tx_next) {

@ -258,6 +258,14 @@ int basic_test()
TESTASSERT_EQ(5, st.tx_next_ack); TESTASSERT_EQ(5, st.tx_next_ack);
TESTASSERT_EQ(0, tx1->get_tx_window_size()); 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 // Check statistics
rlc_bearer_metrics_t metrics1 = rlc1.get_metrics(); rlc_bearer_metrics_t metrics1 = rlc1.get_metrics();
rlc_bearer_metrics_t metrics2 = rlc2.get_metrics(); rlc_bearer_metrics_t metrics2 = rlc2.get_metrics();

Loading…
Cancel
Save