diff --git a/lib/src/phy/enb/enb_dl.c b/lib/src/phy/enb/enb_dl.c index e406983c3..bee8e9fd2 100644 --- a/lib/src/phy/enb/enb_dl.c +++ b/lib/src/phy/enb/enb_dl.c @@ -422,8 +422,10 @@ int srslte_enb_dl_put_pdcch_dl(srslte_enb_dl_t *q, srslte_ra_dl_dci_t *grant, if (rnti == SRSLTE_SIRNTI || rnti == SRSLTE_PRNTI || (rnti >= SRSLTE_RARNTI_START && rnti <= SRSLTE_RARNTI_END)) { rnti_is_user = false; } - - srslte_dci_msg_pack_pdsch(grant, format, &dci_msg, q->cell.nof_prb, q->cell.nof_ports, rnti_is_user); + + if (srslte_dci_msg_pack_pdsch(grant, format, &dci_msg, q->cell.nof_prb, q->cell.nof_ports, rnti_is_user)) { + fprintf(stderr, "Error packing DCI grant\n"); + } if (srslte_pdcch_encode(&q->pdcch, &dci_msg, location, rnti, q->sf_symbols, sf_idx, q->cfi)) { fprintf(stderr, "Error encoding DCI message\n"); return SRSLTE_ERROR; diff --git a/lib/src/phy/phch/ra.c b/lib/src/phy/phch/ra.c index f5045ff15..4a904353c 100644 --- a/lib/src/phy/phch/ra.c +++ b/lib/src/phy/phch/ra.c @@ -528,6 +528,7 @@ static int dl_dci_to_grant_mcs(srslte_ra_dl_dci_t *dci, srslte_ra_dl_grant_t *gr } grant->mcs[0].mod = SRSLTE_MOD_QPSK; grant->mcs[0].tbs = (uint32_t) tbs; + grant->mcs[0].idx = dci->mcs_idx; } else { n_prb = grant->nof_prb; if (dci->tb_en[0]) { diff --git a/srsenb/hdr/mac/scheduler.h b/srsenb/hdr/mac/scheduler.h index 20d711451..48445a0e1 100644 --- a/srsenb/hdr/mac/scheduler.h +++ b/srsenb/hdr/mac/scheduler.h @@ -208,7 +208,7 @@ private: uint32_t P; uint32_t start_rbg; uint32_t si_n_rbg; - uint32_t rar_n_rb; + uint32_t rar_n_rbg; uint32_t nof_rbg; uint32_t sf_idx; uint32_t sfn; diff --git a/srsenb/src/mac/scheduler.cc b/srsenb/src/mac/scheduler.cc index 932255b34..b78157079 100644 --- a/srsenb/src/mac/scheduler.cc +++ b/srsenb/src/mac/scheduler.cc @@ -43,7 +43,7 @@ namespace srsenb { * Initialization and sched configuration functions * *******************************************************/ -sched::sched() : bc_aggr_level(0), rar_aggr_level(0), avail_rbg(0), P(0), start_rbg(0), si_n_rbg(0), rar_n_rb(0), +sched::sched() : bc_aggr_level(0), rar_aggr_level(0), avail_rbg(0), P(0), start_rbg(0), si_n_rbg(0), rar_n_rbg(0), nof_rbg(0), sf_idx(0), sfn(0), current_cfi(0) { current_tti = 0; log_h = NULL; @@ -129,8 +129,8 @@ int sched::cell_cfg(sched_interface::cell_cfg_t* cell_cfg) } P = srslte_ra_type0_P(cfg.cell.nof_prb); - si_n_rbg = 4/P; - rar_n_rb = 3; + si_n_rbg = ceilf((float) 4/P); + rar_n_rbg = ceilf((float) 3/P); nof_rbg = (uint32_t) ceil((float) cfg.cell.nof_prb/P); // Compute Common locations for DCI for each CFI @@ -550,14 +550,15 @@ int sched::dl_sched_bc(dl_sched_bc_t bc[MAX_BC_LIST]) uint32_t rv = get_rvidx(pending_sibs[i].n_tx); // Try to allocate DCI first - if (generate_dci(&bc[nof_bc_elems].dci_location, &common_locations[current_cfi-1], bc_aggr_level)) { - if (generate_format1a(start_rbg*P, si_n_rbg*P, cfg.sibs[i].len, rv, &bc[nof_bc_elems].dci) >= 0) { + if (generate_dci(&bc[nof_bc_elems].dci_location, &common_locations[current_cfi-1], bc_aggr_level)) { + int tbs = generate_format1a(start_rbg*P, si_n_rbg*P, cfg.sibs[i].len, rv, &bc[nof_bc_elems].dci); + if (tbs >= (int) cfg.sibs[i].len) { bc[nof_bc_elems].index = i; bc[nof_bc_elems].type = sched_interface::dl_sched_bc_t::BCCH; - bc[nof_bc_elems].tbs = cfg.sibs[i].len; + bc[nof_bc_elems].tbs = tbs; - Debug("SCHED: SIB%d, start_rb=%d, n_rb=%d, rv=%d, len=%d, period=%d\n", - i+1, start_rbg*P, si_n_rbg*P, rv, cfg.sibs[i].len, cfg.sibs[i].period_rf); + Debug("SCHED: SIB%d, start_rb=%d, n_rb=%d, rv=%d, len=%d, period=%d, mcs=%d\n", + i+1, start_rbg*P, si_n_rbg*P, rv, cfg.sibs[i].len, cfg.sibs[i].period_rf, bc[nof_bc_elems].dci.mcs_idx); pending_sibs[i].n_tx++; @@ -588,7 +589,7 @@ int sched::dl_sched_bc(dl_sched_bc_t bc[MAX_BC_LIST]) bc[nof_bc_elems].tbs = tbs; nof_bc_elems++; - Info("SCHED: PCH start_rb=%d, tbs=%d\n", start_rbg, tbs); + Info("SCHED: PCH start_rb=%d, tbs=%d, mcs=%d\n", start_rbg, tbs, bc[nof_bc_elems].dci.mcs_idx); avail_rbg -= si_n_rbg; start_rbg += si_n_rbg; @@ -610,7 +611,7 @@ int sched::dl_sched_rar(dl_sched_rar_t rar[MAX_RAR_LIST]) int nof_rar_elems = 0; for (uint32_t i=0;i 0 && avail_rbg >= (uint32_t)ceil((float)rar_n_rb/P)) + if (pending_rar[i].buf_rar > 0 && avail_rbg >= rar_n_rbg) { /* Check if we are still within the RAR window, otherwise discard it */ if (current_tti <= (pending_rar[i].rar_tti + cfg.prach_rar_window + 3)%10240 && current_tti >= pending_rar[i].rar_tti + 3) @@ -647,8 +648,8 @@ int sched::dl_sched_rar(dl_sched_rar_t rar[MAX_RAR_LIST]) pending_msg3[pending_tti].n_prb = n_prb; pending_msg3[pending_tti].mcs = rar[nof_rar_elems].grants[nof_grants].grant.trunc_mcs; - log_h->info("SCHED: RAR, ra_id=%d, rnti=0x%x, rarnti_idx=%d, start_rb=%d, n_rb=%d, rar_grant_rba=%d, rar_grant_mcs=%d\n", - pending_rar[j].ra_id, pending_rar[j].rnti, rar_sfidx, start_rbg*P, rar_n_rb, + log_h->info("SCHED: RAR, ra_id=%d, rnti=0x%x, rarnti_idx=%d, start_rb=%d, n_rb=%d, rar_grant_rba=%d, rar_grant_mcs=%d\n", + pending_rar[j].ra_id, pending_rar[j].rnti, rar_sfidx, start_rbg*P, rar_n_rbg*P, rar[nof_rar_elems].grants[nof_grants].grant.rba, rar[nof_rar_elems].grants[nof_grants].grant.trunc_mcs); } else { @@ -661,11 +662,11 @@ int sched::dl_sched_rar(dl_sched_rar_t rar[MAX_RAR_LIST]) rar[nof_rar_elems].nof_grants = nof_grants; rar[nof_rar_elems].rarnti = rar_sfidx; - if (generate_format1a(start_rbg*P, rar_n_rb, buf_rar, 0, &rar[nof_rar_elems].dci) >= 0) { + if (generate_format1a(start_rbg*P, rar_n_rbg*P, buf_rar, 0, &rar[nof_rar_elems].dci) >= 0) { rar[nof_rar_elems].tbs = buf_rar; nof_rar_elems++; - avail_rbg -= (uint32_t)ceil((float)rar_n_rb/P); - start_rbg += (uint32_t)ceil((float)rar_n_rb/P); + avail_rbg -= rar_n_rbg; + start_rbg += rar_n_rbg; } else { Error("SCHED: Allocating Format1A grant\n"); } @@ -1102,6 +1103,9 @@ int sched::generate_format1a(uint32_t rb_start, uint32_t l_crb, uint32_t tbs_byt Error("Can't allocate Format 1A for TBS=%d\n", tbs); return -1; } + + Debug("ra_tbs=%d/%d, tbs_bytes=%d, tbs=%d, mcs=%d\n", + srslte_ra_tbs_from_idx(mcs, 2),srslte_ra_tbs_from_idx(mcs, 3),tbs_bytes,tbs,mcs); dci->alloc_type = SRSLTE_RA_ALLOC_TYPE2; dci->type2_alloc.mode = srslte_ra_type2_t::SRSLTE_RA_TYPE2_LOC;