mac: move further init/config into ctor to allow early logging, etc.

master
Andre Puschmann 6 years ago
parent a868a13409
commit 92f0d58856

@ -37,9 +37,10 @@ template <class SubH>
class pdu class pdu
{ {
public: public:
pdu(uint32_t max_subheaders_) : pdu(uint32_t max_subheaders_, srslte::log* log_) :
max_subheaders(max_subheaders_), max_subheaders(max_subheaders_),
subheaders(max_subheaders_), subheaders(max_subheaders_),
log(log_),
nof_subheaders(0), nof_subheaders(0),
cur_idx(-1), cur_idx(-1),
pdu_len(0), pdu_len(0),
@ -152,6 +153,7 @@ protected:
bool pdu_is_ul; bool pdu_is_ul;
byte_buffer_t* buffer_tx = nullptr; byte_buffer_t* buffer_tx = nullptr;
int last_sdu_idx; int last_sdu_idx;
srslte::log* log = nullptr;
/* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */ /* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */
virtual void init_(byte_buffer_t* buffer_tx_, uint32_t pdu_len_bytes, bool is_ulsch) virtual void init_(byte_buffer_t* buffer_tx_, uint32_t pdu_len_bytes, bool is_ulsch)
@ -291,11 +293,11 @@ private:
class sch_pdu : public pdu<sch_subh> class sch_pdu : public pdu<sch_subh>
{ {
public: public:
sch_pdu(uint32_t max_subh) : pdu(max_subh) {} sch_pdu(uint32_t max_subh, srslte::log* log) : pdu(max_subh, log) {}
void parse_packet(uint8_t* ptr); void parse_packet(uint8_t* ptr);
uint8_t* write_packet(); uint8_t* write_packet();
uint8_t* write_packet(srslte::log* log_h); uint8_t* write_packet(srslte::log* log);
bool has_space_ce(uint32_t nbytes, bool var_len = false); bool has_space_ce(uint32_t nbytes, bool var_len = false);
bool has_space_sdu(uint32_t nbytes); bool has_space_sdu(uint32_t nbytes);
int get_pdu_len(); int get_pdu_len();
@ -356,7 +358,7 @@ private:
class rar_pdu : public pdu<rar_subh> class rar_pdu : public pdu<rar_subh>
{ {
public: public:
rar_pdu(uint32_t max_rars = 16); rar_pdu(uint32_t max_rars = 16, srslte::log* log_ = nullptr);
void set_backoff(uint8_t bi); void set_backoff(uint8_t bi);
bool has_backoff(); bool has_backoff();
@ -382,7 +384,7 @@ public:
class mch_pdu : public sch_pdu class mch_pdu : public sch_pdu
{ {
public: public:
mch_pdu(uint32_t max_subh) : sch_pdu(max_subh) {} mch_pdu(uint32_t max_subh, srslte::log* log) : sch_pdu(max_subh, log) {}
private: private:
/* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */ /* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */

@ -57,7 +57,13 @@ void sch_pdu::parse_packet(uint8_t* ptr)
if (n_sub >= 0) { if (n_sub >= 0) {
subheaders[nof_subheaders - 1].set_payload_size(n_sub); subheaders[nof_subheaders - 1].set_payload_size(n_sub);
} else { } else {
ERROR("Reading MAC PDU: negative payload for last subheader\n"); ERROR("Corrupted MAC PDU (read_len=%d, pdu_len=%d)\n", read_len, pdu_len);
if (log) {
log->info_hex(ptr, pdu_len, "Corrupted MAC PDU (read_len=%d, pdu_len=%d)\n", read_len, pdu_len);
}
// reset PDU
init_(buffer_tx, pdu_len, pdu_is_ul);
} }
} }
} }
@ -828,7 +834,7 @@ void rar_pdu::fprint(FILE* stream)
pdu::fprint(stream); pdu::fprint(stream);
} }
rar_pdu::rar_pdu(uint32_t max_rars_) : pdu(max_rars_) rar_pdu::rar_pdu(uint32_t max_rars_, srslte::log* log_) : pdu(max_rars_, log_)
{ {
backoff_indicator = 0; backoff_indicator = 0;
has_backoff_indicator = false; has_backoff_indicator = false;

@ -193,7 +193,7 @@ int mac_sch_pdu_pack_test1()
rlc.write_sdu(2, sdu_len); rlc.write_sdu(2, sdu_len);
const uint32_t pdu_size = 25; const uint32_t pdu_size = 25;
srslte::sch_pdu pdu(10); srslte::sch_pdu pdu(10, &mac_log);
byte_buffer_t buffer; byte_buffer_t buffer;
pdu.init_tx(&buffer, pdu_size, true); pdu.init_tx(&buffer, pdu_size, true);
@ -256,7 +256,7 @@ int mac_sch_pdu_pack_test2()
const uint32_t pdu_size = 21; const uint32_t pdu_size = 21;
srslte::sch_pdu pdu(10); srslte::sch_pdu pdu(10, &mac_log);
byte_buffer_t buffer; byte_buffer_t buffer;
pdu.init_tx(&buffer, pdu_size, true); pdu.init_tx(&buffer, pdu_size, true);
@ -323,7 +323,7 @@ int mac_sch_pdu_pack_test3()
rlc.write_sdu(2, 130); rlc.write_sdu(2, 130);
const uint32_t pdu_size = 150; const uint32_t pdu_size = 150;
srslte::sch_pdu pdu(10); srslte::sch_pdu pdu(10, &mac_log);
byte_buffer_t buffer; byte_buffer_t buffer;
pdu.init_tx(&buffer, pdu_size, true); pdu.init_tx(&buffer, pdu_size, true);
@ -377,7 +377,7 @@ int mac_sch_pdu_pack_test4()
mac_log.set_hex_limit(100000); mac_log.set_hex_limit(100000);
const uint32_t pdu_size = 10; const uint32_t pdu_size = 10;
srslte::sch_pdu pdu(10); srslte::sch_pdu pdu(10, &mac_log);
byte_buffer_t buffer; byte_buffer_t buffer;
pdu.init_tx(&buffer, pdu_size, true); pdu.init_tx(&buffer, pdu_size, true);
@ -430,7 +430,7 @@ int mac_sch_pdu_pack_error_test()
rlc.write_sdu(1, 8); rlc.write_sdu(1, 8);
const uint32_t pdu_size = 150; const uint32_t pdu_size = 150;
srslte::sch_pdu pdu(10); srslte::sch_pdu pdu(10, &mac_log);
byte_buffer_t buffer; byte_buffer_t buffer;
pdu.init_tx(&buffer, pdu_size, true); pdu.init_tx(&buffer, pdu_size, true);

@ -37,12 +37,18 @@ class ue : public srslte::read_pdu_interface,
public srslte::pdu_queue::process_callback public srslte::pdu_queue::process_callback
{ {
public: public:
ue(); ue(uint16_t rnti,
uint32_t nof_prb,
sched_interface* sched,
rrc_interface_mac* rrc_,
rlc_interface_mac* rlc,
srslte::log* log_);
virtual ~ue(); virtual ~ue();
void reset(); void reset();
void start_pcap(srslte::mac_pcap* pcap_); void start_pcap(srslte::mac_pcap* pcap_);
void set_tti(uint32_t tti); void set_tti(uint32_t tti);
void config(uint16_t rnti, uint32_t nof_prb, sched_interface *sched, rrc_interface_mac *rrc_, rlc_interface_mac *rlc, srslte::log *log_h); void config(uint16_t rnti, uint32_t nof_prb, sched_interface *sched, rrc_interface_mac *rrc_, rlc_interface_mac *rlc, srslte::log *log_h);
@ -76,8 +82,7 @@ public:
void metrics_dl_pmi(uint32_t dl_cqi); void metrics_dl_pmi(uint32_t dl_cqi);
void metrics_dl_cqi(uint32_t dl_cqi); void metrics_dl_cqi(uint32_t dl_cqi);
bool is_phy_added = false;
bool is_phy_added;
int read_pdu(uint32_t lcid, uint8_t *payload, uint32_t requested_bytes); int read_pdu(uint32_t lcid, uint8_t *payload, uint32_t requested_bytes);
private: private:
@ -87,28 +92,28 @@ private:
std::vector<uint32_t> lc_groups[4]; std::vector<uint32_t> lc_groups[4];
uint32_t phr_counter; uint32_t phr_counter = 0;
uint32_t dl_cqi_counter; uint32_t dl_cqi_counter = 0;
uint32_t dl_ri_counter; uint32_t dl_ri_counter = 0;
uint32_t dl_pmi_counter; uint32_t dl_pmi_counter = 0;
mac_metrics_t metrics; mac_metrics_t metrics;
srslte::mac_pcap* pcap; srslte::mac_pcap* pcap = nullptr;
uint64_t conres_id; uint64_t conres_id = 0;
uint16_t rnti; uint16_t rnti = 0;
uint32_t last_tti; uint32_t last_tti = 0;
uint32_t nof_failures; uint32_t nof_failures = 0;
const static int NOF_RX_HARQ_PROCESSES = SRSLTE_FDD_NOF_HARQ; const static int NOF_RX_HARQ_PROCESSES = SRSLTE_FDD_NOF_HARQ;
const static int NOF_TX_HARQ_PROCESSES = SRSLTE_FDD_NOF_HARQ * SRSLTE_MAX_TB; const static int NOF_TX_HARQ_PROCESSES = SRSLTE_FDD_NOF_HARQ * SRSLTE_MAX_TB;
srslte_softbuffer_tx_t softbuffer_tx[NOF_TX_HARQ_PROCESSES]; srslte_softbuffer_tx_t softbuffer_tx[NOF_TX_HARQ_PROCESSES];
srslte_softbuffer_rx_t softbuffer_rx[NOF_RX_HARQ_PROCESSES]; srslte_softbuffer_rx_t softbuffer_rx[NOF_RX_HARQ_PROCESSES];
uint8_t* pending_buffers[NOF_RX_HARQ_PROCESSES]; uint8_t* pending_buffers[NOF_RX_HARQ_PROCESSES] = {nullptr};
// For DL there are two buffers, one for each Transport block // For DL there are two buffers, one for each Transport block
srslte::byte_buffer_t tx_payload_buffer[SRSLTE_FDD_NOF_HARQ][SRSLTE_MAX_TB]; srslte::byte_buffer_t tx_payload_buffer[SRSLTE_FDD_NOF_HARQ][SRSLTE_MAX_TB];
@ -118,12 +123,12 @@ private:
srslte::sch_pdu mac_msg_dl, mac_msg_ul; srslte::sch_pdu mac_msg_dl, mac_msg_ul;
srslte::mch_pdu mch_mac_msg_dl; srslte::mch_pdu mch_mac_msg_dl;
rlc_interface_mac *rlc; rlc_interface_mac* rlc = nullptr;
rrc_interface_mac* rrc; rrc_interface_mac* rrc = nullptr;
srslte::log *log_h; srslte::log* log_h = nullptr;
sched_interface* sched; sched_interface* sched = nullptr;
bool conres_id_available; bool conres_id_available = false;
// Mutexes // Mutexes
pthread_mutex_t mutex; pthread_mutex_t mutex;

@ -481,8 +481,7 @@ int mac::rach_detected(uint32_t tti, uint32_t preamble_idx, uint32_t time_adv)
pthread_rwlock_rdlock(&rwlock); pthread_rwlock_rdlock(&rwlock);
// Create new UE // Create new UE
ue_db[last_rnti] = new ue; ue_db[last_rnti] = new ue(last_rnti, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h);
ue_db[last_rnti]->config(last_rnti, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h);
// Set PCAP if available // Set PCAP if available
if (pcap) { if (pcap) {
@ -985,8 +984,7 @@ void mac::write_mcch(sib_type2_s* sib2, sib_type13_r9_s* sib13, mcch_msg_s* mcch
mcch->pack(bref); mcch->pack(bref);
current_mcch_length = bref.distance_bytes(&mcch_payload_buffer[1]); current_mcch_length = bref.distance_bytes(&mcch_payload_buffer[1]);
current_mcch_length = current_mcch_length + rlc_header_len; current_mcch_length = current_mcch_length + rlc_header_len;
ue_db[SRSLTE_MRNTI] = new ue; ue_db[SRSLTE_MRNTI] = new ue(SRSLTE_MRNTI, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h);
ue_db[SRSLTE_MRNTI]->config(SRSLTE_MRNTI, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h);
rrc_h->add_user(SRSLTE_MRNTI); rrc_h->add_user(SRSLTE_MRNTI);
} }

@ -33,56 +33,28 @@
namespace srsenb { namespace srsenb {
ue::ue() : ue::ue(uint16_t rnti_,
mac_msg_dl(20), uint32_t nof_prb,
mch_mac_msg_dl(10), sched_interface* sched_,
mac_msg_ul(20), rrc_interface_mac* rrc_,
conres_id_available(false), rlc_interface_mac* rlc_,
dl_ri_counter(0), srslte::log* log_) :
dl_pmi_counter(0), rnti(rnti_),
conres_id(0), sched(sched_),
last_tti(0), rrc(rrc_),
rlc(rlc_),
log_h(log_),
mac_msg_dl(20, log_h),
mch_mac_msg_dl(10, log_h),
mac_msg_ul(20, log_h),
pdus(128) pdus(128)
{ {
rrc = NULL;
sched = NULL;
rlc = NULL;
log_h = NULL;
rnti = 0;
pcap = NULL;
nof_failures = 0;
phr_counter = 0;
dl_cqi_counter = 0;
is_phy_added = false;
for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) {
pending_buffers[i] = NULL;
}
bzero(&metrics, sizeof(mac_metrics_t)); bzero(&metrics, sizeof(mac_metrics_t));
bzero(&mutex, sizeof(pthread_mutex_t)); bzero(&mutex, sizeof(pthread_mutex_t));
bzero(softbuffer_tx, sizeof(softbuffer_tx)); bzero(softbuffer_tx, sizeof(softbuffer_tx));
bzero(softbuffer_rx, sizeof(softbuffer_rx)); bzero(softbuffer_rx, sizeof(softbuffer_rx));
pthread_mutex_init(&mutex, NULL); pthread_mutex_init(&mutex, NULL);
}
ue::~ue()
{
for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) {
srslte_softbuffer_rx_free(&softbuffer_rx[i]);
}
for (int i = 0; i < NOF_TX_HARQ_PROCESSES; i++) {
srslte_softbuffer_tx_free(&softbuffer_tx[i]);
}
pthread_mutex_destroy(&mutex);
}
void ue::config(uint16_t rnti_, uint32_t nof_prb, sched_interface *sched_, rrc_interface_mac *rrc_, rlc_interface_mac *rlc_, srslte::log *log_h_)
{
rnti = rnti_;
rlc = rlc_;
rrc = rrc_;
log_h = log_h_;
sched = sched_;
pdus.init(this, log_h); pdus.init(this, log_h);
for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) { for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) {
@ -92,18 +64,23 @@ void ue::config(uint16_t rnti_, uint32_t nof_prb, sched_interface *sched_, rrc_i
srslte_softbuffer_tx_init(&softbuffer_tx[i], nof_prb); srslte_softbuffer_tx_init(&softbuffer_tx[i], nof_prb);
} }
// don't need to reset because just initiated the buffers // don't need to reset because just initiated the buffers
bzero(&metrics, sizeof(mac_metrics_t));
nof_failures = 0;
for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) {
pending_buffers[i] = NULL;
}
// Set LCID group for SRB0 and SRB1 // Set LCID group for SRB0 and SRB1
set_lcg(0, 0); set_lcg(0, 0);
set_lcg(1, 0); set_lcg(1, 0);
} }
ue::~ue()
{
for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) {
srslte_softbuffer_rx_free(&softbuffer_rx[i]);
}
for (int i = 0; i < NOF_TX_HARQ_PROCESSES; i++) {
srslte_softbuffer_tx_free(&softbuffer_tx[i]);
}
pthread_mutex_destroy(&mutex);
}
void ue::reset() void ue::reset()
{ {
bzero(&metrics, sizeof(mac_metrics_t)); bzero(&metrics, sizeof(mac_metrics_t));

@ -43,11 +43,10 @@ public:
class demux : public srslte::pdu_queue::process_callback class demux : public srslte::pdu_queue::process_callback
{ {
public: public:
demux(); demux(srslte::log* log_);
void init(phy_interface_mac_common* phy_h_, void init(phy_interface_mac_common* phy_h_,
rlc_interface_mac* rlc, rlc_interface_mac* rlc,
mac_interface_demux* mac, mac_interface_demux* mac,
srslte::log* log_h_,
srslte::timers::timer* time_alignment_timer); srslte::timers::timer* time_alignment_timer);
bool process_pdus(); bool process_pdus();
@ -82,11 +81,11 @@ private:
bool is_uecrid_successful; bool is_uecrid_successful;
phy_interface_mac_common* phy_h; phy_interface_mac_common* phy_h = nullptr;
srslte::log* log_h; srslte::log* log_h = nullptr;
srslte::timers::timer* time_alignment_timer; srslte::timers::timer* time_alignment_timer = nullptr;
rlc_interface_mac* rlc; rlc_interface_mac* rlc = nullptr;
mac_interface_demux* mac; mac_interface_demux* mac = nullptr;
// Buffer of PDUs // Buffer of PDUs
srslte::pdu_queue pdus; srslte::pdu_queue pdus;

@ -54,10 +54,10 @@ namespace srsue {
class mux class mux
{ {
public: public:
mux(); mux(srslte::log* log_);
~mux(){}; ~mux(){};
void reset(); void reset();
void init(rlc_interface_mac *rlc, srslte::log *log_h, bsr_interface_mux *bsr_procedure, phr_proc *phr_procedure_); void init(rlc_interface_mac* rlc, bsr_interface_mux* bsr_procedure, phr_proc* phr_procedure_);
void step(const uint32_t tti); void step(const uint32_t tti);

@ -30,30 +30,28 @@
namespace srsue { namespace srsue {
demux::demux() : demux::demux(srslte::log* log_) :
mac_msg(20), mac_msg(20, log_),
mch_mac_msg(20), mch_mac_msg(20, log_),
pending_mac_msg(20), pending_mac_msg(20, log_),
rlc(NULL), rlc(NULL),
log_h(log_),
is_uecrid_successful(false), is_uecrid_successful(false),
phy_h(nullptr), phy_h(nullptr),
log_h(nullptr),
time_alignment_timer(nullptr), time_alignment_timer(nullptr),
mac(nullptr) mac(nullptr)
{ {
} }
void demux::init(phy_interface_mac_common* phy_h, void demux::init(phy_interface_mac_common* phy_,
rlc_interface_mac* rlc, rlc_interface_mac* rlc_,
mac_interface_demux* mac, mac_interface_demux* mac_,
srslte::log* log_h, srslte::timers::timer* time_alignment_timer_)
srslte::timers::timer* time_alignment_timer)
{ {
this->phy_h = phy_h; phy_h = phy_;
this->log_h = log_h; rlc = rlc_;
this->rlc = rlc; mac = mac_;
this->mac = mac; time_alignment_timer = time_alignment_timer_;
this->time_alignment_timer = time_alignment_timer;
pdus.init(this, log_h); pdus.init(this, log_h);
bzero(&mch_lcids, SRSLTE_N_MCH_LCIDS); bzero(&mch_lcids, SRSLTE_N_MCH_LCIDS);
} }
@ -177,7 +175,7 @@ void demux::process_pdu(uint8_t* mac_pdu, uint32_t nof_bytes, srslte::pdu_queue:
void demux::process_sch_pdu_rt(uint8_t* buff, uint32_t nof_bytes) void demux::process_sch_pdu_rt(uint8_t* buff, uint32_t nof_bytes)
{ {
srslte::sch_pdu mac_msg_rt(20); srslte::sch_pdu mac_msg_rt(20, log_h);
mac_msg_rt.init_rx(nof_bytes); mac_msg_rt.init_rx(nof_bytes);
mac_msg_rt.parse_packet(buff); mac_msg_rt.parse_packet(buff);

@ -37,7 +37,14 @@ using namespace asn1::rrc;
namespace srsue { namespace srsue {
mac::mac(srslte::log* log_) : timers(64), pdu_process_thread(&demux_unit), mch_msg(10), pcap(nullptr), log_h(log_) mac::mac(srslte::log* log_) :
timers(64),
pdu_process_thread(&demux_unit),
mch_msg(10, log_),
mux_unit(log_),
demux_unit(log_),
pcap(nullptr),
log_h(log_)
{ {
// Create PCell HARQ entities // Create PCell HARQ entities
auto ul = ul_harq_entity_ptr(new ul_harq_entity()); auto ul = ul_harq_entity_ptr(new ul_harq_entity());
@ -76,8 +83,8 @@ bool mac::init(phy_interface_mac_lte* phy, rlc_interface_mac* rlc, rrc_interface
bsr_procedure.init(rlc_h, log_h, &timers); bsr_procedure.init(rlc_h, log_h, &timers);
phr_procedure.init(phy_h, log_h, &timers); phr_procedure.init(phy_h, log_h, &timers);
mux_unit.init(rlc_h, log_h, &bsr_procedure, &phr_procedure); mux_unit.init(rlc_h, &bsr_procedure, &phr_procedure);
demux_unit.init(phy_h, rlc_h, this, log_h, timers.get(timer_alignment)); demux_unit.init(phy_h, rlc_h, this, timers.get(timer_alignment));
ra_procedure.init( ra_procedure.init(
phy_h, rrc, log_h, &uernti, timers.get(timer_alignment), timers.get(contention_resolution_timer), &mux_unit); phy_h, rrc, log_h, &uernti, timers.get(timer_alignment), timers.get(contention_resolution_timer), &mux_unit);
sr_procedure.init(phy_h, rrc, log_h); sr_procedure.init(phy_h, rrc, log_h);

@ -32,14 +32,13 @@
namespace srsue { namespace srsue {
mux::mux() : pdu_msg(MAX_NOF_SUBHEADERS) mux::mux(srslte::log* log_) : pdu_msg(MAX_NOF_SUBHEADERS, log_), log_h(log_)
{ {
msg3_flush(); msg3_flush();
} }
void mux::init(rlc_interface_mac *rlc_, srslte::log *log_h_, bsr_interface_mux *bsr_procedure_, phr_proc *phr_procedure_) void mux::init(rlc_interface_mac* rlc_, bsr_interface_mux* bsr_procedure_, phr_proc* phr_procedure_)
{ {
log_h = log_h_;
rlc = rlc_; rlc = rlc_;
bsr_procedure = bsr_procedure_; bsr_procedure = bsr_procedure_;
phr_procedure = phr_procedure_; phr_procedure = phr_procedure_;

Loading…
Cancel
Save