fix activation of PDCCH for adaptive retxs.

master
Francisco 4 years ago committed by Andre Puschmann
parent fc81a5c6ba
commit 3d80ff4831

@ -26,7 +26,6 @@
#include "srslte/common/log.h" #include "srslte/common/log.h"
#include "srslte/common/tti_point.h" #include "srslte/common/tti_point.h"
#include "srslte/interfaces/sched_interface.h" #include "srslte/interfaces/sched_interface.h"
#include <map>
namespace srsenb { namespace srsenb {
@ -52,7 +51,7 @@ protected:
int set_ack_common(uint32_t tb_idx, bool ack); int set_ack_common(uint32_t tb_idx, bool ack);
void reset_pending_data_common(); void reset_pending_data_common();
enum ack_t { NULL_ACK, NACK, ACK }; enum ack_t { NACK, ACK };
bool ack_state[SRSLTE_MAX_TB]; bool ack_state[SRSLTE_MAX_TB];
bool active[SRSLTE_MAX_TB]; bool active[SRSLTE_MAX_TB];
@ -98,10 +97,10 @@ public:
void new_tx(srslte::tti_point tti, int mcs, int tbs, prb_interval alloc, uint32_t max_retx_); void new_tx(srslte::tti_point tti, int mcs, int tbs, prb_interval alloc, uint32_t max_retx_);
void new_retx(srslte::tti_point tti_, int* mcs, int* tbs, prb_interval alloc); void new_retx(srslte::tti_point tti_, int* mcs, int* tbs, prb_interval alloc);
bool set_ack(uint32_t tb_idx, bool ack); bool set_ack(uint32_t tb_idx, bool ack);
bool retx_requires_pdcch(srslte::tti_point tti_, prb_interval alloc) const;
prb_interval get_alloc() const; prb_interval get_alloc() const;
bool has_pending_retx() const; bool has_pending_retx() const;
bool is_adaptive_retx() const;
void reset_pending_data(); void reset_pending_data();
uint32_t get_pending_data() const; uint32_t get_pending_data() const;
@ -111,7 +110,6 @@ public:
private: private:
prb_interval allocation; prb_interval allocation;
int pending_data; int pending_data;
bool is_adaptive;
bool pending_phich = false; bool pending_phich = false;
}; };

