lib,rlc: allow ACK_SN be one over the end of the RX window.

This commit is contained in:
Pedro Alvarez 2022-07-04 13:49:53 +01:00
parent 51ffd91f16
commit b7ec529ff2
2 changed files with 16 additions and 2 deletions

View File

@ -131,6 +131,7 @@ public:
// Window helpers
bool inside_tx_window(uint32_t sn) const;
bool valid_ack_sn(uint32_t sn) const;
private:
rlc_am* parent = nullptr;
@ -240,6 +241,7 @@ public:
int handle_full_data_sdu(const rlc_am_nr_pdu_header_t& header, const uint8_t* payload, uint32_t nof_bytes);
int handle_segment_data_sdu(const rlc_am_nr_pdu_header_t& header, const uint8_t* payload, uint32_t nof_bytes);
bool inside_rx_window(uint32_t sn);
bool valid_ack_sn(uint32_t sn);
void write_to_upper_layers(uint32_t lcid, unique_byte_buffer_t sdu);
void insert_received_segment(rlc_amd_rx_pdu_nr segment, rlc_amd_rx_sdu_nr_t::segment_list_t& segment_list) const;
/**

View File

@ -1309,6 +1309,12 @@ bool rlc_am_nr_tx::inside_tx_window(uint32_t sn) const
return tx_mod_base_nr(sn) < tx_window_size();
}
bool rlc_am_nr_tx::valid_ack_sn(uint32_t sn)
{
// Tx_Next_Ack < SN <= TX_Next + AM_Window_Size
return (0 < tx_mod_base_nr(sn)) && (tx_mod_base_nr(sn) <= tx_window_size());
}
/*
* Debug Helpers
*/
@ -1844,11 +1850,11 @@ void rlc_am_nr_rx::timer_expired(uint32_t timeout_id)
}
}
st.rx_highest_status = sn_upd;
if (not inside_rx_window(st.rx_highest_status)) {
if (not valid_ack_sn(st.rx_highest_status)) {
RlcError("Rx_Highest_Status not inside RX window");
debug_state();
}
srsran_assert(inside_rx_window(st.rx_highest_status), "Error: rx_highest_status assigned outside rx window");
srsran_assert(valid_ack_sn(st.rx_highest_status), "Error: rx_highest_status assigned outside rx window");
bool restart_reassembly_timer = false;
if (rx_mod_base_nr(st.rx_next_highest) > rx_mod_base_nr(st.rx_highest_status + 1)) {
@ -1943,6 +1949,12 @@ bool rlc_am_nr_rx::inside_rx_window(uint32_t sn)
return rx_mod_base_nr(sn) < rx_window_size();
}
bool rlc_am_nr_rx::valid_ack_sn(uint32_t sn)
{
// RX_Next < SN <= RX_Next + AM_Window_Size
return (0 < rx_mod_base_nr(sn)) && (rx_mod_base_nr(sn) <= rx_window_size());
}
/*
* Debug Helpers
*/