diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index da1930f1b7..146e7a6f4f 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -667,9 +667,6 @@ void nr_release_mac_config_logicalChannelBearer(NR_UE_MAC_INST_t *mac, long chan if (mac->logicalChannelConfig[channel_identity - 1] != NULL) { asn1cFreeStruc(asn_DEF_NR_LogicalChannelConfig, mac->logicalChannelConfig[channel_identity - 1]); } - else { - LOG_E(NR_MAC, "Trying to release a non configured logical channel bearer %li\n", channel_identity); - } } static uint16_t nr_get_ms_bucketsizeduration(uint8_t bucketsizeduration) @@ -964,7 +961,21 @@ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *targ target->rbg_Size = source->rbg_Size; UPDATE_MAC_IE(target->mcs_Table, source->mcs_Table, long); UPDATE_MAC_IE(target->maxNrofCodeWordsScheduledByDCI, source->maxNrofCodeWordsScheduledByDCI, long); - target->prb_BundlingType = source->prb_BundlingType; + target->prb_BundlingType.present = source->prb_BundlingType.present; + switch (source->prb_BundlingType.present) { + case NR_PDSCH_Config__prb_BundlingType_PR_staticBundling: + UPDATE_MAC_IE(target->prb_BundlingType.choice.staticBundling, + source->prb_BundlingType.choice.staticBundling, + struct NR_PDSCH_Config__prb_BundlingType__staticBundling); + break; + case NR_PDSCH_Config__prb_BundlingType_PR_dynamicBundling: + UPDATE_MAC_IE(target->prb_BundlingType.choice.dynamicBundling, + source->prb_BundlingType.choice.dynamicBundling, + struct NR_PDSCH_Config__prb_BundlingType__dynamicBundling); + break; + default: + break; + } AssertFatal(source->zp_CSI_RS_ResourceToAddModList == NULL, "Not handled\n"); AssertFatal(source->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n"); AssertFatal(source->sp_ZP_CSI_RS_ResourceSetsToAddModList == NULL, "Not handled\n"); @@ -1095,7 +1106,26 @@ static void setup_srsresourceset(NR_SRS_ResourceSet_t *target, NR_SRS_ResourceSe target->srs_ResourceSetId = source->srs_ResourceSetId; if (source->srs_ResourceIdList) UPDATE_MAC_IE(target->srs_ResourceIdList, source->srs_ResourceIdList, struct NR_SRS_ResourceSet__srs_ResourceIdList); - target->resourceType = source->resourceType; + target->resourceType.present = source->resourceType.present; + switch (source->resourceType.present) { + case NR_SRS_ResourceSet__resourceType_PR_aperiodic: + UPDATE_MAC_IE(target->resourceType.choice.aperiodic, + source->resourceType.choice.aperiodic, + struct NR_SRS_ResourceSet__resourceType__aperiodic); + break; + case NR_SRS_ResourceSet__resourceType_PR_periodic: + UPDATE_MAC_IE(target->resourceType.choice.periodic, + source->resourceType.choice.periodic, + struct NR_SRS_ResourceSet__resourceType__periodic); + break; + case NR_SRS_ResourceSet__resourceType_PR_semi_persistent: + UPDATE_MAC_IE(target->resourceType.choice.semi_persistent, + source->resourceType.choice.semi_persistent, + struct NR_SRS_ResourceSet__resourceType__semi_persistent); + break; + default: + break; + } target->usage = source->usage; UPDATE_MAC_IE(target->alpha, source->alpha, NR_Alpha_t); if (source->p0) @@ -1330,18 +1360,8 @@ void nr_rrc_mac_config_req_reset(module_id_t module_id, NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); reset_mac_inst(mac); reset_ra(&mac->ra); - release_mac_configuration(mac); - - for (int i = 0; i < NR_MAX_NUM_LCID; i++) { - nr_release_mac_config_logicalChannelBearer(mac, i + 1); - memset(&mac->lc_ordered_info[i], 0, sizeof(nr_lcordered_info_t)); - } - - mac->first_sync_frame = -1; - mac->get_sib1 = false; - mac->phy_config_request_sent = false; - mac->state = UE_NOT_SYNC; + nr_ue_init_mac(module_id); // Sending to PHY a request to resync // with no target cell ID @@ -1797,17 +1817,12 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser } } -void release_dl_BWP(NR_UE_MAC_INST_t *mac, int bwp_id) +void release_dl_BWP(NR_UE_MAC_INST_t *mac, int index) { - NR_UE_DL_BWP_t *bwp = NULL; - for (int i = 0; i < mac->dl_BWPs.count; i++) { - if (bwp_id == mac->dl_BWPs.array[i]->bwp_id) { - bwp = mac->dl_BWPs.array[i]; - asn_sequence_del(&mac->dl_BWPs, i, 0); - break; - } - } - AssertFatal(bwp, "No DL-BWP %d to release\n", bwp_id); + NR_UE_DL_BWP_t *bwp = mac->dl_BWPs.array[index]; + int bwp_id = bwp->bwp_id; + asn_sequence_del(&mac->dl_BWPs, index, 0); + free(bwp->cyclicprefix); asn1cFreeStruc(asn_DEF_NR_PDSCH_TimeDomainResourceAllocationList, bwp->tdaList_Common); asn1cFreeStruc(asn_DEF_NR_PDSCH_Config, bwp->pdsch_Config); @@ -1821,17 +1836,11 @@ void release_dl_BWP(NR_UE_MAC_INST_t *mac, int bwp_id) asn_sequence_del(&pdcch->list_SS, i, 1); } -void release_ul_BWP(NR_UE_MAC_INST_t *mac, int bwp_id) +void release_ul_BWP(NR_UE_MAC_INST_t *mac, int index) { - NR_UE_UL_BWP_t *bwp = NULL; - for (int i = 0; i < mac->ul_BWPs.count; i++) { - if (bwp_id == mac->ul_BWPs.array[i]->bwp_id) { - bwp = mac->ul_BWPs.array[i]; - asn_sequence_del(&mac->ul_BWPs, i, 0); - break; - } - } - AssertFatal(bwp, "No UL-BWP %d to release\n", bwp_id); + NR_UE_UL_BWP_t *bwp = mac->ul_BWPs.array[index]; + asn_sequence_del(&mac->ul_BWPs, index, 0); + free(bwp->cyclicprefix); asn1cFreeStruc(asn_DEF_NR_RACH_ConfigCommon, bwp->rach_ConfigCommon); asn1cFreeStruc(asn_DEF_NR_PUSCH_TimeDomainResourceAllocationList, bwp->tdaList_Common); @@ -1841,6 +1850,7 @@ void release_ul_BWP(NR_UE_MAC_INST_t *mac, int bwp_id) asn1cFreeStruc(asn_DEF_NR_PUCCH_ConfigCommon, bwp->pucch_ConfigCommon); asn1cFreeStruc(asn_DEF_NR_SRS_Config, bwp->srs_Config); free(bwp->msg3_DeltaPreamble); + bwp->msg3_DeltaPreamble = NULL; free(bwp); } @@ -1848,8 +1858,12 @@ static void configure_BWPs(NR_UE_MAC_INST_t *mac, NR_ServingCellConfig_t *scd) { configure_dedicated_BWP_dl(mac, 0, scd->initialDownlinkBWP); if (scd->downlinkBWP_ToReleaseList) { - for (int i = 0; i < scd->downlinkBWP_ToReleaseList->list.count; i++) - release_dl_BWP(mac, *scd->downlinkBWP_ToReleaseList->list.array[i]); + for (int i = 0; i < scd->downlinkBWP_ToReleaseList->list.count; i++) { + for (int j = 0; j < mac->dl_BWPs.count; j++) { + if (*scd->downlinkBWP_ToReleaseList->list.array[i] == mac->dl_BWPs.array[i]->bwp_id) + release_dl_BWP(mac, i); + } + } } if (scd->downlinkBWP_ToAddModList) { for (int i = 0; i < scd->downlinkBWP_ToAddModList->list.count; i++) { @@ -1866,8 +1880,12 @@ static void configure_BWPs(NR_UE_MAC_INST_t *mac, NR_ServingCellConfig_t *scd) if (scd->uplinkConfig) { configure_dedicated_BWP_ul(mac, 0, scd->uplinkConfig->initialUplinkBWP); if (scd->uplinkConfig->uplinkBWP_ToReleaseList) { - for (int i = 0; i < scd->uplinkConfig->uplinkBWP_ToReleaseList->list.count; i++) - release_ul_BWP(mac, *scd->uplinkConfig->uplinkBWP_ToReleaseList->list.array[i]); + for (int i = 0; i < scd->uplinkConfig->uplinkBWP_ToReleaseList->list.count; i++) { + for (int j = 0; j < mac->ul_BWPs.count; j++) { + if (*scd->uplinkConfig->uplinkBWP_ToReleaseList->list.array[i] == mac->ul_BWPs.array[i]->bwp_id) + release_ul_BWP(mac, i); + } + } } if (scd->uplinkConfig->uplinkBWP_ToAddModList) { for (int i = 0; i < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; i++) { diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index ab1d4a3d4f..6c8bc81582 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -150,6 +150,10 @@ int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id, uint8_t *pduP, uint32_t pdu_len); +void release_dl_BWP(NR_UE_MAC_INST_t *mac, int index); +void release_ul_BWP(NR_UE_MAC_INST_t *mac, int index); +void nr_release_mac_config_logicalChannelBearer(NR_UE_MAC_INST_t *mac, long channel_identity); + void nr_rrc_mac_config_req_ue_logicalChannelBearer(module_id_t module_id, struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_toadd_list, struct NR_CellGroupConfig__rlc_BearerToReleaseList *rlc_torelease_list); diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index ac6539820f..9df80f8abf 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -64,7 +64,6 @@ void nr_ue_init_mac(module_id_t module_idP) { LOG_I(NR_MAC, "[UE%d] Applying default macMainConfig\n", module_idP); NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP); - nr_ue_mac_default_configs(mac); mac->first_sync_frame = -1; mac->get_sib1 = false; mac->get_otherSI = false; @@ -73,6 +72,8 @@ void nr_ue_init_mac(module_id_t module_idP) mac->state = UE_NOT_SYNC; mac->si_window_start = -1; mac->servCellIndex = 0; + mac->harq_ACK_SpatialBundlingPUCCH = false; + mac->harq_ACK_SpatialBundlingPUSCH = false; } void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac) @@ -112,12 +113,13 @@ NR_UE_MAC_INST_t *nr_l2_init_ue() //init mac here nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(NB_NR_UE_MAC_INST, sizeof(NR_UE_MAC_INST_t)); - for (int j = 0; j < NB_NR_UE_MAC_INST; j++) + for (int j = 0; j < NB_NR_UE_MAC_INST; j++) { nr_ue_init_mac(j); - - if (get_softmodem_params()->sa) - ue_init_config_request(nr_ue_mac_inst, get_softmodem_params()->numerology); - + NR_UE_MAC_INST_t *mac = get_mac_inst(j); + nr_ue_mac_default_configs(mac); + if (get_softmodem_params()->sa) + ue_init_config_request(mac, get_softmodem_params()->numerology); + } int rc = rlc_module_init(0); AssertFatal(rc == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__); @@ -182,17 +184,35 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac) void release_mac_configuration(NR_UE_MAC_INST_t *mac) { asn1cFreeStruc(asn_DEF_NR_MIB, mac->mib); - for (int i = 0; i < 5; i++) { - NR_BWP_PDCCH_t *pdcch = &mac->config_BWP_PDCCH[5]; - release_common_ss_cset(pdcch); - for (int j = 0; j < pdcch->list_Coreset.count; j++) - asn_sequence_del(&pdcch->list_Coreset, j, 1); - for (int j = 0; j < pdcch->list_SS.count; j++) - asn_sequence_del(&pdcch->list_SS, j, 1); + asn1cFreeStruc(asn_DEF_NR_SI_SchedulingInfo, mac->si_SchedulingInfo); + asn1cFreeStruc(asn_DEF_NR_TDD_UL_DL_ConfigCommon, mac->tdd_UL_DL_ConfigurationCommon); + NR_UE_ServingCell_Info_t *sc = &mac->sc_info; + asn1cFreeStruc(asn_DEF_NR_CrossCarrierSchedulingConfig, sc->crossCarrierSchedulingConfig); + asn1cFreeStruc(asn_DEF_NR_SRS_CarrierSwitching, sc->carrierSwitching); + asn1cFreeStruc(asn_DEF_NR_UplinkConfig, sc->supplementaryUplink); + asn1cFreeStruc(asn_DEF_NR_PDSCH_CodeBlockGroupTransmission, sc->pdsch_CGB_Transmission); + asn1cFreeStruc(asn_DEF_NR_PUSCH_CodeBlockGroupTransmission, sc->pusch_CGB_Transmission); + asn1cFreeStruc(asn_DEF_NR_CSI_MeasConfig, sc->csi_MeasConfig); + asn1cFreeStruc(asn_DEF_NR_CSI_AperiodicTriggerStateList, sc->aperiodicTriggerStateList); + free(sc->xOverhead_PDSCH); + free(sc->nrofHARQ_ProcessesForPDSCH); + free(sc->rateMatching_PUSCH); + free(sc->xOverhead_PUSCH); + free(sc->maxMIMO_Layers_PUSCH); + memset(&mac->sc_info, 0, sizeof(mac->sc_info)); + + for (int i = 0; i < mac->dl_BWPs.count; i++) + release_dl_BWP(mac, i); + for (int i = 0; i < mac->ul_BWPs.count; i++) + release_ul_BWP(mac, i); + mac->current_DL_BWP = NULL; + mac->current_UL_BWP = NULL; + + for (int i = 0; i < NR_MAX_NUM_LCID; i++) { + nr_release_mac_config_logicalChannelBearer(mac, i + 1); + memset(&mac->lc_ordered_info[i], 0, sizeof(nr_lcordered_info_t)); } - memset(&mac->current_DL_BWP, 0, sizeof(mac->current_DL_BWP)); - memset(&mac->current_UL_BWP, 0, sizeof(mac->current_UL_BWP)); memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); memset(&mac->csirs_measurements, 0, sizeof(mac->csirs_measurements)); memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment));