The network must configure BWPs with consecutive IDs from 1
... so if we want to have 1 BWP configured at any given time we need to reconfigure BWP 1 every time. This means that since the gNB has more than 1 BWPs (for use for different UEs), that there is a "gNB BWP ID" (as used by the gNB), which can be any BWP ID X, and one "UE BWP ID", which is always 1. This commit implements this distinction.
This commit is contained in:
committed by
Robert Schmidt
parent
3e5d868018
commit
98618a7dc8
@@ -2781,7 +2781,6 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
||||
nr_dci_format_t format,
|
||||
nr_rnti_type_t rnti_type,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
int bwp_id,
|
||||
int ss_type,
|
||||
uint16_t cset0_bwp_size,
|
||||
uint16_t alt_size)
|
||||
|
||||
@@ -159,7 +159,6 @@ uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
|
||||
nr_dci_format_t format,
|
||||
nr_rnti_type_t rnti_type,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
int bwp_id,
|
||||
int ss_type,
|
||||
uint16_t cset0_bwp_size,
|
||||
uint16_t alt_size);
|
||||
|
||||
@@ -198,7 +198,6 @@ static void config_dci_pdu(NR_UE_MAC_INST_t *mac,
|
||||
NR_UL_DCI_FORMAT_0_0,
|
||||
rnti_type,
|
||||
coreset,
|
||||
dl_bwp_id,
|
||||
ss->searchSpaceType->present,
|
||||
mac->type0_PDCCH_CSS_config.num_rbs,
|
||||
0);
|
||||
@@ -211,7 +210,6 @@ static void config_dci_pdu(NR_UE_MAC_INST_t *mac,
|
||||
NR_DL_DCI_FORMAT_1_0,
|
||||
rnti_type,
|
||||
coreset,
|
||||
dl_bwp_id,
|
||||
ss->searchSpaceType->present,
|
||||
mac->type0_PDCCH_CSS_config.num_rbs,
|
||||
0);
|
||||
@@ -225,7 +223,6 @@ static void config_dci_pdu(NR_UE_MAC_INST_t *mac,
|
||||
dci_format[i],
|
||||
rnti_type,
|
||||
coreset,
|
||||
dl_bwp_id,
|
||||
ss->searchSpaceType->present,
|
||||
mac->type0_PDCCH_CSS_config.num_rbs,
|
||||
alt_size);
|
||||
|
||||
@@ -1116,8 +1116,9 @@ bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t
|
||||
NR_SCHED_LOCK(&nrmac->sched_lock);
|
||||
|
||||
NR_UE_info_t *UE = get_new_nr_ue_inst(&nrmac->UE_info.uid_allocator, rnti, CellGroup);
|
||||
DevAssert(UE->uid < MAX_MOBILES_PER_GNB); // test-mode: we assume we can always create a UE
|
||||
free_and_zero(UE->ra); // test-mode (sims, phy-test): UE will not do RA
|
||||
DevAssert(UE->uid < MAX_MOBILES_PER_GNB); // physical simulators: we assume we can always create a UE
|
||||
free_and_zero(UE->ra); // physical simulators: UE will not do RA
|
||||
UE->local_bwp_id = 1; // for physical simulators
|
||||
bool res = add_connected_nr_ue(nrmac, UE);
|
||||
if (!res) {
|
||||
LOG_E(NR_MAC, "Error adding UE %04x\n", rnti);
|
||||
|
||||
@@ -958,7 +958,6 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
|
||||
&uldci_payload,
|
||||
NR_UL_DCI_FORMAT_0_0,
|
||||
TYPE_TC_RNTI_,
|
||||
ul_bwp->bwp_id,
|
||||
ss,
|
||||
coreset,
|
||||
0, // parameter not needed for DCI 0_0
|
||||
@@ -1385,7 +1384,6 @@ static void prepare_dl_pdus(gNB_MAC_INST *nr_mac,
|
||||
&dci_payload,
|
||||
NR_DL_DCI_FORMAT_1_0,
|
||||
rnti_type,
|
||||
dl_bwp->bwp_id,
|
||||
sched_ctrl->search_space,
|
||||
coreset,
|
||||
0, // parameter not needed for DCI 1_0
|
||||
|
||||
@@ -473,7 +473,6 @@ static void nr_fill_nfapi_dl_SIB_pdu(gNB_MAC_INST *gNB_mac,
|
||||
&dci_payload,
|
||||
dci_format,
|
||||
rnti_type,
|
||||
0,
|
||||
search_space,
|
||||
coreset,
|
||||
0,
|
||||
|
||||
@@ -601,6 +601,8 @@ static void ack_reconfig(gNB_MAC_INST *mac, NR_UE_info_t *UE)
|
||||
// UE->reconfigSpCellConfig to be NULLed after receiving reconfiguration complete
|
||||
}
|
||||
NR_ServingCellConfigCommon_t *scc = mac->common_channels[0].ServingCellConfigCommon;
|
||||
/* clean BWP structures */
|
||||
clean_bwp_structures(UE->CellGroup->spCellConfig);
|
||||
configure_UE_BWP(mac, scc, UE, false, NR_SearchSpace__searchSpaceType_PR_common, -1, -1);
|
||||
UE->await_reconfig = false;
|
||||
}
|
||||
@@ -1210,7 +1212,6 @@ void post_process_dlsch(gNB_MAC_INST *nr_mac, post_process_pdsch_t *pdsch, NR_UE
|
||||
&dci_payload,
|
||||
current_BWP->dci_format,
|
||||
rnti_type,
|
||||
bwp_id,
|
||||
sched_ctrl->search_space,
|
||||
sched_ctrl->coreset,
|
||||
UE->pdsch_HARQ_ACK_Codebook,
|
||||
|
||||
@@ -907,8 +907,10 @@ dci_pdu_rel15_t prepare_dci_dl_payload(const gNB_MAC_INST *gNB_mac,
|
||||
dci_payload.dai[0].val = pucch ? (pucch->dai_c - 1) & 3 : 0;
|
||||
// bwp indicator
|
||||
// as per table 7.3.1.1.2-1 in 38.212
|
||||
if (dl_BWP)
|
||||
dci_payload.bwp_indicator.val = UE->sc_info.n_dl_bwp < 4 ? dl_BWP->bwp_id : dl_BWP->bwp_id - 1;
|
||||
if (dl_BWP) {
|
||||
int ext_bwp_id = dl_BWP->bwp_id ? 1 : 0; // BWP-ID sent to the UE is always 1 except for BWP 0
|
||||
dci_payload.bwp_indicator.val = UE->sc_info.n_dl_bwp < 4 ? ext_bwp_id : ext_bwp_id - 1;
|
||||
}
|
||||
return dci_payload;
|
||||
}
|
||||
|
||||
@@ -1182,7 +1184,6 @@ void config_uldci(const NR_UE_ServingCell_Info_t *sc_info,
|
||||
NR_UE_UL_BWP_t *ul_bwp,
|
||||
NR_SearchSpace__searchSpaceType_PR ss_type)
|
||||
{
|
||||
int bwp_id = ul_bwp->bwp_id;
|
||||
nr_dci_format_t dci_format = ul_bwp->dci_format;
|
||||
|
||||
// 3GPP TS 38.214 Section 6.1.2.2.2 Uplink resource allocation type 1
|
||||
@@ -1214,7 +1215,8 @@ void config_uldci(const NR_UE_ServingCell_Info_t *sc_info,
|
||||
LOG_D(NR_MAC,"Configuring DCI Format 0_1\n");
|
||||
dci_pdu_rel15->dai[0].val = 0; //TODO
|
||||
// bwp indicator as per table 7.3.1.1.2-1 in 38.212
|
||||
dci_pdu_rel15->bwp_indicator.val = sc_info->n_ul_bwp < 4 ? bwp_id : bwp_id - 1;
|
||||
int ext_bwp_id = ul_bwp->bwp_id ? 1 : 0; // BWP-ID sent to the UE is always 1 except for BWP 0
|
||||
dci_pdu_rel15->bwp_indicator.val = sc_info->n_ul_bwp < 4 ? ext_bwp_id : ext_bwp_id - 1;
|
||||
// SRS resource indicator
|
||||
if (pusch_Config && pusch_Config->txConfig != NULL) {
|
||||
AssertFatal(*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_codebook,
|
||||
@@ -1640,7 +1642,6 @@ void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||
int dci_format,
|
||||
int rnti_type,
|
||||
int bwp_id,
|
||||
NR_SearchSpace_t *ss,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
long pdsch_HARQ_ACK_Codebook,
|
||||
@@ -1671,7 +1672,6 @@ void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||
NR_UL_DCI_FORMAT_0_0,
|
||||
rnti_type,
|
||||
coreset,
|
||||
bwp_id,
|
||||
ss->searchSpaceType->present,
|
||||
cset0_bwp_size,
|
||||
0);
|
||||
@@ -1685,7 +1685,6 @@ void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||
NR_DL_DCI_FORMAT_1_0,
|
||||
rnti_type,
|
||||
coreset,
|
||||
bwp_id,
|
||||
ss->searchSpaceType->present,
|
||||
cset0_bwp_size,
|
||||
0);
|
||||
@@ -1702,10 +1701,10 @@ void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||
dci_format,
|
||||
rnti_type,
|
||||
coreset,
|
||||
bwp_id,
|
||||
ss->searchSpaceType->present,
|
||||
cset0_bwp_size,
|
||||
alt_size);
|
||||
|
||||
if (dci_size == 0)
|
||||
return;
|
||||
pdcch_dci_pdu->PayloadSizeBits = dci_size;
|
||||
@@ -2703,38 +2702,26 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
|
||||
AssertFatal(dl_bwp_switch == ul_bwp_switch, "Different UL and DL BWP not supported\n");
|
||||
DL_BWP->bwp_id = dl_bwp_switch;
|
||||
UL_BWP->bwp_id = ul_bwp_switch;
|
||||
UE->local_bwp_id = dl_bwp_switch; // assuming they are the same
|
||||
} else {
|
||||
// (re)configuring BWP
|
||||
// TODO BWP switching not via RRC reconfiguration
|
||||
// via RRC if firstActiveXlinkBWP_Id is NULL, MAC stays on the same BWP as before
|
||||
if (servingCellConfig->firstActiveDownlinkBWP_Id)
|
||||
DL_BWP->bwp_id = *servingCellConfig->firstActiveDownlinkBWP_Id;
|
||||
if (servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id)
|
||||
UL_BWP->bwp_id = *servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id;
|
||||
DL_BWP->bwp_id = UE->local_bwp_id;
|
||||
UL_BWP->bwp_id = UE->local_bwp_id;
|
||||
}
|
||||
|
||||
const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig->downlinkBWP_ToAddModList;
|
||||
if(bwpList)
|
||||
sc_info->n_dl_bwp = bwpList->list.count;
|
||||
if (DL_BWP->bwp_id>0) {
|
||||
for (int i=0; i<bwpList->list.count; i++) {
|
||||
dl_bwp = bwpList->list.array[i];
|
||||
if(dl_bwp->bwp_Id == DL_BWP->bwp_id)
|
||||
break;
|
||||
}
|
||||
AssertFatal(dl_bwp!=NULL,"Couldn't find DLBWP corresponding to BWP ID %ld\n",DL_BWP->bwp_id);
|
||||
sc_info->n_dl_bwp = 1;
|
||||
if (DL_BWP->bwp_id > 0) {
|
||||
dl_bwp = bwpList->list.array[0];
|
||||
AssertFatal(dl_bwp, "Couldn't find DLBWP corresponding to BWP ID %ld\n", DL_BWP->bwp_id);
|
||||
}
|
||||
|
||||
const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList;
|
||||
if(ubwpList)
|
||||
sc_info->n_ul_bwp = ubwpList->list.count;
|
||||
if (UL_BWP->bwp_id>0) {
|
||||
for (int i=0; i<ubwpList->list.count; i++) {
|
||||
ul_bwp = ubwpList->list.array[i];
|
||||
if(ul_bwp->bwp_Id == UL_BWP->bwp_id)
|
||||
break;
|
||||
}
|
||||
AssertFatal(ul_bwp!=NULL,"Couldn't find ULBWP corresponding to BWP ID %ld\n",UL_BWP->bwp_id);
|
||||
sc_info->n_ul_bwp = 1;
|
||||
if (UL_BWP->bwp_id > 0) {
|
||||
ul_bwp = ubwpList->list.array[0];
|
||||
AssertFatal(ul_bwp, "Couldn't find ULBWP corresponding to BWP ID %ld\n", UL_BWP->bwp_id);
|
||||
}
|
||||
|
||||
// selection of dedicated BWPs
|
||||
@@ -2762,12 +2749,12 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
|
||||
}
|
||||
|
||||
// TDA lists
|
||||
if (DL_BWP->bwp_id>0)
|
||||
if (DL_BWP->bwp_id > 0)
|
||||
DL_BWP->tdaList_Common = dl_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
||||
else
|
||||
DL_BWP->tdaList_Common = scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
|
||||
|
||||
if(UL_BWP->bwp_id>0)
|
||||
if(UL_BWP->bwp_id > 0)
|
||||
UL_BWP->tdaList_Common = ul_bwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
||||
else
|
||||
UL_BWP->tdaList_Common = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
||||
@@ -3217,9 +3204,10 @@ void nr_csirs_scheduling(int Mod_idP, frame_t frame, slot_t slot, nfapi_nr_dl_tt
|
||||
NR_NZP_CSI_RS_ResourceSetId_t *nzp = NULL;
|
||||
for (int csi_list=0; csi_list<csi_measconfig->csi_ResourceConfigToAddModList->list.count; csi_list++) {
|
||||
NR_CSI_ResourceConfig_t *csires = csi_measconfig->csi_ResourceConfigToAddModList->list.array[csi_list];
|
||||
if(csires->bwp_Id == dl_bwp->bwp_id &&
|
||||
csires->csi_RS_ResourceSetList.present == NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB &&
|
||||
csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList) {
|
||||
if (csires->bwp_Id > 1)
|
||||
LOG_E(NR_MAC, "Invalid CSI resource BWP ID %ld, we only configure BWP up to 1\n", csires->bwp_Id);
|
||||
else if (csires->csi_RS_ResourceSetList.present == NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB &&
|
||||
csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList) {
|
||||
nzp = csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0];
|
||||
}
|
||||
}
|
||||
@@ -3456,46 +3444,11 @@ void nr_measgap_scheduling(gNB_MAC_INST *nr_mac, frame_t frame, sub_frame_t slot
|
||||
void clean_bwp_structures(NR_SpCellConfig_t *spCellConfig)
|
||||
{
|
||||
NR_ServingCellConfig_t *spCellConfigDedicated = spCellConfig->spCellConfigDedicated;
|
||||
if (spCellConfigDedicated->downlinkBWP_ToReleaseList) {
|
||||
struct NR_ServingCellConfig__downlinkBWP_ToReleaseList *rel_dl = spCellConfigDedicated->downlinkBWP_ToReleaseList;
|
||||
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *add_dl = spCellConfigDedicated->downlinkBWP_ToAddModList;
|
||||
int num_rel = rel_dl->list.count;
|
||||
int num_add = add_dl->list.count;
|
||||
for (int i = 0; i < num_rel; i++) {
|
||||
NR_BWP_Id_t *rel_id = rel_dl->list.array[i];
|
||||
for (int j = 0; j < num_add; j++) {
|
||||
NR_BWP_Downlink_t *dl_bwp = add_dl->list.array[j];
|
||||
if (*rel_id == dl_bwp->bwp_Id) {
|
||||
asn_sequence_del(&add_dl->list, j, 1);
|
||||
}
|
||||
}
|
||||
asn_sequence_del(&rel_dl->list, i, 1);
|
||||
}
|
||||
if (rel_dl->list.count == 0)
|
||||
free_and_zero(spCellConfigDedicated->downlinkBWP_ToReleaseList);
|
||||
if (add_dl->list.count == 0)
|
||||
free_and_zero(spCellConfigDedicated->downlinkBWP_ToAddModList);
|
||||
}
|
||||
if (spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList) {
|
||||
struct NR_UplinkConfig__uplinkBWP_ToReleaseList *rel_ul = spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList;
|
||||
struct NR_UplinkConfig__uplinkBWP_ToAddModList *add_ul = spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList;
|
||||
int num_rel = rel_ul->list.count;
|
||||
int num_add = add_ul->list.count;
|
||||
for (int i = 0; i < num_rel; i++) {
|
||||
NR_BWP_Id_t *rel_id = rel_ul->list.array[i];
|
||||
for (int j = 0; j < num_add; j++) {
|
||||
NR_BWP_Uplink_t *ul_bwp = add_ul->list.array[j];
|
||||
if (*rel_id == ul_bwp->bwp_Id) {
|
||||
asn_sequence_del(&add_ul->list, j, 1);
|
||||
}
|
||||
}
|
||||
asn_sequence_del(&rel_ul->list, i, 1);
|
||||
}
|
||||
if (rel_ul->list.count == 0)
|
||||
free_and_zero(spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList);
|
||||
if (add_ul->list.count == 0)
|
||||
free_and_zero(spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList);
|
||||
}
|
||||
if (spCellConfigDedicated->downlinkBWP_ToAddModList && spCellConfigDedicated->downlinkBWP_ToAddModList->list.count > 1)
|
||||
asn_sequence_del(&spCellConfigDedicated->downlinkBWP_ToAddModList->list, 0, 1);
|
||||
if (spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList
|
||||
&& spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count > 1)
|
||||
asn_sequence_del(&spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list, 0, 1);
|
||||
}
|
||||
|
||||
void nr_mac_clean_cellgroup(NR_CellGroupConfig_t *cell_group)
|
||||
@@ -3517,8 +3470,6 @@ void nr_mac_clean_cellgroup(NR_CellGroupConfig_t *cell_group)
|
||||
/* remove reestablishRLC, we don't need it anymore */
|
||||
for (int i = 0; i < cell_group->rlc_BearerToAddModList->list.count; ++i)
|
||||
free_and_zero(cell_group->rlc_BearerToAddModList->list.array[i]->reestablishRLC);
|
||||
/* clean BWP structures */
|
||||
clean_bwp_structures(spCellConfig);
|
||||
}
|
||||
|
||||
int nr_mac_get_reconfig_delay_slots(NR_SubcarrierSpacing_t scs)
|
||||
@@ -3818,6 +3769,7 @@ bool prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE)
|
||||
NR_CellGroupConfig_t *cellGroupConfig = get_initial_cellGroupConfig(UE->uid, scc, &mac->radio_config, &mac->rlc_config);
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->CellGroup);
|
||||
UE->CellGroup = cellGroupConfig;
|
||||
UE->local_bwp_id = mac->radio_config.first_active_bwp;
|
||||
|
||||
if (!cellGroupConfig)
|
||||
return true;
|
||||
@@ -3950,6 +3902,7 @@ void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, NR_UE_info_t *UE,
|
||||
return;
|
||||
else {
|
||||
UE->sc_info.csi_MeasConfig = NULL; // to avoid segfault when freeing csi_MeasConfig in configDedicated
|
||||
UE->local_bwp_id = new_bwp_id;
|
||||
cellGroup_for_UE = update_cellGroupConfig_for_BWP_switch(UE->CellGroup,
|
||||
&nrmac->radio_config,
|
||||
UE->capability,
|
||||
|
||||
@@ -253,9 +253,10 @@ void nr_csi_meas_reporting(int Mod_idP,frame_t frame, slot_t slot)
|
||||
"Only periodic CSI reporting is implemented currently\n");
|
||||
|
||||
const NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
|
||||
if(pucchcsires->uplinkBandwidthPartId != ul_bwp->bwp_id)
|
||||
if(pucchcsires->uplinkBandwidthPartId > 1) {
|
||||
LOG_E(NR_MAC, "Invalid PUCCH BWP ID %ld, we only configure BWP up to 1\n", pucchcsires->uplinkBandwidthPartId);
|
||||
continue;
|
||||
|
||||
}
|
||||
// we schedule CSI reporting max_fb_time slots in advance
|
||||
int period, offset;
|
||||
csi_period_offset(csirep, NULL, &period, &offset);
|
||||
@@ -748,7 +749,6 @@ static void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
|
||||
NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR reportQuantity_type_r16 =
|
||||
NR_CSI_ReportConfig__ext2__reportQuantity_r16_PR_NOTHING;
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||
NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
|
||||
NR_UE_DL_BWP_t *dl_bwp = &UE->current_DL_BWP;
|
||||
const int n_slots_frame = nrmac->frame_structure.numb_slots_frame;
|
||||
int cumul_bits = 0;
|
||||
@@ -763,8 +763,10 @@ static void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
|
||||
NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
|
||||
uint8_t cqi_table = (dl_bwp->dci_format == NR_DL_DCI_FORMAT_1_1 && csirep->cqi_Table) ? *csirep->cqi_Table : NR_CSI_ReportConfig__cqi_Table_table1;
|
||||
const NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
|
||||
if(pucchcsires->uplinkBandwidthPartId != ul_bwp->bwp_id)
|
||||
if(pucchcsires->uplinkBandwidthPartId > 1) {
|
||||
LOG_E(NR_MAC, "Invalid PUCCH BWP ID %ld, we only configure BWP up to 1\n", pucchcsires->uplinkBandwidthPartId);
|
||||
continue;
|
||||
}
|
||||
int period, offset;
|
||||
csi_period_offset(csirep, NULL, &period, &offset);
|
||||
// verify if report with current id has been scheduled for this frame and slot
|
||||
|
||||
@@ -2606,7 +2606,6 @@ void post_process_ulsch(gNB_MAC_INST *nr_mac, post_process_pusch_t *pusch, NR_UE
|
||||
&uldci_payload,
|
||||
current_BWP->dci_format,
|
||||
TYPE_C_RNTI_,
|
||||
current_BWP->bwp_id,
|
||||
ss,
|
||||
coreset,
|
||||
UE->pdsch_HARQ_ACK_Codebook,
|
||||
|
||||
@@ -258,7 +258,6 @@ void fill_dci_pdu_rel15(const NR_UE_ServingCell_Info_t *servingCellInfo,
|
||||
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||
int dci_format,
|
||||
int rnti_type,
|
||||
int bwp_id,
|
||||
NR_SearchSpace_t *ss,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
long pdsch_HARQ_ACK_Codebook,
|
||||
|
||||
@@ -576,6 +576,7 @@ static NR_UE_info_t *create_new_UE(gNB_MAC_INST *mac, uint32_t cu_id, const NR_C
|
||||
cellGroupConfig->spCellConfig->reconfigurationWithSync = get_reconfiguration_with_sync(UE->rnti, UE->uid, scc, mac->frame);
|
||||
// TODO: in NSA we assign capabilities here, otherwise outside => not logic
|
||||
UE->capability = cap;
|
||||
UE->local_bwp_id = 1; // get_default_secondaryCellGroup sets 1st active BWP as 1
|
||||
}
|
||||
// note: we don't pass the cellGroupConfig to add_new_nr_ue() because we need
|
||||
// the uid to create the CellGroupConfig (which is in the UE context created
|
||||
|
||||
@@ -801,6 +801,11 @@ typedef struct NR_UE_info {
|
||||
bool is_redcap;
|
||||
bool await_reconfig;
|
||||
NR_RA_t *ra;
|
||||
// 3GPP mandates that BWPs are enumerated consecutively, but we only send one (dedicated)
|
||||
// BWP to the UE (and modify that BWP on reconfiguration); consequently, the BWP ID for a
|
||||
// dedicated BWP is always 1 from the UE's point of view, even if the gNB has multiple BWPs.
|
||||
// The below ID is the "true" (non-consecutive) BWP ID from the gNB's point of view
|
||||
NR_BWP_Id_t local_bwp_id;
|
||||
} NR_UE_info_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -1724,20 +1724,18 @@ static NR_BWP_Downlink_t *config_downlinkBWP(const NR_ServingCellConfigCommon_t
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
int dl_antenna_ports,
|
||||
bool force_256qam_off,
|
||||
int bwp_loop,
|
||||
bool is_SA,
|
||||
const nr_mac_config_t *configuration)
|
||||
{
|
||||
NR_BWP_Downlink_t *bwp = calloc_or_fail(1, sizeof(*bwp));
|
||||
bwp->bwp_Id = 1;
|
||||
bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
|
||||
if(configuration->num_additional_bwps > 0) {
|
||||
const nr_bwp_config_t *bwp_config = &configuration->bwp_config[bwp_loop];
|
||||
bwp->bwp_Id = bwp_config->id;
|
||||
if(configuration->num_additional_bwps > 0 && configuration->first_active_bwp > 0) {
|
||||
const nr_bwp_config_t *bwp_config = &configuration->bwp_config[configuration->first_active_bwp - 1];
|
||||
bwp->bwp_Common->genericParameters.locationAndBandwidth = bwp_config->location_and_bw;
|
||||
bwp->bwp_Common->genericParameters.subcarrierSpacing = bwp_config->scs;
|
||||
bwp->bwp_Common->genericParameters.cyclicPrefix = NULL;
|
||||
} else {
|
||||
bwp->bwp_Id=bwp_loop+1;
|
||||
bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
|
||||
bwp->bwp_Common->genericParameters.subcarrierSpacing = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
|
||||
bwp->bwp_Common->genericParameters.cyclicPrefix = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix;
|
||||
@@ -1830,8 +1828,7 @@ static NR_BWP_Downlink_t *config_downlinkBWP(const NR_ServingCellConfigCommon_t
|
||||
return bwp;
|
||||
}
|
||||
|
||||
static NR_BWP_Uplink_t *config_uplinkBWP(long bwp_loop,
|
||||
bool is_SA,
|
||||
static NR_BWP_Uplink_t *config_uplinkBWP(bool is_SA,
|
||||
int uid,
|
||||
int maxMIMO_Layers,
|
||||
const nr_mac_config_t *configuration,
|
||||
@@ -1839,14 +1836,14 @@ static NR_BWP_Uplink_t *config_uplinkBWP(long bwp_loop,
|
||||
const NR_UE_NR_Capability_t *uecap)
|
||||
{
|
||||
NR_BWP_Uplink_t *ubwp = calloc_or_fail(1, sizeof(*ubwp));
|
||||
ubwp->bwp_Id = 1;
|
||||
ubwp->bwp_Common = calloc(1, sizeof(*ubwp->bwp_Common));
|
||||
if(configuration->num_additional_bwps > 0) {
|
||||
ubwp->bwp_Id = configuration->bwp_config[bwp_loop].id;
|
||||
ubwp->bwp_Common->genericParameters.locationAndBandwidth = configuration->bwp_config[bwp_loop].location_and_bw;
|
||||
ubwp->bwp_Common->genericParameters.subcarrierSpacing = configuration->bwp_config[bwp_loop].scs;
|
||||
if(configuration->num_additional_bwps > 0 && configuration->first_active_bwp > 0) {
|
||||
int bwp_idx = configuration->first_active_bwp - 1;
|
||||
ubwp->bwp_Common->genericParameters.locationAndBandwidth = configuration->bwp_config[bwp_idx].location_and_bw;
|
||||
ubwp->bwp_Common->genericParameters.subcarrierSpacing = configuration->bwp_config[bwp_idx].scs;
|
||||
ubwp->bwp_Common->genericParameters.cyclicPrefix = NULL;
|
||||
} else {
|
||||
ubwp->bwp_Id=bwp_loop+1;
|
||||
ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
|
||||
ubwp->bwp_Common->genericParameters.subcarrierSpacing = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
|
||||
ubwp->bwp_Common->genericParameters.cyclicPrefix = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix;
|
||||
@@ -1889,7 +1886,7 @@ static NR_BWP_Uplink_t *config_uplinkBWP(long bwp_loop,
|
||||
NULL,
|
||||
curr_bwp,
|
||||
uid,
|
||||
bwp_loop + 1,
|
||||
ubwp->bwp_Id,
|
||||
maxMIMO_Layers,
|
||||
configuration->minRXTXTIME,
|
||||
configuration->do_SRS);
|
||||
@@ -3537,7 +3534,7 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
|
||||
uint64_t bitmap = get_ssb_bitmap(scc);
|
||||
int first_active_bwp = 0;
|
||||
if (configuration->num_additional_bwps > 0)
|
||||
first_active_bwp = configuration->first_active_bwp;
|
||||
first_active_bwp = configuration->first_active_bwp > 0 ? 1 : 0;
|
||||
|
||||
asn1cCallocOne(configDedicated->firstActiveDownlinkBWP_Id, first_active_bwp);
|
||||
asn1cCallocOne(uplinkConfig->firstActiveUplinkBWP_Id, first_active_bwp);
|
||||
@@ -3550,12 +3547,11 @@ static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid,
|
||||
NULL,
|
||||
0,
|
||||
false,
|
||||
first_active_bwp - 1,
|
||||
true,
|
||||
configuration);
|
||||
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
|
||||
uplinkConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList));
|
||||
NR_BWP_Uplink_t *ubwp = config_uplinkBWP(first_active_bwp - 1, true, uid, maxMIMO_Layers, configuration, scc, NULL);
|
||||
NR_BWP_Uplink_t *ubwp = config_uplinkBWP(true, uid, maxMIMO_Layers, configuration, scc, NULL);
|
||||
asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp);
|
||||
}
|
||||
|
||||
@@ -3775,46 +3771,22 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
|
||||
return cellGroupConfig;
|
||||
}
|
||||
|
||||
NR_CellGroupConfig_t * update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_mac_config_t *configuration,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
int uid,
|
||||
int old_bwp,
|
||||
int new_bwp)
|
||||
NR_CellGroupConfig_t *update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_mac_config_t *configuration,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
int uid,
|
||||
int old_bwp,
|
||||
int new_bwp)
|
||||
{
|
||||
NR_SpCellConfig_t *spCellConfig = cellGroupConfig->spCellConfig;
|
||||
NR_ServingCellConfig_t *configDedicated = spCellConfig->spCellConfigDedicated;
|
||||
*configDedicated->firstActiveDownlinkBWP_Id = new_bwp;
|
||||
*configDedicated->firstActiveDownlinkBWP_Id = new_bwp != 0; // 1 for any BWP != 0
|
||||
NR_UplinkConfig_t *uplinkConfig = configDedicated->uplinkConfig;
|
||||
*uplinkConfig->firstActiveUplinkBWP_Id = new_bwp;
|
||||
*uplinkConfig->firstActiveUplinkBWP_Id = new_bwp != 0; // 1 for any BWP != 0
|
||||
nr_mac_config_t local_config = *configuration;
|
||||
long ul_maxMIMO_Layers = set_ul_max_layers(configuration, uecap);
|
||||
|
||||
// release old BWP
|
||||
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *dl_BWP_list = configDedicated->downlinkBWP_ToAddModList;
|
||||
struct NR_UplinkConfig__uplinkBWP_ToAddModList *ul_BWP_list = uplinkConfig->uplinkBWP_ToAddModList;
|
||||
if (old_bwp > 0) { // we need to remove old BWP only if it is not the initial
|
||||
AssertFatal(dl_BWP_list, "Source BWP %d should be present in the list\n", old_bwp);
|
||||
AssertFatal(ul_BWP_list, "Source BWP %d should be present in the list\n", old_bwp);
|
||||
NR_BWP_Id_t id = dl_BWP_list->list.array[0]->bwp_Id;
|
||||
if (!configDedicated->downlinkBWP_ToReleaseList)
|
||||
configDedicated->downlinkBWP_ToReleaseList = calloc_or_fail(1, sizeof(*configDedicated->downlinkBWP_ToReleaseList));
|
||||
asn1cSequenceAdd(configDedicated->downlinkBWP_ToReleaseList->list, NR_BWP_Id_t, rel_id);
|
||||
*rel_id = id;
|
||||
AssertFatal(configDedicated->downlinkBWP_ToReleaseList->list.count == 1,
|
||||
"logic error: there shouldn't be more than 1 BWP to release, but downlinkBWP_ToReleaseList has %d\n",
|
||||
configDedicated->downlinkBWP_ToReleaseList->list.count);
|
||||
|
||||
id = ul_BWP_list->list.array[0]->bwp_Id;
|
||||
if (!uplinkConfig->uplinkBWP_ToReleaseList)
|
||||
uplinkConfig->uplinkBWP_ToReleaseList = calloc_or_fail(1, sizeof(*uplinkConfig->uplinkBWP_ToReleaseList));
|
||||
asn1cSequenceAdd(uplinkConfig->uplinkBWP_ToReleaseList->list, NR_BWP_Id_t, ul_rel_id);
|
||||
*ul_rel_id = id;
|
||||
AssertFatal(uplinkConfig->uplinkBWP_ToReleaseList->list.count == 1,
|
||||
"logic error: there shouldn't be more than 1 BWP to release, but uplinkBWP_ToReleaseList has %d\n",
|
||||
uplinkConfig->uplinkBWP_ToReleaseList->list.count);
|
||||
}
|
||||
|
||||
local_config.first_active_bwp = new_bwp;
|
||||
uint64_t bitmap = get_ssb_bitmap(scc);
|
||||
const int pdsch_AntennaPorts =
|
||||
configuration->pdsch_AntennaPorts.N1 * configuration->pdsch_AntennaPorts.N2 * configuration->pdsch_AntennaPorts.XP;
|
||||
@@ -3824,23 +3796,22 @@ NR_CellGroupConfig_t * update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_
|
||||
configDedicated->initialDownlinkBWP = calloc_or_fail(1, sizeof(*configDedicated->initialDownlinkBWP));
|
||||
if (!uplinkConfig->initialUplinkBWP)
|
||||
uplinkConfig->initialUplinkBWP = calloc_or_fail(1, sizeof(*uplinkConfig->initialUplinkBWP));
|
||||
uplinkConfig->initialUplinkBWP = configure_initial_ul_bwp(scc, configuration, ul_maxMIMO_Layers, uecap, uid);
|
||||
configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, uecap, configuration);
|
||||
uplinkConfig->initialUplinkBWP = configure_initial_ul_bwp(scc, &local_config, ul_maxMIMO_Layers, uecap, uid);
|
||||
configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, uecap, &local_config);
|
||||
} else {
|
||||
if (!configDedicated->downlinkBWP_ToAddModList)
|
||||
configDedicated->downlinkBWP_ToAddModList = calloc_or_fail(1, sizeof(*configDedicated->downlinkBWP_ToAddModList));
|
||||
NR_BWP_Downlink_t *dl_bwp = config_downlinkBWP(scc,
|
||||
uecap,
|
||||
pdsch_AntennaPorts,
|
||||
configuration->force_256qam_off,
|
||||
new_bwp - 1,
|
||||
local_config.force_256qam_off,
|
||||
true,
|
||||
configuration);
|
||||
&local_config);
|
||||
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, dl_bwp);
|
||||
|
||||
if (!uplinkConfig->uplinkBWP_ToAddModList)
|
||||
uplinkConfig->uplinkBWP_ToAddModList = calloc_or_fail(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList));
|
||||
NR_BWP_Uplink_t *ul_bwp = config_uplinkBWP(new_bwp - 1, true, uid, ul_maxMIMO_Layers, configuration, scc, uecap);
|
||||
NR_BWP_Uplink_t *ul_bwp = config_uplinkBWP(true, uid, ul_maxMIMO_Layers, &local_config, scc, uecap);
|
||||
asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ul_bwp);
|
||||
}
|
||||
|
||||
@@ -3848,9 +3819,9 @@ NR_CellGroupConfig_t * update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_
|
||||
configDedicated->csi_MeasConfig->choice.setup = get_csiMeasConfig(configDedicated,
|
||||
uecap,
|
||||
scc,
|
||||
configuration,
|
||||
&local_config,
|
||||
uid,
|
||||
new_bwp,
|
||||
*uplinkConfig->firstActiveUplinkBWP_Id,
|
||||
bitmap);
|
||||
|
||||
// we temporarily need to keep both the old and the new BWP in the CG used by the gNB
|
||||
@@ -4077,44 +4048,27 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
|
||||
configuration->do_SRS);
|
||||
|
||||
// Downlink BWPs
|
||||
int n_dl_bwp = 1;
|
||||
int firstActiveDownlinkBWP_Id = 1;
|
||||
if (configuration->num_additional_bwps > 0) {
|
||||
n_dl_bwp = configuration->num_additional_bwps;
|
||||
firstActiveDownlinkBWP_Id = configuration->first_active_bwp;
|
||||
}
|
||||
configDedicated->downlinkBWP_ToAddModList = calloc(1, sizeof(*configDedicated->downlinkBWP_ToAddModList));
|
||||
for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
|
||||
NR_BWP_Downlink_t *bwp = config_downlinkBWP(servingcellconfigcommon,
|
||||
uecap,
|
||||
dl_antenna_ports,
|
||||
configuration->force_256qam_off,
|
||||
bwp_loop,
|
||||
false,
|
||||
configuration);
|
||||
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
|
||||
configDedicated->firstActiveDownlinkBWP_Id = calloc(1, sizeof(*configDedicated->firstActiveDownlinkBWP_Id));
|
||||
*configDedicated->firstActiveDownlinkBWP_Id = firstActiveDownlinkBWP_Id;
|
||||
configDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*configDedicated->defaultDownlinkBWP_Id));
|
||||
*configDedicated->defaultDownlinkBWP_Id = 1;
|
||||
}
|
||||
NR_BWP_Downlink_t *bwp = config_downlinkBWP(servingcellconfigcommon,
|
||||
uecap,
|
||||
dl_antenna_ports,
|
||||
configuration->force_256qam_off,
|
||||
false,
|
||||
configuration);
|
||||
asn1cSeqAdd(&configDedicated->downlinkBWP_ToAddModList->list, bwp);
|
||||
configDedicated->firstActiveDownlinkBWP_Id = calloc(1, sizeof(*configDedicated->firstActiveDownlinkBWP_Id));
|
||||
*configDedicated->firstActiveDownlinkBWP_Id = firstActiveDownlinkBWP_Id;
|
||||
configDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*configDedicated->defaultDownlinkBWP_Id));
|
||||
*configDedicated->defaultDownlinkBWP_Id = 1;
|
||||
|
||||
// Uplink BWPs
|
||||
int n_ul_bwp = 1;
|
||||
int firstActiveUplinkBWP_Id = 1;
|
||||
if (configuration->num_additional_bwps > 0) {
|
||||
n_ul_bwp = configuration->num_additional_bwps;
|
||||
firstActiveUplinkBWP_Id = configuration->first_active_bwp;
|
||||
}
|
||||
if (n_ul_bwp > 0) {
|
||||
ulConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*ulConfig->uplinkBWP_ToAddModList));
|
||||
for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
|
||||
NR_BWP_Uplink_t *ubwp = config_uplinkBWP(bwp_loop, false, uid, maxMIMO_Layers, configuration, servingcellconfigcommon, uecap);
|
||||
asn1cSeqAdd(&ulConfig->uplinkBWP_ToAddModList->list, ubwp);
|
||||
}
|
||||
ulConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*ulConfig->firstActiveUplinkBWP_Id));
|
||||
*ulConfig->firstActiveUplinkBWP_Id = firstActiveUplinkBWP_Id;
|
||||
}
|
||||
ulConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*ulConfig->uplinkBWP_ToAddModList));
|
||||
NR_BWP_Uplink_t *ubwp = config_uplinkBWP(false, uid, maxMIMO_Layers, configuration, servingcellconfigcommon, uecap);
|
||||
asn1cSeqAdd(&ulConfig->uplinkBWP_ToAddModList->list, ubwp);
|
||||
ulConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*ulConfig->firstActiveUplinkBWP_Id));
|
||||
*ulConfig->firstActiveUplinkBWP_Id = firstActiveUplinkBWP_Id;
|
||||
|
||||
configDedicated->bwp_InactivityTimer = NULL;
|
||||
configDedicated->downlinkBWP_ToReleaseList = NULL;
|
||||
|
||||
@@ -124,13 +124,13 @@ NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId,
|
||||
NR_RLC_Config_PR rlc_conf,
|
||||
long priority,
|
||||
const nr_rlc_configuration_t *default_rlc_config);
|
||||
NR_CellGroupConfig_t * update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_mac_config_t *configuration,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
int uid,
|
||||
int old_bwp,
|
||||
int new_bwp);
|
||||
NR_CellGroupConfig_t *update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_mac_config_t *configuration,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
int uid,
|
||||
int old_bwp,
|
||||
int new_bwp);
|
||||
NR_MeasurementTimingConfiguration_t *get_nr_mtc(uint8_t *buf, uint32_t len);
|
||||
measgap_config_t create_measgap_config(const NR_MeasurementTimingConfiguration_t *mtc, int scs, int min_rxtxtime);
|
||||
int encode_measgap_config(const measgap_config_t *c, uint8_t *buf);
|
||||
|
||||
Reference in New Issue
Block a user