mirror of https://github.com/PentHertz/srsLTE.git
rlc interface: convert entire read_pdu() interface to return uint32_t
we had it returning int but had a bug in using the return value properly, i.e. handling when -1 was returned in RLC TM. Thinking about it more, it doesn't make sense to have a negative return value here anyway. Either the RLC can return a PDU or not. If it can't the returned lenght is zero.
This commit is contained in:
parent
539ca47fe2
commit
c0be8187c8
|
@ -77,7 +77,7 @@ public:
|
||||||
class read_pdu_interface
|
class read_pdu_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes) = 0;
|
virtual uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class stack_interface_phy_nr
|
class stack_interface_phy_nr
|
||||||
|
|
|
@ -67,7 +67,7 @@ public:
|
||||||
|
|
||||||
/* MAC calls RLC to get RLC segment of nof_bytes length.
|
/* MAC calls RLC to get RLC segment of nof_bytes length.
|
||||||
* Segmentation happens in this function. RLC PDU is stored in payload. */
|
* Segmentation happens in this function. RLC PDU is stored in payload. */
|
||||||
virtual int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) = 0;
|
virtual uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) = 0;
|
||||||
|
|
||||||
/* MAC calls RLC to push an RLC PDU. This function is called from an independent MAC thread.
|
/* MAC calls RLC to push an RLC PDU. This function is called from an independent MAC thread.
|
||||||
* PDU gets placed into the buffer and higher layer thread gets notified. */
|
* PDU gets placed into the buffer and higher layer thread gets notified. */
|
||||||
|
|
|
@ -50,7 +50,7 @@ class rlc_dummy_interface : public rlc_interface_mac
|
||||||
public:
|
public:
|
||||||
bool has_data_locked(const uint32_t lcid) override { return false; }
|
bool has_data_locked(const uint32_t lcid) override { return false; }
|
||||||
uint32_t get_buffer_state(const uint32_t lcid) override { return 0; }
|
uint32_t get_buffer_state(const uint32_t lcid) override { return 0; }
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) override { return 0; }
|
uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) override { return 0; }
|
||||||
void write_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) override {}
|
void write_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) override {}
|
||||||
void write_pdu_bcch_bch(srsran::unique_byte_buffer_t payload) override {}
|
void write_pdu_bcch_bch(srsran::unique_byte_buffer_t payload) override {}
|
||||||
void write_pdu_bcch_dlsch(uint8_t* payload, uint32_t nof_bytes) override {}
|
void write_pdu_bcch_dlsch(uint8_t* payload, uint32_t nof_bytes) override {}
|
||||||
|
|
|
@ -66,8 +66,8 @@ public:
|
||||||
bool has_data_locked(const uint32_t lcid);
|
bool has_data_locked(const uint32_t lcid);
|
||||||
uint32_t get_buffer_state(const uint32_t lcid);
|
uint32_t get_buffer_state(const uint32_t lcid);
|
||||||
uint32_t get_total_mch_buffer_state(uint32_t lcid);
|
uint32_t get_total_mch_buffer_state(uint32_t lcid);
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes);
|
uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes);
|
||||||
int read_pdu_mch(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes);
|
uint32_t read_pdu_mch(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes);
|
||||||
int get_increment_sequence_num();
|
int get_increment_sequence_num();
|
||||||
void write_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes);
|
void write_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes);
|
||||||
void write_pdu_bcch_bch(srsran::unique_byte_buffer_t pdu);
|
void write_pdu_bcch_bch(srsran::unique_byte_buffer_t pdu);
|
||||||
|
|
|
@ -345,7 +345,7 @@ public:
|
||||||
// MAC interface
|
// MAC interface
|
||||||
bool has_data();
|
bool has_data();
|
||||||
uint32_t get_buffer_state();
|
uint32_t get_buffer_state();
|
||||||
int read_pdu(uint8_t* payload, uint32_t nof_bytes);
|
uint32_t read_pdu(uint8_t* payload, uint32_t nof_bytes);
|
||||||
void write_pdu(uint8_t* payload, uint32_t nof_bytes);
|
void write_pdu(uint8_t* payload, uint32_t nof_bytes);
|
||||||
|
|
||||||
rlc_bearer_metrics_t get_metrics();
|
rlc_bearer_metrics_t get_metrics();
|
||||||
|
@ -368,7 +368,7 @@ private:
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
int write_sdu(unique_byte_buffer_t sdu);
|
int write_sdu(unique_byte_buffer_t sdu);
|
||||||
int read_pdu(uint8_t* payload, uint32_t nof_bytes);
|
uint32_t read_pdu(uint8_t* payload, uint32_t nof_bytes);
|
||||||
void discard_sdu(uint32_t discard_sn);
|
void discard_sdu(uint32_t discard_sn);
|
||||||
bool sdu_queue_is_full();
|
bool sdu_queue_is_full();
|
||||||
|
|
||||||
|
|
|
@ -274,7 +274,7 @@ public:
|
||||||
virtual bool has_data() = 0;
|
virtual bool has_data() = 0;
|
||||||
bool is_suspended() { return suspended; };
|
bool is_suspended() { return suspended; };
|
||||||
virtual uint32_t get_buffer_state() = 0;
|
virtual uint32_t get_buffer_state() = 0;
|
||||||
virtual int read_pdu(uint8_t* payload, uint32_t nof_bytes) = 0;
|
virtual uint32_t read_pdu(uint8_t* payload, uint32_t nof_bytes) = 0;
|
||||||
virtual void write_pdu(uint8_t* payload, uint32_t nof_bytes) = 0;
|
virtual void write_pdu(uint8_t* payload, uint32_t nof_bytes) = 0;
|
||||||
|
|
||||||
virtual void set_bsr_callback(bsr_callback_t callback) = 0;
|
virtual void set_bsr_callback(bsr_callback_t callback) = 0;
|
||||||
|
@ -320,4 +320,5 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace srsran
|
} // namespace srsran
|
||||||
|
|
||||||
#endif // SRSRAN_RLC_COMMON_H
|
#endif // SRSRAN_RLC_COMMON_H
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
// MAC interface
|
// MAC interface
|
||||||
bool has_data() override;
|
bool has_data() override;
|
||||||
uint32_t get_buffer_state() override;
|
uint32_t get_buffer_state() override;
|
||||||
int read_pdu(uint8_t* payload, uint32_t nof_bytes) override;
|
uint32_t read_pdu(uint8_t* payload, uint32_t nof_bytes) override;
|
||||||
void write_pdu(uint8_t* payload, uint32_t nof_bytes) override;
|
void write_pdu(uint8_t* payload, uint32_t nof_bytes) override;
|
||||||
|
|
||||||
void set_bsr_callback(bsr_callback_t callback) override {}
|
void set_bsr_callback(bsr_callback_t callback) override {}
|
||||||
|
|
|
@ -58,7 +58,7 @@ public:
|
||||||
// MAC interface
|
// MAC interface
|
||||||
bool has_data();
|
bool has_data();
|
||||||
uint32_t get_buffer_state();
|
uint32_t get_buffer_state();
|
||||||
int read_pdu(uint8_t* payload, uint32_t nof_bytes);
|
uint32_t read_pdu(uint8_t* payload, uint32_t nof_bytes);
|
||||||
void write_pdu(uint8_t* payload, uint32_t nof_bytes);
|
void write_pdu(uint8_t* payload, uint32_t nof_bytes);
|
||||||
int get_increment_sequence_num();
|
int get_increment_sequence_num();
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ protected:
|
||||||
rlc_um_base_tx(rlc_um_base* parent_);
|
rlc_um_base_tx(rlc_um_base* parent_);
|
||||||
virtual ~rlc_um_base_tx();
|
virtual ~rlc_um_base_tx();
|
||||||
virtual bool configure(const rlc_config_t& cfg, std::string rb_name) = 0;
|
virtual bool configure(const rlc_config_t& cfg, std::string rb_name) = 0;
|
||||||
int build_data_pdu(uint8_t* payload, uint32_t nof_bytes);
|
uint32_t build_data_pdu(uint8_t* payload, uint32_t nof_bytes);
|
||||||
void stop();
|
void stop();
|
||||||
void reestablish();
|
void reestablish();
|
||||||
void empty_queue();
|
void empty_queue();
|
||||||
|
@ -107,7 +107,7 @@ protected:
|
||||||
srsran::rolling_average<double> mean_pdu_latency_us;
|
srsran::rolling_average<double> mean_pdu_latency_us;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
virtual int build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes) = 0;
|
virtual uint32_t build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes) = 0;
|
||||||
|
|
||||||
// helper functions
|
// helper functions
|
||||||
virtual void debug_state() = 0;
|
virtual void debug_state() = 0;
|
||||||
|
|
|
@ -48,7 +48,7 @@ private:
|
||||||
rlc_um_lte_tx(rlc_um_base* parent_);
|
rlc_um_lte_tx(rlc_um_base* parent_);
|
||||||
|
|
||||||
bool configure(const rlc_config_t& cfg, std::string rb_name);
|
bool configure(const rlc_config_t& cfg, std::string rb_name);
|
||||||
int build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes);
|
uint32_t build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes);
|
||||||
uint32_t get_buffer_state();
|
uint32_t get_buffer_state();
|
||||||
bool sdu_queue_is_full();
|
bool sdu_queue_is_full();
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ private:
|
||||||
rlc_um_nr_tx(rlc_um_base* parent_);
|
rlc_um_nr_tx(rlc_um_base* parent_);
|
||||||
|
|
||||||
bool configure(const rlc_config_t& cfg, std::string rb_name);
|
bool configure(const rlc_config_t& cfg, std::string rb_name);
|
||||||
int build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes);
|
uint32_t build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes);
|
||||||
uint32_t get_buffer_state();
|
uint32_t get_buffer_state();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -292,7 +292,7 @@ uint32_t rlc::get_total_mch_buffer_state(uint32_t lcid)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc::read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc::read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ int rlc::read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc::read_pdu_mch(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc::read_pdu_mch(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
|
|
||||||
|
|
|
@ -248,9 +248,9 @@ uint32_t rlc_am_lte::get_buffer_state()
|
||||||
return tx.get_buffer_state();
|
return tx.get_buffer_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_am_lte::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_am_lte::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
int read_bytes = tx.read_pdu(payload, nof_bytes);
|
uint32_t read_bytes = tx.read_pdu(payload, nof_bytes);
|
||||||
metrics.num_tx_pdus++;
|
metrics.num_tx_pdus++;
|
||||||
metrics.num_tx_pdu_bytes += read_bytes;
|
metrics.num_tx_pdu_bytes += read_bytes;
|
||||||
return read_bytes;
|
return read_bytes;
|
||||||
|
@ -533,7 +533,7 @@ bool rlc_am_lte::rlc_am_lte_tx::sdu_queue_is_full()
|
||||||
return tx_sdu_queue.is_full();
|
return tx_sdu_queue.is_full();
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_am_lte::rlc_am_lte_tx::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_am_lte::rlc_am_lte_tx::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
|
|
|
@ -134,12 +134,12 @@ void rlc_tm::reset_metrics()
|
||||||
metrics = {};
|
metrics = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_tm::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_tm::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
uint32_t pdu_size = ul_queue.size_tail_bytes();
|
uint32_t pdu_size = ul_queue.size_tail_bytes();
|
||||||
if (pdu_size > nof_bytes) {
|
if (pdu_size > nof_bytes) {
|
||||||
logger.info("%s Tx PDU size larger than MAC opportunity (%d > %d)", rrc->get_rb_name(lcid), pdu_size, nof_bytes);
|
logger.info("%s Tx PDU size larger than MAC opportunity (%d > %d)", rrc->get_rb_name(lcid), pdu_size, nof_bytes);
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
unique_byte_buffer_t buf;
|
unique_byte_buffer_t buf;
|
||||||
if (ul_queue.try_read(&buf)) {
|
if (ul_queue.try_read(&buf)) {
|
||||||
|
@ -171,7 +171,7 @@ int rlc_tm::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
void rlc_tm::write_pdu(uint8_t* payload, uint32_t nof_bytes)
|
void rlc_tm::write_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
unique_byte_buffer_t buf = make_byte_buffer();
|
unique_byte_buffer_t buf = make_byte_buffer();
|
||||||
if (buf) {
|
if (buf != nullptr) {
|
||||||
memcpy(buf->msg, payload, nof_bytes);
|
memcpy(buf->msg, payload, nof_bytes);
|
||||||
buf->N_bytes = nof_bytes;
|
buf->N_bytes = nof_bytes;
|
||||||
buf->set_timestamp();
|
buf->set_timestamp();
|
||||||
|
|
|
@ -130,7 +130,7 @@ uint32_t rlc_um_base::get_buffer_state()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_um_base::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_um_base::read_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
if (tx && tx_enabled) {
|
if (tx && tx_enabled) {
|
||||||
uint32_t len = tx->build_data_pdu(payload, nof_bytes);
|
uint32_t len = tx->build_data_pdu(payload, nof_bytes);
|
||||||
|
@ -283,7 +283,7 @@ bool rlc_um_base::rlc_um_base_tx::sdu_queue_is_full()
|
||||||
return tx_sdu_queue.is_full();
|
return tx_sdu_queue.is_full();
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_um_base::rlc_um_base_tx::build_data_pdu(uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_um_base::rlc_um_base_tx::build_data_pdu(uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
unique_byte_buffer_t pdu;
|
unique_byte_buffer_t pdu;
|
||||||
{
|
{
|
||||||
|
|
|
@ -109,7 +109,7 @@ bool rlc_um_lte::rlc_um_lte_tx::configure(const rlc_config_t& cnfg_, std::string
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_um_lte::rlc_um_lte_tx::build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_um_lte::rlc_um_lte_tx::build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
rlc_umd_pdu_header_t header;
|
rlc_umd_pdu_header_t header;
|
||||||
|
|
|
@ -115,7 +115,7 @@ bool rlc_um_nr::rlc_um_nr_tx::configure(const rlc_config_t& cnfg_, std::string r
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rlc_um_nr::rlc_um_nr_tx::build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes)
|
uint32_t rlc_um_nr::rlc_um_nr_tx::build_data_pdu(unique_byte_buffer_t pdu, uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
// Sanity check (we need at least 2B for a SDU)
|
// Sanity check (we need at least 2B for a SDU)
|
||||||
if (nof_bytes < 2) {
|
if (nof_bytes < 2) {
|
||||||
|
|
|
@ -169,7 +169,7 @@ int mac_rar_pdu_pack_test2()
|
||||||
class rlc_dummy : public srsran::read_pdu_interface
|
class rlc_dummy : public srsran::read_pdu_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes)
|
||||||
{
|
{
|
||||||
uint32_t len = std::min(ul_queues[lcid], nof_bytes);
|
uint32_t len = std::min(ul_queues[lcid], nof_bytes);
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ public:
|
||||||
void metrics_dl_cqi(uint32_t dl_cqi);
|
void metrics_dl_cqi(uint32_t dl_cqi);
|
||||||
void metrics_cnt();
|
void metrics_cnt();
|
||||||
|
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes) final;
|
uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes) final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void allocate_sdu(srsran::sch_pdu* pdu, uint32_t lcid, uint32_t sdu_len);
|
void allocate_sdu(srsran::sch_pdu* pdu, uint32_t lcid, uint32_t sdu_len);
|
||||||
|
|
|
@ -503,7 +503,7 @@ bool ue::process_ce(srsran::sch_subh* subh, int grant_nof_prbs)
|
||||||
return is_bsr;
|
return is_bsr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ue::read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes)
|
uint32_t ue::read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes)
|
||||||
{
|
{
|
||||||
return rlc->read_pdu(rnti, lcid, payload, requested_bytes);
|
return rlc->read_pdu(rnti, lcid, payload, requested_bytes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ public:
|
||||||
rlc_dummy() : received_bytes(0) {}
|
rlc_dummy() : received_bytes(0) {}
|
||||||
bool has_data_locked(const uint32_t lcid) final { return ul_queues[lcid] > 0; }
|
bool has_data_locked(const uint32_t lcid) final { return ul_queues[lcid] > 0; }
|
||||||
uint32_t get_buffer_state(const uint32_t lcid) final { return ul_queues[lcid]; }
|
uint32_t get_buffer_state(const uint32_t lcid) final { return ul_queues[lcid]; }
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) final
|
uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) final
|
||||||
{
|
{
|
||||||
if (!read_enable || nof_bytes < read_min) {
|
if (!read_enable || nof_bytes < read_min) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
rlc_dummy() : received_bytes(0) {}
|
rlc_dummy() : received_bytes(0) {}
|
||||||
bool has_data_locked(const uint32_t lcid) final { return ul_queues[lcid] > 0; }
|
bool has_data_locked(const uint32_t lcid) final { return ul_queues[lcid] > 0; }
|
||||||
uint32_t get_buffer_state(const uint32_t lcid) final { return ul_queues[lcid]; }
|
uint32_t get_buffer_state(const uint32_t lcid) final { return ul_queues[lcid]; }
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) final
|
uint32_t read_pdu(uint32_t lcid, uint8_t* payload, uint32_t nof_bytes) final
|
||||||
{
|
{
|
||||||
if (!read_enable || nof_bytes < read_min) {
|
if (!read_enable || nof_bytes < read_min) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue