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: private:
/// Stored SN size required to compute the packed size /// Stored SN size required to compute the packed size
rlc_am_nr_sn_size_t sn_size = rlc_am_nr_sn_size_t::nulltype; 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_ /// Internal NACK container; keep in sync with packed_size_
std::vector<rlc_status_nack_t> nacks_ = {}; std::vector<rlc_status_nack_t> nacks_ = {};
/// Stores the current packed size; sync on each change of nacks_ /// Stores the current packed size; sync on each change of nacks_
@ -109,8 +111,9 @@ public:
const uint32_t& packed_size = packed_size_; const uint32_t& packed_size = packed_size_;
rlc_am_nr_status_pdu_t(rlc_am_nr_sn_size_t sn_size); rlc_am_nr_status_pdu_t(rlc_am_nr_sn_size_t sn_size);
void reset(); void reset();
void push_nack(const rlc_status_nack_t& nack); 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_; } const std::vector<rlc_status_nack_t>& get_nacks() const { return nacks_; }
uint32_t get_packed_size() const { return packed_size; } uint32_t get_packed_size() const { return packed_size; }
bool trim(uint32_t max_packed_size); bool trim(uint32_t max_packed_size);

View File

@ -19,7 +19,8 @@ namespace srsran {
* Container implementation for pack/unpack functions * 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); 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; 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 // 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; return false;
} }