option to trigger reconfiguration with BWP switching
This commit is contained in:
@@ -3444,10 +3444,11 @@ void nr_measgap_scheduling(gNB_MAC_INST *nr_mac, frame_t frame, sub_frame_t slot
|
||||
void nr_mac_clean_cellgroup(NR_CellGroupConfig_t *cell_group)
|
||||
{
|
||||
DevAssert(cell_group != NULL);
|
||||
NR_SpCellConfig_t *spCellConfig = cell_group->spCellConfig;
|
||||
/* remove a reconfigurationWithSync, we don't need it anymore */
|
||||
if (cell_group->spCellConfig && cell_group->spCellConfig->reconfigurationWithSync != NULL) {
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_ReconfigurationWithSync, cell_group->spCellConfig->reconfigurationWithSync);
|
||||
cell_group->spCellConfig->reconfigurationWithSync = NULL;
|
||||
if (spCellConfig && spCellConfig->reconfigurationWithSync != NULL) {
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_ReconfigurationWithSync, spCellConfig->reconfigurationWithSync);
|
||||
spCellConfig->reconfigurationWithSync = NULL;
|
||||
}
|
||||
/* remove the rlc_BearerToReleaseList, we don't need it anymore */
|
||||
if (cell_group->rlc_BearerToReleaseList != NULL) {
|
||||
@@ -3459,6 +3460,48 @@ 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 */
|
||||
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(rel_dl);
|
||||
if (add_dl->list.count == 0)
|
||||
free_and_zero(add_dl);
|
||||
}
|
||||
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(rel_ul);
|
||||
if (add_ul->list.count == 0)
|
||||
free_and_zero(add_ul);
|
||||
}
|
||||
}
|
||||
|
||||
int nr_mac_get_reconfig_delay_slots(NR_SubcarrierSpacing_t scs)
|
||||
@@ -3840,9 +3883,22 @@ bool nr_mac_check_ul_failure(gNB_MAC_INST *nrmac, int rnti, NR_UE_sched_ctrl_t *
|
||||
return false;
|
||||
}
|
||||
|
||||
void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, const NR_UE_info_t *UE)
|
||||
void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, const NR_UE_info_t *UE, int new_bwp_id)
|
||||
{
|
||||
DevAssert(UE->CellGroup != NULL);
|
||||
if (new_bwp_id >= 0) {
|
||||
AssertFatal(UE->current_DL_BWP.bwp_id == UE->current_UL_BWP.bwp_id, "We only support same BWP for UL and DL\n");
|
||||
if (new_bwp_id == UE->current_DL_BWP.bwp_id)
|
||||
LOG_E(NR_MAC, "Source BWP ID and target BWP ID are the same, can't perform switch\n");
|
||||
else
|
||||
update_cellGroupConfig_for_BWP_switch(UE->CellGroup,
|
||||
&nrmac->radio_config,
|
||||
UE->capability,
|
||||
nrmac->common_channels[0].ServingCellConfigCommon,
|
||||
UE->uid,
|
||||
UE->current_DL_BWP.bwp_id,
|
||||
new_bwp_id);
|
||||
}
|
||||
uint8_t buf[2048];
|
||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, UE->CellGroup, buf, sizeof(buf));
|
||||
AssertFatal(enc_rval.encoded > 0, "ASN1 encoding of CellGroupConfig failed, failed type %s\n", enc_rval.failed_type->name);
|
||||
|
||||
@@ -880,7 +880,7 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
|
||||
if (!old_UE->reconfigSpCellConfig) {
|
||||
LOG_I(NR_MAC, "Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x, triggering RRC Reconfiguration\n", crnti);
|
||||
// Trigger RRCReconfiguration
|
||||
nr_mac_trigger_reconfiguration(mac, old_UE);
|
||||
nr_mac_trigger_reconfiguration(mac, old_UE, -1);
|
||||
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration
|
||||
configure_UE_BWP(mac, scc, old_UE, false, NR_SearchSpace__searchSpaceType_PR_common, -1, -1);
|
||||
}
|
||||
|
||||
@@ -481,7 +481,7 @@ void nr_mac_trigger_ul_failure(NR_UE_sched_ctrl_t *sched_ctrl, NR_SubcarrierSpac
|
||||
void nr_mac_reset_ul_failure(NR_UE_sched_ctrl_t *sched_ctrl);
|
||||
bool nr_mac_check_ul_failure(gNB_MAC_INST *nrmac, int rnti, NR_UE_sched_ctrl_t *sched_ctrl);
|
||||
|
||||
void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, const NR_UE_info_t *UE);
|
||||
void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, const NR_UE_info_t *UE, int new_bwp_id);
|
||||
|
||||
void process_addmod_bearers_cellGroupConfig(NR_UE_sched_ctrl_t *sched_ctrl,
|
||||
const struct NR_CellGroupConfig__rlc_BearerToAddModList *addmod);
|
||||
|
||||
@@ -785,8 +785,8 @@ void ue_context_modification_request(const f1ap_ue_context_mod_req_t *req)
|
||||
}
|
||||
}
|
||||
// we re-configure the BWP to apply the CellGroup and to use UE specific Search Space with DCIX1
|
||||
nr_mac_clean_cellgroup(UE->CellGroup);
|
||||
configure_UE_BWP(mac, scc, UE, false, NR_SearchSpace__searchSpaceType_PR_ue_Specific, -1, -1);
|
||||
nr_mac_clean_cellgroup(UE->CellGroup);
|
||||
}
|
||||
|
||||
if (ue_cap != NULL) {
|
||||
|
||||
@@ -3683,6 +3683,76 @@ static long set_ul_max_layers(const nr_mac_config_t *configuration, const NR_UE_
|
||||
return ul_max_layers;
|
||||
}
|
||||
|
||||
void 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;
|
||||
NR_UplinkConfig_t *uplinkConfig = configDedicated->uplinkConfig;
|
||||
*uplinkConfig->firstActiveUplinkBWP_Id = new_bwp;
|
||||
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);
|
||||
}
|
||||
|
||||
const int pdsch_AntennaPorts =
|
||||
configuration->pdsch_AntennaPorts.N1 * configuration->pdsch_AntennaPorts.N2 * configuration->pdsch_AntennaPorts.XP;
|
||||
// add new BWP
|
||||
if (new_bwp == 0) {
|
||||
uint64_t bitmap = get_ssb_bitmap(scc);
|
||||
if (!configDedicated->initialDownlinkBWP)
|
||||
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, uid);
|
||||
configDedicated->initialDownlinkBWP = configure_initial_dl_bwp(scc, pdsch_AntennaPorts, bitmap, configuration);
|
||||
} 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,
|
||||
true,
|
||||
configuration);
|
||||
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);
|
||||
asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ul_bwp);
|
||||
}
|
||||
}
|
||||
|
||||
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const int uid,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
|
||||
@@ -121,7 +121,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);
|
||||
|
||||
void 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