bugfixes and improvements in handling dci candidates
This commit is contained in:
@@ -82,7 +82,6 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
int rb_offset;
|
int rb_offset;
|
||||||
int n_rb;
|
int n_rb;
|
||||||
|
|
||||||
// compute rb_offset and n_prb based on frequency allocation
|
// compute rb_offset and n_prb based on frequency allocation
|
||||||
nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL];
|
nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL];
|
||||||
nr_fill_cce_list(cce_list,0,pdcch_pdu_rel15);
|
nr_fill_cce_list(cce_list,0,pdcch_pdu_rel15);
|
||||||
|
|||||||
@@ -1100,8 +1100,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].round = round;
|
UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].round = round;
|
||||||
for (int i=0; i<MAX_NUM_CORESET; i++)
|
|
||||||
gNB_mac->pdcch_cand[i] = 0;
|
|
||||||
|
|
||||||
if (css_flag == 0) {
|
if (css_flag == 0) {
|
||||||
nr_schedule_ue_spec(0, frame, slot);
|
nr_schedule_ue_spec(0, frame, slot);
|
||||||
|
|||||||
@@ -3467,6 +3467,19 @@ void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t get_Y(int cid, int slot, rnti_t rnti) {
|
||||||
|
|
||||||
|
const int A[3] = {39827, 39829, 39839};
|
||||||
|
const int D = 65537;
|
||||||
|
int Y;
|
||||||
|
|
||||||
|
Y = (A[cid] * rnti) % D;
|
||||||
|
|
||||||
|
for (int s = 0; s < slot; s++)
|
||||||
|
Y = (A[cid] * Y) % D;
|
||||||
|
|
||||||
|
return Y;
|
||||||
|
}
|
||||||
|
|
||||||
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
#include "nr_mac.h"
|
#include "nr_mac.h"
|
||||||
#include "openair1/PHY/impl_defs_nr.h"
|
#include "openair1/PHY/impl_defs_nr.h"
|
||||||
|
|
||||||
|
uint16_t get_Y(int cid, int slot, rnti_t rnti);
|
||||||
|
|
||||||
uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
|
uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
|
||||||
|
|
||||||
uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw);
|
uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw);
|
||||||
|
|||||||
@@ -474,7 +474,7 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
|
|||||||
*/
|
*/
|
||||||
void config_control_ue(NR_UE_MAC_INST_t *mac){
|
void config_control_ue(NR_UE_MAC_INST_t *mac){
|
||||||
|
|
||||||
uint8_t coreset_id = 1, ss_id;
|
uint8_t ss_id;
|
||||||
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
|
||||||
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
|
NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
|
||||||
@@ -520,6 +520,7 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
|||||||
}
|
}
|
||||||
// check pdcch_Config, pdcch_ConfigCommon and DL BWP
|
// check pdcch_Config, pdcch_ConfigCommon and DL BWP
|
||||||
mac->DLbwp[0] = dl_bwp_id>0?scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]:NULL;
|
mac->DLbwp[0] = dl_bwp_id>0?scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]:NULL;
|
||||||
|
int coreset_id = controlResourceSetToAddModList->list.array[0]->controlResourceSetId;
|
||||||
mac->coreset[dl_bwp_id][coreset_id - 1] = controlResourceSetToAddModList->list.array[0];
|
mac->coreset[dl_bwp_id][coreset_id - 1] = controlResourceSetToAddModList->list.array[0];
|
||||||
|
|
||||||
// Check dedicated UL BWP and pass to MAC
|
// Check dedicated UL BWP and pass to MAC
|
||||||
|
|||||||
@@ -558,7 +558,6 @@ typedef struct ssb_list_info {
|
|||||||
} ssb_list_info_t;
|
} ssb_list_info_t;
|
||||||
|
|
||||||
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
|
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
|
||||||
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
|
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
#endif /*__LAYER2_MAC_DEFS_H__ */
|
#endif /*__LAYER2_MAC_DEFS_H__ */
|
||||||
|
|||||||
@@ -243,10 +243,7 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
|
|||||||
uint16_t *crnti,
|
uint16_t *crnti,
|
||||||
NR_BSR_SHORT *truncated_bsr,
|
NR_BSR_SHORT *truncated_bsr,
|
||||||
NR_BSR_SHORT *short_bsr,
|
NR_BSR_SHORT *short_bsr,
|
||||||
NR_BSR_LONG *long_bsr
|
NR_BSR_LONG *long_bsr);
|
||||||
);
|
|
||||||
|
|
||||||
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
|
|
||||||
|
|
||||||
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
|
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
|
||||||
|
|
||||||
@@ -446,7 +443,7 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
|
|||||||
uint16_t riv);
|
uint16_t riv);
|
||||||
|
|
||||||
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
|
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
|
||||||
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
|
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, int slot, int rnti);
|
||||||
|
|
||||||
void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac);
|
void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac);
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,9 @@
|
|||||||
|
|
||||||
//#define DEBUG_DCI
|
//#define DEBUG_DCI
|
||||||
|
|
||||||
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
|
void fill_dci_search_candidates(NR_SearchSpace_t *ss,
|
||||||
|
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15,
|
||||||
|
int slot, int rnti) {
|
||||||
|
|
||||||
LOG_D(NR_MAC,"Filling search candidates for DCI\n");
|
LOG_D(NR_MAC,"Filling search candidates for DCI\n");
|
||||||
|
|
||||||
@@ -57,6 +59,9 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
|
|||||||
uint8_t number_of_candidates=0;
|
uint8_t number_of_candidates=0;
|
||||||
rel15->number_of_candidates=0;
|
rel15->number_of_candidates=0;
|
||||||
int i=0;
|
int i=0;
|
||||||
|
int Y = 0;
|
||||||
|
if (slot >= 0)
|
||||||
|
Y = get_Y(*ss->controlResourceSetId, slot, rnti);
|
||||||
for (int maxL=16;maxL>0;maxL>>=1) {
|
for (int maxL=16;maxL>0;maxL>>=1) {
|
||||||
find_aggregation_candidates(&aggregation,
|
find_aggregation_candidates(&aggregation,
|
||||||
&number_of_candidates,
|
&number_of_candidates,
|
||||||
@@ -65,8 +70,17 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
|
|||||||
if (number_of_candidates>0) {
|
if (number_of_candidates>0) {
|
||||||
LOG_D(NR_MAC,"L %d, number of candidates %d, aggregation %d\n",maxL,number_of_candidates,aggregation);
|
LOG_D(NR_MAC,"L %d, number of candidates %d, aggregation %d\n",maxL,number_of_candidates,aggregation);
|
||||||
rel15->number_of_candidates += number_of_candidates;
|
rel15->number_of_candidates += number_of_candidates;
|
||||||
|
int N_cce_sym = 0; // nb of rbs of coreset per symbol
|
||||||
|
for (int i=0;i<6;i++) {
|
||||||
|
for (int t=0;t<8;t++) {
|
||||||
|
N_cce_sym+=((rel15->coreset.frequency_domain_resource[i]>>t)&1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int N_cces = N_cce_sym*rel15->coreset.duration;
|
||||||
for (int j=0; j<number_of_candidates; i++,j++) {
|
for (int j=0; j<number_of_candidates; i++,j++) {
|
||||||
rel15->CCE[i] = j*aggregation;
|
int first_cce = aggregation * (( Y + CEILIDIV((j*N_cces),(aggregation*number_of_candidates)) + 0 ) % CEILIDIV(N_cces,aggregation));
|
||||||
|
LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", j, number_of_candidates, first_cce, aggregation, N_cces, Y);
|
||||||
|
rel15->CCE[i] = first_cce;
|
||||||
rel15->L[i] = aggregation;
|
rel15->L[i] = aggregation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,14 +322,14 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
} else {
|
} else {
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id);
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id);
|
||||||
}
|
}
|
||||||
fill_dci_search_candidates(ss, rel15);
|
fill_dci_search_candidates(ss, rel15, -1, -1);
|
||||||
break;
|
break;
|
||||||
case WAIT_CONTENTION_RESOLUTION:
|
case WAIT_CONTENTION_RESOLUTION:
|
||||||
LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg4)\n");
|
LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg4)\n");
|
||||||
rel15->num_dci_options = 1;
|
rel15->num_dci_options = 1;
|
||||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, -1);
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, -1);
|
||||||
fill_dci_search_candidates(ss, rel15);
|
fill_dci_search_candidates(ss, rel15, -1, -1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -387,7 +401,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1;
|
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1;
|
||||||
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_1;
|
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_1;
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C, ss_id);
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C, ss_id);
|
||||||
fill_dci_search_candidates(ss, rel15);
|
fill_dci_search_candidates(ss, rel15, slot, mac->crnti);
|
||||||
|
|
||||||
//#ifdef DEBUG_DCI
|
//#ifdef DEBUG_DCI
|
||||||
LOG_D(NR_MAC, "[DCI_CONFIG] ss %d ue_Specific %p searchSpaceType->present %d dci_Formats %d\n",
|
LOG_D(NR_MAC, "[DCI_CONFIG] ss %d ue_Specific %p searchSpaceType->present %d dci_Formats %d\n",
|
||||||
@@ -439,7 +453,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
rel15->num_dci_options = 1;
|
rel15->num_dci_options = 1;
|
||||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
|
||||||
fill_dci_search_candidates(ss0, rel15);
|
fill_dci_search_candidates(ss0, rel15, -1, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,7 +464,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
|||||||
rel15->num_dci_options = 1;
|
rel15->num_dci_options = 1;
|
||||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1);
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1);
|
||||||
fill_dci_search_candidates(ss0, rel15);
|
fill_dci_search_candidates(ss0, rel15, -1, -1);
|
||||||
dl_config->number_pdus = 1;
|
dl_config->number_pdus = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1087,7 +1087,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
|||||||
if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
|
if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
|
||||||
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
|
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
|
||||||
config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , mac->ra.ss->searchSpaceId);
|
config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , mac->ra.ss->searchSpaceId);
|
||||||
fill_dci_search_candidates(mac->ra.ss, rel15);
|
fill_dci_search_candidates(mac->ra.ss, rel15, -1 , -1);
|
||||||
dl_config->number_pdus = 1;
|
dl_config->number_pdus = 1;
|
||||||
LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
|
LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
|
||||||
fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
|
fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
|
||||||
@@ -2750,7 +2750,7 @@ void nr_ue_sib1_scheduler(module_id_t module_idP,
|
|||||||
rel15->num_dci_options = 1;
|
rel15->num_dci_options = 1;
|
||||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
||||||
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
|
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
|
||||||
fill_dci_search_candidates(mac->search_space_zero, rel15);
|
fill_dci_search_candidates(mac->search_space_zero, rel15, -1, -1);
|
||||||
|
|
||||||
if(mac->type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern == 1){
|
if(mac->type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern == 1){
|
||||||
// same frame as ssb
|
// same frame as ssb
|
||||||
|
|||||||
@@ -307,8 +307,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
|||||||
nr_rrc_trigger(&ctxt, 0 /*CC_id*/, frame, slot >> *scc->ssbSubcarrierSpacing);
|
nr_rrc_trigger(&ctxt, 0 /*CC_id*/, frame, slot >> *scc->ssbSubcarrierSpacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=0; i<MAX_NUM_CORESET; i++)
|
|
||||||
RC.nrmac[module_idP]->pdcch_cand[i] = 0;
|
|
||||||
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
//mbsfn_status[CC_id] = 0;
|
//mbsfn_status[CC_id] = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -680,7 +680,6 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
UE_info->rnti[UE_id],
|
UE_info->rnti[UE_id],
|
||||||
frame,
|
frame,
|
||||||
slot);
|
slot);
|
||||||
RC.nrmac[module_id]->pdcch_cand[cid]--;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -871,7 +870,6 @@ void pf_dl(module_id_t module_id,
|
|||||||
rnti,
|
rnti,
|
||||||
frame,
|
frame,
|
||||||
slot);
|
slot);
|
||||||
mac->pdcch_cand[cid]--;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -367,7 +367,6 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
|||||||
rnti,
|
rnti,
|
||||||
frame,
|
frame,
|
||||||
slot);
|
slot);
|
||||||
RC.nrmac[module_id]->pdcch_cand[cid]--;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,7 +521,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
|||||||
|
|
||||||
if (CCEIndex < 0) {
|
if (CCEIndex < 0) {
|
||||||
LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__);
|
LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__);
|
||||||
nr_mac->pdcch_cand[cid]--;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -443,14 +443,8 @@ int find_pdcch_candidate(gNB_MAC_INST *mac,
|
|||||||
uint16_t Y){
|
uint16_t Y){
|
||||||
|
|
||||||
uint16_t *vrb_map = mac->common_channels[cc_id].vrb_map;
|
uint16_t *vrb_map = mac->common_channels[cc_id].vrb_map;
|
||||||
const int next_cand = mac->pdcch_cand[coreset->controlResourceSetId];
|
|
||||||
const int N_ci = 0;
|
const int N_ci = 0;
|
||||||
|
|
||||||
if(next_cand>=nr_of_candidates) {
|
|
||||||
LOG_D(NR_MAC,"No more available candidates for this coreset\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int N_rb = pdcch->n_rb; // nb of rbs of coreset per symbol
|
const int N_rb = pdcch->n_rb; // nb of rbs of coreset per symbol
|
||||||
const int N_symb = coreset->duration; // nb of coreset symbols
|
const int N_symb = coreset->duration; // nb of coreset symbols
|
||||||
const int N_regs = N_rb*N_symb; // nb of REGs per coreset
|
const int N_regs = N_rb*N_symb; // nb of REGs per coreset
|
||||||
@@ -462,9 +456,10 @@ int find_pdcch_candidate(gNB_MAC_INST *mac,
|
|||||||
|
|
||||||
// loop over all the available candidates
|
// loop over all the available candidates
|
||||||
// this implements TS 38.211 Sec. 7.3.2.2
|
// this implements TS 38.211 Sec. 7.3.2.2
|
||||||
for(int m=next_cand; m<nr_of_candidates; m++) { // loop over candidates
|
for(int m=0; m<nr_of_candidates; m++) { // loop over candidates
|
||||||
bool taken = false; // flag if the resource for a given candidate are taken
|
bool taken = false; // flag if the resource for a given candidate are taken
|
||||||
int first_cce = aggregation * (( Y + CEILIDIV((m*N_cces),(aggregation*nr_of_candidates)) + N_ci ) % CEILIDIV(N_cces,aggregation));
|
int first_cce = aggregation * (( Y + CEILIDIV((m*N_cces),(aggregation*nr_of_candidates)) + N_ci ) % CEILIDIV(N_cces,aggregation));
|
||||||
|
LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", m, nr_of_candidates, first_cce, aggregation, N_cces, Y);
|
||||||
for (int j=first_cce; (j<first_cce+aggregation) && !taken; j++) { // loop over CCEs
|
for (int j=first_cce; (j<first_cce+aggregation) && !taken; j++) { // loop over CCEs
|
||||||
for (int k=6*j/L; (k<(6*j/L+6/L)) && !taken; k++) { // loop over REG bundles
|
for (int k=6*j/L; (k<(6*j/L+6/L)) && !taken; k++) { // loop over REG bundles
|
||||||
int f = cce_to_reg_interleaving(R, k, pdcch->ShiftIndex, C, L, N_regs);
|
int f = cce_to_reg_interleaving(R, k, pdcch->ShiftIndex, C, L, N_regs);
|
||||||
@@ -476,10 +471,8 @@ int find_pdcch_candidate(gNB_MAC_INST *mac,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!taken){
|
if(!taken)
|
||||||
mac->pdcch_cand[coreset->controlResourceSetId] = m++; // using candidate m, next available is m+1
|
|
||||||
return first_cce;
|
return first_cce;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -2204,20 +2197,6 @@ int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t get_Y(int cid, int slot, rnti_t rnti) {
|
|
||||||
|
|
||||||
const int A[3] = {39827, 39829, 39839};
|
|
||||||
const int D = 65537;
|
|
||||||
int Y;
|
|
||||||
|
|
||||||
Y = (A[cid] * rnti) % D;
|
|
||||||
|
|
||||||
for (int s = 0; s < slot; s++)
|
|
||||||
Y = (A[cid] * Y) % D;
|
|
||||||
|
|
||||||
return Y;
|
|
||||||
}
|
|
||||||
|
|
||||||
int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP) {
|
int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP) {
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
int RA_id;
|
int RA_id;
|
||||||
|
|||||||
@@ -359,8 +359,6 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
|
|||||||
uint8_t num_dmrs_cdm_grps_no_data,
|
uint8_t num_dmrs_cdm_grps_no_data,
|
||||||
NR_pusch_semi_static_t *ps);
|
NR_pusch_semi_static_t *ps);
|
||||||
|
|
||||||
uint16_t get_Y(int cid, int slot, rnti_t rnti);
|
|
||||||
|
|
||||||
uint8_t nr_get_tpc(int target, uint8_t cqi, int incr);
|
uint8_t nr_get_tpc(int target, uint8_t cqi, int incr);
|
||||||
|
|
||||||
int get_spf(nfapi_nr_config_request_scf_t *cfg);
|
int get_spf(nfapi_nr_config_request_scf_t *cfg);
|
||||||
|
|||||||
@@ -755,7 +755,7 @@ typedef struct gNB_MAC_INST_s {
|
|||||||
nfapi_nr_ul_dci_request_t UL_dci_req[NFAPI_CC_MAX];
|
nfapi_nr_ul_dci_request_t UL_dci_req[NFAPI_CC_MAX];
|
||||||
/// NFAPI DL PDU structure
|
/// NFAPI DL PDU structure
|
||||||
nfapi_nr_tx_data_request_t TX_req[NFAPI_CC_MAX];
|
nfapi_nr_tx_data_request_t TX_req[NFAPI_CC_MAX];
|
||||||
int pdcch_cand[MAX_NUM_CORESET];
|
|
||||||
NR_UE_info_t UE_info;
|
NR_UE_info_t UE_info;
|
||||||
|
|
||||||
/// UL handle
|
/// UL handle
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
|||||||
|
|
||||||
ss2->searchSpaceId=2;
|
ss2->searchSpaceId=2;
|
||||||
ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
|
ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
|
||||||
*ss2->controlResourceSetId=1;
|
*ss2->controlResourceSetId=coreset->controlResourceSetId;
|
||||||
ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
|
ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
|
||||||
ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
|
ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
|
||||||
ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
|
ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
|
||||||
|
|||||||
Reference in New Issue
Block a user