Fixed problems with DL HARQ. Fixed PUSCH/HARQ multiplexing. Removed some Info messages

This commit is contained in:
ismagom 2015-06-10 19:12:12 +02:00
parent 4819dae236
commit f9b3ba52c2
18 changed files with 102 additions and 71 deletions

View File

@ -81,7 +81,6 @@ private:
dl_sched_grant cur_grant;
dl_sched_grant pending_ack_grant;
ul_buffer *pending_ul_buffer;
bool is_first_tx;
bool pending_ack;
srslte::log *log_h;

View File

@ -66,6 +66,7 @@ class ra_proc : public proc,timer_callback
void pdcch_to_crnti(bool is_ul_grant);
void timer_expired(uint32_t timer_id);
void* run_prach_thread();
private:
void process_timeadv_cmd(uint32_t ta_cmd);
@ -144,6 +145,9 @@ private:
demux *demux_unit;
pthread_t pt_init_prach;
pthread_cond_t cond;
pthread_mutex_t mutex;
bool start_prach_init;
uint64_t transmitted_contention_id;
uint16_t transmitted_crnti;

View File

@ -148,11 +148,11 @@ void demux::process_pdu(sch_pdu *pdu_msg)
qbuff *dest_lch = mac_io_h->get(pdu_msg->get()->get_sdu_lcid());
if (dest_lch) {
dest_lch->send(pdu_msg->get()->get_sdu_ptr(), pdu_msg->get()->get_sdu_nbytes()*8);
Info("Sent MAC SDU len=%d bytes to lchid=%d\n",
Debug("Sent MAC SDU len=%d bytes to lchid=%d\n",
pdu_msg->get()->get_sdu_nbytes(), pdu_msg->get()->get_sdu_lcid());
if (sdu_handler_) {
sdu_handler_->notify_new_sdu(pdu_msg->get()->get_sdu_lcid());
Info("Notified SDU handler len=%d bytes to lchid=%d\n",
Debug("Notified SDU handler len=%d bytes to lchid=%d\n",
pdu_msg->get()->get_sdu_nbytes(), pdu_msg->get()->get_sdu_lcid());
}

View File

@ -102,7 +102,6 @@ void dl_harq_entity::send_pending_ack_contention_resolution()
*********************************************************/
dl_harq_entity::dl_harq_process::dl_harq_process() : cur_grant(0),pending_ack_grant(0) {
is_first_tx = true;
is_initiated = false;
ack = false;
bzero(&cur_grant, sizeof(srslte::ue::dl_sched_grant));
@ -112,7 +111,6 @@ dl_harq_entity::dl_harq_process::dl_harq_process() : cur_grant(0),pending_ack_gr
void dl_harq_entity::dl_harq_process::reset() {
ack = false;
is_first_tx = true;
bzero(&cur_grant, sizeof(srslte::ue::dl_sched_grant));
if (is_initiated) {
srslte_softbuffer_rx_reset(&softbuffer);
@ -135,8 +133,17 @@ void dl_harq_entity::dl_harq_process::receive_data(uint32_t tti, srslte::ue::dl_
// If data has not yet been successfully decoded
if (ack == false) {
// Combine the received data and attempt to decode it
if (dl_buffer->decode_data(&cur_grant, &softbuffer, payload)) {
ack = true;
} else {
ack = false;
}
Info("DL PID %d: TBS=%d, RV=%d, MCS=%d, crc=%s\n", pid, cur_grant.get_tbs(), cur_grant.get_rv(), cur_grant.get_mcs(), ack?"OK":"NOK");
if (ack) {
// RX OK
if (pid == HARQ_BCCH_PID) {
Debug("Delivering PDU=%d bytes to Dissassemble and Demux unit (BCCH)\n", cur_grant.get_tbs()/8);
@ -150,13 +157,10 @@ void dl_harq_entity::dl_harq_process::receive_data(uint32_t tti, srslte::ue::dl_
Debug("Delivering PDU=%d bytes to Dissassemble and Demux unit\n", cur_grant.get_tbs()/8);
harq_entity->demux_unit->push_pdu(payload, cur_grant.get_tbs());
}
ack = true;
is_first_tx = true;
}
} else {
// RX NOK
ack = false;
}
}
} else {
Warning("DL PID %d: Received duplicate TB. Discarting and retransmitting ACK\n");
}
if (pid == HARQ_BCCH_PID || harq_entity->timers_db->get(mac::TIME_ALIGNMENT)->is_expired()) {
// Do not generate ACK
@ -180,15 +184,15 @@ void dl_harq_entity::dl_harq_process::receive_data(uint32_t tti, srslte::ue::dl_
fprintf(stderr, "Error with DL grant. TBS (%d) exceeds payload buffer length (%d)\n", cur_grant.get_tbs(), max_payload_len);
}
}
Info("DL PID %d: TBS=%d, RV=%d, MCS=%d, crc=%s, PHY TTI: %d\n", pid, cur_grant.get_tbs(), cur_grant.get_rv(), cur_grant.get_mcs(), ack?"OK":"NOK", phy_h->get_current_tti());
}
// Implement 5.3.2.2
void dl_harq_entity::dl_harq_process::set_harq_info(srslte::ue::dl_sched_grant* new_grant) {
bool is_new_transmission = false;
if (new_grant->get_ndi() == true || is_first_tx || (pid == HARQ_BCCH_PID && new_grant->get_rv() == 0)) {
if ((new_grant->get_ndi() != cur_grant.get_ndi() && new_grant->get_tbs() == cur_grant.get_tbs()) || // NDI toggled for same TB (assume TB is identified by TBS)
(pid == HARQ_BCCH_PID && new_grant->get_rv() == 0) || // Broadcast PID and 1st TX (RV=0)
(new_grant->get_tbs() != cur_grant.get_tbs())) // First transmission for this TB
{
is_new_transmission = true;
Debug("Set HARQ Info for new transmission\n");
} else {
@ -196,16 +200,8 @@ void dl_harq_entity::dl_harq_process::set_harq_info(srslte::ue::dl_sched_grant*
Debug("Set HARQ Info for retransmission\n");
}
if (is_first_tx) {
Info("DL PID %d: first TX RV=%d, NDI=%d\n", pid, new_grant->get_rv(), new_grant->get_ndi());
} else {
Info("DL PID %d: %s RV=%d, NDI=%d, LastNDI=%d\n", pid, is_new_transmission?"new TX":"reTX", new_grant->get_rv(),
new_grant->get_ndi(), cur_grant.get_ndi());
}
if (is_first_tx) {
is_first_tx = false;
}
Info("DL PID %d: %s RV=%d, NDI=%d, LastNDI=%d, DCI %s\n", pid, is_new_transmission?"new TX":"reTX", new_grant->get_rv(),
new_grant->get_ndi(), cur_grant.get_ndi(), new_grant->get_dciformat_string());
if (is_new_transmission) {
ack = false;

View File

@ -201,17 +201,17 @@ void mac::main_radio_loop() {
// Check if BSR procedure need to start SR
if (bsr_procedure.need_to_send_sr()) {
Info("Starting SR procedure by BSR request, PHY TTI=%d\n", phy_h->get_current_tti());
Debug("Starting SR procedure by BSR request, PHY TTI=%d\n", phy_h->get_current_tti());
sr_procedure.start();
} else if (bsr_procedure.need_to_reset_sr()) {
Info("Resetting SR procedure by BSR request\n");
Debug("Resetting SR procedure by BSR request\n");
sr_procedure.reset();
}
sr_procedure.step(tti);
// Check SR if we need to start RA
if (sr_procedure.need_random_access()) {
Info("Starting RA procedure by MAC order\n");
Warning("Starting RA procedure by MAC order is DISABLED\n");
//ra_procedure.start_mac_order();
}
@ -244,7 +244,6 @@ void mac::main_radio_loop() {
if (mux_unit.is_pending_ccch_sdu()) {
// Start RA procedure
if (!ra_procedure.in_progress() && !ra_procedure.is_successful()) {
Info("Starting RA procedure by RLC order\n");
ra_procedure.start_rlc_order();
}
}
@ -379,14 +378,17 @@ void mac::process_dl_grants(uint32_t tti) {
uint32_t harq_pid = ue_grant.get_harq_process();
if (i == mac_params::RNTI_TEMP && last_temporal_crnti != params_db.get_param(i)) {
ue_grant.set_ndi(true);
Info("Set NDI=1 for Temp-RNTI DL grant\n");
last_temporal_crnti = params_db.get_param(i);
}
if (i == mac_params::RNTI_C && dl_harq.is_sps(harq_pid)) {
ue_grant.set_ndi(true);
Info("Set NDI=1 for C-RNTI DL grant\n");
}
dl_harq.set_harq_info(harq_pid, &ue_grant);
dl_harq.receive_data(tti, harq_pid, dl_buffer, phy_h);
} else {
/* This is for SPS scheduling */
uint32_t harq_pid = get_harq_sps_pid(tti);
if (ue_grant.get_ndi()) {
ue_grant.set_ndi(false);
@ -428,7 +430,7 @@ void mac::process_dl_grants(uint32_t tti) {
if (!(phy_h->tti_to_subf(si_window_length) != 1 &&
phy_h->tti_to_subf(si_window_start) == 5 && (phy_h->tti_to_SFN(tti)%2) == 0))
{
Info("Searching for DL grant for SI-RNTI window_st=%d, window_len=%d\n", si_window_start, si_window_length);
Debug("Searching for DL grant for SI-RNTI window_st=%d, window_len=%d\n", si_window_start, si_window_length);
dl_sched_grant si_grant(sched_grant::RNTI_TYPE_SIRNTI, SRSLTE_SIRNTI);
if (dl_buffer->get_dl_grant(&si_grant)) {
uint32_t k;
@ -443,9 +445,7 @@ void mac::process_dl_grants(uint32_t tti) {
dl_harq.receive_data(tti, dl_harq_entity::HARQ_BCCH_PID, dl_buffer, phy_h);
params_db.set_param(mac_params::BCCH_SI_WINDOW_ST, 0);
params_db.set_param(mac_params::BCCH_SI_WINDOW_LEN, 0);
} else {
Warning("DL grant not found\n");
}
}
}
}

View File

@ -230,7 +230,7 @@ bool mux::assemble_pdu(uint32_t pdu_sz_nbits) {
// MAC control element for BSR, with exception of BSR included for padding;
sch_subh *bsr_subh = NULL;
if (bsr_payload_sz) {
Info("Including BSR CE size %d\n", bsr_payload_sz);
Debug("Including BSR CE size %d\n", bsr_payload_sz);
if (pdu_msg.new_subh()) {
pdu_msg.next();
bsr_subh = pdu_msg.get();
@ -281,7 +281,7 @@ bool mux::assemble_pdu(uint32_t pdu_sz_nbits) {
}
}
Info("Assembled MAC PDU msg size %d/%d bytes\n", pdu_msg.size(), pdu_sz_nbits/8);
Debug("Assembled MAC PDU msg size %d/%d bytes\n", pdu_msg.size(), pdu_sz_nbits/8);
//pdu_msg.fprint(stdout);
/* Generate MAC PDU and save to buffer */
@ -321,7 +321,7 @@ bool mux::allocate_sdu(uint32_t lcid, sch_pdu *pdu_msg, uint32_t *sdu_sz, bool *
if (is_first) {
*is_first = false;
}
Info("Allocated SDU lcid=%d nbytes=%d\n", lcid, nbytes);
Debug("Allocated SDU lcid=%d nbytes=%d\n", lcid, nbytes);
// Increase number of pop'ed packets from queue
nof_tx_pkts[lcid]++;
return true;

View File

@ -264,10 +264,10 @@ uint32_t bsr_proc::need_to_send_bsr_on_ul_grant(uint32_t grant_size)
bsr_sz = bsr.format==LONG_BSR?3:1;
if (total_data <= grant_size && total_data + 1 + bsr_sz > grant_size) {
bsr_sz = 0;
Info("Grant is not enough to accomodate the BSR MAC CE\n");
Debug("Grant is not enough to accomodate the BSR MAC CE\n");
triggered_bsr_type = NONE;
}
Info("Checking if Regular BSR is sent: grant_size=%d, total_data=%d, bsr_sz=%d\n",
Debug("Checking if Regular BSR is sent: grant_size=%d, total_data=%d, bsr_sz=%d\n",
grant_size, total_data, bsr_sz);
}
return bsr_sz;
@ -285,7 +285,7 @@ bool bsr_proc::generate_bsr_on_ul_grant(uint32_t nof_padding_bytes, bsr_t *bsr)
}
generate_bsr(bsr, nof_padding_bytes);
ret = true;
Info("Sending BSR type %s, format %s, nof_padding_bytes=%d\n",
Debug("Sending BSR type %s, format %s, nof_padding_bytes=%d\n",
bsr_type_tostring(triggered_bsr_type), bsr_format_tostring(bsr->format), nof_padding_bytes);
if (timer_periodic && bsr->format != TRUNC_BSR) {
@ -308,6 +308,7 @@ bool bsr_proc::generate_bsr_on_ul_grant(uint32_t nof_padding_bytes, bsr_t *bsr)
bool bsr_proc::need_to_reset_sr() {
if (reset_sr) {
reset_sr = false;
sr_is_sent = false;
return true;
} else {
return false;

View File

@ -47,6 +47,25 @@ uint32_t backoff_table[16] = {0, 10, 20, 30, 40, 60, 80, 120, 160, 240, 320, 480
// Table 7.6-1: DELTA_PREAMBLE values.
int delta_preamble_db_table[5] = {0, 0, -3, -3, 8};
void* init_prach_thread(void *arg) {
ra_proc* ra = (ra_proc*) arg;
return ra->run_prach_thread();
}
void* ra_proc::run_prach_thread() {
pthread_mutex_lock(&mutex);
while(!start_prach_init) {
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
if (phy_h->init_prach()) {
return (void*) 0;
} else {
return (void*) -1;
}
}
bool ra_proc::init(mac_params* params_db_, phy* phy_h_, srslte::log* log_h_, srslte::timers* timers_db_,
mux* mux_unit_, demux* demux_unit_)
{
@ -56,6 +75,12 @@ bool ra_proc::init(mac_params* params_db_, phy* phy_h_, srslte::log* log_h_, srs
timers_db = timers_db_;
mux_unit = mux_unit_;
demux_unit= demux_unit_;
start_prach_init = false;
if (pthread_create(&pt_init_prach, NULL, init_prach_thread, this)) {
perror("pthread_create");
}
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
reset();
}
@ -168,15 +193,6 @@ void ra_proc::process_timeadv_cmd(uint32_t ta) {
}
}
void* init_prach_thread(void *arg) {
phy* phy_h = (phy*) arg;
if (phy_h->init_prach()) {
return (void*) 0;
} else {
return (void*) -1;
}
}
void ra_proc::step_initialization() {
read_params();
pdcch_to_crnti_received = PDCCH_CRNTI_NOT_RECEIVED;
@ -185,12 +201,14 @@ void ra_proc::step_initialization() {
first_rar_received = true;
mux_unit->msg3_flush();
backoff_param_ms = 0;
if (pthread_create(&pt_init_prach, NULL, init_prach_thread, phy_h)) {
perror("pthread_create");
state = RA_PROBLEM;
} else {
state = INITIALIZATION_WAIT;
}
// Instruct phy prach init thread to start initialization
pthread_mutex_lock(&mutex);
start_prach_init = true;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
state = INITIALIZATION_WAIT;
}
void ra_proc::step_initialization_wait() {

View File

@ -60,7 +60,7 @@ void sr_proc::step(uint32_t tti)
int last_tx_tti = phy_h->sr_last_tx_tti();
if (last_tx_tti >= 0 && last_tx_tti + 4 < tti) {
sr_counter++;
Info("SR signalling PHY. sr_counter=%d, PHY TTI=%d\n", sr_counter, phy_h->get_current_tti());
Debug("SR signalling PHY. sr_counter=%d, PHY TTI=%d\n", sr_counter, phy_h->get_current_tti());
phy_h->send_sr(true);
}
} else {
@ -94,7 +94,7 @@ void sr_proc::start()
is_pending_sr = true;
}
dsr_transmax = params_db->get_param(mac_params::SR_TRANS_MAX);
Info("SR starting dsrTransMax=%d. sr_counter=%d, PHY TTI=%d\n", dsr_transmax, sr_counter, phy_h->get_current_tti());
Debug("SR starting dsrTransMax=%d. sr_counter=%d, PHY TTI=%d\n", dsr_transmax, sr_counter, phy_h->get_current_tti());
}
}

View File

@ -93,7 +93,7 @@ void ul_harq_entity::run_tti(uint32_t tti, ul_sched_grant *grant, phy *phy_h)
}
if (grant) {
if ((!grant->is_temp_rnti() && grant->get_ndi() == true) ||
if ((!grant->is_temp_rnti() && grant->get_ndi() != proc[pid].get_ndi()) ||
(grant->is_crnti() && !proc[pid].has_grant()) ||
grant->is_from_rar())
{

View File

@ -75,6 +75,16 @@ namespace ue {
uint32_t get_mcs() {
return dl_dci.mcs_idx;
}
const char* get_dciformat_string() {
switch(dl_dci.dci_format) {
case srslte_ra_dl_dci_t::SRSLTE_RA_DCI_FORMAT1:
return "Format1";
case srslte_ra_dl_dci_t::SRSLTE_RA_DCI_FORMAT1A:
return "Format1A";
case srslte_ra_dl_dci_t::SRSLTE_RA_DCI_FORMAT1C:
return "Format1C";
}
}
bool create_from_dci(srslte_dci_msg_t *msg, uint32_t nof_prb, uint32_t ncce_) {
ncce = ncce_;
if (srslte_dci_msg_to_dl_grant(msg, rnti, nof_prb, &dl_dci, &grant)) {

View File

@ -117,6 +117,8 @@ bool dl_buffer::get_ul_grant(ul_sched_grant *grant)
return false;
}
Info("PDCCH: UL DCI Format0 cce_index=%d, n_data_bits=%d\n", ue_dl.last_n_cce, dci_msg.nof_bits);
return grant->create_from_dci(&dci_msg, cell, params_db->get_param(phy_params::PUSCH_HOPPING_OFFSET));
}
}
@ -166,7 +168,7 @@ bool dl_buffer::get_dl_grant(dl_sched_grant *grant)
return false;
}
Info("Found DL DCI cce_index=%d, n_data_bits=%d\n", ue_dl.last_n_cce, dci_msg.nof_bits);
Info("PDCCH: DL DCI %s cce_index=%d, n_data_bits=%d\n", grant->get_dciformat_string(), ue_dl.last_n_cce, dci_msg.nof_bits);
return grant->create_from_dci(&dci_msg, cell.nof_prb, srslte_ue_dl_get_ncce(&ue_dl));
}

View File

@ -199,7 +199,7 @@ bool phy::sr_is_ready_to_send(uint32_t tti_) {
if (srslte_ue_ul_sr_send_tti(I_sr, tti_)) {
sr_enabled = false;
sr_tx_tti = tti_;
Info("SR ready to send for TTI=%d\n", tti_);
Info("SR sending at TTI=%d\n", tti_);
return true;
}
}

View File

@ -147,7 +147,7 @@ bool prach::send(radio *radio_handler, float cfo, srslte_timestamp_t rx_time)
}
radio_handler->tx(signal_buffer, len, tx_time);
Info("PRACH transmitted CFO: %f, preamble=%d, len=%d rx_time=%f, tx_time=%f, PeakAmplitude=%.2f\n",
Debug("PRACH transmitted CFO: %f, preamble=%d, len=%d rx_time=%f, tx_time=%f, PeakAmplitude=%.2f\n",
cfo*15000, preamble_idx, len, rx_time.frac_secs, tx_time.frac_secs, max);
preamble_idx = -1;
}

View File

@ -195,8 +195,8 @@ bool ul_buffer::generate_data(ul_sched_grant *grant, srslte_softbuffer_tx_t *sof
*/
grant->to_pusch_cfg(tti%10, 0, &ue_ul);
Info("Encoding PUSCH TBS=%d, mod=%s, rb_start=%d n_prb=%d, ack=%s, sr=%s, rnti=%d, sf_idx=%d\n",
grant->get_tbs(), srslte_mod_string(ue_ul.pusch_cfg.grant.mcs.mod), ue_ul.pusch_cfg.grant.n_prb[0],
Info("PUSCH: TTI=%d, TBS=%d, mod=%s, rb_start=%d n_prb=%d, ack=%s, sr=%s, rnti=%d, sf_idx=%d\n",
tti, grant->get_tbs(), srslte_mod_string(ue_ul.pusch_cfg.grant.mcs.mod), ue_ul.pusch_cfg.grant.n_prb[0],
ue_ul.pusch_cfg.grant.L_prb,
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",uci_data.scheduling_request?"yes":"no",
grant->get_rnti(), tti%10);
@ -207,7 +207,7 @@ bool ul_buffer::generate_data(ul_sched_grant *grant, srslte_softbuffer_tx_t *sof
grant->get_rnti(),
signal_buffer);
} else {
Info("Encoding PUCCH n_cce=%d, sf_idx=%d, ack=%s, sr=%s\n", last_n_cce, tti%10,
Info("PUCCH: TTI=%d n_cce=%d, sf_idx=%d, ack=%s, sr=%s\n", tti, last_n_cce, tti%10,
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",uci_data.scheduling_request?"yes":"no");
n = srslte_ue_ul_pucch_encode(&ue_ul, uci_data, tti%10, signal_buffer);
@ -256,7 +256,7 @@ bool ul_buffer::send(srslte::radio* radio_handler, float time_adv_sec, float cfo
srslte_vec_sc_prod_cfc(signal_buffer, 0.9/max, signal_buffer, SRSLTE_SF_LEN_PRB(cell.nof_prb));
}
Info("TX CFO: %f, len=%d, rx_time= %.6f tx_time = %.6f TA: %.1f PeakAmplitude=%.2f PKT#%d\n",
Debug("TX CFO: %f, len=%d, rx_time= %.6f tx_time = %.6f TA: %.1f PeakAmplitude=%.2f PKT#%d\n",
cfo*15000, SRSLTE_SF_LEN_PRB(cell.nof_prb),
srslte_timestamp_real(&rx_time),
srslte_timestamp_real(&tx_time), time_adv_sec*1000000, max, nof_tx);

View File

@ -523,7 +523,6 @@ int dci_format1_unpack(srslte_dci_msg_t *msg, srslte_ra_dl_dci_t *data, uint32_t
data->harq_process = srslte_bit_unpack(&y, 3);
data->ndi = *y++ ? true : false;
// rv version
data->rv_idx = srslte_bit_unpack(&y, 2);
@ -670,10 +669,14 @@ int dci_format1As_unpack(srslte_dci_msg_t *msg, srslte_ra_dl_dci_t *data, uint32
data->harq_process = srslte_bit_unpack(&y, 3);
if (!crc_is_crnti && nof_prb >= 50 && data->type2_alloc.mode == SRSLTE_RA_TYPE2_DIST) {
data->type2_alloc.n_gap = *y++;
if (!crc_is_crnti) {
if (nof_prb >= 50 && data->type2_alloc.mode == SRSLTE_RA_TYPE2_DIST) {
data->type2_alloc.n_gap = *y++;
} else {
y++; // NDI reserved
}
} else {
y++; // bit reserved
data->ndi = *y++ ? true : false;
}
// rv version

View File

@ -371,8 +371,6 @@ int srslte_prach_init(srslte_prach_t *p,
}
}
printf("Ncs=%d, zczc=%d, root_seq_index=%d, format=%d\n", p->N_cs, zero_corr_zone_config, root_seq_index, preamble_format);
// Set up containers
p->prach_bins = srslte_vec_malloc(sizeof(cf_t)*p->N_zc);
p->corr_spec = srslte_vec_malloc(sizeof(cf_t)*p->N_zc);

View File

@ -340,7 +340,7 @@ int srslte_ue_ul_pusch_encode_rnti_softbuffer(srslte_ue_ul_t *q,
softbuffer != NULL &&
output_signal != NULL)
{
if (srslte_pusch_encode_rnti(&q->pusch, &q->pusch_cfg, softbuffer, data, rnti, q->sf_symbols)) {
if (srslte_pusch_uci_encode_rnti(&q->pusch, &q->pusch_cfg, softbuffer, data, uci_data, rnti, q->sf_symbols)) {
fprintf(stderr, "Error encoding TB\n");
return ret;
}