diff --git a/lib/include/srslte/phy/common/phy_common.h b/lib/include/srslte/phy/common/phy_common.h index 5e6946d58..14eb0aa5f 100644 --- a/lib/include/srslte/phy/common/phy_common.h +++ b/lib/include/srslte/phy/common/phy_common.h @@ -64,6 +64,10 @@ extern "C" { #define SRSLTE_MAX_CODEBOOKS 4 +#define SRSLTE_NOF_CFI 3 +#define SRSLTE_CFI_ISVALID(x) ((x >= 1 && x <= 3)) +#define SRSLTE_CFI_IDX(x) ((x - 1) % SRSLTE_NOF_CFI) + #define SRSLTE_LTE_CRC24A 0x1864CFB #define SRSLTE_LTE_CRC24B 0X1800063 #define SRSLTE_LTE_CRC16 0x11021 diff --git a/lib/include/srslte/phy/enb/enb_dl.h b/lib/include/srslte/phy/enb/enb_dl.h index e9c98c429..3010e9eb8 100644 --- a/lib/include/srslte/phy/enb/enb_dl.h +++ b/lib/include/srslte/phy/enb/enb_dl.h @@ -85,7 +85,7 @@ typedef struct SRSLTE_API { float sss_signal5[SRSLTE_SSS_LEN]; uint32_t nof_common_locations[3]; - srslte_dci_location_t common_locations[3][MAX_CANDIDATES_COM]; + srslte_dci_location_t common_locations[3][SRSLTE_MAX_CANDIDATES_COM]; } srslte_enb_dl_t; diff --git a/lib/include/srslte/phy/ue/ue_dl.h b/lib/include/srslte/phy/ue/ue_dl.h index f0651dd4e..cbc27af16 100644 --- a/lib/include/srslte/phy/ue/ue_dl.h +++ b/lib/include/srslte/phy/ue/ue_dl.h @@ -56,20 +56,20 @@ #include "srslte/config.h" -#define MAX_CANDIDATES_UE 16 // From 36.213 Table 9.1.1-1 -#define MAX_CANDIDATES_COM 6 // From 36.213 Table 9.1.1-1 -#define MAX_CANDIDATES (MAX_CANDIDATES_UE + MAX_CANDIDATES_COM) +#define SRSLTE_MAX_CANDIDATES_UE 16 // From 36.213 Table 9.1.1-1 +#define SRSLTE_MAX_CANDIDATES_COM 6 // From 36.213 Table 9.1.1-1 +#define SRSLTE_MAX_CANDIDATES (SRSLTE_MAX_CANDIDATES_UE + SRSLTE_MAX_CANDIDATES_COM) -#define MAX_FORMATS 4 +#define SRSLTE_MAX_FORMATS 4 -#define MI_NOF_REGS ((q->cell.frame_type == SRSLTE_FDD) ? 1 : 6) -#define MI_MAX_REGS 6 +#define SRSLTE_MI_NOF_REGS ((q->cell.frame_type == SRSLTE_FDD) ? 1 : 6) +#define SRSLTE_MI_MAX_REGS 6 #define SRSLTE_MAX_DCI_MSG SRSLTE_MAX_CARRIERS typedef struct SRSLTE_API { - srslte_dci_format_t formats[MAX_FORMATS]; - srslte_dci_location_t loc[MAX_CANDIDATES]; + srslte_dci_format_t formats[SRSLTE_MAX_FORMATS]; + srslte_dci_location_t loc[SRSLTE_MAX_CANDIDATES]; uint32_t nof_locations; uint32_t nof_formats; } dci_blind_search_t; @@ -89,7 +89,7 @@ typedef struct SRSLTE_API { srslte_phich_t phich; // Control region - srslte_regs_t regs[MI_MAX_REGS]; + srslte_regs_t regs[SRSLTE_MI_MAX_REGS]; uint32_t mi_manual_index; bool mi_auto; @@ -103,8 +103,8 @@ typedef struct SRSLTE_API { cf_t* sf_symbols[SRSLTE_MAX_PORTS]; // Variables for blind DCI search - dci_blind_search_t current_ss_ue[MI_MAX_REGS][3][10]; - dci_blind_search_t current_ss_common[MI_MAX_REGS][3]; + dci_blind_search_t current_ss_ue[SRSLTE_MI_MAX_REGS][SRSLTE_NOF_CFI][SRSLTE_NOF_SF_X_FRAME]; + dci_blind_search_t current_ss_common[SRSLTE_MI_MAX_REGS][SRSLTE_NOF_CFI]; srslte_dci_msg_t pending_ul_dci_msg[SRSLTE_MAX_DCI_MSG]; uint32_t pending_ul_dci_count; diff --git a/lib/src/phy/enb/enb_dl.c b/lib/src/phy/enb/enb_dl.c index ce65bdb14..f9e0086a6 100644 --- a/lib/src/phy/enb/enb_dl.c +++ b/lib/src/phy/enb/enb_dl.c @@ -220,8 +220,8 @@ int srslte_enb_dl_set_cell(srslte_enb_dl_t* q, srslte_cell_t cell) // Calculate common DCI locations for (int32_t cfi = 1; cfi <= 3; cfi++) { - q->nof_common_locations[cfi - 1] = - srslte_pdcch_common_locations(&q->pdcch, q->common_locations[cfi - 1], MAX_CANDIDATES_COM, cfi); + q->nof_common_locations[SRSLTE_CFI_IDX(cfi)] = srslte_pdcch_common_locations( + &q->pdcch, q->common_locations[SRSLTE_CFI_IDX(cfi)], SRSLTE_MAX_CANDIDATES_COM, cfi); } } ret = SRSLTE_SUCCESS; @@ -371,8 +371,12 @@ void srslte_enb_dl_put_phich(srslte_enb_dl_t* q, srslte_phich_grant_t* grant, bo bool srslte_enb_dl_location_is_common_ncce(srslte_enb_dl_t* q, uint32_t ncce) { - return srslte_location_find_ncce( - q->common_locations[q->dl_sf.cfi - 1], q->nof_common_locations[q->dl_sf.cfi - 1], ncce); + if (SRSLTE_CFI_ISVALID(q->dl_sf.cfi)) { + return srslte_location_find_ncce( + q->common_locations[SRSLTE_CFI_IDX(q->dl_sf.cfi)], q->nof_common_locations[SRSLTE_CFI_IDX(q->dl_sf.cfi)], ncce); + } else { + return false; + } } int srslte_enb_dl_put_pdcch_dl(srslte_enb_dl_t* q, srslte_dci_cfg_t* dci_cfg, srslte_dci_dl_t* dci_dl) diff --git a/lib/src/phy/phch/test/pdcch_file_test.c b/lib/src/phy/phch/test/pdcch_file_test.c index 5819676e2..60779477f 100644 --- a/lib/src/phy/phch/test/pdcch_file_test.c +++ b/lib/src/phy/phch/test/pdcch_file_test.c @@ -199,7 +199,7 @@ int main(int argc, char** argv) int i; int frame_cnt; int ret; - srslte_dci_location_t locations[MAX_CANDIDATES]; + srslte_dci_location_t locations[SRSLTE_MAX_CANDIDATES]; uint32_t nof_locations; srslte_dci_msg_t dci_msg; @@ -238,10 +238,10 @@ int main(int argc, char** argv) } if (rnti == SRSLTE_SIRNTI) { INFO("Initializing common search space for SI-RNTI\n"); - nof_locations = srslte_pdcch_common_locations(&pdcch, locations, MAX_CANDIDATES, cfi); + nof_locations = srslte_pdcch_common_locations(&pdcch, locations, SRSLTE_MAX_CANDIDATES, cfi); } else { INFO("Initializing user-specific search space for RNTI: 0x%x\n", rnti); - nof_locations = srslte_pdcch_ue_locations(&pdcch, &dl_sf, locations, MAX_CANDIDATES, rnti); + nof_locations = srslte_pdcch_ue_locations(&pdcch, &dl_sf, locations, SRSLTE_MAX_CANDIDATES, rnti); } srslte_dci_cfg_t dci_cfg; diff --git a/lib/src/phy/ue/ue_dl.c b/lib/src/phy/ue/ue_dl.c index 4230962eb..5cdde0862 100644 --- a/lib/src/phy/ue/ue_dl.c +++ b/lib/src/phy/ue/ue_dl.c @@ -164,7 +164,7 @@ void srslte_ue_dl_free(srslte_ue_dl_t* q) srslte_ofdm_rx_free(&q->fft_mbsfn); srslte_chest_dl_free(&q->chest); srslte_chest_dl_res_free(&q->chest_res); - for (int i = 0; i < MI_NOF_REGS; i++) { + for (int i = 0; i < SRSLTE_MI_NOF_REGS; i++) { srslte_regs_free(&q->regs[i]); } srslte_pcfich_free(&q->pcfich); @@ -190,12 +190,12 @@ int srslte_ue_dl_set_cell(srslte_ue_dl_t* q, srslte_cell_t cell) if (q->cell.id != cell.id || q->cell.nof_prb == 0) { if (q->cell.nof_prb != 0) { - for (int i = 0; i < MI_NOF_REGS; i++) { + for (int i = 0; i < SRSLTE_MI_NOF_REGS; i++) { srslte_regs_free(&q->regs[i]); } } q->cell = cell; - for (int i = 0; i < MI_NOF_REGS; i++) { + for (int i = 0; i < SRSLTE_MI_NOF_REGS; i++) { if (srslte_regs_init_opts(&q->regs[i], q->cell, mi_reg_idx[i % 3], i > 2)) { ERROR("Error resizing REGs\n"); return SRSLTE_ERROR; @@ -288,17 +288,17 @@ void srslte_ue_dl_set_rnti(srslte_ue_dl_t* q, uint16_t rnti) ZERO_OBJECT(sf_cfg); // Compute UE-specific and Common search space for this RNTI - for (int i = 0; i < MI_NOF_REGS; i++) { + for (int i = 0; i < SRSLTE_MI_NOF_REGS; i++) { srslte_pdcch_set_regs(&q->pdcch, &q->regs[i]); - for (int cfi = 0; cfi < 3; cfi++) { - sf_cfg.cfi = cfi + 1; - for (int sf_idx = 0; sf_idx < 10; sf_idx++) { + for (int cfi = 1; cfi <= SRSLTE_NOF_CFI; cfi++) { + sf_cfg.cfi = cfi; + for (int sf_idx = 0; sf_idx < SRSLTE_NOF_SF_X_FRAME; sf_idx++) { sf_cfg.tti = sf_idx; - q->current_ss_ue[i][cfi][sf_idx].nof_locations = srslte_pdcch_ue_locations( - &q->pdcch, &sf_cfg, q->current_ss_ue[i][cfi][sf_idx].loc, MAX_CANDIDATES_UE, rnti); + q->current_ss_ue[i][SRSLTE_CFI_IDX(cfi)][sf_idx].nof_locations = srslte_pdcch_ue_locations( + &q->pdcch, &sf_cfg, q->current_ss_ue[i][SRSLTE_CFI_IDX(cfi)][sf_idx].loc, SRSLTE_MAX_CANDIDATES_UE, rnti); } - q->current_ss_common[i][cfi].nof_locations = - srslte_pdcch_common_locations(&q->pdcch, q->current_ss_common[i][cfi].loc, MAX_CANDIDATES_COM, cfi + 1); + q->current_ss_common[i][SRSLTE_CFI_IDX(cfi)].nof_locations = srslte_pdcch_common_locations( + &q->pdcch, q->current_ss_common[i][SRSLTE_CFI_IDX(cfi)].loc, SRSLTE_MAX_CANDIDATES_COM, cfi); } } q->pregen_rnti = rnti; @@ -561,27 +561,34 @@ static int find_dci_ss(srslte_ue_dl_t* q, dci_blind_search_t search_space = {}; dci_blind_search_t* current_ss = &search_space; - uint32_t sf_idx = sf->tti % 10; + uint32_t sf_idx = sf->tti % SRSLTE_NOF_SF_X_FRAME; uint32_t cfi = sf->cfi; srslte_dci_cfg_t dci_cfg = cfg->cfg.dci; + if (!SRSLTE_CFI_ISVALID(cfi)) { + ERROR("Invalid CFI=%d\n", cfi); + return SRSLTE_ERROR_INVALID_INPUTS; + } + // Generate Search Space if (is_ue) { if (q->pregen_rnti == rnti) { - current_ss = &q->current_ss_ue[MI_IDX(sf_idx)][cfi - 1][sf_idx]; + current_ss = &q->current_ss_ue[MI_IDX(sf_idx)][SRSLTE_CFI_IDX(cfi)][sf_idx]; } else { // If locations are not pre-generated, generate them now - current_ss->nof_locations = srslte_pdcch_ue_locations(&q->pdcch, sf, current_ss->loc, MAX_CANDIDATES_UE, rnti); + current_ss->nof_locations = + srslte_pdcch_ue_locations(&q->pdcch, sf, current_ss->loc, SRSLTE_MAX_CANDIDATES_UE, rnti); } } else { // Disable extended CSI request and SRS request in common SS srslte_dci_cfg_set_common_ss(&dci_cfg); if (q->pregen_rnti == rnti) { - current_ss = &q->current_ss_common[MI_IDX(sf_idx)][cfi - 1]; + current_ss = &q->current_ss_common[MI_IDX(sf_idx)][SRSLTE_CFI_IDX(cfi)]; } else { // If locations are not pre-generated, generate them now - current_ss->nof_locations = srslte_pdcch_common_locations(&q->pdcch, current_ss->loc, MAX_CANDIDATES_COM, cfi); + current_ss->nof_locations = + srslte_pdcch_common_locations(&q->pdcch, current_ss->loc, SRSLTE_MAX_CANDIDATES_COM, cfi); } } diff --git a/lib/src/phy/ue/ue_dl_nbiot.c b/lib/src/phy/ue/ue_dl_nbiot.c index 3381f447e..7b1ec5d62 100644 --- a/lib/src/phy/ue/ue_dl_nbiot.c +++ b/lib/src/phy/ue/ue_dl_nbiot.c @@ -588,14 +588,14 @@ uint32_t srslte_nbiot_ue_dl_get_ncce(srslte_nbiot_ue_dl_t* q) return q->last_n_cce; } -#define MAX_CANDIDATES_UE 3 // From 36.213 Table 16.6-1 NPDCCH Format0 and NPDCCH Format1 -#define MAX_CANDIDATES_COM \ +#define SRSLTE_MAX_CANDIDATES_UE 3 // From 36.213 Table 16.6-1 NPDCCH Format0 and NPDCCH Format1 +#define SRSLTE_MAX_CANDIDATES_COM \ 1 // From 36.213 Table 16.6-2 and Table 16.6-3, only AL2 is defined here which uses NPDCCH Format1 -#define MAX_CANDIDATES (MAX_CANDIDATES_UE + MAX_CANDIDATES_COM) +#define SRSLTE_MAX_CANDIDATES (SRSLTE_MAX_CANDIDATES_UE + SRSLTE_MAX_CANDIDATES_COM) typedef struct { srslte_dci_format_t format; - srslte_dci_location_t loc[MAX_CANDIDATES]; + srslte_dci_location_t loc[SRSLTE_MAX_CANDIDATES]; uint32_t nof_locations; } dci_blind_search_t; @@ -646,7 +646,7 @@ int srslte_nbiot_ue_dl_find_dl_dci_type_siprarnti(srslte_nbiot_ue_dl_t* q, uint1 // Configure and run DCI blind search dci_blind_search_t search_space; - search_space.nof_locations = srslte_npdcch_common_locations(search_space.loc, MAX_CANDIDATES_COM); + search_space.nof_locations = srslte_npdcch_common_locations(search_space.loc, SRSLTE_MAX_CANDIDATES_COM); DEBUG( "Searching SI/P/RA-RNTI in %d common locations, %d formats\n", search_space.nof_locations, nb_nof_common_formats); // Search for RNTI only if there is room for the common search space @@ -671,7 +671,7 @@ int srslte_nbiot_ue_dl_find_dl_dci_type_crnti(srslte_nbiot_ue_dl_t* q, // Search UE-specific search space dci_blind_search_t search_space; - search_space.nof_locations = srslte_npdcch_ue_locations(search_space.loc, MAX_CANDIDATES_UE); + search_space.nof_locations = srslte_npdcch_ue_locations(search_space.loc, SRSLTE_MAX_CANDIDATES_UE); DEBUG("x.%d: Searching DL C-RNTI=0x%x in %d locations, %d formats\n", sf_idx, rnti, @@ -999,7 +999,7 @@ int srslte_nbiot_ue_dl_find_ul_dci(srslte_nbiot_ue_dl_t* q, uint32_t tti, uint32 // Search UE-specific search space dci_blind_search_t search_space; - search_space.nof_locations = srslte_npdcch_ue_locations(search_space.loc, MAX_CANDIDATES_UE); + search_space.nof_locations = srslte_npdcch_ue_locations(search_space.loc, SRSLTE_MAX_CANDIDATES_UE); DEBUG("x.%d: Searching UL C-RNTI=0x%x in %d locations, %d formats\n", tti % 10, rnti, diff --git a/lib/test/phy/phy_dl_test.c b/lib/test/phy/phy_dl_test.c index e7558721e..70a7fbaa0 100644 --- a/lib/test/phy/phy_dl_test.c +++ b/lib/test/phy/phy_dl_test.c @@ -410,7 +410,7 @@ int main(int argc, char** argv) * Create PDCCH Allocations */ uint32_t nof_locations[SRSLTE_NOF_SF_X_FRAME]; - srslte_dci_location_t dci_locations[SRSLTE_NOF_SF_X_FRAME][MAX_CANDIDATES_UE]; + srslte_dci_location_t dci_locations[SRSLTE_NOF_SF_X_FRAME][SRSLTE_MAX_CANDIDATES_UE]; uint32_t location_counter = 0; for (uint32_t i = 0; i < SRSLTE_NOF_SF_X_FRAME; i++) { srslte_dl_sf_cfg_t sf_cfg_dl; @@ -419,7 +419,8 @@ int main(int argc, char** argv) sf_cfg_dl.cfi = cfi; sf_cfg_dl.sf_type = SRSLTE_SF_NORM; - nof_locations[i] = srslte_pdcch_ue_locations(&enb_dl->pdcch, &sf_cfg_dl, dci_locations[i], MAX_CANDIDATES_UE, rnti); + nof_locations[i] = + srslte_pdcch_ue_locations(&enb_dl->pdcch, &sf_cfg_dl, dci_locations[i], SRSLTE_MAX_CANDIDATES_UE, rnti); location_counter += nof_locations[i]; } diff --git a/srsenb/test/phy/enb_phy_test.cc b/srsenb/test/phy/enb_phy_test.cc index 9d35af046..e17b68a05 100644 --- a/srsenb/test/phy/enb_phy_test.cc +++ b/srsenb/test/phy/enb_phy_test.cc @@ -336,7 +336,7 @@ private: std::vector active_cell_list; uint32_t nof_locations[SRSLTE_NOF_SF_X_FRAME] = {}; - srslte_dci_location_t dci_locations[SRSLTE_NOF_SF_X_FRAME][MAX_CANDIDATES_UE] = {}; + srslte_dci_location_t dci_locations[SRSLTE_NOF_SF_X_FRAME][SRSLTE_MAX_CANDIDATES_UE] = {}; uint32_t ul_riv = 0; public: @@ -371,11 +371,11 @@ public: sf_cfg_dl.sf_type = SRSLTE_SF_NORM; uint32_t _nof_locations = {}; - srslte_dci_location_t _dci_locations[MAX_CANDIDATES_UE] = {}; - _nof_locations = srslte_pdcch_ue_locations(&pdcch, &sf_cfg_dl, _dci_locations, MAX_CANDIDATES_UE, ue_rnti); + srslte_dci_location_t _dci_locations[SRSLTE_MAX_CANDIDATES_UE] = {}; + _nof_locations = srslte_pdcch_ue_locations(&pdcch, &sf_cfg_dl, _dci_locations, SRSLTE_MAX_CANDIDATES_UE, ue_rnti); // Take L == 0 aggregation levels - for (uint32_t j = 0; j < _nof_locations && nof_locations[i] < MAX_CANDIDATES_UE; j++) { + for (uint32_t j = 0; j < _nof_locations && nof_locations[i] < SRSLTE_MAX_CANDIDATES_UE; j++) { if (_dci_locations[j].L == 0) { dci_locations[i][nof_locations[i]] = _dci_locations[j]; nof_locations[i]++;