// Blind search for C-RNTI static int find_dl_dci_type_crnti(srslte_ue_dl_t* q, srslte_dl_sf_cfg_t* sf, srslte_ue_dl_cfg_t* cfg, uint16_t rnti, srslte_dci_msg_t dci_msg[SRSLTE_MAX_DCI_MSG]) { int ret = SRSLTE_SUCCESS; dci_blind_search_t search_space; dci_blind_search_t* current_ss = &search_space; uint32_t sf_idx = sf->tti % 10; uint32_t cfi = sf->cfi; srslte_dci_cfg_t* dci_cfg = &cfg->dci_cfg; // Search UE-specific search space if (q->pregen_rnti == rnti) { current_ss = &q->current_ss_ue[MI_IDX(sf_idx)][cfi - 1][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); } if (cfg->cfg.tm > SRSLTE_TM8) { ERROR("Searching DL CRNTI: Invalid TM=%d\n", cfg->cfg.tm + 1); } for (int f = 0; f < 2; f++) { srslte_dci_format_t format = ue_dci_formats[cfg->cfg.tm][f]; INFO("Searching DL C-RNTI %s in %d ue locations\n", srslte_dci_format_string(format), current_ss->nof_locations); current_ss->format = format; if ((ret = dci_blind_search(q, sf, rnti, current_ss, dci_cfg, dci_msg))) { return ret; } } // Search Format 1A in the Common SS also if (q->pregen_rnti == rnti) { current_ss = &q->current_ss_common[MI_IDX(sf_idx)][cfi - 1]; } 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); } // Search for RNTI only if there is room for the common search space if (current_ss->nof_locations > 0) { current_ss->format = SRSLTE_DCI_FORMAT1A; INFO("Searching DL C-RNTI in %d ue locations, format 1A\n", current_ss->nof_locations); return dci_blind_search(q, sf, rnti, current_ss, dci_cfg, dci_msg); } return SRSLTE_SUCCESS; }
// Blind search for SI/P/RA-RNTI static int find_dl_dci_type_siprarnti(srslte_ue_dl_t* q, srslte_dl_sf_cfg_t* sf, srslte_ue_dl_cfg_t* cfg, uint16_t rnti, srslte_dci_msg_t dci_msg[SRSLTE_MAX_DCI_MSG]) { int ret = 0; srslte_dci_cfg_t* dci_cfg = &cfg->dci_cfg; // Configure and run DCI blind search dci_blind_search_t search_space; search_space.nof_locations = srslte_pdcch_common_locations(&q->pdcch, search_space.loc, MAX_CANDIDATES_COM, sf->cfi); INFO("Searching SI/P/RA-RNTI in %d common locations, %d formats, tti=%d, cfi=%d, rnti=0x%x\n", search_space.nof_locations, nof_common_formats, sf->tti, sf->cfi, rnti); // Search for RNTI only if there is room for the common search space if (search_space.nof_locations > 0) { for (uint32_t f = 0; f < nof_common_formats; f++) { search_space.format = common_formats[f]; if ((ret = dci_blind_search(q, sf, rnti, &search_space, dci_cfg, dci_msg))) { return ret; } } } return SRSLTE_SUCCESS; }
int srslte_ue_dl_find_ul_dci(srslte_ue_dl_t *q, uint32_t cfi, uint32_t sf_idx, uint16_t rnti, srslte_dci_msg_t *dci_msg) { if (rnti && cfi > 0 && cfi < 4) { /* Do not search if an UL DCI is already pending */ if (q->pending_ul_dci_rnti == rnti) { q->pending_ul_dci_rnti = 0; memcpy(dci_msg, &q->pending_ul_dci_msg, sizeof(srslte_dci_msg_t)); return 1; } // Configure and run DCI blind search dci_blind_search_t search_space; search_space.nof_locations = 0; dci_blind_search_t *current_ss = &search_space; if (q->current_rnti == rnti) { current_ss = &q->current_ss_ue[cfi-1][sf_idx]; } else { // If locations are not pre-generated, generate them now current_ss->nof_locations = srslte_pdcch_ue_locations(&q->pdcch, current_ss->loc, MAX_CANDIDATES_UE, sf_idx, cfi, rnti); } current_ss->format = SRSLTE_DCI_FORMAT0; INFO("Searching UL C-RNTI in %d ue locations\n", search_space.nof_locations); return dci_blind_search(q, current_ss, rnti, cfi, dci_msg); } else { return 0; } }
// Blind search for C-RNTI static int find_dl_dci_type_crnti(srslte_ue_dl_t *q, uint32_t tm, uint32_t cfi, uint32_t sf_idx, uint16_t rnti, srslte_dci_msg_t *dci_msg) { int ret = SRSLTE_SUCCESS; dci_blind_search_t search_space; dci_blind_search_t *current_ss = &search_space; if (cfi < 1 || cfi > 3) { ERROR("CFI must be 1 ≤ cfi ≤ 3 (cfi=%d)", cfi); return SRSLTE_ERROR; } // Search UE-specific search space if (q->current_rnti == rnti) { current_ss = &q->current_ss_ue[cfi-1][sf_idx]; } else { // If locations are not pre-generated, generate them now current_ss->nof_locations = srslte_pdcch_ue_locations(&q->pdcch, current_ss->loc, MAX_CANDIDATES_UE, sf_idx, cfi, rnti); } for (int f = 0; f < 2; f++) { srslte_dci_format_t format = ue_dci_formats[tm][f]; INFO("Searching DL C-RNTI %s in %d ue locations\n", srslte_dci_format_string(format), current_ss->nof_locations); current_ss->format = format; if ((ret = dci_blind_search(q, current_ss, rnti, cfi, dci_msg))) { return ret; } } // Search Format 1A in the Common SS also if (q->current_rnti == rnti) { current_ss = &q->current_ss_common[cfi-1]; } 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); } // Search for RNTI only if there is room for the common search space if (current_ss->nof_locations > 0) { current_ss->format = SRSLTE_DCI_FORMAT1A; INFO("Searching DL C-RNTI in %d ue locations, format 1A\n", current_ss->nof_locations); return dci_blind_search(q, current_ss, rnti, cfi, dci_msg); } return SRSLTE_SUCCESS; }
int srslte_ue_dl_find_ul_dci(srslte_ue_dl_t* q, srslte_dl_sf_cfg_t* sf, srslte_ue_dl_cfg_t* cfg, uint16_t rnti, srslte_dci_ul_t dci_ul[SRSLTE_MAX_DCI_MSG]) { srslte_dci_msg_t dci_msg[SRSLTE_MAX_DCI_MSG]; uint32_t nof_msg = 0; if (rnti) { /* Do not search if an UL DCI is already pending */ if (q->pending_ul_dci_count) { nof_msg = SRSLTE_MIN(SRSLTE_MAX_DCI_MSG, q->pending_ul_dci_count); q->pending_ul_dci_count = 0; memcpy(dci_msg, q->pending_ul_dci_msg, sizeof(srslte_dci_msg_t) * nof_msg); } else { uint32_t sf_idx = sf->tti % 10; uint32_t cfi = sf->cfi; set_mi_value(q, sf, cfg); // Configure and run DCI blind search dci_blind_search_t search_space; search_space.nof_locations = 0; dci_blind_search_t* current_ss = &search_space; if (q->pregen_rnti == rnti) { current_ss = &q->current_ss_ue[MI_IDX(sf_idx)][cfi - 1][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->format = SRSLTE_DCI_FORMAT0; INFO("Searching UL C-RNTI in %d ue locations\n", search_space.nof_locations); nof_msg = dci_blind_search(q, sf, rnti, current_ss, &cfg->dci_cfg, dci_msg); } // Unpack DCI messages for (uint32_t i = 0; i < nof_msg; i++) { if (srslte_dci_msg_unpack_pusch(&q->cell, sf, &cfg->dci_cfg, &dci_msg[i], &dci_ul[i])) { ERROR("Unpacking UL DCI\n"); return SRSLTE_ERROR; } } return nof_msg; } else { return 0; } }
// Blind search for SI/P/RA-RNTI static int find_dl_dci_type_siprarnti(srslte_ue_dl_t *q, uint32_t cfi, uint16_t rnti, srslte_dci_msg_t *dci_msg) { int ret = 0; // Configure and run DCI blind search dci_blind_search_t search_space; search_space.nof_locations = srslte_pdcch_common_locations(&q->pdcch, search_space.loc, MAX_CANDIDATES_COM, cfi); INFO("Searching SI/P/RA-RNTI in %d common locations, %d formats\n", search_space.nof_locations, nof_common_formats); // Search for RNTI only if there is room for the common search space if (search_space.nof_locations > 0) { for (int f=0;f<nof_common_formats;f++) { search_space.format = common_formats[f]; if ((ret = dci_blind_search(q, &search_space, rnti, cfi, dci_msg))) { return ret; } } } return SRSLTE_SUCCESS; }