mirror of https://github.com/PentHertz/srsLTE.git
move tx/rx softbuffers of mac::ue to separate cc buffer handler class
This commit is contained in:
parent
2f95862932
commit
cc6c9ffc51
|
@ -35,14 +35,27 @@ class phy_interface_stack_lte;
|
||||||
class cc_buffer_handler
|
class cc_buffer_handler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// List of Tx softbuffers for all HARQ processes of one carrier
|
||||||
|
using cc_softbuffer_tx_list_t = std::vector<srslte_softbuffer_tx_t>;
|
||||||
|
// List of Rx softbuffers for all HARQ processes of one carrier
|
||||||
|
using cc_softbuffer_rx_list_t = std::vector<srslte_softbuffer_rx_t>;
|
||||||
|
|
||||||
cc_buffer_handler();
|
cc_buffer_handler();
|
||||||
|
|
||||||
|
bool empty() const { return softbuffer_tx.empty(); }
|
||||||
|
|
||||||
|
cc_softbuffer_tx_list_t& get_tx_softbuffer() { return softbuffer_tx; }
|
||||||
|
cc_softbuffer_rx_list_t& get_rx_softbuffer() { return softbuffer_rx; }
|
||||||
|
|
||||||
srslte::byte_buffer_t* get_tx_payload_buffer(size_t harq_pid, size_t tb)
|
srslte::byte_buffer_t* get_tx_payload_buffer(size_t harq_pid, size_t tb)
|
||||||
{
|
{
|
||||||
return tx_payload_buffer[harq_pid][tb].get();
|
return tx_payload_buffer[harq_pid][tb].get();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
cc_softbuffer_tx_list_t softbuffer_tx; ///< List of softbuffer lists for Tx
|
||||||
|
cc_softbuffer_rx_list_t softbuffer_rx; ///< List of softbuffer lists for Rx
|
||||||
|
|
||||||
// One buffer per TB per HARQ process and per carrier is needed for each UE.
|
// One buffer per TB per HARQ process and per carrier is needed for each UE.
|
||||||
std::array<std::array<srslte::unique_byte_buffer_t, SRSLTE_MAX_TB>, SRSLTE_FDD_NOF_HARQ> tx_payload_buffer;
|
std::array<std::array<srslte::unique_byte_buffer_t, SRSLTE_MAX_TB>, SRSLTE_FDD_NOF_HARQ> tx_payload_buffer;
|
||||||
};
|
};
|
||||||
|
@ -110,7 +123,7 @@ public:
|
||||||
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes) final;
|
int read_pdu(uint32_t lcid, uint8_t* payload, uint32_t requested_bytes) final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t allocate_cc_buffers(const uint32_t num_cc = 1); ///< Add and initialize softbuffers for CC
|
void allocate_cc_buffers(const uint32_t num_cc = 1); ///< Add and initialize softbuffers for CC
|
||||||
|
|
||||||
void allocate_sdu(srslte::sch_pdu* pdu, uint32_t lcid, uint32_t sdu_len);
|
void allocate_sdu(srslte::sch_pdu* pdu, uint32_t lcid, uint32_t sdu_len);
|
||||||
bool process_ce(srslte::sch_subh* subh);
|
bool process_ce(srslte::sch_subh* subh);
|
||||||
|
@ -131,14 +144,6 @@ private:
|
||||||
int nof_rx_harq_proc = 0;
|
int nof_rx_harq_proc = 0;
|
||||||
int nof_tx_harq_proc = 0;
|
int nof_tx_harq_proc = 0;
|
||||||
|
|
||||||
typedef std::vector<srslte_softbuffer_tx_t>
|
|
||||||
cc_softbuffer_tx_list_t; ///< List of Tx softbuffers for all HARQ processes of one carrier
|
|
||||||
std::vector<cc_softbuffer_tx_list_t> softbuffer_tx; ///< List of softbuffer lists for Tx
|
|
||||||
|
|
||||||
typedef std::vector<srslte_softbuffer_rx_t>
|
|
||||||
cc_softbuffer_rx_list_t; ///< List of Rx softbuffers for all HARQ processes of one carrier
|
|
||||||
std::vector<cc_softbuffer_rx_list_t> softbuffer_rx; ///< List of softbuffer lists for Rx
|
|
||||||
|
|
||||||
std::vector<cc_buffer_handler> cc_buffers;
|
std::vector<cc_buffer_handler> cc_buffers;
|
||||||
|
|
||||||
std::mutex rx_buffers_mutex;
|
std::mutex rx_buffers_mutex;
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "srsenb/hdr/stack/mac/ue.h"
|
#include "srsenb/hdr/stack/mac/ue.h"
|
||||||
#include "srslte/common/log_helper.h"
|
|
||||||
#include "srslte/interfaces/enb_phy_interfaces.h"
|
#include "srslte/interfaces/enb_phy_interfaces.h"
|
||||||
#include "srslte/interfaces/enb_rlc_interfaces.h"
|
#include "srslte/interfaces/enb_rlc_interfaces.h"
|
||||||
#include "srslte/interfaces/enb_rrc_interfaces.h"
|
#include "srslte/interfaces/enb_rrc_interfaces.h"
|
||||||
|
@ -71,14 +70,11 @@ ue::ue(uint16_t rnti_,
|
||||||
ue::~ue()
|
ue::~ue()
|
||||||
{
|
{
|
||||||
// Free up all softbuffers for all CCs
|
// Free up all softbuffers for all CCs
|
||||||
for (auto cc : softbuffer_rx) {
|
for (auto& cc : cc_buffers) {
|
||||||
for (auto buffer : cc) {
|
for (auto& buffer : cc.get_rx_softbuffer()) {
|
||||||
srslte_softbuffer_rx_free(&buffer);
|
srslte_softbuffer_rx_free(&buffer);
|
||||||
}
|
}
|
||||||
}
|
for (auto& buffer : cc.get_tx_softbuffer()) {
|
||||||
|
|
||||||
for (auto cc : softbuffer_tx) {
|
|
||||||
for (auto buffer : cc) {
|
|
||||||
srslte_softbuffer_tx_free(&buffer);
|
srslte_softbuffer_tx_free(&buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,15 +93,11 @@ void ue::reset()
|
||||||
{
|
{
|
||||||
ue_metrics = {};
|
ue_metrics = {};
|
||||||
nof_failures = 0;
|
nof_failures = 0;
|
||||||
|
for (auto& cc : cc_buffers) {
|
||||||
for (auto cc : softbuffer_rx) {
|
for (auto& buffer : cc.get_rx_softbuffer()) {
|
||||||
for (auto buffer : cc) {
|
|
||||||
srslte_softbuffer_rx_reset(&buffer);
|
srslte_softbuffer_rx_reset(&buffer);
|
||||||
}
|
}
|
||||||
}
|
for (auto& buffer : cc.get_tx_softbuffer()) {
|
||||||
|
|
||||||
for (auto cc : softbuffer_tx) {
|
|
||||||
for (auto buffer : cc) {
|
|
||||||
srslte_softbuffer_tx_reset(&buffer);
|
srslte_softbuffer_tx_reset(&buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,25 +111,24 @@ void ue::reset()
|
||||||
* @param num_cc Number of carriers to add buffers for (default 1)
|
* @param num_cc Number of carriers to add buffers for (default 1)
|
||||||
* @return number of carriers
|
* @return number of carriers
|
||||||
*/
|
*/
|
||||||
uint32_t ue::allocate_cc_buffers(const uint32_t num_cc)
|
void ue::allocate_cc_buffers(const uint32_t num_cc)
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < num_cc; ++i) {
|
for (uint32_t i = 0; i < num_cc; ++i) {
|
||||||
// create and init Rx buffers for Pcell
|
if (cc_buffers[i].empty()) {
|
||||||
softbuffer_rx.emplace_back();
|
// Create and init Rx buffers for Pcell
|
||||||
softbuffer_rx.back().resize(nof_rx_harq_proc);
|
cc_buffers[i].get_rx_softbuffer().resize(nof_rx_harq_proc);
|
||||||
for (auto& buffer : softbuffer_rx.back()) {
|
for (auto& buffer : cc_buffers[i].get_rx_softbuffer()) {
|
||||||
srslte_softbuffer_rx_init(&buffer, nof_prb);
|
srslte_softbuffer_rx_init(&buffer, nof_prb);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create and init Tx buffers for Pcell
|
// Create and init Tx buffers for Pcell
|
||||||
softbuffer_tx.emplace_back();
|
cc_buffers[i].get_tx_softbuffer().resize(nof_tx_harq_proc);
|
||||||
softbuffer_tx.back().resize(nof_tx_harq_proc);
|
auto& harq_buffers = cc_buffers[i].get_tx_softbuffer();
|
||||||
for (auto& buffer : softbuffer_tx.back()) {
|
for (auto& buffer : harq_buffers) {
|
||||||
srslte_softbuffer_tx_init(&buffer, nof_prb);
|
srslte_softbuffer_tx_init(&buffer, nof_prb);
|
||||||
}
|
}
|
||||||
// don't need to reset because just initiated the buffers
|
|
||||||
}
|
}
|
||||||
return softbuffer_tx.size();
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ue::start_pcap(srslte::mac_pcap* pcap_)
|
void ue::start_pcap(srslte::mac_pcap* pcap_)
|
||||||
|
@ -147,33 +138,23 @@ void ue::start_pcap(srslte::mac_pcap* pcap_)
|
||||||
|
|
||||||
srslte_softbuffer_rx_t* ue::get_rx_softbuffer(const uint32_t ue_cc_idx, const uint32_t tti)
|
srslte_softbuffer_rx_t* ue::get_rx_softbuffer(const uint32_t ue_cc_idx, const uint32_t tti)
|
||||||
{
|
{
|
||||||
if ((size_t)ue_cc_idx >= softbuffer_rx.size()) {
|
if ((size_t)ue_cc_idx >= cc_buffers.size()) {
|
||||||
ERROR("UE CC Index (%d/%zd) out-of-range", ue_cc_idx, softbuffer_rx.size());
|
ERROR("UE CC Index (%d/%zd) out-of-range", ue_cc_idx, cc_buffers.size());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)nof_rx_harq_proc > softbuffer_rx.at(ue_cc_idx).size()) {
|
return &cc_buffers.at(ue_cc_idx).get_rx_softbuffer().at(tti % nof_rx_harq_proc);
|
||||||
ERROR("HARQ process index (%d/%zd) out-of-range", nof_rx_harq_proc, softbuffer_rx.at(ue_cc_idx).size());
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &softbuffer_rx.at(ue_cc_idx).at(tti % nof_rx_harq_proc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
srslte_softbuffer_tx_t*
|
srslte_softbuffer_tx_t*
|
||||||
ue::get_tx_softbuffer(const uint32_t ue_cc_idx, const uint32_t harq_process, const uint32_t tb_idx)
|
ue::get_tx_softbuffer(const uint32_t ue_cc_idx, const uint32_t harq_process, const uint32_t tb_idx)
|
||||||
{
|
{
|
||||||
if ((size_t)ue_cc_idx >= softbuffer_tx.size()) {
|
if ((size_t)ue_cc_idx >= cc_buffers.size()) {
|
||||||
ERROR("UE CC Index (%d/%zd) out-of-range", ue_cc_idx, softbuffer_tx.size());
|
ERROR("UE CC Index (%d/%zd) out-of-range", ue_cc_idx, cc_buffers.size());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)nof_tx_harq_proc > softbuffer_tx.at(ue_cc_idx).size()) {
|
return &cc_buffers[ue_cc_idx].get_tx_softbuffer().at((harq_process * SRSLTE_MAX_TB + tb_idx) % nof_tx_harq_proc);
|
||||||
ERROR("HARQ process index (%d/%zd) out-of-range", harq_process, softbuffer_tx.at(ue_cc_idx).size());
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &softbuffer_tx.at(ue_cc_idx).at((harq_process * SRSLTE_MAX_TB + tb_idx) % nof_tx_harq_proc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* ue::request_buffer(uint32_t tti, uint32_t ue_cc_idx, const uint32_t len)
|
uint8_t* ue::request_buffer(uint32_t tti, uint32_t ue_cc_idx, const uint32_t len)
|
||||||
|
@ -246,8 +227,6 @@ uint32_t ue::set_ta(int ta_)
|
||||||
return nof_cmd;
|
return nof_cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
void ue::process_pdu(uint8_t* pdu, uint32_t nof_bytes, srslte::pdu_queue::channel_t channel)
|
void ue::process_pdu(uint8_t* pdu, uint32_t nof_bytes, srslte::pdu_queue::channel_t channel)
|
||||||
{
|
{
|
||||||
// Unpack ULSCH MAC PDU
|
// Unpack ULSCH MAC PDU
|
||||||
|
|
Loading…
Reference in New Issue