@ -865,11 +865,10 @@ alloc_outcome_t sf_sched::alloc_ul_user(sched_ue* user, prb_interval alloc)
ul_harq_proc* h = user->get_ul_harq(get_tti_tx_ul(), user->get_active_cell_index(cc_cfg->enb_cc_idx).second); ul_harq_proc* h = user->get_ul_harq(get_tti_tx_ul(), user->get_active_cell_index(cc_cfg->enb_cc_idx).second);
bool has_retx = h->has_pending_retx(); bool has_retx = h->has_pending_retx();
if (has_retx) { if (has_retx) {
prb_interval prev_alloc = h->get_alloc(); if (h->retx_requires_pdcch(tti_point{get_tti_tx_ul()}, alloc)) {
if (prev_alloc == alloc and h->has_pending_phich()) {
alloc_type = ul_alloc_t::NOADAPT_RETX;
} else {
alloc_type = ul_alloc_t::ADAPT_RETX; alloc_type = ul_alloc_t::ADAPT_RETX;
} else {
alloc_type = ul_alloc_t::NOADAPT_RETX;
} }
} else { } else {
alloc_type = ul_alloc_t::NEWTX; alloc_type = ul_alloc_t::NEWTX;

@ -239,15 +239,9 @@ bool ul_harq_proc::has_pending_retx() const
return has_pending_retx_common(0); return has_pending_retx_common(0);
} }
bool ul_harq_proc::is_adaptive_retx() const
{
return is_adaptive and has_pending_retx();
}
void ul_harq_proc::new_tx(tti_point tti_, int mcs, int tbs, prb_interval alloc, uint32_t max_retx_) void ul_harq_proc::new_tx(tti_point tti_, int mcs, int tbs, prb_interval alloc, uint32_t max_retx_)
{ {
is_adaptive = false; allocation = alloc;
allocation = alloc;
new_tx_common(0, tti_point{tti_}, mcs, tbs, max_retx_); new_tx_common(0, tti_point{tti_}, mcs, tbs, max_retx_);
pending_data = tbs; pending_data = tbs;
pending_phich = true; pending_phich = true;
@ -256,12 +250,16 @@ void ul_harq_proc::new_tx(tti_point tti_, int mcs, int tbs, prb_interval alloc,
void ul_harq_proc::new_retx(tti_point tti_, int* mcs, int* tbs, prb_interval alloc) void ul_harq_proc::new_retx(tti_point tti_, int* mcs, int* tbs, prb_interval alloc)
{ {
// If PRBs changed, or there was no tx in last oportunity (e.g. HARQ is being resumed) // If PRBs changed, or there was no tx in last oportunity (e.g. HARQ is being resumed)
is_adaptive = alloc != allocation or tti_ != to_tx_ul(tti); allocation = alloc;
allocation = alloc;
new_retx_common(0, tti_point{tti_}, mcs, tbs); new_retx_common(0, tti_point{tti_}, mcs, tbs);
pending_phich = true; pending_phich = true;
} }
bool ul_harq_proc::retx_requires_pdcch(srslte::tti_point tti_, prb_interval alloc) const
{
return alloc != allocation or tti_ != to_tx_ul(tti);
}
bool ul_harq_proc::set_ack(uint32_t tb_idx, bool ack_) bool ul_harq_proc::set_ack(uint32_t tb_idx, bool ack_)
{ {
if (is_empty()) { if (is_empty()) {

@ -825,7 +825,7 @@ int sched_ue::generate_format0(sched_interface::ul_sched_data_t* data,
} }
} else if (tbs > 0) { } else if (tbs > 0) {
dci->tb.rv = sched_utils::get_rvidx(h->nof_retx(0)); dci->tb.rv = sched_utils::get_rvidx(h->nof_retx(0));
if (!is_newtx && h->is_adaptive_retx()) { if (!is_newtx && data->needs_pdcch) {
dci->tb.mcs_idx = 28 + dci->tb.rv; dci->tb.mcs_idx = 28 + dci->tb.rv;
} else { } else {
dci->tb.mcs_idx = mcs; dci->tb.mcs_idx = mcs;

@ -186,10 +186,13 @@ int test_ul_sched_result(const sim_enb_ctxt_t& enb_ctxt, const sf_output_res_t&
if (not h.active) { if (not h.active) {
// the HARQ is being resumed // the HARQ is being resumed
CONDERROR(not pusch_ptr->needs_pdcch, "Resumed UL HARQs need to be signalled in PDCCH\n"); CONDERROR(not pusch_ptr->needs_pdcch, "Resumed UL HARQs need to be signalled in PDCCH\n");
} } else {
if (not pusch_ptr->needs_pdcch) { if (pusch_ptr->needs_pdcch) {
// non-adaptive retx CONDERROR(pusch_ptr->dci.type2_alloc.riv == h.riv, "Adaptive retx must change riv\n");
CONDERROR(pusch_ptr->dci.type2_alloc.riv != h.riv, "Non-adaptive retx must keep the same riv\n"); } else {
// non-adaptive retx
CONDERROR(pusch_ptr->dci.type2_alloc.riv != h.riv, "Non-adaptive retx must keep the same riv\n");
}
} }
CONDERROR(sched_utils::get_rvidx(h.nof_retxs + 1) != (uint32_t)pusch_ptr->dci.tb.rv, CONDERROR(sched_utils::get_rvidx(h.nof_retxs + 1) != (uint32_t)pusch_ptr->dci.tb.rv,
"Invalid rv index for retx\n"); "Invalid rv index for retx\n");

Loading…
Cancel
Save