lib,rlc_am_nr: merge NACKs across SN overflows

This commit is contained in:
Robert Falkenberg 2022-05-02 14:55:33 +02:00
parent e9156d4ba2
commit ecc995bd4b
2 changed files with 9 additions and 5 deletions

View File

@ -90,6 +90,8 @@ class rlc_am_nr_status_pdu_t
private:
/// Stored SN size required to compute the packed size
rlc_am_nr_sn_size_t sn_size = rlc_am_nr_sn_size_t::nulltype;
/// Stored modulus to determine continuous sequences across SN overflows
uint32_t mod_nr = cardinality(rlc_am_nr_sn_size_t::nulltype);
/// Internal NACK container; keep in sync with packed_size_
std::vector<rlc_status_nack_t> nacks_ = {};
/// Stores the current packed size; sync on each change of nacks_
@ -109,8 +111,9 @@ public:
const uint32_t& packed_size = packed_size_;
rlc_am_nr_status_pdu_t(rlc_am_nr_sn_size_t sn_size);
void reset();
void push_nack(const rlc_status_nack_t& nack);
void reset();
bool is_continuous_sequence(const rlc_status_nack_t& left, const rlc_status_nack_t& right) const;
void push_nack(const rlc_status_nack_t& nack);
const std::vector<rlc_status_nack_t>& get_nacks() const { return nacks_; }
uint32_t get_packed_size() const { return packed_size; }
bool trim(uint32_t max_packed_size);

View File

@ -19,7 +19,8 @@ namespace srsran {
* Container implementation for pack/unpack functions
***************************************************************************/
rlc_am_nr_status_pdu_t::rlc_am_nr_status_pdu_t(rlc_am_nr_sn_size_t sn_size) : sn_size(sn_size)
rlc_am_nr_status_pdu_t::rlc_am_nr_status_pdu_t(rlc_am_nr_sn_size_t sn_size) :
sn_size(sn_size), mod_nr(cardinality(sn_size))
{
nacks_.reserve(RLC_AM_NR_TYP_NACKS);
}
@ -32,10 +33,10 @@ void rlc_am_nr_status_pdu_t::reset()
packed_size_ = rlc_am_nr_status_pdu_sizeof_header_ack_sn;
}
static bool is_continuous_sequence(const rlc_status_nack_t& left, const rlc_status_nack_t& right)
bool rlc_am_nr_status_pdu_t::is_continuous_sequence(const rlc_status_nack_t& left, const rlc_status_nack_t& right) const
{
// SN must be continuous
if (right.nack_sn != left.has_nack_range ? left.nack_sn + left.nack_range : left.nack_sn + 1) {
if (right.nack_sn != ((left.has_nack_range ? left.nack_sn + left.nack_range : (left.nack_sn + 1)) % mod_nr)) {
return false;
}